(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 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 protobuf_msg_1 = require("../ipc-with-core/protobuf-msg");
function exposeConnectivityCAP(cap) {
    return {
        isOnline: isOnline.wrapService(cap.isOnline)
    };
}
function makeConnectivity(caller, objPath) {
    return {
        isOnline: isOnline.makeCaller(caller, objPath)
    };
}
var isOnline;
(function (isOnline) {
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(checkRes => protobuf_msg_1.strValType.pack((0, protobuf_msg_1.toVal)(checkRes)));
            return { promise };
        };
    }
    isOnline.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = objPath.concat('isOnline');
        return () => caller.startPromiseCall(ipcPath, undefined)
            .then(buf => protobuf_msg_1.strValType.unpack(buf).value);
    }
    isOnline.makeCaller = makeCaller;
})(isOnline || (isOnline = {}));
Object.freeze(isOnline);
Object.freeze(exports);

},{"../ipc-with-core/protobuf-msg":3}],2:[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;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const test_stand_cap_ipc_1 = require("../test-stand/test-stand-cap-ipc");
const connectivity_cap_ipc_1 = require("../connectivity/connectivity-cap-ipc");
const ipc_client_side_1 = require("../system/ipc-client-side");
const ipc_client_side_2 = require("../shell/ipc-client-side");
const ipc_client_side_3 = require("../rpc/ipc-client-side");
const ipc_client_side_4 = require("../media-devices/ipc-client-side");
const ipc_client_side_5 = require("../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() { }
Object.freeze(exports);

},{"../connectivity/connectivity-cap-ipc":1,"../media-devices/ipc-client-side":8,"../rpc/ipc-client-side":17,"../shell/ipc-client-side":23,"../system/ipc-client-side":25,"../test-stand/test-stand-cap-ipc":26,"../ui/ipc-client-side":27,"core-3nweb-client-lib/build/ipc":112}],3:[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("../lib-common/exceptions/error");
const common_proto_1 = require("../protos/common.proto");
const buffer_utils_1 = require("../lib-common/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)
},{"../lib-common/buffer-utils":4,"../lib-common/exceptions/error":5,"../protos/common.proto":9,"buffer":83,"core-3nweb-client-lib/build/ipc":112}],4:[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":83}],5:[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);

},{}],6:[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":287,"rxjs/operators":512}],7:[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("../ipc-with-core/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 = {}));

},{"../ipc-with-core/protobuf-msg":3,"../protos/common.proto":9,"core-3nweb-client-lib/build/ipc":112}],8:[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.makeMediaDevices = makeMediaDevices;
exports.promiseMediaDevices = promiseMediaDevices;
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 = {};
    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 = {};
    const lstMediaDeviceCAP = (await caller.listObjAsync(mediaDevPath));
    addHandlerSetters(caller, expServices, media, mediaDevPath, lstMediaDeviceCAP);
    return media;
}
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":7}],9:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.values && message.values.length))
                        message.values = [];
                    message.values.push(reader.string());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint32();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bytes();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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)
                    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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.runtimeExcJson = reader.string();
                    break;
                case 2:
                    message.err = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        return AnyValue;
    })();

    return common;
})();

module.exports = $root;

},{"protobufjs/minimal":255}],10:[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_dialogs = (function() {

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

    file_dialogs.FileTypeFilter = (function() {

        /**
         * Properties of a FileTypeFilter.
         * @memberof file_dialogs
         * @interface IFileTypeFilter
         * @property {string|null} [name] FileTypeFilter name
         * @property {Array.<string>|null} [extensions] FileTypeFilter extensions
         */

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

        /**
         * FileTypeFilter name.
         * @member {string} name
         * @memberof file_dialogs.FileTypeFilter
         * @instance
         */
        FileTypeFilter.prototype.name = "";

        /**
         * FileTypeFilter extensions.
         * @member {Array.<string>} extensions
         * @memberof file_dialogs.FileTypeFilter
         * @instance
         */
        FileTypeFilter.prototype.extensions = $util.emptyArray;

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

        /**
         * Encodes the specified FileTypeFilter message. Does not implicitly {@link file_dialogs.FileTypeFilter.verify|verify} messages.
         * @function encode
         * @memberof file_dialogs.FileTypeFilter
         * @static
         * @param {file_dialogs.IFileTypeFilter} message FileTypeFilter message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileTypeFilter.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.extensions != null && message.extensions.length)
                for (var i = 0; i < message.extensions.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.extensions[i]);
            return writer;
        };

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

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

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

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

        /**
         * Creates a FileTypeFilter message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file_dialogs.FileTypeFilter
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file_dialogs.FileTypeFilter} FileTypeFilter
         */
        FileTypeFilter.fromObject = function fromObject(object) {
            if (object instanceof $root.file_dialogs.FileTypeFilter)
                return object;
            var message = new $root.file_dialogs.FileTypeFilter();
            if (object.name != null)
                message.name = String(object.name);
            if (object.extensions) {
                if (!Array.isArray(object.extensions))
                    throw TypeError(".file_dialogs.FileTypeFilter.extensions: array expected");
                message.extensions = [];
                for (var i = 0; i < object.extensions.length; ++i)
                    message.extensions[i] = String(object.extensions[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileTypeFilter message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file_dialogs.FileTypeFilter
         * @static
         * @param {file_dialogs.FileTypeFilter} message FileTypeFilter
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileTypeFilter.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.extensions = [];
            if (options.defaults)
                object.name = "";
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.extensions && message.extensions.length) {
                object.extensions = [];
                for (var j = 0; j < message.extensions.length; ++j)
                    object.extensions[j] = message.extensions[j];
            }
            return object;
        };

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

        return FileTypeFilter;
    })();

    file_dialogs.SaveFileDialogReplyBody = (function() {

        /**
         * Properties of a SaveFileDialogReplyBody.
         * @memberof file_dialogs
         * @interface ISaveFileDialogReplyBody
         * @property {file.IFile|null} [file] SaveFileDialogReplyBody file
         */

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

        /**
         * SaveFileDialogReplyBody file.
         * @member {file.IFile|null|undefined} file
         * @memberof file_dialogs.SaveFileDialogReplyBody
         * @instance
         */
        SaveFileDialogReplyBody.prototype.file = null;

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

        /**
         * Encodes the specified SaveFileDialogReplyBody message. Does not implicitly {@link file_dialogs.SaveFileDialogReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file_dialogs.SaveFileDialogReplyBody
         * @static
         * @param {file_dialogs.ISaveFileDialogReplyBody} message SaveFileDialogReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFileDialogReplyBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

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

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

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

        /**
         * Verifies a SaveFileDialogReplyBody message.
         * @function verify
         * @memberof file_dialogs.SaveFileDialogReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SaveFileDialogReplyBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.file.File.verify(message.file);
                if (error)
                    return "file." + error;
            }
            return null;
        };

        /**
         * Creates a SaveFileDialogReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file_dialogs.SaveFileDialogReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file_dialogs.SaveFileDialogReplyBody} SaveFileDialogReplyBody
         */
        SaveFileDialogReplyBody.fromObject = function fromObject(object) {
            if (object instanceof $root.file_dialogs.SaveFileDialogReplyBody)
                return object;
            var message = new $root.file_dialogs.SaveFileDialogReplyBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".file_dialogs.SaveFileDialogReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file);
            }
            return message;
        };

        /**
         * Creates a plain object from a SaveFileDialogReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file_dialogs.SaveFileDialogReplyBody
         * @static
         * @param {file_dialogs.SaveFileDialogReplyBody} message SaveFileDialogReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SaveFileDialogReplyBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.file.File.toObject(message.file, options);
            return object;
        };

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

        return SaveFileDialogReplyBody;
    })();

    file_dialogs.SaveDialogArgs = (function() {

        /**
         * Properties of a SaveDialogArgs.
         * @memberof file_dialogs
         * @interface ISaveDialogArgs
         * @property {string|null} [title] SaveDialogArgs title
         * @property {string|null} [btnLabel] SaveDialogArgs btnLabel
         * @property {string|null} [defaultPath] SaveDialogArgs defaultPath
         * @property {Array.<file_dialogs.IFileTypeFilter>|null} [filters] SaveDialogArgs filters
         */

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

        /**
         * SaveDialogArgs title.
         * @member {string} title
         * @memberof file_dialogs.SaveDialogArgs
         * @instance
         */
        SaveDialogArgs.prototype.title = "";

        /**
         * SaveDialogArgs btnLabel.
         * @member {string} btnLabel
         * @memberof file_dialogs.SaveDialogArgs
         * @instance
         */
        SaveDialogArgs.prototype.btnLabel = "";

        /**
         * SaveDialogArgs defaultPath.
         * @member {string} defaultPath
         * @memberof file_dialogs.SaveDialogArgs
         * @instance
         */
        SaveDialogArgs.prototype.defaultPath = "";

        /**
         * SaveDialogArgs filters.
         * @member {Array.<file_dialogs.IFileTypeFilter>} filters
         * @memberof file_dialogs.SaveDialogArgs
         * @instance
         */
        SaveDialogArgs.prototype.filters = $util.emptyArray;

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

        /**
         * Encodes the specified SaveDialogArgs message. Does not implicitly {@link file_dialogs.SaveDialogArgs.verify|verify} messages.
         * @function encode
         * @memberof file_dialogs.SaveDialogArgs
         * @static
         * @param {file_dialogs.ISaveDialogArgs} message SaveDialogArgs message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveDialogArgs.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.title != null && Object.hasOwnProperty.call(message, "title"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.title);
            if (message.btnLabel != null && Object.hasOwnProperty.call(message, "btnLabel"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.btnLabel);
            if (message.defaultPath != null && Object.hasOwnProperty.call(message, "defaultPath"))
                writer.uint32(/* id 3, wireType 2 =*/26).string(message.defaultPath);
            if (message.filters != null && message.filters.length)
                for (var i = 0; i < message.filters.length; ++i)
                    $root.file_dialogs.FileTypeFilter.encode(message.filters[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a SaveDialogArgs message from the specified reader or buffer.
         * @function decode
         * @memberof file_dialogs.SaveDialogArgs
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file_dialogs.SaveDialogArgs} SaveDialogArgs
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveDialogArgs.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file_dialogs.SaveDialogArgs();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.title = reader.string();
                    break;
                case 2:
                    message.btnLabel = reader.string();
                    break;
                case 3:
                    message.defaultPath = reader.string();
                    break;
                case 4:
                    if (!(message.filters && message.filters.length))
                        message.filters = [];
                    message.filters.push($root.file_dialogs.FileTypeFilter.decode(reader, reader.uint32()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a SaveDialogArgs message.
         * @function verify
         * @memberof file_dialogs.SaveDialogArgs
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SaveDialogArgs.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.title != null && message.hasOwnProperty("title"))
                if (!$util.isString(message.title))
                    return "title: string expected";
            if (message.btnLabel != null && message.hasOwnProperty("btnLabel"))
                if (!$util.isString(message.btnLabel))
                    return "btnLabel: string expected";
            if (message.defaultPath != null && message.hasOwnProperty("defaultPath"))
                if (!$util.isString(message.defaultPath))
                    return "defaultPath: string expected";
            if (message.filters != null && message.hasOwnProperty("filters")) {
                if (!Array.isArray(message.filters))
                    return "filters: array expected";
                for (var i = 0; i < message.filters.length; ++i) {
                    var error = $root.file_dialogs.FileTypeFilter.verify(message.filters[i]);
                    if (error)
                        return "filters." + error;
                }
            }
            return null;
        };

        /**
         * Creates a SaveDialogArgs message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file_dialogs.SaveDialogArgs
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file_dialogs.SaveDialogArgs} SaveDialogArgs
         */
        SaveDialogArgs.fromObject = function fromObject(object) {
            if (object instanceof $root.file_dialogs.SaveDialogArgs)
                return object;
            var message = new $root.file_dialogs.SaveDialogArgs();
            if (object.title != null)
                message.title = String(object.title);
            if (object.btnLabel != null)
                message.btnLabel = String(object.btnLabel);
            if (object.defaultPath != null)
                message.defaultPath = String(object.defaultPath);
            if (object.filters) {
                if (!Array.isArray(object.filters))
                    throw TypeError(".file_dialogs.SaveDialogArgs.filters: array expected");
                message.filters = [];
                for (var i = 0; i < object.filters.length; ++i) {
                    if (typeof object.filters[i] !== "object")
                        throw TypeError(".file_dialogs.SaveDialogArgs.filters: object expected");
                    message.filters[i] = $root.file_dialogs.FileTypeFilter.fromObject(object.filters[i]);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a SaveDialogArgs message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file_dialogs.SaveDialogArgs
         * @static
         * @param {file_dialogs.SaveDialogArgs} message SaveDialogArgs
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SaveDialogArgs.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.filters = [];
            if (options.defaults) {
                object.title = "";
                object.btnLabel = "";
                object.defaultPath = "";
            }
            if (message.title != null && message.hasOwnProperty("title"))
                object.title = message.title;
            if (message.btnLabel != null && message.hasOwnProperty("btnLabel"))
                object.btnLabel = message.btnLabel;
            if (message.defaultPath != null && message.hasOwnProperty("defaultPath"))
                object.defaultPath = message.defaultPath;
            if (message.filters && message.filters.length) {
                object.filters = [];
                for (var j = 0; j < message.filters.length; ++j)
                    object.filters[j] = $root.file_dialogs.FileTypeFilter.toObject(message.filters[j], options);
            }
            return object;
        };

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

        return SaveDialogArgs;
    })();

    file_dialogs.SaveFolderDialogReplyBody = (function() {

        /**
         * Properties of a SaveFolderDialogReplyBody.
         * @memberof file_dialogs
         * @interface ISaveFolderDialogReplyBody
         * @property {fs.IFS|null} [folder] SaveFolderDialogReplyBody folder
         */

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

        /**
         * SaveFolderDialogReplyBody folder.
         * @member {fs.IFS|null|undefined} folder
         * @memberof file_dialogs.SaveFolderDialogReplyBody
         * @instance
         */
        SaveFolderDialogReplyBody.prototype.folder = null;

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

        /**
         * Encodes the specified SaveFolderDialogReplyBody message. Does not implicitly {@link file_dialogs.SaveFolderDialogReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file_dialogs.SaveFolderDialogReplyBody
         * @static
         * @param {file_dialogs.ISaveFolderDialogReplyBody} message SaveFolderDialogReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFolderDialogReplyBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.fs.FS.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

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

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

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

        /**
         * Verifies a SaveFolderDialogReplyBody message.
         * @function verify
         * @memberof file_dialogs.SaveFolderDialogReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SaveFolderDialogReplyBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.folder != null && message.hasOwnProperty("folder")) {
                var error = $root.fs.FS.verify(message.folder);
                if (error)
                    return "folder." + error;
            }
            return null;
        };

        /**
         * Creates a SaveFolderDialogReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file_dialogs.SaveFolderDialogReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file_dialogs.SaveFolderDialogReplyBody} SaveFolderDialogReplyBody
         */
        SaveFolderDialogReplyBody.fromObject = function fromObject(object) {
            if (object instanceof $root.file_dialogs.SaveFolderDialogReplyBody)
                return object;
            var message = new $root.file_dialogs.SaveFolderDialogReplyBody();
            if (object.folder != null) {
                if (typeof object.folder !== "object")
                    throw TypeError(".file_dialogs.SaveFolderDialogReplyBody.folder: object expected");
                message.folder = $root.fs.FS.fromObject(object.folder);
            }
            return message;
        };

        /**
         * Creates a plain object from a SaveFolderDialogReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file_dialogs.SaveFolderDialogReplyBody
         * @static
         * @param {file_dialogs.SaveFolderDialogReplyBody} message SaveFolderDialogReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SaveFolderDialogReplyBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.folder = null;
            if (message.folder != null && message.hasOwnProperty("folder"))
                object.folder = $root.fs.FS.toObject(message.folder, options);
            return object;
        };

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

        return SaveFolderDialogReplyBody;
    })();

    file_dialogs.OpenFileDialogReplyBody = (function() {

        /**
         * Properties of an OpenFileDialogReplyBody.
         * @memberof file_dialogs
         * @interface IOpenFileDialogReplyBody
         * @property {Array.<file.IFile>|null} [files] OpenFileDialogReplyBody files
         */

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

        /**
         * OpenFileDialogReplyBody files.
         * @member {Array.<file.IFile>} files
         * @memberof file_dialogs.OpenFileDialogReplyBody
         * @instance
         */
        OpenFileDialogReplyBody.prototype.files = $util.emptyArray;

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

        /**
         * Encodes the specified OpenFileDialogReplyBody message. Does not implicitly {@link file_dialogs.OpenFileDialogReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file_dialogs.OpenFileDialogReplyBody
         * @static
         * @param {file_dialogs.IOpenFileDialogReplyBody} message OpenFileDialogReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OpenFileDialogReplyBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.files != null && message.files.length)
                for (var i = 0; i < message.files.length; ++i)
                    $root.file.File.encode(message.files[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

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

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

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

        /**
         * Verifies an OpenFileDialogReplyBody message.
         * @function verify
         * @memberof file_dialogs.OpenFileDialogReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OpenFileDialogReplyBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.files != null && message.hasOwnProperty("files")) {
                if (!Array.isArray(message.files))
                    return "files: array expected";
                for (var i = 0; i < message.files.length; ++i) {
                    var error = $root.file.File.verify(message.files[i]);
                    if (error)
                        return "files." + error;
                }
            }
            return null;
        };

        /**
         * Creates an OpenFileDialogReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file_dialogs.OpenFileDialogReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file_dialogs.OpenFileDialogReplyBody} OpenFileDialogReplyBody
         */
        OpenFileDialogReplyBody.fromObject = function fromObject(object) {
            if (object instanceof $root.file_dialogs.OpenFileDialogReplyBody)
                return object;
            var message = new $root.file_dialogs.OpenFileDialogReplyBody();
            if (object.files) {
                if (!Array.isArray(object.files))
                    throw TypeError(".file_dialogs.OpenFileDialogReplyBody.files: array expected");
                message.files = [];
                for (var i = 0; i < object.files.length; ++i) {
                    if (typeof object.files[i] !== "object")
                        throw TypeError(".file_dialogs.OpenFileDialogReplyBody.files: object expected");
                    message.files[i] = $root.file.File.fromObject(object.files[i]);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from an OpenFileDialogReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file_dialogs.OpenFileDialogReplyBody
         * @static
         * @param {file_dialogs.OpenFileDialogReplyBody} message OpenFileDialogReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OpenFileDialogReplyBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.files = [];
            if (message.files && message.files.length) {
                object.files = [];
                for (var j = 0; j < message.files.length; ++j)
                    object.files[j] = $root.file.File.toObject(message.files[j], options);
            }
            return object;
        };

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

        return OpenFileDialogReplyBody;
    })();

    file_dialogs.OpenDialogArgs = (function() {

        /**
         * Properties of an OpenDialogArgs.
         * @memberof file_dialogs
         * @interface IOpenDialogArgs
         * @property {string|null} [title] OpenDialogArgs title
         * @property {string|null} [btnLabel] OpenDialogArgs btnLabel
         * @property {boolean|null} [multiSelections] OpenDialogArgs multiSelections
         * @property {Array.<file_dialogs.IFileTypeFilter>|null} [filters] OpenDialogArgs filters
         */

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

        /**
         * OpenDialogArgs title.
         * @member {string} title
         * @memberof file_dialogs.OpenDialogArgs
         * @instance
         */
        OpenDialogArgs.prototype.title = "";

        /**
         * OpenDialogArgs btnLabel.
         * @member {string} btnLabel
         * @memberof file_dialogs.OpenDialogArgs
         * @instance
         */
        OpenDialogArgs.prototype.btnLabel = "";

        /**
         * OpenDialogArgs multiSelections.
         * @member {boolean} multiSelections
         * @memberof file_dialogs.OpenDialogArgs
         * @instance
         */
        OpenDialogArgs.prototype.multiSelections = false;

        /**
         * OpenDialogArgs filters.
         * @member {Array.<file_dialogs.IFileTypeFilter>} filters
         * @memberof file_dialogs.OpenDialogArgs
         * @instance
         */
        OpenDialogArgs.prototype.filters = $util.emptyArray;

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

        /**
         * Encodes the specified OpenDialogArgs message. Does not implicitly {@link file_dialogs.OpenDialogArgs.verify|verify} messages.
         * @function encode
         * @memberof file_dialogs.OpenDialogArgs
         * @static
         * @param {file_dialogs.IOpenDialogArgs} message OpenDialogArgs message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OpenDialogArgs.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.title != null && Object.hasOwnProperty.call(message, "title"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.title);
            if (message.btnLabel != null && Object.hasOwnProperty.call(message, "btnLabel"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.btnLabel);
            if (message.multiSelections != null && Object.hasOwnProperty.call(message, "multiSelections"))
                writer.uint32(/* id 3, wireType 0 =*/24).bool(message.multiSelections);
            if (message.filters != null && message.filters.length)
                for (var i = 0; i < message.filters.length; ++i)
                    $root.file_dialogs.FileTypeFilter.encode(message.filters[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes an OpenDialogArgs message from the specified reader or buffer.
         * @function decode
         * @memberof file_dialogs.OpenDialogArgs
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file_dialogs.OpenDialogArgs} OpenDialogArgs
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OpenDialogArgs.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file_dialogs.OpenDialogArgs();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.title = reader.string();
                    break;
                case 2:
                    message.btnLabel = reader.string();
                    break;
                case 3:
                    message.multiSelections = reader.bool();
                    break;
                case 4:
                    if (!(message.filters && message.filters.length))
                        message.filters = [];
                    message.filters.push($root.file_dialogs.FileTypeFilter.decode(reader, reader.uint32()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies an OpenDialogArgs message.
         * @function verify
         * @memberof file_dialogs.OpenDialogArgs
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OpenDialogArgs.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.title != null && message.hasOwnProperty("title"))
                if (!$util.isString(message.title))
                    return "title: string expected";
            if (message.btnLabel != null && message.hasOwnProperty("btnLabel"))
                if (!$util.isString(message.btnLabel))
                    return "btnLabel: string expected";
            if (message.multiSelections != null && message.hasOwnProperty("multiSelections"))
                if (typeof message.multiSelections !== "boolean")
                    return "multiSelections: boolean expected";
            if (message.filters != null && message.hasOwnProperty("filters")) {
                if (!Array.isArray(message.filters))
                    return "filters: array expected";
                for (var i = 0; i < message.filters.length; ++i) {
                    var error = $root.file_dialogs.FileTypeFilter.verify(message.filters[i]);
                    if (error)
                        return "filters." + error;
                }
            }
            return null;
        };

        /**
         * Creates an OpenDialogArgs message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file_dialogs.OpenDialogArgs
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file_dialogs.OpenDialogArgs} OpenDialogArgs
         */
        OpenDialogArgs.fromObject = function fromObject(object) {
            if (object instanceof $root.file_dialogs.OpenDialogArgs)
                return object;
            var message = new $root.file_dialogs.OpenDialogArgs();
            if (object.title != null)
                message.title = String(object.title);
            if (object.btnLabel != null)
                message.btnLabel = String(object.btnLabel);
            if (object.multiSelections != null)
                message.multiSelections = Boolean(object.multiSelections);
            if (object.filters) {
                if (!Array.isArray(object.filters))
                    throw TypeError(".file_dialogs.OpenDialogArgs.filters: array expected");
                message.filters = [];
                for (var i = 0; i < object.filters.length; ++i) {
                    if (typeof object.filters[i] !== "object")
                        throw TypeError(".file_dialogs.OpenDialogArgs.filters: object expected");
                    message.filters[i] = $root.file_dialogs.FileTypeFilter.fromObject(object.filters[i]);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from an OpenDialogArgs message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file_dialogs.OpenDialogArgs
         * @static
         * @param {file_dialogs.OpenDialogArgs} message OpenDialogArgs
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OpenDialogArgs.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.filters = [];
            if (options.defaults) {
                object.title = "";
                object.btnLabel = "";
                object.multiSelections = false;
            }
            if (message.title != null && message.hasOwnProperty("title"))
                object.title = message.title;
            if (message.btnLabel != null && message.hasOwnProperty("btnLabel"))
                object.btnLabel = message.btnLabel;
            if (message.multiSelections != null && message.hasOwnProperty("multiSelections"))
                object.multiSelections = message.multiSelections;
            if (message.filters && message.filters.length) {
                object.filters = [];
                for (var j = 0; j < message.filters.length; ++j)
                    object.filters[j] = $root.file_dialogs.FileTypeFilter.toObject(message.filters[j], options);
            }
            return object;
        };

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

        return OpenDialogArgs;
    })();

    file_dialogs.OpenFolderDialogReplyBody = (function() {

        /**
         * Properties of an OpenFolderDialogReplyBody.
         * @memberof file_dialogs
         * @interface IOpenFolderDialogReplyBody
         * @property {Array.<fs.IFS>|null} [folders] OpenFolderDialogReplyBody folders
         */

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

        /**
         * OpenFolderDialogReplyBody folders.
         * @member {Array.<fs.IFS>} folders
         * @memberof file_dialogs.OpenFolderDialogReplyBody
         * @instance
         */
        OpenFolderDialogReplyBody.prototype.folders = $util.emptyArray;

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

        /**
         * Encodes the specified OpenFolderDialogReplyBody message. Does not implicitly {@link file_dialogs.OpenFolderDialogReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file_dialogs.OpenFolderDialogReplyBody
         * @static
         * @param {file_dialogs.IOpenFolderDialogReplyBody} message OpenFolderDialogReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OpenFolderDialogReplyBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.folders != null && message.folders.length)
                for (var i = 0; i < message.folders.length; ++i)
                    $root.fs.FS.encode(message.folders[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

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

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

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

        /**
         * Verifies an OpenFolderDialogReplyBody message.
         * @function verify
         * @memberof file_dialogs.OpenFolderDialogReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OpenFolderDialogReplyBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.folders != null && message.hasOwnProperty("folders")) {
                if (!Array.isArray(message.folders))
                    return "folders: array expected";
                for (var i = 0; i < message.folders.length; ++i) {
                    var error = $root.fs.FS.verify(message.folders[i]);
                    if (error)
                        return "folders." + error;
                }
            }
            return null;
        };

        /**
         * Creates an OpenFolderDialogReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file_dialogs.OpenFolderDialogReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file_dialogs.OpenFolderDialogReplyBody} OpenFolderDialogReplyBody
         */
        OpenFolderDialogReplyBody.fromObject = function fromObject(object) {
            if (object instanceof $root.file_dialogs.OpenFolderDialogReplyBody)
                return object;
            var message = new $root.file_dialogs.OpenFolderDialogReplyBody();
            if (object.folders) {
                if (!Array.isArray(object.folders))
                    throw TypeError(".file_dialogs.OpenFolderDialogReplyBody.folders: array expected");
                message.folders = [];
                for (var i = 0; i < object.folders.length; ++i) {
                    if (typeof object.folders[i] !== "object")
                        throw TypeError(".file_dialogs.OpenFolderDialogReplyBody.folders: object expected");
                    message.folders[i] = $root.fs.FS.fromObject(object.folders[i]);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from an OpenFolderDialogReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file_dialogs.OpenFolderDialogReplyBody
         * @static
         * @param {file_dialogs.OpenFolderDialogReplyBody} message OpenFolderDialogReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OpenFolderDialogReplyBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.folders = [];
            if (message.folders && message.folders.length) {
                object.folders = [];
                for (var j = 0; j < message.folders.length; ++j)
                    object.folders[j] = $root.fs.FS.toObject(message.folders[j], options);
            }
            return object;
        };

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

        return OpenFolderDialogReplyBody;
    })();

    return file_dialogs;
})();

$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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.values && message.values.length))
                        message.values = [];
                    message.values.push(reader.string());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint32();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bytes();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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)
                    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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.runtimeExcJson = reader.string();
                    break;
                case 2:
                    message.err = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.File();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                case 6:
                    message.isSynced = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                if (typeof message.isNew !== "boolean")
                    return "isNew: boolean expected";
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.File)
                return object;
            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 (typeof object.impl !== "object")
                    throw TypeError(".file.File.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                object.isNew = message.isNew;
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            if (message.isSynced != null && message.hasOwnProperty("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);
        };

        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
         */

        /**
         * 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)
                        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;

        /**
         * 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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                $root.file.SyncVersionsBranchMsg.encode(message.synced, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                $root.file.SyncVersionsBranchMsg.encode(message.remote, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                $root.common.BooleanValue.encode(message.existsInSyncedParent, writer.uint32(/* id 5, wireType 2 =*/42).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncStatusMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.state = reader.string();
                    break;
                case 2:
                    message.local = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.synced = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.remote = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.existsInSyncedParent = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.state != null && message.hasOwnProperty("state"))
                if (!$util.isString(message.state))
                    return "state: string expected";
            if (message.local != null && message.hasOwnProperty("local")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.local);
                if (error)
                    return "local." + error;
            }
            if (message.synced != null && message.hasOwnProperty("synced")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.synced);
                if (error)
                    return "synced." + error;
            }
            if (message.remote != null && message.hasOwnProperty("remote")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.remote);
                if (error)
                    return "remote." + error;
            }
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent")) {
                var error = $root.common.BooleanValue.verify(message.existsInSyncedParent);
                if (error)
                    return "existsInSyncedParent." + 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) {
            if (object instanceof $root.file.SyncStatusMsg)
                return object;
            var message = new $root.file.SyncStatusMsg();
            if (object.state != null)
                message.state = String(object.state);
            if (object.local != null) {
                if (typeof object.local !== "object")
                    throw TypeError(".file.SyncStatusMsg.local: object expected");
                message.local = $root.file.SyncVersionsBranchMsg.fromObject(object.local);
            }
            if (object.synced != null) {
                if (typeof object.synced !== "object")
                    throw TypeError(".file.SyncStatusMsg.synced: object expected");
                message.synced = $root.file.SyncVersionsBranchMsg.fromObject(object.synced);
            }
            if (object.remote != null) {
                if (typeof object.remote !== "object")
                    throw TypeError(".file.SyncStatusMsg.remote: object expected");
                message.remote = $root.file.SyncVersionsBranchMsg.fromObject(object.remote);
            }
            if (object.existsInSyncedParent != null) {
                if (typeof object.existsInSyncedParent !== "object")
                    throw TypeError(".file.SyncStatusMsg.existsInSyncedParent: object expected");
                message.existsInSyncedParent = $root.common.BooleanValue.fromObject(object.existsInSyncedParent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.state = "";
                object.local = null;
                object.synced = null;
                object.remote = null;
                object.existsInSyncedParent = null;
            }
            if (message.state != null && message.hasOwnProperty("state"))
                object.state = message.state;
            if (message.local != null && message.hasOwnProperty("local"))
                object.local = $root.file.SyncVersionsBranchMsg.toObject(message.local, options);
            if (message.synced != null && message.hasOwnProperty("synced"))
                object.synced = $root.file.SyncVersionsBranchMsg.toObject(message.synced, options);
            if (message.remote != null && message.hasOwnProperty("remote"))
                object.remote = $root.file.SyncVersionsBranchMsg.toObject(message.remote, options);
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent"))
                object.existsInSyncedParent = $root.common.BooleanValue.toObject(message.existsInSyncedParent, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                $root.common.UInt64Value.encode(message.latest, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncVersionsBranchMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.latest = $root.common.UInt64Value.decode(reader, reader.uint32());
                    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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.latest != null && message.hasOwnProperty("latest")) {
                var error = $root.common.UInt64Value.verify(message.latest);
                if (error)
                    return "latest." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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 && message.hasOwnProperty("isArchived")) {
                var error = $root.common.BooleanValue.verify(message.isArchived);
                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) {
            if (object instanceof $root.file.SyncVersionsBranchMsg)
                return object;
            var message = new $root.file.SyncVersionsBranchMsg();
            if (object.latest != null) {
                if (typeof object.latest !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.latest: object expected");
                message.latest = $root.common.UInt64Value.fromObject(object.latest);
            }
            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])).unsigned = 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 (typeof object.isArchived !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.isArchived: object expected");
                message.isArchived = $root.common.BooleanValue.fromObject(object.isArchived);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults) {
                object.latest = null;
                object.isArchived = null;
            }
            if (message.latest != null && message.hasOwnProperty("latest"))
                object.latest = $root.common.UInt64Value.toObject(message.latest, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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 && message.hasOwnProperty("isArchived"))
                object.isArchived = $root.common.BooleanValue.toObject(message.isArchived, options);
            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);
        };

        return SyncVersionsBranchMsg;
    })();

    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 {file.ISyncStatusMsg|null} [sync] StatsMsg sync
         */

        /**
         * 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)
                        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 sync.
         * @member {file.ISyncStatusMsg|null|undefined} sync
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.sync = 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) {
            if (!writer)
                writer = $Writer.create();
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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()).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.common.UInt64Value.encode(message.mtime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.common.UInt64Value.encode(message.ctime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.sync != null && Object.hasOwnProperty.call(message, "sync"))
                $root.file.SyncStatusMsg.encode(message.sync, writer.uint32(/* id 9, wireType 2 =*/74).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.StatsMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.writable = reader.bool();
                    break;
                case 5:
                    message.size = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.mtime = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 7:
                    message.ctime = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 8:
                    message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 9:
                    message.sync = $root.file.SyncStatusMsg.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                if (error)
                    return "isLink." + error;
            }
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.size != null && message.hasOwnProperty("size")) {
                var error = $root.common.UInt64Value.verify(message.size);
                if (error)
                    return "size." + error;
            }
            if (message.mtime != null && message.hasOwnProperty("mtime")) {
                var error = $root.common.UInt64Value.verify(message.mtime);
                if (error)
                    return "mtime." + error;
            }
            if (message.ctime != null && message.hasOwnProperty("ctime")) {
                var error = $root.common.UInt64Value.verify(message.ctime);
                if (error)
                    return "ctime." + error;
            }
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                if (error)
                    return "version." + error;
            }
            if (message.sync != null && message.hasOwnProperty("sync")) {
                var error = $root.file.SyncStatusMsg.verify(message.sync);
                if (error)
                    return "sync." + 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) {
            if (object instanceof $root.file.StatsMsg)
                return object;
            var message = new $root.file.StatsMsg();
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".file.StatsMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".file.StatsMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".file.StatsMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.size != null) {
                if (typeof object.size !== "object")
                    throw TypeError(".file.StatsMsg.size: object expected");
                message.size = $root.common.UInt64Value.fromObject(object.size);
            }
            if (object.mtime != null) {
                if (typeof object.mtime !== "object")
                    throw TypeError(".file.StatsMsg.mtime: object expected");
                message.mtime = $root.common.UInt64Value.fromObject(object.mtime);
            }
            if (object.ctime != null) {
                if (typeof object.ctime !== "object")
                    throw TypeError(".file.StatsMsg.ctime: object expected");
                message.ctime = $root.common.UInt64Value.fromObject(object.ctime);
            }
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.StatsMsg.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            if (object.sync != null) {
                if (typeof object.sync !== "object")
                    throw TypeError(".file.StatsMsg.sync: object expected");
                message.sync = $root.file.SyncStatusMsg.fromObject(object.sync);
            }
            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) {
            if (!options)
                options = {};
            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.sync = null;
            }
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            if (message.writable != null && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.size != null && message.hasOwnProperty("size"))
                object.size = $root.common.UInt64Value.toObject(message.size, options);
            if (message.mtime != null && message.hasOwnProperty("mtime"))
                object.mtime = $root.common.UInt64Value.toObject(message.mtime, options);
            if (message.ctime != null && message.hasOwnProperty("ctime"))
                object.ctime = $root.common.UInt64Value.toObject(message.ctime, options);
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            if (message.sync != null && message.hasOwnProperty("sync"))
                object.sync = $root.file.SyncStatusMsg.toObject(message.sync, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.xaName = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.GetXAttrRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.xaName = "";
            if (message.xaName != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.str = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.XAttrValue)
                return object;
            var message = new $root.file.XAttrValue();
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.XAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.XAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.XAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                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) {
            if (object instanceof $root.file.ReadBytesRequestBody)
                return object;
            var message = new $root.file.ReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.ReadBytesReplyBody)
                return object;
            var message = new $root.file.ReadBytesReplyBody();
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.ReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        return ReadBytesReplyBody;
    })();

    file.FileEventMsg = (function() {

        /**
         * Properties of a FileEventMsg.
         * @memberof file
         * @interface IFileEventMsg
         * @property {string|null} [type] FileEventMsg type
         * @property {string|null} [path] FileEventMsg path
         * @property {common.IStringValue|null} [src] FileEventMsg src
         * @property {common.IUInt64Value|null} [newVersion] FileEventMsg newVersion
         * @property {common.IUInt64Value|null} [removedArchVer] FileEventMsg removedArchVer
         * @property {common.IUInt64Value|null} [archivedVersion] FileEventMsg archivedVersion
         */

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

        /**
         * FileEventMsg type.
         * @member {string} type
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.type = "";

        /**
         * FileEventMsg path.
         * @member {string} path
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.path = "";

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

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

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

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

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

        /**
         * Encodes the specified FileEventMsg message. Does not implicitly {@link file.FileEventMsg.verify|verify} messages.
         * @function encode
         * @memberof file.FileEventMsg
         * @static
         * @param {file.IFileEventMsg} message FileEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileEventMsg.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.StringValue.encode(message.src, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.removedArchVer != null && Object.hasOwnProperty.call(message, "removedArchVer"))
                $root.common.UInt64Value.encode(message.removedArchVer, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a FileEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileEventMsg} FileEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileEventMsg.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.path = reader.string();
                    break;
                case 3:
                    message.src = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.removedArchVer = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a FileEventMsg message.
         * @function verify
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileEventMsg.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.src != null && message.hasOwnProperty("src")) {
                var error = $root.common.StringValue.verify(message.src);
                if (error)
                    return "src." + error;
            }
            if (message.newVersion != null && message.hasOwnProperty("newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion);
                if (error)
                    return "newVersion." + error;
            }
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer")) {
                var error = $root.common.UInt64Value.verify(message.removedArchVer);
                if (error)
                    return "removedArchVer." + error;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FileEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileEventMsg} FileEventMsg
         */
        FileEventMsg.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileEventMsg)
                return object;
            var message = new $root.file.FileEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null)
                message.path = String(object.path);
            if (object.src != null) {
                if (typeof object.src !== "object")
                    throw TypeError(".file.FileEventMsg.src: object expected");
                message.src = $root.common.StringValue.fromObject(object.src);
            }
            if (object.newVersion != null) {
                if (typeof object.newVersion !== "object")
                    throw TypeError(".file.FileEventMsg.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion);
            }
            if (object.removedArchVer != null) {
                if (typeof object.removedArchVer !== "object")
                    throw TypeError(".file.FileEventMsg.removedArchVer: object expected");
                message.removedArchVer = $root.common.UInt64Value.fromObject(object.removedArchVer);
            }
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.FileEventMsg.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileEventMsg
         * @static
         * @param {file.FileEventMsg} message FileEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileEventMsg.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = "";
                object.src = null;
                object.newVersion = null;
                object.removedArchVer = null;
                object.archivedVersion = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = $root.common.StringValue.toObject(message.src, options);
            if (message.newVersion != null && message.hasOwnProperty("newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options);
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer"))
                object.removedArchVer = $root.common.UInt64Value.toObject(message.removedArchVer, options);
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            return object;
        };

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

        return FileEventMsg;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.VersionedReadFlags)
                return object;
            var message = new $root.file.VersionedReadFlags();
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.archivedVersion = null;
                object.remoteVersion = null;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.RequestWithVersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.RequestWithVersionedReadFlags)
                return object;
            var message = new $root.file.RequestWithVersionedReadFlags();
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.RequestWithVersionedReadFlags.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.flags = null;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.xaName = reader.string();
                    break;
                case 2:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrRequestBody)
                return object;
            var message = new $root.file.VersionedGetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.flags = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.str = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrReplyBody)
                return object;
            var message = new $root.file.VersionedGetXAttrReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.str !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedListXAttrsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedListXAttrsReplyBody)
                return object;
            var message = new $root.file.VersionedListXAttrsReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedReadBytesRequestBody)
                return object;
            var message = new $root.file.VersionedReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedReadBytesReplyBody)
                return object;
            var message = new $root.file.VersionedReadBytesReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadTxtReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.txt = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadTxtReplyBody)
                return object;
            var message = new $root.file.VersionedReadTxtReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.txt = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadJsonReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.json = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadJsonReplyBody)
                return object;
            var message = new $root.file.VersionedReadJsonReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.json = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.src = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("src")) {
                var error = $root.common.ObjectReference.verify(message.src);
                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) {
            if (object instanceof $root.file.VersionedGetByteSourceReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSourceReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.src !== "object")
                    throw TypeError(".file.VersionedGetByteSourceReplyBody.src: object expected");
                message.src = $root.common.ObjectReference.fromObject(object.src);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.src = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("src"))
                object.src = $root.common.ObjectReference.toObject(message.src, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                $root.common.UInt64Value.encode(message.current, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ListVersionsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.current = $root.common.UInt64Value.decode(reader, reader.uint32());
                    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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.current != null && message.hasOwnProperty("current")) {
                var error = $root.common.UInt64Value.verify(message.current);
                if (error)
                    return "current." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.ListVersionsReplyBody)
                return object;
            var message = new $root.file.ListVersionsReplyBody();
            if (object.current != null) {
                if (typeof object.current !== "object")
                    throw TypeError(".file.ListVersionsReplyBody.current: object expected");
                message.current = $root.common.UInt64Value.fromObject(object.current);
            }
            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])).unsigned = 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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults)
                object.current = null;
            if (message.current != null && message.hasOwnProperty("current"))
                object.current = $root.common.UInt64Value.toObject(message.current, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.changes != null && message.hasOwnProperty("changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes);
                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) {
            if (object instanceof $root.file.UpdateXAttrsRequestBody)
                return object;
            var message = new $root.file.UpdateXAttrsRequestBody();
            if (object.changes != null) {
                if (typeof object.changes !== "object")
                    throw TypeError(".file.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.changes = null;
            if (message.changes != null && message.hasOwnProperty("changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.NameAndXAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.xaName = reader.string();
                    break;
                case 2:
                    message.str = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.NameAndXAttrValue)
                return object;
            var message = new $root.file.NameAndXAttrValue();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.NameAndXAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.NameAndXAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.NameAndXAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrsChanges();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.set && message.set.length))
                        message.set = [];
                    message.set.push($root.file.NameAndXAttrValue.decode(reader, reader.uint32()));
                    break;
                case 2:
                    if (!(message.remove && message.remove.length))
                        message.remove = [];
                    message.remove.push(reader.string());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.set != null && message.hasOwnProperty("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]);
                    if (error)
                        return "set." + error;
                }
            }
            if (message.remove != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.XAttrsChanges)
                return object;
            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 (typeof object.set[i] !== "object")
                        throw TypeError(".file.XAttrsChanges.set: object expected");
                    message.set[i] = $root.file.NameAndXAttrValue.fromObject(object.set[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.bytes = reader.bytes();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteBytesRequestBody)
                return object;
            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)
                    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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteTxtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.txt = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.txt != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteTxtRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.txt = "";
            if (message.txt != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteJsonRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.json = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.json != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteJsonRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.json = "";
            if (message.json != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                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) {
            if (object instanceof $root.file.GetByteSinkRequestBody)
                return object;
            var message = new $root.file.GetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.GetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.truncateFile = null;
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.CopyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.file = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.common.ObjectReference.verify(message.file);
                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) {
            if (object instanceof $root.file.CopyRequestBody)
                return object;
            var message = new $root.file.CopyRequestBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".file.CopyRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                if (error)
                    return "truncateFile." + error;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkRequestBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            if (object.currentVersion != null) {
                if (typeof object.currentVersion !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncateFile = null;
                object.currentVersion = null;
            }
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.sink = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("sink")) {
                var error = $root.common.ObjectReference.verify(message.sink);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.sink !== "object")
                    throw TypeError(".file.VersionedGetByteSinkReplyBody.sink: object expected");
                message.sink = $root.common.ObjectReference.fromObject(object.sink);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.sink = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("sink"))
                object.sink = $root.common.ObjectReference.toObject(message.sink, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                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) {
            if (object instanceof $root.file.ArchiveCurrentRequestBody)
                return object;
            var message = new $root.file.ArchiveCurrentRequestBody();
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.version = null;
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskRequestBody)
                return object;
            var message = new $root.file.FileSyncIsOnDiskRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.status = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.status != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskReplyBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && message.hasOwnProperty("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);
        };

        return FileSyncIsOnDiskReplyBody;
    })();

    file.FileSyncDownloadRequestBody = (function() {

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

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

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

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

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

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

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

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

        /**
         * Verifies a FileSyncDownloadRequestBody message.
         * @function verify
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncDownloadRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 FileSyncDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncDownloadRequestBody} FileSyncDownloadRequestBody
         */
        FileSyncDownloadRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileSyncDownloadRequestBody)
                return object;
            var message = new $root.file.FileSyncDownloadRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 FileSyncDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {file.FileSyncDownloadRequestBody} message FileSyncDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncDownloadRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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 FileSyncDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        return FileSyncDownloadRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts);
                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) {
            if (object instanceof $root.file.AdoptRemoteRequestBody)
                return object;
            var message = new $root.file.AdoptRemoteRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                $root.common.BooleanValue.encode(message.dropLocalVer, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToAdopteRemote();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.dropLocalVer = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer")) {
                var error = $root.common.BooleanValue.verify(message.dropLocalVer);
                if (error)
                    return "dropLocalVer." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.OptionsToAdopteRemote)
                return object;
            var message = new $root.file.OptionsToAdopteRemote();
            if (object.dropLocalVer != null) {
                if (typeof object.dropLocalVer !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.dropLocalVer: object expected");
                message.dropLocalVer = $root.common.BooleanValue.fromObject(object.dropLocalVer);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.dropLocalVer = null;
                object.remoteVersion = null;
            }
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer"))
                object.dropLocalVer = $root.common.BooleanValue.toObject(message.dropLocalVer, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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);
        };

        return OptionsToAdopteRemote;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts);
                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) {
            if (object instanceof $root.file.FileSyncUploadRequestBody)
                return object;
            var message = new $root.file.FileSyncUploadRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.FileSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.uploadedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion);
                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) {
            if (object instanceof $root.file.FileSyncUploadReplyBody)
                return object;
            var message = new $root.file.FileSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (typeof object.uploadedVersion !== "object")
                    throw TypeError(".file.FileSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options);
            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);
        };

        return FileSyncUploadReplyBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToUploadLocal();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.localVersion != null && message.hasOwnProperty("localVersion")) {
                var error = $root.common.UInt64Value.verify(message.localVersion);
                if (error)
                    return "localVersion." + error;
            }
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadVersion);
                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) {
            if (object instanceof $root.file.OptionsToUploadLocal)
                return object;
            var message = new $root.file.OptionsToUploadLocal();
            if (object.localVersion != null) {
                if (typeof object.localVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.localVersion: object expected");
                message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion);
            }
            if (object.uploadVersion != null) {
                if (typeof object.uploadVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.uploadVersion: object expected");
                message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.localVersion = null;
                object.uploadVersion = null;
            }
            if (message.localVersion != null && message.hasOwnProperty("localVersion"))
                object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options);
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion"))
                object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options);
            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);
        };

        return OptionsToUploadLocal;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FS();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                case 6:
                    message.isSynced = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FS)
                return object;
            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 (typeof object.impl !== "object")
                    throw TypeError(".fs.FS.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.writable != null && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            if (message.isSynced != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CheckPresenceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.throwIfMissing = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.throwIfMissing != null && message.hasOwnProperty("throwIfMissing")) {
                var error = $root.common.BooleanValue.verify(message.throwIfMissing);
                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) {
            if (object instanceof $root.fs.CheckPresenceRequestBody)
                return object;
            var message = new $root.fs.CheckPresenceRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.throwIfMissing != null) {
                if (typeof object.throwIfMissing !== "object")
                    throw TypeError(".fs.CheckPresenceRequestBody.throwIfMissing: object expected");
                message.throwIfMissing = $root.common.BooleanValue.fromObject(object.throwIfMissing);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.throwIfMissing = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.throwIfMissing != null && message.hasOwnProperty("throwIfMissing"))
                object.throwIfMissing = $root.common.BooleanValue.toObject(message.throwIfMissing, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathOnlyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.PathOnlyRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.path = "";
            if (message.path != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.xaName = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.GetXAttrRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.xaName != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLink();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.readonly = reader.bool();
                    break;
                case 2:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.impl = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.readonly != null && message.hasOwnProperty("readonly"))
                if (typeof message.readonly !== "boolean")
                    return "readonly: boolean expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                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) {
            if (object instanceof $root.fs.SymLink)
                return object;
            var message = new $root.fs.SymLink();
            if (object.readonly != null)
                message.readonly = Boolean(object.readonly);
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.SymLink.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.SymLink.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.impl != null) {
                if (typeof object.impl !== "object")
                    throw TypeError(".fs.SymLink.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.readonly = false;
                object.isFile = null;
                object.isFolder = null;
                object.impl = null;
            }
            if (message.readonly != null && message.hasOwnProperty("readonly"))
                object.readonly = message.readonly;
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLinkTargetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.fs = $root.fs.FS.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.file = $root.file.File.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.fs != null && message.hasOwnProperty("fs")) {
                var error = $root.fs.FS.verify(message.fs);
                if (error)
                    return "fs." + error;
            }
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.file.File.verify(message.file);
                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) {
            if (object instanceof $root.fs.SymLinkTargetReplyBody)
                return object;
            var message = new $root.fs.SymLinkTargetReplyBody();
            if (object.fs != null) {
                if (typeof object.fs !== "object")
                    throw TypeError(".fs.SymLinkTargetReplyBody.fs: object expected");
                message.fs = $root.fs.FS.fromObject(object.fs);
            }
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".fs.SymLinkTargetReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.fs = null;
                object.file = null;
            }
            if (message.fs != null && message.hasOwnProperty("fs"))
                object.fs = $root.fs.FS.toObject(message.fs, options);
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.file.File.toObject(message.file, options);
            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);
        };

        return SymLinkTargetReplyBody;
    })();

    fs.FSEventMsg = (function() {

        /**
         * Properties of a FSEventMsg.
         * @memberof fs
         * @interface IFSEventMsg
         * @property {string|null} [type] FSEventMsg type
         * @property {string|null} [path] FSEventMsg path
         * @property {common.IStringValue|null} [src] FSEventMsg src
         * @property {common.IUInt64Value|null} [newVersion] FSEventMsg newVersion
         * @property {common.IStringValue|null} [name] FSEventMsg name
         * @property {common.IStringValue|null} [oldName] FSEventMsg oldName
         * @property {common.IStringValue|null} [newName] FSEventMsg newName
         * @property {fs.IListingEntryMsg|null} [entry] FSEventMsg entry
         * @property {common.IUInt64Value|null} [moveLabel] FSEventMsg moveLabel
         * @property {common.IUInt64Value|null} [removedArchVer] FSEventMsg removedArchVer
         * @property {common.IUInt64Value|null} [archivedVersion] FSEventMsg archivedVersion
         */

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

        /**
         * FSEventMsg type.
         * @member {string} type
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.type = "";

        /**
         * FSEventMsg path.
         * @member {string} path
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.path = "";

        /**
         * FSEventMsg src.
         * @member {common.IStringValue|null|undefined} src
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.src = null;

        /**
         * FSEventMsg newVersion.
         * @member {common.IUInt64Value|null|undefined} newVersion
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.newVersion = null;

        /**
         * FSEventMsg name.
         * @member {common.IStringValue|null|undefined} name
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.name = null;

        /**
         * FSEventMsg oldName.
         * @member {common.IStringValue|null|undefined} oldName
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.oldName = null;

        /**
         * FSEventMsg newName.
         * @member {common.IStringValue|null|undefined} newName
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.newName = null;

        /**
         * FSEventMsg entry.
         * @member {fs.IListingEntryMsg|null|undefined} entry
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.entry = null;

        /**
         * FSEventMsg moveLabel.
         * @member {common.IUInt64Value|null|undefined} moveLabel
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.moveLabel = null;

        /**
         * FSEventMsg removedArchVer.
         * @member {common.IUInt64Value|null|undefined} removedArchVer
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.removedArchVer = null;

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

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

        /**
         * Encodes the specified FSEventMsg message. Does not implicitly {@link fs.FSEventMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.FSEventMsg
         * @static
         * @param {fs.IFSEventMsg} message FSEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSEventMsg.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.StringValue.encode(message.src, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                $root.common.StringValue.encode(message.name, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.oldName != null && Object.hasOwnProperty.call(message, "oldName"))
                $root.common.StringValue.encode(message.oldName, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.newName != null && Object.hasOwnProperty.call(message, "newName"))
                $root.common.StringValue.encode(message.newName, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.entry != null && Object.hasOwnProperty.call(message, "entry"))
                $root.fs.ListingEntryMsg.encode(message.entry, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.moveLabel != null && Object.hasOwnProperty.call(message, "moveLabel"))
                $root.common.UInt64Value.encode(message.moveLabel, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
            if (message.removedArchVer != null && Object.hasOwnProperty.call(message, "removedArchVer"))
                $root.common.UInt64Value.encode(message.removedArchVer, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a FSEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSEventMsg} FSEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSEventMsg.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.path = reader.string();
                    break;
                case 3:
                    message.src = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.name = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.oldName = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 7:
                    message.newName = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 8:
                    message.entry = $root.fs.ListingEntryMsg.decode(reader, reader.uint32());
                    break;
                case 9:
                    message.moveLabel = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.removedArchVer = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 11:
                    message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a FSEventMsg message.
         * @function verify
         * @memberof fs.FSEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSEventMsg.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.src != null && message.hasOwnProperty("src")) {
                var error = $root.common.StringValue.verify(message.src);
                if (error)
                    return "src." + error;
            }
            if (message.newVersion != null && message.hasOwnProperty("newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion);
                if (error)
                    return "newVersion." + error;
            }
            if (message.name != null && message.hasOwnProperty("name")) {
                var error = $root.common.StringValue.verify(message.name);
                if (error)
                    return "name." + error;
            }
            if (message.oldName != null && message.hasOwnProperty("oldName")) {
                var error = $root.common.StringValue.verify(message.oldName);
                if (error)
                    return "oldName." + error;
            }
            if (message.newName != null && message.hasOwnProperty("newName")) {
                var error = $root.common.StringValue.verify(message.newName);
                if (error)
                    return "newName." + error;
            }
            if (message.entry != null && message.hasOwnProperty("entry")) {
                var error = $root.fs.ListingEntryMsg.verify(message.entry);
                if (error)
                    return "entry." + error;
            }
            if (message.moveLabel != null && message.hasOwnProperty("moveLabel")) {
                var error = $root.common.UInt64Value.verify(message.moveLabel);
                if (error)
                    return "moveLabel." + error;
            }
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer")) {
                var error = $root.common.UInt64Value.verify(message.removedArchVer);
                if (error)
                    return "removedArchVer." + error;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FSEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSEventMsg} FSEventMsg
         */
        FSEventMsg.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSEventMsg)
                return object;
            var message = new $root.fs.FSEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null)
                message.path = String(object.path);
            if (object.src != null) {
                if (typeof object.src !== "object")
                    throw TypeError(".fs.FSEventMsg.src: object expected");
                message.src = $root.common.StringValue.fromObject(object.src);
            }
            if (object.newVersion != null) {
                if (typeof object.newVersion !== "object")
                    throw TypeError(".fs.FSEventMsg.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion);
            }
            if (object.name != null) {
                if (typeof object.name !== "object")
                    throw TypeError(".fs.FSEventMsg.name: object expected");
                message.name = $root.common.StringValue.fromObject(object.name);
            }
            if (object.oldName != null) {
                if (typeof object.oldName !== "object")
                    throw TypeError(".fs.FSEventMsg.oldName: object expected");
                message.oldName = $root.common.StringValue.fromObject(object.oldName);
            }
            if (object.newName != null) {
                if (typeof object.newName !== "object")
                    throw TypeError(".fs.FSEventMsg.newName: object expected");
                message.newName = $root.common.StringValue.fromObject(object.newName);
            }
            if (object.entry != null) {
                if (typeof object.entry !== "object")
                    throw TypeError(".fs.FSEventMsg.entry: object expected");
                message.entry = $root.fs.ListingEntryMsg.fromObject(object.entry);
            }
            if (object.moveLabel != null) {
                if (typeof object.moveLabel !== "object")
                    throw TypeError(".fs.FSEventMsg.moveLabel: object expected");
                message.moveLabel = $root.common.UInt64Value.fromObject(object.moveLabel);
            }
            if (object.removedArchVer != null) {
                if (typeof object.removedArchVer !== "object")
                    throw TypeError(".fs.FSEventMsg.removedArchVer: object expected");
                message.removedArchVer = $root.common.UInt64Value.fromObject(object.removedArchVer);
            }
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".fs.FSEventMsg.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSEventMsg
         * @static
         * @param {fs.FSEventMsg} message FSEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSEventMsg.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = "";
                object.src = null;
                object.newVersion = null;
                object.name = null;
                object.oldName = null;
                object.newName = null;
                object.entry = null;
                object.moveLabel = null;
                object.removedArchVer = null;
                object.archivedVersion = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = $root.common.StringValue.toObject(message.src, options);
            if (message.newVersion != null && message.hasOwnProperty("newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options);
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = $root.common.StringValue.toObject(message.name, options);
            if (message.oldName != null && message.hasOwnProperty("oldName"))
                object.oldName = $root.common.StringValue.toObject(message.oldName, options);
            if (message.newName != null && message.hasOwnProperty("newName"))
                object.newName = $root.common.StringValue.toObject(message.newName, options);
            if (message.entry != null && message.hasOwnProperty("entry"))
                object.entry = $root.fs.ListingEntryMsg.toObject(message.entry, options);
            if (message.moveLabel != null && message.hasOwnProperty("moveLabel"))
                object.moveLabel = $root.common.UInt64Value.toObject(message.moveLabel, options);
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer"))
                object.removedArchVer = $root.common.UInt64Value.toObject(message.removedArchVer, options);
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            return object;
        };

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

        return FSEventMsg;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WatchTreeRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.depth = $root.common.UInt32Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.depth != null && message.hasOwnProperty("depth")) {
                var error = $root.common.UInt32Value.verify(message.depth);
                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) {
            if (object instanceof $root.fs.WatchTreeRequestBody)
                return object;
            var message = new $root.fs.WatchTreeRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.depth != null) {
                if (typeof object.depth !== "object")
                    throw TypeError(".fs.WatchTreeRequestBody.depth: object expected");
                message.depth = $root.common.UInt32Value.fromObject(object.depth);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.depth = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.depth != null && message.hasOwnProperty("depth"))
                object.depth = $root.common.UInt32Value.toObject(message.depth, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.entries && message.entries.length))
                        message.entries = [];
                    message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.entries != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.ListFolderReplyBody)
                return object;
            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 (typeof object.entries[i] !== "object")
                        throw TypeError(".fs.ListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListingEntryMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.name = reader.string();
                    break;
                case 2:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                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) {
            if (object instanceof $root.fs.ListingEntryMsg)
                return object;
            var message = new $root.fs.ListingEntryMsg();
            if (object.name != null)
                message.name = String(object.name);
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
            }
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                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) {
            if (object instanceof $root.fs.ReadBytesRequestBody)
                return object;
            var message = new $root.fs.ReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".fs.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".fs.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.criteria = $root.fs.SelectRequestBody.SelectCriteria.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.criteria != null && message.hasOwnProperty("criteria")) {
                var error = $root.fs.SelectRequestBody.SelectCriteria.verify(message.criteria);
                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) {
            if (object instanceof $root.fs.SelectRequestBody)
                return object;
            var message = new $root.fs.SelectRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.criteria != null) {
                if (typeof object.criteria !== "object")
                    throw TypeError(".fs.SelectRequestBody.criteria: object expected");
                message.criteria = $root.fs.SelectRequestBody.SelectCriteria.fromObject(object.criteria);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.criteria = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.criteria != null && message.hasOwnProperty("criteria"))
                object.criteria = $root.fs.SelectRequestBody.SelectCriteria.toObject(message.criteria, options);
            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);
        };

        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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    $root.common.StringValue.encode(message.exactName, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    $root.common.StringValue.encode(message.pattern, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    $root.common.StringValue.encode(message.regexp, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody.SelectCriteria();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.exactName = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    case 2:
                        message.pattern = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    case 3:
                        message.regexp = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    case 4:
                        message.depth = $root.common.UInt32Value.decode(reader, reader.uint32());
                        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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.exactName != null && message.hasOwnProperty("exactName")) {
                    var error = $root.common.StringValue.verify(message.exactName);
                    if (error)
                        return "exactName." + error;
                }
                if (message.pattern != null && message.hasOwnProperty("pattern")) {
                    var error = $root.common.StringValue.verify(message.pattern);
                    if (error)
                        return "pattern." + error;
                }
                if (message.regexp != null && message.hasOwnProperty("regexp")) {
                    var error = $root.common.StringValue.verify(message.regexp);
                    if (error)
                        return "regexp." + error;
                }
                if (message.depth != null && message.hasOwnProperty("depth")) {
                    var error = $root.common.UInt32Value.verify(message.depth);
                    if (error)
                        return "depth." + error;
                }
                if (message.type != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
                if (object instanceof $root.fs.SelectRequestBody.SelectCriteria)
                    return object;
                var message = new $root.fs.SelectRequestBody.SelectCriteria();
                if (object.exactName != null) {
                    if (typeof object.exactName !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.exactName: object expected");
                    message.exactName = $root.common.StringValue.fromObject(object.exactName);
                }
                if (object.pattern != null) {
                    if (typeof object.pattern !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.pattern: object expected");
                    message.pattern = $root.common.StringValue.fromObject(object.pattern);
                }
                if (object.regexp != null) {
                    if (typeof object.regexp !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.regexp: object expected");
                    message.regexp = $root.common.StringValue.fromObject(object.regexp);
                }
                if (object.depth != null) {
                    if (typeof object.depth !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.depth: object expected");
                    message.depth = $root.common.UInt32Value.fromObject(object.depth);
                }
                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) {
                if (!options)
                    options = {};
                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 && message.hasOwnProperty("exactName"))
                    object.exactName = $root.common.StringValue.toObject(message.exactName, options);
                if (message.pattern != null && message.hasOwnProperty("pattern"))
                    object.pattern = $root.common.StringValue.toObject(message.pattern, options);
                if (message.regexp != null && message.hasOwnProperty("regexp"))
                    object.regexp = $root.common.StringValue.toObject(message.regexp, options);
                if (message.depth != null && message.hasOwnProperty("depth"))
                    object.depth = $root.common.UInt32Value.toObject(message.depth, options);
                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 && message.hasOwnProperty("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);
            };

            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.name = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            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) {
            if (object instanceof $root.fs.FSCGetRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.name = "";
            if (message.name != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.FSCGetReplyBody)
                return object;
            var message = new $root.fs.FSCGetReplyBody();
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.FSCGetReplyBody.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.item = null;
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                $root.common.BooleanValue.encode(message.isCollection, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.isCollection = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.item = $root.fs.FSItem.Item.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.location = $root.fs.FSItem.Location.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                if (error)
                    return "isLink." + error;
            }
            if (message.isCollection != null && message.hasOwnProperty("isCollection")) {
                var error = $root.common.BooleanValue.verify(message.isCollection);
                if (error)
                    return "isCollection." + error;
            }
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.Item.verify(message.item);
                if (error)
                    return "item." + error;
            }
            if (message.location != null && message.hasOwnProperty("location")) {
                var error = $root.fs.FSItem.Location.verify(message.location);
                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) {
            if (object instanceof $root.fs.FSItem)
                return object;
            var message = new $root.fs.FSItem();
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.FSItem.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.FSItem.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".fs.FSItem.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            if (object.isCollection != null) {
                if (typeof object.isCollection !== "object")
                    throw TypeError(".fs.FSItem.isCollection: object expected");
                message.isCollection = $root.common.BooleanValue.fromObject(object.isCollection);
            }
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.FSItem.item: object expected");
                message.item = $root.fs.FSItem.Item.fromObject(object.item);
            }
            if (object.location != null) {
                if (typeof object.location !== "object")
                    throw TypeError(".fs.FSItem.location: object expected");
                message.location = $root.fs.FSItem.Location.fromObject(object.location);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            if (message.isCollection != null && message.hasOwnProperty("isCollection"))
                object.isCollection = $root.common.BooleanValue.toObject(message.isCollection, options);
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.Item.toObject(message.item, options);
            if (message.location != null && message.hasOwnProperty("location"))
                object.location = $root.fs.FSItem.Location.toObject(message.location, options);
            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);
        };

        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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Location();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.fs = $root.fs.FS.decode(reader, reader.uint32());
                        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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.fs != null && message.hasOwnProperty("fs")) {
                    var error = $root.fs.FS.verify(message.fs);
                    if (error)
                        return "fs." + error;
                }
                if (message.path != null && message.hasOwnProperty("path"))
                    if (!$util.isString(message.path))
                        return "path: string expected";
                if (message.storageUse != null && message.hasOwnProperty("storageUse"))
                    if (!$util.isString(message.storageUse))
                        return "storageUse: string expected";
                if (message.storageType != null && message.hasOwnProperty("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) {
                if (object instanceof $root.fs.FSItem.Location)
                    return object;
                var message = new $root.fs.FSItem.Location();
                if (object.fs != null) {
                    if (typeof object.fs !== "object")
                        throw TypeError(".fs.FSItem.Location.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.path = "";
                    object.storageUse = "";
                    object.storageType = "";
                }
                if (message.fs != null && message.hasOwnProperty("fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options);
                if (message.path != null && message.hasOwnProperty("path"))
                    object.path = message.path;
                if (message.storageUse != null && message.hasOwnProperty("storageUse"))
                    object.storageUse = message.storageUse;
                if (message.storageType != null && message.hasOwnProperty("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);
            };

            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    $root.common.ObjectReference.encode(message.collection, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Item();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.fs = $root.fs.FS.decode(reader, reader.uint32());
                        break;
                    case 2:
                        message.file = $root.file.File.decode(reader, reader.uint32());
                        break;
                    case 3:
                        message.collection = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.fs != null && message.hasOwnProperty("fs")) {
                    var error = $root.fs.FS.verify(message.fs);
                    if (error)
                        return "fs." + error;
                }
                if (message.file != null && message.hasOwnProperty("file")) {
                    var error = $root.file.File.verify(message.file);
                    if (error)
                        return "file." + error;
                }
                if (message.collection != null && message.hasOwnProperty("collection")) {
                    var error = $root.common.ObjectReference.verify(message.collection);
                    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) {
                if (object instanceof $root.fs.FSItem.Item)
                    return object;
                var message = new $root.fs.FSItem.Item();
                if (object.fs != null) {
                    if (typeof object.fs !== "object")
                        throw TypeError(".fs.FSItem.Item.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs);
                }
                if (object.file != null) {
                    if (typeof object.file !== "object")
                        throw TypeError(".fs.FSItem.Item.file: object expected");
                    message.file = $root.file.File.fromObject(object.file);
                }
                if (object.collection != null) {
                    if (typeof object.collection !== "object")
                        throw TypeError(".fs.FSItem.Item.collection: object expected");
                    message.collection = $root.common.ObjectReference.fromObject(object.collection);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.file = null;
                    object.collection = null;
                }
                if (message.fs != null && message.hasOwnProperty("fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options);
                if (message.file != null && message.hasOwnProperty("file"))
                    object.file = $root.file.File.toObject(message.file, options);
                if (message.collection != null && message.hasOwnProperty("collection"))
                    object.collection = $root.common.ObjectReference.toObject(message.collection, options);
                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);
            };

            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetAllReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.items && message.items.length))
                        message.items = [];
                    message.items.push($root.fs.NameAndItem.decode(reader, reader.uint32()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.items != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.FSCGetAllReplyBody)
                return object;
            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 (typeof object.items[i] !== "object")
                        throw TypeError(".fs.FSCGetAllReplyBody.items: object expected");
                    message.items[i] = $root.fs.NameAndItem.fromObject(object.items[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.NameAndItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.name = reader.string();
                    break;
                case 2:
                    message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.NameAndItem)
                return object;
            var message = new $root.fs.NameAndItem();
            if (object.name != null)
                message.name = String(object.name);
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.NameAndItem.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.item = null;
            }
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                $root.common.BooleanValue.encode(message.done, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                $root.fs.NameAndItem.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.IterResMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.done = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.value = $root.fs.NameAndItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.done != null && message.hasOwnProperty("done")) {
                var error = $root.common.BooleanValue.verify(message.done);
                if (error)
                    return "done." + error;
            }
            if (message.value != null && message.hasOwnProperty("value")) {
                var error = $root.fs.NameAndItem.verify(message.value);
                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) {
            if (object instanceof $root.fs.IterResMsg)
                return object;
            var message = new $root.fs.IterResMsg();
            if (object.done != null) {
                if (typeof object.done !== "object")
                    throw TypeError(".fs.IterResMsg.done: object expected");
                message.done = $root.common.BooleanValue.fromObject(object.done);
            }
            if (object.value != null) {
                if (typeof object.value !== "object")
                    throw TypeError(".fs.IterResMsg.value: object expected");
                message.value = $root.fs.NameAndItem.fromObject(object.value);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.done = null;
                object.value = null;
            }
            if (message.done != null && message.hasOwnProperty("done"))
                object.done = $root.common.BooleanValue.toObject(message.done, options);
            if (message.value != null && message.hasOwnProperty("value"))
                object.value = $root.fs.NameAndItem.toObject(message.value, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CollectionEvent();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.path = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path")) {
                var error = $root.common.StringValue.verify(message.path);
                if (error)
                    return "path." + error;
            }
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.CollectionEvent)
                return object;
            var message = new $root.fs.CollectionEvent();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (typeof object.path !== "object")
                    throw TypeError(".fs.CollectionEvent.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path);
            }
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.CollectionEvent.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
                object.item = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = $root.common.StringValue.toObject(message.path, options);
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedGetXAttrRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndFlagsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.PathAndFlagsRequestBody)
                return object;
            var message = new $root.fs.PathAndFlagsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.PathAndFlagsRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.VersionedListFolderReplyBody)
                return object;
            var message = new $root.fs.VersionedListFolderReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.entries[i] !== "object")
                        throw TypeError(".fs.VersionedListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedReadBytesRequestBody)
                return object;
            var message = new $root.fs.VersionedReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.changes != null && message.hasOwnProperty("changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes);
                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) {
            if (object instanceof $root.fs.UpdateXAttrsRequestBody)
                return object;
            var message = new $root.fs.UpdateXAttrsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.changes != null) {
                if (typeof object.changes !== "object")
                    throw TypeError(".fs.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.changes = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.changes != null && message.hasOwnProperty("changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MakeFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                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) {
            if (object instanceof $root.fs.MakeFolderRequestBody)
                return object;
            var message = new $root.fs.MakeFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.MakeFolderRequestBody.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.exclusive = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DeleteFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.removeContent = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.removeContent != null && message.hasOwnProperty("removeContent")) {
                var error = $root.common.BooleanValue.verify(message.removeContent);
                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) {
            if (object instanceof $root.fs.DeleteFolderRequestBody)
                return object;
            var message = new $root.fs.DeleteFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.removeContent != null) {
                if (typeof object.removeContent !== "object")
                    throw TypeError(".fs.DeleteFolderRequestBody.removeContent: object expected");
                message.removeContent = $root.common.BooleanValue.fromObject(object.removeContent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.removeContent = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.removeContent != null && message.hasOwnProperty("removeContent"))
                object.removeContent = $root.common.BooleanValue.toObject(message.removeContent, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MoveRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.src = reader.string();
                    break;
                case 2:
                    message.dst = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.MoveRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && message.hasOwnProperty("overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite);
                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) {
            if (object instanceof $root.fs.CopyFileRequestBody)
                return object;
            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 (typeof object.overwrite !== "object")
                    throw TypeError(".fs.CopyFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.overwrite = null;
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.overwrite != null && message.hasOwnProperty("overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite);
                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) {
            if (object instanceof $root.fs.CopyFolderRequestBody)
                return object;
            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 (typeof object.mergeAndOverwrite !== "object")
                    throw TypeError(".fs.CopyFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.file = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.dst = reader.string();
                    break;
                case 3:
                    message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.common.ObjectReference.verify(message.file);
                if (error)
                    return "file." + error;
            }
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && message.hasOwnProperty("overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite);
                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) {
            if (object instanceof $root.fs.SaveFileRequestBody)
                return object;
            var message = new $root.fs.SaveFileRequestBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".fs.SaveFileRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (typeof object.overwrite !== "object")
                    throw TypeError(".fs.SaveFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.file = null;
                object.dst = "";
                object.overwrite = null;
            }
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options);
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.overwrite != null && message.hasOwnProperty("overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.common.ObjectReference.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.folder = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.dst = reader.string();
                    break;
                case 3:
                    message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.folder != null && message.hasOwnProperty("folder")) {
                var error = $root.common.ObjectReference.verify(message.folder);
                if (error)
                    return "folder." + error;
            }
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite);
                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) {
            if (object instanceof $root.fs.SaveFolderRequestBody)
                return object;
            var message = new $root.fs.SaveFolderRequestBody();
            if (object.folder != null) {
                if (typeof object.folder !== "object")
                    throw TypeError(".fs.SaveFolderRequestBody.folder: object expected");
                message.folder = $root.common.ObjectReference.fromObject(object.folder);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (typeof object.mergeAndOverwrite !== "object")
                    throw TypeError(".fs.SaveFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.folder = null;
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.folder != null && message.hasOwnProperty("folder"))
                object.folder = $root.common.ObjectReference.toObject(message.folder, options);
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.LinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.target = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.target != null && message.hasOwnProperty("target")) {
                var error = $root.common.ObjectReference.verify(message.target);
                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) {
            if (object instanceof $root.fs.LinkRequestBody)
                return object;
            var message = new $root.fs.LinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.target != null) {
                if (typeof object.target !== "object")
                    throw TypeError(".fs.LinkRequestBody.target: object expected");
                message.target = $root.common.ObjectReference.fromObject(object.target);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.target = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.target != null && message.hasOwnProperty("target"))
                object.target = $root.common.ObjectReference.toObject(message.target, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndOptFileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.flags = $root.fs.FileFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.PathAndOptFileFlags)
                return object;
            var message = new $root.fs.PathAndOptFileFlags();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.PathAndOptFileFlags.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.create = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncate != null && message.hasOwnProperty("truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && message.hasOwnProperty("create")) {
                var error = $root.common.BooleanValue.verify(message.create);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                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) {
            if (object instanceof $root.fs.FileFlags)
                return object;
            var message = new $root.fs.FileFlags();
            if (object.truncate != null) {
                if (typeof object.truncate !== "object")
                    throw TypeError(".fs.FileFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate);
            }
            if (object.create != null) {
                if (typeof object.create !== "object")
                    throw TypeError(".fs.FileFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create);
            }
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.FileFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
            }
            if (message.truncate != null && message.hasOwnProperty("truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options);
            if (message.create != null && message.hasOwnProperty("create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options);
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && message.hasOwnProperty("json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteJsonFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = message.json;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && message.hasOwnProperty("txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteTxtFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.txt != null && message.hasOwnProperty("txt"))
                object.txt = message.txt;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteBytesRequestBody)
                return object;
            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)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.bytes != null && message.hasOwnProperty("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 && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && message.hasOwnProperty("json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteJsonFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = message.json;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedFileWriteFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.create = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncate != null && message.hasOwnProperty("truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && message.hasOwnProperty("create")) {
                var error = $root.common.BooleanValue.verify(message.create);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                if (error)
                    return "exclusive." + error;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion);
                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) {
            if (object instanceof $root.fs.VersionedFileWriteFlags)
                return object;
            var message = new $root.fs.VersionedFileWriteFlags();
            if (object.truncate != null) {
                if (typeof object.truncate !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate);
            }
            if (object.create != null) {
                if (typeof object.create !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create);
            }
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            if (object.currentVersion != null) {
                if (typeof object.currentVersion !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
                object.currentVersion = null;
            }
            if (message.truncate != null && message.hasOwnProperty("truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options);
            if (message.create != null && message.hasOwnProperty("create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options);
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && message.hasOwnProperty("txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteTxtFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.txt != null && message.hasOwnProperty("txt"))
                object.txt = message.txt;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteBytesRequestBody)
                return object;
            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)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.bytes != null && message.hasOwnProperty("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 && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedGetByteSinkRequestBody)
                return object;
            var message = new $root.fs.VersionedGetByteSinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedGetByteSinkRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                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) {
            if (object instanceof $root.fs.ArchiveCurrentRequestBody)
                return object;
            var message = new $root.fs.ArchiveCurrentRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".fs.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.version = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            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);
        };

        return ArchiveCurrentRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.version = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FSSyncIsOnDiskRequestBody)
                return object;
            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)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.status = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.status != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FSSyncIsOnDiskReplyBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && message.hasOwnProperty("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);
        };

        return FSSyncIsOnDiskReplyBody;
    })();

    fs.FSSyncDownloadRequestBody = (function() {

        /**
         * Properties of a FSSyncDownloadRequestBody.
         * @memberof fs
         * @interface IFSSyncDownloadRequestBody
         * @property {string|null} [path] FSSyncDownloadRequestBody path
         * @property {number|Long|null} [version] FSSyncDownloadRequestBody version
         */

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

        /**
         * FSSyncDownloadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncDownloadRequestBody
         * @instance
         */
        FSSyncDownloadRequestBody.prototype.path = "";

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

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

        /**
         * Encodes the specified FSSyncDownloadRequestBody message. Does not implicitly {@link fs.FSSyncDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.IFSSyncDownloadRequestBody} message FSSyncDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncDownloadRequestBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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 FSSyncDownloadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.IFSSyncDownloadRequestBody} message FSSyncDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

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

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

        /**
         * Verifies a FSSyncDownloadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncDownloadRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("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 FSSyncDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncDownloadRequestBody} FSSyncDownloadRequestBody
         */
        FSSyncDownloadRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSSyncDownloadRequestBody)
                return object;
            var message = new $root.fs.FSSyncDownloadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 FSSyncDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.FSSyncDownloadRequestBody} message FSSyncDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncDownloadRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                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 FSSyncDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        return FSSyncDownloadRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts);
                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) {
            if (object instanceof $root.fs.AdoptRemoteRequestBody)
                return object;
            var message = new $root.fs.AdoptRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".fs.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options);
            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);
        };

        return AdoptRemoteRequestBody;
    })();

    fs.DiffCurrentAndRemoteRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteRequestBody path
         * @property {common.IUInt64Value|null} [remoteVersion] DiffCurrentAndRemoteRequestBody remoteVersion
         */

        /**
         * Constructs a new DiffCurrentAndRemoteRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteRequestBody.
         * @implements IDiffCurrentAndRemoteRequestBody
         * @constructor
         * @param {fs.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)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @instance
         */
        DiffCurrentAndRemoteRequestBody.prototype.path = "";

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

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

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.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).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.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 fs.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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         */
        DiffCurrentAndRemoteRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteRequestBody)
                return object;
            var message = new $root.fs.DiffCurrentAndRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".fs.DiffCurrentAndRemoteRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteVersion = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            return object;
        };

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

        return DiffCurrentAndRemoteRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.fs.FolderDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.diff = $root.fs.FolderDiff.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.diff != null && message.hasOwnProperty("diff")) {
                var error = $root.fs.FolderDiff.verify(message.diff);
                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) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteReplyBody)
                return object;
            var message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (typeof object.diff !== "object")
                    throw TypeError(".fs.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.fs.FolderDiff.fromObject(object.diff);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && message.hasOwnProperty("diff"))
                object.diff = $root.fs.FolderDiff.toObject(message.diff, options);
            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);
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    fs.FolderDiff = (function() {

        /**
         * Properties of a FolderDiff.
         * @memberof fs
         * @interface IFolderDiff
         * @property {number|Long|null} [currentVersion] FolderDiff currentVersion
         * @property {common.IUInt64Value|null} [remoteVersion] FolderDiff remoteVersion
         * @property {Array.<fs.IListingEntryMsg>|null} [inCurrent] FolderDiff inCurrent
         * @property {Array.<fs.IListingEntryMsg>|null} [inRemote] FolderDiff inRemote
         * @property {Array.<string>|null} [nameOverlaps] FolderDiff nameOverlaps
         * @property {fs.FolderDiff.ITimeStamps|null} [ctime] FolderDiff ctime
         * @property {fs.FolderDiff.ITimeStamps|null} [mtime] FolderDiff mtime
         * @property {fs.FolderDiff.IXAttrs|null} [xattrs] FolderDiff xattrs
         */

        /**
         * Constructs a new FolderDiff.
         * @memberof fs
         * @classdesc Represents a FolderDiff.
         * @implements IFolderDiff
         * @constructor
         * @param {fs.IFolderDiff=} [properties] Properties to set
         */
        function FolderDiff(properties) {
            this.inCurrent = [];
            this.inRemote = [];
            this.nameOverlaps = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

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

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

        /**
         * FolderDiff inCurrent.
         * @member {Array.<fs.IListingEntryMsg>} inCurrent
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.inCurrent = $util.emptyArray;

        /**
         * FolderDiff inRemote.
         * @member {Array.<fs.IListingEntryMsg>} inRemote
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.inRemote = $util.emptyArray;

        /**
         * FolderDiff nameOverlaps.
         * @member {Array.<string>} nameOverlaps
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.nameOverlaps = $util.emptyArray;

        /**
         * FolderDiff ctime.
         * @member {fs.FolderDiff.ITimeStamps|null|undefined} ctime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.ctime = null;

        /**
         * FolderDiff mtime.
         * @member {fs.FolderDiff.ITimeStamps|null|undefined} mtime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.mtime = null;

        /**
         * FolderDiff xattrs.
         * @member {fs.FolderDiff.IXAttrs|null|undefined} xattrs
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.xattrs = null;

        /**
         * 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) {
            if (!writer)
                writer = $Writer.create();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.inCurrent != null && message.inCurrent.length)
                for (var i = 0; i < message.inCurrent.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.inCurrent[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.inRemote != null && message.inRemote.length)
                for (var i = 0; i < message.inRemote.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.inRemote[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.nameOverlaps != null && message.nameOverlaps.length)
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    writer.uint32(/* id 5, wireType 2 =*/42).string(message.nameOverlaps[i]);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.fs.FolderDiff.TimeStamps.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.fs.FolderDiff.TimeStamps.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs"))
                $root.fs.FolderDiff.XAttrs.encode(message.xattrs, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.currentVersion = reader.uint64();
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 3:
                    if (!(message.inCurrent && message.inCurrent.length))
                        message.inCurrent = [];
                    message.inCurrent.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                    break;
                case 4:
                    if (!(message.inRemote && message.inRemote.length))
                        message.inRemote = [];
                    message.inRemote.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                    break;
                case 5:
                    if (!(message.nameOverlaps && message.nameOverlaps.length))
                        message.nameOverlaps = [];
                    message.nameOverlaps.push(reader.string());
                    break;
                case 6:
                    message.ctime = $root.fs.FolderDiff.TimeStamps.decode(reader, reader.uint32());
                    break;
                case 7:
                    message.mtime = $root.fs.FolderDiff.TimeStamps.decode(reader, reader.uint32());
                    break;
                case 8:
                    message.xattrs = $root.fs.FolderDiff.XAttrs.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.currentVersion != null && message.hasOwnProperty("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.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.inCurrent != null && message.hasOwnProperty("inCurrent")) {
                if (!Array.isArray(message.inCurrent))
                    return "inCurrent: array expected";
                for (var i = 0; i < message.inCurrent.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.inCurrent[i]);
                    if (error)
                        return "inCurrent." + error;
                }
            }
            if (message.inRemote != null && message.hasOwnProperty("inRemote")) {
                if (!Array.isArray(message.inRemote))
                    return "inRemote: array expected";
                for (var i = 0; i < message.inRemote.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.inRemote[i]);
                    if (error)
                        return "inRemote." + error;
                }
            }
            if (message.nameOverlaps != null && message.hasOwnProperty("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";
            }
            if (message.ctime != null && message.hasOwnProperty("ctime")) {
                var error = $root.fs.FolderDiff.TimeStamps.verify(message.ctime);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && message.hasOwnProperty("mtime")) {
                var error = $root.fs.FolderDiff.TimeStamps.verify(message.mtime);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && message.hasOwnProperty("xattrs")) {
                var error = $root.fs.FolderDiff.XAttrs.verify(message.xattrs);
                if (error)
                    return "xattrs." + error;
            }
            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) {
            if (object instanceof $root.fs.FolderDiff)
                return object;
            var message = new $root.fs.FolderDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    (message.currentVersion = $util.Long.fromValue(object.currentVersion)).unsigned = 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.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".fs.FolderDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            if (object.inCurrent) {
                if (!Array.isArray(object.inCurrent))
                    throw TypeError(".fs.FolderDiff.inCurrent: array expected");
                message.inCurrent = [];
                for (var i = 0; i < object.inCurrent.length; ++i) {
                    if (typeof object.inCurrent[i] !== "object")
                        throw TypeError(".fs.FolderDiff.inCurrent: object expected");
                    message.inCurrent[i] = $root.fs.ListingEntryMsg.fromObject(object.inCurrent[i]);
                }
            }
            if (object.inRemote) {
                if (!Array.isArray(object.inRemote))
                    throw TypeError(".fs.FolderDiff.inRemote: array expected");
                message.inRemote = [];
                for (var i = 0; i < object.inRemote.length; ++i) {
                    if (typeof object.inRemote[i] !== "object")
                        throw TypeError(".fs.FolderDiff.inRemote: object expected");
                    message.inRemote[i] = $root.fs.ListingEntryMsg.fromObject(object.inRemote[i]);
                }
            }
            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]);
            }
            if (object.ctime != null) {
                if (typeof object.ctime !== "object")
                    throw TypeError(".fs.FolderDiff.ctime: object expected");
                message.ctime = $root.fs.FolderDiff.TimeStamps.fromObject(object.ctime);
            }
            if (object.mtime != null) {
                if (typeof object.mtime !== "object")
                    throw TypeError(".fs.FolderDiff.mtime: object expected");
                message.mtime = $root.fs.FolderDiff.TimeStamps.fromObject(object.mtime);
            }
            if (object.xattrs != null) {
                if (typeof object.xattrs !== "object")
                    throw TypeError(".fs.FolderDiff.xattrs: object expected");
                message.xattrs = $root.fs.FolderDiff.XAttrs.fromObject(object.xattrs);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults) {
                object.inCurrent = [];
                object.inRemote = [];
                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() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : 0;
                object.remoteVersion = null;
                object.ctime = null;
                object.mtime = null;
                object.xattrs = null;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                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.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            if (message.inCurrent && message.inCurrent.length) {
                object.inCurrent = [];
                for (var j = 0; j < message.inCurrent.length; ++j)
                    object.inCurrent[j] = $root.fs.ListingEntryMsg.toObject(message.inCurrent[j], options);
            }
            if (message.inRemote && message.inRemote.length) {
                object.inRemote = [];
                for (var j = 0; j < message.inRemote.length; ++j)
                    object.inRemote[j] = $root.fs.ListingEntryMsg.toObject(message.inRemote[j], options);
            }
            if (message.nameOverlaps && message.nameOverlaps.length) {
                object.nameOverlaps = [];
                for (var j = 0; j < message.nameOverlaps.length; ++j)
                    object.nameOverlaps[j] = message.nameOverlaps[j];
            }
            if (message.ctime != null && message.hasOwnProperty("ctime"))
                object.ctime = $root.fs.FolderDiff.TimeStamps.toObject(message.ctime, options);
            if (message.mtime != null && message.hasOwnProperty("mtime"))
                object.mtime = $root.fs.FolderDiff.TimeStamps.toObject(message.mtime, options);
            if (message.xattrs != null && message.hasOwnProperty("xattrs"))
                object.xattrs = $root.fs.FolderDiff.XAttrs.toObject(message.xattrs, options);
            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);
        };

        FolderDiff.TimeStamps = (function() {

            /**
             * Properties of a TimeStamps.
             * @memberof fs.FolderDiff
             * @interface ITimeStamps
             * @property {number|Long|null} [current] TimeStamps current
             * @property {common.IUInt64Value|null} [remote] TimeStamps remote
             */

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

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

            /**
             * TimeStamps remote.
             * @member {common.IUInt64Value|null|undefined} remote
             * @memberof fs.FolderDiff.TimeStamps
             * @instance
             */
            TimeStamps.prototype.remote = null;

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

            /**
             * Encodes the specified TimeStamps message. Does not implicitly {@link fs.FolderDiff.TimeStamps.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.ITimeStamps} message TimeStamps message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TimeStamps.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                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"))
                    $root.common.UInt64Value.encode(message.remote, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                return writer;
            };

            /**
             * Encodes the specified TimeStamps message, length delimited. Does not implicitly {@link fs.FolderDiff.TimeStamps.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.ITimeStamps} message TimeStamps message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TimeStamps.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

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

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

            /**
             * Verifies a TimeStamps message.
             * @function verify
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            TimeStamps.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.current != null && message.hasOwnProperty("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 && message.hasOwnProperty("remote")) {
                    var error = $root.common.UInt64Value.verify(message.remote);
                    if (error)
                        return "remote." + error;
                }
                return null;
            };

            /**
             * Creates a TimeStamps message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.TimeStamps} TimeStamps
             */
            TimeStamps.fromObject = function fromObject(object) {
                if (object instanceof $root.fs.FolderDiff.TimeStamps)
                    return object;
                var message = new $root.fs.FolderDiff.TimeStamps();
                if (object.current != null)
                    if ($util.Long)
                        (message.current = $util.Long.fromValue(object.current)).unsigned = 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 (typeof object.remote !== "object")
                        throw TypeError(".fs.FolderDiff.TimeStamps.remote: object expected");
                    message.remote = $root.common.UInt64Value.fromObject(object.remote);
                }
                return message;
            };

            /**
             * Creates a plain object from a TimeStamps message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.TimeStamps} message TimeStamps
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            TimeStamps.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                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() : long;
                    } else
                        object.current = options.longs === String ? "0" : 0;
                    object.remote = null;
                }
                if (message.current != null && message.hasOwnProperty("current"))
                    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 && message.hasOwnProperty("remote"))
                    object.remote = $root.common.UInt64Value.toObject(message.remote, options);
                return object;
            };

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

            return TimeStamps;
        })();

        FolderDiff.XAttrs = (function() {

            /**
             * Properties of a XAttrs.
             * @memberof fs.FolderDiff
             * @interface IXAttrs
             * @property {Array.<file.INameAndXAttrValue>|null} [inCurrent] XAttrs inCurrent
             * @property {Array.<file.INameAndXAttrValue>|null} [inRemote] XAttrs inRemote
             * @property {Array.<string>|null} [nameOverlaps] XAttrs nameOverlaps
             */

            /**
             * Constructs a new XAttrs.
             * @memberof fs.FolderDiff
             * @classdesc Represents a XAttrs.
             * @implements IXAttrs
             * @constructor
             * @param {fs.FolderDiff.IXAttrs=} [properties] Properties to set
             */
            function XAttrs(properties) {
                this.inCurrent = [];
                this.inRemote = [];
                this.nameOverlaps = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * XAttrs inCurrent.
             * @member {Array.<file.INameAndXAttrValue>} inCurrent
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.inCurrent = $util.emptyArray;

            /**
             * XAttrs inRemote.
             * @member {Array.<file.INameAndXAttrValue>} inRemote
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.inRemote = $util.emptyArray;

            /**
             * XAttrs nameOverlaps.
             * @member {Array.<string>} nameOverlaps
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.nameOverlaps = $util.emptyArray;

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

            /**
             * Encodes the specified XAttrs message. Does not implicitly {@link fs.FolderDiff.XAttrs.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.IXAttrs} message XAttrs message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            XAttrs.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.inCurrent != null && message.inCurrent.length)
                    for (var i = 0; i < message.inCurrent.length; ++i)
                        $root.file.NameAndXAttrValue.encode(message.inCurrent[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.inRemote != null && message.inRemote.length)
                    for (var i = 0; i < message.inRemote.length; ++i)
                        $root.file.NameAndXAttrValue.encode(message.inRemote[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.nameOverlaps != null && message.nameOverlaps.length)
                    for (var i = 0; i < message.nameOverlaps.length; ++i)
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.nameOverlaps[i]);
                return writer;
            };

            /**
             * Encodes the specified XAttrs message, length delimited. Does not implicitly {@link fs.FolderDiff.XAttrs.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.IXAttrs} message XAttrs message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            XAttrs.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

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

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

            /**
             * Verifies a XAttrs message.
             * @function verify
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            XAttrs.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.inCurrent != null && message.hasOwnProperty("inCurrent")) {
                    if (!Array.isArray(message.inCurrent))
                        return "inCurrent: array expected";
                    for (var i = 0; i < message.inCurrent.length; ++i) {
                        var error = $root.file.NameAndXAttrValue.verify(message.inCurrent[i]);
                        if (error)
                            return "inCurrent." + error;
                    }
                }
                if (message.inRemote != null && message.hasOwnProperty("inRemote")) {
                    if (!Array.isArray(message.inRemote))
                        return "inRemote: array expected";
                    for (var i = 0; i < message.inRemote.length; ++i) {
                        var error = $root.file.NameAndXAttrValue.verify(message.inRemote[i]);
                        if (error)
                            return "inRemote." + error;
                    }
                }
                if (message.nameOverlaps != null && message.hasOwnProperty("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 XAttrs message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.XAttrs} XAttrs
             */
            XAttrs.fromObject = function fromObject(object) {
                if (object instanceof $root.fs.FolderDiff.XAttrs)
                    return object;
                var message = new $root.fs.FolderDiff.XAttrs();
                if (object.inCurrent) {
                    if (!Array.isArray(object.inCurrent))
                        throw TypeError(".fs.FolderDiff.XAttrs.inCurrent: array expected");
                    message.inCurrent = [];
                    for (var i = 0; i < object.inCurrent.length; ++i) {
                        if (typeof object.inCurrent[i] !== "object")
                            throw TypeError(".fs.FolderDiff.XAttrs.inCurrent: object expected");
                        message.inCurrent[i] = $root.file.NameAndXAttrValue.fromObject(object.inCurrent[i]);
                    }
                }
                if (object.inRemote) {
                    if (!Array.isArray(object.inRemote))
                        throw TypeError(".fs.FolderDiff.XAttrs.inRemote: array expected");
                    message.inRemote = [];
                    for (var i = 0; i < object.inRemote.length; ++i) {
                        if (typeof object.inRemote[i] !== "object")
                            throw TypeError(".fs.FolderDiff.XAttrs.inRemote: object expected");
                        message.inRemote[i] = $root.file.NameAndXAttrValue.fromObject(object.inRemote[i]);
                    }
                }
                if (object.nameOverlaps) {
                    if (!Array.isArray(object.nameOverlaps))
                        throw TypeError(".fs.FolderDiff.XAttrs.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 XAttrs message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.XAttrs} message XAttrs
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            XAttrs.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.arrays || options.defaults) {
                    object.inCurrent = [];
                    object.inRemote = [];
                    object.nameOverlaps = [];
                }
                if (message.inCurrent && message.inCurrent.length) {
                    object.inCurrent = [];
                    for (var j = 0; j < message.inCurrent.length; ++j)
                        object.inCurrent[j] = $root.file.NameAndXAttrValue.toObject(message.inCurrent[j], options);
                }
                if (message.inRemote && message.inRemote.length) {
                    object.inRemote = [];
                    for (var j = 0; j < message.inRemote.length; ++j)
                        object.inRemote[j] = $root.file.NameAndXAttrValue.toObject(message.inRemote[j], options);
                }
                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 XAttrs to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            XAttrs.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            return XAttrs;
        })();

        return FolderDiff;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts);
                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) {
            if (object instanceof $root.fs.FSSyncUploadRequestBody)
                return object;
            var message = new $root.fs.FSSyncUploadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".fs.FSSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options);
            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);
        };

        return FSSyncUploadRequestBody;
    })();

    fs.FSSyncUploadReplyBody = (function() {

        /**
         * Properties of a FSSyncUploadReplyBody.
         * @memberof fs
         * @interface IFSSyncUploadReplyBody
         * @property {common.IUInt64Value|null} [uploadedVersion] FSSyncUploadReplyBody uploadedVersion
         */

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

        /**
         * FSSyncUploadReplyBody uploadedVersion.
         * @member {common.IUInt64Value|null|undefined} uploadedVersion
         * @memberof fs.FSSyncUploadReplyBody
         * @instance
         */
        FSSyncUploadReplyBody.prototype.uploadedVersion = null;

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

        /**
         * Encodes the specified FSSyncUploadReplyBody message. Does not implicitly {@link fs.FSSyncUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {fs.IFSSyncUploadReplyBody} message FSSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadReplyBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

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

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

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

        /**
         * Verifies a FSSyncUploadReplyBody message.
         * @function verify
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncUploadReplyBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion);
                if (error)
                    return "uploadedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FSSyncUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncUploadReplyBody} FSSyncUploadReplyBody
         */
        FSSyncUploadReplyBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSSyncUploadReplyBody)
                return object;
            var message = new $root.fs.FSSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (typeof object.uploadedVersion !== "object")
                    throw TypeError(".fs.FSSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSSyncUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {fs.FSSyncUploadReplyBody} message FSSyncUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncUploadReplyBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options);
            return object;
        };

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

        return FSSyncUploadReplyBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.itemName != null && message.hasOwnProperty("itemName"))
                if (!$util.isString(message.itemName))
                    return "itemName: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.fs.AdoptRemoteFolderItemRequestBody.Options.verify(message.opts);
                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) {
            if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody)
                return object;
            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 (typeof object.opts !== "object")
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.opts: object expected");
                message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.itemName = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.itemName != null && message.hasOwnProperty("itemName"))
                object.itemName = message.itemName;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.toObject(message.opts, options);
            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);
        };

        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
             */

            /**
             * 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)
                            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;

            /**
             * 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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    case 2:
                        message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.localVersion != null && message.hasOwnProperty("localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion")) {
                    var error = $root.common.UInt64Value.verify(message.uploadVersion);
                    if (error)
                        return "uploadVersion." + 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) {
                if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody.Options)
                    return object;
                var message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                if (object.localVersion != null) {
                    if (typeof object.localVersion !== "object")
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion);
                }
                if (object.uploadVersion != null) {
                    if (typeof object.uploadVersion !== "object")
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.uploadVersion: object expected");
                    message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.uploadVersion = null;
                }
                if (message.localVersion != null && message.hasOwnProperty("localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options);
                if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion"))
                    object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options);
                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);
            };

            return Options;
        })();

        return AdoptRemoteFolderItemRequestBody;
    })();

    return fs;
})();

module.exports = $root;

},{"protobufjs/minimal":255}],11:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.AppRPCRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.service = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.service != null && message.hasOwnProperty("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) {
            if (object instanceof $root.rpc.AppRPCRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.service = "";
            if (message.service != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.OtherAppsRPCRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.appDomain = reader.string();
                    break;
                case 2:
                    message.service = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.appDomain != null && message.hasOwnProperty("appDomain"))
                if (!$util.isString(message.appDomain))
                    return "appDomain: string expected";
            if (message.service != null && message.hasOwnProperty("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) {
            if (object instanceof $root.rpc.OtherAppsRPCRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.appDomain = "";
                object.service = "";
            }
            if (message.appDomain != null && message.hasOwnProperty("appDomain"))
                object.appDomain = message.appDomain;
            if (message.service != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.AllocateProxyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objRef != null && message.hasOwnProperty("objRef"))
                if (!$util.isInteger(message.objRef))
                    return "objRef: integer expected";
            if (message.members != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.rpc.AllocateProxyRequestBody)
                return object;
            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 (typeof object.members[i] !== "object")
                        throw TypeError(".rpc.AllocateProxyRequestBody.members: object expected");
                    message.members[i] = $root.rpc.AllocateProxyRequestBody.Member.fromObject(object.members[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.members = [];
            if (options.defaults)
                object.objRef = 0;
            if (message.objRef != null && message.hasOwnProperty("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);
            }
            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);
        };

        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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                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()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.AllocateProxyRequestBody.Member();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    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()));
                        break;
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.isObj != null && message.hasOwnProperty("isObj"))
                    if (typeof message.isObj !== "boolean")
                        return "isObj: boolean expected";
                if (message.name != null && message.hasOwnProperty("name"))
                    if (!$util.isString(message.name))
                        return "name: string expected";
                if (message.members != null && message.hasOwnProperty("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]);
                        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) {
                if (object instanceof $root.rpc.AllocateProxyRequestBody.Member)
                    return object;
                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 (typeof object.members[i] !== "object")
                            throw TypeError(".rpc.AllocateProxyRequestBody.Member.members: object expected");
                        message.members[i] = $root.rpc.AllocateProxyRequestBody.Member.fromObject(object.members[i]);
                    }
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.arrays || options.defaults)
                    object.members = [];
                if (options.defaults) {
                    object.isObj = false;
                    object.name = "";
                }
                if (message.isObj != null && message.hasOwnProperty("isObj"))
                    object.isObj = message.isObj;
                if (message.name != null && message.hasOwnProperty("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);
                }
                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);
            };

            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.CallStartRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.method = reader.string();
                    break;
                case 2:
                    message.req = $root.rpc.PassedDatum.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.method != null && message.hasOwnProperty("method"))
                if (!$util.isString(message.method))
                    return "method: string expected";
            if (message.req != null && message.hasOwnProperty("req")) {
                var error = $root.rpc.PassedDatum.verify(message.req);
                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) {
            if (object instanceof $root.rpc.CallStartRequestBody)
                return object;
            var message = new $root.rpc.CallStartRequestBody();
            if (object.method != null)
                message.method = String(object.method);
            if (object.req != null) {
                if (typeof object.req !== "object")
                    throw TypeError(".rpc.CallStartRequestBody.req: object expected");
                message.req = $root.rpc.PassedDatum.fromObject(object.req);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.method = "";
                object.req = null;
            }
            if (message.method != null && message.hasOwnProperty("method"))
                object.method = message.method;
            if (message.req != null && message.hasOwnProperty("req"))
                object.req = $root.rpc.PassedDatum.toObject(message.req, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.PassedDatum();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.passedObjs != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.rpc.PassedDatum)
                return object;
            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)
                    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 (typeof object.passedObjs[i] !== "object")
                        throw TypeError(".rpc.PassedDatum.passedObjs: object expected");
                    message.passedObjs[i] = $root.rpc.PassedDatum.PassedObj.fromObject(object.passedObjs[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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);
            }
            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);
        };

        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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.ref != null && Object.hasOwnProperty.call(message, "ref"))
                    $root.common.ObjectReference.encode(message.ref, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    $root.file.File.encode(message.file, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.PassedDatum.PassedObj();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.ref = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    case 2:
                        message.fs = $root.fs.FS.decode(reader, reader.uint32());
                        break;
                    case 3:
                        message.file = $root.file.File.decode(reader, reader.uint32());
                        break;
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.ref != null && message.hasOwnProperty("ref")) {
                    var error = $root.common.ObjectReference.verify(message.ref);
                    if (error)
                        return "ref." + error;
                }
                if (message.fs != null && message.hasOwnProperty("fs")) {
                    var error = $root.fs.FS.verify(message.fs);
                    if (error)
                        return "fs." + error;
                }
                if (message.file != null && message.hasOwnProperty("file")) {
                    var error = $root.file.File.verify(message.file);
                    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) {
                if (object instanceof $root.rpc.PassedDatum.PassedObj)
                    return object;
                var message = new $root.rpc.PassedDatum.PassedObj();
                if (object.ref != null) {
                    if (typeof object.ref !== "object")
                        throw TypeError(".rpc.PassedDatum.PassedObj.ref: object expected");
                    message.ref = $root.common.ObjectReference.fromObject(object.ref);
                }
                if (object.fs != null) {
                    if (typeof object.fs !== "object")
                        throw TypeError(".rpc.PassedDatum.PassedObj.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs);
                }
                if (object.file != null) {
                    if (typeof object.file !== "object")
                        throw TypeError(".rpc.PassedDatum.PassedObj.file: object expected");
                    message.file = $root.file.File.fromObject(object.file);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.ref = null;
                    object.fs = null;
                    object.file = null;
                }
                if (message.ref != null && message.hasOwnProperty("ref"))
                    object.ref = $root.common.ObjectReference.toObject(message.ref, options);
                if (message.fs != null && message.hasOwnProperty("fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options);
                if (message.file != null && message.hasOwnProperty("file"))
                    object.file = $root.file.File.toObject(message.file, options);
                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);
            };

            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.ExposeSrvRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.service = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.service != null && message.hasOwnProperty("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) {
            if (object instanceof $root.rpc.ExposeSrvRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.service = "";
            if (message.service != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.IncomingMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.msgType != null && message.hasOwnProperty("msgType"))
                if (!$util.isString(message.msgType))
                    return "msgType: string expected";
            if (message.callNum != null && message.hasOwnProperty("callNum"))
                if (!$util.isInteger(message.callNum))
                    return "callNum: integer expected";
            if (message.method != null && message.hasOwnProperty("method"))
                if (!$util.isString(message.method))
                    return "method: string expected";
            if (message.data != null && message.hasOwnProperty("data")) {
                var error = $root.rpc.PassedDatum.verify(message.data);
                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) {
            if (object instanceof $root.rpc.IncomingMsg)
                return object;
            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 (typeof object.data !== "object")
                    throw TypeError(".rpc.IncomingMsg.data: object expected");
                message.data = $root.rpc.PassedDatum.fromObject(object.data);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.msgType = "";
                object.callNum = 0;
                object.method = "";
                object.data = null;
            }
            if (message.msgType != null && message.hasOwnProperty("msgType"))
                object.msgType = message.msgType;
            if (message.callNum != null && message.hasOwnProperty("callNum"))
                object.callNum = message.callNum;
            if (message.method != null && message.hasOwnProperty("method"))
                object.method = message.method;
            if (message.data != null && message.hasOwnProperty("data"))
                object.data = $root.rpc.PassedDatum.toObject(message.data, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                $root.common.ErrorValue.encode(message.err, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.OutgoingMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                case 4:
                    message.err = $root.common.ErrorValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.callNum != null && message.hasOwnProperty("callNum"))
                if (!$util.isInteger(message.callNum))
                    return "callNum: integer expected";
            if (message.callStatus != null && message.hasOwnProperty("callStatus"))
                if (!$util.isString(message.callStatus))
                    return "callStatus: string expected";
            if (message.data != null && message.hasOwnProperty("data")) {
                var error = $root.rpc.PassedDatum.verify(message.data);
                if (error)
                    return "data." + error;
            }
            if (message.err != null && message.hasOwnProperty("err")) {
                var error = $root.common.ErrorValue.verify(message.err);
                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) {
            if (object instanceof $root.rpc.OutgoingMsg)
                return object;
            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 (typeof object.data !== "object")
                    throw TypeError(".rpc.OutgoingMsg.data: object expected");
                message.data = $root.rpc.PassedDatum.fromObject(object.data);
            }
            if (object.err != null) {
                if (typeof object.err !== "object")
                    throw TypeError(".rpc.OutgoingMsg.err: object expected");
                message.err = $root.common.ErrorValue.fromObject(object.err);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.callNum = 0;
                object.callStatus = "";
                object.data = null;
                object.err = null;
            }
            if (message.callNum != null && message.hasOwnProperty("callNum"))
                object.callNum = message.callNum;
            if (message.callStatus != null && message.hasOwnProperty("callStatus"))
                object.callStatus = message.callStatus;
            if (message.data != null && message.hasOwnProperty("data"))
                object.data = $root.rpc.PassedDatum.toObject(message.data, options);
            if (message.err != null && message.hasOwnProperty("err"))
                object.err = $root.common.ErrorValue.toObject(message.err, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.values && message.values.length))
                        message.values = [];
                    message.values.push(reader.string());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint32();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bytes();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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)
                    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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.runtimeExcJson = reader.string();
                    break;
                case 2:
                    message.err = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.File();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                case 6:
                    message.isSynced = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                if (typeof message.isNew !== "boolean")
                    return "isNew: boolean expected";
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.File)
                return object;
            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 (typeof object.impl !== "object")
                    throw TypeError(".file.File.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                object.isNew = message.isNew;
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            if (message.isSynced != null && message.hasOwnProperty("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);
        };

        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
         */

        /**
         * 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)
                        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;

        /**
         * 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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                $root.file.SyncVersionsBranchMsg.encode(message.synced, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                $root.file.SyncVersionsBranchMsg.encode(message.remote, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                $root.common.BooleanValue.encode(message.existsInSyncedParent, writer.uint32(/* id 5, wireType 2 =*/42).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncStatusMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.state = reader.string();
                    break;
                case 2:
                    message.local = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.synced = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.remote = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.existsInSyncedParent = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.state != null && message.hasOwnProperty("state"))
                if (!$util.isString(message.state))
                    return "state: string expected";
            if (message.local != null && message.hasOwnProperty("local")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.local);
                if (error)
                    return "local." + error;
            }
            if (message.synced != null && message.hasOwnProperty("synced")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.synced);
                if (error)
                    return "synced." + error;
            }
            if (message.remote != null && message.hasOwnProperty("remote")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.remote);
                if (error)
                    return "remote." + error;
            }
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent")) {
                var error = $root.common.BooleanValue.verify(message.existsInSyncedParent);
                if (error)
                    return "existsInSyncedParent." + 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) {
            if (object instanceof $root.file.SyncStatusMsg)
                return object;
            var message = new $root.file.SyncStatusMsg();
            if (object.state != null)
                message.state = String(object.state);
            if (object.local != null) {
                if (typeof object.local !== "object")
                    throw TypeError(".file.SyncStatusMsg.local: object expected");
                message.local = $root.file.SyncVersionsBranchMsg.fromObject(object.local);
            }
            if (object.synced != null) {
                if (typeof object.synced !== "object")
                    throw TypeError(".file.SyncStatusMsg.synced: object expected");
                message.synced = $root.file.SyncVersionsBranchMsg.fromObject(object.synced);
            }
            if (object.remote != null) {
                if (typeof object.remote !== "object")
                    throw TypeError(".file.SyncStatusMsg.remote: object expected");
                message.remote = $root.file.SyncVersionsBranchMsg.fromObject(object.remote);
            }
            if (object.existsInSyncedParent != null) {
                if (typeof object.existsInSyncedParent !== "object")
                    throw TypeError(".file.SyncStatusMsg.existsInSyncedParent: object expected");
                message.existsInSyncedParent = $root.common.BooleanValue.fromObject(object.existsInSyncedParent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.state = "";
                object.local = null;
                object.synced = null;
                object.remote = null;
                object.existsInSyncedParent = null;
            }
            if (message.state != null && message.hasOwnProperty("state"))
                object.state = message.state;
            if (message.local != null && message.hasOwnProperty("local"))
                object.local = $root.file.SyncVersionsBranchMsg.toObject(message.local, options);
            if (message.synced != null && message.hasOwnProperty("synced"))
                object.synced = $root.file.SyncVersionsBranchMsg.toObject(message.synced, options);
            if (message.remote != null && message.hasOwnProperty("remote"))
                object.remote = $root.file.SyncVersionsBranchMsg.toObject(message.remote, options);
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent"))
                object.existsInSyncedParent = $root.common.BooleanValue.toObject(message.existsInSyncedParent, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                $root.common.UInt64Value.encode(message.latest, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncVersionsBranchMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.latest = $root.common.UInt64Value.decode(reader, reader.uint32());
                    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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.latest != null && message.hasOwnProperty("latest")) {
                var error = $root.common.UInt64Value.verify(message.latest);
                if (error)
                    return "latest." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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 && message.hasOwnProperty("isArchived")) {
                var error = $root.common.BooleanValue.verify(message.isArchived);
                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) {
            if (object instanceof $root.file.SyncVersionsBranchMsg)
                return object;
            var message = new $root.file.SyncVersionsBranchMsg();
            if (object.latest != null) {
                if (typeof object.latest !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.latest: object expected");
                message.latest = $root.common.UInt64Value.fromObject(object.latest);
            }
            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])).unsigned = 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 (typeof object.isArchived !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.isArchived: object expected");
                message.isArchived = $root.common.BooleanValue.fromObject(object.isArchived);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults) {
                object.latest = null;
                object.isArchived = null;
            }
            if (message.latest != null && message.hasOwnProperty("latest"))
                object.latest = $root.common.UInt64Value.toObject(message.latest, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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 && message.hasOwnProperty("isArchived"))
                object.isArchived = $root.common.BooleanValue.toObject(message.isArchived, options);
            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);
        };

        return SyncVersionsBranchMsg;
    })();

    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 {file.ISyncStatusMsg|null} [sync] StatsMsg sync
         */

        /**
         * 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)
                        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 sync.
         * @member {file.ISyncStatusMsg|null|undefined} sync
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.sync = 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) {
            if (!writer)
                writer = $Writer.create();
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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()).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.common.UInt64Value.encode(message.mtime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.common.UInt64Value.encode(message.ctime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.sync != null && Object.hasOwnProperty.call(message, "sync"))
                $root.file.SyncStatusMsg.encode(message.sync, writer.uint32(/* id 9, wireType 2 =*/74).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.StatsMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.writable = reader.bool();
                    break;
                case 5:
                    message.size = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.mtime = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 7:
                    message.ctime = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 8:
                    message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 9:
                    message.sync = $root.file.SyncStatusMsg.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                if (error)
                    return "isLink." + error;
            }
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.size != null && message.hasOwnProperty("size")) {
                var error = $root.common.UInt64Value.verify(message.size);
                if (error)
                    return "size." + error;
            }
            if (message.mtime != null && message.hasOwnProperty("mtime")) {
                var error = $root.common.UInt64Value.verify(message.mtime);
                if (error)
                    return "mtime." + error;
            }
            if (message.ctime != null && message.hasOwnProperty("ctime")) {
                var error = $root.common.UInt64Value.verify(message.ctime);
                if (error)
                    return "ctime." + error;
            }
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                if (error)
                    return "version." + error;
            }
            if (message.sync != null && message.hasOwnProperty("sync")) {
                var error = $root.file.SyncStatusMsg.verify(message.sync);
                if (error)
                    return "sync." + 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) {
            if (object instanceof $root.file.StatsMsg)
                return object;
            var message = new $root.file.StatsMsg();
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".file.StatsMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".file.StatsMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".file.StatsMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.size != null) {
                if (typeof object.size !== "object")
                    throw TypeError(".file.StatsMsg.size: object expected");
                message.size = $root.common.UInt64Value.fromObject(object.size);
            }
            if (object.mtime != null) {
                if (typeof object.mtime !== "object")
                    throw TypeError(".file.StatsMsg.mtime: object expected");
                message.mtime = $root.common.UInt64Value.fromObject(object.mtime);
            }
            if (object.ctime != null) {
                if (typeof object.ctime !== "object")
                    throw TypeError(".file.StatsMsg.ctime: object expected");
                message.ctime = $root.common.UInt64Value.fromObject(object.ctime);
            }
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.StatsMsg.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            if (object.sync != null) {
                if (typeof object.sync !== "object")
                    throw TypeError(".file.StatsMsg.sync: object expected");
                message.sync = $root.file.SyncStatusMsg.fromObject(object.sync);
            }
            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) {
            if (!options)
                options = {};
            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.sync = null;
            }
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            if (message.writable != null && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.size != null && message.hasOwnProperty("size"))
                object.size = $root.common.UInt64Value.toObject(message.size, options);
            if (message.mtime != null && message.hasOwnProperty("mtime"))
                object.mtime = $root.common.UInt64Value.toObject(message.mtime, options);
            if (message.ctime != null && message.hasOwnProperty("ctime"))
                object.ctime = $root.common.UInt64Value.toObject(message.ctime, options);
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            if (message.sync != null && message.hasOwnProperty("sync"))
                object.sync = $root.file.SyncStatusMsg.toObject(message.sync, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.xaName = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.GetXAttrRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.xaName = "";
            if (message.xaName != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.str = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.XAttrValue)
                return object;
            var message = new $root.file.XAttrValue();
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.XAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.XAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.XAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                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) {
            if (object instanceof $root.file.ReadBytesRequestBody)
                return object;
            var message = new $root.file.ReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.ReadBytesReplyBody)
                return object;
            var message = new $root.file.ReadBytesReplyBody();
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.ReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        return ReadBytesReplyBody;
    })();

    file.FileEventMsg = (function() {

        /**
         * Properties of a FileEventMsg.
         * @memberof file
         * @interface IFileEventMsg
         * @property {string|null} [type] FileEventMsg type
         * @property {string|null} [path] FileEventMsg path
         * @property {common.IStringValue|null} [src] FileEventMsg src
         * @property {common.IUInt64Value|null} [newVersion] FileEventMsg newVersion
         * @property {common.IUInt64Value|null} [removedArchVer] FileEventMsg removedArchVer
         * @property {common.IUInt64Value|null} [archivedVersion] FileEventMsg archivedVersion
         */

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

        /**
         * FileEventMsg type.
         * @member {string} type
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.type = "";

        /**
         * FileEventMsg path.
         * @member {string} path
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.path = "";

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

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

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

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

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

        /**
         * Encodes the specified FileEventMsg message. Does not implicitly {@link file.FileEventMsg.verify|verify} messages.
         * @function encode
         * @memberof file.FileEventMsg
         * @static
         * @param {file.IFileEventMsg} message FileEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileEventMsg.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.StringValue.encode(message.src, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.removedArchVer != null && Object.hasOwnProperty.call(message, "removedArchVer"))
                $root.common.UInt64Value.encode(message.removedArchVer, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a FileEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileEventMsg} FileEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileEventMsg.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.path = reader.string();
                    break;
                case 3:
                    message.src = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.removedArchVer = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a FileEventMsg message.
         * @function verify
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileEventMsg.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.src != null && message.hasOwnProperty("src")) {
                var error = $root.common.StringValue.verify(message.src);
                if (error)
                    return "src." + error;
            }
            if (message.newVersion != null && message.hasOwnProperty("newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion);
                if (error)
                    return "newVersion." + error;
            }
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer")) {
                var error = $root.common.UInt64Value.verify(message.removedArchVer);
                if (error)
                    return "removedArchVer." + error;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FileEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileEventMsg} FileEventMsg
         */
        FileEventMsg.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileEventMsg)
                return object;
            var message = new $root.file.FileEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null)
                message.path = String(object.path);
            if (object.src != null) {
                if (typeof object.src !== "object")
                    throw TypeError(".file.FileEventMsg.src: object expected");
                message.src = $root.common.StringValue.fromObject(object.src);
            }
            if (object.newVersion != null) {
                if (typeof object.newVersion !== "object")
                    throw TypeError(".file.FileEventMsg.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion);
            }
            if (object.removedArchVer != null) {
                if (typeof object.removedArchVer !== "object")
                    throw TypeError(".file.FileEventMsg.removedArchVer: object expected");
                message.removedArchVer = $root.common.UInt64Value.fromObject(object.removedArchVer);
            }
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.FileEventMsg.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileEventMsg
         * @static
         * @param {file.FileEventMsg} message FileEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileEventMsg.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = "";
                object.src = null;
                object.newVersion = null;
                object.removedArchVer = null;
                object.archivedVersion = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = $root.common.StringValue.toObject(message.src, options);
            if (message.newVersion != null && message.hasOwnProperty("newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options);
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer"))
                object.removedArchVer = $root.common.UInt64Value.toObject(message.removedArchVer, options);
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            return object;
        };

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

        return FileEventMsg;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.VersionedReadFlags)
                return object;
            var message = new $root.file.VersionedReadFlags();
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.archivedVersion = null;
                object.remoteVersion = null;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.RequestWithVersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.RequestWithVersionedReadFlags)
                return object;
            var message = new $root.file.RequestWithVersionedReadFlags();
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.RequestWithVersionedReadFlags.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.flags = null;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.xaName = reader.string();
                    break;
                case 2:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrRequestBody)
                return object;
            var message = new $root.file.VersionedGetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.flags = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.str = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrReplyBody)
                return object;
            var message = new $root.file.VersionedGetXAttrReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.str !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedListXAttrsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedListXAttrsReplyBody)
                return object;
            var message = new $root.file.VersionedListXAttrsReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedReadBytesRequestBody)
                return object;
            var message = new $root.file.VersionedReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedReadBytesReplyBody)
                return object;
            var message = new $root.file.VersionedReadBytesReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadTxtReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.txt = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadTxtReplyBody)
                return object;
            var message = new $root.file.VersionedReadTxtReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.txt = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadJsonReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.json = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadJsonReplyBody)
                return object;
            var message = new $root.file.VersionedReadJsonReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.json = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.src = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("src")) {
                var error = $root.common.ObjectReference.verify(message.src);
                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) {
            if (object instanceof $root.file.VersionedGetByteSourceReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSourceReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.src !== "object")
                    throw TypeError(".file.VersionedGetByteSourceReplyBody.src: object expected");
                message.src = $root.common.ObjectReference.fromObject(object.src);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.src = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("src"))
                object.src = $root.common.ObjectReference.toObject(message.src, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                $root.common.UInt64Value.encode(message.current, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ListVersionsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.current = $root.common.UInt64Value.decode(reader, reader.uint32());
                    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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.current != null && message.hasOwnProperty("current")) {
                var error = $root.common.UInt64Value.verify(message.current);
                if (error)
                    return "current." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.ListVersionsReplyBody)
                return object;
            var message = new $root.file.ListVersionsReplyBody();
            if (object.current != null) {
                if (typeof object.current !== "object")
                    throw TypeError(".file.ListVersionsReplyBody.current: object expected");
                message.current = $root.common.UInt64Value.fromObject(object.current);
            }
            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])).unsigned = 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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults)
                object.current = null;
            if (message.current != null && message.hasOwnProperty("current"))
                object.current = $root.common.UInt64Value.toObject(message.current, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.changes != null && message.hasOwnProperty("changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes);
                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) {
            if (object instanceof $root.file.UpdateXAttrsRequestBody)
                return object;
            var message = new $root.file.UpdateXAttrsRequestBody();
            if (object.changes != null) {
                if (typeof object.changes !== "object")
                    throw TypeError(".file.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.changes = null;
            if (message.changes != null && message.hasOwnProperty("changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.NameAndXAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.xaName = reader.string();
                    break;
                case 2:
                    message.str = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.NameAndXAttrValue)
                return object;
            var message = new $root.file.NameAndXAttrValue();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.NameAndXAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.NameAndXAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.NameAndXAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrsChanges();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.set && message.set.length))
                        message.set = [];
                    message.set.push($root.file.NameAndXAttrValue.decode(reader, reader.uint32()));
                    break;
                case 2:
                    if (!(message.remove && message.remove.length))
                        message.remove = [];
                    message.remove.push(reader.string());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.set != null && message.hasOwnProperty("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]);
                    if (error)
                        return "set." + error;
                }
            }
            if (message.remove != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.XAttrsChanges)
                return object;
            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 (typeof object.set[i] !== "object")
                        throw TypeError(".file.XAttrsChanges.set: object expected");
                    message.set[i] = $root.file.NameAndXAttrValue.fromObject(object.set[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.bytes = reader.bytes();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteBytesRequestBody)
                return object;
            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)
                    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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteTxtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.txt = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.txt != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteTxtRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.txt = "";
            if (message.txt != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteJsonRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.json = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.json != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteJsonRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.json = "";
            if (message.json != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                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) {
            if (object instanceof $root.file.GetByteSinkRequestBody)
                return object;
            var message = new $root.file.GetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.GetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.truncateFile = null;
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.CopyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.file = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.common.ObjectReference.verify(message.file);
                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) {
            if (object instanceof $root.file.CopyRequestBody)
                return object;
            var message = new $root.file.CopyRequestBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".file.CopyRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                if (error)
                    return "truncateFile." + error;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkRequestBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            if (object.currentVersion != null) {
                if (typeof object.currentVersion !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncateFile = null;
                object.currentVersion = null;
            }
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.sink = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("sink")) {
                var error = $root.common.ObjectReference.verify(message.sink);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.sink !== "object")
                    throw TypeError(".file.VersionedGetByteSinkReplyBody.sink: object expected");
                message.sink = $root.common.ObjectReference.fromObject(object.sink);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.sink = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("sink"))
                object.sink = $root.common.ObjectReference.toObject(message.sink, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                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) {
            if (object instanceof $root.file.ArchiveCurrentRequestBody)
                return object;
            var message = new $root.file.ArchiveCurrentRequestBody();
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.version = null;
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskRequestBody)
                return object;
            var message = new $root.file.FileSyncIsOnDiskRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.status = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.status != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskReplyBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && message.hasOwnProperty("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);
        };

        return FileSyncIsOnDiskReplyBody;
    })();

    file.FileSyncDownloadRequestBody = (function() {

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

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

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

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

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

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

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

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

        /**
         * Verifies a FileSyncDownloadRequestBody message.
         * @function verify
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncDownloadRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 FileSyncDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncDownloadRequestBody} FileSyncDownloadRequestBody
         */
        FileSyncDownloadRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileSyncDownloadRequestBody)
                return object;
            var message = new $root.file.FileSyncDownloadRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 FileSyncDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {file.FileSyncDownloadRequestBody} message FileSyncDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncDownloadRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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 FileSyncDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        return FileSyncDownloadRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts);
                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) {
            if (object instanceof $root.file.AdoptRemoteRequestBody)
                return object;
            var message = new $root.file.AdoptRemoteRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                $root.common.BooleanValue.encode(message.dropLocalVer, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToAdopteRemote();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.dropLocalVer = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer")) {
                var error = $root.common.BooleanValue.verify(message.dropLocalVer);
                if (error)
                    return "dropLocalVer." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.OptionsToAdopteRemote)
                return object;
            var message = new $root.file.OptionsToAdopteRemote();
            if (object.dropLocalVer != null) {
                if (typeof object.dropLocalVer !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.dropLocalVer: object expected");
                message.dropLocalVer = $root.common.BooleanValue.fromObject(object.dropLocalVer);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.dropLocalVer = null;
                object.remoteVersion = null;
            }
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer"))
                object.dropLocalVer = $root.common.BooleanValue.toObject(message.dropLocalVer, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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);
        };

        return OptionsToAdopteRemote;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts);
                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) {
            if (object instanceof $root.file.FileSyncUploadRequestBody)
                return object;
            var message = new $root.file.FileSyncUploadRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.FileSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.uploadedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion);
                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) {
            if (object instanceof $root.file.FileSyncUploadReplyBody)
                return object;
            var message = new $root.file.FileSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (typeof object.uploadedVersion !== "object")
                    throw TypeError(".file.FileSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options);
            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);
        };

        return FileSyncUploadReplyBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToUploadLocal();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.localVersion != null && message.hasOwnProperty("localVersion")) {
                var error = $root.common.UInt64Value.verify(message.localVersion);
                if (error)
                    return "localVersion." + error;
            }
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadVersion);
                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) {
            if (object instanceof $root.file.OptionsToUploadLocal)
                return object;
            var message = new $root.file.OptionsToUploadLocal();
            if (object.localVersion != null) {
                if (typeof object.localVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.localVersion: object expected");
                message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion);
            }
            if (object.uploadVersion != null) {
                if (typeof object.uploadVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.uploadVersion: object expected");
                message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.localVersion = null;
                object.uploadVersion = null;
            }
            if (message.localVersion != null && message.hasOwnProperty("localVersion"))
                object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options);
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion"))
                object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options);
            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);
        };

        return OptionsToUploadLocal;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FS();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                case 6:
                    message.isSynced = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FS)
                return object;
            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 (typeof object.impl !== "object")
                    throw TypeError(".fs.FS.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.writable != null && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            if (message.isSynced != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CheckPresenceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.throwIfMissing = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.throwIfMissing != null && message.hasOwnProperty("throwIfMissing")) {
                var error = $root.common.BooleanValue.verify(message.throwIfMissing);
                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) {
            if (object instanceof $root.fs.CheckPresenceRequestBody)
                return object;
            var message = new $root.fs.CheckPresenceRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.throwIfMissing != null) {
                if (typeof object.throwIfMissing !== "object")
                    throw TypeError(".fs.CheckPresenceRequestBody.throwIfMissing: object expected");
                message.throwIfMissing = $root.common.BooleanValue.fromObject(object.throwIfMissing);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.throwIfMissing = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.throwIfMissing != null && message.hasOwnProperty("throwIfMissing"))
                object.throwIfMissing = $root.common.BooleanValue.toObject(message.throwIfMissing, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathOnlyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.PathOnlyRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.path = "";
            if (message.path != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.xaName = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.GetXAttrRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.xaName != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLink();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.readonly = reader.bool();
                    break;
                case 2:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.impl = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.readonly != null && message.hasOwnProperty("readonly"))
                if (typeof message.readonly !== "boolean")
                    return "readonly: boolean expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                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) {
            if (object instanceof $root.fs.SymLink)
                return object;
            var message = new $root.fs.SymLink();
            if (object.readonly != null)
                message.readonly = Boolean(object.readonly);
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.SymLink.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.SymLink.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.impl != null) {
                if (typeof object.impl !== "object")
                    throw TypeError(".fs.SymLink.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.readonly = false;
                object.isFile = null;
                object.isFolder = null;
                object.impl = null;
            }
            if (message.readonly != null && message.hasOwnProperty("readonly"))
                object.readonly = message.readonly;
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLinkTargetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.fs = $root.fs.FS.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.file = $root.file.File.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.fs != null && message.hasOwnProperty("fs")) {
                var error = $root.fs.FS.verify(message.fs);
                if (error)
                    return "fs." + error;
            }
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.file.File.verify(message.file);
                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) {
            if (object instanceof $root.fs.SymLinkTargetReplyBody)
                return object;
            var message = new $root.fs.SymLinkTargetReplyBody();
            if (object.fs != null) {
                if (typeof object.fs !== "object")
                    throw TypeError(".fs.SymLinkTargetReplyBody.fs: object expected");
                message.fs = $root.fs.FS.fromObject(object.fs);
            }
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".fs.SymLinkTargetReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.fs = null;
                object.file = null;
            }
            if (message.fs != null && message.hasOwnProperty("fs"))
                object.fs = $root.fs.FS.toObject(message.fs, options);
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.file.File.toObject(message.file, options);
            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);
        };

        return SymLinkTargetReplyBody;
    })();

    fs.FSEventMsg = (function() {

        /**
         * Properties of a FSEventMsg.
         * @memberof fs
         * @interface IFSEventMsg
         * @property {string|null} [type] FSEventMsg type
         * @property {string|null} [path] FSEventMsg path
         * @property {common.IStringValue|null} [src] FSEventMsg src
         * @property {common.IUInt64Value|null} [newVersion] FSEventMsg newVersion
         * @property {common.IStringValue|null} [name] FSEventMsg name
         * @property {common.IStringValue|null} [oldName] FSEventMsg oldName
         * @property {common.IStringValue|null} [newName] FSEventMsg newName
         * @property {fs.IListingEntryMsg|null} [entry] FSEventMsg entry
         * @property {common.IUInt64Value|null} [moveLabel] FSEventMsg moveLabel
         * @property {common.IUInt64Value|null} [removedArchVer] FSEventMsg removedArchVer
         * @property {common.IUInt64Value|null} [archivedVersion] FSEventMsg archivedVersion
         */

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

        /**
         * FSEventMsg type.
         * @member {string} type
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.type = "";

        /**
         * FSEventMsg path.
         * @member {string} path
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.path = "";

        /**
         * FSEventMsg src.
         * @member {common.IStringValue|null|undefined} src
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.src = null;

        /**
         * FSEventMsg newVersion.
         * @member {common.IUInt64Value|null|undefined} newVersion
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.newVersion = null;

        /**
         * FSEventMsg name.
         * @member {common.IStringValue|null|undefined} name
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.name = null;

        /**
         * FSEventMsg oldName.
         * @member {common.IStringValue|null|undefined} oldName
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.oldName = null;

        /**
         * FSEventMsg newName.
         * @member {common.IStringValue|null|undefined} newName
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.newName = null;

        /**
         * FSEventMsg entry.
         * @member {fs.IListingEntryMsg|null|undefined} entry
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.entry = null;

        /**
         * FSEventMsg moveLabel.
         * @member {common.IUInt64Value|null|undefined} moveLabel
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.moveLabel = null;

        /**
         * FSEventMsg removedArchVer.
         * @member {common.IUInt64Value|null|undefined} removedArchVer
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.removedArchVer = null;

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

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

        /**
         * Encodes the specified FSEventMsg message. Does not implicitly {@link fs.FSEventMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.FSEventMsg
         * @static
         * @param {fs.IFSEventMsg} message FSEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSEventMsg.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.StringValue.encode(message.src, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                $root.common.StringValue.encode(message.name, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.oldName != null && Object.hasOwnProperty.call(message, "oldName"))
                $root.common.StringValue.encode(message.oldName, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.newName != null && Object.hasOwnProperty.call(message, "newName"))
                $root.common.StringValue.encode(message.newName, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.entry != null && Object.hasOwnProperty.call(message, "entry"))
                $root.fs.ListingEntryMsg.encode(message.entry, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.moveLabel != null && Object.hasOwnProperty.call(message, "moveLabel"))
                $root.common.UInt64Value.encode(message.moveLabel, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
            if (message.removedArchVer != null && Object.hasOwnProperty.call(message, "removedArchVer"))
                $root.common.UInt64Value.encode(message.removedArchVer, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a FSEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSEventMsg} FSEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSEventMsg.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.path = reader.string();
                    break;
                case 3:
                    message.src = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.name = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.oldName = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 7:
                    message.newName = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 8:
                    message.entry = $root.fs.ListingEntryMsg.decode(reader, reader.uint32());
                    break;
                case 9:
                    message.moveLabel = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.removedArchVer = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 11:
                    message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a FSEventMsg message.
         * @function verify
         * @memberof fs.FSEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSEventMsg.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.src != null && message.hasOwnProperty("src")) {
                var error = $root.common.StringValue.verify(message.src);
                if (error)
                    return "src." + error;
            }
            if (message.newVersion != null && message.hasOwnProperty("newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion);
                if (error)
                    return "newVersion." + error;
            }
            if (message.name != null && message.hasOwnProperty("name")) {
                var error = $root.common.StringValue.verify(message.name);
                if (error)
                    return "name." + error;
            }
            if (message.oldName != null && message.hasOwnProperty("oldName")) {
                var error = $root.common.StringValue.verify(message.oldName);
                if (error)
                    return "oldName." + error;
            }
            if (message.newName != null && message.hasOwnProperty("newName")) {
                var error = $root.common.StringValue.verify(message.newName);
                if (error)
                    return "newName." + error;
            }
            if (message.entry != null && message.hasOwnProperty("entry")) {
                var error = $root.fs.ListingEntryMsg.verify(message.entry);
                if (error)
                    return "entry." + error;
            }
            if (message.moveLabel != null && message.hasOwnProperty("moveLabel")) {
                var error = $root.common.UInt64Value.verify(message.moveLabel);
                if (error)
                    return "moveLabel." + error;
            }
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer")) {
                var error = $root.common.UInt64Value.verify(message.removedArchVer);
                if (error)
                    return "removedArchVer." + error;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FSEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSEventMsg} FSEventMsg
         */
        FSEventMsg.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSEventMsg)
                return object;
            var message = new $root.fs.FSEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null)
                message.path = String(object.path);
            if (object.src != null) {
                if (typeof object.src !== "object")
                    throw TypeError(".fs.FSEventMsg.src: object expected");
                message.src = $root.common.StringValue.fromObject(object.src);
            }
            if (object.newVersion != null) {
                if (typeof object.newVersion !== "object")
                    throw TypeError(".fs.FSEventMsg.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion);
            }
            if (object.name != null) {
                if (typeof object.name !== "object")
                    throw TypeError(".fs.FSEventMsg.name: object expected");
                message.name = $root.common.StringValue.fromObject(object.name);
            }
            if (object.oldName != null) {
                if (typeof object.oldName !== "object")
                    throw TypeError(".fs.FSEventMsg.oldName: object expected");
                message.oldName = $root.common.StringValue.fromObject(object.oldName);
            }
            if (object.newName != null) {
                if (typeof object.newName !== "object")
                    throw TypeError(".fs.FSEventMsg.newName: object expected");
                message.newName = $root.common.StringValue.fromObject(object.newName);
            }
            if (object.entry != null) {
                if (typeof object.entry !== "object")
                    throw TypeError(".fs.FSEventMsg.entry: object expected");
                message.entry = $root.fs.ListingEntryMsg.fromObject(object.entry);
            }
            if (object.moveLabel != null) {
                if (typeof object.moveLabel !== "object")
                    throw TypeError(".fs.FSEventMsg.moveLabel: object expected");
                message.moveLabel = $root.common.UInt64Value.fromObject(object.moveLabel);
            }
            if (object.removedArchVer != null) {
                if (typeof object.removedArchVer !== "object")
                    throw TypeError(".fs.FSEventMsg.removedArchVer: object expected");
                message.removedArchVer = $root.common.UInt64Value.fromObject(object.removedArchVer);
            }
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".fs.FSEventMsg.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSEventMsg
         * @static
         * @param {fs.FSEventMsg} message FSEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSEventMsg.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = "";
                object.src = null;
                object.newVersion = null;
                object.name = null;
                object.oldName = null;
                object.newName = null;
                object.entry = null;
                object.moveLabel = null;
                object.removedArchVer = null;
                object.archivedVersion = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = $root.common.StringValue.toObject(message.src, options);
            if (message.newVersion != null && message.hasOwnProperty("newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options);
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = $root.common.StringValue.toObject(message.name, options);
            if (message.oldName != null && message.hasOwnProperty("oldName"))
                object.oldName = $root.common.StringValue.toObject(message.oldName, options);
            if (message.newName != null && message.hasOwnProperty("newName"))
                object.newName = $root.common.StringValue.toObject(message.newName, options);
            if (message.entry != null && message.hasOwnProperty("entry"))
                object.entry = $root.fs.ListingEntryMsg.toObject(message.entry, options);
            if (message.moveLabel != null && message.hasOwnProperty("moveLabel"))
                object.moveLabel = $root.common.UInt64Value.toObject(message.moveLabel, options);
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer"))
                object.removedArchVer = $root.common.UInt64Value.toObject(message.removedArchVer, options);
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            return object;
        };

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

        return FSEventMsg;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WatchTreeRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.depth = $root.common.UInt32Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.depth != null && message.hasOwnProperty("depth")) {
                var error = $root.common.UInt32Value.verify(message.depth);
                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) {
            if (object instanceof $root.fs.WatchTreeRequestBody)
                return object;
            var message = new $root.fs.WatchTreeRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.depth != null) {
                if (typeof object.depth !== "object")
                    throw TypeError(".fs.WatchTreeRequestBody.depth: object expected");
                message.depth = $root.common.UInt32Value.fromObject(object.depth);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.depth = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.depth != null && message.hasOwnProperty("depth"))
                object.depth = $root.common.UInt32Value.toObject(message.depth, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.entries && message.entries.length))
                        message.entries = [];
                    message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.entries != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.ListFolderReplyBody)
                return object;
            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 (typeof object.entries[i] !== "object")
                        throw TypeError(".fs.ListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListingEntryMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.name = reader.string();
                    break;
                case 2:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                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) {
            if (object instanceof $root.fs.ListingEntryMsg)
                return object;
            var message = new $root.fs.ListingEntryMsg();
            if (object.name != null)
                message.name = String(object.name);
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
            }
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                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) {
            if (object instanceof $root.fs.ReadBytesRequestBody)
                return object;
            var message = new $root.fs.ReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".fs.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".fs.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.criteria = $root.fs.SelectRequestBody.SelectCriteria.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.criteria != null && message.hasOwnProperty("criteria")) {
                var error = $root.fs.SelectRequestBody.SelectCriteria.verify(message.criteria);
                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) {
            if (object instanceof $root.fs.SelectRequestBody)
                return object;
            var message = new $root.fs.SelectRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.criteria != null) {
                if (typeof object.criteria !== "object")
                    throw TypeError(".fs.SelectRequestBody.criteria: object expected");
                message.criteria = $root.fs.SelectRequestBody.SelectCriteria.fromObject(object.criteria);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.criteria = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.criteria != null && message.hasOwnProperty("criteria"))
                object.criteria = $root.fs.SelectRequestBody.SelectCriteria.toObject(message.criteria, options);
            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);
        };

        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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    $root.common.StringValue.encode(message.exactName, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    $root.common.StringValue.encode(message.pattern, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    $root.common.StringValue.encode(message.regexp, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody.SelectCriteria();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.exactName = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    case 2:
                        message.pattern = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    case 3:
                        message.regexp = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    case 4:
                        message.depth = $root.common.UInt32Value.decode(reader, reader.uint32());
                        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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.exactName != null && message.hasOwnProperty("exactName")) {
                    var error = $root.common.StringValue.verify(message.exactName);
                    if (error)
                        return "exactName." + error;
                }
                if (message.pattern != null && message.hasOwnProperty("pattern")) {
                    var error = $root.common.StringValue.verify(message.pattern);
                    if (error)
                        return "pattern." + error;
                }
                if (message.regexp != null && message.hasOwnProperty("regexp")) {
                    var error = $root.common.StringValue.verify(message.regexp);
                    if (error)
                        return "regexp." + error;
                }
                if (message.depth != null && message.hasOwnProperty("depth")) {
                    var error = $root.common.UInt32Value.verify(message.depth);
                    if (error)
                        return "depth." + error;
                }
                if (message.type != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
                if (object instanceof $root.fs.SelectRequestBody.SelectCriteria)
                    return object;
                var message = new $root.fs.SelectRequestBody.SelectCriteria();
                if (object.exactName != null) {
                    if (typeof object.exactName !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.exactName: object expected");
                    message.exactName = $root.common.StringValue.fromObject(object.exactName);
                }
                if (object.pattern != null) {
                    if (typeof object.pattern !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.pattern: object expected");
                    message.pattern = $root.common.StringValue.fromObject(object.pattern);
                }
                if (object.regexp != null) {
                    if (typeof object.regexp !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.regexp: object expected");
                    message.regexp = $root.common.StringValue.fromObject(object.regexp);
                }
                if (object.depth != null) {
                    if (typeof object.depth !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.depth: object expected");
                    message.depth = $root.common.UInt32Value.fromObject(object.depth);
                }
                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) {
                if (!options)
                    options = {};
                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 && message.hasOwnProperty("exactName"))
                    object.exactName = $root.common.StringValue.toObject(message.exactName, options);
                if (message.pattern != null && message.hasOwnProperty("pattern"))
                    object.pattern = $root.common.StringValue.toObject(message.pattern, options);
                if (message.regexp != null && message.hasOwnProperty("regexp"))
                    object.regexp = $root.common.StringValue.toObject(message.regexp, options);
                if (message.depth != null && message.hasOwnProperty("depth"))
                    object.depth = $root.common.UInt32Value.toObject(message.depth, options);
                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 && message.hasOwnProperty("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);
            };

            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.name = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            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) {
            if (object instanceof $root.fs.FSCGetRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.name = "";
            if (message.name != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.FSCGetReplyBody)
                return object;
            var message = new $root.fs.FSCGetReplyBody();
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.FSCGetReplyBody.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.item = null;
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                $root.common.BooleanValue.encode(message.isCollection, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.isCollection = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.item = $root.fs.FSItem.Item.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.location = $root.fs.FSItem.Location.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                if (error)
                    return "isLink." + error;
            }
            if (message.isCollection != null && message.hasOwnProperty("isCollection")) {
                var error = $root.common.BooleanValue.verify(message.isCollection);
                if (error)
                    return "isCollection." + error;
            }
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.Item.verify(message.item);
                if (error)
                    return "item." + error;
            }
            if (message.location != null && message.hasOwnProperty("location")) {
                var error = $root.fs.FSItem.Location.verify(message.location);
                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) {
            if (object instanceof $root.fs.FSItem)
                return object;
            var message = new $root.fs.FSItem();
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.FSItem.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.FSItem.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".fs.FSItem.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            if (object.isCollection != null) {
                if (typeof object.isCollection !== "object")
                    throw TypeError(".fs.FSItem.isCollection: object expected");
                message.isCollection = $root.common.BooleanValue.fromObject(object.isCollection);
            }
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.FSItem.item: object expected");
                message.item = $root.fs.FSItem.Item.fromObject(object.item);
            }
            if (object.location != null) {
                if (typeof object.location !== "object")
                    throw TypeError(".fs.FSItem.location: object expected");
                message.location = $root.fs.FSItem.Location.fromObject(object.location);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            if (message.isCollection != null && message.hasOwnProperty("isCollection"))
                object.isCollection = $root.common.BooleanValue.toObject(message.isCollection, options);
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.Item.toObject(message.item, options);
            if (message.location != null && message.hasOwnProperty("location"))
                object.location = $root.fs.FSItem.Location.toObject(message.location, options);
            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);
        };

        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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Location();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.fs = $root.fs.FS.decode(reader, reader.uint32());
                        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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.fs != null && message.hasOwnProperty("fs")) {
                    var error = $root.fs.FS.verify(message.fs);
                    if (error)
                        return "fs." + error;
                }
                if (message.path != null && message.hasOwnProperty("path"))
                    if (!$util.isString(message.path))
                        return "path: string expected";
                if (message.storageUse != null && message.hasOwnProperty("storageUse"))
                    if (!$util.isString(message.storageUse))
                        return "storageUse: string expected";
                if (message.storageType != null && message.hasOwnProperty("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) {
                if (object instanceof $root.fs.FSItem.Location)
                    return object;
                var message = new $root.fs.FSItem.Location();
                if (object.fs != null) {
                    if (typeof object.fs !== "object")
                        throw TypeError(".fs.FSItem.Location.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.path = "";
                    object.storageUse = "";
                    object.storageType = "";
                }
                if (message.fs != null && message.hasOwnProperty("fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options);
                if (message.path != null && message.hasOwnProperty("path"))
                    object.path = message.path;
                if (message.storageUse != null && message.hasOwnProperty("storageUse"))
                    object.storageUse = message.storageUse;
                if (message.storageType != null && message.hasOwnProperty("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);
            };

            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    $root.common.ObjectReference.encode(message.collection, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Item();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.fs = $root.fs.FS.decode(reader, reader.uint32());
                        break;
                    case 2:
                        message.file = $root.file.File.decode(reader, reader.uint32());
                        break;
                    case 3:
                        message.collection = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.fs != null && message.hasOwnProperty("fs")) {
                    var error = $root.fs.FS.verify(message.fs);
                    if (error)
                        return "fs." + error;
                }
                if (message.file != null && message.hasOwnProperty("file")) {
                    var error = $root.file.File.verify(message.file);
                    if (error)
                        return "file." + error;
                }
                if (message.collection != null && message.hasOwnProperty("collection")) {
                    var error = $root.common.ObjectReference.verify(message.collection);
                    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) {
                if (object instanceof $root.fs.FSItem.Item)
                    return object;
                var message = new $root.fs.FSItem.Item();
                if (object.fs != null) {
                    if (typeof object.fs !== "object")
                        throw TypeError(".fs.FSItem.Item.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs);
                }
                if (object.file != null) {
                    if (typeof object.file !== "object")
                        throw TypeError(".fs.FSItem.Item.file: object expected");
                    message.file = $root.file.File.fromObject(object.file);
                }
                if (object.collection != null) {
                    if (typeof object.collection !== "object")
                        throw TypeError(".fs.FSItem.Item.collection: object expected");
                    message.collection = $root.common.ObjectReference.fromObject(object.collection);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.file = null;
                    object.collection = null;
                }
                if (message.fs != null && message.hasOwnProperty("fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options);
                if (message.file != null && message.hasOwnProperty("file"))
                    object.file = $root.file.File.toObject(message.file, options);
                if (message.collection != null && message.hasOwnProperty("collection"))
                    object.collection = $root.common.ObjectReference.toObject(message.collection, options);
                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);
            };

            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetAllReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.items && message.items.length))
                        message.items = [];
                    message.items.push($root.fs.NameAndItem.decode(reader, reader.uint32()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.items != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.FSCGetAllReplyBody)
                return object;
            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 (typeof object.items[i] !== "object")
                        throw TypeError(".fs.FSCGetAllReplyBody.items: object expected");
                    message.items[i] = $root.fs.NameAndItem.fromObject(object.items[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.NameAndItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.name = reader.string();
                    break;
                case 2:
                    message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.NameAndItem)
                return object;
            var message = new $root.fs.NameAndItem();
            if (object.name != null)
                message.name = String(object.name);
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.NameAndItem.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.item = null;
            }
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                $root.common.BooleanValue.encode(message.done, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                $root.fs.NameAndItem.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.IterResMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.done = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.value = $root.fs.NameAndItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.done != null && message.hasOwnProperty("done")) {
                var error = $root.common.BooleanValue.verify(message.done);
                if (error)
                    return "done." + error;
            }
            if (message.value != null && message.hasOwnProperty("value")) {
                var error = $root.fs.NameAndItem.verify(message.value);
                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) {
            if (object instanceof $root.fs.IterResMsg)
                return object;
            var message = new $root.fs.IterResMsg();
            if (object.done != null) {
                if (typeof object.done !== "object")
                    throw TypeError(".fs.IterResMsg.done: object expected");
                message.done = $root.common.BooleanValue.fromObject(object.done);
            }
            if (object.value != null) {
                if (typeof object.value !== "object")
                    throw TypeError(".fs.IterResMsg.value: object expected");
                message.value = $root.fs.NameAndItem.fromObject(object.value);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.done = null;
                object.value = null;
            }
            if (message.done != null && message.hasOwnProperty("done"))
                object.done = $root.common.BooleanValue.toObject(message.done, options);
            if (message.value != null && message.hasOwnProperty("value"))
                object.value = $root.fs.NameAndItem.toObject(message.value, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CollectionEvent();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.path = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path")) {
                var error = $root.common.StringValue.verify(message.path);
                if (error)
                    return "path." + error;
            }
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.CollectionEvent)
                return object;
            var message = new $root.fs.CollectionEvent();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (typeof object.path !== "object")
                    throw TypeError(".fs.CollectionEvent.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path);
            }
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.CollectionEvent.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
                object.item = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = $root.common.StringValue.toObject(message.path, options);
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedGetXAttrRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndFlagsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.PathAndFlagsRequestBody)
                return object;
            var message = new $root.fs.PathAndFlagsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.PathAndFlagsRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.VersionedListFolderReplyBody)
                return object;
            var message = new $root.fs.VersionedListFolderReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.entries[i] !== "object")
                        throw TypeError(".fs.VersionedListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedReadBytesRequestBody)
                return object;
            var message = new $root.fs.VersionedReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.changes != null && message.hasOwnProperty("changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes);
                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) {
            if (object instanceof $root.fs.UpdateXAttrsRequestBody)
                return object;
            var message = new $root.fs.UpdateXAttrsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.changes != null) {
                if (typeof object.changes !== "object")
                    throw TypeError(".fs.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.changes = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.changes != null && message.hasOwnProperty("changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MakeFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                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) {
            if (object instanceof $root.fs.MakeFolderRequestBody)
                return object;
            var message = new $root.fs.MakeFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.MakeFolderRequestBody.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.exclusive = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DeleteFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.removeContent = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.removeContent != null && message.hasOwnProperty("removeContent")) {
                var error = $root.common.BooleanValue.verify(message.removeContent);
                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) {
            if (object instanceof $root.fs.DeleteFolderRequestBody)
                return object;
            var message = new $root.fs.DeleteFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.removeContent != null) {
                if (typeof object.removeContent !== "object")
                    throw TypeError(".fs.DeleteFolderRequestBody.removeContent: object expected");
                message.removeContent = $root.common.BooleanValue.fromObject(object.removeContent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.removeContent = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.removeContent != null && message.hasOwnProperty("removeContent"))
                object.removeContent = $root.common.BooleanValue.toObject(message.removeContent, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MoveRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.src = reader.string();
                    break;
                case 2:
                    message.dst = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.MoveRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && message.hasOwnProperty("overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite);
                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) {
            if (object instanceof $root.fs.CopyFileRequestBody)
                return object;
            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 (typeof object.overwrite !== "object")
                    throw TypeError(".fs.CopyFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.overwrite = null;
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.overwrite != null && message.hasOwnProperty("overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite);
                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) {
            if (object instanceof $root.fs.CopyFolderRequestBody)
                return object;
            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 (typeof object.mergeAndOverwrite !== "object")
                    throw TypeError(".fs.CopyFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.file = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.dst = reader.string();
                    break;
                case 3:
                    message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.common.ObjectReference.verify(message.file);
                if (error)
                    return "file." + error;
            }
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && message.hasOwnProperty("overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite);
                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) {
            if (object instanceof $root.fs.SaveFileRequestBody)
                return object;
            var message = new $root.fs.SaveFileRequestBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".fs.SaveFileRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (typeof object.overwrite !== "object")
                    throw TypeError(".fs.SaveFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.file = null;
                object.dst = "";
                object.overwrite = null;
            }
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options);
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.overwrite != null && message.hasOwnProperty("overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.common.ObjectReference.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.folder = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.dst = reader.string();
                    break;
                case 3:
                    message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.folder != null && message.hasOwnProperty("folder")) {
                var error = $root.common.ObjectReference.verify(message.folder);
                if (error)
                    return "folder." + error;
            }
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite);
                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) {
            if (object instanceof $root.fs.SaveFolderRequestBody)
                return object;
            var message = new $root.fs.SaveFolderRequestBody();
            if (object.folder != null) {
                if (typeof object.folder !== "object")
                    throw TypeError(".fs.SaveFolderRequestBody.folder: object expected");
                message.folder = $root.common.ObjectReference.fromObject(object.folder);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (typeof object.mergeAndOverwrite !== "object")
                    throw TypeError(".fs.SaveFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.folder = null;
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.folder != null && message.hasOwnProperty("folder"))
                object.folder = $root.common.ObjectReference.toObject(message.folder, options);
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.LinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.target = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.target != null && message.hasOwnProperty("target")) {
                var error = $root.common.ObjectReference.verify(message.target);
                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) {
            if (object instanceof $root.fs.LinkRequestBody)
                return object;
            var message = new $root.fs.LinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.target != null) {
                if (typeof object.target !== "object")
                    throw TypeError(".fs.LinkRequestBody.target: object expected");
                message.target = $root.common.ObjectReference.fromObject(object.target);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.target = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.target != null && message.hasOwnProperty("target"))
                object.target = $root.common.ObjectReference.toObject(message.target, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndOptFileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.flags = $root.fs.FileFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.PathAndOptFileFlags)
                return object;
            var message = new $root.fs.PathAndOptFileFlags();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.PathAndOptFileFlags.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.create = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncate != null && message.hasOwnProperty("truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && message.hasOwnProperty("create")) {
                var error = $root.common.BooleanValue.verify(message.create);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                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) {
            if (object instanceof $root.fs.FileFlags)
                return object;
            var message = new $root.fs.FileFlags();
            if (object.truncate != null) {
                if (typeof object.truncate !== "object")
                    throw TypeError(".fs.FileFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate);
            }
            if (object.create != null) {
                if (typeof object.create !== "object")
                    throw TypeError(".fs.FileFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create);
            }
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.FileFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
            }
            if (message.truncate != null && message.hasOwnProperty("truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options);
            if (message.create != null && message.hasOwnProperty("create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options);
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && message.hasOwnProperty("json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteJsonFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = message.json;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && message.hasOwnProperty("txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteTxtFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.txt != null && message.hasOwnProperty("txt"))
                object.txt = message.txt;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteBytesRequestBody)
                return object;
            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)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.bytes != null && message.hasOwnProperty("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 && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && message.hasOwnProperty("json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteJsonFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = message.json;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedFileWriteFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.create = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncate != null && message.hasOwnProperty("truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && message.hasOwnProperty("create")) {
                var error = $root.common.BooleanValue.verify(message.create);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                if (error)
                    return "exclusive." + error;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion);
                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) {
            if (object instanceof $root.fs.VersionedFileWriteFlags)
                return object;
            var message = new $root.fs.VersionedFileWriteFlags();
            if (object.truncate != null) {
                if (typeof object.truncate !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate);
            }
            if (object.create != null) {
                if (typeof object.create !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create);
            }
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            if (object.currentVersion != null) {
                if (typeof object.currentVersion !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
                object.currentVersion = null;
            }
            if (message.truncate != null && message.hasOwnProperty("truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options);
            if (message.create != null && message.hasOwnProperty("create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options);
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && message.hasOwnProperty("txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteTxtFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.txt != null && message.hasOwnProperty("txt"))
                object.txt = message.txt;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteBytesRequestBody)
                return object;
            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)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.bytes != null && message.hasOwnProperty("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 && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedGetByteSinkRequestBody)
                return object;
            var message = new $root.fs.VersionedGetByteSinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedGetByteSinkRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                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) {
            if (object instanceof $root.fs.ArchiveCurrentRequestBody)
                return object;
            var message = new $root.fs.ArchiveCurrentRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".fs.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.version = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            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);
        };

        return ArchiveCurrentRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.version = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FSSyncIsOnDiskRequestBody)
                return object;
            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)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.status = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.status != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FSSyncIsOnDiskReplyBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && message.hasOwnProperty("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);
        };

        return FSSyncIsOnDiskReplyBody;
    })();

    fs.FSSyncDownloadRequestBody = (function() {

        /**
         * Properties of a FSSyncDownloadRequestBody.
         * @memberof fs
         * @interface IFSSyncDownloadRequestBody
         * @property {string|null} [path] FSSyncDownloadRequestBody path
         * @property {number|Long|null} [version] FSSyncDownloadRequestBody version
         */

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

        /**
         * FSSyncDownloadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncDownloadRequestBody
         * @instance
         */
        FSSyncDownloadRequestBody.prototype.path = "";

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

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

        /**
         * Encodes the specified FSSyncDownloadRequestBody message. Does not implicitly {@link fs.FSSyncDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.IFSSyncDownloadRequestBody} message FSSyncDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncDownloadRequestBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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 FSSyncDownloadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.IFSSyncDownloadRequestBody} message FSSyncDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

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

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

        /**
         * Verifies a FSSyncDownloadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncDownloadRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("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 FSSyncDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncDownloadRequestBody} FSSyncDownloadRequestBody
         */
        FSSyncDownloadRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSSyncDownloadRequestBody)
                return object;
            var message = new $root.fs.FSSyncDownloadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 FSSyncDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.FSSyncDownloadRequestBody} message FSSyncDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncDownloadRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                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 FSSyncDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        return FSSyncDownloadRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts);
                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) {
            if (object instanceof $root.fs.AdoptRemoteRequestBody)
                return object;
            var message = new $root.fs.AdoptRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".fs.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options);
            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);
        };

        return AdoptRemoteRequestBody;
    })();

    fs.DiffCurrentAndRemoteRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteRequestBody path
         * @property {common.IUInt64Value|null} [remoteVersion] DiffCurrentAndRemoteRequestBody remoteVersion
         */

        /**
         * Constructs a new DiffCurrentAndRemoteRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteRequestBody.
         * @implements IDiffCurrentAndRemoteRequestBody
         * @constructor
         * @param {fs.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)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @instance
         */
        DiffCurrentAndRemoteRequestBody.prototype.path = "";

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

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

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.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).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.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 fs.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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         */
        DiffCurrentAndRemoteRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteRequestBody)
                return object;
            var message = new $root.fs.DiffCurrentAndRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".fs.DiffCurrentAndRemoteRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteVersion = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            return object;
        };

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

        return DiffCurrentAndRemoteRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.fs.FolderDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.diff = $root.fs.FolderDiff.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.diff != null && message.hasOwnProperty("diff")) {
                var error = $root.fs.FolderDiff.verify(message.diff);
                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) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteReplyBody)
                return object;
            var message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (typeof object.diff !== "object")
                    throw TypeError(".fs.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.fs.FolderDiff.fromObject(object.diff);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && message.hasOwnProperty("diff"))
                object.diff = $root.fs.FolderDiff.toObject(message.diff, options);
            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);
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    fs.FolderDiff = (function() {

        /**
         * Properties of a FolderDiff.
         * @memberof fs
         * @interface IFolderDiff
         * @property {number|Long|null} [currentVersion] FolderDiff currentVersion
         * @property {common.IUInt64Value|null} [remoteVersion] FolderDiff remoteVersion
         * @property {Array.<fs.IListingEntryMsg>|null} [inCurrent] FolderDiff inCurrent
         * @property {Array.<fs.IListingEntryMsg>|null} [inRemote] FolderDiff inRemote
         * @property {Array.<string>|null} [nameOverlaps] FolderDiff nameOverlaps
         * @property {fs.FolderDiff.ITimeStamps|null} [ctime] FolderDiff ctime
         * @property {fs.FolderDiff.ITimeStamps|null} [mtime] FolderDiff mtime
         * @property {fs.FolderDiff.IXAttrs|null} [xattrs] FolderDiff xattrs
         */

        /**
         * Constructs a new FolderDiff.
         * @memberof fs
         * @classdesc Represents a FolderDiff.
         * @implements IFolderDiff
         * @constructor
         * @param {fs.IFolderDiff=} [properties] Properties to set
         */
        function FolderDiff(properties) {
            this.inCurrent = [];
            this.inRemote = [];
            this.nameOverlaps = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

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

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

        /**
         * FolderDiff inCurrent.
         * @member {Array.<fs.IListingEntryMsg>} inCurrent
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.inCurrent = $util.emptyArray;

        /**
         * FolderDiff inRemote.
         * @member {Array.<fs.IListingEntryMsg>} inRemote
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.inRemote = $util.emptyArray;

        /**
         * FolderDiff nameOverlaps.
         * @member {Array.<string>} nameOverlaps
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.nameOverlaps = $util.emptyArray;

        /**
         * FolderDiff ctime.
         * @member {fs.FolderDiff.ITimeStamps|null|undefined} ctime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.ctime = null;

        /**
         * FolderDiff mtime.
         * @member {fs.FolderDiff.ITimeStamps|null|undefined} mtime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.mtime = null;

        /**
         * FolderDiff xattrs.
         * @member {fs.FolderDiff.IXAttrs|null|undefined} xattrs
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.xattrs = null;

        /**
         * 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) {
            if (!writer)
                writer = $Writer.create();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.inCurrent != null && message.inCurrent.length)
                for (var i = 0; i < message.inCurrent.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.inCurrent[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.inRemote != null && message.inRemote.length)
                for (var i = 0; i < message.inRemote.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.inRemote[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.nameOverlaps != null && message.nameOverlaps.length)
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    writer.uint32(/* id 5, wireType 2 =*/42).string(message.nameOverlaps[i]);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.fs.FolderDiff.TimeStamps.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.fs.FolderDiff.TimeStamps.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs"))
                $root.fs.FolderDiff.XAttrs.encode(message.xattrs, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.currentVersion = reader.uint64();
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 3:
                    if (!(message.inCurrent && message.inCurrent.length))
                        message.inCurrent = [];
                    message.inCurrent.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                    break;
                case 4:
                    if (!(message.inRemote && message.inRemote.length))
                        message.inRemote = [];
                    message.inRemote.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                    break;
                case 5:
                    if (!(message.nameOverlaps && message.nameOverlaps.length))
                        message.nameOverlaps = [];
                    message.nameOverlaps.push(reader.string());
                    break;
                case 6:
                    message.ctime = $root.fs.FolderDiff.TimeStamps.decode(reader, reader.uint32());
                    break;
                case 7:
                    message.mtime = $root.fs.FolderDiff.TimeStamps.decode(reader, reader.uint32());
                    break;
                case 8:
                    message.xattrs = $root.fs.FolderDiff.XAttrs.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.currentVersion != null && message.hasOwnProperty("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.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.inCurrent != null && message.hasOwnProperty("inCurrent")) {
                if (!Array.isArray(message.inCurrent))
                    return "inCurrent: array expected";
                for (var i = 0; i < message.inCurrent.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.inCurrent[i]);
                    if (error)
                        return "inCurrent." + error;
                }
            }
            if (message.inRemote != null && message.hasOwnProperty("inRemote")) {
                if (!Array.isArray(message.inRemote))
                    return "inRemote: array expected";
                for (var i = 0; i < message.inRemote.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.inRemote[i]);
                    if (error)
                        return "inRemote." + error;
                }
            }
            if (message.nameOverlaps != null && message.hasOwnProperty("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";
            }
            if (message.ctime != null && message.hasOwnProperty("ctime")) {
                var error = $root.fs.FolderDiff.TimeStamps.verify(message.ctime);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && message.hasOwnProperty("mtime")) {
                var error = $root.fs.FolderDiff.TimeStamps.verify(message.mtime);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && message.hasOwnProperty("xattrs")) {
                var error = $root.fs.FolderDiff.XAttrs.verify(message.xattrs);
                if (error)
                    return "xattrs." + error;
            }
            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) {
            if (object instanceof $root.fs.FolderDiff)
                return object;
            var message = new $root.fs.FolderDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    (message.currentVersion = $util.Long.fromValue(object.currentVersion)).unsigned = 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.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".fs.FolderDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            if (object.inCurrent) {
                if (!Array.isArray(object.inCurrent))
                    throw TypeError(".fs.FolderDiff.inCurrent: array expected");
                message.inCurrent = [];
                for (var i = 0; i < object.inCurrent.length; ++i) {
                    if (typeof object.inCurrent[i] !== "object")
                        throw TypeError(".fs.FolderDiff.inCurrent: object expected");
                    message.inCurrent[i] = $root.fs.ListingEntryMsg.fromObject(object.inCurrent[i]);
                }
            }
            if (object.inRemote) {
                if (!Array.isArray(object.inRemote))
                    throw TypeError(".fs.FolderDiff.inRemote: array expected");
                message.inRemote = [];
                for (var i = 0; i < object.inRemote.length; ++i) {
                    if (typeof object.inRemote[i] !== "object")
                        throw TypeError(".fs.FolderDiff.inRemote: object expected");
                    message.inRemote[i] = $root.fs.ListingEntryMsg.fromObject(object.inRemote[i]);
                }
            }
            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]);
            }
            if (object.ctime != null) {
                if (typeof object.ctime !== "object")
                    throw TypeError(".fs.FolderDiff.ctime: object expected");
                message.ctime = $root.fs.FolderDiff.TimeStamps.fromObject(object.ctime);
            }
            if (object.mtime != null) {
                if (typeof object.mtime !== "object")
                    throw TypeError(".fs.FolderDiff.mtime: object expected");
                message.mtime = $root.fs.FolderDiff.TimeStamps.fromObject(object.mtime);
            }
            if (object.xattrs != null) {
                if (typeof object.xattrs !== "object")
                    throw TypeError(".fs.FolderDiff.xattrs: object expected");
                message.xattrs = $root.fs.FolderDiff.XAttrs.fromObject(object.xattrs);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults) {
                object.inCurrent = [];
                object.inRemote = [];
                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() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : 0;
                object.remoteVersion = null;
                object.ctime = null;
                object.mtime = null;
                object.xattrs = null;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                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.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            if (message.inCurrent && message.inCurrent.length) {
                object.inCurrent = [];
                for (var j = 0; j < message.inCurrent.length; ++j)
                    object.inCurrent[j] = $root.fs.ListingEntryMsg.toObject(message.inCurrent[j], options);
            }
            if (message.inRemote && message.inRemote.length) {
                object.inRemote = [];
                for (var j = 0; j < message.inRemote.length; ++j)
                    object.inRemote[j] = $root.fs.ListingEntryMsg.toObject(message.inRemote[j], options);
            }
            if (message.nameOverlaps && message.nameOverlaps.length) {
                object.nameOverlaps = [];
                for (var j = 0; j < message.nameOverlaps.length; ++j)
                    object.nameOverlaps[j] = message.nameOverlaps[j];
            }
            if (message.ctime != null && message.hasOwnProperty("ctime"))
                object.ctime = $root.fs.FolderDiff.TimeStamps.toObject(message.ctime, options);
            if (message.mtime != null && message.hasOwnProperty("mtime"))
                object.mtime = $root.fs.FolderDiff.TimeStamps.toObject(message.mtime, options);
            if (message.xattrs != null && message.hasOwnProperty("xattrs"))
                object.xattrs = $root.fs.FolderDiff.XAttrs.toObject(message.xattrs, options);
            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);
        };

        FolderDiff.TimeStamps = (function() {

            /**
             * Properties of a TimeStamps.
             * @memberof fs.FolderDiff
             * @interface ITimeStamps
             * @property {number|Long|null} [current] TimeStamps current
             * @property {common.IUInt64Value|null} [remote] TimeStamps remote
             */

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

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

            /**
             * TimeStamps remote.
             * @member {common.IUInt64Value|null|undefined} remote
             * @memberof fs.FolderDiff.TimeStamps
             * @instance
             */
            TimeStamps.prototype.remote = null;

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

            /**
             * Encodes the specified TimeStamps message. Does not implicitly {@link fs.FolderDiff.TimeStamps.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.ITimeStamps} message TimeStamps message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TimeStamps.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                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"))
                    $root.common.UInt64Value.encode(message.remote, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                return writer;
            };

            /**
             * Encodes the specified TimeStamps message, length delimited. Does not implicitly {@link fs.FolderDiff.TimeStamps.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.ITimeStamps} message TimeStamps message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TimeStamps.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

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

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

            /**
             * Verifies a TimeStamps message.
             * @function verify
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            TimeStamps.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.current != null && message.hasOwnProperty("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 && message.hasOwnProperty("remote")) {
                    var error = $root.common.UInt64Value.verify(message.remote);
                    if (error)
                        return "remote." + error;
                }
                return null;
            };

            /**
             * Creates a TimeStamps message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.TimeStamps} TimeStamps
             */
            TimeStamps.fromObject = function fromObject(object) {
                if (object instanceof $root.fs.FolderDiff.TimeStamps)
                    return object;
                var message = new $root.fs.FolderDiff.TimeStamps();
                if (object.current != null)
                    if ($util.Long)
                        (message.current = $util.Long.fromValue(object.current)).unsigned = 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 (typeof object.remote !== "object")
                        throw TypeError(".fs.FolderDiff.TimeStamps.remote: object expected");
                    message.remote = $root.common.UInt64Value.fromObject(object.remote);
                }
                return message;
            };

            /**
             * Creates a plain object from a TimeStamps message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.TimeStamps} message TimeStamps
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            TimeStamps.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                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() : long;
                    } else
                        object.current = options.longs === String ? "0" : 0;
                    object.remote = null;
                }
                if (message.current != null && message.hasOwnProperty("current"))
                    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 && message.hasOwnProperty("remote"))
                    object.remote = $root.common.UInt64Value.toObject(message.remote, options);
                return object;
            };

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

            return TimeStamps;
        })();

        FolderDiff.XAttrs = (function() {

            /**
             * Properties of a XAttrs.
             * @memberof fs.FolderDiff
             * @interface IXAttrs
             * @property {Array.<file.INameAndXAttrValue>|null} [inCurrent] XAttrs inCurrent
             * @property {Array.<file.INameAndXAttrValue>|null} [inRemote] XAttrs inRemote
             * @property {Array.<string>|null} [nameOverlaps] XAttrs nameOverlaps
             */

            /**
             * Constructs a new XAttrs.
             * @memberof fs.FolderDiff
             * @classdesc Represents a XAttrs.
             * @implements IXAttrs
             * @constructor
             * @param {fs.FolderDiff.IXAttrs=} [properties] Properties to set
             */
            function XAttrs(properties) {
                this.inCurrent = [];
                this.inRemote = [];
                this.nameOverlaps = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * XAttrs inCurrent.
             * @member {Array.<file.INameAndXAttrValue>} inCurrent
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.inCurrent = $util.emptyArray;

            /**
             * XAttrs inRemote.
             * @member {Array.<file.INameAndXAttrValue>} inRemote
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.inRemote = $util.emptyArray;

            /**
             * XAttrs nameOverlaps.
             * @member {Array.<string>} nameOverlaps
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.nameOverlaps = $util.emptyArray;

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

            /**
             * Encodes the specified XAttrs message. Does not implicitly {@link fs.FolderDiff.XAttrs.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.IXAttrs} message XAttrs message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            XAttrs.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.inCurrent != null && message.inCurrent.length)
                    for (var i = 0; i < message.inCurrent.length; ++i)
                        $root.file.NameAndXAttrValue.encode(message.inCurrent[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.inRemote != null && message.inRemote.length)
                    for (var i = 0; i < message.inRemote.length; ++i)
                        $root.file.NameAndXAttrValue.encode(message.inRemote[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.nameOverlaps != null && message.nameOverlaps.length)
                    for (var i = 0; i < message.nameOverlaps.length; ++i)
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.nameOverlaps[i]);
                return writer;
            };

            /**
             * Encodes the specified XAttrs message, length delimited. Does not implicitly {@link fs.FolderDiff.XAttrs.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.IXAttrs} message XAttrs message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            XAttrs.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

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

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

            /**
             * Verifies a XAttrs message.
             * @function verify
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            XAttrs.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.inCurrent != null && message.hasOwnProperty("inCurrent")) {
                    if (!Array.isArray(message.inCurrent))
                        return "inCurrent: array expected";
                    for (var i = 0; i < message.inCurrent.length; ++i) {
                        var error = $root.file.NameAndXAttrValue.verify(message.inCurrent[i]);
                        if (error)
                            return "inCurrent." + error;
                    }
                }
                if (message.inRemote != null && message.hasOwnProperty("inRemote")) {
                    if (!Array.isArray(message.inRemote))
                        return "inRemote: array expected";
                    for (var i = 0; i < message.inRemote.length; ++i) {
                        var error = $root.file.NameAndXAttrValue.verify(message.inRemote[i]);
                        if (error)
                            return "inRemote." + error;
                    }
                }
                if (message.nameOverlaps != null && message.hasOwnProperty("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 XAttrs message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.XAttrs} XAttrs
             */
            XAttrs.fromObject = function fromObject(object) {
                if (object instanceof $root.fs.FolderDiff.XAttrs)
                    return object;
                var message = new $root.fs.FolderDiff.XAttrs();
                if (object.inCurrent) {
                    if (!Array.isArray(object.inCurrent))
                        throw TypeError(".fs.FolderDiff.XAttrs.inCurrent: array expected");
                    message.inCurrent = [];
                    for (var i = 0; i < object.inCurrent.length; ++i) {
                        if (typeof object.inCurrent[i] !== "object")
                            throw TypeError(".fs.FolderDiff.XAttrs.inCurrent: object expected");
                        message.inCurrent[i] = $root.file.NameAndXAttrValue.fromObject(object.inCurrent[i]);
                    }
                }
                if (object.inRemote) {
                    if (!Array.isArray(object.inRemote))
                        throw TypeError(".fs.FolderDiff.XAttrs.inRemote: array expected");
                    message.inRemote = [];
                    for (var i = 0; i < object.inRemote.length; ++i) {
                        if (typeof object.inRemote[i] !== "object")
                            throw TypeError(".fs.FolderDiff.XAttrs.inRemote: object expected");
                        message.inRemote[i] = $root.file.NameAndXAttrValue.fromObject(object.inRemote[i]);
                    }
                }
                if (object.nameOverlaps) {
                    if (!Array.isArray(object.nameOverlaps))
                        throw TypeError(".fs.FolderDiff.XAttrs.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 XAttrs message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.XAttrs} message XAttrs
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            XAttrs.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.arrays || options.defaults) {
                    object.inCurrent = [];
                    object.inRemote = [];
                    object.nameOverlaps = [];
                }
                if (message.inCurrent && message.inCurrent.length) {
                    object.inCurrent = [];
                    for (var j = 0; j < message.inCurrent.length; ++j)
                        object.inCurrent[j] = $root.file.NameAndXAttrValue.toObject(message.inCurrent[j], options);
                }
                if (message.inRemote && message.inRemote.length) {
                    object.inRemote = [];
                    for (var j = 0; j < message.inRemote.length; ++j)
                        object.inRemote[j] = $root.file.NameAndXAttrValue.toObject(message.inRemote[j], options);
                }
                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 XAttrs to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            XAttrs.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            return XAttrs;
        })();

        return FolderDiff;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts);
                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) {
            if (object instanceof $root.fs.FSSyncUploadRequestBody)
                return object;
            var message = new $root.fs.FSSyncUploadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".fs.FSSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options);
            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);
        };

        return FSSyncUploadRequestBody;
    })();

    fs.FSSyncUploadReplyBody = (function() {

        /**
         * Properties of a FSSyncUploadReplyBody.
         * @memberof fs
         * @interface IFSSyncUploadReplyBody
         * @property {common.IUInt64Value|null} [uploadedVersion] FSSyncUploadReplyBody uploadedVersion
         */

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

        /**
         * FSSyncUploadReplyBody uploadedVersion.
         * @member {common.IUInt64Value|null|undefined} uploadedVersion
         * @memberof fs.FSSyncUploadReplyBody
         * @instance
         */
        FSSyncUploadReplyBody.prototype.uploadedVersion = null;

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

        /**
         * Encodes the specified FSSyncUploadReplyBody message. Does not implicitly {@link fs.FSSyncUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {fs.IFSSyncUploadReplyBody} message FSSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadReplyBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

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

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

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

        /**
         * Verifies a FSSyncUploadReplyBody message.
         * @function verify
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncUploadReplyBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion);
                if (error)
                    return "uploadedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FSSyncUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncUploadReplyBody} FSSyncUploadReplyBody
         */
        FSSyncUploadReplyBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSSyncUploadReplyBody)
                return object;
            var message = new $root.fs.FSSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (typeof object.uploadedVersion !== "object")
                    throw TypeError(".fs.FSSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSSyncUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {fs.FSSyncUploadReplyBody} message FSSyncUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncUploadReplyBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options);
            return object;
        };

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

        return FSSyncUploadReplyBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.itemName != null && message.hasOwnProperty("itemName"))
                if (!$util.isString(message.itemName))
                    return "itemName: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.fs.AdoptRemoteFolderItemRequestBody.Options.verify(message.opts);
                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) {
            if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody)
                return object;
            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 (typeof object.opts !== "object")
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.opts: object expected");
                message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.itemName = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.itemName != null && message.hasOwnProperty("itemName"))
                object.itemName = message.itemName;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.toObject(message.opts, options);
            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);
        };

        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
             */

            /**
             * 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)
                            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;

            /**
             * 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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    case 2:
                        message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.localVersion != null && message.hasOwnProperty("localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion")) {
                    var error = $root.common.UInt64Value.verify(message.uploadVersion);
                    if (error)
                        return "uploadVersion." + 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) {
                if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody.Options)
                    return object;
                var message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                if (object.localVersion != null) {
                    if (typeof object.localVersion !== "object")
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion);
                }
                if (object.uploadVersion != null) {
                    if (typeof object.uploadVersion !== "object")
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.uploadVersion: object expected");
                    message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.uploadVersion = null;
                }
                if (message.localVersion != null && message.hasOwnProperty("localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options);
                if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion"))
                    object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options);
                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);
            };

            return Options;
        })();

        return AdoptRemoteFolderItemRequestBody;
    })();

    return fs;
})();

module.exports = $root;

},{"protobufjs/minimal":255}],12:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                $root.common.StringValue.encode(message.appDomain, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.shell_fs_resource.GetFSResourceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.appDomain = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.resourceName = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.appDomain != null && message.hasOwnProperty("appDomain")) {
                var error = $root.common.StringValue.verify(message.appDomain);
                if (error)
                    return "appDomain." + error;
            }
            if (message.resourceName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.shell_fs_resource.GetFSResourceRequestBody)
                return object;
            var message = new $root.shell_fs_resource.GetFSResourceRequestBody();
            if (object.appDomain != null) {
                if (typeof object.appDomain !== "object")
                    throw TypeError(".shell_fs_resource.GetFSResourceRequestBody.appDomain: object expected");
                message.appDomain = $root.common.StringValue.fromObject(object.appDomain);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.appDomain = null;
                object.resourceName = "";
            }
            if (message.appDomain != null && message.hasOwnProperty("appDomain"))
                object.appDomain = $root.common.StringValue.toObject(message.appDomain, options);
            if (message.resourceName != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.fs.FS.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.shell_fs_resource.GetFSResourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.folder = $root.fs.FS.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.file = $root.file.File.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.folder != null && message.hasOwnProperty("folder")) {
                var error = $root.fs.FS.verify(message.folder);
                if (error)
                    return "folder." + error;
            }
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.file.File.verify(message.file);
                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) {
            if (object instanceof $root.shell_fs_resource.GetFSResourceReplyBody)
                return object;
            var message = new $root.shell_fs_resource.GetFSResourceReplyBody();
            if (object.folder != null) {
                if (typeof object.folder !== "object")
                    throw TypeError(".shell_fs_resource.GetFSResourceReplyBody.folder: object expected");
                message.folder = $root.fs.FS.fromObject(object.folder);
            }
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".shell_fs_resource.GetFSResourceReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.folder = null;
                object.file = null;
            }
            if (message.folder != null && message.hasOwnProperty("folder"))
                object.folder = $root.fs.FS.toObject(message.folder, options);
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.file.File.toObject(message.file, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.values && message.values.length))
                        message.values = [];
                    message.values.push(reader.string());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint32();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bytes();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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)
                    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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.runtimeExcJson = reader.string();
                    break;
                case 2:
                    message.err = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.File();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                case 6:
                    message.isSynced = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                if (typeof message.isNew !== "boolean")
                    return "isNew: boolean expected";
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.File)
                return object;
            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 (typeof object.impl !== "object")
                    throw TypeError(".file.File.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                object.isNew = message.isNew;
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            if (message.isSynced != null && message.hasOwnProperty("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);
        };

        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
         */

        /**
         * 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)
                        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;

        /**
         * 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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                $root.file.SyncVersionsBranchMsg.encode(message.synced, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                $root.file.SyncVersionsBranchMsg.encode(message.remote, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                $root.common.BooleanValue.encode(message.existsInSyncedParent, writer.uint32(/* id 5, wireType 2 =*/42).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncStatusMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.state = reader.string();
                    break;
                case 2:
                    message.local = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.synced = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.remote = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.existsInSyncedParent = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.state != null && message.hasOwnProperty("state"))
                if (!$util.isString(message.state))
                    return "state: string expected";
            if (message.local != null && message.hasOwnProperty("local")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.local);
                if (error)
                    return "local." + error;
            }
            if (message.synced != null && message.hasOwnProperty("synced")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.synced);
                if (error)
                    return "synced." + error;
            }
            if (message.remote != null && message.hasOwnProperty("remote")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.remote);
                if (error)
                    return "remote." + error;
            }
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent")) {
                var error = $root.common.BooleanValue.verify(message.existsInSyncedParent);
                if (error)
                    return "existsInSyncedParent." + 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) {
            if (object instanceof $root.file.SyncStatusMsg)
                return object;
            var message = new $root.file.SyncStatusMsg();
            if (object.state != null)
                message.state = String(object.state);
            if (object.local != null) {
                if (typeof object.local !== "object")
                    throw TypeError(".file.SyncStatusMsg.local: object expected");
                message.local = $root.file.SyncVersionsBranchMsg.fromObject(object.local);
            }
            if (object.synced != null) {
                if (typeof object.synced !== "object")
                    throw TypeError(".file.SyncStatusMsg.synced: object expected");
                message.synced = $root.file.SyncVersionsBranchMsg.fromObject(object.synced);
            }
            if (object.remote != null) {
                if (typeof object.remote !== "object")
                    throw TypeError(".file.SyncStatusMsg.remote: object expected");
                message.remote = $root.file.SyncVersionsBranchMsg.fromObject(object.remote);
            }
            if (object.existsInSyncedParent != null) {
                if (typeof object.existsInSyncedParent !== "object")
                    throw TypeError(".file.SyncStatusMsg.existsInSyncedParent: object expected");
                message.existsInSyncedParent = $root.common.BooleanValue.fromObject(object.existsInSyncedParent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.state = "";
                object.local = null;
                object.synced = null;
                object.remote = null;
                object.existsInSyncedParent = null;
            }
            if (message.state != null && message.hasOwnProperty("state"))
                object.state = message.state;
            if (message.local != null && message.hasOwnProperty("local"))
                object.local = $root.file.SyncVersionsBranchMsg.toObject(message.local, options);
            if (message.synced != null && message.hasOwnProperty("synced"))
                object.synced = $root.file.SyncVersionsBranchMsg.toObject(message.synced, options);
            if (message.remote != null && message.hasOwnProperty("remote"))
                object.remote = $root.file.SyncVersionsBranchMsg.toObject(message.remote, options);
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent"))
                object.existsInSyncedParent = $root.common.BooleanValue.toObject(message.existsInSyncedParent, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                $root.common.UInt64Value.encode(message.latest, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncVersionsBranchMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.latest = $root.common.UInt64Value.decode(reader, reader.uint32());
                    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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.latest != null && message.hasOwnProperty("latest")) {
                var error = $root.common.UInt64Value.verify(message.latest);
                if (error)
                    return "latest." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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 && message.hasOwnProperty("isArchived")) {
                var error = $root.common.BooleanValue.verify(message.isArchived);
                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) {
            if (object instanceof $root.file.SyncVersionsBranchMsg)
                return object;
            var message = new $root.file.SyncVersionsBranchMsg();
            if (object.latest != null) {
                if (typeof object.latest !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.latest: object expected");
                message.latest = $root.common.UInt64Value.fromObject(object.latest);
            }
            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])).unsigned = 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 (typeof object.isArchived !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.isArchived: object expected");
                message.isArchived = $root.common.BooleanValue.fromObject(object.isArchived);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults) {
                object.latest = null;
                object.isArchived = null;
            }
            if (message.latest != null && message.hasOwnProperty("latest"))
                object.latest = $root.common.UInt64Value.toObject(message.latest, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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 && message.hasOwnProperty("isArchived"))
                object.isArchived = $root.common.BooleanValue.toObject(message.isArchived, options);
            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);
        };

        return SyncVersionsBranchMsg;
    })();

    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 {file.ISyncStatusMsg|null} [sync] StatsMsg sync
         */

        /**
         * 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)
                        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 sync.
         * @member {file.ISyncStatusMsg|null|undefined} sync
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.sync = 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) {
            if (!writer)
                writer = $Writer.create();
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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()).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.common.UInt64Value.encode(message.mtime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.common.UInt64Value.encode(message.ctime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.sync != null && Object.hasOwnProperty.call(message, "sync"))
                $root.file.SyncStatusMsg.encode(message.sync, writer.uint32(/* id 9, wireType 2 =*/74).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.StatsMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.writable = reader.bool();
                    break;
                case 5:
                    message.size = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.mtime = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 7:
                    message.ctime = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 8:
                    message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 9:
                    message.sync = $root.file.SyncStatusMsg.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                if (error)
                    return "isLink." + error;
            }
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.size != null && message.hasOwnProperty("size")) {
                var error = $root.common.UInt64Value.verify(message.size);
                if (error)
                    return "size." + error;
            }
            if (message.mtime != null && message.hasOwnProperty("mtime")) {
                var error = $root.common.UInt64Value.verify(message.mtime);
                if (error)
                    return "mtime." + error;
            }
            if (message.ctime != null && message.hasOwnProperty("ctime")) {
                var error = $root.common.UInt64Value.verify(message.ctime);
                if (error)
                    return "ctime." + error;
            }
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                if (error)
                    return "version." + error;
            }
            if (message.sync != null && message.hasOwnProperty("sync")) {
                var error = $root.file.SyncStatusMsg.verify(message.sync);
                if (error)
                    return "sync." + 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) {
            if (object instanceof $root.file.StatsMsg)
                return object;
            var message = new $root.file.StatsMsg();
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".file.StatsMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".file.StatsMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".file.StatsMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.size != null) {
                if (typeof object.size !== "object")
                    throw TypeError(".file.StatsMsg.size: object expected");
                message.size = $root.common.UInt64Value.fromObject(object.size);
            }
            if (object.mtime != null) {
                if (typeof object.mtime !== "object")
                    throw TypeError(".file.StatsMsg.mtime: object expected");
                message.mtime = $root.common.UInt64Value.fromObject(object.mtime);
            }
            if (object.ctime != null) {
                if (typeof object.ctime !== "object")
                    throw TypeError(".file.StatsMsg.ctime: object expected");
                message.ctime = $root.common.UInt64Value.fromObject(object.ctime);
            }
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.StatsMsg.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            if (object.sync != null) {
                if (typeof object.sync !== "object")
                    throw TypeError(".file.StatsMsg.sync: object expected");
                message.sync = $root.file.SyncStatusMsg.fromObject(object.sync);
            }
            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) {
            if (!options)
                options = {};
            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.sync = null;
            }
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            if (message.writable != null && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.size != null && message.hasOwnProperty("size"))
                object.size = $root.common.UInt64Value.toObject(message.size, options);
            if (message.mtime != null && message.hasOwnProperty("mtime"))
                object.mtime = $root.common.UInt64Value.toObject(message.mtime, options);
            if (message.ctime != null && message.hasOwnProperty("ctime"))
                object.ctime = $root.common.UInt64Value.toObject(message.ctime, options);
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            if (message.sync != null && message.hasOwnProperty("sync"))
                object.sync = $root.file.SyncStatusMsg.toObject(message.sync, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.xaName = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.GetXAttrRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.xaName = "";
            if (message.xaName != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.str = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.XAttrValue)
                return object;
            var message = new $root.file.XAttrValue();
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.XAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.XAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.XAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                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) {
            if (object instanceof $root.file.ReadBytesRequestBody)
                return object;
            var message = new $root.file.ReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.ReadBytesReplyBody)
                return object;
            var message = new $root.file.ReadBytesReplyBody();
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.ReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        return ReadBytesReplyBody;
    })();

    file.FileEventMsg = (function() {

        /**
         * Properties of a FileEventMsg.
         * @memberof file
         * @interface IFileEventMsg
         * @property {string|null} [type] FileEventMsg type
         * @property {string|null} [path] FileEventMsg path
         * @property {common.IStringValue|null} [src] FileEventMsg src
         * @property {common.IUInt64Value|null} [newVersion] FileEventMsg newVersion
         * @property {common.IUInt64Value|null} [removedArchVer] FileEventMsg removedArchVer
         * @property {common.IUInt64Value|null} [archivedVersion] FileEventMsg archivedVersion
         */

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

        /**
         * FileEventMsg type.
         * @member {string} type
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.type = "";

        /**
         * FileEventMsg path.
         * @member {string} path
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.path = "";

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

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

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

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

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

        /**
         * Encodes the specified FileEventMsg message. Does not implicitly {@link file.FileEventMsg.verify|verify} messages.
         * @function encode
         * @memberof file.FileEventMsg
         * @static
         * @param {file.IFileEventMsg} message FileEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileEventMsg.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.StringValue.encode(message.src, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.removedArchVer != null && Object.hasOwnProperty.call(message, "removedArchVer"))
                $root.common.UInt64Value.encode(message.removedArchVer, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a FileEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileEventMsg} FileEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileEventMsg.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.path = reader.string();
                    break;
                case 3:
                    message.src = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.removedArchVer = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a FileEventMsg message.
         * @function verify
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileEventMsg.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.src != null && message.hasOwnProperty("src")) {
                var error = $root.common.StringValue.verify(message.src);
                if (error)
                    return "src." + error;
            }
            if (message.newVersion != null && message.hasOwnProperty("newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion);
                if (error)
                    return "newVersion." + error;
            }
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer")) {
                var error = $root.common.UInt64Value.verify(message.removedArchVer);
                if (error)
                    return "removedArchVer." + error;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FileEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileEventMsg} FileEventMsg
         */
        FileEventMsg.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileEventMsg)
                return object;
            var message = new $root.file.FileEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null)
                message.path = String(object.path);
            if (object.src != null) {
                if (typeof object.src !== "object")
                    throw TypeError(".file.FileEventMsg.src: object expected");
                message.src = $root.common.StringValue.fromObject(object.src);
            }
            if (object.newVersion != null) {
                if (typeof object.newVersion !== "object")
                    throw TypeError(".file.FileEventMsg.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion);
            }
            if (object.removedArchVer != null) {
                if (typeof object.removedArchVer !== "object")
                    throw TypeError(".file.FileEventMsg.removedArchVer: object expected");
                message.removedArchVer = $root.common.UInt64Value.fromObject(object.removedArchVer);
            }
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.FileEventMsg.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileEventMsg
         * @static
         * @param {file.FileEventMsg} message FileEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileEventMsg.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = "";
                object.src = null;
                object.newVersion = null;
                object.removedArchVer = null;
                object.archivedVersion = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = $root.common.StringValue.toObject(message.src, options);
            if (message.newVersion != null && message.hasOwnProperty("newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options);
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer"))
                object.removedArchVer = $root.common.UInt64Value.toObject(message.removedArchVer, options);
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            return object;
        };

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

        return FileEventMsg;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.VersionedReadFlags)
                return object;
            var message = new $root.file.VersionedReadFlags();
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.archivedVersion = null;
                object.remoteVersion = null;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.RequestWithVersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.RequestWithVersionedReadFlags)
                return object;
            var message = new $root.file.RequestWithVersionedReadFlags();
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.RequestWithVersionedReadFlags.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.flags = null;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.xaName = reader.string();
                    break;
                case 2:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrRequestBody)
                return object;
            var message = new $root.file.VersionedGetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.flags = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.str = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrReplyBody)
                return object;
            var message = new $root.file.VersionedGetXAttrReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.str !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedListXAttrsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedListXAttrsReplyBody)
                return object;
            var message = new $root.file.VersionedListXAttrsReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedReadBytesRequestBody)
                return object;
            var message = new $root.file.VersionedReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedReadBytesReplyBody)
                return object;
            var message = new $root.file.VersionedReadBytesReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadTxtReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.txt = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadTxtReplyBody)
                return object;
            var message = new $root.file.VersionedReadTxtReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.txt = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadJsonReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.json = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadJsonReplyBody)
                return object;
            var message = new $root.file.VersionedReadJsonReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.json = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.src = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("src")) {
                var error = $root.common.ObjectReference.verify(message.src);
                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) {
            if (object instanceof $root.file.VersionedGetByteSourceReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSourceReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.src !== "object")
                    throw TypeError(".file.VersionedGetByteSourceReplyBody.src: object expected");
                message.src = $root.common.ObjectReference.fromObject(object.src);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.src = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("src"))
                object.src = $root.common.ObjectReference.toObject(message.src, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                $root.common.UInt64Value.encode(message.current, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ListVersionsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.current = $root.common.UInt64Value.decode(reader, reader.uint32());
                    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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.current != null && message.hasOwnProperty("current")) {
                var error = $root.common.UInt64Value.verify(message.current);
                if (error)
                    return "current." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.ListVersionsReplyBody)
                return object;
            var message = new $root.file.ListVersionsReplyBody();
            if (object.current != null) {
                if (typeof object.current !== "object")
                    throw TypeError(".file.ListVersionsReplyBody.current: object expected");
                message.current = $root.common.UInt64Value.fromObject(object.current);
            }
            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])).unsigned = 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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults)
                object.current = null;
            if (message.current != null && message.hasOwnProperty("current"))
                object.current = $root.common.UInt64Value.toObject(message.current, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.changes != null && message.hasOwnProperty("changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes);
                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) {
            if (object instanceof $root.file.UpdateXAttrsRequestBody)
                return object;
            var message = new $root.file.UpdateXAttrsRequestBody();
            if (object.changes != null) {
                if (typeof object.changes !== "object")
                    throw TypeError(".file.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.changes = null;
            if (message.changes != null && message.hasOwnProperty("changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.NameAndXAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.xaName = reader.string();
                    break;
                case 2:
                    message.str = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.NameAndXAttrValue)
                return object;
            var message = new $root.file.NameAndXAttrValue();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.NameAndXAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.NameAndXAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.NameAndXAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrsChanges();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.set && message.set.length))
                        message.set = [];
                    message.set.push($root.file.NameAndXAttrValue.decode(reader, reader.uint32()));
                    break;
                case 2:
                    if (!(message.remove && message.remove.length))
                        message.remove = [];
                    message.remove.push(reader.string());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.set != null && message.hasOwnProperty("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]);
                    if (error)
                        return "set." + error;
                }
            }
            if (message.remove != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.XAttrsChanges)
                return object;
            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 (typeof object.set[i] !== "object")
                        throw TypeError(".file.XAttrsChanges.set: object expected");
                    message.set[i] = $root.file.NameAndXAttrValue.fromObject(object.set[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.bytes = reader.bytes();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteBytesRequestBody)
                return object;
            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)
                    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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteTxtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.txt = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.txt != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteTxtRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.txt = "";
            if (message.txt != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteJsonRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.json = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.json != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteJsonRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.json = "";
            if (message.json != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                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) {
            if (object instanceof $root.file.GetByteSinkRequestBody)
                return object;
            var message = new $root.file.GetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.GetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.truncateFile = null;
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.CopyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.file = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.common.ObjectReference.verify(message.file);
                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) {
            if (object instanceof $root.file.CopyRequestBody)
                return object;
            var message = new $root.file.CopyRequestBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".file.CopyRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                if (error)
                    return "truncateFile." + error;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkRequestBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            if (object.currentVersion != null) {
                if (typeof object.currentVersion !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncateFile = null;
                object.currentVersion = null;
            }
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                case 2:
                    message.sink = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("sink")) {
                var error = $root.common.ObjectReference.verify(message.sink);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.sink !== "object")
                    throw TypeError(".file.VersionedGetByteSinkReplyBody.sink: object expected");
                message.sink = $root.common.ObjectReference.fromObject(object.sink);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.sink = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("sink"))
                object.sink = $root.common.ObjectReference.toObject(message.sink, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                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) {
            if (object instanceof $root.file.ArchiveCurrentRequestBody)
                return object;
            var message = new $root.file.ArchiveCurrentRequestBody();
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.version = null;
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.version = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskRequestBody)
                return object;
            var message = new $root.file.FileSyncIsOnDiskRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.status = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.status != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskReplyBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && message.hasOwnProperty("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);
        };

        return FileSyncIsOnDiskReplyBody;
    })();

    file.FileSyncDownloadRequestBody = (function() {

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

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

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

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

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

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

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

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

        /**
         * Verifies a FileSyncDownloadRequestBody message.
         * @function verify
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncDownloadRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 FileSyncDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncDownloadRequestBody} FileSyncDownloadRequestBody
         */
        FileSyncDownloadRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileSyncDownloadRequestBody)
                return object;
            var message = new $root.file.FileSyncDownloadRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 FileSyncDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {file.FileSyncDownloadRequestBody} message FileSyncDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncDownloadRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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 FileSyncDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        return FileSyncDownloadRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts);
                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) {
            if (object instanceof $root.file.AdoptRemoteRequestBody)
                return object;
            var message = new $root.file.AdoptRemoteRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                $root.common.BooleanValue.encode(message.dropLocalVer, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToAdopteRemote();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.dropLocalVer = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer")) {
                var error = $root.common.BooleanValue.verify(message.dropLocalVer);
                if (error)
                    return "dropLocalVer." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.OptionsToAdopteRemote)
                return object;
            var message = new $root.file.OptionsToAdopteRemote();
            if (object.dropLocalVer != null) {
                if (typeof object.dropLocalVer !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.dropLocalVer: object expected");
                message.dropLocalVer = $root.common.BooleanValue.fromObject(object.dropLocalVer);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.dropLocalVer = null;
                object.remoteVersion = null;
            }
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer"))
                object.dropLocalVer = $root.common.BooleanValue.toObject(message.dropLocalVer, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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);
        };

        return OptionsToAdopteRemote;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts);
                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) {
            if (object instanceof $root.file.FileSyncUploadRequestBody)
                return object;
            var message = new $root.file.FileSyncUploadRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.FileSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.uploadedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion);
                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) {
            if (object instanceof $root.file.FileSyncUploadReplyBody)
                return object;
            var message = new $root.file.FileSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (typeof object.uploadedVersion !== "object")
                    throw TypeError(".file.FileSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options);
            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);
        };

        return FileSyncUploadReplyBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToUploadLocal();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.localVersion != null && message.hasOwnProperty("localVersion")) {
                var error = $root.common.UInt64Value.verify(message.localVersion);
                if (error)
                    return "localVersion." + error;
            }
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadVersion);
                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) {
            if (object instanceof $root.file.OptionsToUploadLocal)
                return object;
            var message = new $root.file.OptionsToUploadLocal();
            if (object.localVersion != null) {
                if (typeof object.localVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.localVersion: object expected");
                message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion);
            }
            if (object.uploadVersion != null) {
                if (typeof object.uploadVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.uploadVersion: object expected");
                message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.localVersion = null;
                object.uploadVersion = null;
            }
            if (message.localVersion != null && message.hasOwnProperty("localVersion"))
                object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options);
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion"))
                object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options);
            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);
        };

        return OptionsToUploadLocal;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FS();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                case 6:
                    message.isSynced = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FS)
                return object;
            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 (typeof object.impl !== "object")
                    throw TypeError(".fs.FS.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.writable != null && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            if (message.isSynced != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CheckPresenceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.throwIfMissing = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.throwIfMissing != null && message.hasOwnProperty("throwIfMissing")) {
                var error = $root.common.BooleanValue.verify(message.throwIfMissing);
                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) {
            if (object instanceof $root.fs.CheckPresenceRequestBody)
                return object;
            var message = new $root.fs.CheckPresenceRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.throwIfMissing != null) {
                if (typeof object.throwIfMissing !== "object")
                    throw TypeError(".fs.CheckPresenceRequestBody.throwIfMissing: object expected");
                message.throwIfMissing = $root.common.BooleanValue.fromObject(object.throwIfMissing);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.throwIfMissing = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.throwIfMissing != null && message.hasOwnProperty("throwIfMissing"))
                object.throwIfMissing = $root.common.BooleanValue.toObject(message.throwIfMissing, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathOnlyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.PathOnlyRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.path = "";
            if (message.path != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.xaName = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.GetXAttrRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.xaName != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLink();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.readonly = reader.bool();
                    break;
                case 2:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.impl = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.readonly != null && message.hasOwnProperty("readonly"))
                if (typeof message.readonly !== "boolean")
                    return "readonly: boolean expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                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) {
            if (object instanceof $root.fs.SymLink)
                return object;
            var message = new $root.fs.SymLink();
            if (object.readonly != null)
                message.readonly = Boolean(object.readonly);
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.SymLink.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.SymLink.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.impl != null) {
                if (typeof object.impl !== "object")
                    throw TypeError(".fs.SymLink.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.readonly = false;
                object.isFile = null;
                object.isFolder = null;
                object.impl = null;
            }
            if (message.readonly != null && message.hasOwnProperty("readonly"))
                object.readonly = message.readonly;
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLinkTargetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.fs = $root.fs.FS.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.file = $root.file.File.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.fs != null && message.hasOwnProperty("fs")) {
                var error = $root.fs.FS.verify(message.fs);
                if (error)
                    return "fs." + error;
            }
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.file.File.verify(message.file);
                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) {
            if (object instanceof $root.fs.SymLinkTargetReplyBody)
                return object;
            var message = new $root.fs.SymLinkTargetReplyBody();
            if (object.fs != null) {
                if (typeof object.fs !== "object")
                    throw TypeError(".fs.SymLinkTargetReplyBody.fs: object expected");
                message.fs = $root.fs.FS.fromObject(object.fs);
            }
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".fs.SymLinkTargetReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.fs = null;
                object.file = null;
            }
            if (message.fs != null && message.hasOwnProperty("fs"))
                object.fs = $root.fs.FS.toObject(message.fs, options);
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.file.File.toObject(message.file, options);
            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);
        };

        return SymLinkTargetReplyBody;
    })();

    fs.FSEventMsg = (function() {

        /**
         * Properties of a FSEventMsg.
         * @memberof fs
         * @interface IFSEventMsg
         * @property {string|null} [type] FSEventMsg type
         * @property {string|null} [path] FSEventMsg path
         * @property {common.IStringValue|null} [src] FSEventMsg src
         * @property {common.IUInt64Value|null} [newVersion] FSEventMsg newVersion
         * @property {common.IStringValue|null} [name] FSEventMsg name
         * @property {common.IStringValue|null} [oldName] FSEventMsg oldName
         * @property {common.IStringValue|null} [newName] FSEventMsg newName
         * @property {fs.IListingEntryMsg|null} [entry] FSEventMsg entry
         * @property {common.IUInt64Value|null} [moveLabel] FSEventMsg moveLabel
         * @property {common.IUInt64Value|null} [removedArchVer] FSEventMsg removedArchVer
         * @property {common.IUInt64Value|null} [archivedVersion] FSEventMsg archivedVersion
         */

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

        /**
         * FSEventMsg type.
         * @member {string} type
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.type = "";

        /**
         * FSEventMsg path.
         * @member {string} path
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.path = "";

        /**
         * FSEventMsg src.
         * @member {common.IStringValue|null|undefined} src
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.src = null;

        /**
         * FSEventMsg newVersion.
         * @member {common.IUInt64Value|null|undefined} newVersion
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.newVersion = null;

        /**
         * FSEventMsg name.
         * @member {common.IStringValue|null|undefined} name
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.name = null;

        /**
         * FSEventMsg oldName.
         * @member {common.IStringValue|null|undefined} oldName
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.oldName = null;

        /**
         * FSEventMsg newName.
         * @member {common.IStringValue|null|undefined} newName
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.newName = null;

        /**
         * FSEventMsg entry.
         * @member {fs.IListingEntryMsg|null|undefined} entry
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.entry = null;

        /**
         * FSEventMsg moveLabel.
         * @member {common.IUInt64Value|null|undefined} moveLabel
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.moveLabel = null;

        /**
         * FSEventMsg removedArchVer.
         * @member {common.IUInt64Value|null|undefined} removedArchVer
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.removedArchVer = null;

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

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

        /**
         * Encodes the specified FSEventMsg message. Does not implicitly {@link fs.FSEventMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.FSEventMsg
         * @static
         * @param {fs.IFSEventMsg} message FSEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSEventMsg.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.StringValue.encode(message.src, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                $root.common.StringValue.encode(message.name, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.oldName != null && Object.hasOwnProperty.call(message, "oldName"))
                $root.common.StringValue.encode(message.oldName, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.newName != null && Object.hasOwnProperty.call(message, "newName"))
                $root.common.StringValue.encode(message.newName, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.entry != null && Object.hasOwnProperty.call(message, "entry"))
                $root.fs.ListingEntryMsg.encode(message.entry, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.moveLabel != null && Object.hasOwnProperty.call(message, "moveLabel"))
                $root.common.UInt64Value.encode(message.moveLabel, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
            if (message.removedArchVer != null && Object.hasOwnProperty.call(message, "removedArchVer"))
                $root.common.UInt64Value.encode(message.removedArchVer, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a FSEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSEventMsg} FSEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSEventMsg.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.path = reader.string();
                    break;
                case 3:
                    message.src = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.name = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.oldName = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 7:
                    message.newName = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 8:
                    message.entry = $root.fs.ListingEntryMsg.decode(reader, reader.uint32());
                    break;
                case 9:
                    message.moveLabel = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.removedArchVer = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 11:
                    message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a FSEventMsg message.
         * @function verify
         * @memberof fs.FSEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSEventMsg.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.src != null && message.hasOwnProperty("src")) {
                var error = $root.common.StringValue.verify(message.src);
                if (error)
                    return "src." + error;
            }
            if (message.newVersion != null && message.hasOwnProperty("newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion);
                if (error)
                    return "newVersion." + error;
            }
            if (message.name != null && message.hasOwnProperty("name")) {
                var error = $root.common.StringValue.verify(message.name);
                if (error)
                    return "name." + error;
            }
            if (message.oldName != null && message.hasOwnProperty("oldName")) {
                var error = $root.common.StringValue.verify(message.oldName);
                if (error)
                    return "oldName." + error;
            }
            if (message.newName != null && message.hasOwnProperty("newName")) {
                var error = $root.common.StringValue.verify(message.newName);
                if (error)
                    return "newName." + error;
            }
            if (message.entry != null && message.hasOwnProperty("entry")) {
                var error = $root.fs.ListingEntryMsg.verify(message.entry);
                if (error)
                    return "entry." + error;
            }
            if (message.moveLabel != null && message.hasOwnProperty("moveLabel")) {
                var error = $root.common.UInt64Value.verify(message.moveLabel);
                if (error)
                    return "moveLabel." + error;
            }
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer")) {
                var error = $root.common.UInt64Value.verify(message.removedArchVer);
                if (error)
                    return "removedArchVer." + error;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FSEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSEventMsg} FSEventMsg
         */
        FSEventMsg.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSEventMsg)
                return object;
            var message = new $root.fs.FSEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null)
                message.path = String(object.path);
            if (object.src != null) {
                if (typeof object.src !== "object")
                    throw TypeError(".fs.FSEventMsg.src: object expected");
                message.src = $root.common.StringValue.fromObject(object.src);
            }
            if (object.newVersion != null) {
                if (typeof object.newVersion !== "object")
                    throw TypeError(".fs.FSEventMsg.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion);
            }
            if (object.name != null) {
                if (typeof object.name !== "object")
                    throw TypeError(".fs.FSEventMsg.name: object expected");
                message.name = $root.common.StringValue.fromObject(object.name);
            }
            if (object.oldName != null) {
                if (typeof object.oldName !== "object")
                    throw TypeError(".fs.FSEventMsg.oldName: object expected");
                message.oldName = $root.common.StringValue.fromObject(object.oldName);
            }
            if (object.newName != null) {
                if (typeof object.newName !== "object")
                    throw TypeError(".fs.FSEventMsg.newName: object expected");
                message.newName = $root.common.StringValue.fromObject(object.newName);
            }
            if (object.entry != null) {
                if (typeof object.entry !== "object")
                    throw TypeError(".fs.FSEventMsg.entry: object expected");
                message.entry = $root.fs.ListingEntryMsg.fromObject(object.entry);
            }
            if (object.moveLabel != null) {
                if (typeof object.moveLabel !== "object")
                    throw TypeError(".fs.FSEventMsg.moveLabel: object expected");
                message.moveLabel = $root.common.UInt64Value.fromObject(object.moveLabel);
            }
            if (object.removedArchVer != null) {
                if (typeof object.removedArchVer !== "object")
                    throw TypeError(".fs.FSEventMsg.removedArchVer: object expected");
                message.removedArchVer = $root.common.UInt64Value.fromObject(object.removedArchVer);
            }
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".fs.FSEventMsg.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSEventMsg
         * @static
         * @param {fs.FSEventMsg} message FSEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSEventMsg.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = "";
                object.src = null;
                object.newVersion = null;
                object.name = null;
                object.oldName = null;
                object.newName = null;
                object.entry = null;
                object.moveLabel = null;
                object.removedArchVer = null;
                object.archivedVersion = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = $root.common.StringValue.toObject(message.src, options);
            if (message.newVersion != null && message.hasOwnProperty("newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options);
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = $root.common.StringValue.toObject(message.name, options);
            if (message.oldName != null && message.hasOwnProperty("oldName"))
                object.oldName = $root.common.StringValue.toObject(message.oldName, options);
            if (message.newName != null && message.hasOwnProperty("newName"))
                object.newName = $root.common.StringValue.toObject(message.newName, options);
            if (message.entry != null && message.hasOwnProperty("entry"))
                object.entry = $root.fs.ListingEntryMsg.toObject(message.entry, options);
            if (message.moveLabel != null && message.hasOwnProperty("moveLabel"))
                object.moveLabel = $root.common.UInt64Value.toObject(message.moveLabel, options);
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer"))
                object.removedArchVer = $root.common.UInt64Value.toObject(message.removedArchVer, options);
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            return object;
        };

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

        return FSEventMsg;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WatchTreeRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.depth = $root.common.UInt32Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.depth != null && message.hasOwnProperty("depth")) {
                var error = $root.common.UInt32Value.verify(message.depth);
                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) {
            if (object instanceof $root.fs.WatchTreeRequestBody)
                return object;
            var message = new $root.fs.WatchTreeRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.depth != null) {
                if (typeof object.depth !== "object")
                    throw TypeError(".fs.WatchTreeRequestBody.depth: object expected");
                message.depth = $root.common.UInt32Value.fromObject(object.depth);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.depth = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.depth != null && message.hasOwnProperty("depth"))
                object.depth = $root.common.UInt32Value.toObject(message.depth, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.entries && message.entries.length))
                        message.entries = [];
                    message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.entries != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.ListFolderReplyBody)
                return object;
            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 (typeof object.entries[i] !== "object")
                        throw TypeError(".fs.ListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListingEntryMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.name = reader.string();
                    break;
                case 2:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                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) {
            if (object instanceof $root.fs.ListingEntryMsg)
                return object;
            var message = new $root.fs.ListingEntryMsg();
            if (object.name != null)
                message.name = String(object.name);
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
            }
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                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) {
            if (object instanceof $root.fs.ReadBytesRequestBody)
                return object;
            var message = new $root.fs.ReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".fs.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".fs.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.criteria = $root.fs.SelectRequestBody.SelectCriteria.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.criteria != null && message.hasOwnProperty("criteria")) {
                var error = $root.fs.SelectRequestBody.SelectCriteria.verify(message.criteria);
                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) {
            if (object instanceof $root.fs.SelectRequestBody)
                return object;
            var message = new $root.fs.SelectRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.criteria != null) {
                if (typeof object.criteria !== "object")
                    throw TypeError(".fs.SelectRequestBody.criteria: object expected");
                message.criteria = $root.fs.SelectRequestBody.SelectCriteria.fromObject(object.criteria);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.criteria = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.criteria != null && message.hasOwnProperty("criteria"))
                object.criteria = $root.fs.SelectRequestBody.SelectCriteria.toObject(message.criteria, options);
            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);
        };

        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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    $root.common.StringValue.encode(message.exactName, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    $root.common.StringValue.encode(message.pattern, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    $root.common.StringValue.encode(message.regexp, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody.SelectCriteria();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.exactName = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    case 2:
                        message.pattern = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    case 3:
                        message.regexp = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    case 4:
                        message.depth = $root.common.UInt32Value.decode(reader, reader.uint32());
                        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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.exactName != null && message.hasOwnProperty("exactName")) {
                    var error = $root.common.StringValue.verify(message.exactName);
                    if (error)
                        return "exactName." + error;
                }
                if (message.pattern != null && message.hasOwnProperty("pattern")) {
                    var error = $root.common.StringValue.verify(message.pattern);
                    if (error)
                        return "pattern." + error;
                }
                if (message.regexp != null && message.hasOwnProperty("regexp")) {
                    var error = $root.common.StringValue.verify(message.regexp);
                    if (error)
                        return "regexp." + error;
                }
                if (message.depth != null && message.hasOwnProperty("depth")) {
                    var error = $root.common.UInt32Value.verify(message.depth);
                    if (error)
                        return "depth." + error;
                }
                if (message.type != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
                if (object instanceof $root.fs.SelectRequestBody.SelectCriteria)
                    return object;
                var message = new $root.fs.SelectRequestBody.SelectCriteria();
                if (object.exactName != null) {
                    if (typeof object.exactName !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.exactName: object expected");
                    message.exactName = $root.common.StringValue.fromObject(object.exactName);
                }
                if (object.pattern != null) {
                    if (typeof object.pattern !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.pattern: object expected");
                    message.pattern = $root.common.StringValue.fromObject(object.pattern);
                }
                if (object.regexp != null) {
                    if (typeof object.regexp !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.regexp: object expected");
                    message.regexp = $root.common.StringValue.fromObject(object.regexp);
                }
                if (object.depth != null) {
                    if (typeof object.depth !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.depth: object expected");
                    message.depth = $root.common.UInt32Value.fromObject(object.depth);
                }
                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) {
                if (!options)
                    options = {};
                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 && message.hasOwnProperty("exactName"))
                    object.exactName = $root.common.StringValue.toObject(message.exactName, options);
                if (message.pattern != null && message.hasOwnProperty("pattern"))
                    object.pattern = $root.common.StringValue.toObject(message.pattern, options);
                if (message.regexp != null && message.hasOwnProperty("regexp"))
                    object.regexp = $root.common.StringValue.toObject(message.regexp, options);
                if (message.depth != null && message.hasOwnProperty("depth"))
                    object.depth = $root.common.UInt32Value.toObject(message.depth, options);
                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 && message.hasOwnProperty("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);
            };

            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.name = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            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) {
            if (object instanceof $root.fs.FSCGetRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.name = "";
            if (message.name != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.FSCGetReplyBody)
                return object;
            var message = new $root.fs.FSCGetReplyBody();
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.FSCGetReplyBody.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.item = null;
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                $root.common.BooleanValue.encode(message.isCollection, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.isCollection = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 5:
                    message.item = $root.fs.FSItem.Item.decode(reader, reader.uint32());
                    break;
                case 6:
                    message.location = $root.fs.FSItem.Location.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                if (error)
                    return "isLink." + error;
            }
            if (message.isCollection != null && message.hasOwnProperty("isCollection")) {
                var error = $root.common.BooleanValue.verify(message.isCollection);
                if (error)
                    return "isCollection." + error;
            }
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.Item.verify(message.item);
                if (error)
                    return "item." + error;
            }
            if (message.location != null && message.hasOwnProperty("location")) {
                var error = $root.fs.FSItem.Location.verify(message.location);
                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) {
            if (object instanceof $root.fs.FSItem)
                return object;
            var message = new $root.fs.FSItem();
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.FSItem.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.FSItem.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".fs.FSItem.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            if (object.isCollection != null) {
                if (typeof object.isCollection !== "object")
                    throw TypeError(".fs.FSItem.isCollection: object expected");
                message.isCollection = $root.common.BooleanValue.fromObject(object.isCollection);
            }
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.FSItem.item: object expected");
                message.item = $root.fs.FSItem.Item.fromObject(object.item);
            }
            if (object.location != null) {
                if (typeof object.location !== "object")
                    throw TypeError(".fs.FSItem.location: object expected");
                message.location = $root.fs.FSItem.Location.fromObject(object.location);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            if (message.isCollection != null && message.hasOwnProperty("isCollection"))
                object.isCollection = $root.common.BooleanValue.toObject(message.isCollection, options);
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.Item.toObject(message.item, options);
            if (message.location != null && message.hasOwnProperty("location"))
                object.location = $root.fs.FSItem.Location.toObject(message.location, options);
            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);
        };

        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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Location();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.fs = $root.fs.FS.decode(reader, reader.uint32());
                        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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.fs != null && message.hasOwnProperty("fs")) {
                    var error = $root.fs.FS.verify(message.fs);
                    if (error)
                        return "fs." + error;
                }
                if (message.path != null && message.hasOwnProperty("path"))
                    if (!$util.isString(message.path))
                        return "path: string expected";
                if (message.storageUse != null && message.hasOwnProperty("storageUse"))
                    if (!$util.isString(message.storageUse))
                        return "storageUse: string expected";
                if (message.storageType != null && message.hasOwnProperty("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) {
                if (object instanceof $root.fs.FSItem.Location)
                    return object;
                var message = new $root.fs.FSItem.Location();
                if (object.fs != null) {
                    if (typeof object.fs !== "object")
                        throw TypeError(".fs.FSItem.Location.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.path = "";
                    object.storageUse = "";
                    object.storageType = "";
                }
                if (message.fs != null && message.hasOwnProperty("fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options);
                if (message.path != null && message.hasOwnProperty("path"))
                    object.path = message.path;
                if (message.storageUse != null && message.hasOwnProperty("storageUse"))
                    object.storageUse = message.storageUse;
                if (message.storageType != null && message.hasOwnProperty("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);
            };

            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    $root.common.ObjectReference.encode(message.collection, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Item();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.fs = $root.fs.FS.decode(reader, reader.uint32());
                        break;
                    case 2:
                        message.file = $root.file.File.decode(reader, reader.uint32());
                        break;
                    case 3:
                        message.collection = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.fs != null && message.hasOwnProperty("fs")) {
                    var error = $root.fs.FS.verify(message.fs);
                    if (error)
                        return "fs." + error;
                }
                if (message.file != null && message.hasOwnProperty("file")) {
                    var error = $root.file.File.verify(message.file);
                    if (error)
                        return "file." + error;
                }
                if (message.collection != null && message.hasOwnProperty("collection")) {
                    var error = $root.common.ObjectReference.verify(message.collection);
                    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) {
                if (object instanceof $root.fs.FSItem.Item)
                    return object;
                var message = new $root.fs.FSItem.Item();
                if (object.fs != null) {
                    if (typeof object.fs !== "object")
                        throw TypeError(".fs.FSItem.Item.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs);
                }
                if (object.file != null) {
                    if (typeof object.file !== "object")
                        throw TypeError(".fs.FSItem.Item.file: object expected");
                    message.file = $root.file.File.fromObject(object.file);
                }
                if (object.collection != null) {
                    if (typeof object.collection !== "object")
                        throw TypeError(".fs.FSItem.Item.collection: object expected");
                    message.collection = $root.common.ObjectReference.fromObject(object.collection);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.file = null;
                    object.collection = null;
                }
                if (message.fs != null && message.hasOwnProperty("fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options);
                if (message.file != null && message.hasOwnProperty("file"))
                    object.file = $root.file.File.toObject(message.file, options);
                if (message.collection != null && message.hasOwnProperty("collection"))
                    object.collection = $root.common.ObjectReference.toObject(message.collection, options);
                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);
            };

            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetAllReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.items && message.items.length))
                        message.items = [];
                    message.items.push($root.fs.NameAndItem.decode(reader, reader.uint32()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.items != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.FSCGetAllReplyBody)
                return object;
            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 (typeof object.items[i] !== "object")
                        throw TypeError(".fs.FSCGetAllReplyBody.items: object expected");
                    message.items[i] = $root.fs.NameAndItem.fromObject(object.items[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.NameAndItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.name = reader.string();
                    break;
                case 2:
                    message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.NameAndItem)
                return object;
            var message = new $root.fs.NameAndItem();
            if (object.name != null)
                message.name = String(object.name);
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.NameAndItem.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.item = null;
            }
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                $root.common.BooleanValue.encode(message.done, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                $root.fs.NameAndItem.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.IterResMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.done = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.value = $root.fs.NameAndItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.done != null && message.hasOwnProperty("done")) {
                var error = $root.common.BooleanValue.verify(message.done);
                if (error)
                    return "done." + error;
            }
            if (message.value != null && message.hasOwnProperty("value")) {
                var error = $root.fs.NameAndItem.verify(message.value);
                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) {
            if (object instanceof $root.fs.IterResMsg)
                return object;
            var message = new $root.fs.IterResMsg();
            if (object.done != null) {
                if (typeof object.done !== "object")
                    throw TypeError(".fs.IterResMsg.done: object expected");
                message.done = $root.common.BooleanValue.fromObject(object.done);
            }
            if (object.value != null) {
                if (typeof object.value !== "object")
                    throw TypeError(".fs.IterResMsg.value: object expected");
                message.value = $root.fs.NameAndItem.fromObject(object.value);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.done = null;
                object.value = null;
            }
            if (message.done != null && message.hasOwnProperty("done"))
                object.done = $root.common.BooleanValue.toObject(message.done, options);
            if (message.value != null && message.hasOwnProperty("value"))
                object.value = $root.fs.NameAndItem.toObject(message.value, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CollectionEvent();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.path = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path")) {
                var error = $root.common.StringValue.verify(message.path);
                if (error)
                    return "path." + error;
            }
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.CollectionEvent)
                return object;
            var message = new $root.fs.CollectionEvent();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (typeof object.path !== "object")
                    throw TypeError(".fs.CollectionEvent.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path);
            }
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.CollectionEvent.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
                object.item = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = $root.common.StringValue.toObject(message.path, options);
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedGetXAttrRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndFlagsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.PathAndFlagsRequestBody)
                return object;
            var message = new $root.fs.PathAndFlagsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.PathAndFlagsRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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()));
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.VersionedListFolderReplyBody)
                return object;
            var message = new $root.fs.VersionedListFolderReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.entries[i] !== "object")
                        throw TypeError(".fs.VersionedListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
            }
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedReadBytesRequestBody)
                return object;
            var message = new $root.fs.VersionedReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.changes != null && message.hasOwnProperty("changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes);
                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) {
            if (object instanceof $root.fs.UpdateXAttrsRequestBody)
                return object;
            var message = new $root.fs.UpdateXAttrsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.changes != null) {
                if (typeof object.changes !== "object")
                    throw TypeError(".fs.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.changes = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.changes != null && message.hasOwnProperty("changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MakeFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                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) {
            if (object instanceof $root.fs.MakeFolderRequestBody)
                return object;
            var message = new $root.fs.MakeFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.MakeFolderRequestBody.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.exclusive = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DeleteFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.removeContent = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.removeContent != null && message.hasOwnProperty("removeContent")) {
                var error = $root.common.BooleanValue.verify(message.removeContent);
                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) {
            if (object instanceof $root.fs.DeleteFolderRequestBody)
                return object;
            var message = new $root.fs.DeleteFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.removeContent != null) {
                if (typeof object.removeContent !== "object")
                    throw TypeError(".fs.DeleteFolderRequestBody.removeContent: object expected");
                message.removeContent = $root.common.BooleanValue.fromObject(object.removeContent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.removeContent = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.removeContent != null && message.hasOwnProperty("removeContent"))
                object.removeContent = $root.common.BooleanValue.toObject(message.removeContent, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MoveRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.src = reader.string();
                    break;
                case 2:
                    message.dst = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.MoveRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && message.hasOwnProperty("overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite);
                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) {
            if (object instanceof $root.fs.CopyFileRequestBody)
                return object;
            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 (typeof object.overwrite !== "object")
                    throw TypeError(".fs.CopyFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.overwrite = null;
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.overwrite != null && message.hasOwnProperty("overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite);
                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) {
            if (object instanceof $root.fs.CopyFolderRequestBody)
                return object;
            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 (typeof object.mergeAndOverwrite !== "object")
                    throw TypeError(".fs.CopyFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.file = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.dst = reader.string();
                    break;
                case 3:
                    message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.common.ObjectReference.verify(message.file);
                if (error)
                    return "file." + error;
            }
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && message.hasOwnProperty("overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite);
                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) {
            if (object instanceof $root.fs.SaveFileRequestBody)
                return object;
            var message = new $root.fs.SaveFileRequestBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".fs.SaveFileRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (typeof object.overwrite !== "object")
                    throw TypeError(".fs.SaveFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.file = null;
                object.dst = "";
                object.overwrite = null;
            }
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options);
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.overwrite != null && message.hasOwnProperty("overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.common.ObjectReference.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.folder = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.dst = reader.string();
                    break;
                case 3:
                    message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.folder != null && message.hasOwnProperty("folder")) {
                var error = $root.common.ObjectReference.verify(message.folder);
                if (error)
                    return "folder." + error;
            }
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite);
                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) {
            if (object instanceof $root.fs.SaveFolderRequestBody)
                return object;
            var message = new $root.fs.SaveFolderRequestBody();
            if (object.folder != null) {
                if (typeof object.folder !== "object")
                    throw TypeError(".fs.SaveFolderRequestBody.folder: object expected");
                message.folder = $root.common.ObjectReference.fromObject(object.folder);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (typeof object.mergeAndOverwrite !== "object")
                    throw TypeError(".fs.SaveFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.folder = null;
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.folder != null && message.hasOwnProperty("folder"))
                object.folder = $root.common.ObjectReference.toObject(message.folder, options);
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.LinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.target = $root.common.ObjectReference.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.target != null && message.hasOwnProperty("target")) {
                var error = $root.common.ObjectReference.verify(message.target);
                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) {
            if (object instanceof $root.fs.LinkRequestBody)
                return object;
            var message = new $root.fs.LinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.target != null) {
                if (typeof object.target !== "object")
                    throw TypeError(".fs.LinkRequestBody.target: object expected");
                message.target = $root.common.ObjectReference.fromObject(object.target);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.target = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.target != null && message.hasOwnProperty("target"))
                object.target = $root.common.ObjectReference.toObject(message.target, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndOptFileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.flags = $root.fs.FileFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.PathAndOptFileFlags)
                return object;
            var message = new $root.fs.PathAndOptFileFlags();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.PathAndOptFileFlags.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.create = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncate != null && message.hasOwnProperty("truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && message.hasOwnProperty("create")) {
                var error = $root.common.BooleanValue.verify(message.create);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                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) {
            if (object instanceof $root.fs.FileFlags)
                return object;
            var message = new $root.fs.FileFlags();
            if (object.truncate != null) {
                if (typeof object.truncate !== "object")
                    throw TypeError(".fs.FileFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate);
            }
            if (object.create != null) {
                if (typeof object.create !== "object")
                    throw TypeError(".fs.FileFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create);
            }
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.FileFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
            }
            if (message.truncate != null && message.hasOwnProperty("truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options);
            if (message.create != null && message.hasOwnProperty("create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options);
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && message.hasOwnProperty("json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteJsonFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = message.json;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && message.hasOwnProperty("txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteTxtFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.txt != null && message.hasOwnProperty("txt"))
                object.txt = message.txt;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteBytesRequestBody)
                return object;
            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)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.bytes != null && message.hasOwnProperty("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 && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && message.hasOwnProperty("json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteJsonFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = message.json;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedFileWriteFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.create = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                    break;
                case 10:
                    message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncate != null && message.hasOwnProperty("truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && message.hasOwnProperty("create")) {
                var error = $root.common.BooleanValue.verify(message.create);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                if (error)
                    return "exclusive." + error;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion);
                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) {
            if (object instanceof $root.fs.VersionedFileWriteFlags)
                return object;
            var message = new $root.fs.VersionedFileWriteFlags();
            if (object.truncate != null) {
                if (typeof object.truncate !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate);
            }
            if (object.create != null) {
                if (typeof object.create !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create);
            }
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            if (object.currentVersion != null) {
                if (typeof object.currentVersion !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
                object.currentVersion = null;
            }
            if (message.truncate != null && message.hasOwnProperty("truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options);
            if (message.create != null && message.hasOwnProperty("create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options);
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && message.hasOwnProperty("txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteTxtFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.txt != null && message.hasOwnProperty("txt"))
                object.txt = message.txt;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteBytesRequestBody)
                return object;
            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)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.bytes != null && message.hasOwnProperty("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 && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedGetByteSinkRequestBody)
                return object;
            var message = new $root.fs.VersionedGetByteSinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedGetByteSinkRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                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) {
            if (object instanceof $root.fs.ArchiveCurrentRequestBody)
                return object;
            var message = new $root.fs.ArchiveCurrentRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".fs.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.version = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            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);
        };

        return ArchiveCurrentRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.version = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FSSyncIsOnDiskRequestBody)
                return object;
            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)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.status = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.status != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FSSyncIsOnDiskReplyBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && message.hasOwnProperty("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);
        };

        return FSSyncIsOnDiskReplyBody;
    })();

    fs.FSSyncDownloadRequestBody = (function() {

        /**
         * Properties of a FSSyncDownloadRequestBody.
         * @memberof fs
         * @interface IFSSyncDownloadRequestBody
         * @property {string|null} [path] FSSyncDownloadRequestBody path
         * @property {number|Long|null} [version] FSSyncDownloadRequestBody version
         */

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

        /**
         * FSSyncDownloadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncDownloadRequestBody
         * @instance
         */
        FSSyncDownloadRequestBody.prototype.path = "";

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

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

        /**
         * Encodes the specified FSSyncDownloadRequestBody message. Does not implicitly {@link fs.FSSyncDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.IFSSyncDownloadRequestBody} message FSSyncDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncDownloadRequestBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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 FSSyncDownloadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.IFSSyncDownloadRequestBody} message FSSyncDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

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

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

        /**
         * Verifies a FSSyncDownloadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncDownloadRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("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 FSSyncDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncDownloadRequestBody} FSSyncDownloadRequestBody
         */
        FSSyncDownloadRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSSyncDownloadRequestBody)
                return object;
            var message = new $root.fs.FSSyncDownloadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 FSSyncDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.FSSyncDownloadRequestBody} message FSSyncDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncDownloadRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                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 FSSyncDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        return FSSyncDownloadRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts);
                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) {
            if (object instanceof $root.fs.AdoptRemoteRequestBody)
                return object;
            var message = new $root.fs.AdoptRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".fs.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options);
            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);
        };

        return AdoptRemoteRequestBody;
    })();

    fs.DiffCurrentAndRemoteRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteRequestBody path
         * @property {common.IUInt64Value|null} [remoteVersion] DiffCurrentAndRemoteRequestBody remoteVersion
         */

        /**
         * Constructs a new DiffCurrentAndRemoteRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteRequestBody.
         * @implements IDiffCurrentAndRemoteRequestBody
         * @constructor
         * @param {fs.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)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @instance
         */
        DiffCurrentAndRemoteRequestBody.prototype.path = "";

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

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

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.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).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.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 fs.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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         */
        DiffCurrentAndRemoteRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteRequestBody)
                return object;
            var message = new $root.fs.DiffCurrentAndRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".fs.DiffCurrentAndRemoteRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteVersion = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            return object;
        };

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

        return DiffCurrentAndRemoteRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.fs.FolderDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.diff = $root.fs.FolderDiff.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.diff != null && message.hasOwnProperty("diff")) {
                var error = $root.fs.FolderDiff.verify(message.diff);
                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) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteReplyBody)
                return object;
            var message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (typeof object.diff !== "object")
                    throw TypeError(".fs.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.fs.FolderDiff.fromObject(object.diff);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && message.hasOwnProperty("diff"))
                object.diff = $root.fs.FolderDiff.toObject(message.diff, options);
            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);
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    fs.FolderDiff = (function() {

        /**
         * Properties of a FolderDiff.
         * @memberof fs
         * @interface IFolderDiff
         * @property {number|Long|null} [currentVersion] FolderDiff currentVersion
         * @property {common.IUInt64Value|null} [remoteVersion] FolderDiff remoteVersion
         * @property {Array.<fs.IListingEntryMsg>|null} [inCurrent] FolderDiff inCurrent
         * @property {Array.<fs.IListingEntryMsg>|null} [inRemote] FolderDiff inRemote
         * @property {Array.<string>|null} [nameOverlaps] FolderDiff nameOverlaps
         * @property {fs.FolderDiff.ITimeStamps|null} [ctime] FolderDiff ctime
         * @property {fs.FolderDiff.ITimeStamps|null} [mtime] FolderDiff mtime
         * @property {fs.FolderDiff.IXAttrs|null} [xattrs] FolderDiff xattrs
         */

        /**
         * Constructs a new FolderDiff.
         * @memberof fs
         * @classdesc Represents a FolderDiff.
         * @implements IFolderDiff
         * @constructor
         * @param {fs.IFolderDiff=} [properties] Properties to set
         */
        function FolderDiff(properties) {
            this.inCurrent = [];
            this.inRemote = [];
            this.nameOverlaps = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

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

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

        /**
         * FolderDiff inCurrent.
         * @member {Array.<fs.IListingEntryMsg>} inCurrent
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.inCurrent = $util.emptyArray;

        /**
         * FolderDiff inRemote.
         * @member {Array.<fs.IListingEntryMsg>} inRemote
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.inRemote = $util.emptyArray;

        /**
         * FolderDiff nameOverlaps.
         * @member {Array.<string>} nameOverlaps
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.nameOverlaps = $util.emptyArray;

        /**
         * FolderDiff ctime.
         * @member {fs.FolderDiff.ITimeStamps|null|undefined} ctime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.ctime = null;

        /**
         * FolderDiff mtime.
         * @member {fs.FolderDiff.ITimeStamps|null|undefined} mtime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.mtime = null;

        /**
         * FolderDiff xattrs.
         * @member {fs.FolderDiff.IXAttrs|null|undefined} xattrs
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.xattrs = null;

        /**
         * 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) {
            if (!writer)
                writer = $Writer.create();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.inCurrent != null && message.inCurrent.length)
                for (var i = 0; i < message.inCurrent.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.inCurrent[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.inRemote != null && message.inRemote.length)
                for (var i = 0; i < message.inRemote.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.inRemote[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.nameOverlaps != null && message.nameOverlaps.length)
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    writer.uint32(/* id 5, wireType 2 =*/42).string(message.nameOverlaps[i]);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.fs.FolderDiff.TimeStamps.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.fs.FolderDiff.TimeStamps.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs"))
                $root.fs.FolderDiff.XAttrs.encode(message.xattrs, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.currentVersion = reader.uint64();
                    break;
                case 2:
                    message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                    break;
                case 3:
                    if (!(message.inCurrent && message.inCurrent.length))
                        message.inCurrent = [];
                    message.inCurrent.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                    break;
                case 4:
                    if (!(message.inRemote && message.inRemote.length))
                        message.inRemote = [];
                    message.inRemote.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                    break;
                case 5:
                    if (!(message.nameOverlaps && message.nameOverlaps.length))
                        message.nameOverlaps = [];
                    message.nameOverlaps.push(reader.string());
                    break;
                case 6:
                    message.ctime = $root.fs.FolderDiff.TimeStamps.decode(reader, reader.uint32());
                    break;
                case 7:
                    message.mtime = $root.fs.FolderDiff.TimeStamps.decode(reader, reader.uint32());
                    break;
                case 8:
                    message.xattrs = $root.fs.FolderDiff.XAttrs.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.currentVersion != null && message.hasOwnProperty("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.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.inCurrent != null && message.hasOwnProperty("inCurrent")) {
                if (!Array.isArray(message.inCurrent))
                    return "inCurrent: array expected";
                for (var i = 0; i < message.inCurrent.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.inCurrent[i]);
                    if (error)
                        return "inCurrent." + error;
                }
            }
            if (message.inRemote != null && message.hasOwnProperty("inRemote")) {
                if (!Array.isArray(message.inRemote))
                    return "inRemote: array expected";
                for (var i = 0; i < message.inRemote.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.inRemote[i]);
                    if (error)
                        return "inRemote." + error;
                }
            }
            if (message.nameOverlaps != null && message.hasOwnProperty("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";
            }
            if (message.ctime != null && message.hasOwnProperty("ctime")) {
                var error = $root.fs.FolderDiff.TimeStamps.verify(message.ctime);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && message.hasOwnProperty("mtime")) {
                var error = $root.fs.FolderDiff.TimeStamps.verify(message.mtime);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && message.hasOwnProperty("xattrs")) {
                var error = $root.fs.FolderDiff.XAttrs.verify(message.xattrs);
                if (error)
                    return "xattrs." + error;
            }
            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) {
            if (object instanceof $root.fs.FolderDiff)
                return object;
            var message = new $root.fs.FolderDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    (message.currentVersion = $util.Long.fromValue(object.currentVersion)).unsigned = 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.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".fs.FolderDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            if (object.inCurrent) {
                if (!Array.isArray(object.inCurrent))
                    throw TypeError(".fs.FolderDiff.inCurrent: array expected");
                message.inCurrent = [];
                for (var i = 0; i < object.inCurrent.length; ++i) {
                    if (typeof object.inCurrent[i] !== "object")
                        throw TypeError(".fs.FolderDiff.inCurrent: object expected");
                    message.inCurrent[i] = $root.fs.ListingEntryMsg.fromObject(object.inCurrent[i]);
                }
            }
            if (object.inRemote) {
                if (!Array.isArray(object.inRemote))
                    throw TypeError(".fs.FolderDiff.inRemote: array expected");
                message.inRemote = [];
                for (var i = 0; i < object.inRemote.length; ++i) {
                    if (typeof object.inRemote[i] !== "object")
                        throw TypeError(".fs.FolderDiff.inRemote: object expected");
                    message.inRemote[i] = $root.fs.ListingEntryMsg.fromObject(object.inRemote[i]);
                }
            }
            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]);
            }
            if (object.ctime != null) {
                if (typeof object.ctime !== "object")
                    throw TypeError(".fs.FolderDiff.ctime: object expected");
                message.ctime = $root.fs.FolderDiff.TimeStamps.fromObject(object.ctime);
            }
            if (object.mtime != null) {
                if (typeof object.mtime !== "object")
                    throw TypeError(".fs.FolderDiff.mtime: object expected");
                message.mtime = $root.fs.FolderDiff.TimeStamps.fromObject(object.mtime);
            }
            if (object.xattrs != null) {
                if (typeof object.xattrs !== "object")
                    throw TypeError(".fs.FolderDiff.xattrs: object expected");
                message.xattrs = $root.fs.FolderDiff.XAttrs.fromObject(object.xattrs);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults) {
                object.inCurrent = [];
                object.inRemote = [];
                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() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : 0;
                object.remoteVersion = null;
                object.ctime = null;
                object.mtime = null;
                object.xattrs = null;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                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.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            if (message.inCurrent && message.inCurrent.length) {
                object.inCurrent = [];
                for (var j = 0; j < message.inCurrent.length; ++j)
                    object.inCurrent[j] = $root.fs.ListingEntryMsg.toObject(message.inCurrent[j], options);
            }
            if (message.inRemote && message.inRemote.length) {
                object.inRemote = [];
                for (var j = 0; j < message.inRemote.length; ++j)
                    object.inRemote[j] = $root.fs.ListingEntryMsg.toObject(message.inRemote[j], options);
            }
            if (message.nameOverlaps && message.nameOverlaps.length) {
                object.nameOverlaps = [];
                for (var j = 0; j < message.nameOverlaps.length; ++j)
                    object.nameOverlaps[j] = message.nameOverlaps[j];
            }
            if (message.ctime != null && message.hasOwnProperty("ctime"))
                object.ctime = $root.fs.FolderDiff.TimeStamps.toObject(message.ctime, options);
            if (message.mtime != null && message.hasOwnProperty("mtime"))
                object.mtime = $root.fs.FolderDiff.TimeStamps.toObject(message.mtime, options);
            if (message.xattrs != null && message.hasOwnProperty("xattrs"))
                object.xattrs = $root.fs.FolderDiff.XAttrs.toObject(message.xattrs, options);
            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);
        };

        FolderDiff.TimeStamps = (function() {

            /**
             * Properties of a TimeStamps.
             * @memberof fs.FolderDiff
             * @interface ITimeStamps
             * @property {number|Long|null} [current] TimeStamps current
             * @property {common.IUInt64Value|null} [remote] TimeStamps remote
             */

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

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

            /**
             * TimeStamps remote.
             * @member {common.IUInt64Value|null|undefined} remote
             * @memberof fs.FolderDiff.TimeStamps
             * @instance
             */
            TimeStamps.prototype.remote = null;

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

            /**
             * Encodes the specified TimeStamps message. Does not implicitly {@link fs.FolderDiff.TimeStamps.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.ITimeStamps} message TimeStamps message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TimeStamps.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                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"))
                    $root.common.UInt64Value.encode(message.remote, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                return writer;
            };

            /**
             * Encodes the specified TimeStamps message, length delimited. Does not implicitly {@link fs.FolderDiff.TimeStamps.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.ITimeStamps} message TimeStamps message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TimeStamps.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

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

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

            /**
             * Verifies a TimeStamps message.
             * @function verify
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            TimeStamps.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.current != null && message.hasOwnProperty("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 && message.hasOwnProperty("remote")) {
                    var error = $root.common.UInt64Value.verify(message.remote);
                    if (error)
                        return "remote." + error;
                }
                return null;
            };

            /**
             * Creates a TimeStamps message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.TimeStamps} TimeStamps
             */
            TimeStamps.fromObject = function fromObject(object) {
                if (object instanceof $root.fs.FolderDiff.TimeStamps)
                    return object;
                var message = new $root.fs.FolderDiff.TimeStamps();
                if (object.current != null)
                    if ($util.Long)
                        (message.current = $util.Long.fromValue(object.current)).unsigned = 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 (typeof object.remote !== "object")
                        throw TypeError(".fs.FolderDiff.TimeStamps.remote: object expected");
                    message.remote = $root.common.UInt64Value.fromObject(object.remote);
                }
                return message;
            };

            /**
             * Creates a plain object from a TimeStamps message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.TimeStamps} message TimeStamps
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            TimeStamps.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                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() : long;
                    } else
                        object.current = options.longs === String ? "0" : 0;
                    object.remote = null;
                }
                if (message.current != null && message.hasOwnProperty("current"))
                    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 && message.hasOwnProperty("remote"))
                    object.remote = $root.common.UInt64Value.toObject(message.remote, options);
                return object;
            };

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

            return TimeStamps;
        })();

        FolderDiff.XAttrs = (function() {

            /**
             * Properties of a XAttrs.
             * @memberof fs.FolderDiff
             * @interface IXAttrs
             * @property {Array.<file.INameAndXAttrValue>|null} [inCurrent] XAttrs inCurrent
             * @property {Array.<file.INameAndXAttrValue>|null} [inRemote] XAttrs inRemote
             * @property {Array.<string>|null} [nameOverlaps] XAttrs nameOverlaps
             */

            /**
             * Constructs a new XAttrs.
             * @memberof fs.FolderDiff
             * @classdesc Represents a XAttrs.
             * @implements IXAttrs
             * @constructor
             * @param {fs.FolderDiff.IXAttrs=} [properties] Properties to set
             */
            function XAttrs(properties) {
                this.inCurrent = [];
                this.inRemote = [];
                this.nameOverlaps = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * XAttrs inCurrent.
             * @member {Array.<file.INameAndXAttrValue>} inCurrent
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.inCurrent = $util.emptyArray;

            /**
             * XAttrs inRemote.
             * @member {Array.<file.INameAndXAttrValue>} inRemote
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.inRemote = $util.emptyArray;

            /**
             * XAttrs nameOverlaps.
             * @member {Array.<string>} nameOverlaps
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.nameOverlaps = $util.emptyArray;

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

            /**
             * Encodes the specified XAttrs message. Does not implicitly {@link fs.FolderDiff.XAttrs.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.IXAttrs} message XAttrs message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            XAttrs.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.inCurrent != null && message.inCurrent.length)
                    for (var i = 0; i < message.inCurrent.length; ++i)
                        $root.file.NameAndXAttrValue.encode(message.inCurrent[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.inRemote != null && message.inRemote.length)
                    for (var i = 0; i < message.inRemote.length; ++i)
                        $root.file.NameAndXAttrValue.encode(message.inRemote[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.nameOverlaps != null && message.nameOverlaps.length)
                    for (var i = 0; i < message.nameOverlaps.length; ++i)
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.nameOverlaps[i]);
                return writer;
            };

            /**
             * Encodes the specified XAttrs message, length delimited. Does not implicitly {@link fs.FolderDiff.XAttrs.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.IXAttrs} message XAttrs message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            XAttrs.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

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

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

            /**
             * Verifies a XAttrs message.
             * @function verify
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            XAttrs.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.inCurrent != null && message.hasOwnProperty("inCurrent")) {
                    if (!Array.isArray(message.inCurrent))
                        return "inCurrent: array expected";
                    for (var i = 0; i < message.inCurrent.length; ++i) {
                        var error = $root.file.NameAndXAttrValue.verify(message.inCurrent[i]);
                        if (error)
                            return "inCurrent." + error;
                    }
                }
                if (message.inRemote != null && message.hasOwnProperty("inRemote")) {
                    if (!Array.isArray(message.inRemote))
                        return "inRemote: array expected";
                    for (var i = 0; i < message.inRemote.length; ++i) {
                        var error = $root.file.NameAndXAttrValue.verify(message.inRemote[i]);
                        if (error)
                            return "inRemote." + error;
                    }
                }
                if (message.nameOverlaps != null && message.hasOwnProperty("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 XAttrs message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.XAttrs} XAttrs
             */
            XAttrs.fromObject = function fromObject(object) {
                if (object instanceof $root.fs.FolderDiff.XAttrs)
                    return object;
                var message = new $root.fs.FolderDiff.XAttrs();
                if (object.inCurrent) {
                    if (!Array.isArray(object.inCurrent))
                        throw TypeError(".fs.FolderDiff.XAttrs.inCurrent: array expected");
                    message.inCurrent = [];
                    for (var i = 0; i < object.inCurrent.length; ++i) {
                        if (typeof object.inCurrent[i] !== "object")
                            throw TypeError(".fs.FolderDiff.XAttrs.inCurrent: object expected");
                        message.inCurrent[i] = $root.file.NameAndXAttrValue.fromObject(object.inCurrent[i]);
                    }
                }
                if (object.inRemote) {
                    if (!Array.isArray(object.inRemote))
                        throw TypeError(".fs.FolderDiff.XAttrs.inRemote: array expected");
                    message.inRemote = [];
                    for (var i = 0; i < object.inRemote.length; ++i) {
                        if (typeof object.inRemote[i] !== "object")
                            throw TypeError(".fs.FolderDiff.XAttrs.inRemote: object expected");
                        message.inRemote[i] = $root.file.NameAndXAttrValue.fromObject(object.inRemote[i]);
                    }
                }
                if (object.nameOverlaps) {
                    if (!Array.isArray(object.nameOverlaps))
                        throw TypeError(".fs.FolderDiff.XAttrs.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 XAttrs message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.XAttrs} message XAttrs
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            XAttrs.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.arrays || options.defaults) {
                    object.inCurrent = [];
                    object.inRemote = [];
                    object.nameOverlaps = [];
                }
                if (message.inCurrent && message.inCurrent.length) {
                    object.inCurrent = [];
                    for (var j = 0; j < message.inCurrent.length; ++j)
                        object.inCurrent[j] = $root.file.NameAndXAttrValue.toObject(message.inCurrent[j], options);
                }
                if (message.inRemote && message.inRemote.length) {
                    object.inRemote = [];
                    for (var j = 0; j < message.inRemote.length; ++j)
                        object.inRemote[j] = $root.file.NameAndXAttrValue.toObject(message.inRemote[j], options);
                }
                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 XAttrs to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            XAttrs.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            return XAttrs;
        })();

        return FolderDiff;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.path = reader.string();
                    break;
                case 2:
                    message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts);
                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) {
            if (object instanceof $root.fs.FSSyncUploadRequestBody)
                return object;
            var message = new $root.fs.FSSyncUploadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".fs.FSSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options);
            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);
        };

        return FSSyncUploadRequestBody;
    })();

    fs.FSSyncUploadReplyBody = (function() {

        /**
         * Properties of a FSSyncUploadReplyBody.
         * @memberof fs
         * @interface IFSSyncUploadReplyBody
         * @property {common.IUInt64Value|null} [uploadedVersion] FSSyncUploadReplyBody uploadedVersion
         */

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

        /**
         * FSSyncUploadReplyBody uploadedVersion.
         * @member {common.IUInt64Value|null|undefined} uploadedVersion
         * @memberof fs.FSSyncUploadReplyBody
         * @instance
         */
        FSSyncUploadReplyBody.prototype.uploadedVersion = null;

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

        /**
         * Encodes the specified FSSyncUploadReplyBody message. Does not implicitly {@link fs.FSSyncUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {fs.IFSSyncUploadReplyBody} message FSSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadReplyBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

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

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

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

        /**
         * Verifies a FSSyncUploadReplyBody message.
         * @function verify
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncUploadReplyBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion);
                if (error)
                    return "uploadedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FSSyncUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncUploadReplyBody} FSSyncUploadReplyBody
         */
        FSSyncUploadReplyBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSSyncUploadReplyBody)
                return object;
            var message = new $root.fs.FSSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (typeof object.uploadedVersion !== "object")
                    throw TypeError(".fs.FSSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSSyncUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {fs.FSSyncUploadReplyBody} message FSSyncUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncUploadReplyBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options);
            return object;
        };

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

        return FSSyncUploadReplyBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.itemName != null && message.hasOwnProperty("itemName"))
                if (!$util.isString(message.itemName))
                    return "itemName: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.fs.AdoptRemoteFolderItemRequestBody.Options.verify(message.opts);
                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) {
            if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody)
                return object;
            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 (typeof object.opts !== "object")
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.opts: object expected");
                message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.itemName = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.itemName != null && message.hasOwnProperty("itemName"))
                object.itemName = message.itemName;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.toObject(message.opts, options);
            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);
        };

        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
             */

            /**
             * 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)
                            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;

            /**
             * 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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1:
                        message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    case 2:
                        message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.localVersion != null && message.hasOwnProperty("localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion")) {
                    var error = $root.common.UInt64Value.verify(message.uploadVersion);
                    if (error)
                        return "uploadVersion." + 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) {
                if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody.Options)
                    return object;
                var message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                if (object.localVersion != null) {
                    if (typeof object.localVersion !== "object")
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion);
                }
                if (object.uploadVersion != null) {
                    if (typeof object.uploadVersion !== "object")
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.uploadVersion: object expected");
                    message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.uploadVersion = null;
                }
                if (message.localVersion != null && message.hasOwnProperty("localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options);
                if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion"))
                    object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options);
                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);
            };

            return Options;
        })();

        return AdoptRemoteFolderItemRequestBody;
    })();

    return fs;
})();

module.exports = $root;

},{"protobufjs/minimal":255}],13:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.userNum != null && Object.hasOwnProperty.call(message, "userNum"))
                $root.common.UInt32Value.encode(message.userNum, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                $root.common.StringValue.encode(message.appDomain, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.appComponent != null && Object.hasOwnProperty.call(message, "appComponent"))
                $root.common.StringValue.encode(message.appComponent, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.test_stand.SendMsgToOtherLocalTestProcessRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.userNum = $root.common.UInt32Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.appDomain = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.appComponent = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 4:
                    message.msgJson = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.userNum != null && message.hasOwnProperty("userNum")) {
                var error = $root.common.UInt32Value.verify(message.userNum);
                if (error)
                    return "userNum." + error;
            }
            if (message.appDomain != null && message.hasOwnProperty("appDomain")) {
                var error = $root.common.StringValue.verify(message.appDomain);
                if (error)
                    return "appDomain." + error;
            }
            if (message.appComponent != null && message.hasOwnProperty("appComponent")) {
                var error = $root.common.StringValue.verify(message.appComponent);
                if (error)
                    return "appComponent." + error;
            }
            if (message.msgJson != null && message.hasOwnProperty("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) {
            if (object instanceof $root.test_stand.SendMsgToOtherLocalTestProcessRequestBody)
                return object;
            var message = new $root.test_stand.SendMsgToOtherLocalTestProcessRequestBody();
            if (object.userNum != null) {
                if (typeof object.userNum !== "object")
                    throw TypeError(".test_stand.SendMsgToOtherLocalTestProcessRequestBody.userNum: object expected");
                message.userNum = $root.common.UInt32Value.fromObject(object.userNum);
            }
            if (object.appDomain != null) {
                if (typeof object.appDomain !== "object")
                    throw TypeError(".test_stand.SendMsgToOtherLocalTestProcessRequestBody.appDomain: object expected");
                message.appDomain = $root.common.StringValue.fromObject(object.appDomain);
            }
            if (object.appComponent != null) {
                if (typeof object.appComponent !== "object")
                    throw TypeError(".test_stand.SendMsgToOtherLocalTestProcessRequestBody.appComponent: object expected");
                message.appComponent = $root.common.StringValue.fromObject(object.appComponent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.userNum = null;
                object.appDomain = null;
                object.appComponent = null;
                object.msgJson = "";
            }
            if (message.userNum != null && message.hasOwnProperty("userNum"))
                object.userNum = $root.common.UInt32Value.toObject(message.userNum, options);
            if (message.appDomain != null && message.hasOwnProperty("appDomain"))
                object.appDomain = $root.common.StringValue.toObject(message.appDomain, options);
            if (message.appComponent != null && message.hasOwnProperty("appComponent"))
                object.appComponent = $root.common.StringValue.toObject(message.appComponent, options);
            if (message.msgJson != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.userNum != null && Object.hasOwnProperty.call(message, "userNum"))
                $root.common.UInt32Value.encode(message.userNum, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                $root.common.StringValue.encode(message.appDomain, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.appComponent != null && Object.hasOwnProperty.call(message, "appComponent"))
                $root.common.StringValue.encode(message.appComponent, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.test_stand.ObserveOtherTestProcessRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.userNum = $root.common.UInt32Value.decode(reader, reader.uint32());
                    break;
                case 2:
                    message.appDomain = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.appComponent = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.userNum != null && message.hasOwnProperty("userNum")) {
                var error = $root.common.UInt32Value.verify(message.userNum);
                if (error)
                    return "userNum." + error;
            }
            if (message.appDomain != null && message.hasOwnProperty("appDomain")) {
                var error = $root.common.StringValue.verify(message.appDomain);
                if (error)
                    return "appDomain." + error;
            }
            if (message.appComponent != null && message.hasOwnProperty("appComponent")) {
                var error = $root.common.StringValue.verify(message.appComponent);
                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) {
            if (object instanceof $root.test_stand.ObserveOtherTestProcessRequestBody)
                return object;
            var message = new $root.test_stand.ObserveOtherTestProcessRequestBody();
            if (object.userNum != null) {
                if (typeof object.userNum !== "object")
                    throw TypeError(".test_stand.ObserveOtherTestProcessRequestBody.userNum: object expected");
                message.userNum = $root.common.UInt32Value.fromObject(object.userNum);
            }
            if (object.appDomain != null) {
                if (typeof object.appDomain !== "object")
                    throw TypeError(".test_stand.ObserveOtherTestProcessRequestBody.appDomain: object expected");
                message.appDomain = $root.common.StringValue.fromObject(object.appDomain);
            }
            if (object.appComponent != null) {
                if (typeof object.appComponent !== "object")
                    throw TypeError(".test_stand.ObserveOtherTestProcessRequestBody.appComponent: object expected");
                message.appComponent = $root.common.StringValue.fromObject(object.appComponent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.userNum = null;
                object.appDomain = null;
                object.appComponent = null;
            }
            if (message.userNum != null && message.hasOwnProperty("userNum"))
                object.userNum = $root.common.UInt32Value.toObject(message.userNum, options);
            if (message.appDomain != null && message.hasOwnProperty("appDomain"))
                object.appDomain = $root.common.StringValue.toObject(message.appDomain, options);
            if (message.appComponent != null && message.hasOwnProperty("appComponent"))
                object.appComponent = $root.common.StringValue.toObject(message.appComponent, options);
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.values && message.values.length))
                        message.values = [];
                    message.values.push(reader.string());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint32();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bytes();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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)
                    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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.runtimeExcJson = reader.string();
                    break;
                case 2:
                    message.err = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        return AnyValue;
    })();

    return common;
})();

module.exports = $root;

},{"protobufjs/minimal":255}],14:[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.user_notifications = (function() {

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

    user_notifications.AddNotificationRequestBody = (function() {

        /**
         * Properties of an AddNotificationRequestBody.
         * @memberof user_notifications
         * @interface IAddNotificationRequestBody
         * @property {user_notifications.AddNotificationRequestBody.INotificationOpts|null} [opts] AddNotificationRequestBody opts
         */

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

        /**
         * AddNotificationRequestBody opts.
         * @member {user_notifications.AddNotificationRequestBody.INotificationOpts|null|undefined} opts
         * @memberof user_notifications.AddNotificationRequestBody
         * @instance
         */
        AddNotificationRequestBody.prototype.opts = null;

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

        /**
         * Encodes the specified AddNotificationRequestBody message. Does not implicitly {@link user_notifications.AddNotificationRequestBody.verify|verify} messages.
         * @function encode
         * @memberof user_notifications.AddNotificationRequestBody
         * @static
         * @param {user_notifications.IAddNotificationRequestBody} message AddNotificationRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AddNotificationRequestBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.user_notifications.AddNotificationRequestBody.NotificationOpts.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

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

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

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

        /**
         * Verifies an AddNotificationRequestBody message.
         * @function verify
         * @memberof user_notifications.AddNotificationRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AddNotificationRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.user_notifications.AddNotificationRequestBody.NotificationOpts.verify(message.opts);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AddNotificationRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof user_notifications.AddNotificationRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {user_notifications.AddNotificationRequestBody} AddNotificationRequestBody
         */
        AddNotificationRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.user_notifications.AddNotificationRequestBody)
                return object;
            var message = new $root.user_notifications.AddNotificationRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".user_notifications.AddNotificationRequestBody.opts: object expected");
                message.opts = $root.user_notifications.AddNotificationRequestBody.NotificationOpts.fromObject(object.opts);
            }
            return message;
        };

        /**
         * Creates a plain object from an AddNotificationRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof user_notifications.AddNotificationRequestBody
         * @static
         * @param {user_notifications.AddNotificationRequestBody} message AddNotificationRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AddNotificationRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.user_notifications.AddNotificationRequestBody.NotificationOpts.toObject(message.opts, options);
            return object;
        };

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

        AddNotificationRequestBody.NotificationOpts = (function() {

            /**
             * Properties of a NotificationOpts.
             * @memberof user_notifications.AddNotificationRequestBody
             * @interface INotificationOpts
             * @property {common.IStringValue|null} [title] NotificationOpts title
             * @property {common.IStringValue|null} [body] NotificationOpts body
             */

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

            /**
             * NotificationOpts title.
             * @member {common.IStringValue|null|undefined} title
             * @memberof user_notifications.AddNotificationRequestBody.NotificationOpts
             * @instance
             */
            NotificationOpts.prototype.title = null;

            /**
             * NotificationOpts body.
             * @member {common.IStringValue|null|undefined} body
             * @memberof user_notifications.AddNotificationRequestBody.NotificationOpts
             * @instance
             */
            NotificationOpts.prototype.body = null;

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

            /**
             * Encodes the specified NotificationOpts message. Does not implicitly {@link user_notifications.AddNotificationRequestBody.NotificationOpts.verify|verify} messages.
             * @function encode
             * @memberof user_notifications.AddNotificationRequestBody.NotificationOpts
             * @static
             * @param {user_notifications.AddNotificationRequestBody.INotificationOpts} message NotificationOpts message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            NotificationOpts.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.title != null && Object.hasOwnProperty.call(message, "title"))
                    $root.common.StringValue.encode(message.title, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.body != null && Object.hasOwnProperty.call(message, "body"))
                    $root.common.StringValue.encode(message.body, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                return writer;
            };

            /**
             * Encodes the specified NotificationOpts message, length delimited. Does not implicitly {@link user_notifications.AddNotificationRequestBody.NotificationOpts.verify|verify} messages.
             * @function encodeDelimited
             * @memberof user_notifications.AddNotificationRequestBody.NotificationOpts
             * @static
             * @param {user_notifications.AddNotificationRequestBody.INotificationOpts} message NotificationOpts message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            NotificationOpts.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

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

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

            /**
             * Verifies a NotificationOpts message.
             * @function verify
             * @memberof user_notifications.AddNotificationRequestBody.NotificationOpts
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            NotificationOpts.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.title != null && message.hasOwnProperty("title")) {
                    var error = $root.common.StringValue.verify(message.title);
                    if (error)
                        return "title." + error;
                }
                if (message.body != null && message.hasOwnProperty("body")) {
                    var error = $root.common.StringValue.verify(message.body);
                    if (error)
                        return "body." + error;
                }
                return null;
            };

            /**
             * Creates a NotificationOpts message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof user_notifications.AddNotificationRequestBody.NotificationOpts
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {user_notifications.AddNotificationRequestBody.NotificationOpts} NotificationOpts
             */
            NotificationOpts.fromObject = function fromObject(object) {
                if (object instanceof $root.user_notifications.AddNotificationRequestBody.NotificationOpts)
                    return object;
                var message = new $root.user_notifications.AddNotificationRequestBody.NotificationOpts();
                if (object.title != null) {
                    if (typeof object.title !== "object")
                        throw TypeError(".user_notifications.AddNotificationRequestBody.NotificationOpts.title: object expected");
                    message.title = $root.common.StringValue.fromObject(object.title);
                }
                if (object.body != null) {
                    if (typeof object.body !== "object")
                        throw TypeError(".user_notifications.AddNotificationRequestBody.NotificationOpts.body: object expected");
                    message.body = $root.common.StringValue.fromObject(object.body);
                }
                return message;
            };

            /**
             * Creates a plain object from a NotificationOpts message. Also converts values to other types if specified.
             * @function toObject
             * @memberof user_notifications.AddNotificationRequestBody.NotificationOpts
             * @static
             * @param {user_notifications.AddNotificationRequestBody.NotificationOpts} message NotificationOpts
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            NotificationOpts.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.title = null;
                    object.body = null;
                }
                if (message.title != null && message.hasOwnProperty("title"))
                    object.title = $root.common.StringValue.toObject(message.title, options);
                if (message.body != null && message.hasOwnProperty("body"))
                    object.body = $root.common.StringValue.toObject(message.body, options);
                return object;
            };

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

            return NotificationOpts;
        })();

        return AddNotificationRequestBody;
    })();

    user_notifications.AddNotificationReplyBody = (function() {

        /**
         * Properties of an AddNotificationReplyBody.
         * @memberof user_notifications
         * @interface IAddNotificationReplyBody
         * @property {number|Long|null} [notificationId] AddNotificationReplyBody notificationId
         */

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

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

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

        /**
         * Encodes the specified AddNotificationReplyBody message. Does not implicitly {@link user_notifications.AddNotificationReplyBody.verify|verify} messages.
         * @function encode
         * @memberof user_notifications.AddNotificationReplyBody
         * @static
         * @param {user_notifications.IAddNotificationReplyBody} message AddNotificationReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AddNotificationReplyBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.notificationId != null && Object.hasOwnProperty.call(message, "notificationId"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.notificationId);
            return writer;
        };

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

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

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

        /**
         * Verifies an AddNotificationReplyBody message.
         * @function verify
         * @memberof user_notifications.AddNotificationReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AddNotificationReplyBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.notificationId != null && message.hasOwnProperty("notificationId"))
                if (!$util.isInteger(message.notificationId) && !(message.notificationId && $util.isInteger(message.notificationId.low) && $util.isInteger(message.notificationId.high)))
                    return "notificationId: integer|Long expected";
            return null;
        };

        /**
         * Creates an AddNotificationReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof user_notifications.AddNotificationReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {user_notifications.AddNotificationReplyBody} AddNotificationReplyBody
         */
        AddNotificationReplyBody.fromObject = function fromObject(object) {
            if (object instanceof $root.user_notifications.AddNotificationReplyBody)
                return object;
            var message = new $root.user_notifications.AddNotificationReplyBody();
            if (object.notificationId != null)
                if ($util.Long)
                    (message.notificationId = $util.Long.fromValue(object.notificationId)).unsigned = true;
                else if (typeof object.notificationId === "string")
                    message.notificationId = parseInt(object.notificationId, 10);
                else if (typeof object.notificationId === "number")
                    message.notificationId = object.notificationId;
                else if (typeof object.notificationId === "object")
                    message.notificationId = new $util.LongBits(object.notificationId.low >>> 0, object.notificationId.high >>> 0).toNumber(true);
            return message;
        };

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

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

        return AddNotificationReplyBody;
    })();

    user_notifications.RemoveNotificationRequestBody = (function() {

        /**
         * Properties of a RemoveNotificationRequestBody.
         * @memberof user_notifications
         * @interface IRemoveNotificationRequestBody
         * @property {number|Long|null} [id] RemoveNotificationRequestBody id
         */

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

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

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

        /**
         * Encodes the specified RemoveNotificationRequestBody message. Does not implicitly {@link user_notifications.RemoveNotificationRequestBody.verify|verify} messages.
         * @function encode
         * @memberof user_notifications.RemoveNotificationRequestBody
         * @static
         * @param {user_notifications.IRemoveNotificationRequestBody} message RemoveNotificationRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RemoveNotificationRequestBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id);
            return writer;
        };

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

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

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

        /**
         * Verifies a RemoveNotificationRequestBody message.
         * @function verify
         * @memberof user_notifications.RemoveNotificationRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RemoveNotificationRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.id != null && message.hasOwnProperty("id"))
                if (!$util.isInteger(message.id) && !(message.id && $util.isInteger(message.id.low) && $util.isInteger(message.id.high)))
                    return "id: integer|Long expected";
            return null;
        };

        /**
         * Creates a RemoveNotificationRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof user_notifications.RemoveNotificationRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {user_notifications.RemoveNotificationRequestBody} RemoveNotificationRequestBody
         */
        RemoveNotificationRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.user_notifications.RemoveNotificationRequestBody)
                return object;
            var message = new $root.user_notifications.RemoveNotificationRequestBody();
            if (object.id != null)
                if ($util.Long)
                    (message.id = $util.Long.fromValue(object.id)).unsigned = true;
                else if (typeof object.id === "string")
                    message.id = parseInt(object.id, 10);
                else if (typeof object.id === "number")
                    message.id = object.id;
                else if (typeof object.id === "object")
                    message.id = new $util.LongBits(object.id.low >>> 0, object.id.high >>> 0).toNumber(true);
            return message;
        };

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

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

        return RemoveNotificationRequestBody;
    })();

    user_notifications.UserNotificationEvent = (function() {

        /**
         * Properties of a UserNotificationEvent.
         * @memberof user_notifications
         * @interface IUserNotificationEvent
         * @property {number|Long|null} [notificationId] UserNotificationEvent notificationId
         * @property {string|null} [type] UserNotificationEvent type
         * @property {boolean|null} [focusAppWindow] UserNotificationEvent focusAppWindow
         */

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

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

        /**
         * UserNotificationEvent type.
         * @member {string} type
         * @memberof user_notifications.UserNotificationEvent
         * @instance
         */
        UserNotificationEvent.prototype.type = "";

        /**
         * UserNotificationEvent focusAppWindow.
         * @member {boolean} focusAppWindow
         * @memberof user_notifications.UserNotificationEvent
         * @instance
         */
        UserNotificationEvent.prototype.focusAppWindow = false;

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

        /**
         * Encodes the specified UserNotificationEvent message. Does not implicitly {@link user_notifications.UserNotificationEvent.verify|verify} messages.
         * @function encode
         * @memberof user_notifications.UserNotificationEvent
         * @static
         * @param {user_notifications.IUserNotificationEvent} message UserNotificationEvent message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UserNotificationEvent.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.notificationId != null && Object.hasOwnProperty.call(message, "notificationId"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.notificationId);
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.type);
            if (message.focusAppWindow != null && Object.hasOwnProperty.call(message, "focusAppWindow"))
                writer.uint32(/* id 3, wireType 0 =*/24).bool(message.focusAppWindow);
            return writer;
        };

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

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

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

        /**
         * Verifies a UserNotificationEvent message.
         * @function verify
         * @memberof user_notifications.UserNotificationEvent
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UserNotificationEvent.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.notificationId != null && message.hasOwnProperty("notificationId"))
                if (!$util.isInteger(message.notificationId) && !(message.notificationId && $util.isInteger(message.notificationId.low) && $util.isInteger(message.notificationId.high)))
                    return "notificationId: integer|Long expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.focusAppWindow != null && message.hasOwnProperty("focusAppWindow"))
                if (typeof message.focusAppWindow !== "boolean")
                    return "focusAppWindow: boolean expected";
            return null;
        };

        /**
         * Creates a UserNotificationEvent message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof user_notifications.UserNotificationEvent
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {user_notifications.UserNotificationEvent} UserNotificationEvent
         */
        UserNotificationEvent.fromObject = function fromObject(object) {
            if (object instanceof $root.user_notifications.UserNotificationEvent)
                return object;
            var message = new $root.user_notifications.UserNotificationEvent();
            if (object.notificationId != null)
                if ($util.Long)
                    (message.notificationId = $util.Long.fromValue(object.notificationId)).unsigned = true;
                else if (typeof object.notificationId === "string")
                    message.notificationId = parseInt(object.notificationId, 10);
                else if (typeof object.notificationId === "number")
                    message.notificationId = object.notificationId;
                else if (typeof object.notificationId === "object")
                    message.notificationId = new $util.LongBits(object.notificationId.low >>> 0, object.notificationId.high >>> 0).toNumber(true);
            if (object.type != null)
                message.type = String(object.type);
            if (object.focusAppWindow != null)
                message.focusAppWindow = Boolean(object.focusAppWindow);
            return message;
        };

        /**
         * Creates a plain object from a UserNotificationEvent message. Also converts values to other types if specified.
         * @function toObject
         * @memberof user_notifications.UserNotificationEvent
         * @static
         * @param {user_notifications.UserNotificationEvent} message UserNotificationEvent
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UserNotificationEvent.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.notificationId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                } else
                    object.notificationId = options.longs === String ? "0" : 0;
                object.type = "";
                object.focusAppWindow = false;
            }
            if (message.notificationId != null && message.hasOwnProperty("notificationId"))
                if (typeof message.notificationId === "number")
                    object.notificationId = options.longs === String ? String(message.notificationId) : message.notificationId;
                else
                    object.notificationId = options.longs === String ? $util.Long.prototype.toString.call(message.notificationId) : options.longs === Number ? new $util.LongBits(message.notificationId.low >>> 0, message.notificationId.high >>> 0).toNumber(true) : message.notificationId;
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.focusAppWindow != null && message.hasOwnProperty("focusAppWindow"))
                object.focusAppWindow = message.focusAppWindow;
            return object;
        };

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

        return UserNotificationEvent;
    })();

    return user_notifications;
})();

$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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bool();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    if (!(message.values && message.values.length))
                        message.values = [];
                    message.values.push(reader.string());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint64();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.uint32();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.value = reader.bytes();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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)
                    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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.runtimeExcJson = reader.string();
                    break;
                case 2:
                    message.err = reader.string();
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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);
        };

        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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1:
                    message.type = reader.string();
                    break;
                case 2:
                    message.json = $root.common.StringValue.decode(reader, reader.uint32());
                    break;
                case 3:
                    message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                    break;
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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);
        };

        return AnyValue;
    })();

    return common;
})();

module.exports = $root;

},{"protobufjs/minimal":255}],15:[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.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("../ipc-with-core/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 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);

},{"../ipc-with-core/protobuf-msg":3,"../protos/rpc.proto":11,"./passed-datum":18,"core-3nweb-client-lib/build/ipc":112,"rxjs":287,"rxjs/operators":512}],16:[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.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("../ipc-with-core/protobuf-msg");
const protobuf_msg_2 = require("../ipc-with-core/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);
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);

},{"../ipc-with-core/protobuf-msg":3,"../protos/rpc.proto":11,"./passed-datum":18,"core-3nweb-client-lib/build/ipc":112,"rxjs":287,"rxjs/operators":512}],17:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 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.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");
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'));
    }
    return rpc;
}
Object.freeze(exports);

},{"./client-caps-ipc":15,"./expose-service-cap-ipc":16}],18:[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("../ipc-with-core/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);

},{"../ipc-with-core/protobuf-msg":3,"../protos/rpc.proto":11,"core-3nweb-client-lib/build/ipc":112}],19:[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.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("../lib-common/buffer-utils");
const test_stand_cap_ipc_1 = require("../test-stand/test-stand-cap-ipc");
const client_side_w3n_1 = require("../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
    });
    return clientW3N;
}
function makeW3N(ipc) {
    const clientSide = makeClientSideConnector(ipc);
    return (0, client_side_w3n_1.makeClientSideW3N)(clientSide);
}
Object.freeze(exports);

},{"../core/client-side-w3n":2,"../lib-common/buffer-utils":4,"../test-stand/test-stand-cap-ipc":26,"core-3nweb-client-lib/build/ipc":112,"rxjs":287}],20:[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 });
const renderer_side_wrap_1 = require("./renderer-side-wrap");
window.w3n = (0, renderer_side_wrap_1.makeStartupW3N)(window['make.w3n.ipc']());

},{"./renderer-side-wrap":19}],21:[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.exposeFileDialogsCAP = exposeFileDialogsCAP;
exports.makeFileDialogs = makeFileDialogs;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const protobuf_msg_1 = require("../../ipc-with-core/protobuf-msg");
const file_dialogs_proto_1 = require("../../protos/file_dialogs.proto");
function exposeFileDialogsCAP(cap, expServices) {
    const exposed = {};
    if (cap.openFileDialog) {
        exposed.openFileDialog = openFileDialog.wrapService(cap.openFileDialog, expServices);
    }
    if (cap.openFolderDialog) {
        exposed.openFolderDialog = openFolderDialog.wrapService(cap.openFolderDialog, expServices);
    }
    if (cap.saveFileDialog) {
        exposed.saveFileDialog = saveFileDialog.wrapService(cap.saveFileDialog, expServices);
    }
    if (cap.saveFolderDialog) {
        exposed.saveFolderDialog = saveFolderDialog.wrapService(cap.saveFolderDialog, expServices);
    }
    return exposed;
}
function makeFileDialogs(caller, objPath, exposed) {
    const dialogs = {};
    if (exposed.includes('openFileDialog')) {
        dialogs.openFileDialog = openFileDialog.makeCaller(caller, objPath);
    }
    if (exposed.includes('openFolderDialog')) {
        dialogs.openFolderDialog = openFolderDialog.makeCaller(caller, objPath);
    }
    if (exposed.includes('saveFileDialog')) {
        dialogs.saveFileDialog = saveFileDialog.makeCaller(caller, objPath);
    }
    if (exposed.includes('saveFolderDialog')) {
        dialogs.saveFolderDialog = saveFolderDialog.makeCaller(caller, objPath);
    }
    return dialogs;
}
const saveDialogArgsType = protobuf_msg_1.ProtoType.for(file_dialogs_proto_1.file_dialogs.SaveDialogArgs);
var saveFileDialog;
(function (saveFileDialog) {
    const replyType = protobuf_msg_1.ProtoType.for(file_dialogs_proto_1.file_dialogs.SaveFileDialogReplyBody);
    function wrapService(fn, expServices) {
        return bytes => {
            const { btnLabel, defaultPath, title, filters } = saveDialogArgsType.unpack(bytes);
            const promise = fn(title, btnLabel, defaultPath, filters)
                .then(fileObj => {
                const file = (fileObj ?
                    (0, ipc_1.exposeFileService)(fileObj, expServices) : undefined);
                return replyType.pack({ file });
            });
            return { promise };
        };
    }
    saveFileDialog.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = objPath.concat('saveFileDialog');
        return async (title, btnLabel, defaultPath, filters) => {
            const req = saveDialogArgsType.pack({
                title, btnLabel, defaultPath, filters
            });
            const buf = await caller.startPromiseCall(path, req);
            const reply = replyType.unpack(buf);
            return (reply.file ?
                (0, ipc_1.makeFileCaller)(caller, reply.file) :
                undefined);
        };
    }
    saveFileDialog.makeCaller = makeCaller;
})(saveFileDialog || (saveFileDialog = {}));
Object.freeze(saveFileDialog);
var saveFolderDialog;
(function (saveFolderDialog) {
    const replyType = protobuf_msg_1.ProtoType.for(file_dialogs_proto_1.file_dialogs.SaveFolderDialogReplyBody);
    function wrapService(fn, expServices) {
        return bytes => {
            const { btnLabel, defaultPath, title, filters } = saveDialogArgsType.unpack(bytes);
            const promise = fn(title, btnLabel, defaultPath, filters)
                .then(fsObj => {
                const folder = (fsObj ?
                    (0, ipc_1.exposeFSService)(fsObj, expServices) : undefined);
                return replyType.pack({ folder });
            });
            return { promise };
        };
    }
    saveFolderDialog.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = objPath.concat('saveFolderDialog');
        return async (title, btnLabel, defaultPath, filters) => {
            const req = saveDialogArgsType.pack({
                title, btnLabel, defaultPath, filters
            });
            const buf = await caller.startPromiseCall(path, req);
            const reply = replyType.unpack(buf);
            return (reply.folder ?
                (0, ipc_1.makeFSCaller)(caller, reply.folder) :
                undefined);
        };
    }
    saveFolderDialog.makeCaller = makeCaller;
})(saveFolderDialog || (saveFolderDialog = {}));
Object.freeze(saveFolderDialog);
const openDialogArgsType = protobuf_msg_1.ProtoType.for(file_dialogs_proto_1.file_dialogs.OpenDialogArgs);
var openFileDialog;
(function (openFileDialog) {
    const replyType = protobuf_msg_1.ProtoType.for(file_dialogs_proto_1.file_dialogs.OpenFileDialogReplyBody);
    function wrapService(fn, expServices) {
        return bytes => {
            const { btnLabel, multiSelections, title, filters } = openDialogArgsType.unpack(bytes);
            const promise = fn(title, btnLabel, multiSelections, filters)
                .then(fileObjs => {
                const files = (fileObjs ?
                    fileObjs.map(f => (0, ipc_1.exposeFileService)(f, expServices)) :
                    undefined);
                return replyType.pack({ files });
            });
            return { promise };
        };
    }
    openFileDialog.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = objPath.concat('openFileDialog');
        return async (title, btnLabel, multiSelections, filters) => {
            const req = openDialogArgsType.pack({
                title, btnLabel, multiSelections, filters
            });
            const buf = await caller.startPromiseCall(path, req);
            const reply = replyType.unpack(buf);
            if (reply.files && (reply.files.length > 0)) {
                return reply.files.map(fMsg => (0, ipc_1.makeFileCaller)(caller, fMsg));
            }
            else {
                return undefined;
            }
        };
    }
    openFileDialog.makeCaller = makeCaller;
})(openFileDialog || (openFileDialog = {}));
Object.freeze(openFileDialog);
var openFolderDialog;
(function (openFolderDialog) {
    const replyType = protobuf_msg_1.ProtoType.for(file_dialogs_proto_1.file_dialogs.OpenFolderDialogReplyBody);
    function wrapService(fn, expServices) {
        return bytes => {
            const { btnLabel, multiSelections, title, filters } = openDialogArgsType.unpack(bytes);
            const promise = fn(title, btnLabel, multiSelections, filters)
                .then(fsObjs => {
                const folders = (fsObjs ?
                    fsObjs.map(f => (0, ipc_1.exposeFSService)(f, expServices)) :
                    undefined);
                return replyType.pack({ folders });
            });
            return { promise };
        };
    }
    openFolderDialog.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = objPath.concat('openFolderDialog');
        return async (title, btnLabel, multiSelections, filters) => {
            const req = openDialogArgsType.pack({
                title, btnLabel, multiSelections, filters
            });
            const buf = await caller.startPromiseCall(path, req);
            const reply = replyType.unpack(buf);
            if (reply.folders && (reply.folders.length > 0)) {
                const folders = reply.folders.map(fsMsg => (0, ipc_1.makeFSCaller)(caller, fsMsg));
                return folders;
            }
            else {
                return undefined;
            }
        };
    }
    openFolderDialog.makeCaller = makeCaller;
})(openFolderDialog || (openFolderDialog = {}));
Object.freeze(openFolderDialog);
Object.freeze(exports);

},{"../../ipc-with-core/protobuf-msg":3,"../../protos/file_dialogs.proto":10,"core-3nweb-client-lib/build/ipc":112}],22:[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("../../ipc-with-core/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);

},{"../../ipc-with-core/protobuf-msg":3,"../../protos/shell_fs_resource.proto":12,"core-3nweb-client-lib/build/ipc":112}],23:[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.makeShellCaller = makeShellCaller;
exports.promiseShellCaller = promiseShellCaller;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const file_dialogs_cap_ipc_1 = require("../shell/file-dialogs/file-dialogs-cap-ipc");
const user_notifications_cap_ipc_1 = require("../shell/user-notifications/user-notifications-cap-ipc");
const fs_resource_caps_ipc_1 = require("./fs-resource/fs-resource-caps-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);
    }
    return makeShellFollowingListing(shellCAPs, dialogFns, 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));
    }
    return makeShellFollowingListing(shellCAPs, dialogFns, caller, objPath);
}
function shellCall(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function makeShellFollowingListing(shellCAPs, dialogFns, 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('getStartedCmd')) {
        shell.getStartedCmd = shellCall(caller, objPath, 'getStartedCmd');
    }
    if (shellCAPs.includes('watchStartCmds')) {
        shell.watchStartCmds = ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('watchStartCmds'));
    }
    if (shellCAPs.includes('startAppWithParams')) {
        shell.startAppWithParams = shellCall(caller, objPath, 'startAppWithParams');
    }
    if (shellCAPs.includes('getFSResource')) {
        const fnPath = objPath.concat('getFSResource');
        shell.getFSResource = (0, fs_resource_caps_ipc_1.makeGetFSResource)(caller, fnPath);
    }
    if (shellCAPs.includes('openDashboard')) {
        const fnPath = objPath.concat('openDashboard');
        shell.openDashboard = shellCall(caller, objPath, 'openDashboard');
    }
    return shell;
}
Object.freeze(exports);

},{"../shell/file-dialogs/file-dialogs-cap-ipc":21,"../shell/user-notifications/user-notifications-cap-ipc":24,"./fs-resource/fs-resource-caps-ipc":22,"core-3nweb-client-lib/build/ipc":112}],24:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 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.exposeUserNotificationsCAP = exposeUserNotificationsCAP;
exports.makeUserNotifications = makeUserNotifications;
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const protobuf_msg_1 = require("../../ipc-with-core/protobuf-msg");
const utils_for_observables_1 = require("../../lib-common/utils-for-observables");
const user_notifications_proto_1 = require("../../protos/user_notifications.proto");
function exposeUserNotificationsCAP(cap) {
    return {
        addNotification: addNotification.wrapService(cap.addNotification),
        removeNotification: removeNotification.wrapService(cap.removeNotification),
        watch: watch.wrapService(cap.watch)
    };
}
function makeUserNotifications(caller, objPath) {
    return {
        addNotification: addNotification.makeCaller(caller, objPath),
        removeNotification: removeNotification.makeCaller(caller, objPath),
        watch: watch.makeCaller(caller, objPath)
    };
}
function notifOptsToMsg(opts) {
    return {
        body: (0, protobuf_msg_1.toOptVal)(opts.body),
        title: (0, protobuf_msg_1.toOptVal)(opts.title),
        focusAppWindow: opts.focusAppWindow
    };
}
function notifOptsFromMsg(msg) {
    return {
        body: (0, protobuf_msg_1.valOfOpt)(msg.body),
        title: (0, protobuf_msg_1.valOfOpt)(msg.title),
        focusAppWindow: msg.focusAppWindow
    };
}
var addNotification;
(function (addNotification) {
    const requestType = protobuf_msg_1.ProtoType.for(user_notifications_proto_1.user_notifications.AddNotificationRequestBody);
    const replyType = protobuf_msg_1.ProtoType.for(user_notifications_proto_1.user_notifications.AddNotificationReplyBody);
    function wrapService(fn) {
        return buf => {
            const opts = notifOptsFromMsg(requestType.unpack(buf).opts);
            const promise = fn(opts)
                .then(notificationId => replyType.pack({ notificationId }));
            return { promise };
        };
    }
    addNotification.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = objPath.concat('addNotification');
        return opts => caller.startPromiseCall(ipcPath, requestType.pack({
            opts: notifOptsToMsg(opts)
        }))
            .then(buf => (0, protobuf_msg_1.fixInt)(replyType.unpack(buf).notificationId));
    }
    addNotification.makeCaller = makeCaller;
})(addNotification || (addNotification = {}));
Object.freeze(addNotification);
var removeNotification;
(function (removeNotification) {
    const requestType = protobuf_msg_1.ProtoType.for(user_notifications_proto_1.user_notifications.RemoveNotificationRequestBody);
    function wrapService(fn) {
        return buf => {
            const id = (0, protobuf_msg_1.fixInt)(requestType.unpack(buf).id);
            const promise = fn(id);
            return { promise };
        };
    }
    removeNotification.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = objPath.concat('removeNotification');
        return id => caller.startPromiseCall(ipcPath, requestType.pack({
            id
        }));
    }
    removeNotification.makeCaller = makeCaller;
})(removeNotification || (removeNotification = {}));
Object.freeze(removeNotification);
var watch;
(function (watch) {
    const eventType = protobuf_msg_1.ProtoType.for(user_notifications_proto_1.user_notifications.UserNotificationEvent);
    function wrapService(fn) {
        return () => {
            const s = new rxjs_1.Subject();
            const obs = s.asObservable().pipe((0, operators_1.map)(ev => eventType.pack(ev)));
            const onCancel = fn(s);
            return { obs, onCancel };
        };
    }
    watch.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = objPath.concat('watch');
        return obs => {
            const s = new rxjs_1.Subject();
            const unsub = caller.startObservableCall(ipcPath, undefined, s);
            s.pipe((0, operators_1.map)(buf => {
                const { notificationId, type } = eventType.unpack(buf);
                return { notificationId: (0, protobuf_msg_1.fixInt)(notificationId), type };
            }))
                .subscribe((0, utils_for_observables_1.toRxObserver)(obs));
            return unsub;
        };
    }
    watch.makeCaller = makeCaller;
})(watch || (watch = {}));
Object.freeze(watch);
Object.freeze(exports);

},{"../../ipc-with-core/protobuf-msg":3,"../../lib-common/utils-for-observables":6,"../../protos/user_notifications.proto":14,"rxjs":287,"rxjs/operators":512}],25:[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.makeSystemCaller = makeSystemCaller;
exports.promiseSystemCaller = promiseSystemCaller;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
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);
    return makeSystemBasedOnListing(caller, sysPath, lstSystemCAP, lstAppsCAP);
}
function makeSystemBasedOnListing(caller, sysPath, lstSystemCAP, 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 = makePlatformDownloaderCaller(caller, platformPath);
    }
    if (lstSystemCAP.includes('monitor')) {
        const platformPath = sysPath.concat('monitor');
        system.monitor = makeSystemMonitorCaller(caller, platformPath);
    }
    if (lstSystemCAP.includes('logout')) {
        const logoutPath = sysPath.concat('logout');
        system.logout = ipc_1.callerSideJSONWrap.makeReqRepFuncCaller(caller, logoutPath);
    }
    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);
    return makeSystemBasedOnListing(caller, sysPath, lstSystemCAP, 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'));
            return (appPackFS, obs) => fn(obs, appPackFS);
        })(),
        addAppPackFromZipFile: (() => {
            const fn = ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('addAppPackFromZipFile'));
            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 makePlatformDownloaderCaller(caller, objPath) {
    return {
        getCurrentVersion: callPlatform(caller, objPath, 'getCurrentVersion'),
        getChannels: callPlatform(caller, objPath, 'getChannels'),
        getLatestVersion: callPlatform(caller, objPath, 'getLatestVersion'),
        setupUpdater: (() => {
            const fn = ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('setupUpdater'));
            return (newBundleVersion, obs) => fn(obs, newBundleVersion);
        })(),
        downloadUpdate: callPlatform(caller, objPath, 'downloadUpdate'),
        quitAndInstall: callPlatform(caller, objPath, 'quitAndInstall'),
        wipeFromThisDevice: callPlatform(caller, objPath, 'wipeFromThisDevice')
    };
}
function callPlatform(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);
}
Object.freeze(exports);

},{"core-3nweb-client-lib/build/ipc":112}],26:[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("../ipc-with-core/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);

},{"../ipc-with-core/protobuf-msg":3,"../protos/test_stand.proto":13,"core-3nweb-client-lib/build/ipc":112,"rxjs":287,"rxjs/operators":512}],27:[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":112}],28:[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);
            }
        }
    });
}

},{}],29:[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);
};

},{}],30:[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 = {};
}

/**
 * Registers an event listener.
 * @param {string} evt Event name
 * @param {function} fn Listener
 * @param {*} [ctx] Listener context
 * @returns {util.EventEmitter} `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 {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.
 * @returns {util.EventEmitter} `this`
 */
EventEmitter.prototype.off = function off(evt, fn) {
    if (evt === undefined)
        this._listeners = {};
    else {
        if (fn === undefined)
            this._listeners[evt] = [];
        else {
            var listeners = this._listeners[evt];
            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 {util.EventEmitter} `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;
};

},{}],31:[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;
}

},{}],32:[function(require,module,exports){
"use strict";
module.exports = inquire;

/**
 * Requires a module only if available.
 * @memberof util
 * @param {string} moduleName Module to require
 * @returns {?Object} Required module if available and not empty, otherwise `null`
 */
function inquire(moduleName) {
    try {
        var mod = eval("quire".replace(/^/,"re"))(moduleName); // eslint-disable-line no-eval
        if (mod && (mod.length || Object.keys(mod).length))
            return mod;
    } catch (e) {} // eslint-disable-line no-empty
    return null;
}

},{}],33:[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;
    };
}

},{}],34:[function(require,module,exports){
"use strict";

/**
 * A minimal UTF8 implementation for number arrays.
 * @memberof util
 * @namespace
 */
var utf8 = exports;

/**
 * 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) {
    var len = end - start;
    if (len < 1)
        return "";
    var parts = null,
        chunk = [],
        i = 0, // char offset
        t;     // temporary
    while (start < end) {
        t = buffer[start++];
        if (t < 128)
            chunk[i++] = t;
        else if (t > 191 && t < 224)
            chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;
        else if (t > 239 && t < 365) {
            t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;
            chunk[i++] = 0xD800 + (t >> 10);
            chunk[i++] = 0xDC00 + (t & 1023);
        } else
            chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;
        if (i > 8191) {
            (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));
            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;
};

},{}],35:[function(require,module,exports){
var asn1 = exports;

asn1.bignum = require('bn.js');

asn1.define = require('./asn1/api').define;
asn1.base = require('./asn1/base');
asn1.constants = require('./asn1/constants');
asn1.decoders = require('./asn1/decoders');
asn1.encoders = require('./asn1/encoders');

},{"./asn1/api":36,"./asn1/base":38,"./asn1/constants":42,"./asn1/decoders":44,"./asn1/encoders":47,"bn.js":49}],36:[function(require,module,exports){
var asn1 = require('../asn1');
var inherits = require('inherits');

var api = exports;

api.define = function define(name, body) {
  return new Entity(name, body);
};

function Entity(name, body) {
  this.name = name;
  this.body = body;

  this.decoders = {};
  this.encoders = {};
};

Entity.prototype._createNamed = function createNamed(base) {
  var named;
  try {
    named = require('vm').runInThisContext(
      '(function ' + this.name + '(entity) {\n' +
      '  this._initNamed(entity);\n' +
      '})'
    );
  } catch (e) {
    named = function (entity) {
      this._initNamed(entity);
    };
  }
  inherits(named, base);
  named.prototype._initNamed = function initnamed(entity) {
    base.call(this, entity);
  };

  return new named(this);
};

Entity.prototype._getDecoder = function _getDecoder(enc) {
  enc = enc || 'der';
  // Lazily create decoder
  if (!this.decoders.hasOwnProperty(enc))
    this.decoders[enc] = this._createNamed(asn1.decoders[enc]);
  return this.decoders[enc];
};

Entity.prototype.decode = function decode(data, enc, options) {
  return this._getDecoder(enc).decode(data, options);
};

Entity.prototype._getEncoder = function _getEncoder(enc) {
  enc = enc || 'der';
  // Lazily create encoder
  if (!this.encoders.hasOwnProperty(enc))
    this.encoders[enc] = this._createNamed(asn1.encoders[enc]);
  return this.encoders[enc];
};

Entity.prototype.encode = function encode(data, enc, /* internal */ reporter) {
  return this._getEncoder(enc).encode(data, reporter);
};

},{"../asn1":35,"inherits":219,"vm":544}],37:[function(require,module,exports){
var inherits = require('inherits');
var Reporter = require('../base').Reporter;
var Buffer = require('buffer').Buffer;

function DecoderBuffer(base, options) {
  Reporter.call(this, options);
  if (!Buffer.isBuffer(base)) {
    this.error('Input not Buffer');
    return;
  }

  this.base = base;
  this.offset = 0;
  this.length = base.length;
}
inherits(DecoderBuffer, Reporter);
exports.DecoderBuffer = DecoderBuffer;

DecoderBuffer.prototype.save = function save() {
  return { offset: this.offset, reporter: Reporter.prototype.save.call(this) };
};

DecoderBuffer.prototype.restore = function restore(save) {
  // Return skipped data
  var res = new DecoderBuffer(this.base);
  res.offset = save.offset;
  res.length = this.offset;

  this.offset = save.offset;
  Reporter.prototype.restore.call(this, save.reporter);

  return res;
};

DecoderBuffer.prototype.isEmpty = function isEmpty() {
  return this.offset === this.length;
};

DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) {
  if (this.offset + 1 <= this.length)
    return this.base.readUInt8(this.offset++, true);
  else
    return this.error(fail || 'DecoderBuffer overrun');
}

DecoderBuffer.prototype.skip = function skip(bytes, fail) {
  if (!(this.offset + bytes <= this.length))
    return this.error(fail || 'DecoderBuffer overrun');

  var res = new DecoderBuffer(this.base);

  // Share reporter state
  res._reporterState = this._reporterState;

  res.offset = this.offset;
  res.length = this.offset + bytes;
  this.offset += bytes;
  return res;
}

DecoderBuffer.prototype.raw = function raw(save) {
  return this.base.slice(save ? save.offset : this.offset, this.length);
}

function EncoderBuffer(value, reporter) {
  if (Array.isArray(value)) {
    this.length = 0;
    this.value = value.map(function(item) {
      if (!(item instanceof EncoderBuffer))
        item = new EncoderBuffer(item, reporter);
      this.length += item.length;
      return item;
    }, this);
  } else if (typeof value === 'number') {
    if (!(0 <= value && value <= 0xff))
      return reporter.error('non-byte EncoderBuffer value');
    this.value = value;
    this.length = 1;
  } else if (typeof value === 'string') {
    this.value = value;
    this.length = Buffer.byteLength(value);
  } else if (Buffer.isBuffer(value)) {
    this.value = value;
    this.length = value.length;
  } else {
    return reporter.error('Unsupported type: ' + typeof value);
  }
}
exports.EncoderBuffer = EncoderBuffer;

EncoderBuffer.prototype.join = function join(out, offset) {
  if (!out)
    out = new Buffer(this.length);
  if (!offset)
    offset = 0;

  if (this.length === 0)
    return out;

  if (Array.isArray(this.value)) {
    this.value.forEach(function(item) {
      item.join(out, offset);
      offset += item.length;
    });
  } else {
    if (typeof this.value === 'number')
      out[offset] = this.value;
    else if (typeof this.value === 'string')
      out.write(this.value, offset);
    else if (Buffer.isBuffer(this.value))
      this.value.copy(out, offset);
    offset += this.length;
  }

  return out;
};

},{"../base":38,"buffer":83,"inherits":219}],38:[function(require,module,exports){
var base = exports;

base.Reporter = require('./reporter').Reporter;
base.DecoderBuffer = require('./buffer').DecoderBuffer;
base.EncoderBuffer = require('./buffer').EncoderBuffer;
base.Node = require('./node');

},{"./buffer":37,"./node":39,"./reporter":40}],39:[function(require,module,exports){
var Reporter = require('../base').Reporter;
var EncoderBuffer = require('../base').EncoderBuffer;
var DecoderBuffer = require('../base').DecoderBuffer;
var assert = require('minimalistic-assert');

// Supported tags
var tags = [
  'seq', 'seqof', 'set', 'setof', 'objid', 'bool',
  'gentime', 'utctime', 'null_', 'enum', 'int', 'objDesc',
  'bitstr', 'bmpstr', 'charstr', 'genstr', 'graphstr', 'ia5str', 'iso646str',
  'numstr', 'octstr', 'printstr', 't61str', 'unistr', 'utf8str', 'videostr'
];

// Public methods list
var methods = [
  'key', 'obj', 'use', 'optional', 'explicit', 'implicit', 'def', 'choice',
  'any', 'contains'
].concat(tags);

// Overrided methods list
var overrided = [
  '_peekTag', '_decodeTag', '_use',
  '_decodeStr', '_decodeObjid', '_decodeTime',
  '_decodeNull', '_decodeInt', '_decodeBool', '_decodeList',

  '_encodeComposite', '_encodeStr', '_encodeObjid', '_encodeTime',
  '_encodeNull', '_encodeInt', '_encodeBool'
];

function Node(enc, parent) {
  var state = {};
  this._baseState = state;

  state.enc = enc;

  state.parent = parent || null;
  state.children = null;

  // State
  state.tag = null;
  state.args = null;
  state.reverseArgs = null;
  state.choice = null;
  state.optional = false;
  state.any = false;
  state.obj = false;
  state.use = null;
  state.useDecoder = null;
  state.key = null;
  state['default'] = null;
  state.explicit = null;
  state.implicit = null;
  state.contains = null;

  // Should create new instance on each method
  if (!state.parent) {
    state.children = [];
    this._wrap();
  }
}
module.exports = Node;

var stateProps = [
  'enc', 'parent', 'children', 'tag', 'args', 'reverseArgs', 'choice',
  'optional', 'any', 'obj', 'use', 'alteredUse', 'key', 'default', 'explicit',
  'implicit', 'contains'
];

Node.prototype.clone = function clone() {
  var state = this._baseState;
  var cstate = {};
  stateProps.forEach(function(prop) {
    cstate[prop] = state[prop];
  });
  var res = new this.constructor(cstate.parent);
  res._baseState = cstate;
  return res;
};

Node.prototype._wrap = function wrap() {
  var state = this._baseState;
  methods.forEach(function(method) {
    this[method] = function _wrappedMethod() {
      var clone = new this.constructor(this);
      state.children.push(clone);
      return clone[method].apply(clone, arguments);
    };
  }, this);
};

Node.prototype._init = function init(body) {
  var state = this._baseState;

  assert(state.parent === null);
  body.call(this);

  // Filter children
  state.children = state.children.filter(function(child) {
    return child._baseState.parent === this;
  }, this);
  assert.equal(state.children.length, 1, 'Root node can have only one child');
};

Node.prototype._useArgs = function useArgs(args) {
  var state = this._baseState;

  // Filter children and args
  var children = args.filter(function(arg) {
    return arg instanceof this.constructor;
  }, this);
  args = args.filter(function(arg) {
    return !(arg instanceof this.constructor);
  }, this);

  if (children.length !== 0) {
    assert(state.children === null);
    state.children = children;

    // Replace parent to maintain backward link
    children.forEach(function(child) {
      child._baseState.parent = this;
    }, this);
  }
  if (args.length !== 0) {
    assert(state.args === null);
    state.args = args;
    state.reverseArgs = args.map(function(arg) {
      if (typeof arg !== 'object' || arg.constructor !== Object)
        return arg;

      var res = {};
      Object.keys(arg).forEach(function(key) {
        if (key == (key | 0))
          key |= 0;
        var value = arg[key];
        res[value] = key;
      });
      return res;
    });
  }
};

//
// Overrided methods
//

overrided.forEach(function(method) {
  Node.prototype[method] = function _overrided() {
    var state = this._baseState;
    throw new Error(method + ' not implemented for encoding: ' + state.enc);
  };
});

//
// Public methods
//

tags.forEach(function(tag) {
  Node.prototype[tag] = function _tagMethod() {
    var state = this._baseState;
    var args = Array.prototype.slice.call(arguments);

    assert(state.tag === null);
    state.tag = tag;

    this._useArgs(args);

    return this;
  };
});

Node.prototype.use = function use(item) {
  assert(item);
  var state = this._baseState;

  assert(state.use === null);
  state.use = item;

  return this;
};

Node.prototype.optional = function optional() {
  var state = this._baseState;

  state.optional = true;

  return this;
};

Node.prototype.def = function def(val) {
  var state = this._baseState;

  assert(state['default'] === null);
  state['default'] = val;
  state.optional = true;

  return this;
};

Node.prototype.explicit = function explicit(num) {
  var state = this._baseState;

  assert(state.explicit === null && state.implicit === null);
  state.explicit = num;

  return this;
};

Node.prototype.implicit = function implicit(num) {
  var state = this._baseState;

  assert(state.explicit === null && state.implicit === null);
  state.implicit = num;

  return this;
};

Node.prototype.obj = function obj() {
  var state = this._baseState;
  var args = Array.prototype.slice.call(arguments);

  state.obj = true;

  if (args.length !== 0)
    this._useArgs(args);

  return this;
};

Node.prototype.key = function key(newKey) {
  var state = this._baseState;

  assert(state.key === null);
  state.key = newKey;

  return this;
};

Node.prototype.any = function any() {
  var state = this._baseState;

  state.any = true;

  return this;
};

Node.prototype.choice = function choice(obj) {
  var state = this._baseState;

  assert(state.choice === null);
  state.choice = obj;
  this._useArgs(Object.keys(obj).map(function(key) {
    return obj[key];
  }));

  return this;
};

Node.prototype.contains = function contains(item) {
  var state = this._baseState;

  assert(state.use === null);
  state.contains = item;

  return this;
};

//
// Decoding
//

Node.prototype._decode = function decode(input, options) {
  var state = this._baseState;

  // Decode root node
  if (state.parent === null)
    return input.wrapResult(state.children[0]._decode(input, options));

  var result = state['default'];
  var present = true;

  var prevKey = null;
  if (state.key !== null)
    prevKey = input.enterKey(state.key);

  // Check if tag is there
  if (state.optional) {
    var tag = null;
    if (state.explicit !== null)
      tag = state.explicit;
    else if (state.implicit !== null)
      tag = state.implicit;
    else if (state.tag !== null)
      tag = state.tag;

    if (tag === null && !state.any) {
      // Trial and Error
      var save = input.save();
      try {
        if (state.choice === null)
          this._decodeGeneric(state.tag, input, options);
        else
          this._decodeChoice(input, options);
        present = true;
      } catch (e) {
        present = false;
      }
      input.restore(save);
    } else {
      present = this._peekTag(input, tag, state.any);

      if (input.isError(present))
        return present;
    }
  }

  // Push object on stack
  var prevObj;
  if (state.obj && present)
    prevObj = input.enterObject();

  if (present) {
    // Unwrap explicit values
    if (state.explicit !== null) {
      var explicit = this._decodeTag(input, state.explicit);
      if (input.isError(explicit))
        return explicit;
      input = explicit;
    }

    var start = input.offset;

    // Unwrap implicit and normal values
    if (state.use === null && state.choice === null) {
      if (state.any)
        var save = input.save();
      var body = this._decodeTag(
        input,
        state.implicit !== null ? state.implicit : state.tag,
        state.any
      );
      if (input.isError(body))
        return body;

      if (state.any)
        result = input.raw(save);
      else
        input = body;
    }

    if (options && options.track && state.tag !== null)
      options.track(input.path(), start, input.length, 'tagged');

    if (options && options.track && state.tag !== null)
      options.track(input.path(), input.offset, input.length, 'content');

    // Select proper method for tag
    if (state.any)
      result = result;
    else if (state.choice === null)
      result = this._decodeGeneric(state.tag, input, options);
    else
      result = this._decodeChoice(input, options);

    if (input.isError(result))
      return result;

    // Decode children
    if (!state.any && state.choice === null && state.children !== null) {
      state.children.forEach(function decodeChildren(child) {
        // NOTE: We are ignoring errors here, to let parser continue with other
        // parts of encoded data
        child._decode(input, options);
      });
    }

    // Decode contained/encoded by schema, only in bit or octet strings
    if (state.contains && (state.tag === 'octstr' || state.tag === 'bitstr')) {
      var data = new DecoderBuffer(result);
      result = this._getUse(state.contains, input._reporterState.obj)
          ._decode(data, options);
    }
  }

  // Pop object
  if (state.obj && present)
    result = input.leaveObject(prevObj);

  // Set key
  if (state.key !== null && (result !== null || present === true))
    input.leaveKey(prevKey, state.key, result);
  else if (prevKey !== null)
    input.exitKey(prevKey);

  return result;
};

Node.prototype._decodeGeneric = function decodeGeneric(tag, input, options) {
  var state = this._baseState;

  if (tag === 'seq' || tag === 'set')
    return null;
  if (tag === 'seqof' || tag === 'setof')
    return this._decodeList(input, tag, state.args[0], options);
  else if (/str$/.test(tag))
    return this._decodeStr(input, tag, options);
  else if (tag === 'objid' && state.args)
    return this._decodeObjid(input, state.args[0], state.args[1], options);
  else if (tag === 'objid')
    return this._decodeObjid(input, null, null, options);
  else if (tag === 'gentime' || tag === 'utctime')
    return this._decodeTime(input, tag, options);
  else if (tag === 'null_')
    return this._decodeNull(input, options);
  else if (tag === 'bool')
    return this._decodeBool(input, options);
  else if (tag === 'objDesc')
    return this._decodeStr(input, tag, options);
  else if (tag === 'int' || tag === 'enum')
    return this._decodeInt(input, state.args && state.args[0], options);

  if (state.use !== null) {
    return this._getUse(state.use, input._reporterState.obj)
        ._decode(input, options);
  } else {
    return input.error('unknown tag: ' + tag);
  }
};

Node.prototype._getUse = function _getUse(entity, obj) {

  var state = this._baseState;
  // Create altered use decoder if implicit is set
  state.useDecoder = this._use(entity, obj);
  assert(state.useDecoder._baseState.parent === null);
  state.useDecoder = state.useDecoder._baseState.children[0];
  if (state.implicit !== state.useDecoder._baseState.implicit) {
    state.useDecoder = state.useDecoder.clone();
    state.useDecoder._baseState.implicit = state.implicit;
  }
  return state.useDecoder;
};

Node.prototype._decodeChoice = function decodeChoice(input, options) {
  var state = this._baseState;
  var result = null;
  var match = false;

  Object.keys(state.choice).some(function(key) {
    var save = input.save();
    var node = state.choice[key];
    try {
      var value = node._decode(input, options);
      if (input.isError(value))
        return false;

      result = { type: key, value: value };
      match = true;
    } catch (e) {
      input.restore(save);
      return false;
    }
    return true;
  }, this);

  if (!match)
    return input.error('Choice not matched');

  return result;
};

//
// Encoding
//

Node.prototype._createEncoderBuffer = function createEncoderBuffer(data) {
  return new EncoderBuffer(data, this.reporter);
};

Node.prototype._encode = function encode(data, reporter, parent) {
  var state = this._baseState;
  if (state['default'] !== null && state['default'] === data)
    return;

  var result = this._encodeValue(data, reporter, parent);
  if (result === undefined)
    return;

  if (this._skipDefault(result, reporter, parent))
    return;

  return result;
};

Node.prototype._encodeValue = function encode(data, reporter, parent) {
  var state = this._baseState;

  // Decode root node
  if (state.parent === null)
    return state.children[0]._encode(data, reporter || new Reporter());

  var result = null;

  // Set reporter to share it with a child class
  this.reporter = reporter;

  // Check if data is there
  if (state.optional && data === undefined) {
    if (state['default'] !== null)
      data = state['default']
    else
      return;
  }

  // Encode children first
  var content = null;
  var primitive = false;
  if (state.any) {
    // Anything that was given is translated to buffer
    result = this._createEncoderBuffer(data);
  } else if (state.choice) {
    result = this._encodeChoice(data, reporter);
  } else if (state.contains) {
    content = this._getUse(state.contains, parent)._encode(data, reporter);
    primitive = true;
  } else if (state.children) {
    content = state.children.map(function(child) {
      if (child._baseState.tag === 'null_')
        return child._encode(null, reporter, data);

      if (child._baseState.key === null)
        return reporter.error('Child should have a key');
      var prevKey = reporter.enterKey(child._baseState.key);

      if (typeof data !== 'object')
        return reporter.error('Child expected, but input is not object');

      var res = child._encode(data[child._baseState.key], reporter, data);
      reporter.leaveKey(prevKey);

      return res;
    }, this).filter(function(child) {
      return child;
    });
    content = this._createEncoderBuffer(content);
  } else {
    if (state.tag === 'seqof' || state.tag === 'setof') {
      // TODO(indutny): this should be thrown on DSL level
      if (!(state.args && state.args.length === 1))
        return reporter.error('Too many args for : ' + state.tag);

      if (!Array.isArray(data))
        return reporter.error('seqof/setof, but data is not Array');

      var child = this.clone();
      child._baseState.implicit = null;
      content = this._createEncoderBuffer(data.map(function(item) {
        var state = this._baseState;

        return this._getUse(state.args[0], data)._encode(item, reporter);
      }, child));
    } else if (state.use !== null) {
      result = this._getUse(state.use, parent)._encode(data, reporter);
    } else {
      content = this._encodePrimitive(state.tag, data);
      primitive = true;
    }
  }

  // Encode data itself
  var result;
  if (!state.any && state.choice === null) {
    var tag = state.implicit !== null ? state.implicit : state.tag;
    var cls = state.implicit === null ? 'universal' : 'context';

    if (tag === null) {
      if (state.use === null)
        reporter.error('Tag could be omitted only for .use()');
    } else {
      if (state.use === null)
        result = this._encodeComposite(tag, primitive, cls, content);
    }
  }

  // Wrap in explicit
  if (state.explicit !== null)
    result = this._encodeComposite(state.explicit, false, 'context', result);

  return result;
};

Node.prototype._encodeChoice = function encodeChoice(data, reporter) {
  var state = this._baseState;

  var node = state.choice[data.type];
  if (!node) {
    assert(
        false,
        data.type + ' not found in ' +
            JSON.stringify(Object.keys(state.choice)));
  }
  return node._encode(data.value, reporter);
};

Node.prototype._encodePrimitive = function encodePrimitive(tag, data) {
  var state = this._baseState;

  if (/str$/.test(tag))
    return this._encodeStr(data, tag);
  else if (tag === 'objid' && state.args)
    return this._encodeObjid(data, state.reverseArgs[0], state.args[1]);
  else if (tag === 'objid')
    return this._encodeObjid(data, null, null);
  else if (tag === 'gentime' || tag === 'utctime')
    return this._encodeTime(data, tag);
  else if (tag === 'null_')
    return this._encodeNull();
  else if (tag === 'int' || tag === 'enum')
    return this._encodeInt(data, state.args && state.reverseArgs[0]);
  else if (tag === 'bool')
    return this._encodeBool(data);
  else if (tag === 'objDesc')
    return this._encodeStr(data, tag);
  else
    throw new Error('Unsupported tag: ' + tag);
};

Node.prototype._isNumstr = function isNumstr(str) {
  return /^[0-9 ]*$/.test(str);
};

Node.prototype._isPrintstr = function isPrintstr(str) {
  return /^[A-Za-z0-9 '\(\)\+,\-\.\/:=\?]*$/.test(str);
};

},{"../base":38,"minimalistic-assert":235}],40:[function(require,module,exports){
var inherits = require('inherits');

function Reporter(options) {
  this._reporterState = {
    obj: null,
    path: [],
    options: options || {},
    errors: []
  };
}
exports.Reporter = Reporter;

Reporter.prototype.isError = function isError(obj) {
  return obj instanceof ReporterError;
};

Reporter.prototype.save = function save() {
  var state = this._reporterState;

  return { obj: state.obj, pathLen: state.path.length };
};

Reporter.prototype.restore = function restore(data) {
  var state = this._reporterState;

  state.obj = data.obj;
  state.path = state.path.slice(0, data.pathLen);
};

Reporter.prototype.enterKey = function enterKey(key) {
  return this._reporterState.path.push(key);
};

Reporter.prototype.exitKey = function exitKey(index) {
  var state = this._reporterState;

  state.path = state.path.slice(0, index - 1);
};

Reporter.prototype.leaveKey = function leaveKey(index, key, value) {
  var state = this._reporterState;

  this.exitKey(index);
  if (state.obj !== null)
    state.obj[key] = value;
};

Reporter.prototype.path = function path() {
  return this._reporterState.path.join('/');
};

Reporter.prototype.enterObject = function enterObject() {
  var state = this._reporterState;

  var prev = state.obj;
  state.obj = {};
  return prev;
};

Reporter.prototype.leaveObject = function leaveObject(prev) {
  var state = this._reporterState;

  var now = state.obj;
  state.obj = prev;
  return now;
};

Reporter.prototype.error = function error(msg) {
  var err;
  var state = this._reporterState;

  var inherited = msg instanceof ReporterError;
  if (inherited) {
    err = msg;
  } else {
    err = new ReporterError(state.path.map(function(elem) {
      return '[' + JSON.stringify(elem) + ']';
    }).join(''), msg.message || msg, msg.stack);
  }

  if (!state.options.partial)
    throw err;

  if (!inherited)
    state.errors.push(err);

  return err;
};

Reporter.prototype.wrapResult = function wrapResult(result) {
  var state = this._reporterState;
  if (!state.options.partial)
    return result;

  return {
    result: this.isError(result) ? null : result,
    errors: state.errors
  };
};

function ReporterError(path, msg) {
  this.path = path;
  this.rethrow(msg);
};
inherits(ReporterError, Error);

ReporterError.prototype.rethrow = function rethrow(msg) {
  this.message = msg + ' at: ' + (this.path || '(shallow)');
  if (Error.captureStackTrace)
    Error.captureStackTrace(this, ReporterError);

  if (!this.stack) {
    try {
      // IE only adds stack when thrown
      throw new Error(this.message);
    } catch (e) {
      this.stack = e.stack;
    }
  }
  return this;
};

},{"inherits":219}],41:[function(require,module,exports){
var constants = require('../constants');

exports.tagClass = {
  0: 'universal',
  1: 'application',
  2: 'context',
  3: 'private'
};
exports.tagClassByName = constants._reverse(exports.tagClass);

exports.tag = {
  0x00: 'end',
  0x01: 'bool',
  0x02: 'int',
  0x03: 'bitstr',
  0x04: 'octstr',
  0x05: 'null_',
  0x06: 'objid',
  0x07: 'objDesc',
  0x08: 'external',
  0x09: 'real',
  0x0a: 'enum',
  0x0b: 'embed',
  0x0c: 'utf8str',
  0x0d: 'relativeOid',
  0x10: 'seq',
  0x11: 'set',
  0x12: 'numstr',
  0x13: 'printstr',
  0x14: 't61str',
  0x15: 'videostr',
  0x16: 'ia5str',
  0x17: 'utctime',
  0x18: 'gentime',
  0x19: 'graphstr',
  0x1a: 'iso646str',
  0x1b: 'genstr',
  0x1c: 'unistr',
  0x1d: 'charstr',
  0x1e: 'bmpstr'
};
exports.tagByName = constants._reverse(exports.tag);

},{"../constants":42}],42:[function(require,module,exports){
var constants = exports;

// Helper
constants._reverse = function reverse(map) {
  var res = {};

  Object.keys(map).forEach(function(key) {
    // Convert key to integer if it is stringified
    if ((key | 0) == key)
      key = key | 0;

    var value = map[key];
    res[value] = key;
  });

  return res;
};

constants.der = require('./der');

},{"./der":41}],43:[function(require,module,exports){
var inherits = require('inherits');

var asn1 = require('../../asn1');
var base = asn1.base;
var bignum = asn1.bignum;

// Import DER constants
var der = asn1.constants.der;

function DERDecoder(entity) {
  this.enc = 'der';
  this.name = entity.name;
  this.entity = entity;

  // Construct base tree
  this.tree = new DERNode();
  this.tree._init(entity.body);
};
module.exports = DERDecoder;

DERDecoder.prototype.decode = function decode(data, options) {
  if (!(data instanceof base.DecoderBuffer))
    data = new base.DecoderBuffer(data, options);

  return this.tree._decode(data, options);
};

// Tree methods

function DERNode(parent) {
  base.Node.call(this, 'der', parent);
}
inherits(DERNode, base.Node);

DERNode.prototype._peekTag = function peekTag(buffer, tag, any) {
  if (buffer.isEmpty())
    return false;

  var state = buffer.save();
  var decodedTag = derDecodeTag(buffer, 'Failed to peek tag: "' + tag + '"');
  if (buffer.isError(decodedTag))
    return decodedTag;

  buffer.restore(state);

  return decodedTag.tag === tag || decodedTag.tagStr === tag ||
    (decodedTag.tagStr + 'of') === tag || any;
};

DERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) {
  var decodedTag = derDecodeTag(buffer,
                                'Failed to decode tag of "' + tag + '"');
  if (buffer.isError(decodedTag))
    return decodedTag;

  var len = derDecodeLen(buffer,
                         decodedTag.primitive,
                         'Failed to get length of "' + tag + '"');

  // Failure
  if (buffer.isError(len))
    return len;

  if (!any &&
      decodedTag.tag !== tag &&
      decodedTag.tagStr !== tag &&
      decodedTag.tagStr + 'of' !== tag) {
    return buffer.error('Failed to match tag: "' + tag + '"');
  }

  if (decodedTag.primitive || len !== null)
    return buffer.skip(len, 'Failed to match body of: "' + tag + '"');

  // Indefinite length... find END tag
  var state = buffer.save();
  var res = this._skipUntilEnd(
      buffer,
      'Failed to skip indefinite length body: "' + this.tag + '"');
  if (buffer.isError(res))
    return res;

  len = buffer.offset - state.offset;
  buffer.restore(state);
  return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
};

DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) {
  while (true) {
    var tag = derDecodeTag(buffer, fail);
    if (buffer.isError(tag))
      return tag;
    var len = derDecodeLen(buffer, tag.primitive, fail);
    if (buffer.isError(len))
      return len;

    var res;
    if (tag.primitive || len !== null)
      res = buffer.skip(len)
    else
      res = this._skipUntilEnd(buffer, fail);

    // Failure
    if (buffer.isError(res))
      return res;

    if (tag.tagStr === 'end')
      break;
  }
};

DERNode.prototype._decodeList = function decodeList(buffer, tag, decoder,
                                                    options) {
  var result = [];
  while (!buffer.isEmpty()) {
    var possibleEnd = this._peekTag(buffer, 'end');
    if (buffer.isError(possibleEnd))
      return possibleEnd;

    var res = decoder.decode(buffer, 'der', options);
    if (buffer.isError(res) && possibleEnd)
      break;
    result.push(res);
  }
  return result;
};

DERNode.prototype._decodeStr = function decodeStr(buffer, tag) {
  if (tag === 'bitstr') {
    var unused = buffer.readUInt8();
    if (buffer.isError(unused))
      return unused;
    return { unused: unused, data: buffer.raw() };
  } else if (tag === 'bmpstr') {
    var raw = buffer.raw();
    if (raw.length % 2 === 1)
      return buffer.error('Decoding of string type: bmpstr length mismatch');

    var str = '';
    for (var i = 0; i < raw.length / 2; i++) {
      str += String.fromCharCode(raw.readUInt16BE(i * 2));
    }
    return str;
  } else if (tag === 'numstr') {
    var numstr = buffer.raw().toString('ascii');
    if (!this._isNumstr(numstr)) {
      return buffer.error('Decoding of string type: ' +
                          'numstr unsupported characters');
    }
    return numstr;
  } else if (tag === 'octstr') {
    return buffer.raw();
  } else if (tag === 'objDesc') {
    return buffer.raw();
  } else if (tag === 'printstr') {
    var printstr = buffer.raw().toString('ascii');
    if (!this._isPrintstr(printstr)) {
      return buffer.error('Decoding of string type: ' +
                          'printstr unsupported characters');
    }
    return printstr;
  } else if (/str$/.test(tag)) {
    return buffer.raw().toString();
  } else {
    return buffer.error('Decoding of string type: ' + tag + ' unsupported');
  }
};

DERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) {
  var result;
  var identifiers = [];
  var ident = 0;
  while (!buffer.isEmpty()) {
    var subident = buffer.readUInt8();
    ident <<= 7;
    ident |= subident & 0x7f;
    if ((subident & 0x80) === 0) {
      identifiers.push(ident);
      ident = 0;
    }
  }
  if (subident & 0x80)
    identifiers.push(ident);

  var first = (identifiers[0] / 40) | 0;
  var second = identifiers[0] % 40;

  if (relative)
    result = identifiers;
  else
    result = [first, second].concat(identifiers.slice(1));

  if (values) {
    var tmp = values[result.join(' ')];
    if (tmp === undefined)
      tmp = values[result.join('.')];
    if (tmp !== undefined)
      result = tmp;
  }

  return result;
};

DERNode.prototype._decodeTime = function decodeTime(buffer, tag) {
  var str = buffer.raw().toString();
  if (tag === 'gentime') {
    var year = str.slice(0, 4) | 0;
    var mon = str.slice(4, 6) | 0;
    var day = str.slice(6, 8) | 0;
    var hour = str.slice(8, 10) | 0;
    var min = str.slice(10, 12) | 0;
    var sec = str.slice(12, 14) | 0;
  } else if (tag === 'utctime') {
    var year = str.slice(0, 2) | 0;
    var mon = str.slice(2, 4) | 0;
    var day = str.slice(4, 6) | 0;
    var hour = str.slice(6, 8) | 0;
    var min = str.slice(8, 10) | 0;
    var sec = str.slice(10, 12) | 0;
    if (year < 70)
      year = 2000 + year;
    else
      year = 1900 + year;
  } else {
    return buffer.error('Decoding ' + tag + ' time is not supported yet');
  }

  return Date.UTC(year, mon - 1, day, hour, min, sec, 0);
};

DERNode.prototype._decodeNull = function decodeNull(buffer) {
  return null;
};

DERNode.prototype._decodeBool = function decodeBool(buffer) {
  var res = buffer.readUInt8();
  if (buffer.isError(res))
    return res;
  else
    return res !== 0;
};

DERNode.prototype._decodeInt = function decodeInt(buffer, values) {
  // Bigint, return as it is (assume big endian)
  var raw = buffer.raw();
  var res = new bignum(raw);

  if (values)
    res = values[res.toString(10)] || res;

  return res;
};

DERNode.prototype._use = function use(entity, obj) {
  if (typeof entity === 'function')
    entity = entity(obj);
  return entity._getDecoder('der').tree;
};

// Utility methods

function derDecodeTag(buf, fail) {
  var tag = buf.readUInt8(fail);
  if (buf.isError(tag))
    return tag;

  var cls = der.tagClass[tag >> 6];
  var primitive = (tag & 0x20) === 0;

  // Multi-octet tag - load
  if ((tag & 0x1f) === 0x1f) {
    var oct = tag;
    tag = 0;
    while ((oct & 0x80) === 0x80) {
      oct = buf.readUInt8(fail);
      if (buf.isError(oct))
        return oct;

      tag <<= 7;
      tag |= oct & 0x7f;
    }
  } else {
    tag &= 0x1f;
  }
  var tagStr = der.tag[tag];

  return {
    cls: cls,
    primitive: primitive,
    tag: tag,
    tagStr: tagStr
  };
}

function derDecodeLen(buf, primitive, fail) {
  var len = buf.readUInt8(fail);
  if (buf.isError(len))
    return len;

  // Indefinite form
  if (!primitive && len === 0x80)
    return null;

  // Definite form
  if ((len & 0x80) === 0) {
    // Short form
    return len;
  }

  // Long form
  var num = len & 0x7f;
  if (num > 4)
    return buf.error('length octect is too long');

  len = 0;
  for (var i = 0; i < num; i++) {
    len <<= 8;
    var j = buf.readUInt8(fail);
    if (buf.isError(j))
      return j;
    len |= j;
  }

  return len;
}

},{"../../asn1":35,"inherits":219}],44:[function(require,module,exports){
var decoders = exports;

decoders.der = require('./der');
decoders.pem = require('./pem');

},{"./der":43,"./pem":45}],45:[function(require,module,exports){
var inherits = require('inherits');
var Buffer = require('buffer').Buffer;

var DERDecoder = require('./der');

function PEMDecoder(entity) {
  DERDecoder.call(this, entity);
  this.enc = 'pem';
};
inherits(PEMDecoder, DERDecoder);
module.exports = PEMDecoder;

PEMDecoder.prototype.decode = function decode(data, options) {
  var lines = data.toString().split(/[\r\n]+/g);

  var label = options.label.toUpperCase();

  var re = /^-----(BEGIN|END) ([^-]+)-----$/;
  var start = -1;
  var end = -1;
  for (var i = 0; i < lines.length; i++) {
    var match = lines[i].match(re);
    if (match === null)
      continue;

    if (match[2] !== label)
      continue;

    if (start === -1) {
      if (match[1] !== 'BEGIN')
        break;
      start = i;
    } else {
      if (match[1] !== 'END')
        break;
      end = i;
      break;
    }
  }
  if (start === -1 || end === -1)
    throw new Error('PEM section not found for: ' + label);

  var base64 = lines.slice(start + 1, end).join('');
  // Remove excessive symbols
  base64.replace(/[^a-z0-9\+\/=]+/gi, '');

  var input = new Buffer(base64, 'base64');
  return DERDecoder.prototype.decode.call(this, input, options);
};

},{"./der":43,"buffer":83,"inherits":219}],46:[function(require,module,exports){
var inherits = require('inherits');
var Buffer = require('buffer').Buffer;

var asn1 = require('../../asn1');
var base = asn1.base;

// Import DER constants
var der = asn1.constants.der;

function DEREncoder(entity) {
  this.enc = 'der';
  this.name = entity.name;
  this.entity = entity;

  // Construct base tree
  this.tree = new DERNode();
  this.tree._init(entity.body);
};
module.exports = DEREncoder;

DEREncoder.prototype.encode = function encode(data, reporter) {
  return this.tree._encode(data, reporter).join();
};

// Tree methods

function DERNode(parent) {
  base.Node.call(this, 'der', parent);
}
inherits(DERNode, base.Node);

DERNode.prototype._encodeComposite = function encodeComposite(tag,
                                                              primitive,
                                                              cls,
                                                              content) {
  var encodedTag = encodeTag(tag, primitive, cls, this.reporter);

  // Short form
  if (content.length < 0x80) {
    var header = new Buffer(2);
    header[0] = encodedTag;
    header[1] = content.length;
    return this._createEncoderBuffer([ header, content ]);
  }

  // Long form
  // Count octets required to store length
  var lenOctets = 1;
  for (var i = content.length; i >= 0x100; i >>= 8)
    lenOctets++;

  var header = new Buffer(1 + 1 + lenOctets);
  header[0] = encodedTag;
  header[1] = 0x80 | lenOctets;

  for (var i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8)
    header[i] = j & 0xff;

  return this._createEncoderBuffer([ header, content ]);
};

DERNode.prototype._encodeStr = function encodeStr(str, tag) {
  if (tag === 'bitstr') {
    return this._createEncoderBuffer([ str.unused | 0, str.data ]);
  } else if (tag === 'bmpstr') {
    var buf = new Buffer(str.length * 2);
    for (var i = 0; i < str.length; i++) {
      buf.writeUInt16BE(str.charCodeAt(i), i * 2);
    }
    return this._createEncoderBuffer(buf);
  } else if (tag === 'numstr') {
    if (!this._isNumstr(str)) {
      return this.reporter.error('Encoding of string type: numstr supports ' +
                                 'only digits and space');
    }
    return this._createEncoderBuffer(str);
  } else if (tag === 'printstr') {
    if (!this._isPrintstr(str)) {
      return this.reporter.error('Encoding of string type: printstr supports ' +
                                 'only latin upper and lower case letters, ' +
                                 'digits, space, apostrophe, left and rigth ' +
                                 'parenthesis, plus sign, comma, hyphen, ' +
                                 'dot, slash, colon, equal sign, ' +
                                 'question mark');
    }
    return this._createEncoderBuffer(str);
  } else if (/str$/.test(tag)) {
    return this._createEncoderBuffer(str);
  } else if (tag === 'objDesc') {
    return this._createEncoderBuffer(str);
  } else {
    return this.reporter.error('Encoding of string type: ' + tag +
                               ' unsupported');
  }
};

DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) {
  if (typeof id === 'string') {
    if (!values)
      return this.reporter.error('string objid given, but no values map found');
    if (!values.hasOwnProperty(id))
      return this.reporter.error('objid not found in values map');
    id = values[id].split(/[\s\.]+/g);
    for (var i = 0; i < id.length; i++)
      id[i] |= 0;
  } else if (Array.isArray(id)) {
    id = id.slice();
    for (var i = 0; i < id.length; i++)
      id[i] |= 0;
  }

  if (!Array.isArray(id)) {
    return this.reporter.error('objid() should be either array or string, ' +
                               'got: ' + JSON.stringify(id));
  }

  if (!relative) {
    if (id[1] >= 40)
      return this.reporter.error('Second objid identifier OOB');
    id.splice(0, 2, id[0] * 40 + id[1]);
  }

  // Count number of octets
  var size = 0;
  for (var i = 0; i < id.length; i++) {
    var ident = id[i];
    for (size++; ident >= 0x80; ident >>= 7)
      size++;
  }

  var objid = new Buffer(size);
  var offset = objid.length - 1;
  for (var i = id.length - 1; i >= 0; i--) {
    var ident = id[i];
    objid[offset--] = ident & 0x7f;
    while ((ident >>= 7) > 0)
      objid[offset--] = 0x80 | (ident & 0x7f);
  }

  return this._createEncoderBuffer(objid);
};

function two(num) {
  if (num < 10)
    return '0' + num;
  else
    return num;
}

DERNode.prototype._encodeTime = function encodeTime(time, tag) {
  var str;
  var date = new Date(time);

  if (tag === 'gentime') {
    str = [
      two(date.getFullYear()),
      two(date.getUTCMonth() + 1),
      two(date.getUTCDate()),
      two(date.getUTCHours()),
      two(date.getUTCMinutes()),
      two(date.getUTCSeconds()),
      'Z'
    ].join('');
  } else if (tag === 'utctime') {
    str = [
      two(date.getFullYear() % 100),
      two(date.getUTCMonth() + 1),
      two(date.getUTCDate()),
      two(date.getUTCHours()),
      two(date.getUTCMinutes()),
      two(date.getUTCSeconds()),
      'Z'
    ].join('');
  } else {
    this.reporter.error('Encoding ' + tag + ' time is not supported yet');
  }

  return this._encodeStr(str, 'octstr');
};

DERNode.prototype._encodeNull = function encodeNull() {
  return this._createEncoderBuffer('');
};

DERNode.prototype._encodeInt = function encodeInt(num, values) {
  if (typeof num === 'string') {
    if (!values)
      return this.reporter.error('String int or enum given, but no values map');
    if (!values.hasOwnProperty(num)) {
      return this.reporter.error('Values map doesn\'t contain: ' +
                                 JSON.stringify(num));
    }
    num = values[num];
  }

  // Bignum, assume big endian
  if (typeof num !== 'number' && !Buffer.isBuffer(num)) {
    var numArray = num.toArray();
    if (!num.sign && numArray[0] & 0x80) {
      numArray.unshift(0);
    }
    num = new Buffer(numArray);
  }

  if (Buffer.isBuffer(num)) {
    var size = num.length;
    if (num.length === 0)
      size++;

    var out = new Buffer(size);
    num.copy(out);
    if (num.length === 0)
      out[0] = 0
    return this._createEncoderBuffer(out);
  }

  if (num < 0x80)
    return this._createEncoderBuffer(num);

  if (num < 0x100)
    return this._createEncoderBuffer([0, num]);

  var size = 1;
  for (var i = num; i >= 0x100; i >>= 8)
    size++;

  var out = new Array(size);
  for (var i = out.length - 1; i >= 0; i--) {
    out[i] = num & 0xff;
    num >>= 8;
  }
  if(out[0] & 0x80) {
    out.unshift(0);
  }

  return this._createEncoderBuffer(new Buffer(out));
};

DERNode.prototype._encodeBool = function encodeBool(value) {
  return this._createEncoderBuffer(value ? 0xff : 0);
};

DERNode.prototype._use = function use(entity, obj) {
  if (typeof entity === 'function')
    entity = entity(obj);
  return entity._getEncoder('der').tree;
};

DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) {
  var state = this._baseState;
  var i;
  if (state['default'] === null)
    return false;

  var data = dataBuffer.join();
  if (state.defaultBuffer === undefined)
    state.defaultBuffer = this._encodeValue(state['default'], reporter, parent).join();

  if (data.length !== state.defaultBuffer.length)
    return false;

  for (i=0; i < data.length; i++)
    if (data[i] !== state.defaultBuffer[i])
      return false;

  return true;
};

// Utility methods

function encodeTag(tag, primitive, cls, reporter) {
  var res;

  if (tag === 'seqof')
    tag = 'seq';
  else if (tag === 'setof')
    tag = 'set';

  if (der.tagByName.hasOwnProperty(tag))
    res = der.tagByName[tag];
  else if (typeof tag === 'number' && (tag | 0) === tag)
    res = tag;
  else
    return reporter.error('Unknown tag: ' + tag);

  if (res >= 0x1f)
    return reporter.error('Multi-octet tag encoding unsupported');

  if (!primitive)
    res |= 0x20;

  res |= (der.tagClassByName[cls || 'universal'] << 6);

  return res;
}

},{"../../asn1":35,"buffer":83,"inherits":219}],47:[function(require,module,exports){
var encoders = exports;

encoders.der = require('./der');
encoders.pem = require('./pem');

},{"./der":46,"./pem":48}],48:[function(require,module,exports){
var inherits = require('inherits');

var DEREncoder = require('./der');

function PEMEncoder(entity) {
  DEREncoder.call(this, entity);
  this.enc = 'pem';
};
inherits(PEMEncoder, DEREncoder);
module.exports = PEMEncoder;

PEMEncoder.prototype.encode = function encode(data, options) {
  var buf = DEREncoder.prototype.encode.call(this, data);

  var p = buf.toString('base64');
  var out = [ '-----BEGIN ' + options.label + '-----' ];
  for (var i = 0; i < p.length; i += 64)
    out.push(p.slice(i, i + 64));
  out.push('-----END ' + options.label + '-----');
  return out.join('\n');
};

},{"./der":46,"inherits":219}],49:[function(require,module,exports){
(function (module, exports) {
  'use strict';

  // Utils
  function assert (val, msg) {
    if (!val) throw new Error(msg || 'Assertion failed');
  }

  // Could use `inherits` module, but don't want to move from single file
  // architecture yet.
  function inherits (ctor, superCtor) {
    ctor.super_ = superCtor;
    var TempCtor = function () {};
    TempCtor.prototype = superCtor.prototype;
    ctor.prototype = new TempCtor();
    ctor.prototype.constructor = ctor;
  }

  // BN

  function BN (number, base, endian) {
    if (BN.isBN(number)) {
      return number;
    }

    this.negative = 0;
    this.words = null;
    this.length = 0;

    // Reduction context
    this.red = null;

    if (number !== null) {
      if (base === 'le' || base === 'be') {
        endian = base;
        base = 10;
      }

      this._init(number || 0, base || 10, endian || 'be');
    }
  }
  if (typeof module === 'object') {
    module.exports = BN;
  } else {
    exports.BN = BN;
  }

  BN.BN = BN;
  BN.wordSize = 26;

  var Buffer;
  try {
    if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {
      Buffer = window.Buffer;
    } else {
      Buffer = require('buffer').Buffer;
    }
  } catch (e) {
  }

  BN.isBN = function isBN (num) {
    if (num instanceof BN) {
      return true;
    }

    return num !== null && typeof num === 'object' &&
      num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
  };

  BN.max = function max (left, right) {
    if (left.cmp(right) > 0) return left;
    return right;
  };

  BN.min = function min (left, right) {
    if (left.cmp(right) < 0) return left;
    return right;
  };

  BN.prototype._init = function init (number, base, endian) {
    if (typeof number === 'number') {
      return this._initNumber(number, base, endian);
    }

    if (typeof number === 'object') {
      return this._initArray(number, base, endian);
    }

    if (base === 'hex') {
      base = 16;
    }
    assert(base === (base | 0) && base >= 2 && base <= 36);

    number = number.toString().replace(/\s+/g, '');
    var start = 0;
    if (number[0] === '-') {
      start++;
      this.negative = 1;
    }

    if (start < number.length) {
      if (base === 16) {
        this._parseHex(number, start, endian);
      } else {
        this._parseBase(number, base, start);
        if (endian === 'le') {
          this._initArray(this.toArray(), base, endian);
        }
      }
    }
  };

  BN.prototype._initNumber = function _initNumber (number, base, endian) {
    if (number < 0) {
      this.negative = 1;
      number = -number;
    }
    if (number < 0x4000000) {
      this.words = [ number & 0x3ffffff ];
      this.length = 1;
    } else if (number < 0x10000000000000) {
      this.words = [
        number & 0x3ffffff,
        (number / 0x4000000) & 0x3ffffff
      ];
      this.length = 2;
    } else {
      assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)
      this.words = [
        number & 0x3ffffff,
        (number / 0x4000000) & 0x3ffffff,
        1
      ];
      this.length = 3;
    }

    if (endian !== 'le') return;

    // Reverse the bytes
    this._initArray(this.toArray(), base, endian);
  };

  BN.prototype._initArray = function _initArray (number, base, endian) {
    // Perhaps a Uint8Array
    assert(typeof number.length === 'number');
    if (number.length <= 0) {
      this.words = [ 0 ];
      this.length = 1;
      return this;
    }

    this.length = Math.ceil(number.length / 3);
    this.words = new Array(this.length);
    for (var i = 0; i < this.length; i++) {
      this.words[i] = 0;
    }

    var j, w;
    var off = 0;
    if (endian === 'be') {
      for (i = number.length - 1, j = 0; i >= 0; i -= 3) {
        w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);
        this.words[j] |= (w << off) & 0x3ffffff;
        this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
        off += 24;
        if (off >= 26) {
          off -= 26;
          j++;
        }
      }
    } else if (endian === 'le') {
      for (i = 0, j = 0; i < number.length; i += 3) {
        w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);
        this.words[j] |= (w << off) & 0x3ffffff;
        this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
        off += 24;
        if (off >= 26) {
          off -= 26;
          j++;
        }
      }
    }
    return this.strip();
  };

  function parseHex4Bits (string, index) {
    var c = string.charCodeAt(index);
    // 'A' - 'F'
    if (c >= 65 && c <= 70) {
      return c - 55;
    // 'a' - 'f'
    } else if (c >= 97 && c <= 102) {
      return c - 87;
    // '0' - '9'
    } else {
      return (c - 48) & 0xf;
    }
  }

  function parseHexByte (string, lowerBound, index) {
    var r = parseHex4Bits(string, index);
    if (index - 1 >= lowerBound) {
      r |= parseHex4Bits(string, index - 1) << 4;
    }
    return r;
  }

  BN.prototype._parseHex = function _parseHex (number, start, endian) {
    // Create possibly bigger array to ensure that it fits the number
    this.length = Math.ceil((number.length - start) / 6);
    this.words = new Array(this.length);
    for (var i = 0; i < this.length; i++) {
      this.words[i] = 0;
    }

    // 24-bits chunks
    var off = 0;
    var j = 0;

    var w;
    if (endian === 'be') {
      for (i = number.length - 1; i >= start; i -= 2) {
        w = parseHexByte(number, start, i) << off;
        this.words[j] |= w & 0x3ffffff;
        if (off >= 18) {
          off -= 18;
          j += 1;
          this.words[j] |= w >>> 26;
        } else {
          off += 8;
        }
      }
    } else {
      var parseLength = number.length - start;
      for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {
        w = parseHexByte(number, start, i) << off;
        this.words[j] |= w & 0x3ffffff;
        if (off >= 18) {
          off -= 18;
          j += 1;
          this.words[j] |= w >>> 26;
        } else {
          off += 8;
        }
      }
    }

    this.strip();
  };

  function parseBase (str, start, end, mul) {
    var r = 0;
    var len = Math.min(str.length, end);
    for (var i = start; i < len; i++) {
      var c = str.charCodeAt(i) - 48;

      r *= mul;

      // 'a'
      if (c >= 49) {
        r += c - 49 + 0xa;

      // 'A'
      } else if (c >= 17) {
        r += c - 17 + 0xa;

      // '0' - '9'
      } else {
        r += c;
      }
    }
    return r;
  }

  BN.prototype._parseBase = function _parseBase (number, base, start) {
    // Initialize as zero
    this.words = [ 0 ];
    this.length = 1;

    // Find length of limb in base
    for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {
      limbLen++;
    }
    limbLen--;
    limbPow = (limbPow / base) | 0;

    var total = number.length - start;
    var mod = total % limbLen;
    var end = Math.min(total, total - mod) + start;

    var word = 0;
    for (var i = start; i < end; i += limbLen) {
      word = parseBase(number, i, i + limbLen, base);

      this.imuln(limbPow);
      if (this.words[0] + word < 0x4000000) {
        this.words[0] += word;
      } else {
        this._iaddn(word);
      }
    }

    if (mod !== 0) {
      var pow = 1;
      word = parseBase(number, i, number.length, base);

      for (i = 0; i < mod; i++) {
        pow *= base;
      }

      this.imuln(pow);
      if (this.words[0] + word < 0x4000000) {
        this.words[0] += word;
      } else {
        this._iaddn(word);
      }
    }

    this.strip();
  };

  BN.prototype.copy = function copy (dest) {
    dest.words = new Array(this.length);
    for (var i = 0; i < this.length; i++) {
      dest.words[i] = this.words[i];
    }
    dest.length = this.length;
    dest.negative = this.negative;
    dest.red = this.red;
  };

  BN.prototype.clone = function clone () {
    var r = new BN(null);
    this.copy(r);
    return r;
  };

  BN.prototype._expand = function _expand (size) {
    while (this.length < size) {
      this.words[this.length++] = 0;
    }
    return this;
  };

  // Remove leading `0` from `this`
  BN.prototype.strip = function strip () {
    while (this.length > 1 && this.words[this.length - 1] === 0) {
      this.length--;
    }
    return this._normSign();
  };

  BN.prototype._normSign = function _normSign () {
    // -0 = 0
    if (this.length === 1 && this.words[0] === 0) {
      this.negative = 0;
    }
    return this;
  };

  BN.prototype.inspect = function inspect () {
    return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';
  };

  /*

  var zeros = [];
  var groupSizes = [];
  var groupBases = [];

  var s = '';
  var i = -1;
  while (++i < BN.wordSize) {
    zeros[i] = s;
    s += '0';
  }
  groupSizes[0] = 0;
  groupSizes[1] = 0;
  groupBases[0] = 0;
  groupBases[1] = 0;
  var base = 2 - 1;
  while (++base < 36 + 1) {
    var groupSize = 0;
    var groupBase = 1;
    while (groupBase < (1 << BN.wordSize) / base) {
      groupBase *= base;
      groupSize += 1;
    }
    groupSizes[base] = groupSize;
    groupBases[base] = groupBase;
  }

  */

  var zeros = [
    '',
    '0',
    '00',
    '000',
    '0000',
    '00000',
    '000000',
    '0000000',
    '00000000',
    '000000000',
    '0000000000',
    '00000000000',
    '000000000000',
    '0000000000000',
    '00000000000000',
    '000000000000000',
    '0000000000000000',
    '00000000000000000',
    '000000000000000000',
    '0000000000000000000',
    '00000000000000000000',
    '000000000000000000000',
    '0000000000000000000000',
    '00000000000000000000000',
    '000000000000000000000000',
    '0000000000000000000000000'
  ];

  var groupSizes = [
    0, 0,
    25, 16, 12, 11, 10, 9, 8,
    8, 7, 7, 7, 7, 6, 6,
    6, 6, 6, 6, 6, 5, 5,
    5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5
  ];

  var groupBases = [
    0, 0,
    33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,
    43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,
    16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,
    6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,
    24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176
  ];

  BN.prototype.toString = function toString (base, padding) {
    base = base || 10;
    padding = padding | 0 || 1;

    var out;
    if (base === 16 || base === 'hex') {
      out = '';
      var off = 0;
      var carry = 0;
      for (var i = 0; i < this.length; i++) {
        var w = this.words[i];
        var word = (((w << off) | carry) & 0xffffff).toString(16);
        carry = (w >>> (24 - off)) & 0xffffff;
        if (carry !== 0 || i !== this.length - 1) {
          out = zeros[6 - word.length] + word + out;
        } else {
          out = word + out;
        }
        off += 2;
        if (off >= 26) {
          off -= 26;
          i--;
        }
      }
      if (carry !== 0) {
        out = carry.toString(16) + out;
      }
      while (out.length % padding !== 0) {
        out = '0' + out;
      }
      if (this.negative !== 0) {
        out = '-' + out;
      }
      return out;
    }

    if (base === (base | 0) && base >= 2 && base <= 36) {
      // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));
      var groupSize = groupSizes[base];
      // var groupBase = Math.pow(base, groupSize);
      var groupBase = groupBases[base];
      out = '';
      var c = this.clone();
      c.negative = 0;
      while (!c.isZero()) {
        var r = c.modn(groupBase).toString(base);
        c = c.idivn(groupBase);

        if (!c.isZero()) {
          out = zeros[groupSize - r.length] + r + out;
        } else {
          out = r + out;
        }
      }
      if (this.isZero()) {
        out = '0' + out;
      }
      while (out.length % padding !== 0) {
        out = '0' + out;
      }
      if (this.negative !== 0) {
        out = '-' + out;
      }
      return out;
    }

    assert(false, 'Base should be between 2 and 36');
  };

  BN.prototype.toNumber = function toNumber () {
    var ret = this.words[0];
    if (this.length === 2) {
      ret += this.words[1] * 0x4000000;
    } else if (this.length === 3 && this.words[2] === 0x01) {
      // NOTE: at this stage it is known that the top bit is set
      ret += 0x10000000000000 + (this.words[1] * 0x4000000);
    } else if (this.length > 2) {
      assert(false, 'Number can only safely store up to 53 bits');
    }
    return (this.negative !== 0) ? -ret : ret;
  };

  BN.prototype.toJSON = function toJSON () {
    return this.toString(16);
  };

  BN.prototype.toBuffer = function toBuffer (endian, length) {
    assert(typeof Buffer !== 'undefined');
    return this.toArrayLike(Buffer, endian, length);
  };

  BN.prototype.toArray = function toArray (endian, length) {
    return this.toArrayLike(Array, endian, length);
  };

  BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {
    var byteLength = this.byteLength();
    var reqLength = length || Math.max(1, byteLength);
    assert(byteLength <= reqLength, 'byte array longer than desired length');
    assert(reqLength > 0, 'Requested array length <= 0');

    this.strip();
    var littleEndian = endian === 'le';
    var res = new ArrayType(reqLength);

    var b, i;
    var q = this.clone();
    if (!littleEndian) {
      // Assume big-endian
      for (i = 0; i < reqLength - byteLength; i++) {
        res[i] = 0;
      }

      for (i = 0; !q.isZero(); i++) {
        b = q.andln(0xff);
        q.iushrn(8);

        res[reqLength - i - 1] = b;
      }
    } else {
      for (i = 0; !q.isZero(); i++) {
        b = q.andln(0xff);
        q.iushrn(8);

        res[i] = b;
      }

      for (; i < reqLength; i++) {
        res[i] = 0;
      }
    }

    return res;
  };

  if (Math.clz32) {
    BN.prototype._countBits = function _countBits (w) {
      return 32 - Math.clz32(w);
    };
  } else {
    BN.prototype._countBits = function _countBits (w) {
      var t = w;
      var r = 0;
      if (t >= 0x1000) {
        r += 13;
        t >>>= 13;
      }
      if (t >= 0x40) {
        r += 7;
        t >>>= 7;
      }
      if (t >= 0x8) {
        r += 4;
        t >>>= 4;
      }
      if (t >= 0x02) {
        r += 2;
        t >>>= 2;
      }
      return r + t;
    };
  }

  BN.prototype._zeroBits = function _zeroBits (w) {
    // Short-cut
    if (w === 0) return 26;

    var t = w;
    var r = 0;
    if ((t & 0x1fff) === 0) {
      r += 13;
      t >>>= 13;
    }
    if ((t & 0x7f) === 0) {
      r += 7;
      t >>>= 7;
    }
    if ((t & 0xf) === 0) {
      r += 4;
      t >>>= 4;
    }
    if ((t & 0x3) === 0) {
      r += 2;
      t >>>= 2;
    }
    if ((t & 0x1) === 0) {
      r++;
    }
    return r;
  };

  // Return number of used bits in a BN
  BN.prototype.bitLength = function bitLength () {
    var w = this.words[this.length - 1];
    var hi = this._countBits(w);
    return (this.length - 1) * 26 + hi;
  };

  function toBitArray (num) {
    var w = new Array(num.bitLength());

    for (var bit = 0; bit < w.length; bit++) {
      var off = (bit / 26) | 0;
      var wbit = bit % 26;

      w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;
    }

    return w;
  }

  // Number of trailing zero bits
  BN.prototype.zeroBits = function zeroBits () {
    if (this.isZero()) return 0;

    var r = 0;
    for (var i = 0; i < this.length; i++) {
      var b = this._zeroBits(this.words[i]);
      r += b;
      if (b !== 26) break;
    }
    return r;
  };

  BN.prototype.byteLength = function byteLength () {
    return Math.ceil(this.bitLength() / 8);
  };

  BN.prototype.toTwos = function toTwos (width) {
    if (this.negative !== 0) {
      return this.abs().inotn(width).iaddn(1);
    }
    return this.clone();
  };

  BN.prototype.fromTwos = function fromTwos (width) {
    if (this.testn(width - 1)) {
      return this.notn(width).iaddn(1).ineg();
    }
    return this.clone();
  };

  BN.prototype.isNeg = function isNeg () {
    return this.negative !== 0;
  };

  // Return negative clone of `this`
  BN.prototype.neg = function neg () {
    return this.clone().ineg();
  };

  BN.prototype.ineg = function ineg () {
    if (!this.isZero()) {
      this.negative ^= 1;
    }

    return this;
  };

  // Or `num` with `this` in-place
  BN.prototype.iuor = function iuor (num) {
    while (this.length < num.length) {
      this.words[this.length++] = 0;
    }

    for (var i = 0; i < num.length; i++) {
      this.words[i] = this.words[i] | num.words[i];
    }

    return this.strip();
  };

  BN.prototype.ior = function ior (num) {
    assert((this.negative | num.negative) === 0);
    return this.iuor(num);
  };

  // Or `num` with `this`
  BN.prototype.or = function or (num) {
    if (this.length > num.length) return this.clone().ior(num);
    return num.clone().ior(this);
  };

  BN.prototype.uor = function uor (num) {
    if (this.length > num.length) return this.clone().iuor(num);
    return num.clone().iuor(this);
  };

  // And `num` with `this` in-place
  BN.prototype.iuand = function iuand (num) {
    // b = min-length(num, this)
    var b;
    if (this.length > num.length) {
      b = num;
    } else {
      b = this;
    }

    for (var i = 0; i < b.length; i++) {
      this.words[i] = this.words[i] & num.words[i];
    }

    this.length = b.length;

    return this.strip();
  };

  BN.prototype.iand = function iand (num) {
    assert((this.negative | num.negative) === 0);
    return this.iuand(num);
  };

  // And `num` with `this`
  BN.prototype.and = function and (num) {
    if (this.length > num.length) return this.clone().iand(num);
    return num.clone().iand(this);
  };

  BN.prototype.uand = function uand (num) {
    if (this.length > num.length) return this.clone().iuand(num);
    return num.clone().iuand(this);
  };

  // Xor `num` with `this` in-place
  BN.prototype.iuxor = function iuxor (num) {
    // a.length > b.length
    var a;
    var b;
    if (this.length > num.length) {
      a = this;
      b = num;
    } else {
      a = num;
      b = this;
    }

    for (var i = 0; i < b.length; i++) {
      this.words[i] = a.words[i] ^ b.words[i];
    }

    if (this !== a) {
      for (; i < a.length; i++) {
        this.words[i] = a.words[i];
      }
    }

    this.length = a.length;

    return this.strip();
  };

  BN.prototype.ixor = function ixor (num) {
    assert((this.negative | num.negative) === 0);
    return this.iuxor(num);
  };

  // Xor `num` with `this`
  BN.prototype.xor = function xor (num) {
    if (this.length > num.length) return this.clone().ixor(num);
    return num.clone().ixor(this);
  };

  BN.prototype.uxor = function uxor (num) {
    if (this.length > num.length) return this.clone().iuxor(num);
    return num.clone().iuxor(this);
  };

  // Not ``this`` with ``width`` bitwidth
  BN.prototype.inotn = function inotn (width) {
    assert(typeof width === 'number' && width >= 0);

    var bytesNeeded = Math.ceil(width / 26) | 0;
    var bitsLeft = width % 26;

    // Extend the buffer with leading zeroes
    this._expand(bytesNeeded);

    if (bitsLeft > 0) {
      bytesNeeded--;
    }

    // Handle complete words
    for (var i = 0; i < bytesNeeded; i++) {
      this.words[i] = ~this.words[i] & 0x3ffffff;
    }

    // Handle the residue
    if (bitsLeft > 0) {
      this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));
    }

    // And remove leading zeroes
    return this.strip();
  };

  BN.prototype.notn = function notn (width) {
    return this.clone().inotn(width);
  };

  // Set `bit` of `this`
  BN.prototype.setn = function setn (bit, val) {
    assert(typeof bit === 'number' && bit >= 0);

    var off = (bit / 26) | 0;
    var wbit = bit % 26;

    this._expand(off + 1);

    if (val) {
      this.words[off] = this.words[off] | (1 << wbit);
    } else {
      this.words[off] = this.words[off] & ~(1 << wbit);
    }

    return this.strip();
  };

  // Add `num` to `this` in-place
  BN.prototype.iadd = function iadd (num) {
    var r;

    // negative + positive
    if (this.negative !== 0 && num.negative === 0) {
      this.negative = 0;
      r = this.isub(num);
      this.negative ^= 1;
      return this._normSign();

    // positive + negative
    } else if (this.negative === 0 && num.negative !== 0) {
      num.negative = 0;
      r = this.isub(num);
      num.negative = 1;
      return r._normSign();
    }

    // a.length > b.length
    var a, b;
    if (this.length > num.length) {
      a = this;
      b = num;
    } else {
      a = num;
      b = this;
    }

    var carry = 0;
    for (var i = 0; i < b.length; i++) {
      r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
      this.words[i] = r & 0x3ffffff;
      carry = r >>> 26;
    }
    for (; carry !== 0 && i < a.length; i++) {
      r = (a.words[i] | 0) + carry;
      this.words[i] = r & 0x3ffffff;
      carry = r >>> 26;
    }

    this.length = a.length;
    if (carry !== 0) {
      this.words[this.length] = carry;
      this.length++;
    // Copy the rest of the words
    } else if (a !== this) {
      for (; i < a.length; i++) {
        this.words[i] = a.words[i];
      }
    }

    return this;
  };

  // Add `num` to `this`
  BN.prototype.add = function add (num) {
    var res;
    if (num.negative !== 0 && this.negative === 0) {
      num.negative = 0;
      res = this.sub(num);
      num.negative ^= 1;
      return res;
    } else if (num.negative === 0 && this.negative !== 0) {
      this.negative = 0;
      res = num.sub(this);
      this.negative = 1;
      return res;
    }

    if (this.length > num.length) return this.clone().iadd(num);

    return num.clone().iadd(this);
  };

  // Subtract `num` from `this` in-place
  BN.prototype.isub = function isub (num) {
    // this - (-num) = this + num
    if (num.negative !== 0) {
      num.negative = 0;
      var r = this.iadd(num);
      num.negative = 1;
      return r._normSign();

    // -this - num = -(this + num)
    } else if (this.negative !== 0) {
      this.negative = 0;
      this.iadd(num);
      this.negative = 1;
      return this._normSign();
    }

    // At this point both numbers are positive
    var cmp = this.cmp(num);

    // Optimization - zeroify
    if (cmp === 0) {
      this.negative = 0;
      this.length = 1;
      this.words[0] = 0;
      return this;
    }

    // a > b
    var a, b;
    if (cmp > 0) {
      a = this;
      b = num;
    } else {
      a = num;
      b = this;
    }

    var carry = 0;
    for (var i = 0; i < b.length; i++) {
      r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
      carry = r >> 26;
      this.words[i] = r & 0x3ffffff;
    }
    for (; carry !== 0 && i < a.length; i++) {
      r = (a.words[i] | 0) + carry;
      carry = r >> 26;
      this.words[i] = r & 0x3ffffff;
    }

    // Copy rest of the words
    if (carry === 0 && i < a.length && a !== this) {
      for (; i < a.length; i++) {
        this.words[i] = a.words[i];
      }
    }

    this.length = Math.max(this.length, i);

    if (a !== this) {
      this.negative = 1;
    }

    return this.strip();
  };

  // Subtract `num` from `this`
  BN.prototype.sub = function sub (num) {
    return this.clone().isub(num);
  };

  function smallMulTo (self, num, out) {
    out.negative = num.negative ^ self.negative;
    var len = (self.length + num.length) | 0;
    out.length = len;
    len = (len - 1) | 0;

    // Peel one iteration (compiler can't do it, because of code complexity)
    var a = self.words[0] | 0;
    var b = num.words[0] | 0;
    var r = a * b;

    var lo = r & 0x3ffffff;
    var carry = (r / 0x4000000) | 0;
    out.words[0] = lo;

    for (var k = 1; k < len; k++) {
      // Sum all words with the same `i + j = k` and accumulate `ncarry`,
      // note that ncarry could be >= 0x3ffffff
      var ncarry = carry >>> 26;
      var rword = carry & 0x3ffffff;
      var maxJ = Math.min(k, num.length - 1);
      for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
        var i = (k - j) | 0;
        a = self.words[i] | 0;
        b = num.words[j] | 0;
        r = a * b + rword;
        ncarry += (r / 0x4000000) | 0;
        rword = r & 0x3ffffff;
      }
      out.words[k] = rword | 0;
      carry = ncarry | 0;
    }
    if (carry !== 0) {
      out.words[k] = carry | 0;
    } else {
      out.length--;
    }

    return out.strip();
  }

  // TODO(indutny): it may be reasonable to omit it for users who don't need
  // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit
  // multiplication (like elliptic secp256k1).
  var comb10MulTo = function comb10MulTo (self, num, out) {
    var a = self.words;
    var b = num.words;
    var o = out.words;
    var c = 0;
    var lo;
    var mid;
    var hi;
    var a0 = a[0] | 0;
    var al0 = a0 & 0x1fff;
    var ah0 = a0 >>> 13;
    var a1 = a[1] | 0;
    var al1 = a1 & 0x1fff;
    var ah1 = a1 >>> 13;
    var a2 = a[2] | 0;
    var al2 = a2 & 0x1fff;
    var ah2 = a2 >>> 13;
    var a3 = a[3] | 0;
    var al3 = a3 & 0x1fff;
    var ah3 = a3 >>> 13;
    var a4 = a[4] | 0;
    var al4 = a4 & 0x1fff;
    var ah4 = a4 >>> 13;
    var a5 = a[5] | 0;
    var al5 = a5 & 0x1fff;
    var ah5 = a5 >>> 13;
    var a6 = a[6] | 0;
    var al6 = a6 & 0x1fff;
    var ah6 = a6 >>> 13;
    var a7 = a[7] | 0;
    var al7 = a7 & 0x1fff;
    var ah7 = a7 >>> 13;
    var a8 = a[8] | 0;
    var al8 = a8 & 0x1fff;
    var ah8 = a8 >>> 13;
    var a9 = a[9] | 0;
    var al9 = a9 & 0x1fff;
    var ah9 = a9 >>> 13;
    var b0 = b[0] | 0;
    var bl0 = b0 & 0x1fff;
    var bh0 = b0 >>> 13;
    var b1 = b[1] | 0;
    var bl1 = b1 & 0x1fff;
    var bh1 = b1 >>> 13;
    var b2 = b[2] | 0;
    var bl2 = b2 & 0x1fff;
    var bh2 = b2 >>> 13;
    var b3 = b[3] | 0;
    var bl3 = b3 & 0x1fff;
    var bh3 = b3 >>> 13;
    var b4 = b[4] | 0;
    var bl4 = b4 & 0x1fff;
    var bh4 = b4 >>> 13;
    var b5 = b[5] | 0;
    var bl5 = b5 & 0x1fff;
    var bh5 = b5 >>> 13;
    var b6 = b[6] | 0;
    var bl6 = b6 & 0x1fff;
    var bh6 = b6 >>> 13;
    var b7 = b[7] | 0;
    var bl7 = b7 & 0x1fff;
    var bh7 = b7 >>> 13;
    var b8 = b[8] | 0;
    var bl8 = b8 & 0x1fff;
    var bh8 = b8 >>> 13;
    var b9 = b[9] | 0;
    var bl9 = b9 & 0x1fff;
    var bh9 = b9 >>> 13;

    out.negative = self.negative ^ num.negative;
    out.length = 19;
    /* k = 0 */
    lo = Math.imul(al0, bl0);
    mid = Math.imul(al0, bh0);
    mid = (mid + Math.imul(ah0, bl0)) | 0;
    hi = Math.imul(ah0, bh0);
    var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;
    w0 &= 0x3ffffff;
    /* k = 1 */
    lo = Math.imul(al1, bl0);
    mid = Math.imul(al1, bh0);
    mid = (mid + Math.imul(ah1, bl0)) | 0;
    hi = Math.imul(ah1, bh0);
    lo = (lo + Math.imul(al0, bl1)) | 0;
    mid = (mid + Math.imul(al0, bh1)) | 0;
    mid = (mid + Math.imul(ah0, bl1)) | 0;
    hi = (hi + Math.imul(ah0, bh1)) | 0;
    var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;
    w1 &= 0x3ffffff;
    /* k = 2 */
    lo = Math.imul(al2, bl0);
    mid = Math.imul(al2, bh0);
    mid = (mid + Math.imul(ah2, bl0)) | 0;
    hi = Math.imul(ah2, bh0);
    lo = (lo + Math.imul(al1, bl1)) | 0;
    mid = (mid + Math.imul(al1, bh1)) | 0;
    mid = (mid + Math.imul(ah1, bl1)) | 0;
    hi = (hi + Math.imul(ah1, bh1)) | 0;
    lo = (lo + Math.imul(al0, bl2)) | 0;
    mid = (mid + Math.imul(al0, bh2)) | 0;
    mid = (mid + Math.imul(ah0, bl2)) | 0;
    hi = (hi + Math.imul(ah0, bh2)) | 0;
    var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;
    w2 &= 0x3ffffff;
    /* k = 3 */
    lo = Math.imul(al3, bl0);
    mid = Math.imul(al3, bh0);
    mid = (mid + Math.imul(ah3, bl0)) | 0;
    hi = Math.imul(ah3, bh0);
    lo = (lo + Math.imul(al2, bl1)) | 0;
    mid = (mid + Math.imul(al2, bh1)) | 0;
    mid = (mid + Math.imul(ah2, bl1)) | 0;
    hi = (hi + Math.imul(ah2, bh1)) | 0;
    lo = (lo + Math.imul(al1, bl2)) | 0;
    mid = (mid + Math.imul(al1, bh2)) | 0;
    mid = (mid + Math.imul(ah1, bl2)) | 0;
    hi = (hi + Math.imul(ah1, bh2)) | 0;
    lo = (lo + Math.imul(al0, bl3)) | 0;
    mid = (mid + Math.imul(al0, bh3)) | 0;
    mid = (mid + Math.imul(ah0, bl3)) | 0;
    hi = (hi + Math.imul(ah0, bh3)) | 0;
    var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;
    w3 &= 0x3ffffff;
    /* k = 4 */
    lo = Math.imul(al4, bl0);
    mid = Math.imul(al4, bh0);
    mid = (mid + Math.imul(ah4, bl0)) | 0;
    hi = Math.imul(ah4, bh0);
    lo = (lo + Math.imul(al3, bl1)) | 0;
    mid = (mid + Math.imul(al3, bh1)) | 0;
    mid = (mid + Math.imul(ah3, bl1)) | 0;
    hi = (hi + Math.imul(ah3, bh1)) | 0;
    lo = (lo + Math.imul(al2, bl2)) | 0;
    mid = (mid + Math.imul(al2, bh2)) | 0;
    mid = (mid + Math.imul(ah2, bl2)) | 0;
    hi = (hi + Math.imul(ah2, bh2)) | 0;
    lo = (lo + Math.imul(al1, bl3)) | 0;
    mid = (mid + Math.imul(al1, bh3)) | 0;
    mid = (mid + Math.imul(ah1, bl3)) | 0;
    hi = (hi + Math.imul(ah1, bh3)) | 0;
    lo = (lo + Math.imul(al0, bl4)) | 0;
    mid = (mid + Math.imul(al0, bh4)) | 0;
    mid = (mid + Math.imul(ah0, bl4)) | 0;
    hi = (hi + Math.imul(ah0, bh4)) | 0;
    var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;
    w4 &= 0x3ffffff;
    /* k = 5 */
    lo = Math.imul(al5, bl0);
    mid = Math.imul(al5, bh0);
    mid = (mid + Math.imul(ah5, bl0)) | 0;
    hi = Math.imul(ah5, bh0);
    lo = (lo + Math.imul(al4, bl1)) | 0;
    mid = (mid + Math.imul(al4, bh1)) | 0;
    mid = (mid + Math.imul(ah4, bl1)) | 0;
    hi = (hi + Math.imul(ah4, bh1)) | 0;
    lo = (lo + Math.imul(al3, bl2)) | 0;
    mid = (mid + Math.imul(al3, bh2)) | 0;
    mid = (mid + Math.imul(ah3, bl2)) | 0;
    hi = (hi + Math.imul(ah3, bh2)) | 0;
    lo = (lo + Math.imul(al2, bl3)) | 0;
    mid = (mid + Math.imul(al2, bh3)) | 0;
    mid = (mid + Math.imul(ah2, bl3)) | 0;
    hi = (hi + Math.imul(ah2, bh3)) | 0;
    lo = (lo + Math.imul(al1, bl4)) | 0;
    mid = (mid + Math.imul(al1, bh4)) | 0;
    mid = (mid + Math.imul(ah1, bl4)) | 0;
    hi = (hi + Math.imul(ah1, bh4)) | 0;
    lo = (lo + Math.imul(al0, bl5)) | 0;
    mid = (mid + Math.imul(al0, bh5)) | 0;
    mid = (mid + Math.imul(ah0, bl5)) | 0;
    hi = (hi + Math.imul(ah0, bh5)) | 0;
    var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;
    w5 &= 0x3ffffff;
    /* k = 6 */
    lo = Math.imul(al6, bl0);
    mid = Math.imul(al6, bh0);
    mid = (mid + Math.imul(ah6, bl0)) | 0;
    hi = Math.imul(ah6, bh0);
    lo = (lo + Math.imul(al5, bl1)) | 0;
    mid = (mid + Math.imul(al5, bh1)) | 0;
    mid = (mid + Math.imul(ah5, bl1)) | 0;
    hi = (hi + Math.imul(ah5, bh1)) | 0;
    lo = (lo + Math.imul(al4, bl2)) | 0;
    mid = (mid + Math.imul(al4, bh2)) | 0;
    mid = (mid + Math.imul(ah4, bl2)) | 0;
    hi = (hi + Math.imul(ah4, bh2)) | 0;
    lo = (lo + Math.imul(al3, bl3)) | 0;
    mid = (mid + Math.imul(al3, bh3)) | 0;
    mid = (mid + Math.imul(ah3, bl3)) | 0;
    hi = (hi + Math.imul(ah3, bh3)) | 0;
    lo = (lo + Math.imul(al2, bl4)) | 0;
    mid = (mid + Math.imul(al2, bh4)) | 0;
    mid = (mid + Math.imul(ah2, bl4)) | 0;
    hi = (hi + Math.imul(ah2, bh4)) | 0;
    lo = (lo + Math.imul(al1, bl5)) | 0;
    mid = (mid + Math.imul(al1, bh5)) | 0;
    mid = (mid + Math.imul(ah1, bl5)) | 0;
    hi = (hi + Math.imul(ah1, bh5)) | 0;
    lo = (lo + Math.imul(al0, bl6)) | 0;
    mid = (mid + Math.imul(al0, bh6)) | 0;
    mid = (mid + Math.imul(ah0, bl6)) | 0;
    hi = (hi + Math.imul(ah0, bh6)) | 0;
    var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;
    w6 &= 0x3ffffff;
    /* k = 7 */
    lo = Math.imul(al7, bl0);
    mid = Math.imul(al7, bh0);
    mid = (mid + Math.imul(ah7, bl0)) | 0;
    hi = Math.imul(ah7, bh0);
    lo = (lo + Math.imul(al6, bl1)) | 0;
    mid = (mid + Math.imul(al6, bh1)) | 0;
    mid = (mid + Math.imul(ah6, bl1)) | 0;
    hi = (hi + Math.imul(ah6, bh1)) | 0;
    lo = (lo + Math.imul(al5, bl2)) | 0;
    mid = (mid + Math.imul(al5, bh2)) | 0;
    mid = (mid + Math.imul(ah5, bl2)) | 0;
    hi = (hi + Math.imul(ah5, bh2)) | 0;
    lo = (lo + Math.imul(al4, bl3)) | 0;
    mid = (mid + Math.imul(al4, bh3)) | 0;
    mid = (mid + Math.imul(ah4, bl3)) | 0;
    hi = (hi + Math.imul(ah4, bh3)) | 0;
    lo = (lo + Math.imul(al3, bl4)) | 0;
    mid = (mid + Math.imul(al3, bh4)) | 0;
    mid = (mid + Math.imul(ah3, bl4)) | 0;
    hi = (hi + Math.imul(ah3, bh4)) | 0;
    lo = (lo + Math.imul(al2, bl5)) | 0;
    mid = (mid + Math.imul(al2, bh5)) | 0;
    mid = (mid + Math.imul(ah2, bl5)) | 0;
    hi = (hi + Math.imul(ah2, bh5)) | 0;
    lo = (lo + Math.imul(al1, bl6)) | 0;
    mid = (mid + Math.imul(al1, bh6)) | 0;
    mid = (mid + Math.imul(ah1, bl6)) | 0;
    hi = (hi + Math.imul(ah1, bh6)) | 0;
    lo = (lo + Math.imul(al0, bl7)) | 0;
    mid = (mid + Math.imul(al0, bh7)) | 0;
    mid = (mid + Math.imul(ah0, bl7)) | 0;
    hi = (hi + Math.imul(ah0, bh7)) | 0;
    var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;
    w7 &= 0x3ffffff;
    /* k = 8 */
    lo = Math.imul(al8, bl0);
    mid = Math.imul(al8, bh0);
    mid = (mid + Math.imul(ah8, bl0)) | 0;
    hi = Math.imul(ah8, bh0);
    lo = (lo + Math.imul(al7, bl1)) | 0;
    mid = (mid + Math.imul(al7, bh1)) | 0;
    mid = (mid + Math.imul(ah7, bl1)) | 0;
    hi = (hi + Math.imul(ah7, bh1)) | 0;
    lo = (lo + Math.imul(al6, bl2)) | 0;
    mid = (mid + Math.imul(al6, bh2)) | 0;
    mid = (mid + Math.imul(ah6, bl2)) | 0;
    hi = (hi + Math.imul(ah6, bh2)) | 0;
    lo = (lo + Math.imul(al5, bl3)) | 0;
    mid = (mid + Math.imul(al5, bh3)) | 0;
    mid = (mid + Math.imul(ah5, bl3)) | 0;
    hi = (hi + Math.imul(ah5, bh3)) | 0;
    lo = (lo + Math.imul(al4, bl4)) | 0;
    mid = (mid + Math.imul(al4, bh4)) | 0;
    mid = (mid + Math.imul(ah4, bl4)) | 0;
    hi = (hi + Math.imul(ah4, bh4)) | 0;
    lo = (lo + Math.imul(al3, bl5)) | 0;
    mid = (mid + Math.imul(al3, bh5)) | 0;
    mid = (mid + Math.imul(ah3, bl5)) | 0;
    hi = (hi + Math.imul(ah3, bh5)) | 0;
    lo = (lo + Math.imul(al2, bl6)) | 0;
    mid = (mid + Math.imul(al2, bh6)) | 0;
    mid = (mid + Math.imul(ah2, bl6)) | 0;
    hi = (hi + Math.imul(ah2, bh6)) | 0;
    lo = (lo + Math.imul(al1, bl7)) | 0;
    mid = (mid + Math.imul(al1, bh7)) | 0;
    mid = (mid + Math.imul(ah1, bl7)) | 0;
    hi = (hi + Math.imul(ah1, bh7)) | 0;
    lo = (lo + Math.imul(al0, bl8)) | 0;
    mid = (mid + Math.imul(al0, bh8)) | 0;
    mid = (mid + Math.imul(ah0, bl8)) | 0;
    hi = (hi + Math.imul(ah0, bh8)) | 0;
    var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;
    w8 &= 0x3ffffff;
    /* k = 9 */
    lo = Math.imul(al9, bl0);
    mid = Math.imul(al9, bh0);
    mid = (mid + Math.imul(ah9, bl0)) | 0;
    hi = Math.imul(ah9, bh0);
    lo = (lo + Math.imul(al8, bl1)) | 0;
    mid = (mid + Math.imul(al8, bh1)) | 0;
    mid = (mid + Math.imul(ah8, bl1)) | 0;
    hi = (hi + Math.imul(ah8, bh1)) | 0;
    lo = (lo + Math.imul(al7, bl2)) | 0;
    mid = (mid + Math.imul(al7, bh2)) | 0;
    mid = (mid + Math.imul(ah7, bl2)) | 0;
    hi = (hi + Math.imul(ah7, bh2)) | 0;
    lo = (lo + Math.imul(al6, bl3)) | 0;
    mid = (mid + Math.imul(al6, bh3)) | 0;
    mid = (mid + Math.imul(ah6, bl3)) | 0;
    hi = (hi + Math.imul(ah6, bh3)) | 0;
    lo = (lo + Math.imul(al5, bl4)) | 0;
    mid = (mid + Math.imul(al5, bh4)) | 0;
    mid = (mid + Math.imul(ah5, bl4)) | 0;
    hi = (hi + Math.imul(ah5, bh4)) | 0;
    lo = (lo + Math.imul(al4, bl5)) | 0;
    mid = (mid + Math.imul(al4, bh5)) | 0;
    mid = (mid + Math.imul(ah4, bl5)) | 0;
    hi = (hi + Math.imul(ah4, bh5)) | 0;
    lo = (lo + Math.imul(al3, bl6)) | 0;
    mid = (mid + Math.imul(al3, bh6)) | 0;
    mid = (mid + Math.imul(ah3, bl6)) | 0;
    hi = (hi + Math.imul(ah3, bh6)) | 0;
    lo = (lo + Math.imul(al2, bl7)) | 0;
    mid = (mid + Math.imul(al2, bh7)) | 0;
    mid = (mid + Math.imul(ah2, bl7)) | 0;
    hi = (hi + Math.imul(ah2, bh7)) | 0;
    lo = (lo + Math.imul(al1, bl8)) | 0;
    mid = (mid + Math.imul(al1, bh8)) | 0;
    mid = (mid + Math.imul(ah1, bl8)) | 0;
    hi = (hi + Math.imul(ah1, bh8)) | 0;
    lo = (lo + Math.imul(al0, bl9)) | 0;
    mid = (mid + Math.imul(al0, bh9)) | 0;
    mid = (mid + Math.imul(ah0, bl9)) | 0;
    hi = (hi + Math.imul(ah0, bh9)) | 0;
    var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;
    w9 &= 0x3ffffff;
    /* k = 10 */
    lo = Math.imul(al9, bl1);
    mid = Math.imul(al9, bh1);
    mid = (mid + Math.imul(ah9, bl1)) | 0;
    hi = Math.imul(ah9, bh1);
    lo = (lo + Math.imul(al8, bl2)) | 0;
    mid = (mid + Math.imul(al8, bh2)) | 0;
    mid = (mid + Math.imul(ah8, bl2)) | 0;
    hi = (hi + Math.imul(ah8, bh2)) | 0;
    lo = (lo + Math.imul(al7, bl3)) | 0;
    mid = (mid + Math.imul(al7, bh3)) | 0;
    mid = (mid + Math.imul(ah7, bl3)) | 0;
    hi = (hi + Math.imul(ah7, bh3)) | 0;
    lo = (lo + Math.imul(al6, bl4)) | 0;
    mid = (mid + Math.imul(al6, bh4)) | 0;
    mid = (mid + Math.imul(ah6, bl4)) | 0;
    hi = (hi + Math.imul(ah6, bh4)) | 0;
    lo = (lo + Math.imul(al5, bl5)) | 0;
    mid = (mid + Math.imul(al5, bh5)) | 0;
    mid = (mid + Math.imul(ah5, bl5)) | 0;
    hi = (hi + Math.imul(ah5, bh5)) | 0;
    lo = (lo + Math.imul(al4, bl6)) | 0;
    mid = (mid + Math.imul(al4, bh6)) | 0;
    mid = (mid + Math.imul(ah4, bl6)) | 0;
    hi = (hi + Math.imul(ah4, bh6)) | 0;
    lo = (lo + Math.imul(al3, bl7)) | 0;
    mid = (mid + Math.imul(al3, bh7)) | 0;
    mid = (mid + Math.imul(ah3, bl7)) | 0;
    hi = (hi + Math.imul(ah3, bh7)) | 0;
    lo = (lo + Math.imul(al2, bl8)) | 0;
    mid = (mid + Math.imul(al2, bh8)) | 0;
    mid = (mid + Math.imul(ah2, bl8)) | 0;
    hi = (hi + Math.imul(ah2, bh8)) | 0;
    lo = (lo + Math.imul(al1, bl9)) | 0;
    mid = (mid + Math.imul(al1, bh9)) | 0;
    mid = (mid + Math.imul(ah1, bl9)) | 0;
    hi = (hi + Math.imul(ah1, bh9)) | 0;
    var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;
    w10 &= 0x3ffffff;
    /* k = 11 */
    lo = Math.imul(al9, bl2);
    mid = Math.imul(al9, bh2);
    mid = (mid + Math.imul(ah9, bl2)) | 0;
    hi = Math.imul(ah9, bh2);
    lo = (lo + Math.imul(al8, bl3)) | 0;
    mid = (mid + Math.imul(al8, bh3)) | 0;
    mid = (mid + Math.imul(ah8, bl3)) | 0;
    hi = (hi + Math.imul(ah8, bh3)) | 0;
    lo = (lo + Math.imul(al7, bl4)) | 0;
    mid = (mid + Math.imul(al7, bh4)) | 0;
    mid = (mid + Math.imul(ah7, bl4)) | 0;
    hi = (hi + Math.imul(ah7, bh4)) | 0;
    lo = (lo + Math.imul(al6, bl5)) | 0;
    mid = (mid + Math.imul(al6, bh5)) | 0;
    mid = (mid + Math.imul(ah6, bl5)) | 0;
    hi = (hi + Math.imul(ah6, bh5)) | 0;
    lo = (lo + Math.imul(al5, bl6)) | 0;
    mid = (mid + Math.imul(al5, bh6)) | 0;
    mid = (mid + Math.imul(ah5, bl6)) | 0;
    hi = (hi + Math.imul(ah5, bh6)) | 0;
    lo = (lo + Math.imul(al4, bl7)) | 0;
    mid = (mid + Math.imul(al4, bh7)) | 0;
    mid = (mid + Math.imul(ah4, bl7)) | 0;
    hi = (hi + Math.imul(ah4, bh7)) | 0;
    lo = (lo + Math.imul(al3, bl8)) | 0;
    mid = (mid + Math.imul(al3, bh8)) | 0;
    mid = (mid + Math.imul(ah3, bl8)) | 0;
    hi = (hi + Math.imul(ah3, bh8)) | 0;
    lo = (lo + Math.imul(al2, bl9)) | 0;
    mid = (mid + Math.imul(al2, bh9)) | 0;
    mid = (mid + Math.imul(ah2, bl9)) | 0;
    hi = (hi + Math.imul(ah2, bh9)) | 0;
    var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;
    w11 &= 0x3ffffff;
    /* k = 12 */
    lo = Math.imul(al9, bl3);
    mid = Math.imul(al9, bh3);
    mid = (mid + Math.imul(ah9, bl3)) | 0;
    hi = Math.imul(ah9, bh3);
    lo = (lo + Math.imul(al8, bl4)) | 0;
    mid = (mid + Math.imul(al8, bh4)) | 0;
    mid = (mid + Math.imul(ah8, bl4)) | 0;
    hi = (hi + Math.imul(ah8, bh4)) | 0;
    lo = (lo + Math.imul(al7, bl5)) | 0;
    mid = (mid + Math.imul(al7, bh5)) | 0;
    mid = (mid + Math.imul(ah7, bl5)) | 0;
    hi = (hi + Math.imul(ah7, bh5)) | 0;
    lo = (lo + Math.imul(al6, bl6)) | 0;
    mid = (mid + Math.imul(al6, bh6)) | 0;
    mid = (mid + Math.imul(ah6, bl6)) | 0;
    hi = (hi + Math.imul(ah6, bh6)) | 0;
    lo = (lo + Math.imul(al5, bl7)) | 0;
    mid = (mid + Math.imul(al5, bh7)) | 0;
    mid = (mid + Math.imul(ah5, bl7)) | 0;
    hi = (hi + Math.imul(ah5, bh7)) | 0;
    lo = (lo + Math.imul(al4, bl8)) | 0;
    mid = (mid + Math.imul(al4, bh8)) | 0;
    mid = (mid + Math.imul(ah4, bl8)) | 0;
    hi = (hi + Math.imul(ah4, bh8)) | 0;
    lo = (lo + Math.imul(al3, bl9)) | 0;
    mid = (mid + Math.imul(al3, bh9)) | 0;
    mid = (mid + Math.imul(ah3, bl9)) | 0;
    hi = (hi + Math.imul(ah3, bh9)) | 0;
    var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;
    w12 &= 0x3ffffff;
    /* k = 13 */
    lo = Math.imul(al9, bl4);
    mid = Math.imul(al9, bh4);
    mid = (mid + Math.imul(ah9, bl4)) | 0;
    hi = Math.imul(ah9, bh4);
    lo = (lo + Math.imul(al8, bl5)) | 0;
    mid = (mid + Math.imul(al8, bh5)) | 0;
    mid = (mid + Math.imul(ah8, bl5)) | 0;
    hi = (hi + Math.imul(ah8, bh5)) | 0;
    lo = (lo + Math.imul(al7, bl6)) | 0;
    mid = (mid + Math.imul(al7, bh6)) | 0;
    mid = (mid + Math.imul(ah7, bl6)) | 0;
    hi = (hi + Math.imul(ah7, bh6)) | 0;
    lo = (lo + Math.imul(al6, bl7)) | 0;
    mid = (mid + Math.imul(al6, bh7)) | 0;
    mid = (mid + Math.imul(ah6, bl7)) | 0;
    hi = (hi + Math.imul(ah6, bh7)) | 0;
    lo = (lo + Math.imul(al5, bl8)) | 0;
    mid = (mid + Math.imul(al5, bh8)) | 0;
    mid = (mid + Math.imul(ah5, bl8)) | 0;
    hi = (hi + Math.imul(ah5, bh8)) | 0;
    lo = (lo + Math.imul(al4, bl9)) | 0;
    mid = (mid + Math.imul(al4, bh9)) | 0;
    mid = (mid + Math.imul(ah4, bl9)) | 0;
    hi = (hi + Math.imul(ah4, bh9)) | 0;
    var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;
    w13 &= 0x3ffffff;
    /* k = 14 */
    lo = Math.imul(al9, bl5);
    mid = Math.imul(al9, bh5);
    mid = (mid + Math.imul(ah9, bl5)) | 0;
    hi = Math.imul(ah9, bh5);
    lo = (lo + Math.imul(al8, bl6)) | 0;
    mid = (mid + Math.imul(al8, bh6)) | 0;
    mid = (mid + Math.imul(ah8, bl6)) | 0;
    hi = (hi + Math.imul(ah8, bh6)) | 0;
    lo = (lo + Math.imul(al7, bl7)) | 0;
    mid = (mid + Math.imul(al7, bh7)) | 0;
    mid = (mid + Math.imul(ah7, bl7)) | 0;
    hi = (hi + Math.imul(ah7, bh7)) | 0;
    lo = (lo + Math.imul(al6, bl8)) | 0;
    mid = (mid + Math.imul(al6, bh8)) | 0;
    mid = (mid + Math.imul(ah6, bl8)) | 0;
    hi = (hi + Math.imul(ah6, bh8)) | 0;
    lo = (lo + Math.imul(al5, bl9)) | 0;
    mid = (mid + Math.imul(al5, bh9)) | 0;
    mid = (mid + Math.imul(ah5, bl9)) | 0;
    hi = (hi + Math.imul(ah5, bh9)) | 0;
    var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;
    w14 &= 0x3ffffff;
    /* k = 15 */
    lo = Math.imul(al9, bl6);
    mid = Math.imul(al9, bh6);
    mid = (mid + Math.imul(ah9, bl6)) | 0;
    hi = Math.imul(ah9, bh6);
    lo = (lo + Math.imul(al8, bl7)) | 0;
    mid = (mid + Math.imul(al8, bh7)) | 0;
    mid = (mid + Math.imul(ah8, bl7)) | 0;
    hi = (hi + Math.imul(ah8, bh7)) | 0;
    lo = (lo + Math.imul(al7, bl8)) | 0;
    mid = (mid + Math.imul(al7, bh8)) | 0;
    mid = (mid + Math.imul(ah7, bl8)) | 0;
    hi = (hi + Math.imul(ah7, bh8)) | 0;
    lo = (lo + Math.imul(al6, bl9)) | 0;
    mid = (mid + Math.imul(al6, bh9)) | 0;
    mid = (mid + Math.imul(ah6, bl9)) | 0;
    hi = (hi + Math.imul(ah6, bh9)) | 0;
    var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;
    w15 &= 0x3ffffff;
    /* k = 16 */
    lo = Math.imul(al9, bl7);
    mid = Math.imul(al9, bh7);
    mid = (mid + Math.imul(ah9, bl7)) | 0;
    hi = Math.imul(ah9, bh7);
    lo = (lo + Math.imul(al8, bl8)) | 0;
    mid = (mid + Math.imul(al8, bh8)) | 0;
    mid = (mid + Math.imul(ah8, bl8)) | 0;
    hi = (hi + Math.imul(ah8, bh8)) | 0;
    lo = (lo + Math.imul(al7, bl9)) | 0;
    mid = (mid + Math.imul(al7, bh9)) | 0;
    mid = (mid + Math.imul(ah7, bl9)) | 0;
    hi = (hi + Math.imul(ah7, bh9)) | 0;
    var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;
    w16 &= 0x3ffffff;
    /* k = 17 */
    lo = Math.imul(al9, bl8);
    mid = Math.imul(al9, bh8);
    mid = (mid + Math.imul(ah9, bl8)) | 0;
    hi = Math.imul(ah9, bh8);
    lo = (lo + Math.imul(al8, bl9)) | 0;
    mid = (mid + Math.imul(al8, bh9)) | 0;
    mid = (mid + Math.imul(ah8, bl9)) | 0;
    hi = (hi + Math.imul(ah8, bh9)) | 0;
    var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;
    w17 &= 0x3ffffff;
    /* k = 18 */
    lo = Math.imul(al9, bl9);
    mid = Math.imul(al9, bh9);
    mid = (mid + Math.imul(ah9, bl9)) | 0;
    hi = Math.imul(ah9, bh9);
    var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;
    w18 &= 0x3ffffff;
    o[0] = w0;
    o[1] = w1;
    o[2] = w2;
    o[3] = w3;
    o[4] = w4;
    o[5] = w5;
    o[6] = w6;
    o[7] = w7;
    o[8] = w8;
    o[9] = w9;
    o[10] = w10;
    o[11] = w11;
    o[12] = w12;
    o[13] = w13;
    o[14] = w14;
    o[15] = w15;
    o[16] = w16;
    o[17] = w17;
    o[18] = w18;
    if (c !== 0) {
      o[19] = c;
      out.length++;
    }
    return out;
  };

  // Polyfill comb
  if (!Math.imul) {
    comb10MulTo = smallMulTo;
  }

  function bigMulTo (self, num, out) {
    out.negative = num.negative ^ self.negative;
    out.length = self.length + num.length;

    var carry = 0;
    var hncarry = 0;
    for (var k = 0; k < out.length - 1; k++) {
      // Sum all words with the same `i + j = k` and accumulate `ncarry`,
      // note that ncarry could be >= 0x3ffffff
      var ncarry = hncarry;
      hncarry = 0;
      var rword = carry & 0x3ffffff;
      var maxJ = Math.min(k, num.length - 1);
      for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
        var i = k - j;
        var a = self.words[i] | 0;
        var b = num.words[j] | 0;
        var r = a * b;

        var lo = r & 0x3ffffff;
        ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
        lo = (lo + rword) | 0;
        rword = lo & 0x3ffffff;
        ncarry = (ncarry + (lo >>> 26)) | 0;

        hncarry += ncarry >>> 26;
        ncarry &= 0x3ffffff;
      }
      out.words[k] = rword;
      carry = ncarry;
      ncarry = hncarry;
    }
    if (carry !== 0) {
      out.words[k] = carry;
    } else {
      out.length--;
    }

    return out.strip();
  }

  function jumboMulTo (self, num, out) {
    var fftm = new FFTM();
    return fftm.mulp(self, num, out);
  }

  BN.prototype.mulTo = function mulTo (num, out) {
    var res;
    var len = this.length + num.length;
    if (this.length === 10 && num.length === 10) {
      res = comb10MulTo(this, num, out);
    } else if (len < 63) {
      res = smallMulTo(this, num, out);
    } else if (len < 1024) {
      res = bigMulTo(this, num, out);
    } else {
      res = jumboMulTo(this, num, out);
    }

    return res;
  };

  // Cooley-Tukey algorithm for FFT
  // slightly revisited to rely on looping instead of recursion

  function FFTM (x, y) {
    this.x = x;
    this.y = y;
  }

  FFTM.prototype.makeRBT = function makeRBT (N) {
    var t = new Array(N);
    var l = BN.prototype._countBits(N) - 1;
    for (var i = 0; i < N; i++) {
      t[i] = this.revBin(i, l, N);
    }

    return t;
  };

  // Returns binary-reversed representation of `x`
  FFTM.prototype.revBin = function revBin (x, l, N) {
    if (x === 0 || x === N - 1) return x;

    var rb = 0;
    for (var i = 0; i < l; i++) {
      rb |= (x & 1) << (l - i - 1);
      x >>= 1;
    }

    return rb;
  };

  // Performs "tweedling" phase, therefore 'emulating'
  // behaviour of the recursive algorithm
  FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {
    for (var i = 0; i < N; i++) {
      rtws[i] = rws[rbt[i]];
      itws[i] = iws[rbt[i]];
    }
  };

  FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {
    this.permute(rbt, rws, iws, rtws, itws, N);

    for (var s = 1; s < N; s <<= 1) {
      var l = s << 1;

      var rtwdf = Math.cos(2 * Math.PI / l);
      var itwdf = Math.sin(2 * Math.PI / l);

      for (var p = 0; p < N; p += l) {
        var rtwdf_ = rtwdf;
        var itwdf_ = itwdf;

        for (var j = 0; j < s; j++) {
          var re = rtws[p + j];
          var ie = itws[p + j];

          var ro = rtws[p + j + s];
          var io = itws[p + j + s];

          var rx = rtwdf_ * ro - itwdf_ * io;

          io = rtwdf_ * io + itwdf_ * ro;
          ro = rx;

          rtws[p + j] = re + ro;
          itws[p + j] = ie + io;

          rtws[p + j + s] = re - ro;
          itws[p + j + s] = ie - io;

          /* jshint maxdepth : false */
          if (j !== l) {
            rx = rtwdf * rtwdf_ - itwdf * itwdf_;

            itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
            rtwdf_ = rx;
          }
        }
      }
    }
  };

  FFTM.prototype.guessLen13b = function guessLen13b (n, m) {
    var N = Math.max(m, n) | 1;
    var odd = N & 1;
    var i = 0;
    for (N = N / 2 | 0; N; N = N >>> 1) {
      i++;
    }

    return 1 << i + 1 + odd;
  };

  FFTM.prototype.conjugate = function conjugate (rws, iws, N) {
    if (N <= 1) return;

    for (var i = 0; i < N / 2; i++) {
      var t = rws[i];

      rws[i] = rws[N - i - 1];
      rws[N - i - 1] = t;

      t = iws[i];

      iws[i] = -iws[N - i - 1];
      iws[N - i - 1] = -t;
    }
  };

  FFTM.prototype.normalize13b = function normalize13b (ws, N) {
    var carry = 0;
    for (var i = 0; i < N / 2; i++) {
      var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +
        Math.round(ws[2 * i] / N) +
        carry;

      ws[i] = w & 0x3ffffff;

      if (w < 0x4000000) {
        carry = 0;
      } else {
        carry = w / 0x4000000 | 0;
      }
    }

    return ws;
  };

  FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {
    var carry = 0;
    for (var i = 0; i < len; i++) {
      carry = carry + (ws[i] | 0);

      rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;
      rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;
    }

    // Pad with zeroes
    for (i = 2 * len; i < N; ++i) {
      rws[i] = 0;
    }

    assert(carry === 0);
    assert((carry & ~0x1fff) === 0);
  };

  FFTM.prototype.stub = function stub (N) {
    var ph = new Array(N);
    for (var i = 0; i < N; i++) {
      ph[i] = 0;
    }

    return ph;
  };

  FFTM.prototype.mulp = function mulp (x, y, out) {
    var N = 2 * this.guessLen13b(x.length, y.length);

    var rbt = this.makeRBT(N);

    var _ = this.stub(N);

    var rws = new Array(N);
    var rwst = new Array(N);
    var iwst = new Array(N);

    var nrws = new Array(N);
    var nrwst = new Array(N);
    var niwst = new Array(N);

    var rmws = out.words;
    rmws.length = N;

    this.convert13b(x.words, x.length, rws, N);
    this.convert13b(y.words, y.length, nrws, N);

    this.transform(rws, _, rwst, iwst, N, rbt);
    this.transform(nrws, _, nrwst, niwst, N, rbt);

    for (var i = 0; i < N; i++) {
      var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
      iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
      rwst[i] = rx;
    }

    this.conjugate(rwst, iwst, N);
    this.transform(rwst, iwst, rmws, _, N, rbt);
    this.conjugate(rmws, _, N);
    this.normalize13b(rmws, N);

    out.negative = x.negative ^ y.negative;
    out.length = x.length + y.length;
    return out.strip();
  };

  // Multiply `this` by `num`
  BN.prototype.mul = function mul (num) {
    var out = new BN(null);
    out.words = new Array(this.length + num.length);
    return this.mulTo(num, out);
  };

  // Multiply employing FFT
  BN.prototype.mulf = function mulf (num) {
    var out = new BN(null);
    out.words = new Array(this.length + num.length);
    return jumboMulTo(this, num, out);
  };

  // In-place Multiplication
  BN.prototype.imul = function imul (num) {
    return this.clone().mulTo(num, this);
  };

  BN.prototype.imuln = function imuln (num) {
    assert(typeof num === 'number');
    assert(num < 0x4000000);

    // Carry
    var carry = 0;
    for (var i = 0; i < this.length; i++) {
      var w = (this.words[i] | 0) * num;
      var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);
      carry >>= 26;
      carry += (w / 0x4000000) | 0;
      // NOTE: lo is 27bit maximum
      carry += lo >>> 26;
      this.words[i] = lo & 0x3ffffff;
    }

    if (carry !== 0) {
      this.words[i] = carry;
      this.length++;
    }

    return this;
  };

  BN.prototype.muln = function muln (num) {
    return this.clone().imuln(num);
  };

  // `this` * `this`
  BN.prototype.sqr = function sqr () {
    return this.mul(this);
  };

  // `this` * `this` in-place
  BN.prototype.isqr = function isqr () {
    return this.imul(this.clone());
  };

  // Math.pow(`this`, `num`)
  BN.prototype.pow = function pow (num) {
    var w = toBitArray(num);
    if (w.length === 0) return new BN(1);

    // Skip leading zeroes
    var res = this;
    for (var i = 0; i < w.length; i++, res = res.sqr()) {
      if (w[i] !== 0) break;
    }

    if (++i < w.length) {
      for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {
        if (w[i] === 0) continue;

        res = res.mul(q);
      }
    }

    return res;
  };

  // Shift-left in-place
  BN.prototype.iushln = function iushln (bits) {
    assert(typeof bits === 'number' && bits >= 0);
    var r = bits % 26;
    var s = (bits - r) / 26;
    var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);
    var i;

    if (r !== 0) {
      var carry = 0;

      for (i = 0; i < this.length; i++) {
        var newCarry = this.words[i] & carryMask;
        var c = ((this.words[i] | 0) - newCarry) << r;
        this.words[i] = c | carry;
        carry = newCarry >>> (26 - r);
      }

      if (carry) {
        this.words[i] = carry;
        this.length++;
      }
    }

    if (s !== 0) {
      for (i = this.length - 1; i >= 0; i--) {
        this.words[i + s] = this.words[i];
      }

      for (i = 0; i < s; i++) {
        this.words[i] = 0;
      }

      this.length += s;
    }

    return this.strip();
  };

  BN.prototype.ishln = function ishln (bits) {
    // TODO(indutny): implement me
    assert(this.negative === 0);
    return this.iushln(bits);
  };

  // Shift-right in-place
  // NOTE: `hint` is a lowest bit before trailing zeroes
  // NOTE: if `extended` is present - it will be filled with destroyed bits
  BN.prototype.iushrn = function iushrn (bits, hint, extended) {
    assert(typeof bits === 'number' && bits >= 0);
    var h;
    if (hint) {
      h = (hint - (hint % 26)) / 26;
    } else {
      h = 0;
    }

    var r = bits % 26;
    var s = Math.min((bits - r) / 26, this.length);
    var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
    var maskedWords = extended;

    h -= s;
    h = Math.max(0, h);

    // Extended mode, copy masked part
    if (maskedWords) {
      for (var i = 0; i < s; i++) {
        maskedWords.words[i] = this.words[i];
      }
      maskedWords.length = s;
    }

    if (s === 0) {
      // No-op, we should not move anything at all
    } else if (this.length > s) {
      this.length -= s;
      for (i = 0; i < this.length; i++) {
        this.words[i] = this.words[i + s];
      }
    } else {
      this.words[0] = 0;
      this.length = 1;
    }

    var carry = 0;
    for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
      var word = this.words[i] | 0;
      this.words[i] = (carry << (26 - r)) | (word >>> r);
      carry = word & mask;
    }

    // Push carried bits as a mask
    if (maskedWords && carry !== 0) {
      maskedWords.words[maskedWords.length++] = carry;
    }

    if (this.length === 0) {
      this.words[0] = 0;
      this.length = 1;
    }

    return this.strip();
  };

  BN.prototype.ishrn = function ishrn (bits, hint, extended) {
    // TODO(indutny): implement me
    assert(this.negative === 0);
    return this.iushrn(bits, hint, extended);
  };

  // Shift-left
  BN.prototype.shln = function shln (bits) {
    return this.clone().ishln(bits);
  };

  BN.prototype.ushln = function ushln (bits) {
    return this.clone().iushln(bits);
  };

  // Shift-right
  BN.prototype.shrn = function shrn (bits) {
    return this.clone().ishrn(bits);
  };

  BN.prototype.ushrn = function ushrn (bits) {
    return this.clone().iushrn(bits);
  };

  // Test if n bit is set
  BN.prototype.testn = function testn (bit) {
    assert(typeof bit === 'number' && bit >= 0);
    var r = bit % 26;
    var s = (bit - r) / 26;
    var q = 1 << r;

    // Fast case: bit is much higher than all existing words
    if (this.length <= s) return false;

    // Check bit and return
    var w = this.words[s];

    return !!(w & q);
  };

  // Return only lowers bits of number (in-place)
  BN.prototype.imaskn = function imaskn (bits) {
    assert(typeof bits === 'number' && bits >= 0);
    var r = bits % 26;
    var s = (bits - r) / 26;

    assert(this.negative === 0, 'imaskn works only with positive numbers');

    if (this.length <= s) {
      return this;
    }

    if (r !== 0) {
      s++;
    }
    this.length = Math.min(s, this.length);

    if (r !== 0) {
      var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
      this.words[this.length - 1] &= mask;
    }

    return this.strip();
  };

  // Return only lowers bits of number
  BN.prototype.maskn = function maskn (bits) {
    return this.clone().imaskn(bits);
  };

  // Add plain number `num` to `this`
  BN.prototype.iaddn = function iaddn (num) {
    assert(typeof num === 'number');
    assert(num < 0x4000000);
    if (num < 0) return this.isubn(-num);

    // Possible sign change
    if (this.negative !== 0) {
      if (this.length === 1 && (this.words[0] | 0) < num) {
        this.words[0] = num - (this.words[0] | 0);
        this.negative = 0;
        return this;
      }

      this.negative = 0;
      this.isubn(num);
      this.negative = 1;
      return this;
    }

    // Add without checks
    return this._iaddn(num);
  };

  BN.prototype._iaddn = function _iaddn (num) {
    this.words[0] += num;

    // Carry
    for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {
      this.words[i] -= 0x4000000;
      if (i === this.length - 1) {
        this.words[i + 1] = 1;
      } else {
        this.words[i + 1]++;
      }
    }
    this.length = Math.max(this.length, i + 1);

    return this;
  };

  // Subtract plain number `num` from `this`
  BN.prototype.isubn = function isubn (num) {
    assert(typeof num === 'number');
    assert(num < 0x4000000);
    if (num < 0) return this.iaddn(-num);

    if (this.negative !== 0) {
      this.negative = 0;
      this.iaddn(num);
      this.negative = 1;
      return this;
    }

    this.words[0] -= num;

    if (this.length === 1 && this.words[0] < 0) {
      this.words[0] = -this.words[0];
      this.negative = 1;
    } else {
      // Carry
      for (var i = 0; i < this.length && this.words[i] < 0; i++) {
        this.words[i] += 0x4000000;
        this.words[i + 1] -= 1;
      }
    }

    return this.strip();
  };

  BN.prototype.addn = function addn (num) {
    return this.clone().iaddn(num);
  };

  BN.prototype.subn = function subn (num) {
    return this.clone().isubn(num);
  };

  BN.prototype.iabs = function iabs () {
    this.negative = 0;

    return this;
  };

  BN.prototype.abs = function abs () {
    return this.clone().iabs();
  };

  BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {
    var len = num.length + shift;
    var i;

    this._expand(len);

    var w;
    var carry = 0;
    for (i = 0; i < num.length; i++) {
      w = (this.words[i + shift] | 0) + carry;
      var right = (num.words[i] | 0) * mul;
      w -= right & 0x3ffffff;
      carry = (w >> 26) - ((right / 0x4000000) | 0);
      this.words[i + shift] = w & 0x3ffffff;
    }
    for (; i < this.length - shift; i++) {
      w = (this.words[i + shift] | 0) + carry;
      carry = w >> 26;
      this.words[i + shift] = w & 0x3ffffff;
    }

    if (carry === 0) return this.strip();

    // Subtraction overflow
    assert(carry === -1);
    carry = 0;
    for (i = 0; i < this.length; i++) {
      w = -(this.words[i] | 0) + carry;
      carry = w >> 26;
      this.words[i] = w & 0x3ffffff;
    }
    this.negative = 1;

    return this.strip();
  };

  BN.prototype._wordDiv = function _wordDiv (num, mode) {
    var shift = this.length - num.length;

    var a = this.clone();
    var b = num;

    // Normalize
    var bhi = b.words[b.length - 1] | 0;
    var bhiBits = this._countBits(bhi);
    shift = 26 - bhiBits;
    if (shift !== 0) {
      b = b.ushln(shift);
      a.iushln(shift);
      bhi = b.words[b.length - 1] | 0;
    }

    // Initialize quotient
    var m = a.length - b.length;
    var q;

    if (mode !== 'mod') {
      q = new BN(null);
      q.length = m + 1;
      q.words = new Array(q.length);
      for (var i = 0; i < q.length; i++) {
        q.words[i] = 0;
      }
    }

    var diff = a.clone()._ishlnsubmul(b, 1, m);
    if (diff.negative === 0) {
      a = diff;
      if (q) {
        q.words[m] = 1;
      }
    }

    for (var j = m - 1; j >= 0; j--) {
      var qj = (a.words[b.length + j] | 0) * 0x4000000 +
        (a.words[b.length + j - 1] | 0);

      // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max
      // (0x7ffffff)
      qj = Math.min((qj / bhi) | 0, 0x3ffffff);

      a._ishlnsubmul(b, qj, j);
      while (a.negative !== 0) {
        qj--;
        a.negative = 0;
        a._ishlnsubmul(b, 1, j);
        if (!a.isZero()) {
          a.negative ^= 1;
        }
      }
      if (q) {
        q.words[j] = qj;
      }
    }
    if (q) {
      q.strip();
    }
    a.strip();

    // Denormalize
    if (mode !== 'div' && shift !== 0) {
      a.iushrn(shift);
    }

    return {
      div: q || null,
      mod: a
    };
  };

  // NOTE: 1) `mode` can be set to `mod` to request mod only,
  //       to `div` to request div only, or be absent to
  //       request both div & mod
  //       2) `positive` is true if unsigned mod is requested
  BN.prototype.divmod = function divmod (num, mode, positive) {
    assert(!num.isZero());

    if (this.isZero()) {
      return {
        div: new BN(0),
        mod: new BN(0)
      };
    }

    var div, mod, res;
    if (this.negative !== 0 && num.negative === 0) {
      res = this.neg().divmod(num, mode);

      if (mode !== 'mod') {
        div = res.div.neg();
      }

      if (mode !== 'div') {
        mod = res.mod.neg();
        if (positive && mod.negative !== 0) {
          mod.iadd(num);
        }
      }

      return {
        div: div,
        mod: mod
      };
    }

    if (this.negative === 0 && num.negative !== 0) {
      res = this.divmod(num.neg(), mode);

      if (mode !== 'mod') {
        div = res.div.neg();
      }

      return {
        div: div,
        mod: res.mod
      };
    }

    if ((this.negative & num.negative) !== 0) {
      res = this.neg().divmod(num.neg(), mode);

      if (mode !== 'div') {
        mod = res.mod.neg();
        if (positive && mod.negative !== 0) {
          mod.isub(num);
        }
      }

      return {
        div: res.div,
        mod: mod
      };
    }

    // Both numbers are positive at this point

    // Strip both numbers to approximate shift value
    if (num.length > this.length || this.cmp(num) < 0) {
      return {
        div: new BN(0),
        mod: this
      };
    }

    // Very short reduction
    if (num.length === 1) {
      if (mode === 'div') {
        return {
          div: this.divn(num.words[0]),
          mod: null
        };
      }

      if (mode === 'mod') {
        return {
          div: null,
          mod: new BN(this.modn(num.words[0]))
        };
      }

      return {
        div: this.divn(num.words[0]),
        mod: new BN(this.modn(num.words[0]))
      };
    }

    return this._wordDiv(num, mode);
  };

  // Find `this` / `num`
  BN.prototype.div = function div (num) {
    return this.divmod(num, 'div', false).div;
  };

  // Find `this` % `num`
  BN.prototype.mod = function mod (num) {
    return this.divmod(num, 'mod', false).mod;
  };

  BN.prototype.umod = function umod (num) {
    return this.divmod(num, 'mod', true).mod;
  };

  // Find Round(`this` / `num`)
  BN.prototype.divRound = function divRound (num) {
    var dm = this.divmod(num);

    // Fast case - exact division
    if (dm.mod.isZero()) return dm.div;

    var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;

    var half = num.ushrn(1);
    var r2 = num.andln(1);
    var cmp = mod.cmp(half);

    // Round down
    if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;

    // Round up
    return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
  };

  BN.prototype.modn = function modn (num) {
    assert(num <= 0x3ffffff);
    var p = (1 << 26) % num;

    var acc = 0;
    for (var i = this.length - 1; i >= 0; i--) {
      acc = (p * acc + (this.words[i] | 0)) % num;
    }

    return acc;
  };

  // In-place division by number
  BN.prototype.idivn = function idivn (num) {
    assert(num <= 0x3ffffff);

    var carry = 0;
    for (var i = this.length - 1; i >= 0; i--) {
      var w = (this.words[i] | 0) + carry * 0x4000000;
      this.words[i] = (w / num) | 0;
      carry = w % num;
    }

    return this.strip();
  };

  BN.prototype.divn = function divn (num) {
    return this.clone().idivn(num);
  };

  BN.prototype.egcd = function egcd (p) {
    assert(p.negative === 0);
    assert(!p.isZero());

    var x = this;
    var y = p.clone();

    if (x.negative !== 0) {
      x = x.umod(p);
    } else {
      x = x.clone();
    }

    // A * x + B * y = x
    var A = new BN(1);
    var B = new BN(0);

    // C * x + D * y = y
    var C = new BN(0);
    var D = new BN(1);

    var g = 0;

    while (x.isEven() && y.isEven()) {
      x.iushrn(1);
      y.iushrn(1);
      ++g;
    }

    var yp = y.clone();
    var xp = x.clone();

    while (!x.isZero()) {
      for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
      if (i > 0) {
        x.iushrn(i);
        while (i-- > 0) {
          if (A.isOdd() || B.isOdd()) {
            A.iadd(yp);
            B.isub(xp);
          }

          A.iushrn(1);
          B.iushrn(1);
        }
      }

      for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
      if (j > 0) {
        y.iushrn(j);
        while (j-- > 0) {
          if (C.isOdd() || D.isOdd()) {
            C.iadd(yp);
            D.isub(xp);
          }

          C.iushrn(1);
          D.iushrn(1);
        }
      }

      if (x.cmp(y) >= 0) {
        x.isub(y);
        A.isub(C);
        B.isub(D);
      } else {
        y.isub(x);
        C.isub(A);
        D.isub(B);
      }
    }

    return {
      a: C,
      b: D,
      gcd: y.iushln(g)
    };
  };

  // This is reduced incarnation of the binary EEA
  // above, designated to invert members of the
  // _prime_ fields F(p) at a maximal speed
  BN.prototype._invmp = function _invmp (p) {
    assert(p.negative === 0);
    assert(!p.isZero());

    var a = this;
    var b = p.clone();

    if (a.negative !== 0) {
      a = a.umod(p);
    } else {
      a = a.clone();
    }

    var x1 = new BN(1);
    var x2 = new BN(0);

    var delta = b.clone();

    while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
      for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
      if (i > 0) {
        a.iushrn(i);
        while (i-- > 0) {
          if (x1.isOdd()) {
            x1.iadd(delta);
          }

          x1.iushrn(1);
        }
      }

      for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
      if (j > 0) {
        b.iushrn(j);
        while (j-- > 0) {
          if (x2.isOdd()) {
            x2.iadd(delta);
          }

          x2.iushrn(1);
        }
      }

      if (a.cmp(b) >= 0) {
        a.isub(b);
        x1.isub(x2);
      } else {
        b.isub(a);
        x2.isub(x1);
      }
    }

    var res;
    if (a.cmpn(1) === 0) {
      res = x1;
    } else {
      res = x2;
    }

    if (res.cmpn(0) < 0) {
      res.iadd(p);
    }

    return res;
  };

  BN.prototype.gcd = function gcd (num) {
    if (this.isZero()) return num.abs();
    if (num.isZero()) return this.abs();

    var a = this.clone();
    var b = num.clone();
    a.negative = 0;
    b.negative = 0;

    // Remove common factor of two
    for (var shift = 0; a.isEven() && b.isEven(); shift++) {
      a.iushrn(1);
      b.iushrn(1);
    }

    do {
      while (a.isEven()) {
        a.iushrn(1);
      }
      while (b.isEven()) {
        b.iushrn(1);
      }

      var r = a.cmp(b);
      if (r < 0) {
        // Swap `a` and `b` to make `a` always bigger than `b`
        var t = a;
        a = b;
        b = t;
      } else if (r === 0 || b.cmpn(1) === 0) {
        break;
      }

      a.isub(b);
    } while (true);

    return b.iushln(shift);
  };

  // Invert number in the field F(num)
  BN.prototype.invm = function invm (num) {
    return this.egcd(num).a.umod(num);
  };

  BN.prototype.isEven = function isEven () {
    return (this.words[0] & 1) === 0;
  };

  BN.prototype.isOdd = function isOdd () {
    return (this.words[0] & 1) === 1;
  };

  // And first word and num
  BN.prototype.andln = function andln (num) {
    return this.words[0] & num;
  };

  // Increment at the bit position in-line
  BN.prototype.bincn = function bincn (bit) {
    assert(typeof bit === 'number');
    var r = bit % 26;
    var s = (bit - r) / 26;
    var q = 1 << r;

    // Fast case: bit is much higher than all existing words
    if (this.length <= s) {
      this._expand(s + 1);
      this.words[s] |= q;
      return this;
    }

    // Add bit and propagate, if needed
    var carry = q;
    for (var i = s; carry !== 0 && i < this.length; i++) {
      var w = this.words[i] | 0;
      w += carry;
      carry = w >>> 26;
      w &= 0x3ffffff;
      this.words[i] = w;
    }
    if (carry !== 0) {
      this.words[i] = carry;
      this.length++;
    }
    return this;
  };

  BN.prototype.isZero = function isZero () {
    return this.length === 1 && this.words[0] === 0;
  };

  BN.prototype.cmpn = function cmpn (num) {
    var negative = num < 0;

    if (this.negative !== 0 && !negative) return -1;
    if (this.negative === 0 && negative) return 1;

    this.strip();

    var res;
    if (this.length > 1) {
      res = 1;
    } else {
      if (negative) {
        num = -num;
      }

      assert(num <= 0x3ffffff, 'Number is too big');

      var w = this.words[0] | 0;
      res = w === num ? 0 : w < num ? -1 : 1;
    }
    if (this.negative !== 0) return -res | 0;
    return res;
  };

  // Compare two numbers and return:
  // 1 - if `this` > `num`
  // 0 - if `this` == `num`
  // -1 - if `this` < `num`
  BN.prototype.cmp = function cmp (num) {
    if (this.negative !== 0 && num.negative === 0) return -1;
    if (this.negative === 0 && num.negative !== 0) return 1;

    var res = this.ucmp(num);
    if (this.negative !== 0) return -res | 0;
    return res;
  };

  // Unsigned comparison
  BN.prototype.ucmp = function ucmp (num) {
    // At this point both numbers have the same sign
    if (this.length > num.length) return 1;
    if (this.length < num.length) return -1;

    var res = 0;
    for (var i = this.length - 1; i >= 0; i--) {
      var a = this.words[i] | 0;
      var b = num.words[i] | 0;

      if (a === b) continue;
      if (a < b) {
        res = -1;
      } else if (a > b) {
        res = 1;
      }
      break;
    }
    return res;
  };

  BN.prototype.gtn = function gtn (num) {
    return this.cmpn(num) === 1;
  };

  BN.prototype.gt = function gt (num) {
    return this.cmp(num) === 1;
  };

  BN.prototype.gten = function gten (num) {
    return this.cmpn(num) >= 0;
  };

  BN.prototype.gte = function gte (num) {
    return this.cmp(num) >= 0;
  };

  BN.prototype.ltn = function ltn (num) {
    return this.cmpn(num) === -1;
  };

  BN.prototype.lt = function lt (num) {
    return this.cmp(num) === -1;
  };

  BN.prototype.lten = function lten (num) {
    return this.cmpn(num) <= 0;
  };

  BN.prototype.lte = function lte (num) {
    return this.cmp(num) <= 0;
  };

  BN.prototype.eqn = function eqn (num) {
    return this.cmpn(num) === 0;
  };

  BN.prototype.eq = function eq (num) {
    return this.cmp(num) === 0;
  };

  //
  // A reduce context, could be using montgomery or something better, depending
  // on the `m` itself.
  //
  BN.red = function red (num) {
    return new Red(num);
  };

  BN.prototype.toRed = function toRed (ctx) {
    assert(!this.red, 'Already a number in reduction context');
    assert(this.negative === 0, 'red works only with positives');
    return ctx.convertTo(this)._forceRed(ctx);
  };

  BN.prototype.fromRed = function fromRed () {
    assert(this.red, 'fromRed works only with numbers in reduction context');
    return this.red.convertFrom(this);
  };

  BN.prototype._forceRed = function _forceRed (ctx) {
    this.red = ctx;
    return this;
  };

  BN.prototype.forceRed = function forceRed (ctx) {
    assert(!this.red, 'Already a number in reduction context');
    return this._forceRed(ctx);
  };

  BN.prototype.redAdd = function redAdd (num) {
    assert(this.red, 'redAdd works only with red numbers');
    return this.red.add(this, num);
  };

  BN.prototype.redIAdd = function redIAdd (num) {
    assert(this.red, 'redIAdd works only with red numbers');
    return this.red.iadd(this, num);
  };

  BN.prototype.redSub = function redSub (num) {
    assert(this.red, 'redSub works only with red numbers');
    return this.red.sub(this, num);
  };

  BN.prototype.redISub = function redISub (num) {
    assert(this.red, 'redISub works only with red numbers');
    return this.red.isub(this, num);
  };

  BN.prototype.redShl = function redShl (num) {
    assert(this.red, 'redShl works only with red numbers');
    return this.red.shl(this, num);
  };

  BN.prototype.redMul = function redMul (num) {
    assert(this.red, 'redMul works only with red numbers');
    this.red._verify2(this, num);
    return this.red.mul(this, num);
  };

  BN.prototype.redIMul = function redIMul (num) {
    assert(this.red, 'redMul works only with red numbers');
    this.red._verify2(this, num);
    return this.red.imul(this, num);
  };

  BN.prototype.redSqr = function redSqr () {
    assert(this.red, 'redSqr works only with red numbers');
    this.red._verify1(this);
    return this.red.sqr(this);
  };

  BN.prototype.redISqr = function redISqr () {
    assert(this.red, 'redISqr works only with red numbers');
    this.red._verify1(this);
    return this.red.isqr(this);
  };

  // Square root over p
  BN.prototype.redSqrt = function redSqrt () {
    assert(this.red, 'redSqrt works only with red numbers');
    this.red._verify1(this);
    return this.red.sqrt(this);
  };

  BN.prototype.redInvm = function redInvm () {
    assert(this.red, 'redInvm works only with red numbers');
    this.red._verify1(this);
    return this.red.invm(this);
  };

  // Return negative clone of `this` % `red modulo`
  BN.prototype.redNeg = function redNeg () {
    assert(this.red, 'redNeg works only with red numbers');
    this.red._verify1(this);
    return this.red.neg(this);
  };

  BN.prototype.redPow = function redPow (num) {
    assert(this.red && !num.red, 'redPow(normalNum)');
    this.red._verify1(this);
    return this.red.pow(this, num);
  };

  // Prime numbers with efficient reduction
  var primes = {
    k256: null,
    p224: null,
    p192: null,
    p25519: null
  };

  // Pseudo-Mersenne prime
  function MPrime (name, p) {
    // P = 2 ^ N - K
    this.name = name;
    this.p = new BN(p, 16);
    this.n = this.p.bitLength();
    this.k = new BN(1).iushln(this.n).isub(this.p);

    this.tmp = this._tmp();
  }

  MPrime.prototype._tmp = function _tmp () {
    var tmp = new BN(null);
    tmp.words = new Array(Math.ceil(this.n / 13));
    return tmp;
  };

  MPrime.prototype.ireduce = function ireduce (num) {
    // Assumes that `num` is less than `P^2`
    // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)
    var r = num;
    var rlen;

    do {
      this.split(r, this.tmp);
      r = this.imulK(r);
      r = r.iadd(this.tmp);
      rlen = r.bitLength();
    } while (rlen > this.n);

    var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
    if (cmp === 0) {
      r.words[0] = 0;
      r.length = 1;
    } else if (cmp > 0) {
      r.isub(this.p);
    } else {
      if (r.strip !== undefined) {
        // r is BN v4 instance
        r.strip();
      } else {
        // r is BN v5 instance
        r._strip();
      }
    }

    return r;
  };

  MPrime.prototype.split = function split (input, out) {
    input.iushrn(this.n, 0, out);
  };

  MPrime.prototype.imulK = function imulK (num) {
    return num.imul(this.k);
  };

  function K256 () {
    MPrime.call(
      this,
      'k256',
      'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');
  }
  inherits(K256, MPrime);

  K256.prototype.split = function split (input, output) {
    // 256 = 9 * 26 + 22
    var mask = 0x3fffff;

    var outLen = Math.min(input.length, 9);
    for (var i = 0; i < outLen; i++) {
      output.words[i] = input.words[i];
    }
    output.length = outLen;

    if (input.length <= 9) {
      input.words[0] = 0;
      input.length = 1;
      return;
    }

    // Shift by 9 limbs
    var prev = input.words[9];
    output.words[output.length++] = prev & mask;

    for (i = 10; i < input.length; i++) {
      var next = input.words[i] | 0;
      input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);
      prev = next;
    }
    prev >>>= 22;
    input.words[i - 10] = prev;
    if (prev === 0 && input.length > 10) {
      input.length -= 10;
    } else {
      input.length -= 9;
    }
  };

  K256.prototype.imulK = function imulK (num) {
    // K = 0x1000003d1 = [ 0x40, 0x3d1 ]
    num.words[num.length] = 0;
    num.words[num.length + 1] = 0;
    num.length += 2;

    // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390
    var lo = 0;
    for (var i = 0; i < num.length; i++) {
      var w = num.words[i] | 0;
      lo += w * 0x3d1;
      num.words[i] = lo & 0x3ffffff;
      lo = w * 0x40 + ((lo / 0x4000000) | 0);
    }

    // Fast length reduction
    if (num.words[num.length - 1] === 0) {
      num.length--;
      if (num.words[num.length - 1] === 0) {
        num.length--;
      }
    }
    return num;
  };

  function P224 () {
    MPrime.call(
      this,
      'p224',
      'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');
  }
  inherits(P224, MPrime);

  function P192 () {
    MPrime.call(
      this,
      'p192',
      'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');
  }
  inherits(P192, MPrime);

  function P25519 () {
    // 2 ^ 255 - 19
    MPrime.call(
      this,
      '25519',
      '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');
  }
  inherits(P25519, MPrime);

  P25519.prototype.imulK = function imulK (num) {
    // K = 0x13
    var carry = 0;
    for (var i = 0; i < num.length; i++) {
      var hi = (num.words[i] | 0) * 0x13 + carry;
      var lo = hi & 0x3ffffff;
      hi >>>= 26;

      num.words[i] = lo;
      carry = hi;
    }
    if (carry !== 0) {
      num.words[num.length++] = carry;
    }
    return num;
  };

  // Exported mostly for testing purposes, use plain name instead
  BN._prime = function prime (name) {
    // Cached version of prime
    if (primes[name]) return primes[name];

    var prime;
    if (name === 'k256') {
      prime = new K256();
    } else if (name === 'p224') {
      prime = new P224();
    } else if (name === 'p192') {
      prime = new P192();
    } else if (name === 'p25519') {
      prime = new P25519();
    } else {
      throw new Error('Unknown prime ' + name);
    }
    primes[name] = prime;

    return prime;
  };

  //
  // Base reduction engine
  //
  function Red (m) {
    if (typeof m === 'string') {
      var prime = BN._prime(m);
      this.m = prime.p;
      this.prime = prime;
    } else {
      assert(m.gtn(1), 'modulus must be greater than 1');
      this.m = m;
      this.prime = null;
    }
  }

  Red.prototype._verify1 = function _verify1 (a) {
    assert(a.negative === 0, 'red works only with positives');
    assert(a.red, 'red works only with red numbers');
  };

  Red.prototype._verify2 = function _verify2 (a, b) {
    assert((a.negative | b.negative) === 0, 'red works only with positives');
    assert(a.red && a.red === b.red,
      'red works only with red numbers');
  };

  Red.prototype.imod = function imod (a) {
    if (this.prime) return this.prime.ireduce(a)._forceRed(this);
    return a.umod(this.m)._forceRed(this);
  };

  Red.prototype.neg = function neg (a) {
    if (a.isZero()) {
      return a.clone();
    }

    return this.m.sub(a)._forceRed(this);
  };

  Red.prototype.add = function add (a, b) {
    this._verify2(a, b);

    var res = a.add(b);
    if (res.cmp(this.m) >= 0) {
      res.isub(this.m);
    }
    return res._forceRed(this);
  };

  Red.prototype.iadd = function iadd (a, b) {
    this._verify2(a, b);

    var res = a.iadd(b);
    if (res.cmp(this.m) >= 0) {
      res.isub(this.m);
    }
    return res;
  };

  Red.prototype.sub = function sub (a, b) {
    this._verify2(a, b);

    var res = a.sub(b);
    if (res.cmpn(0) < 0) {
      res.iadd(this.m);
    }
    return res._forceRed(this);
  };

  Red.prototype.isub = function isub (a, b) {
    this._verify2(a, b);

    var res = a.isub(b);
    if (res.cmpn(0) < 0) {
      res.iadd(this.m);
    }
    return res;
  };

  Red.prototype.shl = function shl (a, num) {
    this._verify1(a);
    return this.imod(a.ushln(num));
  };

  Red.prototype.imul = function imul (a, b) {
    this._verify2(a, b);
    return this.imod(a.imul(b));
  };

  Red.prototype.mul = function mul (a, b) {
    this._verify2(a, b);
    return this.imod(a.mul(b));
  };

  Red.prototype.isqr = function isqr (a) {
    return this.imul(a, a.clone());
  };

  Red.prototype.sqr = function sqr (a) {
    return this.mul(a, a);
  };

  Red.prototype.sqrt = function sqrt (a) {
    if (a.isZero()) return a.clone();

    var mod3 = this.m.andln(3);
    assert(mod3 % 2 === 1);

    // Fast case
    if (mod3 === 3) {
      var pow = this.m.add(new BN(1)).iushrn(2);
      return this.pow(a, pow);
    }

    // Tonelli-Shanks algorithm (Totally unoptimized and slow)
    //
    // Find Q and S, that Q * 2 ^ S = (P - 1)
    var q = this.m.subn(1);
    var s = 0;
    while (!q.isZero() && q.andln(1) === 0) {
      s++;
      q.iushrn(1);
    }
    assert(!q.isZero());

    var one = new BN(1).toRed(this);
    var nOne = one.redNeg();

    // Find quadratic non-residue
    // NOTE: Max is such because of generalized Riemann hypothesis.
    var lpow = this.m.subn(1).iushrn(1);
    var z = this.m.bitLength();
    z = new BN(2 * z * z).toRed(this);

    while (this.pow(z, lpow).cmp(nOne) !== 0) {
      z.redIAdd(nOne);
    }

    var c = this.pow(z, q);
    var r = this.pow(a, q.addn(1).iushrn(1));
    var t = this.pow(a, q);
    var m = s;
    while (t.cmp(one) !== 0) {
      var tmp = t;
      for (var i = 0; tmp.cmp(one) !== 0; i++) {
        tmp = tmp.redSqr();
      }
      assert(i < m);
      var b = this.pow(c, new BN(1).iushln(m - i - 1));

      r = r.redMul(b);
      c = b.redSqr();
      t = t.redMul(c);
      m = i;
    }

    return r;
  };

  Red.prototype.invm = function invm (a) {
    var inv = a._invmp(this.m);
    if (inv.negative !== 0) {
      inv.negative = 0;
      return this.imod(inv).redNeg();
    } else {
      return this.imod(inv);
    }
  };

  Red.prototype.pow = function pow (a, num) {
    if (num.isZero()) return new BN(1).toRed(this);
    if (num.cmpn(1) === 0) return a.clone();

    var windowSize = 4;
    var wnd = new Array(1 << windowSize);
    wnd[0] = new BN(1).toRed(this);
    wnd[1] = a;
    for (var i = 2; i < wnd.length; i++) {
      wnd[i] = this.mul(wnd[i - 1], a);
    }

    var res = wnd[0];
    var current = 0;
    var currentLen = 0;
    var start = num.bitLength() % 26;
    if (start === 0) {
      start = 26;
    }

    for (i = num.length - 1; i >= 0; i--) {
      var word = num.words[i];
      for (var j = start - 1; j >= 0; j--) {
        var bit = (word >> j) & 1;
        if (res !== wnd[0]) {
          res = this.sqr(res);
        }

        if (bit === 0 && current === 0) {
          currentLen = 0;
          continue;
        }

        current <<= 1;
        current |= bit;
        currentLen++;
        if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;

        res = this.mul(res, wnd[current]);
        currentLen = 0;
        current = 0;
      }
      start = 26;
    }

    return res;
  };

  Red.prototype.convertTo = function convertTo (num) {
    var r = num.umod(this.m);

    return r === num ? r.clone() : r;
  };

  Red.prototype.convertFrom = function convertFrom (num) {
    var res = num.clone();
    res.red = null;
    return res;
  };

  //
  // Montgomery method engine
  //

  BN.mont = function mont (num) {
    return new Mont(num);
  };

  function Mont (m) {
    Red.call(this, m);

    this.shift = this.m.bitLength();
    if (this.shift % 26 !== 0) {
      this.shift += 26 - (this.shift % 26);
    }

    this.r = new BN(1).iushln(this.shift);
    this.r2 = this.imod(this.r.sqr());
    this.rinv = this.r._invmp(this.m);

    this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
    this.minv = this.minv.umod(this.r);
    this.minv = this.r.sub(this.minv);
  }
  inherits(Mont, Red);

  Mont.prototype.convertTo = function convertTo (num) {
    return this.imod(num.ushln(this.shift));
  };

  Mont.prototype.convertFrom = function convertFrom (num) {
    var r = this.imod(num.mul(this.rinv));
    r.red = null;
    return r;
  };

  Mont.prototype.imul = function imul (a, b) {
    if (a.isZero() || b.isZero()) {
      a.words[0] = 0;
      a.length = 1;
      return a;
    }

    var t = a.imul(b);
    var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
    var u = t.isub(c).iushrn(this.shift);
    var res = u;

    if (u.cmp(this.m) >= 0) {
      res = u.isub(this.m);
    } else if (u.cmpn(0) < 0) {
      res = u.iadd(this.m);
    }

    return res._forceRed(this);
  };

  Mont.prototype.mul = function mul (a, b) {
    if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);

    var t = a.mul(b);
    var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
    var u = t.isub(c).iushrn(this.shift);
    var res = u;
    if (u.cmp(this.m) >= 0) {
      res = u.isub(this.m);
    } else if (u.cmpn(0) < 0) {
      res = u.iadd(this.m);
    }

    return res._forceRed(this);
  };

  Mont.prototype.invm = function invm (a) {
    // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R
    var res = this.imod(a._invmp(this.m).mul(this.r2));
    return res._forceRed(this);
  };
})(typeof module === 'undefined' || module, this);

},{"buffer":54}],50:[function(require,module,exports){
(function (global){(function (){
'use strict';

var possibleNames = require('possible-typed-array-names');

var g = typeof globalThis === 'undefined' ? global : globalThis;

/** @type {import('.')} */
module.exports = function availableTypedArrays() {
	var /** @type {ReturnType<typeof availableTypedArrays>} */ out = [];
	for (var i = 0; i < possibleNames.length; i++) {
		if (typeof g[possibleNames[i]] === 'function') {
			// @ts-expect-error
			out[out.length] = possibleNames[i];
		}
	}
	return out;
};

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"possible-typed-array-names":252}],51:[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('')
}

},{}],52:[function(require,module,exports){
(function (module, exports) {
  'use strict';

  // Utils
  function assert (val, msg) {
    if (!val) throw new Error(msg || 'Assertion failed');
  }

  // Could use `inherits` module, but don't want to move from single file
  // architecture yet.
  function inherits (ctor, superCtor) {
    ctor.super_ = superCtor;
    var TempCtor = function () {};
    TempCtor.prototype = superCtor.prototype;
    ctor.prototype = new TempCtor();
    ctor.prototype.constructor = ctor;
  }

  // BN

  function BN (number, base, endian) {
    if (BN.isBN(number)) {
      return number;
    }

    this.negative = 0;
    this.words = null;
    this.length = 0;

    // Reduction context
    this.red = null;

    if (number !== null) {
      if (base === 'le' || base === 'be') {
        endian = base;
        base = 10;
      }

      this._init(number || 0, base || 10, endian || 'be');
    }
  }
  if (typeof module === 'object') {
    module.exports = BN;
  } else {
    exports.BN = BN;
  }

  BN.BN = BN;
  BN.wordSize = 26;

  var Buffer;
  try {
    if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {
      Buffer = window.Buffer;
    } else {
      Buffer = require('buffer').Buffer;
    }
  } catch (e) {
  }

  BN.isBN = function isBN (num) {
    if (num instanceof BN) {
      return true;
    }

    return num !== null && typeof num === 'object' &&
      num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
  };

  BN.max = function max (left, right) {
    if (left.cmp(right) > 0) return left;
    return right;
  };

  BN.min = function min (left, right) {
    if (left.cmp(right) < 0) return left;
    return right;
  };

  BN.prototype._init = function init (number, base, endian) {
    if (typeof number === 'number') {
      return this._initNumber(number, base, endian);
    }

    if (typeof number === 'object') {
      return this._initArray(number, base, endian);
    }

    if (base === 'hex') {
      base = 16;
    }
    assert(base === (base | 0) && base >= 2 && base <= 36);

    number = number.toString().replace(/\s+/g, '');
    var start = 0;
    if (number[0] === '-') {
      start++;
      this.negative = 1;
    }

    if (start < number.length) {
      if (base === 16) {
        this._parseHex(number, start, endian);
      } else {
        this._parseBase(number, base, start);
        if (endian === 'le') {
          this._initArray(this.toArray(), base, endian);
        }
      }
    }
  };

  BN.prototype._initNumber = function _initNumber (number, base, endian) {
    if (number < 0) {
      this.negative = 1;
      number = -number;
    }
    if (number < 0x4000000) {
      this.words = [number & 0x3ffffff];
      this.length = 1;
    } else if (number < 0x10000000000000) {
      this.words = [
        number & 0x3ffffff,
        (number / 0x4000000) & 0x3ffffff
      ];
      this.length = 2;
    } else {
      assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)
      this.words = [
        number & 0x3ffffff,
        (number / 0x4000000) & 0x3ffffff,
        1
      ];
      this.length = 3;
    }

    if (endian !== 'le') return;

    // Reverse the bytes
    this._initArray(this.toArray(), base, endian);
  };

  BN.prototype._initArray = function _initArray (number, base, endian) {
    // Perhaps a Uint8Array
    assert(typeof number.length === 'number');
    if (number.length <= 0) {
      this.words = [0];
      this.length = 1;
      return this;
    }

    this.length = Math.ceil(number.length / 3);
    this.words = new Array(this.length);
    for (var i = 0; i < this.length; i++) {
      this.words[i] = 0;
    }

    var j, w;
    var off = 0;
    if (endian === 'be') {
      for (i = number.length - 1, j = 0; i >= 0; i -= 3) {
        w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);
        this.words[j] |= (w << off) & 0x3ffffff;
        this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
        off += 24;
        if (off >= 26) {
          off -= 26;
          j++;
        }
      }
    } else if (endian === 'le') {
      for (i = 0, j = 0; i < number.length; i += 3) {
        w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);
        this.words[j] |= (w << off) & 0x3ffffff;
        this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
        off += 24;
        if (off >= 26) {
          off -= 26;
          j++;
        }
      }
    }
    return this._strip();
  };

  function parseHex4Bits (string, index) {
    var c = string.charCodeAt(index);
    // '0' - '9'
    if (c >= 48 && c <= 57) {
      return c - 48;
    // 'A' - 'F'
    } else if (c >= 65 && c <= 70) {
      return c - 55;
    // 'a' - 'f'
    } else if (c >= 97 && c <= 102) {
      return c - 87;
    } else {
      assert(false, 'Invalid character in ' + string);
    }
  }

  function parseHexByte (string, lowerBound, index) {
    var r = parseHex4Bits(string, index);
    if (index - 1 >= lowerBound) {
      r |= parseHex4Bits(string, index - 1) << 4;
    }
    return r;
  }

  BN.prototype._parseHex = function _parseHex (number, start, endian) {
    // Create possibly bigger array to ensure that it fits the number
    this.length = Math.ceil((number.length - start) / 6);
    this.words = new Array(this.length);
    for (var i = 0; i < this.length; i++) {
      this.words[i] = 0;
    }

    // 24-bits chunks
    var off = 0;
    var j = 0;

    var w;
    if (endian === 'be') {
      for (i = number.length - 1; i >= start; i -= 2) {
        w = parseHexByte(number, start, i) << off;
        this.words[j] |= w & 0x3ffffff;
        if (off >= 18) {
          off -= 18;
          j += 1;
          this.words[j] |= w >>> 26;
        } else {
          off += 8;
        }
      }
    } else {
      var parseLength = number.length - start;
      for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {
        w = parseHexByte(number, start, i) << off;
        this.words[j] |= w & 0x3ffffff;
        if (off >= 18) {
          off -= 18;
          j += 1;
          this.words[j] |= w >>> 26;
        } else {
          off += 8;
        }
      }
    }

    this._strip();
  };

  function parseBase (str, start, end, mul) {
    var r = 0;
    var b = 0;
    var len = Math.min(str.length, end);
    for (var i = start; i < len; i++) {
      var c = str.charCodeAt(i) - 48;

      r *= mul;

      // 'a'
      if (c >= 49) {
        b = c - 49 + 0xa;

      // 'A'
      } else if (c >= 17) {
        b = c - 17 + 0xa;

      // '0' - '9'
      } else {
        b = c;
      }
      assert(c >= 0 && b < mul, 'Invalid character');
      r += b;
    }
    return r;
  }

  BN.prototype._parseBase = function _parseBase (number, base, start) {
    // Initialize as zero
    this.words = [0];
    this.length = 1;

    // Find length of limb in base
    for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {
      limbLen++;
    }
    limbLen--;
    limbPow = (limbPow / base) | 0;

    var total = number.length - start;
    var mod = total % limbLen;
    var end = Math.min(total, total - mod) + start;

    var word = 0;
    for (var i = start; i < end; i += limbLen) {
      word = parseBase(number, i, i + limbLen, base);

      this.imuln(limbPow);
      if (this.words[0] + word < 0x4000000) {
        this.words[0] += word;
      } else {
        this._iaddn(word);
      }
    }

    if (mod !== 0) {
      var pow = 1;
      word = parseBase(number, i, number.length, base);

      for (i = 0; i < mod; i++) {
        pow *= base;
      }

      this.imuln(pow);
      if (this.words[0] + word < 0x4000000) {
        this.words[0] += word;
      } else {
        this._iaddn(word);
      }
    }

    this._strip();
  };

  BN.prototype.copy = function copy (dest) {
    dest.words = new Array(this.length);
    for (var i = 0; i < this.length; i++) {
      dest.words[i] = this.words[i];
    }
    dest.length = this.length;
    dest.negative = this.negative;
    dest.red = this.red;
  };

  function move (dest, src) {
    dest.words = src.words;
    dest.length = src.length;
    dest.negative = src.negative;
    dest.red = src.red;
  }

  BN.prototype._move = function _move (dest) {
    move(dest, this);
  };

  BN.prototype.clone = function clone () {
    var r = new BN(null);
    this.copy(r);
    return r;
  };

  BN.prototype._expand = function _expand (size) {
    while (this.length < size) {
      this.words[this.length++] = 0;
    }
    return this;
  };

  // Remove leading `0` from `this`
  BN.prototype._strip = function strip () {
    while (this.length > 1 && this.words[this.length - 1] === 0) {
      this.length--;
    }
    return this._normSign();
  };

  BN.prototype._normSign = function _normSign () {
    // -0 = 0
    if (this.length === 1 && this.words[0] === 0) {
      this.negative = 0;
    }
    return this;
  };

  // Check Symbol.for because not everywhere where Symbol defined
  // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility
  if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {
    try {
      BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;
    } catch (e) {
      BN.prototype.inspect = inspect;
    }
  } else {
    BN.prototype.inspect = inspect;
  }

  function inspect () {
    return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';
  }

  /*

  var zeros = [];
  var groupSizes = [];
  var groupBases = [];

  var s = '';
  var i = -1;
  while (++i < BN.wordSize) {
    zeros[i] = s;
    s += '0';
  }
  groupSizes[0] = 0;
  groupSizes[1] = 0;
  groupBases[0] = 0;
  groupBases[1] = 0;
  var base = 2 - 1;
  while (++base < 36 + 1) {
    var groupSize = 0;
    var groupBase = 1;
    while (groupBase < (1 << BN.wordSize) / base) {
      groupBase *= base;
      groupSize += 1;
    }
    groupSizes[base] = groupSize;
    groupBases[base] = groupBase;
  }

  */

  var zeros = [
    '',
    '0',
    '00',
    '000',
    '0000',
    '00000',
    '000000',
    '0000000',
    '00000000',
    '000000000',
    '0000000000',
    '00000000000',
    '000000000000',
    '0000000000000',
    '00000000000000',
    '000000000000000',
    '0000000000000000',
    '00000000000000000',
    '000000000000000000',
    '0000000000000000000',
    '00000000000000000000',
    '000000000000000000000',
    '0000000000000000000000',
    '00000000000000000000000',
    '000000000000000000000000',
    '0000000000000000000000000'
  ];

  var groupSizes = [
    0, 0,
    25, 16, 12, 11, 10, 9, 8,
    8, 7, 7, 7, 7, 6, 6,
    6, 6, 6, 6, 6, 5, 5,
    5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5
  ];

  var groupBases = [
    0, 0,
    33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,
    43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,
    16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,
    6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,
    24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176
  ];

  BN.prototype.toString = function toString (base, padding) {
    base = base || 10;
    padding = padding | 0 || 1;

    var out;
    if (base === 16 || base === 'hex') {
      out = '';
      var off = 0;
      var carry = 0;
      for (var i = 0; i < this.length; i++) {
        var w = this.words[i];
        var word = (((w << off) | carry) & 0xffffff).toString(16);
        carry = (w >>> (24 - off)) & 0xffffff;
        off += 2;
        if (off >= 26) {
          off -= 26;
          i--;
        }
        if (carry !== 0 || i !== this.length - 1) {
          out = zeros[6 - word.length] + word + out;
        } else {
          out = word + out;
        }
      }
      if (carry !== 0) {
        out = carry.toString(16) + out;
      }
      while (out.length % padding !== 0) {
        out = '0' + out;
      }
      if (this.negative !== 0) {
        out = '-' + out;
      }
      return out;
    }

    if (base === (base | 0) && base >= 2 && base <= 36) {
      // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));
      var groupSize = groupSizes[base];
      // var groupBase = Math.pow(base, groupSize);
      var groupBase = groupBases[base];
      out = '';
      var c = this.clone();
      c.negative = 0;
      while (!c.isZero()) {
        var r = c.modrn(groupBase).toString(base);
        c = c.idivn(groupBase);

        if (!c.isZero()) {
          out = zeros[groupSize - r.length] + r + out;
        } else {
          out = r + out;
        }
      }
      if (this.isZero()) {
        out = '0' + out;
      }
      while (out.length % padding !== 0) {
        out = '0' + out;
      }
      if (this.negative !== 0) {
        out = '-' + out;
      }
      return out;
    }

    assert(false, 'Base should be between 2 and 36');
  };

  BN.prototype.toNumber = function toNumber () {
    var ret = this.words[0];
    if (this.length === 2) {
      ret += this.words[1] * 0x4000000;
    } else if (this.length === 3 && this.words[2] === 0x01) {
      // NOTE: at this stage it is known that the top bit is set
      ret += 0x10000000000000 + (this.words[1] * 0x4000000);
    } else if (this.length > 2) {
      assert(false, 'Number can only safely store up to 53 bits');
    }
    return (this.negative !== 0) ? -ret : ret;
  };

  BN.prototype.toJSON = function toJSON () {
    return this.toString(16, 2);
  };

  if (Buffer) {
    BN.prototype.toBuffer = function toBuffer (endian, length) {
      return this.toArrayLike(Buffer, endian, length);
    };
  }

  BN.prototype.toArray = function toArray (endian, length) {
    return this.toArrayLike(Array, endian, length);
  };

  var allocate = function allocate (ArrayType, size) {
    if (ArrayType.allocUnsafe) {
      return ArrayType.allocUnsafe(size);
    }
    return new ArrayType(size);
  };

  BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {
    this._strip();

    var byteLength = this.byteLength();
    var reqLength = length || Math.max(1, byteLength);
    assert(byteLength <= reqLength, 'byte array longer than desired length');
    assert(reqLength > 0, 'Requested array length <= 0');

    var res = allocate(ArrayType, reqLength);
    var postfix = endian === 'le' ? 'LE' : 'BE';
    this['_toArrayLike' + postfix](res, byteLength);
    return res;
  };

  BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {
    var position = 0;
    var carry = 0;

    for (var i = 0, shift = 0; i < this.length; i++) {
      var word = (this.words[i] << shift) | carry;

      res[position++] = word & 0xff;
      if (position < res.length) {
        res[position++] = (word >> 8) & 0xff;
      }
      if (position < res.length) {
        res[position++] = (word >> 16) & 0xff;
      }

      if (shift === 6) {
        if (position < res.length) {
          res[position++] = (word >> 24) & 0xff;
        }
        carry = 0;
        shift = 0;
      } else {
        carry = word >>> 24;
        shift += 2;
      }
    }

    if (position < res.length) {
      res[position++] = carry;

      while (position < res.length) {
        res[position++] = 0;
      }
    }
  };

  BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {
    var position = res.length - 1;
    var carry = 0;

    for (var i = 0, shift = 0; i < this.length; i++) {
      var word = (this.words[i] << shift) | carry;

      res[position--] = word & 0xff;
      if (position >= 0) {
        res[position--] = (word >> 8) & 0xff;
      }
      if (position >= 0) {
        res[position--] = (word >> 16) & 0xff;
      }

      if (shift === 6) {
        if (position >= 0) {
          res[position--] = (word >> 24) & 0xff;
        }
        carry = 0;
        shift = 0;
      } else {
        carry = word >>> 24;
        shift += 2;
      }
    }

    if (position >= 0) {
      res[position--] = carry;

      while (position >= 0) {
        res[position--] = 0;
      }
    }
  };

  if (Math.clz32) {
    BN.prototype._countBits = function _countBits (w) {
      return 32 - Math.clz32(w);
    };
  } else {
    BN.prototype._countBits = function _countBits (w) {
      var t = w;
      var r = 0;
      if (t >= 0x1000) {
        r += 13;
        t >>>= 13;
      }
      if (t >= 0x40) {
        r += 7;
        t >>>= 7;
      }
      if (t >= 0x8) {
        r += 4;
        t >>>= 4;
      }
      if (t >= 0x02) {
        r += 2;
        t >>>= 2;
      }
      return r + t;
    };
  }

  BN.prototype._zeroBits = function _zeroBits (w) {
    // Short-cut
    if (w === 0) return 26;

    var t = w;
    var r = 0;
    if ((t & 0x1fff) === 0) {
      r += 13;
      t >>>= 13;
    }
    if ((t & 0x7f) === 0) {
      r += 7;
      t >>>= 7;
    }
    if ((t & 0xf) === 0) {
      r += 4;
      t >>>= 4;
    }
    if ((t & 0x3) === 0) {
      r += 2;
      t >>>= 2;
    }
    if ((t & 0x1) === 0) {
      r++;
    }
    return r;
  };

  // Return number of used bits in a BN
  BN.prototype.bitLength = function bitLength () {
    var w = this.words[this.length - 1];
    var hi = this._countBits(w);
    return (this.length - 1) * 26 + hi;
  };

  function toBitArray (num) {
    var w = new Array(num.bitLength());

    for (var bit = 0; bit < w.length; bit++) {
      var off = (bit / 26) | 0;
      var wbit = bit % 26;

      w[bit] = (num.words[off] >>> wbit) & 0x01;
    }

    return w;
  }

  // Number of trailing zero bits
  BN.prototype.zeroBits = function zeroBits () {
    if (this.isZero()) return 0;

    var r = 0;
    for (var i = 0; i < this.length; i++) {
      var b = this._zeroBits(this.words[i]);
      r += b;
      if (b !== 26) break;
    }
    return r;
  };

  BN.prototype.byteLength = function byteLength () {
    return Math.ceil(this.bitLength() / 8);
  };

  BN.prototype.toTwos = function toTwos (width) {
    if (this.negative !== 0) {
      return this.abs().inotn(width).iaddn(1);
    }
    return this.clone();
  };

  BN.prototype.fromTwos = function fromTwos (width) {
    if (this.testn(width - 1)) {
      return this.notn(width).iaddn(1).ineg();
    }
    return this.clone();
  };

  BN.prototype.isNeg = function isNeg () {
    return this.negative !== 0;
  };

  // Return negative clone of `this`
  BN.prototype.neg = function neg () {
    return this.clone().ineg();
  };

  BN.prototype.ineg = function ineg () {
    if (!this.isZero()) {
      this.negative ^= 1;
    }

    return this;
  };

  // Or `num` with `this` in-place
  BN.prototype.iuor = function iuor (num) {
    while (this.length < num.length) {
      this.words[this.length++] = 0;
    }

    for (var i = 0; i < num.length; i++) {
      this.words[i] = this.words[i] | num.words[i];
    }

    return this._strip();
  };

  BN.prototype.ior = function ior (num) {
    assert((this.negative | num.negative) === 0);
    return this.iuor(num);
  };

  // Or `num` with `this`
  BN.prototype.or = function or (num) {
    if (this.length > num.length) return this.clone().ior(num);
    return num.clone().ior(this);
  };

  BN.prototype.uor = function uor (num) {
    if (this.length > num.length) return this.clone().iuor(num);
    return num.clone().iuor(this);
  };

  // And `num` with `this` in-place
  BN.prototype.iuand = function iuand (num) {
    // b = min-length(num, this)
    var b;
    if (this.length > num.length) {
      b = num;
    } else {
      b = this;
    }

    for (var i = 0; i < b.length; i++) {
      this.words[i] = this.words[i] & num.words[i];
    }

    this.length = b.length;

    return this._strip();
  };

  BN.prototype.iand = function iand (num) {
    assert((this.negative | num.negative) === 0);
    return this.iuand(num);
  };

  // And `num` with `this`
  BN.prototype.and = function and (num) {
    if (this.length > num.length) return this.clone().iand(num);
    return num.clone().iand(this);
  };

  BN.prototype.uand = function uand (num) {
    if (this.length > num.length) return this.clone().iuand(num);
    return num.clone().iuand(this);
  };

  // Xor `num` with `this` in-place
  BN.prototype.iuxor = function iuxor (num) {
    // a.length > b.length
    var a;
    var b;
    if (this.length > num.length) {
      a = this;
      b = num;
    } else {
      a = num;
      b = this;
    }

    for (var i = 0; i < b.length; i++) {
      this.words[i] = a.words[i] ^ b.words[i];
    }

    if (this !== a) {
      for (; i < a.length; i++) {
        this.words[i] = a.words[i];
      }
    }

    this.length = a.length;

    return this._strip();
  };

  BN.prototype.ixor = function ixor (num) {
    assert((this.negative | num.negative) === 0);
    return this.iuxor(num);
  };

  // Xor `num` with `this`
  BN.prototype.xor = function xor (num) {
    if (this.length > num.length) return this.clone().ixor(num);
    return num.clone().ixor(this);
  };

  BN.prototype.uxor = function uxor (num) {
    if (this.length > num.length) return this.clone().iuxor(num);
    return num.clone().iuxor(this);
  };

  // Not ``this`` with ``width`` bitwidth
  BN.prototype.inotn = function inotn (width) {
    assert(typeof width === 'number' && width >= 0);

    var bytesNeeded = Math.ceil(width / 26) | 0;
    var bitsLeft = width % 26;

    // Extend the buffer with leading zeroes
    this._expand(bytesNeeded);

    if (bitsLeft > 0) {
      bytesNeeded--;
    }

    // Handle complete words
    for (var i = 0; i < bytesNeeded; i++) {
      this.words[i] = ~this.words[i] & 0x3ffffff;
    }

    // Handle the residue
    if (bitsLeft > 0) {
      this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));
    }

    // And remove leading zeroes
    return this._strip();
  };

  BN.prototype.notn = function notn (width) {
    return this.clone().inotn(width);
  };

  // Set `bit` of `this`
  BN.prototype.setn = function setn (bit, val) {
    assert(typeof bit === 'number' && bit >= 0);

    var off = (bit / 26) | 0;
    var wbit = bit % 26;

    this._expand(off + 1);

    if (val) {
      this.words[off] = this.words[off] | (1 << wbit);
    } else {
      this.words[off] = this.words[off] & ~(1 << wbit);
    }

    return this._strip();
  };

  // Add `num` to `this` in-place
  BN.prototype.iadd = function iadd (num) {
    var r;

    // negative + positive
    if (this.negative !== 0 && num.negative === 0) {
      this.negative = 0;
      r = this.isub(num);
      this.negative ^= 1;
      return this._normSign();

    // positive + negative
    } else if (this.negative === 0 && num.negative !== 0) {
      num.negative = 0;
      r = this.isub(num);
      num.negative = 1;
      return r._normSign();
    }

    // a.length > b.length
    var a, b;
    if (this.length > num.length) {
      a = this;
      b = num;
    } else {
      a = num;
      b = this;
    }

    var carry = 0;
    for (var i = 0; i < b.length; i++) {
      r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
      this.words[i] = r & 0x3ffffff;
      carry = r >>> 26;
    }
    for (; carry !== 0 && i < a.length; i++) {
      r = (a.words[i] | 0) + carry;
      this.words[i] = r & 0x3ffffff;
      carry = r >>> 26;
    }

    this.length = a.length;
    if (carry !== 0) {
      this.words[this.length] = carry;
      this.length++;
    // Copy the rest of the words
    } else if (a !== this) {
      for (; i < a.length; i++) {
        this.words[i] = a.words[i];
      }
    }

    return this;
  };

  // Add `num` to `this`
  BN.prototype.add = function add (num) {
    var res;
    if (num.negative !== 0 && this.negative === 0) {
      num.negative = 0;
      res = this.sub(num);
      num.negative ^= 1;
      return res;
    } else if (num.negative === 0 && this.negative !== 0) {
      this.negative = 0;
      res = num.sub(this);
      this.negative = 1;
      return res;
    }

    if (this.length > num.length) return this.clone().iadd(num);

    return num.clone().iadd(this);
  };

  // Subtract `num` from `this` in-place
  BN.prototype.isub = function isub (num) {
    // this - (-num) = this + num
    if (num.negative !== 0) {
      num.negative = 0;
      var r = this.iadd(num);
      num.negative = 1;
      return r._normSign();

    // -this - num = -(this + num)
    } else if (this.negative !== 0) {
      this.negative = 0;
      this.iadd(num);
      this.negative = 1;
      return this._normSign();
    }

    // At this point both numbers are positive
    var cmp = this.cmp(num);

    // Optimization - zeroify
    if (cmp === 0) {
      this.negative = 0;
      this.length = 1;
      this.words[0] = 0;
      return this;
    }

    // a > b
    var a, b;
    if (cmp > 0) {
      a = this;
      b = num;
    } else {
      a = num;
      b = this;
    }

    var carry = 0;
    for (var i = 0; i < b.length; i++) {
      r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
      carry = r >> 26;
      this.words[i] = r & 0x3ffffff;
    }
    for (; carry !== 0 && i < a.length; i++) {
      r = (a.words[i] | 0) + carry;
      carry = r >> 26;
      this.words[i] = r & 0x3ffffff;
    }

    // Copy rest of the words
    if (carry === 0 && i < a.length && a !== this) {
      for (; i < a.length; i++) {
        this.words[i] = a.words[i];
      }
    }

    this.length = Math.max(this.length, i);

    if (a !== this) {
      this.negative = 1;
    }

    return this._strip();
  };

  // Subtract `num` from `this`
  BN.prototype.sub = function sub (num) {
    return this.clone().isub(num);
  };

  function smallMulTo (self, num, out) {
    out.negative = num.negative ^ self.negative;
    var len = (self.length + num.length) | 0;
    out.length = len;
    len = (len - 1) | 0;

    // Peel one iteration (compiler can't do it, because of code complexity)
    var a = self.words[0] | 0;
    var b = num.words[0] | 0;
    var r = a * b;

    var lo = r & 0x3ffffff;
    var carry = (r / 0x4000000) | 0;
    out.words[0] = lo;

    for (var k = 1; k < len; k++) {
      // Sum all words with the same `i + j = k` and accumulate `ncarry`,
      // note that ncarry could be >= 0x3ffffff
      var ncarry = carry >>> 26;
      var rword = carry & 0x3ffffff;
      var maxJ = Math.min(k, num.length - 1);
      for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
        var i = (k - j) | 0;
        a = self.words[i] | 0;
        b = num.words[j] | 0;
        r = a * b + rword;
        ncarry += (r / 0x4000000) | 0;
        rword = r & 0x3ffffff;
      }
      out.words[k] = rword | 0;
      carry = ncarry | 0;
    }
    if (carry !== 0) {
      out.words[k] = carry | 0;
    } else {
      out.length--;
    }

    return out._strip();
  }

  // TODO(indutny): it may be reasonable to omit it for users who don't need
  // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit
  // multiplication (like elliptic secp256k1).
  var comb10MulTo = function comb10MulTo (self, num, out) {
    var a = self.words;
    var b = num.words;
    var o = out.words;
    var c = 0;
    var lo;
    var mid;
    var hi;
    var a0 = a[0] | 0;
    var al0 = a0 & 0x1fff;
    var ah0 = a0 >>> 13;
    var a1 = a[1] | 0;
    var al1 = a1 & 0x1fff;
    var ah1 = a1 >>> 13;
    var a2 = a[2] | 0;
    var al2 = a2 & 0x1fff;
    var ah2 = a2 >>> 13;
    var a3 = a[3] | 0;
    var al3 = a3 & 0x1fff;
    var ah3 = a3 >>> 13;
    var a4 = a[4] | 0;
    var al4 = a4 & 0x1fff;
    var ah4 = a4 >>> 13;
    var a5 = a[5] | 0;
    var al5 = a5 & 0x1fff;
    var ah5 = a5 >>> 13;
    var a6 = a[6] | 0;
    var al6 = a6 & 0x1fff;
    var ah6 = a6 >>> 13;
    var a7 = a[7] | 0;
    var al7 = a7 & 0x1fff;
    var ah7 = a7 >>> 13;
    var a8 = a[8] | 0;
    var al8 = a8 & 0x1fff;
    var ah8 = a8 >>> 13;
    var a9 = a[9] | 0;
    var al9 = a9 & 0x1fff;
    var ah9 = a9 >>> 13;
    var b0 = b[0] | 0;
    var bl0 = b0 & 0x1fff;
    var bh0 = b0 >>> 13;
    var b1 = b[1] | 0;
    var bl1 = b1 & 0x1fff;
    var bh1 = b1 >>> 13;
    var b2 = b[2] | 0;
    var bl2 = b2 & 0x1fff;
    var bh2 = b2 >>> 13;
    var b3 = b[3] | 0;
    var bl3 = b3 & 0x1fff;
    var bh3 = b3 >>> 13;
    var b4 = b[4] | 0;
    var bl4 = b4 & 0x1fff;
    var bh4 = b4 >>> 13;
    var b5 = b[5] | 0;
    var bl5 = b5 & 0x1fff;
    var bh5 = b5 >>> 13;
    var b6 = b[6] | 0;
    var bl6 = b6 & 0x1fff;
    var bh6 = b6 >>> 13;
    var b7 = b[7] | 0;
    var bl7 = b7 & 0x1fff;
    var bh7 = b7 >>> 13;
    var b8 = b[8] | 0;
    var bl8 = b8 & 0x1fff;
    var bh8 = b8 >>> 13;
    var b9 = b[9] | 0;
    var bl9 = b9 & 0x1fff;
    var bh9 = b9 >>> 13;

    out.negative = self.negative ^ num.negative;
    out.length = 19;
    /* k = 0 */
    lo = Math.imul(al0, bl0);
    mid = Math.imul(al0, bh0);
    mid = (mid + Math.imul(ah0, bl0)) | 0;
    hi = Math.imul(ah0, bh0);
    var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;
    w0 &= 0x3ffffff;
    /* k = 1 */
    lo = Math.imul(al1, bl0);
    mid = Math.imul(al1, bh0);
    mid = (mid + Math.imul(ah1, bl0)) | 0;
    hi = Math.imul(ah1, bh0);
    lo = (lo + Math.imul(al0, bl1)) | 0;
    mid = (mid + Math.imul(al0, bh1)) | 0;
    mid = (mid + Math.imul(ah0, bl1)) | 0;
    hi = (hi + Math.imul(ah0, bh1)) | 0;
    var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;
    w1 &= 0x3ffffff;
    /* k = 2 */
    lo = Math.imul(al2, bl0);
    mid = Math.imul(al2, bh0);
    mid = (mid + Math.imul(ah2, bl0)) | 0;
    hi = Math.imul(ah2, bh0);
    lo = (lo + Math.imul(al1, bl1)) | 0;
    mid = (mid + Math.imul(al1, bh1)) | 0;
    mid = (mid + Math.imul(ah1, bl1)) | 0;
    hi = (hi + Math.imul(ah1, bh1)) | 0;
    lo = (lo + Math.imul(al0, bl2)) | 0;
    mid = (mid + Math.imul(al0, bh2)) | 0;
    mid = (mid + Math.imul(ah0, bl2)) | 0;
    hi = (hi + Math.imul(ah0, bh2)) | 0;
    var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;
    w2 &= 0x3ffffff;
    /* k = 3 */
    lo = Math.imul(al3, bl0);
    mid = Math.imul(al3, bh0);
    mid = (mid + Math.imul(ah3, bl0)) | 0;
    hi = Math.imul(ah3, bh0);
    lo = (lo + Math.imul(al2, bl1)) | 0;
    mid = (mid + Math.imul(al2, bh1)) | 0;
    mid = (mid + Math.imul(ah2, bl1)) | 0;
    hi = (hi + Math.imul(ah2, bh1)) | 0;
    lo = (lo + Math.imul(al1, bl2)) | 0;
    mid = (mid + Math.imul(al1, bh2)) | 0;
    mid = (mid + Math.imul(ah1, bl2)) | 0;
    hi = (hi + Math.imul(ah1, bh2)) | 0;
    lo = (lo + Math.imul(al0, bl3)) | 0;
    mid = (mid + Math.imul(al0, bh3)) | 0;
    mid = (mid + Math.imul(ah0, bl3)) | 0;
    hi = (hi + Math.imul(ah0, bh3)) | 0;
    var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;
    w3 &= 0x3ffffff;
    /* k = 4 */
    lo = Math.imul(al4, bl0);
    mid = Math.imul(al4, bh0);
    mid = (mid + Math.imul(ah4, bl0)) | 0;
    hi = Math.imul(ah4, bh0);
    lo = (lo + Math.imul(al3, bl1)) | 0;
    mid = (mid + Math.imul(al3, bh1)) | 0;
    mid = (mid + Math.imul(ah3, bl1)) | 0;
    hi = (hi + Math.imul(ah3, bh1)) | 0;
    lo = (lo + Math.imul(al2, bl2)) | 0;
    mid = (mid + Math.imul(al2, bh2)) | 0;
    mid = (mid + Math.imul(ah2, bl2)) | 0;
    hi = (hi + Math.imul(ah2, bh2)) | 0;
    lo = (lo + Math.imul(al1, bl3)) | 0;
    mid = (mid + Math.imul(al1, bh3)) | 0;
    mid = (mid + Math.imul(ah1, bl3)) | 0;
    hi = (hi + Math.imul(ah1, bh3)) | 0;
    lo = (lo + Math.imul(al0, bl4)) | 0;
    mid = (mid + Math.imul(al0, bh4)) | 0;
    mid = (mid + Math.imul(ah0, bl4)) | 0;
    hi = (hi + Math.imul(ah0, bh4)) | 0;
    var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;
    w4 &= 0x3ffffff;
    /* k = 5 */
    lo = Math.imul(al5, bl0);
    mid = Math.imul(al5, bh0);
    mid = (mid + Math.imul(ah5, bl0)) | 0;
    hi = Math.imul(ah5, bh0);
    lo = (lo + Math.imul(al4, bl1)) | 0;
    mid = (mid + Math.imul(al4, bh1)) | 0;
    mid = (mid + Math.imul(ah4, bl1)) | 0;
    hi = (hi + Math.imul(ah4, bh1)) | 0;
    lo = (lo + Math.imul(al3, bl2)) | 0;
    mid = (mid + Math.imul(al3, bh2)) | 0;
    mid = (mid + Math.imul(ah3, bl2)) | 0;
    hi = (hi + Math.imul(ah3, bh2)) | 0;
    lo = (lo + Math.imul(al2, bl3)) | 0;
    mid = (mid + Math.imul(al2, bh3)) | 0;
    mid = (mid + Math.imul(ah2, bl3)) | 0;
    hi = (hi + Math.imul(ah2, bh3)) | 0;
    lo = (lo + Math.imul(al1, bl4)) | 0;
    mid = (mid + Math.imul(al1, bh4)) | 0;
    mid = (mid + Math.imul(ah1, bl4)) | 0;
    hi = (hi + Math.imul(ah1, bh4)) | 0;
    lo = (lo + Math.imul(al0, bl5)) | 0;
    mid = (mid + Math.imul(al0, bh5)) | 0;
    mid = (mid + Math.imul(ah0, bl5)) | 0;
    hi = (hi + Math.imul(ah0, bh5)) | 0;
    var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;
    w5 &= 0x3ffffff;
    /* k = 6 */
    lo = Math.imul(al6, bl0);
    mid = Math.imul(al6, bh0);
    mid = (mid + Math.imul(ah6, bl0)) | 0;
    hi = Math.imul(ah6, bh0);
    lo = (lo + Math.imul(al5, bl1)) | 0;
    mid = (mid + Math.imul(al5, bh1)) | 0;
    mid = (mid + Math.imul(ah5, bl1)) | 0;
    hi = (hi + Math.imul(ah5, bh1)) | 0;
    lo = (lo + Math.imul(al4, bl2)) | 0;
    mid = (mid + Math.imul(al4, bh2)) | 0;
    mid = (mid + Math.imul(ah4, bl2)) | 0;
    hi = (hi + Math.imul(ah4, bh2)) | 0;
    lo = (lo + Math.imul(al3, bl3)) | 0;
    mid = (mid + Math.imul(al3, bh3)) | 0;
    mid = (mid + Math.imul(ah3, bl3)) | 0;
    hi = (hi + Math.imul(ah3, bh3)) | 0;
    lo = (lo + Math.imul(al2, bl4)) | 0;
    mid = (mid + Math.imul(al2, bh4)) | 0;
    mid = (mid + Math.imul(ah2, bl4)) | 0;
    hi = (hi + Math.imul(ah2, bh4)) | 0;
    lo = (lo + Math.imul(al1, bl5)) | 0;
    mid = (mid + Math.imul(al1, bh5)) | 0;
    mid = (mid + Math.imul(ah1, bl5)) | 0;
    hi = (hi + Math.imul(ah1, bh5)) | 0;
    lo = (lo + Math.imul(al0, bl6)) | 0;
    mid = (mid + Math.imul(al0, bh6)) | 0;
    mid = (mid + Math.imul(ah0, bl6)) | 0;
    hi = (hi + Math.imul(ah0, bh6)) | 0;
    var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;
    w6 &= 0x3ffffff;
    /* k = 7 */
    lo = Math.imul(al7, bl0);
    mid = Math.imul(al7, bh0);
    mid = (mid + Math.imul(ah7, bl0)) | 0;
    hi = Math.imul(ah7, bh0);
    lo = (lo + Math.imul(al6, bl1)) | 0;
    mid = (mid + Math.imul(al6, bh1)) | 0;
    mid = (mid + Math.imul(ah6, bl1)) | 0;
    hi = (hi + Math.imul(ah6, bh1)) | 0;
    lo = (lo + Math.imul(al5, bl2)) | 0;
    mid = (mid + Math.imul(al5, bh2)) | 0;
    mid = (mid + Math.imul(ah5, bl2)) | 0;
    hi = (hi + Math.imul(ah5, bh2)) | 0;
    lo = (lo + Math.imul(al4, bl3)) | 0;
    mid = (mid + Math.imul(al4, bh3)) | 0;
    mid = (mid + Math.imul(ah4, bl3)) | 0;
    hi = (hi + Math.imul(ah4, bh3)) | 0;
    lo = (lo + Math.imul(al3, bl4)) | 0;
    mid = (mid + Math.imul(al3, bh4)) | 0;
    mid = (mid + Math.imul(ah3, bl4)) | 0;
    hi = (hi + Math.imul(ah3, bh4)) | 0;
    lo = (lo + Math.imul(al2, bl5)) | 0;
    mid = (mid + Math.imul(al2, bh5)) | 0;
    mid = (mid + Math.imul(ah2, bl5)) | 0;
    hi = (hi + Math.imul(ah2, bh5)) | 0;
    lo = (lo + Math.imul(al1, bl6)) | 0;
    mid = (mid + Math.imul(al1, bh6)) | 0;
    mid = (mid + Math.imul(ah1, bl6)) | 0;
    hi = (hi + Math.imul(ah1, bh6)) | 0;
    lo = (lo + Math.imul(al0, bl7)) | 0;
    mid = (mid + Math.imul(al0, bh7)) | 0;
    mid = (mid + Math.imul(ah0, bl7)) | 0;
    hi = (hi + Math.imul(ah0, bh7)) | 0;
    var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;
    w7 &= 0x3ffffff;
    /* k = 8 */
    lo = Math.imul(al8, bl0);
    mid = Math.imul(al8, bh0);
    mid = (mid + Math.imul(ah8, bl0)) | 0;
    hi = Math.imul(ah8, bh0);
    lo = (lo + Math.imul(al7, bl1)) | 0;
    mid = (mid + Math.imul(al7, bh1)) | 0;
    mid = (mid + Math.imul(ah7, bl1)) | 0;
    hi = (hi + Math.imul(ah7, bh1)) | 0;
    lo = (lo + Math.imul(al6, bl2)) | 0;
    mid = (mid + Math.imul(al6, bh2)) | 0;
    mid = (mid + Math.imul(ah6, bl2)) | 0;
    hi = (hi + Math.imul(ah6, bh2)) | 0;
    lo = (lo + Math.imul(al5, bl3)) | 0;
    mid = (mid + Math.imul(al5, bh3)) | 0;
    mid = (mid + Math.imul(ah5, bl3)) | 0;
    hi = (hi + Math.imul(ah5, bh3)) | 0;
    lo = (lo + Math.imul(al4, bl4)) | 0;
    mid = (mid + Math.imul(al4, bh4)) | 0;
    mid = (mid + Math.imul(ah4, bl4)) | 0;
    hi = (hi + Math.imul(ah4, bh4)) | 0;
    lo = (lo + Math.imul(al3, bl5)) | 0;
    mid = (mid + Math.imul(al3, bh5)) | 0;
    mid = (mid + Math.imul(ah3, bl5)) | 0;
    hi = (hi + Math.imul(ah3, bh5)) | 0;
    lo = (lo + Math.imul(al2, bl6)) | 0;
    mid = (mid + Math.imul(al2, bh6)) | 0;
    mid = (mid + Math.imul(ah2, bl6)) | 0;
    hi = (hi + Math.imul(ah2, bh6)) | 0;
    lo = (lo + Math.imul(al1, bl7)) | 0;
    mid = (mid + Math.imul(al1, bh7)) | 0;
    mid = (mid + Math.imul(ah1, bl7)) | 0;
    hi = (hi + Math.imul(ah1, bh7)) | 0;
    lo = (lo + Math.imul(al0, bl8)) | 0;
    mid = (mid + Math.imul(al0, bh8)) | 0;
    mid = (mid + Math.imul(ah0, bl8)) | 0;
    hi = (hi + Math.imul(ah0, bh8)) | 0;
    var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;
    w8 &= 0x3ffffff;
    /* k = 9 */
    lo = Math.imul(al9, bl0);
    mid = Math.imul(al9, bh0);
    mid = (mid + Math.imul(ah9, bl0)) | 0;
    hi = Math.imul(ah9, bh0);
    lo = (lo + Math.imul(al8, bl1)) | 0;
    mid = (mid + Math.imul(al8, bh1)) | 0;
    mid = (mid + Math.imul(ah8, bl1)) | 0;
    hi = (hi + Math.imul(ah8, bh1)) | 0;
    lo = (lo + Math.imul(al7, bl2)) | 0;
    mid = (mid + Math.imul(al7, bh2)) | 0;
    mid = (mid + Math.imul(ah7, bl2)) | 0;
    hi = (hi + Math.imul(ah7, bh2)) | 0;
    lo = (lo + Math.imul(al6, bl3)) | 0;
    mid = (mid + Math.imul(al6, bh3)) | 0;
    mid = (mid + Math.imul(ah6, bl3)) | 0;
    hi = (hi + Math.imul(ah6, bh3)) | 0;
    lo = (lo + Math.imul(al5, bl4)) | 0;
    mid = (mid + Math.imul(al5, bh4)) | 0;
    mid = (mid + Math.imul(ah5, bl4)) | 0;
    hi = (hi + Math.imul(ah5, bh4)) | 0;
    lo = (lo + Math.imul(al4, bl5)) | 0;
    mid = (mid + Math.imul(al4, bh5)) | 0;
    mid = (mid + Math.imul(ah4, bl5)) | 0;
    hi = (hi + Math.imul(ah4, bh5)) | 0;
    lo = (lo + Math.imul(al3, bl6)) | 0;
    mid = (mid + Math.imul(al3, bh6)) | 0;
    mid = (mid + Math.imul(ah3, bl6)) | 0;
    hi = (hi + Math.imul(ah3, bh6)) | 0;
    lo = (lo + Math.imul(al2, bl7)) | 0;
    mid = (mid + Math.imul(al2, bh7)) | 0;
    mid = (mid + Math.imul(ah2, bl7)) | 0;
    hi = (hi + Math.imul(ah2, bh7)) | 0;
    lo = (lo + Math.imul(al1, bl8)) | 0;
    mid = (mid + Math.imul(al1, bh8)) | 0;
    mid = (mid + Math.imul(ah1, bl8)) | 0;
    hi = (hi + Math.imul(ah1, bh8)) | 0;
    lo = (lo + Math.imul(al0, bl9)) | 0;
    mid = (mid + Math.imul(al0, bh9)) | 0;
    mid = (mid + Math.imul(ah0, bl9)) | 0;
    hi = (hi + Math.imul(ah0, bh9)) | 0;
    var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;
    w9 &= 0x3ffffff;
    /* k = 10 */
    lo = Math.imul(al9, bl1);
    mid = Math.imul(al9, bh1);
    mid = (mid + Math.imul(ah9, bl1)) | 0;
    hi = Math.imul(ah9, bh1);
    lo = (lo + Math.imul(al8, bl2)) | 0;
    mid = (mid + Math.imul(al8, bh2)) | 0;
    mid = (mid + Math.imul(ah8, bl2)) | 0;
    hi = (hi + Math.imul(ah8, bh2)) | 0;
    lo = (lo + Math.imul(al7, bl3)) | 0;
    mid = (mid + Math.imul(al7, bh3)) | 0;
    mid = (mid + Math.imul(ah7, bl3)) | 0;
    hi = (hi + Math.imul(ah7, bh3)) | 0;
    lo = (lo + Math.imul(al6, bl4)) | 0;
    mid = (mid + Math.imul(al6, bh4)) | 0;
    mid = (mid + Math.imul(ah6, bl4)) | 0;
    hi = (hi + Math.imul(ah6, bh4)) | 0;
    lo = (lo + Math.imul(al5, bl5)) | 0;
    mid = (mid + Math.imul(al5, bh5)) | 0;
    mid = (mid + Math.imul(ah5, bl5)) | 0;
    hi = (hi + Math.imul(ah5, bh5)) | 0;
    lo = (lo + Math.imul(al4, bl6)) | 0;
    mid = (mid + Math.imul(al4, bh6)) | 0;
    mid = (mid + Math.imul(ah4, bl6)) | 0;
    hi = (hi + Math.imul(ah4, bh6)) | 0;
    lo = (lo + Math.imul(al3, bl7)) | 0;
    mid = (mid + Math.imul(al3, bh7)) | 0;
    mid = (mid + Math.imul(ah3, bl7)) | 0;
    hi = (hi + Math.imul(ah3, bh7)) | 0;
    lo = (lo + Math.imul(al2, bl8)) | 0;
    mid = (mid + Math.imul(al2, bh8)) | 0;
    mid = (mid + Math.imul(ah2, bl8)) | 0;
    hi = (hi + Math.imul(ah2, bh8)) | 0;
    lo = (lo + Math.imul(al1, bl9)) | 0;
    mid = (mid + Math.imul(al1, bh9)) | 0;
    mid = (mid + Math.imul(ah1, bl9)) | 0;
    hi = (hi + Math.imul(ah1, bh9)) | 0;
    var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;
    w10 &= 0x3ffffff;
    /* k = 11 */
    lo = Math.imul(al9, bl2);
    mid = Math.imul(al9, bh2);
    mid = (mid + Math.imul(ah9, bl2)) | 0;
    hi = Math.imul(ah9, bh2);
    lo = (lo + Math.imul(al8, bl3)) | 0;
    mid = (mid + Math.imul(al8, bh3)) | 0;
    mid = (mid + Math.imul(ah8, bl3)) | 0;
    hi = (hi + Math.imul(ah8, bh3)) | 0;
    lo = (lo + Math.imul(al7, bl4)) | 0;
    mid = (mid + Math.imul(al7, bh4)) | 0;
    mid = (mid + Math.imul(ah7, bl4)) | 0;
    hi = (hi + Math.imul(ah7, bh4)) | 0;
    lo = (lo + Math.imul(al6, bl5)) | 0;
    mid = (mid + Math.imul(al6, bh5)) | 0;
    mid = (mid + Math.imul(ah6, bl5)) | 0;
    hi = (hi + Math.imul(ah6, bh5)) | 0;
    lo = (lo + Math.imul(al5, bl6)) | 0;
    mid = (mid + Math.imul(al5, bh6)) | 0;
    mid = (mid + Math.imul(ah5, bl6)) | 0;
    hi = (hi + Math.imul(ah5, bh6)) | 0;
    lo = (lo + Math.imul(al4, bl7)) | 0;
    mid = (mid + Math.imul(al4, bh7)) | 0;
    mid = (mid + Math.imul(ah4, bl7)) | 0;
    hi = (hi + Math.imul(ah4, bh7)) | 0;
    lo = (lo + Math.imul(al3, bl8)) | 0;
    mid = (mid + Math.imul(al3, bh8)) | 0;
    mid = (mid + Math.imul(ah3, bl8)) | 0;
    hi = (hi + Math.imul(ah3, bh8)) | 0;
    lo = (lo + Math.imul(al2, bl9)) | 0;
    mid = (mid + Math.imul(al2, bh9)) | 0;
    mid = (mid + Math.imul(ah2, bl9)) | 0;
    hi = (hi + Math.imul(ah2, bh9)) | 0;
    var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;
    w11 &= 0x3ffffff;
    /* k = 12 */
    lo = Math.imul(al9, bl3);
    mid = Math.imul(al9, bh3);
    mid = (mid + Math.imul(ah9, bl3)) | 0;
    hi = Math.imul(ah9, bh3);
    lo = (lo + Math.imul(al8, bl4)) | 0;
    mid = (mid + Math.imul(al8, bh4)) | 0;
    mid = (mid + Math.imul(ah8, bl4)) | 0;
    hi = (hi + Math.imul(ah8, bh4)) | 0;
    lo = (lo + Math.imul(al7, bl5)) | 0;
    mid = (mid + Math.imul(al7, bh5)) | 0;
    mid = (mid + Math.imul(ah7, bl5)) | 0;
    hi = (hi + Math.imul(ah7, bh5)) | 0;
    lo = (lo + Math.imul(al6, bl6)) | 0;
    mid = (mid + Math.imul(al6, bh6)) | 0;
    mid = (mid + Math.imul(ah6, bl6)) | 0;
    hi = (hi + Math.imul(ah6, bh6)) | 0;
    lo = (lo + Math.imul(al5, bl7)) | 0;
    mid = (mid + Math.imul(al5, bh7)) | 0;
    mid = (mid + Math.imul(ah5, bl7)) | 0;
    hi = (hi + Math.imul(ah5, bh7)) | 0;
    lo = (lo + Math.imul(al4, bl8)) | 0;
    mid = (mid + Math.imul(al4, bh8)) | 0;
    mid = (mid + Math.imul(ah4, bl8)) | 0;
    hi = (hi + Math.imul(ah4, bh8)) | 0;
    lo = (lo + Math.imul(al3, bl9)) | 0;
    mid = (mid + Math.imul(al3, bh9)) | 0;
    mid = (mid + Math.imul(ah3, bl9)) | 0;
    hi = (hi + Math.imul(ah3, bh9)) | 0;
    var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;
    w12 &= 0x3ffffff;
    /* k = 13 */
    lo = Math.imul(al9, bl4);
    mid = Math.imul(al9, bh4);
    mid = (mid + Math.imul(ah9, bl4)) | 0;
    hi = Math.imul(ah9, bh4);
    lo = (lo + Math.imul(al8, bl5)) | 0;
    mid = (mid + Math.imul(al8, bh5)) | 0;
    mid = (mid + Math.imul(ah8, bl5)) | 0;
    hi = (hi + Math.imul(ah8, bh5)) | 0;
    lo = (lo + Math.imul(al7, bl6)) | 0;
    mid = (mid + Math.imul(al7, bh6)) | 0;
    mid = (mid + Math.imul(ah7, bl6)) | 0;
    hi = (hi + Math.imul(ah7, bh6)) | 0;
    lo = (lo + Math.imul(al6, bl7)) | 0;
    mid = (mid + Math.imul(al6, bh7)) | 0;
    mid = (mid + Math.imul(ah6, bl7)) | 0;
    hi = (hi + Math.imul(ah6, bh7)) | 0;
    lo = (lo + Math.imul(al5, bl8)) | 0;
    mid = (mid + Math.imul(al5, bh8)) | 0;
    mid = (mid + Math.imul(ah5, bl8)) | 0;
    hi = (hi + Math.imul(ah5, bh8)) | 0;
    lo = (lo + Math.imul(al4, bl9)) | 0;
    mid = (mid + Math.imul(al4, bh9)) | 0;
    mid = (mid + Math.imul(ah4, bl9)) | 0;
    hi = (hi + Math.imul(ah4, bh9)) | 0;
    var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;
    w13 &= 0x3ffffff;
    /* k = 14 */
    lo = Math.imul(al9, bl5);
    mid = Math.imul(al9, bh5);
    mid = (mid + Math.imul(ah9, bl5)) | 0;
    hi = Math.imul(ah9, bh5);
    lo = (lo + Math.imul(al8, bl6)) | 0;
    mid = (mid + Math.imul(al8, bh6)) | 0;
    mid = (mid + Math.imul(ah8, bl6)) | 0;
    hi = (hi + Math.imul(ah8, bh6)) | 0;
    lo = (lo + Math.imul(al7, bl7)) | 0;
    mid = (mid + Math.imul(al7, bh7)) | 0;
    mid = (mid + Math.imul(ah7, bl7)) | 0;
    hi = (hi + Math.imul(ah7, bh7)) | 0;
    lo = (lo + Math.imul(al6, bl8)) | 0;
    mid = (mid + Math.imul(al6, bh8)) | 0;
    mid = (mid + Math.imul(ah6, bl8)) | 0;
    hi = (hi + Math.imul(ah6, bh8)) | 0;
    lo = (lo + Math.imul(al5, bl9)) | 0;
    mid = (mid + Math.imul(al5, bh9)) | 0;
    mid = (mid + Math.imul(ah5, bl9)) | 0;
    hi = (hi + Math.imul(ah5, bh9)) | 0;
    var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;
    w14 &= 0x3ffffff;
    /* k = 15 */
    lo = Math.imul(al9, bl6);
    mid = Math.imul(al9, bh6);
    mid = (mid + Math.imul(ah9, bl6)) | 0;
    hi = Math.imul(ah9, bh6);
    lo = (lo + Math.imul(al8, bl7)) | 0;
    mid = (mid + Math.imul(al8, bh7)) | 0;
    mid = (mid + Math.imul(ah8, bl7)) | 0;
    hi = (hi + Math.imul(ah8, bh7)) | 0;
    lo = (lo + Math.imul(al7, bl8)) | 0;
    mid = (mid + Math.imul(al7, bh8)) | 0;
    mid = (mid + Math.imul(ah7, bl8)) | 0;
    hi = (hi + Math.imul(ah7, bh8)) | 0;
    lo = (lo + Math.imul(al6, bl9)) | 0;
    mid = (mid + Math.imul(al6, bh9)) | 0;
    mid = (mid + Math.imul(ah6, bl9)) | 0;
    hi = (hi + Math.imul(ah6, bh9)) | 0;
    var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;
    w15 &= 0x3ffffff;
    /* k = 16 */
    lo = Math.imul(al9, bl7);
    mid = Math.imul(al9, bh7);
    mid = (mid + Math.imul(ah9, bl7)) | 0;
    hi = Math.imul(ah9, bh7);
    lo = (lo + Math.imul(al8, bl8)) | 0;
    mid = (mid + Math.imul(al8, bh8)) | 0;
    mid = (mid + Math.imul(ah8, bl8)) | 0;
    hi = (hi + Math.imul(ah8, bh8)) | 0;
    lo = (lo + Math.imul(al7, bl9)) | 0;
    mid = (mid + Math.imul(al7, bh9)) | 0;
    mid = (mid + Math.imul(ah7, bl9)) | 0;
    hi = (hi + Math.imul(ah7, bh9)) | 0;
    var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;
    w16 &= 0x3ffffff;
    /* k = 17 */
    lo = Math.imul(al9, bl8);
    mid = Math.imul(al9, bh8);
    mid = (mid + Math.imul(ah9, bl8)) | 0;
    hi = Math.imul(ah9, bh8);
    lo = (lo + Math.imul(al8, bl9)) | 0;
    mid = (mid + Math.imul(al8, bh9)) | 0;
    mid = (mid + Math.imul(ah8, bl9)) | 0;
    hi = (hi + Math.imul(ah8, bh9)) | 0;
    var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;
    w17 &= 0x3ffffff;
    /* k = 18 */
    lo = Math.imul(al9, bl9);
    mid = Math.imul(al9, bh9);
    mid = (mid + Math.imul(ah9, bl9)) | 0;
    hi = Math.imul(ah9, bh9);
    var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
    c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;
    w18 &= 0x3ffffff;
    o[0] = w0;
    o[1] = w1;
    o[2] = w2;
    o[3] = w3;
    o[4] = w4;
    o[5] = w5;
    o[6] = w6;
    o[7] = w7;
    o[8] = w8;
    o[9] = w9;
    o[10] = w10;
    o[11] = w11;
    o[12] = w12;
    o[13] = w13;
    o[14] = w14;
    o[15] = w15;
    o[16] = w16;
    o[17] = w17;
    o[18] = w18;
    if (c !== 0) {
      o[19] = c;
      out.length++;
    }
    return out;
  };

  // Polyfill comb
  if (!Math.imul) {
    comb10MulTo = smallMulTo;
  }

  function bigMulTo (self, num, out) {
    out.negative = num.negative ^ self.negative;
    out.length = self.length + num.length;

    var carry = 0;
    var hncarry = 0;
    for (var k = 0; k < out.length - 1; k++) {
      // Sum all words with the same `i + j = k` and accumulate `ncarry`,
      // note that ncarry could be >= 0x3ffffff
      var ncarry = hncarry;
      hncarry = 0;
      var rword = carry & 0x3ffffff;
      var maxJ = Math.min(k, num.length - 1);
      for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
        var i = k - j;
        var a = self.words[i] | 0;
        var b = num.words[j] | 0;
        var r = a * b;

        var lo = r & 0x3ffffff;
        ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
        lo = (lo + rword) | 0;
        rword = lo & 0x3ffffff;
        ncarry = (ncarry + (lo >>> 26)) | 0;

        hncarry += ncarry >>> 26;
        ncarry &= 0x3ffffff;
      }
      out.words[k] = rword;
      carry = ncarry;
      ncarry = hncarry;
    }
    if (carry !== 0) {
      out.words[k] = carry;
    } else {
      out.length--;
    }

    return out._strip();
  }

  function jumboMulTo (self, num, out) {
    // Temporary disable, see https://github.com/indutny/bn.js/issues/211
    // var fftm = new FFTM();
    // return fftm.mulp(self, num, out);
    return bigMulTo(self, num, out);
  }

  BN.prototype.mulTo = function mulTo (num, out) {
    var res;
    var len = this.length + num.length;
    if (this.length === 10 && num.length === 10) {
      res = comb10MulTo(this, num, out);
    } else if (len < 63) {
      res = smallMulTo(this, num, out);
    } else if (len < 1024) {
      res = bigMulTo(this, num, out);
    } else {
      res = jumboMulTo(this, num, out);
    }

    return res;
  };

  // Cooley-Tukey algorithm for FFT
  // slightly revisited to rely on looping instead of recursion

  function FFTM (x, y) {
    this.x = x;
    this.y = y;
  }

  FFTM.prototype.makeRBT = function makeRBT (N) {
    var t = new Array(N);
    var l = BN.prototype._countBits(N) - 1;
    for (var i = 0; i < N; i++) {
      t[i] = this.revBin(i, l, N);
    }

    return t;
  };

  // Returns binary-reversed representation of `x`
  FFTM.prototype.revBin = function revBin (x, l, N) {
    if (x === 0 || x === N - 1) return x;

    var rb = 0;
    for (var i = 0; i < l; i++) {
      rb |= (x & 1) << (l - i - 1);
      x >>= 1;
    }

    return rb;
  };

  // Performs "tweedling" phase, therefore 'emulating'
  // behaviour of the recursive algorithm
  FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {
    for (var i = 0; i < N; i++) {
      rtws[i] = rws[rbt[i]];
      itws[i] = iws[rbt[i]];
    }
  };

  FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {
    this.permute(rbt, rws, iws, rtws, itws, N);

    for (var s = 1; s < N; s <<= 1) {
      var l = s << 1;

      var rtwdf = Math.cos(2 * Math.PI / l);
      var itwdf = Math.sin(2 * Math.PI / l);

      for (var p = 0; p < N; p += l) {
        var rtwdf_ = rtwdf;
        var itwdf_ = itwdf;

        for (var j = 0; j < s; j++) {
          var re = rtws[p + j];
          var ie = itws[p + j];

          var ro = rtws[p + j + s];
          var io = itws[p + j + s];

          var rx = rtwdf_ * ro - itwdf_ * io;

          io = rtwdf_ * io + itwdf_ * ro;
          ro = rx;

          rtws[p + j] = re + ro;
          itws[p + j] = ie + io;

          rtws[p + j + s] = re - ro;
          itws[p + j + s] = ie - io;

          /* jshint maxdepth : false */
          if (j !== l) {
            rx = rtwdf * rtwdf_ - itwdf * itwdf_;

            itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
            rtwdf_ = rx;
          }
        }
      }
    }
  };

  FFTM.prototype.guessLen13b = function guessLen13b (n, m) {
    var N = Math.max(m, n) | 1;
    var odd = N & 1;
    var i = 0;
    for (N = N / 2 | 0; N; N = N >>> 1) {
      i++;
    }

    return 1 << i + 1 + odd;
  };

  FFTM.prototype.conjugate = function conjugate (rws, iws, N) {
    if (N <= 1) return;

    for (var i = 0; i < N / 2; i++) {
      var t = rws[i];

      rws[i] = rws[N - i - 1];
      rws[N - i - 1] = t;

      t = iws[i];

      iws[i] = -iws[N - i - 1];
      iws[N - i - 1] = -t;
    }
  };

  FFTM.prototype.normalize13b = function normalize13b (ws, N) {
    var carry = 0;
    for (var i = 0; i < N / 2; i++) {
      var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +
        Math.round(ws[2 * i] / N) +
        carry;

      ws[i] = w & 0x3ffffff;

      if (w < 0x4000000) {
        carry = 0;
      } else {
        carry = w / 0x4000000 | 0;
      }
    }

    return ws;
  };

  FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {
    var carry = 0;
    for (var i = 0; i < len; i++) {
      carry = carry + (ws[i] | 0);

      rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;
      rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;
    }

    // Pad with zeroes
    for (i = 2 * len; i < N; ++i) {
      rws[i] = 0;
    }

    assert(carry === 0);
    assert((carry & ~0x1fff) === 0);
  };

  FFTM.prototype.stub = function stub (N) {
    var ph = new Array(N);
    for (var i = 0; i < N; i++) {
      ph[i] = 0;
    }

    return ph;
  };

  FFTM.prototype.mulp = function mulp (x, y, out) {
    var N = 2 * this.guessLen13b(x.length, y.length);

    var rbt = this.makeRBT(N);

    var _ = this.stub(N);

    var rws = new Array(N);
    var rwst = new Array(N);
    var iwst = new Array(N);

    var nrws = new Array(N);
    var nrwst = new Array(N);
    var niwst = new Array(N);

    var rmws = out.words;
    rmws.length = N;

    this.convert13b(x.words, x.length, rws, N);
    this.convert13b(y.words, y.length, nrws, N);

    this.transform(rws, _, rwst, iwst, N, rbt);
    this.transform(nrws, _, nrwst, niwst, N, rbt);

    for (var i = 0; i < N; i++) {
      var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
      iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
      rwst[i] = rx;
    }

    this.conjugate(rwst, iwst, N);
    this.transform(rwst, iwst, rmws, _, N, rbt);
    this.conjugate(rmws, _, N);
    this.normalize13b(rmws, N);

    out.negative = x.negative ^ y.negative;
    out.length = x.length + y.length;
    return out._strip();
  };

  // Multiply `this` by `num`
  BN.prototype.mul = function mul (num) {
    var out = new BN(null);
    out.words = new Array(this.length + num.length);
    return this.mulTo(num, out);
  };

  // Multiply employing FFT
  BN.prototype.mulf = function mulf (num) {
    var out = new BN(null);
    out.words = new Array(this.length + num.length);
    return jumboMulTo(this, num, out);
  };

  // In-place Multiplication
  BN.prototype.imul = function imul (num) {
    return this.clone().mulTo(num, this);
  };

  BN.prototype.imuln = function imuln (num) {
    var isNegNum = num < 0;
    if (isNegNum) num = -num;

    assert(typeof num === 'number');
    assert(num < 0x4000000);

    // Carry
    var carry = 0;
    for (var i = 0; i < this.length; i++) {
      var w = (this.words[i] | 0) * num;
      var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);
      carry >>= 26;
      carry += (w / 0x4000000) | 0;
      // NOTE: lo is 27bit maximum
      carry += lo >>> 26;
      this.words[i] = lo & 0x3ffffff;
    }

    if (carry !== 0) {
      this.words[i] = carry;
      this.length++;
    }

    return isNegNum ? this.ineg() : this;
  };

  BN.prototype.muln = function muln (num) {
    return this.clone().imuln(num);
  };

  // `this` * `this`
  BN.prototype.sqr = function sqr () {
    return this.mul(this);
  };

  // `this` * `this` in-place
  BN.prototype.isqr = function isqr () {
    return this.imul(this.clone());
  };

  // Math.pow(`this`, `num`)
  BN.prototype.pow = function pow (num) {
    var w = toBitArray(num);
    if (w.length === 0) return new BN(1);

    // Skip leading zeroes
    var res = this;
    for (var i = 0; i < w.length; i++, res = res.sqr()) {
      if (w[i] !== 0) break;
    }

    if (++i < w.length) {
      for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {
        if (w[i] === 0) continue;

        res = res.mul(q);
      }
    }

    return res;
  };

  // Shift-left in-place
  BN.prototype.iushln = function iushln (bits) {
    assert(typeof bits === 'number' && bits >= 0);
    var r = bits % 26;
    var s = (bits - r) / 26;
    var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);
    var i;

    if (r !== 0) {
      var carry = 0;

      for (i = 0; i < this.length; i++) {
        var newCarry = this.words[i] & carryMask;
        var c = ((this.words[i] | 0) - newCarry) << r;
        this.words[i] = c | carry;
        carry = newCarry >>> (26 - r);
      }

      if (carry) {
        this.words[i] = carry;
        this.length++;
      }
    }

    if (s !== 0) {
      for (i = this.length - 1; i >= 0; i--) {
        this.words[i + s] = this.words[i];
      }

      for (i = 0; i < s; i++) {
        this.words[i] = 0;
      }

      this.length += s;
    }

    return this._strip();
  };

  BN.prototype.ishln = function ishln (bits) {
    // TODO(indutny): implement me
    assert(this.negative === 0);
    return this.iushln(bits);
  };

  // Shift-right in-place
  // NOTE: `hint` is a lowest bit before trailing zeroes
  // NOTE: if `extended` is present - it will be filled with destroyed bits
  BN.prototype.iushrn = function iushrn (bits, hint, extended) {
    assert(typeof bits === 'number' && bits >= 0);
    var h;
    if (hint) {
      h = (hint - (hint % 26)) / 26;
    } else {
      h = 0;
    }

    var r = bits % 26;
    var s = Math.min((bits - r) / 26, this.length);
    var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
    var maskedWords = extended;

    h -= s;
    h = Math.max(0, h);

    // Extended mode, copy masked part
    if (maskedWords) {
      for (var i = 0; i < s; i++) {
        maskedWords.words[i] = this.words[i];
      }
      maskedWords.length = s;
    }

    if (s === 0) {
      // No-op, we should not move anything at all
    } else if (this.length > s) {
      this.length -= s;
      for (i = 0; i < this.length; i++) {
        this.words[i] = this.words[i + s];
      }
    } else {
      this.words[0] = 0;
      this.length = 1;
    }

    var carry = 0;
    for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
      var word = this.words[i] | 0;
      this.words[i] = (carry << (26 - r)) | (word >>> r);
      carry = word & mask;
    }

    // Push carried bits as a mask
    if (maskedWords && carry !== 0) {
      maskedWords.words[maskedWords.length++] = carry;
    }

    if (this.length === 0) {
      this.words[0] = 0;
      this.length = 1;
    }

    return this._strip();
  };

  BN.prototype.ishrn = function ishrn (bits, hint, extended) {
    // TODO(indutny): implement me
    assert(this.negative === 0);
    return this.iushrn(bits, hint, extended);
  };

  // Shift-left
  BN.prototype.shln = function shln (bits) {
    return this.clone().ishln(bits);
  };

  BN.prototype.ushln = function ushln (bits) {
    return this.clone().iushln(bits);
  };

  // Shift-right
  BN.prototype.shrn = function shrn (bits) {
    return this.clone().ishrn(bits);
  };

  BN.prototype.ushrn = function ushrn (bits) {
    return this.clone().iushrn(bits);
  };

  // Test if n bit is set
  BN.prototype.testn = function testn (bit) {
    assert(typeof bit === 'number' && bit >= 0);
    var r = bit % 26;
    var s = (bit - r) / 26;
    var q = 1 << r;

    // Fast case: bit is much higher than all existing words
    if (this.length <= s) return false;

    // Check bit and return
    var w = this.words[s];

    return !!(w & q);
  };

  // Return only lowers bits of number (in-place)
  BN.prototype.imaskn = function imaskn (bits) {
    assert(typeof bits === 'number' && bits >= 0);
    var r = bits % 26;
    var s = (bits - r) / 26;

    assert(this.negative === 0, 'imaskn works only with positive numbers');

    if (this.length <= s) {
      return this;
    }

    if (r !== 0) {
      s++;
    }
    this.length = Math.min(s, this.length);

    if (r !== 0) {
      var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
      this.words[this.length - 1] &= mask;
    }

    return this._strip();
  };

  // Return only lowers bits of number
  BN.prototype.maskn = function maskn (bits) {
    return this.clone().imaskn(bits);
  };

  // Add plain number `num` to `this`
  BN.prototype.iaddn = function iaddn (num) {
    assert(typeof num === 'number');
    assert(num < 0x4000000);
    if (num < 0) return this.isubn(-num);

    // Possible sign change
    if (this.negative !== 0) {
      if (this.length === 1 && (this.words[0] | 0) <= num) {
        this.words[0] = num - (this.words[0] | 0);
        this.negative = 0;
        return this;
      }

      this.negative = 0;
      this.isubn(num);
      this.negative = 1;
      return this;
    }

    // Add without checks
    return this._iaddn(num);
  };

  BN.prototype._iaddn = function _iaddn (num) {
    this.words[0] += num;

    // Carry
    for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {
      this.words[i] -= 0x4000000;
      if (i === this.length - 1) {
        this.words[i + 1] = 1;
      } else {
        this.words[i + 1]++;
      }
    }
    this.length = Math.max(this.length, i + 1);

    return this;
  };

  // Subtract plain number `num` from `this`
  BN.prototype.isubn = function isubn (num) {
    assert(typeof num === 'number');
    assert(num < 0x4000000);
    if (num < 0) return this.iaddn(-num);

    if (this.negative !== 0) {
      this.negative = 0;
      this.iaddn(num);
      this.negative = 1;
      return this;
    }

    this.words[0] -= num;

    if (this.length === 1 && this.words[0] < 0) {
      this.words[0] = -this.words[0];
      this.negative = 1;
    } else {
      // Carry
      for (var i = 0; i < this.length && this.words[i] < 0; i++) {
        this.words[i] += 0x4000000;
        this.words[i + 1] -= 1;
      }
    }

    return this._strip();
  };

  BN.prototype.addn = function addn (num) {
    return this.clone().iaddn(num);
  };

  BN.prototype.subn = function subn (num) {
    return this.clone().isubn(num);
  };

  BN.prototype.iabs = function iabs () {
    this.negative = 0;

    return this;
  };

  BN.prototype.abs = function abs () {
    return this.clone().iabs();
  };

  BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {
    var len = num.length + shift;
    var i;

    this._expand(len);

    var w;
    var carry = 0;
    for (i = 0; i < num.length; i++) {
      w = (this.words[i + shift] | 0) + carry;
      var right = (num.words[i] | 0) * mul;
      w -= right & 0x3ffffff;
      carry = (w >> 26) - ((right / 0x4000000) | 0);
      this.words[i + shift] = w & 0x3ffffff;
    }
    for (; i < this.length - shift; i++) {
      w = (this.words[i + shift] | 0) + carry;
      carry = w >> 26;
      this.words[i + shift] = w & 0x3ffffff;
    }

    if (carry === 0) return this._strip();

    // Subtraction overflow
    assert(carry === -1);
    carry = 0;
    for (i = 0; i < this.length; i++) {
      w = -(this.words[i] | 0) + carry;
      carry = w >> 26;
      this.words[i] = w & 0x3ffffff;
    }
    this.negative = 1;

    return this._strip();
  };

  BN.prototype._wordDiv = function _wordDiv (num, mode) {
    var shift = this.length - num.length;

    var a = this.clone();
    var b = num;

    // Normalize
    var bhi = b.words[b.length - 1] | 0;
    var bhiBits = this._countBits(bhi);
    shift = 26 - bhiBits;
    if (shift !== 0) {
      b = b.ushln(shift);
      a.iushln(shift);
      bhi = b.words[b.length - 1] | 0;
    }

    // Initialize quotient
    var m = a.length - b.length;
    var q;

    if (mode !== 'mod') {
      q = new BN(null);
      q.length = m + 1;
      q.words = new Array(q.length);
      for (var i = 0; i < q.length; i++) {
        q.words[i] = 0;
      }
    }

    var diff = a.clone()._ishlnsubmul(b, 1, m);
    if (diff.negative === 0) {
      a = diff;
      if (q) {
        q.words[m] = 1;
      }
    }

    for (var j = m - 1; j >= 0; j--) {
      var qj = (a.words[b.length + j] | 0) * 0x4000000 +
        (a.words[b.length + j - 1] | 0);

      // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max
      // (0x7ffffff)
      qj = Math.min((qj / bhi) | 0, 0x3ffffff);

      a._ishlnsubmul(b, qj, j);
      while (a.negative !== 0) {
        qj--;
        a.negative = 0;
        a._ishlnsubmul(b, 1, j);
        if (!a.isZero()) {
          a.negative ^= 1;
        }
      }
      if (q) {
        q.words[j] = qj;
      }
    }
    if (q) {
      q._strip();
    }
    a._strip();

    // Denormalize
    if (mode !== 'div' && shift !== 0) {
      a.iushrn(shift);
    }

    return {
      div: q || null,
      mod: a
    };
  };

  // NOTE: 1) `mode` can be set to `mod` to request mod only,
  //       to `div` to request div only, or be absent to
  //       request both div & mod
  //       2) `positive` is true if unsigned mod is requested
  BN.prototype.divmod = function divmod (num, mode, positive) {
    assert(!num.isZero());

    if (this.isZero()) {
      return {
        div: new BN(0),
        mod: new BN(0)
      };
    }

    var div, mod, res;
    if (this.negative !== 0 && num.negative === 0) {
      res = this.neg().divmod(num, mode);

      if (mode !== 'mod') {
        div = res.div.neg();
      }

      if (mode !== 'div') {
        mod = res.mod.neg();
        if (positive && mod.negative !== 0) {
          mod.iadd(num);
        }
      }

      return {
        div: div,
        mod: mod
      };
    }

    if (this.negative === 0 && num.negative !== 0) {
      res = this.divmod(num.neg(), mode);

      if (mode !== 'mod') {
        div = res.div.neg();
      }

      return {
        div: div,
        mod: res.mod
      };
    }

    if ((this.negative & num.negative) !== 0) {
      res = this.neg().divmod(num.neg(), mode);

      if (mode !== 'div') {
        mod = res.mod.neg();
        if (positive && mod.negative !== 0) {
          mod.isub(num);
        }
      }

      return {
        div: res.div,
        mod: mod
      };
    }

    // Both numbers are positive at this point

    // Strip both numbers to approximate shift value
    if (num.length > this.length || this.cmp(num) < 0) {
      return {
        div: new BN(0),
        mod: this
      };
    }

    // Very short reduction
    if (num.length === 1) {
      if (mode === 'div') {
        return {
          div: this.divn(num.words[0]),
          mod: null
        };
      }

      if (mode === 'mod') {
        return {
          div: null,
          mod: new BN(this.modrn(num.words[0]))
        };
      }

      return {
        div: this.divn(num.words[0]),
        mod: new BN(this.modrn(num.words[0]))
      };
    }

    return this._wordDiv(num, mode);
  };

  // Find `this` / `num`
  BN.prototype.div = function div (num) {
    return this.divmod(num, 'div', false).div;
  };

  // Find `this` % `num`
  BN.prototype.mod = function mod (num) {
    return this.divmod(num, 'mod', false).mod;
  };

  BN.prototype.umod = function umod (num) {
    return this.divmod(num, 'mod', true).mod;
  };

  // Find Round(`this` / `num`)
  BN.prototype.divRound = function divRound (num) {
    var dm = this.divmod(num);

    // Fast case - exact division
    if (dm.mod.isZero()) return dm.div;

    var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;

    var half = num.ushrn(1);
    var r2 = num.andln(1);
    var cmp = mod.cmp(half);

    // Round down
    if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;

    // Round up
    return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
  };

  BN.prototype.modrn = function modrn (num) {
    var isNegNum = num < 0;
    if (isNegNum) num = -num;

    assert(num <= 0x3ffffff);
    var p = (1 << 26) % num;

    var acc = 0;
    for (var i = this.length - 1; i >= 0; i--) {
      acc = (p * acc + (this.words[i] | 0)) % num;
    }

    return isNegNum ? -acc : acc;
  };

  // WARNING: DEPRECATED
  BN.prototype.modn = function modn (num) {
    return this.modrn(num);
  };

  // In-place division by number
  BN.prototype.idivn = function idivn (num) {
    var isNegNum = num < 0;
    if (isNegNum) num = -num;

    assert(num <= 0x3ffffff);

    var carry = 0;
    for (var i = this.length - 1; i >= 0; i--) {
      var w = (this.words[i] | 0) + carry * 0x4000000;
      this.words[i] = (w / num) | 0;
      carry = w % num;
    }

    this._strip();
    return isNegNum ? this.ineg() : this;
  };

  BN.prototype.divn = function divn (num) {
    return this.clone().idivn(num);
  };

  BN.prototype.egcd = function egcd (p) {
    assert(p.negative === 0);
    assert(!p.isZero());

    var x = this;
    var y = p.clone();

    if (x.negative !== 0) {
      x = x.umod(p);
    } else {
      x = x.clone();
    }

    // A * x + B * y = x
    var A = new BN(1);
    var B = new BN(0);

    // C * x + D * y = y
    var C = new BN(0);
    var D = new BN(1);

    var g = 0;

    while (x.isEven() && y.isEven()) {
      x.iushrn(1);
      y.iushrn(1);
      ++g;
    }

    var yp = y.clone();
    var xp = x.clone();

    while (!x.isZero()) {
      for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
      if (i > 0) {
        x.iushrn(i);
        while (i-- > 0) {
          if (A.isOdd() || B.isOdd()) {
            A.iadd(yp);
            B.isub(xp);
          }

          A.iushrn(1);
          B.iushrn(1);
        }
      }

      for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
      if (j > 0) {
        y.iushrn(j);
        while (j-- > 0) {
          if (C.isOdd() || D.isOdd()) {
            C.iadd(yp);
            D.isub(xp);
          }

          C.iushrn(1);
          D.iushrn(1);
        }
      }

      if (x.cmp(y) >= 0) {
        x.isub(y);
        A.isub(C);
        B.isub(D);
      } else {
        y.isub(x);
        C.isub(A);
        D.isub(B);
      }
    }

    return {
      a: C,
      b: D,
      gcd: y.iushln(g)
    };
  };

  // This is reduced incarnation of the binary EEA
  // above, designated to invert members of the
  // _prime_ fields F(p) at a maximal speed
  BN.prototype._invmp = function _invmp (p) {
    assert(p.negative === 0);
    assert(!p.isZero());

    var a = this;
    var b = p.clone();

    if (a.negative !== 0) {
      a = a.umod(p);
    } else {
      a = a.clone();
    }

    var x1 = new BN(1);
    var x2 = new BN(0);

    var delta = b.clone();

    while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
      for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
      if (i > 0) {
        a.iushrn(i);
        while (i-- > 0) {
          if (x1.isOdd()) {
            x1.iadd(delta);
          }

          x1.iushrn(1);
        }
      }

      for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
      if (j > 0) {
        b.iushrn(j);
        while (j-- > 0) {
          if (x2.isOdd()) {
            x2.iadd(delta);
          }

          x2.iushrn(1);
        }
      }

      if (a.cmp(b) >= 0) {
        a.isub(b);
        x1.isub(x2);
      } else {
        b.isub(a);
        x2.isub(x1);
      }
    }

    var res;
    if (a.cmpn(1) === 0) {
      res = x1;
    } else {
      res = x2;
    }

    if (res.cmpn(0) < 0) {
      res.iadd(p);
    }

    return res;
  };

  BN.prototype.gcd = function gcd (num) {
    if (this.isZero()) return num.abs();
    if (num.isZero()) return this.abs();

    var a = this.clone();
    var b = num.clone();
    a.negative = 0;
    b.negative = 0;

    // Remove common factor of two
    for (var shift = 0; a.isEven() && b.isEven(); shift++) {
      a.iushrn(1);
      b.iushrn(1);
    }

    do {
      while (a.isEven()) {
        a.iushrn(1);
      }
      while (b.isEven()) {
        b.iushrn(1);
      }

      var r = a.cmp(b);
      if (r < 0) {
        // Swap `a` and `b` to make `a` always bigger than `b`
        var t = a;
        a = b;
        b = t;
      } else if (r === 0 || b.cmpn(1) === 0) {
        break;
      }

      a.isub(b);
    } while (true);

    return b.iushln(shift);
  };

  // Invert number in the field F(num)
  BN.prototype.invm = function invm (num) {
    return this.egcd(num).a.umod(num);
  };

  BN.prototype.isEven = function isEven () {
    return (this.words[0] & 1) === 0;
  };

  BN.prototype.isOdd = function isOdd () {
    return (this.words[0] & 1) === 1;
  };

  // And first word and num
  BN.prototype.andln = function andln (num) {
    return this.words[0] & num;
  };

  // Increment at the bit position in-line
  BN.prototype.bincn = function bincn (bit) {
    assert(typeof bit === 'number');
    var r = bit % 26;
    var s = (bit - r) / 26;
    var q = 1 << r;

    // Fast case: bit is much higher than all existing words
    if (this.length <= s) {
      this._expand(s + 1);
      this.words[s] |= q;
      return this;
    }

    // Add bit and propagate, if needed
    var carry = q;
    for (var i = s; carry !== 0 && i < this.length; i++) {
      var w = this.words[i] | 0;
      w += carry;
      carry = w >>> 26;
      w &= 0x3ffffff;
      this.words[i] = w;
    }
    if (carry !== 0) {
      this.words[i] = carry;
      this.length++;
    }
    return this;
  };

  BN.prototype.isZero = function isZero () {
    return this.length === 1 && this.words[0] === 0;
  };

  BN.prototype.cmpn = function cmpn (num) {
    var negative = num < 0;

    if (this.negative !== 0 && !negative) return -1;
    if (this.negative === 0 && negative) return 1;

    this._strip();

    var res;
    if (this.length > 1) {
      res = 1;
    } else {
      if (negative) {
        num = -num;
      }

      assert(num <= 0x3ffffff, 'Number is too big');

      var w = this.words[0] | 0;
      res = w === num ? 0 : w < num ? -1 : 1;
    }
    if (this.negative !== 0) return -res | 0;
    return res;
  };

  // Compare two numbers and return:
  // 1 - if `this` > `num`
  // 0 - if `this` == `num`
  // -1 - if `this` < `num`
  BN.prototype.cmp = function cmp (num) {
    if (this.negative !== 0 && num.negative === 0) return -1;
    if (this.negative === 0 && num.negative !== 0) return 1;

    var res = this.ucmp(num);
    if (this.negative !== 0) return -res | 0;
    return res;
  };

  // Unsigned comparison
  BN.prototype.ucmp = function ucmp (num) {
    // At this point both numbers have the same sign
    if (this.length > num.length) return 1;
    if (this.length < num.length) return -1;

    var res = 0;
    for (var i = this.length - 1; i >= 0; i--) {
      var a = this.words[i] | 0;
      var b = num.words[i] | 0;

      if (a === b) continue;
      if (a < b) {
        res = -1;
      } else if (a > b) {
        res = 1;
      }
      break;
    }
    return res;
  };

  BN.prototype.gtn = function gtn (num) {
    return this.cmpn(num) === 1;
  };

  BN.prototype.gt = function gt (num) {
    return this.cmp(num) === 1;
  };

  BN.prototype.gten = function gten (num) {
    return this.cmpn(num) >= 0;
  };

  BN.prototype.gte = function gte (num) {
    return this.cmp(num) >= 0;
  };

  BN.prototype.ltn = function ltn (num) {
    return this.cmpn(num) === -1;
  };

  BN.prototype.lt = function lt (num) {
    return this.cmp(num) === -1;
  };

  BN.prototype.lten = function lten (num) {
    return this.cmpn(num) <= 0;
  };

  BN.prototype.lte = function lte (num) {
    return this.cmp(num) <= 0;
  };

  BN.prototype.eqn = function eqn (num) {
    return this.cmpn(num) === 0;
  };

  BN.prototype.eq = function eq (num) {
    return this.cmp(num) === 0;
  };

  //
  // A reduce context, could be using montgomery or something better, depending
  // on the `m` itself.
  //
  BN.red = function red (num) {
    return new Red(num);
  };

  BN.prototype.toRed = function toRed (ctx) {
    assert(!this.red, 'Already a number in reduction context');
    assert(this.negative === 0, 'red works only with positives');
    return ctx.convertTo(this)._forceRed(ctx);
  };

  BN.prototype.fromRed = function fromRed () {
    assert(this.red, 'fromRed works only with numbers in reduction context');
    return this.red.convertFrom(this);
  };

  BN.prototype._forceRed = function _forceRed (ctx) {
    this.red = ctx;
    return this;
  };

  BN.prototype.forceRed = function forceRed (ctx) {
    assert(!this.red, 'Already a number in reduction context');
    return this._forceRed(ctx);
  };

  BN.prototype.redAdd = function redAdd (num) {
    assert(this.red, 'redAdd works only with red numbers');
    return this.red.add(this, num);
  };

  BN.prototype.redIAdd = function redIAdd (num) {
    assert(this.red, 'redIAdd works only with red numbers');
    return this.red.iadd(this, num);
  };

  BN.prototype.redSub = function redSub (num) {
    assert(this.red, 'redSub works only with red numbers');
    return this.red.sub(this, num);
  };

  BN.prototype.redISub = function redISub (num) {
    assert(this.red, 'redISub works only with red numbers');
    return this.red.isub(this, num);
  };

  BN.prototype.redShl = function redShl (num) {
    assert(this.red, 'redShl works only with red numbers');
    return this.red.shl(this, num);
  };

  BN.prototype.redMul = function redMul (num) {
    assert(this.red, 'redMul works only with red numbers');
    this.red._verify2(this, num);
    return this.red.mul(this, num);
  };

  BN.prototype.redIMul = function redIMul (num) {
    assert(this.red, 'redMul works only with red numbers');
    this.red._verify2(this, num);
    return this.red.imul(this, num);
  };

  BN.prototype.redSqr = function redSqr () {
    assert(this.red, 'redSqr works only with red numbers');
    this.red._verify1(this);
    return this.red.sqr(this);
  };

  BN.prototype.redISqr = function redISqr () {
    assert(this.red, 'redISqr works only with red numbers');
    this.red._verify1(this);
    return this.red.isqr(this);
  };

  // Square root over p
  BN.prototype.redSqrt = function redSqrt () {
    assert(this.red, 'redSqrt works only with red numbers');
    this.red._verify1(this);
    return this.red.sqrt(this);
  };

  BN.prototype.redInvm = function redInvm () {
    assert(this.red, 'redInvm works only with red numbers');
    this.red._verify1(this);
    return this.red.invm(this);
  };

  // Return negative clone of `this` % `red modulo`
  BN.prototype.redNeg = function redNeg () {
    assert(this.red, 'redNeg works only with red numbers');
    this.red._verify1(this);
    return this.red.neg(this);
  };

  BN.prototype.redPow = function redPow (num) {
    assert(this.red && !num.red, 'redPow(normalNum)');
    this.red._verify1(this);
    return this.red.pow(this, num);
  };

  // Prime numbers with efficient reduction
  var primes = {
    k256: null,
    p224: null,
    p192: null,
    p25519: null
  };

  // Pseudo-Mersenne prime
  function MPrime (name, p) {
    // P = 2 ^ N - K
    this.name = name;
    this.p = new BN(p, 16);
    this.n = this.p.bitLength();
    this.k = new BN(1).iushln(this.n).isub(this.p);

    this.tmp = this._tmp();
  }

  MPrime.prototype._tmp = function _tmp () {
    var tmp = new BN(null);
    tmp.words = new Array(Math.ceil(this.n / 13));
    return tmp;
  };

  MPrime.prototype.ireduce = function ireduce (num) {
    // Assumes that `num` is less than `P^2`
    // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)
    var r = num;
    var rlen;

    do {
      this.split(r, this.tmp);
      r = this.imulK(r);
      r = r.iadd(this.tmp);
      rlen = r.bitLength();
    } while (rlen > this.n);

    var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
    if (cmp === 0) {
      r.words[0] = 0;
      r.length = 1;
    } else if (cmp > 0) {
      r.isub(this.p);
    } else {
      if (r.strip !== undefined) {
        // r is a BN v4 instance
        r.strip();
      } else {
        // r is a BN v5 instance
        r._strip();
      }
    }

    return r;
  };

  MPrime.prototype.split = function split (input, out) {
    input.iushrn(this.n, 0, out);
  };

  MPrime.prototype.imulK = function imulK (num) {
    return num.imul(this.k);
  };

  function K256 () {
    MPrime.call(
      this,
      'k256',
      'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');
  }
  inherits(K256, MPrime);

  K256.prototype.split = function split (input, output) {
    // 256 = 9 * 26 + 22
    var mask = 0x3fffff;

    var outLen = Math.min(input.length, 9);
    for (var i = 0; i < outLen; i++) {
      output.words[i] = input.words[i];
    }
    output.length = outLen;

    if (input.length <= 9) {
      input.words[0] = 0;
      input.length = 1;
      return;
    }

    // Shift by 9 limbs
    var prev = input.words[9];
    output.words[output.length++] = prev & mask;

    for (i = 10; i < input.length; i++) {
      var next = input.words[i] | 0;
      input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);
      prev = next;
    }
    prev >>>= 22;
    input.words[i - 10] = prev;
    if (prev === 0 && input.length > 10) {
      input.length -= 10;
    } else {
      input.length -= 9;
    }
  };

  K256.prototype.imulK = function imulK (num) {
    // K = 0x1000003d1 = [ 0x40, 0x3d1 ]
    num.words[num.length] = 0;
    num.words[num.length + 1] = 0;
    num.length += 2;

    // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390
    var lo = 0;
    for (var i = 0; i < num.length; i++) {
      var w = num.words[i] | 0;
      lo += w * 0x3d1;
      num.words[i] = lo & 0x3ffffff;
      lo = w * 0x40 + ((lo / 0x4000000) | 0);
    }

    // Fast length reduction
    if (num.words[num.length - 1] === 0) {
      num.length--;
      if (num.words[num.length - 1] === 0) {
        num.length--;
      }
    }
    return num;
  };

  function P224 () {
    MPrime.call(
      this,
      'p224',
      'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');
  }
  inherits(P224, MPrime);

  function P192 () {
    MPrime.call(
      this,
      'p192',
      'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');
  }
  inherits(P192, MPrime);

  function P25519 () {
    // 2 ^ 255 - 19
    MPrime.call(
      this,
      '25519',
      '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');
  }
  inherits(P25519, MPrime);

  P25519.prototype.imulK = function imulK (num) {
    // K = 0x13
    var carry = 0;
    for (var i = 0; i < num.length; i++) {
      var hi = (num.words[i] | 0) * 0x13 + carry;
      var lo = hi & 0x3ffffff;
      hi >>>= 26;

      num.words[i] = lo;
      carry = hi;
    }
    if (carry !== 0) {
      num.words[num.length++] = carry;
    }
    return num;
  };

  // Exported mostly for testing purposes, use plain name instead
  BN._prime = function prime (name) {
    // Cached version of prime
    if (primes[name]) return primes[name];

    var prime;
    if (name === 'k256') {
      prime = new K256();
    } else if (name === 'p224') {
      prime = new P224();
    } else if (name === 'p192') {
      prime = new P192();
    } else if (name === 'p25519') {
      prime = new P25519();
    } else {
      throw new Error('Unknown prime ' + name);
    }
    primes[name] = prime;

    return prime;
  };

  //
  // Base reduction engine
  //
  function Red (m) {
    if (typeof m === 'string') {
      var prime = BN._prime(m);
      this.m = prime.p;
      this.prime = prime;
    } else {
      assert(m.gtn(1), 'modulus must be greater than 1');
      this.m = m;
      this.prime = null;
    }
  }

  Red.prototype._verify1 = function _verify1 (a) {
    assert(a.negative === 0, 'red works only with positives');
    assert(a.red, 'red works only with red numbers');
  };

  Red.prototype._verify2 = function _verify2 (a, b) {
    assert((a.negative | b.negative) === 0, 'red works only with positives');
    assert(a.red && a.red === b.red,
      'red works only with red numbers');
  };

  Red.prototype.imod = function imod (a) {
    if (this.prime) return this.prime.ireduce(a)._forceRed(this);

    move(a, a.umod(this.m)._forceRed(this));
    return a;
  };

  Red.prototype.neg = function neg (a) {
    if (a.isZero()) {
      return a.clone();
    }

    return this.m.sub(a)._forceRed(this);
  };

  Red.prototype.add = function add (a, b) {
    this._verify2(a, b);

    var res = a.add(b);
    if (res.cmp(this.m) >= 0) {
      res.isub(this.m);
    }
    return res._forceRed(this);
  };

  Red.prototype.iadd = function iadd (a, b) {
    this._verify2(a, b);

    var res = a.iadd(b);
    if (res.cmp(this.m) >= 0) {
      res.isub(this.m);
    }
    return res;
  };

  Red.prototype.sub = function sub (a, b) {
    this._verify2(a, b);

    var res = a.sub(b);
    if (res.cmpn(0) < 0) {
      res.iadd(this.m);
    }
    return res._forceRed(this);
  };

  Red.prototype.isub = function isub (a, b) {
    this._verify2(a, b);

    var res = a.isub(b);
    if (res.cmpn(0) < 0) {
      res.iadd(this.m);
    }
    return res;
  };

  Red.prototype.shl = function shl (a, num) {
    this._verify1(a);
    return this.imod(a.ushln(num));
  };

  Red.prototype.imul = function imul (a, b) {
    this._verify2(a, b);
    return this.imod(a.imul(b));
  };

  Red.prototype.mul = function mul (a, b) {
    this._verify2(a, b);
    return this.imod(a.mul(b));
  };

  Red.prototype.isqr = function isqr (a) {
    return this.imul(a, a.clone());
  };

  Red.prototype.sqr = function sqr (a) {
    return this.mul(a, a);
  };

  Red.prototype.sqrt = function sqrt (a) {
    if (a.isZero()) return a.clone();

    var mod3 = this.m.andln(3);
    assert(mod3 % 2 === 1);

    // Fast case
    if (mod3 === 3) {
      var pow = this.m.add(new BN(1)).iushrn(2);
      return this.pow(a, pow);
    }

    // Tonelli-Shanks algorithm (Totally unoptimized and slow)
    //
    // Find Q and S, that Q * 2 ^ S = (P - 1)
    var q = this.m.subn(1);
    var s = 0;
    while (!q.isZero() && q.andln(1) === 0) {
      s++;
      q.iushrn(1);
    }
    assert(!q.isZero());

    var one = new BN(1).toRed(this);
    var nOne = one.redNeg();

    // Find quadratic non-residue
    // NOTE: Max is such because of generalized Riemann hypothesis.
    var lpow = this.m.subn(1).iushrn(1);
    var z = this.m.bitLength();
    z = new BN(2 * z * z).toRed(this);

    while (this.pow(z, lpow).cmp(nOne) !== 0) {
      z.redIAdd(nOne);
    }

    var c = this.pow(z, q);
    var r = this.pow(a, q.addn(1).iushrn(1));
    var t = this.pow(a, q);
    var m = s;
    while (t.cmp(one) !== 0) {
      var tmp = t;
      for (var i = 0; tmp.cmp(one) !== 0; i++) {
        tmp = tmp.redSqr();
      }
      assert(i < m);
      var b = this.pow(c, new BN(1).iushln(m - i - 1));

      r = r.redMul(b);
      c = b.redSqr();
      t = t.redMul(c);
      m = i;
    }

    return r;
  };

  Red.prototype.invm = function invm (a) {
    var inv = a._invmp(this.m);
    if (inv.negative !== 0) {
      inv.negative = 0;
      return this.imod(inv).redNeg();
    } else {
      return this.imod(inv);
    }
  };

  Red.prototype.pow = function pow (a, num) {
    if (num.isZero()) return new BN(1).toRed(this);
    if (num.cmpn(1) === 0) return a.clone();

    var windowSize = 4;
    var wnd = new Array(1 << windowSize);
    wnd[0] = new BN(1).toRed(this);
    wnd[1] = a;
    for (var i = 2; i < wnd.length; i++) {
      wnd[i] = this.mul(wnd[i - 1], a);
    }

    var res = wnd[0];
    var current = 0;
    var currentLen = 0;
    var start = num.bitLength() % 26;
    if (start === 0) {
      start = 26;
    }

    for (i = num.length - 1; i >= 0; i--) {
      var word = num.words[i];
      for (var j = start - 1; j >= 0; j--) {
        var bit = (word >> j) & 1;
        if (res !== wnd[0]) {
          res = this.sqr(res);
        }

        if (bit === 0 && current === 0) {
          currentLen = 0;
          continue;
        }

        current <<= 1;
        current |= bit;
        currentLen++;
        if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;

        res = this.mul(res, wnd[current]);
        currentLen = 0;
        current = 0;
      }
      start = 26;
    }

    return res;
  };

  Red.prototype.convertTo = function convertTo (num) {
    var r = num.umod(this.m);

    return r === num ? r.clone() : r;
  };

  Red.prototype.convertFrom = function convertFrom (num) {
    var res = num.clone();
    res.red = null;
    return res;
  };

  //
  // Montgomery method engine
  //

  BN.mont = function mont (num) {
    return new Mont(num);
  };

  function Mont (m) {
    Red.call(this, m);

    this.shift = this.m.bitLength();
    if (this.shift % 26 !== 0) {
      this.shift += 26 - (this.shift % 26);
    }

    this.r = new BN(1).iushln(this.shift);
    this.r2 = this.imod(this.r.sqr());
    this.rinv = this.r._invmp(this.m);

    this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
    this.minv = this.minv.umod(this.r);
    this.minv = this.r.sub(this.minv);
  }
  inherits(Mont, Red);

  Mont.prototype.convertTo = function convertTo (num) {
    return this.imod(num.ushln(this.shift));
  };

  Mont.prototype.convertFrom = function convertFrom (num) {
    var r = this.imod(num.mul(this.rinv));
    r.red = null;
    return r;
  };

  Mont.prototype.imul = function imul (a, b) {
    if (a.isZero() || b.isZero()) {
      a.words[0] = 0;
      a.length = 1;
      return a;
    }

    var t = a.imul(b);
    var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
    var u = t.isub(c).iushrn(this.shift);
    var res = u;

    if (u.cmp(this.m) >= 0) {
      res = u.isub(this.m);
    } else if (u.cmpn(0) < 0) {
      res = u.iadd(this.m);
    }

    return res._forceRed(this);
  };

  Mont.prototype.mul = function mul (a, b) {
    if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);

    var t = a.mul(b);
    var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
    var u = t.isub(c).iushrn(this.shift);
    var res = u;
    if (u.cmp(this.m) >= 0) {
      res = u.isub(this.m);
    } else if (u.cmpn(0) < 0) {
      res = u.iadd(this.m);
    }

    return res._forceRed(this);
  };

  Mont.prototype.invm = function invm (a) {
    // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R
    var res = this.imod(a._invmp(this.m).mul(this.r2));
    return res._forceRed(this);
  };
})(typeof module === 'undefined' || module, this);

},{"buffer":54}],53:[function(require,module,exports){
var r;

module.exports = function rand(len) {
  if (!r)
    r = new Rand(null);

  return r.generate(len);
};

function Rand(rand) {
  this.rand = rand;
}
module.exports.Rand = Rand;

Rand.prototype.generate = function generate(len) {
  return this._rand(len);
};

// Emulate crypto API using randy
Rand.prototype._rand = function _rand(n) {
  if (this.rand.getBytes)
    return this.rand.getBytes(n);

  var res = new Uint8Array(n);
  for (var i = 0; i < res.length; i++)
    res[i] = this.rand.getByte();
  return res;
};

if (typeof self === 'object') {
  if (self.crypto && self.crypto.getRandomValues) {
    // Modern browsers
    Rand.prototype._rand = function _rand(n) {
      var arr = new Uint8Array(n);
      self.crypto.getRandomValues(arr);
      return arr;
    };
  } else if (self.msCrypto && self.msCrypto.getRandomValues) {
    // IE
    Rand.prototype._rand = function _rand(n) {
      var arr = new Uint8Array(n);
      self.msCrypto.getRandomValues(arr);
      return arr;
    };

  // Safari's WebWorkers do not have `crypto`
  } else if (typeof window === 'object') {
    // Old junk
    Rand.prototype._rand = function() {
      throw new Error('Not implemented yet');
    };
  }
} else {
  // Node.js or Web worker with no crypto support
  try {
    var crypto = require('crypto');
    if (typeof crypto.randomBytes !== 'function')
      throw new Error('Not supported');

    Rand.prototype._rand = function _rand(n) {
      return crypto.randomBytes(n);
    };
  } catch (e) {
  }
}

},{"crypto":54}],54:[function(require,module,exports){

},{}],55:[function(require,module,exports){
// based on the aes implimentation in triple sec
// https://github.com/keybase/triplesec
// which is in turn based on the one from crypto-js
// https://code.google.com/p/crypto-js/

var Buffer = require('safe-buffer').Buffer

function asUInt32Array (buf) {
  if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)

  var len = (buf.length / 4) | 0
  var out = new Array(len)

  for (var i = 0; i < len; i++) {
    out[i] = buf.readUInt32BE(i * 4)
  }

  return out
}

function scrubVec (v) {
  for (var i = 0; i < v.length; v++) {
    v[i] = 0
  }
}

function cryptBlock (M, keySchedule, SUB_MIX, SBOX, nRounds) {
  var SUB_MIX0 = SUB_MIX[0]
  var SUB_MIX1 = SUB_MIX[1]
  var SUB_MIX2 = SUB_MIX[2]
  var SUB_MIX3 = SUB_MIX[3]

  var s0 = M[0] ^ keySchedule[0]
  var s1 = M[1] ^ keySchedule[1]
  var s2 = M[2] ^ keySchedule[2]
  var s3 = M[3] ^ keySchedule[3]
  var t0, t1, t2, t3
  var ksRow = 4

  for (var round = 1; round < nRounds; round++) {
    t0 = SUB_MIX0[s0 >>> 24] ^ SUB_MIX1[(s1 >>> 16) & 0xff] ^ SUB_MIX2[(s2 >>> 8) & 0xff] ^ SUB_MIX3[s3 & 0xff] ^ keySchedule[ksRow++]
    t1 = SUB_MIX0[s1 >>> 24] ^ SUB_MIX1[(s2 >>> 16) & 0xff] ^ SUB_MIX2[(s3 >>> 8) & 0xff] ^ SUB_MIX3[s0 & 0xff] ^ keySchedule[ksRow++]
    t2 = SUB_MIX0[s2 >>> 24] ^ SUB_MIX1[(s3 >>> 16) & 0xff] ^ SUB_MIX2[(s0 >>> 8) & 0xff] ^ SUB_MIX3[s1 & 0xff] ^ keySchedule[ksRow++]
    t3 = SUB_MIX0[s3 >>> 24] ^ SUB_MIX1[(s0 >>> 16) & 0xff] ^ SUB_MIX2[(s1 >>> 8) & 0xff] ^ SUB_MIX3[s2 & 0xff] ^ keySchedule[ksRow++]
    s0 = t0
    s1 = t1
    s2 = t2
    s3 = t3
  }

  t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]
  t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]
  t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]
  t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]
  t0 = t0 >>> 0
  t1 = t1 >>> 0
  t2 = t2 >>> 0
  t3 = t3 >>> 0

  return [t0, t1, t2, t3]
}

// AES constants
var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]
var G = (function () {
  // Compute double table
  var d = new Array(256)
  for (var j = 0; j < 256; j++) {
    if (j < 128) {
      d[j] = j << 1
    } else {
      d[j] = (j << 1) ^ 0x11b
    }
  }

  var SBOX = []
  var INV_SBOX = []
  var SUB_MIX = [[], [], [], []]
  var INV_SUB_MIX = [[], [], [], []]

  // Walk GF(2^8)
  var x = 0
  var xi = 0
  for (var i = 0; i < 256; ++i) {
    // Compute sbox
    var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4)
    sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63
    SBOX[x] = sx
    INV_SBOX[sx] = x

    // Compute multiplication
    var x2 = d[x]
    var x4 = d[x2]
    var x8 = d[x4]

    // Compute sub bytes, mix columns tables
    var t = (d[sx] * 0x101) ^ (sx * 0x1010100)
    SUB_MIX[0][x] = (t << 24) | (t >>> 8)
    SUB_MIX[1][x] = (t << 16) | (t >>> 16)
    SUB_MIX[2][x] = (t << 8) | (t >>> 24)
    SUB_MIX[3][x] = t

    // Compute inv sub bytes, inv mix columns tables
    t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100)
    INV_SUB_MIX[0][sx] = (t << 24) | (t >>> 8)
    INV_SUB_MIX[1][sx] = (t << 16) | (t >>> 16)
    INV_SUB_MIX[2][sx] = (t << 8) | (t >>> 24)
    INV_SUB_MIX[3][sx] = t

    if (x === 0) {
      x = xi = 1
    } else {
      x = x2 ^ d[d[d[x8 ^ x2]]]
      xi ^= d[d[xi]]
    }
  }

  return {
    SBOX: SBOX,
    INV_SBOX: INV_SBOX,
    SUB_MIX: SUB_MIX,
    INV_SUB_MIX: INV_SUB_MIX
  }
})()

function AES (key) {
  this._key = asUInt32Array(key)
  this._reset()
}

AES.blockSize = 4 * 4
AES.keySize = 256 / 8
AES.prototype.blockSize = AES.blockSize
AES.prototype.keySize = AES.keySize
AES.prototype._reset = function () {
  var keyWords = this._key
  var keySize = keyWords.length
  var nRounds = keySize + 6
  var ksRows = (nRounds + 1) * 4

  var keySchedule = []
  for (var k = 0; k < keySize; k++) {
    keySchedule[k] = keyWords[k]
  }

  for (k = keySize; k < ksRows; k++) {
    var t = keySchedule[k - 1]

    if (k % keySize === 0) {
      t = (t << 8) | (t >>> 24)
      t =
        (G.SBOX[t >>> 24] << 24) |
        (G.SBOX[(t >>> 16) & 0xff] << 16) |
        (G.SBOX[(t >>> 8) & 0xff] << 8) |
        (G.SBOX[t & 0xff])

      t ^= RCON[(k / keySize) | 0] << 24
    } else if (keySize > 6 && k % keySize === 4) {
      t =
        (G.SBOX[t >>> 24] << 24) |
        (G.SBOX[(t >>> 16) & 0xff] << 16) |
        (G.SBOX[(t >>> 8) & 0xff] << 8) |
        (G.SBOX[t & 0xff])
    }

    keySchedule[k] = keySchedule[k - keySize] ^ t
  }

  var invKeySchedule = []
  for (var ik = 0; ik < ksRows; ik++) {
    var ksR = ksRows - ik
    var tt = keySchedule[ksR - (ik % 4 ? 0 : 4)]

    if (ik < 4 || ksR <= 4) {
      invKeySchedule[ik] = tt
    } else {
      invKeySchedule[ik] =
        G.INV_SUB_MIX[0][G.SBOX[tt >>> 24]] ^
        G.INV_SUB_MIX[1][G.SBOX[(tt >>> 16) & 0xff]] ^
        G.INV_SUB_MIX[2][G.SBOX[(tt >>> 8) & 0xff]] ^
        G.INV_SUB_MIX[3][G.SBOX[tt & 0xff]]
    }
  }

  this._nRounds = nRounds
  this._keySchedule = keySchedule
  this._invKeySchedule = invKeySchedule
}

AES.prototype.encryptBlockRaw = function (M) {
  M = asUInt32Array(M)
  return cryptBlock(M, this._keySchedule, G.SUB_MIX, G.SBOX, this._nRounds)
}

AES.prototype.encryptBlock = function (M) {
  var out = this.encryptBlockRaw(M)
  var buf = Buffer.allocUnsafe(16)
  buf.writeUInt32BE(out[0], 0)
  buf.writeUInt32BE(out[1], 4)
  buf.writeUInt32BE(out[2], 8)
  buf.writeUInt32BE(out[3], 12)
  return buf
}

AES.prototype.decryptBlock = function (M) {
  M = asUInt32Array(M)

  // swap
  var m1 = M[1]
  M[1] = M[3]
  M[3] = m1

  var out = cryptBlock(M, this._invKeySchedule, G.INV_SUB_MIX, G.INV_SBOX, this._nRounds)
  var buf = Buffer.allocUnsafe(16)
  buf.writeUInt32BE(out[0], 0)
  buf.writeUInt32BE(out[3], 4)
  buf.writeUInt32BE(out[2], 8)
  buf.writeUInt32BE(out[1], 12)
  return buf
}

AES.prototype.scrub = function () {
  scrubVec(this._keySchedule)
  scrubVec(this._invKeySchedule)
  scrubVec(this._key)
}

module.exports.AES = AES

},{"safe-buffer":513}],56:[function(require,module,exports){
var aes = require('./aes')
var Buffer = require('safe-buffer').Buffer
var Transform = require('cipher-base')
var inherits = require('inherits')
var GHASH = require('./ghash')
var xor = require('buffer-xor')
var incr32 = require('./incr32')

function xorTest (a, b) {
  var out = 0
  if (a.length !== b.length) out++

  var len = Math.min(a.length, b.length)
  for (var i = 0; i < len; ++i) {
    out += (a[i] ^ b[i])
  }

  return out
}

function calcIv (self, iv, ck) {
  if (iv.length === 12) {
    self._finID = Buffer.concat([iv, Buffer.from([0, 0, 0, 1])])
    return Buffer.concat([iv, Buffer.from([0, 0, 0, 2])])
  }
  var ghash = new GHASH(ck)
  var len = iv.length
  var toPad = len % 16
  ghash.update(iv)
  if (toPad) {
    toPad = 16 - toPad
    ghash.update(Buffer.alloc(toPad, 0))
  }
  ghash.update(Buffer.alloc(8, 0))
  var ivBits = len * 8
  var tail = Buffer.alloc(8)
  tail.writeUIntBE(ivBits, 0, 8)
  ghash.update(tail)
  self._finID = ghash.state
  var out = Buffer.from(self._finID)
  incr32(out)
  return out
}
function StreamCipher (mode, key, iv, decrypt) {
  Transform.call(this)

  var h = Buffer.alloc(4, 0)

  this._cipher = new aes.AES(key)
  var ck = this._cipher.encryptBlock(h)
  this._ghash = new GHASH(ck)
  iv = calcIv(this, iv, ck)

  this._prev = Buffer.from(iv)
  this._cache = Buffer.allocUnsafe(0)
  this._secCache = Buffer.allocUnsafe(0)
  this._decrypt = decrypt
  this._alen = 0
  this._len = 0
  this._mode = mode

  this._authTag = null
  this._called = false
}

inherits(StreamCipher, Transform)

StreamCipher.prototype._update = function (chunk) {
  if (!this._called && this._alen) {
    var rump = 16 - (this._alen % 16)
    if (rump < 16) {
      rump = Buffer.alloc(rump, 0)
      this._ghash.update(rump)
    }
  }

  this._called = true
  var out = this._mode.encrypt(this, chunk)
  if (this._decrypt) {
    this._ghash.update(chunk)
  } else {
    this._ghash.update(out)
  }
  this._len += chunk.length
  return out
}

StreamCipher.prototype._final = function () {
  if (this._decrypt && !this._authTag) throw new Error('Unsupported state or unable to authenticate data')

  var tag = xor(this._ghash.final(this._alen * 8, this._len * 8), this._cipher.encryptBlock(this._finID))
  if (this._decrypt && xorTest(tag, this._authTag)) throw new Error('Unsupported state or unable to authenticate data')

  this._authTag = tag
  this._cipher.scrub()
}

StreamCipher.prototype.getAuthTag = function getAuthTag () {
  if (this._decrypt || !Buffer.isBuffer(this._authTag)) throw new Error('Attempting to get auth tag in unsupported state')

  return this._authTag
}

StreamCipher.prototype.setAuthTag = function setAuthTag (tag) {
  if (!this._decrypt) throw new Error('Attempting to set auth tag in unsupported state')

  this._authTag = tag
}

StreamCipher.prototype.setAAD = function setAAD (buf) {
  if (this._called) throw new Error('Attempting to set AAD in unsupported state')

  this._ghash.update(buf)
  this._alen += buf.length
}

module.exports = StreamCipher

},{"./aes":55,"./ghash":60,"./incr32":61,"buffer-xor":82,"cipher-base":92,"inherits":219,"safe-buffer":513}],57:[function(require,module,exports){
var ciphers = require('./encrypter')
var deciphers = require('./decrypter')
var modes = require('./modes/list.json')

function getCiphers () {
  return Object.keys(modes)
}

exports.createCipher = exports.Cipher = ciphers.createCipher
exports.createCipheriv = exports.Cipheriv = ciphers.createCipheriv
exports.createDecipher = exports.Decipher = deciphers.createDecipher
exports.createDecipheriv = exports.Decipheriv = deciphers.createDecipheriv
exports.listCiphers = exports.getCiphers = getCiphers

},{"./decrypter":58,"./encrypter":59,"./modes/list.json":69}],58:[function(require,module,exports){
var AuthCipher = require('./authCipher')
var Buffer = require('safe-buffer').Buffer
var MODES = require('./modes')
var StreamCipher = require('./streamCipher')
var Transform = require('cipher-base')
var aes = require('./aes')
var ebtk = require('evp_bytestokey')
var inherits = require('inherits')

function Decipher (mode, key, iv) {
  Transform.call(this)

  this._cache = new Splitter()
  this._last = void 0
  this._cipher = new aes.AES(key)
  this._prev = Buffer.from(iv)
  this._mode = mode
  this._autopadding = true
}

inherits(Decipher, Transform)

Decipher.prototype._update = function (data) {
  this._cache.add(data)
  var chunk
  var thing
  var out = []
  while ((chunk = this._cache.get(this._autopadding))) {
    thing = this._mode.decrypt(this, chunk)
    out.push(thing)
  }
  return Buffer.concat(out)
}

Decipher.prototype._final = function () {
  var chunk = this._cache.flush()
  if (this._autopadding) {
    return unpad(this._mode.decrypt(this, chunk))
  } else if (chunk) {
    throw new Error('data not multiple of block length')
  }
}

Decipher.prototype.setAutoPadding = function (setTo) {
  this._autopadding = !!setTo
  return this
}

function Splitter () {
  this.cache = Buffer.allocUnsafe(0)
}

Splitter.prototype.add = function (data) {
  this.cache = Buffer.concat([this.cache, data])
}

Splitter.prototype.get = function (autoPadding) {
  var out
  if (autoPadding) {
    if (this.cache.length > 16) {
      out = this.cache.slice(0, 16)
      this.cache = this.cache.slice(16)
      return out
    }
  } else {
    if (this.cache.length >= 16) {
      out = this.cache.slice(0, 16)
      this.cache = this.cache.slice(16)
      return out
    }
  }

  return null
}

Splitter.prototype.flush = function () {
  if (this.cache.length) return this.cache
}

function unpad (last) {
  var padded = last[15]
  if (padded < 1 || padded > 16) {
    throw new Error('unable to decrypt data')
  }
  var i = -1
  while (++i < padded) {
    if (last[(i + (16 - padded))] !== padded) {
      throw new Error('unable to decrypt data')
    }
  }
  if (padded === 16) return

  return last.slice(0, 16 - padded)
}

function createDecipheriv (suite, password, iv) {
  var config = MODES[suite.toLowerCase()]
  if (!config) throw new TypeError('invalid suite type')

  if (typeof iv === 'string') iv = Buffer.from(iv)
  if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length)

  if (typeof password === 'string') password = Buffer.from(password)
  if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length)

  if (config.type === 'stream') {
    return new StreamCipher(config.module, password, iv, true)
  } else if (config.type === 'auth') {
    return new AuthCipher(config.module, password, iv, true)
  }

  return new Decipher(config.module, password, iv)
}

function createDecipher (suite, password) {
  var config = MODES[suite.toLowerCase()]
  if (!config) throw new TypeError('invalid suite type')

  var keys = ebtk(password, false, config.key, config.iv)
  return createDecipheriv(suite, keys.key, keys.iv)
}

exports.createDecipher = createDecipher
exports.createDecipheriv = createDecipheriv

},{"./aes":55,"./authCipher":56,"./modes":68,"./streamCipher":71,"cipher-base":92,"evp_bytestokey":189,"inherits":219,"safe-buffer":513}],59:[function(require,module,exports){
var MODES = require('./modes')
var AuthCipher = require('./authCipher')
var Buffer = require('safe-buffer').Buffer
var StreamCipher = require('./streamCipher')
var Transform = require('cipher-base')
var aes = require('./aes')
var ebtk = require('evp_bytestokey')
var inherits = require('inherits')

function Cipher (mode, key, iv) {
  Transform.call(this)

  this._cache = new Splitter()
  this._cipher = new aes.AES(key)
  this._prev = Buffer.from(iv)
  this._mode = mode
  this._autopadding = true
}

inherits(Cipher, Transform)

Cipher.prototype._update = function (data) {
  this._cache.add(data)
  var chunk
  var thing
  var out = []

  while ((chunk = this._cache.get())) {
    thing = this._mode.encrypt(this, chunk)
    out.push(thing)
  }

  return Buffer.concat(out)
}

var PADDING = Buffer.alloc(16, 0x10)

Cipher.prototype._final = function () {
  var chunk = this._cache.flush()
  if (this._autopadding) {
    chunk = this._mode.encrypt(this, chunk)
    this._cipher.scrub()
    return chunk
  }

  if (!chunk.equals(PADDING)) {
    this._cipher.scrub()
    throw new Error('data not multiple of block length')
  }
}

Cipher.prototype.setAutoPadding = function (setTo) {
  this._autopadding = !!setTo
  return this
}

function Splitter () {
  this.cache = Buffer.allocUnsafe(0)
}

Splitter.prototype.add = function (data) {
  this.cache = Buffer.concat([this.cache, data])
}

Splitter.prototype.get = function () {
  if (this.cache.length > 15) {
    var out = this.cache.slice(0, 16)
    this.cache = this.cache.slice(16)
    return out
  }
  return null
}

Splitter.prototype.flush = function () {
  var len = 16 - this.cache.length
  var padBuff = Buffer.allocUnsafe(len)

  var i = -1
  while (++i < len) {
    padBuff.writeUInt8(len, i)
  }

  return Buffer.concat([this.cache, padBuff])
}

function createCipheriv (suite, password, iv) {
  var config = MODES[suite.toLowerCase()]
  if (!config) throw new TypeError('invalid suite type')

  if (typeof password === 'string') password = Buffer.from(password)
  if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length)

  if (typeof iv === 'string') iv = Buffer.from(iv)
  if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length)

  if (config.type === 'stream') {
    return new StreamCipher(config.module, password, iv)
  } else if (config.type === 'auth') {
    return new AuthCipher(config.module, password, iv)
  }

  return new Cipher(config.module, password, iv)
}

function createCipher (suite, password) {
  var config = MODES[suite.toLowerCase()]
  if (!config) throw new TypeError('invalid suite type')

  var keys = ebtk(password, false, config.key, config.iv)
  return createCipheriv(suite, keys.key, keys.iv)
}

exports.createCipheriv = createCipheriv
exports.createCipher = createCipher

},{"./aes":55,"./authCipher":56,"./modes":68,"./streamCipher":71,"cipher-base":92,"evp_bytestokey":189,"inherits":219,"safe-buffer":513}],60:[function(require,module,exports){
var Buffer = require('safe-buffer').Buffer
var ZEROES = Buffer.alloc(16, 0)

function toArray (buf) {
  return [
    buf.readUInt32BE(0),
    buf.readUInt32BE(4),
    buf.readUInt32BE(8),
    buf.readUInt32BE(12)
  ]
}

function fromArray (out) {
  var buf = Buffer.allocUnsafe(16)
  buf.writeUInt32BE(out[0] >>> 0, 0)
  buf.writeUInt32BE(out[1] >>> 0, 4)
  buf.writeUInt32BE(out[2] >>> 0, 8)
  buf.writeUInt32BE(out[3] >>> 0, 12)
  return buf
}

function GHASH (key) {
  this.h = key
  this.state = Buffer.alloc(16, 0)
  this.cache = Buffer.allocUnsafe(0)
}

// from http://bitwiseshiftleft.github.io/sjcl/doc/symbols/src/core_gcm.js.html
// by Juho Vähä-Herttua
GHASH.prototype.ghash = function (block) {
  var i = -1
  while (++i < block.length) {
    this.state[i] ^= block[i]
  }
  this._multiply()
}

GHASH.prototype._multiply = function () {
  var Vi = toArray(this.h)
  var Zi = [0, 0, 0, 0]
  var j, xi, lsbVi
  var i = -1
  while (++i < 128) {
    xi = (this.state[~~(i / 8)] & (1 << (7 - (i % 8)))) !== 0
    if (xi) {
      // Z_i+1 = Z_i ^ V_i
      Zi[0] ^= Vi[0]
      Zi[1] ^= Vi[1]
      Zi[2] ^= Vi[2]
      Zi[3] ^= Vi[3]
    }

    // Store the value of LSB(V_i)
    lsbVi = (Vi[3] & 1) !== 0

    // V_i+1 = V_i >> 1
    for (j = 3; j > 0; j--) {
      Vi[j] = (Vi[j] >>> 1) | ((Vi[j - 1] & 1) << 31)
    }
    Vi[0] = Vi[0] >>> 1

    // If LSB(V_i) is 1, V_i+1 = (V_i >> 1) ^ R
    if (lsbVi) {
      Vi[0] = Vi[0] ^ (0xe1 << 24)
    }
  }
  this.state = fromArray(Zi)
}

GHASH.prototype.update = function (buf) {
  this.cache = Buffer.concat([this.cache, buf])
  var chunk
  while (this.cache.length >= 16) {
    chunk = this.cache.slice(0, 16)
    this.cache = this.cache.slice(16)
    this.ghash(chunk)
  }
}

GHASH.prototype.final = function (abl, bl) {
  if (this.cache.length) {
    this.ghash(Buffer.concat([this.cache, ZEROES], 16))
  }

  this.ghash(fromArray([0, abl, 0, bl]))
  return this.state
}

module.exports = GHASH

},{"safe-buffer":513}],61:[function(require,module,exports){
function incr32 (iv) {
  var len = iv.length
  var item
  while (len--) {
    item = iv.readUInt8(len)
    if (item === 255) {
      iv.writeUInt8(0, len)
    } else {
      item++
      iv.writeUInt8(item, len)
      break
    }
  }
}
module.exports = incr32

},{}],62:[function(require,module,exports){
var xor = require('buffer-xor')

exports.encrypt = function (self, block) {
  var data = xor(block, self._prev)

  self._prev = self._cipher.encryptBlock(data)
  return self._prev
}

exports.decrypt = function (self, block) {
  var pad = self._prev

  self._prev = block
  var out = self._cipher.decryptBlock(block)

  return xor(out, pad)
}

},{"buffer-xor":82}],63:[function(require,module,exports){
var Buffer = require('safe-buffer').Buffer
var xor = require('buffer-xor')

function encryptStart (self, data, decrypt) {
  var len = data.length
  var out = xor(data, self._cache)
  self._cache = self._cache.slice(len)
  self._prev = Buffer.concat([self._prev, decrypt ? data : out])
  return out
}

exports.encrypt = function (self, data, decrypt) {
  var out = Buffer.allocUnsafe(0)
  var len

  while (data.length) {
    if (self._cache.length === 0) {
      self._cache = self._cipher.encryptBlock(self._prev)
      self._prev = Buffer.allocUnsafe(0)
    }

    if (self._cache.length <= data.length) {
      len = self._cache.length
      out = Buffer.concat([out, encryptStart(self, data.slice(0, len), decrypt)])
      data = data.slice(len)
    } else {
      out = Buffer.concat([out, encryptStart(self, data, decrypt)])
      break
    }
  }

  return out
}

},{"buffer-xor":82,"safe-buffer":513}],64:[function(require,module,exports){
var Buffer = require('safe-buffer').Buffer

function encryptByte (self, byteParam, decrypt) {
  var pad
  var i = -1
  var len = 8
  var out = 0
  var bit, value
  while (++i < len) {
    pad = self._cipher.encryptBlock(self._prev)
    bit = (byteParam & (1 << (7 - i))) ? 0x80 : 0
    value = pad[0] ^ bit
    out += ((value & 0x80) >> (i % 8))
    self._prev = shiftIn(self._prev, decrypt ? bit : value)
  }
  return out
}

function shiftIn (buffer, value) {
  var len = buffer.length
  var i = -1
  var out = Buffer.allocUnsafe(buffer.length)
  buffer = Buffer.concat([buffer, Buffer.from([value])])

  while (++i < len) {
    out[i] = buffer[i] << 1 | buffer[i + 1] >> (7)
  }

  return out
}

exports.encrypt = function (self, chunk, decrypt) {
  var len = chunk.length
  var out = Buffer.allocUnsafe(len)
  var i = -1

  while (++i < len) {
    out[i] = encryptByte(self, chunk[i], decrypt)
  }

  return out
}

},{"safe-buffer":513}],65:[function(require,module,exports){
var Buffer = require('safe-buffer').Buffer

function encryptByte (self, byteParam, decrypt) {
  var pad = self._cipher.encryptBlock(self._prev)
  var out = pad[0] ^ byteParam

  self._prev = Buffer.concat([
    self._prev.slice(1),
    Buffer.from([decrypt ? byteParam : out])
  ])

  return out
}

exports.encrypt = function (self, chunk, decrypt) {
  var len = chunk.length
  var out = Buffer.allocUnsafe(len)
  var i = -1

  while (++i < len) {
    out[i] = encryptByte(self, chunk[i], decrypt)
  }

  return out
}

},{"safe-buffer":513}],66:[function(require,module,exports){
var xor = require('buffer-xor')
var Buffer = require('safe-buffer').Buffer
var incr32 = require('../incr32')

function getBlock (self) {
  var out = self._cipher.encryptBlockRaw(self._prev)
  incr32(self._prev)
  return out
}

var blockSize = 16
exports.encrypt = function (self, chunk) {
  var chunkNum = Math.ceil(chunk.length / blockSize)
  var start = self._cache.length
  self._cache = Buffer.concat([
    self._cache,
    Buffer.allocUnsafe(chunkNum * blockSize)
  ])
  for (var i = 0; i < chunkNum; i++) {
    var out = getBlock(self)
    var offset = start + i * blockSize
    self._cache.writeUInt32BE(out[0], offset + 0)
    self._cache.writeUInt32BE(out[1], offset + 4)
    self._cache.writeUInt32BE(out[2], offset + 8)
    self._cache.writeUInt32BE(out[3], offset + 12)
  }
  var pad = self._cache.slice(0, chunk.length)
  self._cache = self._cache.slice(chunk.length)
  return xor(chunk, pad)
}

},{"../incr32":61,"buffer-xor":82,"safe-buffer":513}],67:[function(require,module,exports){
exports.encrypt = function (self, block) {
  return self._cipher.encryptBlock(block)
}

exports.decrypt = function (self, block) {
  return self._cipher.decryptBlock(block)
}

},{}],68:[function(require,module,exports){
var modeModules = {
  ECB: require('./ecb'),
  CBC: require('./cbc'),
  CFB: require('./cfb'),
  CFB8: require('./cfb8'),
  CFB1: require('./cfb1'),
  OFB: require('./ofb'),
  CTR: require('./ctr'),
  GCM: require('./ctr')
}

var modes = require('./list.json')

for (var key in modes) {
  modes[key].module = modeModules[modes[key].mode]
}

module.exports = modes

},{"./cbc":62,"./cfb":63,"./cfb1":64,"./cfb8":65,"./ctr":66,"./ecb":67,"./list.json":69,"./ofb":70}],69:[function(require,module,exports){
module.exports={
  "aes-128-ecb": {
    "cipher": "AES",
    "key": 128,
    "iv": 0,
    "mode": "ECB",
    "type": "block"
  },
  "aes-192-ecb": {
    "cipher": "AES",
    "key": 192,
    "iv": 0,
    "mode": "ECB",
    "type": "block"
  },
  "aes-256-ecb": {
    "cipher": "AES",
    "key": 256,
    "iv": 0,
    "mode": "ECB",
    "type": "block"
  },
  "aes-128-cbc": {
    "cipher": "AES",
    "key": 128,
    "iv": 16,
    "mode": "CBC",
    "type": "block"
  },
  "aes-192-cbc": {
    "cipher": "AES",
    "key": 192,
    "iv": 16,
    "mode": "CBC",
    "type": "block"
  },
  "aes-256-cbc": {
    "cipher": "AES",
    "key": 256,
    "iv": 16,
    "mode": "CBC",
    "type": "block"
  },
  "aes128": {
    "cipher": "AES",
    "key": 128,
    "iv": 16,
    "mode": "CBC",
    "type": "block"
  },
  "aes192": {
    "cipher": "AES",
    "key": 192,
    "iv": 16,
    "mode": "CBC",
    "type": "block"
  },
  "aes256": {
    "cipher": "AES",
    "key": 256,
    "iv": 16,
    "mode": "CBC",
    "type": "block"
  },
  "aes-128-cfb": {
    "cipher": "AES",
    "key": 128,
    "iv": 16,
    "mode": "CFB",
    "type": "stream"
  },
  "aes-192-cfb": {
    "cipher": "AES",
    "key": 192,
    "iv": 16,
    "mode": "CFB",
    "type": "stream"
  },
  "aes-256-cfb": {
    "cipher": "AES",
    "key": 256,
    "iv": 16,
    "mode": "CFB",
    "type": "stream"
  },
  "aes-128-cfb8": {
    "cipher": "AES",
    "key": 128,
    "iv": 16,
    "mode": "CFB8",
    "type": "stream"
  },
  "aes-192-cfb8": {
    "cipher": "AES",
    "key": 192,
    "iv": 16,
    "mode": "CFB8",
    "type": "stream"
  },
  "aes-256-cfb8": {
    "cipher": "AES",
    "key": 256,
    "iv": 16,
    "mode": "CFB8",
    "type": "stream"
  },
  "aes-128-cfb1": {
    "cipher": "AES",
    "key": 128,
    "iv": 16,
    "mode": "CFB1",
    "type": "stream"
  },
  "aes-192-cfb1": {
    "cipher": "AES",
    "key": 192,
    "iv": 16,
    "mode": "CFB1",
    "type": "stream"
  },
  "aes-256-cfb1": {
    "cipher": "AES",
    "key": 256,
    "iv": 16,
    "mode": "CFB1",
    "type": "stream"
  },
  "aes-128-ofb": {
    "cipher": "AES",
    "key": 128,
    "iv": 16,
    "mode": "OFB",
    "type": "stream"
  },
  "aes-192-ofb": {
    "cipher": "AES",
    "key": 192,
    "iv": 16,
    "mode": "OFB",
    "type": "stream"
  },
  "aes-256-ofb": {
    "cipher": "AES",
    "key": 256,
    "iv": 16,
    "mode": "OFB",
    "type": "stream"
  },
  "aes-128-ctr": {
    "cipher": "AES",
    "key": 128,
    "iv": 16,
    "mode": "CTR",
    "type": "stream"
  },
  "aes-192-ctr": {
    "cipher": "AES",
    "key": 192,
    "iv": 16,
    "mode": "CTR",
    "type": "stream"
  },
  "aes-256-ctr": {
    "cipher": "AES",
    "key": 256,
    "iv": 16,
    "mode": "CTR",
    "type": "stream"
  },
  "aes-128-gcm": {
    "cipher": "AES",
    "key": 128,
    "iv": 12,
    "mode": "GCM",
    "type": "auth"
  },
  "aes-192-gcm": {
    "cipher": "AES",
    "key": 192,
    "iv": 12,
    "mode": "GCM",
    "type": "auth"
  },
  "aes-256-gcm": {
    "cipher": "AES",
    "key": 256,
    "iv": 12,
    "mode": "GCM",
    "type": "auth"
  }
}

},{}],70:[function(require,module,exports){
(function (Buffer){(function (){
var xor = require('buffer-xor')

function getBlock (self) {
  self._prev = self._cipher.encryptBlock(self._prev)
  return self._prev
}

exports.encrypt = function (self, chunk) {
  while (self._cache.length < chunk.length) {
    self._cache = Buffer.concat([self._cache, getBlock(self)])
  }

  var pad = self._cache.slice(0, chunk.length)
  self._cache = self._cache.slice(chunk.length)
  return xor(chunk, pad)
}

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":83,"buffer-xor":82}],71:[function(require,module,exports){
var aes = require('./aes')
var Buffer = require('safe-buffer').Buffer
var Transform = require('cipher-base')
var inherits = require('inherits')

function StreamCipher (mode, key, iv, decrypt) {
  Transform.call(this)

  this._cipher = new aes.AES(key)
  this._prev = Buffer.from(iv)
  this._cache = Buffer.allocUnsafe(0)
  this._secCache = Buffer.allocUnsafe(0)
  this._decrypt = decrypt
  this._mode = mode
}

inherits(StreamCipher, Transform)

StreamCipher.prototype._update = function (chunk) {
  return this._mode.encrypt(this, chunk, this._decrypt)
}

StreamCipher.prototype._final = function () {
  this._cipher.scrub()
}

module.exports = StreamCipher

},{"./aes":55,"cipher-base":92,"inherits":219,"safe-buffer":513}],72:[function(require,module,exports){
var DES = require('browserify-des')
var aes = require('browserify-aes/browser')
var aesModes = require('browserify-aes/modes')
var desModes = require('browserify-des/modes')
var ebtk = require('evp_bytestokey')

function createCipher (suite, password) {
  suite = suite.toLowerCase()

  var keyLen, ivLen
  if (aesModes[suite]) {
    keyLen = aesModes[suite].key
    ivLen = aesModes[suite].iv
  } else if (desModes[suite]) {
    keyLen = desModes[suite].key * 8
    ivLen = desModes[suite].iv
  } else {
    throw new TypeError('invalid suite type')
  }

  var keys = ebtk(password, false, keyLen, ivLen)
  return createCipheriv(suite, keys.key, keys.iv)
}

function createDecipher (suite, password) {
  suite = suite.toLowerCase()

  var keyLen, ivLen
  if (aesModes[suite]) {
    keyLen = aesModes[suite].key
    ivLen = aesModes[suite].iv
  } else if (desModes[suite]) {
    keyLen = desModes[suite].key * 8
    ivLen = desModes[suite].iv
  } else {
    throw new TypeError('invalid suite type')
  }

  var keys = ebtk(password, false, keyLen, ivLen)
  return createDecipheriv(suite, keys.key, keys.iv)
}

function createCipheriv (suite, key, iv) {
  suite = suite.toLowerCase()
  if (aesModes[suite]) return aes.createCipheriv(suite, key, iv)
  if (desModes[suite]) return new DES({ key: key, iv: iv, mode: suite })

  throw new TypeError('invalid suite type')
}

function createDecipheriv (suite, key, iv) {
  suite = suite.toLowerCase()
  if (aesModes[suite]) return aes.createDecipheriv(suite, key, iv)
  if (desModes[suite]) return new DES({ key: key, iv: iv, mode: suite, decrypt: true })

  throw new TypeError('invalid suite type')
}

function getCiphers () {
  return Object.keys(desModes).concat(aes.getCiphers())
}

exports.createCipher = exports.Cipher = createCipher
exports.createCipheriv = exports.Cipheriv = createCipheriv
exports.createDecipher = exports.Decipher = createDecipher
exports.createDecipheriv = exports.Decipheriv = createDecipheriv
exports.listCiphers = exports.getCiphers = getCiphers

},{"browserify-aes/browser":57,"browserify-aes/modes":68,"browserify-des":73,"browserify-des/modes":74,"evp_bytestokey":189}],73:[function(require,module,exports){
var CipherBase = require('cipher-base')
var des = require('des.js')
var inherits = require('inherits')
var Buffer = require('safe-buffer').Buffer

var modes = {
  'des-ede3-cbc': des.CBC.instantiate(des.EDE),
  'des-ede3': des.EDE,
  'des-ede-cbc': des.CBC.instantiate(des.EDE),
  'des-ede': des.EDE,
  'des-cbc': des.CBC.instantiate(des.DES),
  'des-ecb': des.DES
}
modes.des = modes['des-cbc']
modes.des3 = modes['des-ede3-cbc']
module.exports = DES
inherits(DES, CipherBase)
function DES (opts) {
  CipherBase.call(this)
  var modeName = opts.mode.toLowerCase()
  var mode = modes[modeName]
  var type
  if (opts.decrypt) {
    type = 'decrypt'
  } else {
    type = 'encrypt'
  }
  var key = opts.key
  if (!Buffer.isBuffer(key)) {
    key = Buffer.from(key)
  }
  if (modeName === 'des-ede' || modeName === 'des-ede-cbc') {
    key = Buffer.concat([key, key.slice(0, 8)])
  }
  var iv = opts.iv
  if (!Buffer.isBuffer(iv)) {
    iv = Buffer.from(iv)
  }
  this._des = mode.create({
    key: key,
    iv: iv,
    type: type
  })
}
DES.prototype._update = function (data) {
  return Buffer.from(this._des.update(data))
}
DES.prototype._final = function () {
  return Buffer.from(this._des.final())
}

},{"cipher-base":92,"des.js":150,"inherits":219,"safe-buffer":513}],74:[function(require,module,exports){
exports['des-ecb'] = {
  key: 8,
  iv: 0
}
exports['des-cbc'] = exports.des = {
  key: 8,
  iv: 8
}
exports['des-ede3-cbc'] = exports.des3 = {
  key: 24,
  iv: 8
}
exports['des-ede3'] = {
  key: 24,
  iv: 0
}
exports['des-ede-cbc'] = {
  key: 16,
  iv: 8
}
exports['des-ede'] = {
  key: 16,
  iv: 0
}

},{}],75:[function(require,module,exports){
(function (Buffer){(function (){
var BN = require('bn.js')
var randomBytes = require('randombytes')

function blind (priv) {
  var r = getr(priv)
  var blinder = r.toRed(BN.mont(priv.modulus)).redPow(new BN(priv.publicExponent)).fromRed()
  return { blinder: blinder, unblinder: r.invm(priv.modulus) }
}

function getr (priv) {
  var len = priv.modulus.byteLength()
  var r
  do {
    r = new BN(randomBytes(len))
  } while (r.cmp(priv.modulus) >= 0 || !r.umod(priv.prime1) || !r.umod(priv.prime2))
  return r
}

function crt (msg, priv) {
  var blinds = blind(priv)
  var len = priv.modulus.byteLength()
  var blinded = new BN(msg).mul(blinds.blinder).umod(priv.modulus)
  var c1 = blinded.toRed(BN.mont(priv.prime1))
  var c2 = blinded.toRed(BN.mont(priv.prime2))
  var qinv = priv.coefficient
  var p = priv.prime1
  var q = priv.prime2
  var m1 = c1.redPow(priv.exponent1).fromRed()
  var m2 = c2.redPow(priv.exponent2).fromRed()
  var h = m1.isub(m2).imul(qinv).umod(p).imul(q)
  return m2.iadd(h).imul(blinds.unblinder).umod(priv.modulus).toArrayLike(Buffer, 'be', len)
}
crt.getr = getr

module.exports = crt

}).call(this)}).call(this,require("buffer").Buffer)
},{"bn.js":52,"buffer":83,"randombytes":273}],76:[function(require,module,exports){
'use strict';

module.exports = require('./browser/algorithms.json');

},{"./browser/algorithms.json":77}],77:[function(require,module,exports){
module.exports={
  "sha224WithRSAEncryption": {
    "sign": "rsa",
    "hash": "sha224",
    "id": "302d300d06096086480165030402040500041c"
  },
  "RSA-SHA224": {
    "sign": "ecdsa/rsa",
    "hash": "sha224",
    "id": "302d300d06096086480165030402040500041c"
  },
  "sha256WithRSAEncryption": {
    "sign": "rsa",
    "hash": "sha256",
    "id": "3031300d060960864801650304020105000420"
  },
  "RSA-SHA256": {
    "sign": "ecdsa/rsa",
    "hash": "sha256",
    "id": "3031300d060960864801650304020105000420"
  },
  "sha384WithRSAEncryption": {
    "sign": "rsa",
    "hash": "sha384",
    "id": "3041300d060960864801650304020205000430"
  },
  "RSA-SHA384": {
    "sign": "ecdsa/rsa",
    "hash": "sha384",
    "id": "3041300d060960864801650304020205000430"
  },
  "sha512WithRSAEncryption": {
    "sign": "rsa",
    "hash": "sha512",
    "id": "3051300d060960864801650304020305000440"
  },
  "RSA-SHA512": {
    "sign": "ecdsa/rsa",
    "hash": "sha512",
    "id": "3051300d060960864801650304020305000440"
  },
  "RSA-SHA1": {
    "sign": "rsa",
    "hash": "sha1",
    "id": "3021300906052b0e03021a05000414"
  },
  "ecdsa-with-SHA1": {
    "sign": "ecdsa",
    "hash": "sha1",
    "id": ""
  },
  "sha256": {
    "sign": "ecdsa",
    "hash": "sha256",
    "id": ""
  },
  "sha224": {
    "sign": "ecdsa",
    "hash": "sha224",
    "id": ""
  },
  "sha384": {
    "sign": "ecdsa",
    "hash": "sha384",
    "id": ""
  },
  "sha512": {
    "sign": "ecdsa",
    "hash": "sha512",
    "id": ""
  },
  "DSA-SHA": {
    "sign": "dsa",
    "hash": "sha1",
    "id": ""
  },
  "DSA-SHA1": {
    "sign": "dsa",
    "hash": "sha1",
    "id": ""
  },
  "DSA": {
    "sign": "dsa",
    "hash": "sha1",
    "id": ""
  },
  "DSA-WITH-SHA224": {
    "sign": "dsa",
    "hash": "sha224",
    "id": ""
  },
  "DSA-SHA224": {
    "sign": "dsa",
    "hash": "sha224",
    "id": ""
  },
  "DSA-WITH-SHA256": {
    "sign": "dsa",
    "hash": "sha256",
    "id": ""
  },
  "DSA-SHA256": {
    "sign": "dsa",
    "hash": "sha256",
    "id": ""
  },
  "DSA-WITH-SHA384": {
    "sign": "dsa",
    "hash": "sha384",
    "id": ""
  },
  "DSA-SHA384": {
    "sign": "dsa",
    "hash": "sha384",
    "id": ""
  },
  "DSA-WITH-SHA512": {
    "sign": "dsa",
    "hash": "sha512",
    "id": ""
  },
  "DSA-SHA512": {
    "sign": "dsa",
    "hash": "sha512",
    "id": ""
  },
  "DSA-RIPEMD160": {
    "sign": "dsa",
    "hash": "rmd160",
    "id": ""
  },
  "ripemd160WithRSA": {
    "sign": "rsa",
    "hash": "rmd160",
    "id": "3021300906052b2403020105000414"
  },
  "RSA-RIPEMD160": {
    "sign": "rsa",
    "hash": "rmd160",
    "id": "3021300906052b2403020105000414"
  },
  "md5WithRSAEncryption": {
    "sign": "rsa",
    "hash": "md5",
    "id": "3020300c06082a864886f70d020505000410"
  },
  "RSA-MD5": {
    "sign": "rsa",
    "hash": "md5",
    "id": "3020300c06082a864886f70d020505000410"
  }
}

},{}],78:[function(require,module,exports){
module.exports={
  "1.3.132.0.10": "secp256k1",
  "1.3.132.0.33": "p224",
  "1.2.840.10045.3.1.1": "p192",
  "1.2.840.10045.3.1.7": "p256",
  "1.3.132.0.34": "p384",
  "1.3.132.0.35": "p521"
}

},{}],79:[function(require,module,exports){
'use strict';

var Buffer = require('safe-buffer').Buffer;
var createHash = require('create-hash');
var stream = require('readable-stream');
var inherits = require('inherits');
var sign = require('./sign');
var verify = require('./verify');

var algorithms = require('./algorithms.json');
Object.keys(algorithms).forEach(function (key) {
  algorithms[key].id = Buffer.from(algorithms[key].id, 'hex');
  algorithms[key.toLowerCase()] = algorithms[key];
});

function Sign(algorithm) {
  stream.Writable.call(this);

  var data = algorithms[algorithm];
  if (!data) { throw new Error('Unknown message digest'); }

  this._hashType = data.hash;
  this._hash = createHash(data.hash);
  this._tag = data.id;
  this._signType = data.sign;
}
inherits(Sign, stream.Writable);

Sign.prototype._write = function _write(data, _, done) {
  this._hash.update(data);
  done();
};

Sign.prototype.update = function update(data, enc) {
  this._hash.update(typeof data === 'string' ? Buffer.from(data, enc) : data);

  return this;
};

Sign.prototype.sign = function signMethod(key, enc) {
  this.end();
  var hash = this._hash.digest();
  var sig = sign(hash, key, this._hashType, this._signType, this._tag);

  return enc ? sig.toString(enc) : sig;
};

function Verify(algorithm) {
  stream.Writable.call(this);

  var data = algorithms[algorithm];
  if (!data) { throw new Error('Unknown message digest'); }

  this._hash = createHash(data.hash);
  this._tag = data.id;
  this._signType = data.sign;
}
inherits(Verify, stream.Writable);

Verify.prototype._write = function _write(data, _, done) {
  this._hash.update(data);
  done();
};

Verify.prototype.update = function update(data, enc) {
  this._hash.update(typeof data === 'string' ? Buffer.from(data, enc) : data);

  return this;
};

Verify.prototype.verify = function verifyMethod(key, sig, enc) {
  var sigBuffer = typeof sig === 'string' ? Buffer.from(sig, enc) : sig;

  this.end();
  var hash = this._hash.digest();
  return verify(sigBuffer, hash, key, this._signType, this._tag);
};

function createSign(algorithm) {
  return new Sign(algorithm);
}

function createVerify(algorithm) {
  return new Verify(algorithm);
}

module.exports = {
  Sign: createSign,
  Verify: createVerify,
  createSign: createSign,
  createVerify: createVerify
};

},{"./algorithms.json":77,"./sign":80,"./verify":81,"create-hash":144,"inherits":219,"readable-stream":285,"safe-buffer":513}],80:[function(require,module,exports){
'use strict';

// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js
var Buffer = require('safe-buffer').Buffer;
var createHmac = require('create-hmac');
var crt = require('browserify-rsa');
var EC = require('elliptic').ec;
var BN = require('bn.js');
var parseKeys = require('parse-asn1');
var curves = require('./curves.json');

var RSA_PKCS1_PADDING = 1;

function sign(hash, key, hashType, signType, tag) {
  var priv = parseKeys(key);
  if (priv.curve) {
    // rsa keys can be interpreted as ecdsa ones in openssl
    if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') { throw new Error('wrong private key type'); }
    return ecSign(hash, priv);
  } else if (priv.type === 'dsa') {
    if (signType !== 'dsa') { throw new Error('wrong private key type'); }
    return dsaSign(hash, priv, hashType);
  }
  if (signType !== 'rsa' && signType !== 'ecdsa/rsa') { throw new Error('wrong private key type'); }
  if (key.padding !== undefined && key.padding !== RSA_PKCS1_PADDING) { throw new Error('illegal or unsupported padding mode'); }

  hash = Buffer.concat([tag, hash]);
  var len = priv.modulus.byteLength();
  var pad = [0, 1];
  while (hash.length + pad.length + 1 < len) { pad.push(0xff); }
  pad.push(0x00);
  var i = -1;
  while (++i < hash.length) { pad.push(hash[i]); }

  var out = crt(pad, priv);
  return out;
}

function ecSign(hash, priv) {
  var curveId = curves[priv.curve.join('.')];
  if (!curveId) { throw new Error('unknown curve ' + priv.curve.join('.')); }

  var curve = new EC(curveId);
  var key = curve.keyFromPrivate(priv.privateKey);
  var out = key.sign(hash);

  return Buffer.from(out.toDER());
}

function dsaSign(hash, priv, algo) {
  var x = priv.params.priv_key;
  var p = priv.params.p;
  var q = priv.params.q;
  var g = priv.params.g;
  var r = new BN(0);
  var k;
  var H = bits2int(hash, q).mod(q);
  var s = false;
  var kv = getKey(x, q, hash, algo);
  while (s === false) {
    k = makeKey(q, kv, algo);
    r = makeR(g, k, p, q);
    s = k.invm(q).imul(H.add(x.mul(r))).mod(q);
    if (s.cmpn(0) === 0) {
      s = false;
      r = new BN(0);
    }
  }
  return toDER(r, s);
}

function toDER(r, s) {
  r = r.toArray();
  s = s.toArray();

  // Pad values
  if (r[0] & 0x80) { r = [0].concat(r); }
  if (s[0] & 0x80) { s = [0].concat(s); }

  var total = r.length + s.length + 4;
  var res = [
    0x30, total, 0x02, r.length
  ];
  res = res.concat(r, [0x02, s.length], s);
  return Buffer.from(res);
}

function getKey(x, q, hash, algo) {
  x = Buffer.from(x.toArray());
  if (x.length < q.byteLength()) {
    var zeros = Buffer.alloc(q.byteLength() - x.length);
    x = Buffer.concat([zeros, x]);
  }
  var hlen = hash.length;
  var hbits = bits2octets(hash, q);
  var v = Buffer.alloc(hlen);
  v.fill(1);
  var k = Buffer.alloc(hlen);
  k = createHmac(algo, k).update(v).update(Buffer.from([0])).update(x).update(hbits).digest();
  v = createHmac(algo, k).update(v).digest();
  k = createHmac(algo, k).update(v).update(Buffer.from([1])).update(x).update(hbits).digest();
  v = createHmac(algo, k).update(v).digest();
  return { k: k, v: v };
}

function bits2int(obits, q) {
  var bits = new BN(obits);
  var shift = (obits.length << 3) - q.bitLength();
  if (shift > 0) { bits.ishrn(shift); }
  return bits;
}

function bits2octets(bits, q) {
  bits = bits2int(bits, q);
  bits = bits.mod(q);
  var out = Buffer.from(bits.toArray());
  if (out.length < q.byteLength()) {
    var zeros = Buffer.alloc(q.byteLength() - out.length);
    out = Buffer.concat([zeros, out]);
  }
  return out;
}

function makeKey(q, kv, algo) {
  var t;
  var k;

  do {
    t = Buffer.alloc(0);

    while (t.length * 8 < q.bitLength()) {
      kv.v = createHmac(algo, kv.k).update(kv.v).digest();
      t = Buffer.concat([t, kv.v]);
    }

    k = bits2int(t, q);
    kv.k = createHmac(algo, kv.k).update(kv.v).update(Buffer.from([0])).digest();
    kv.v = createHmac(algo, kv.k).update(kv.v).digest();
  } while (k.cmp(q) !== -1);

  return k;
}

function makeR(g, k, p, q) {
  return g.toRed(BN.mont(p)).redPow(k).fromRed().mod(q);
}

module.exports = sign;
module.exports.getKey = getKey;
module.exports.makeKey = makeKey;

},{"./curves.json":78,"bn.js":52,"browserify-rsa":75,"create-hmac":146,"elliptic":162,"parse-asn1":241,"safe-buffer":513}],81:[function(require,module,exports){
'use strict';

// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js
var Buffer = require('safe-buffer').Buffer;
var BN = require('bn.js');
var EC = require('elliptic').ec;
var parseKeys = require('parse-asn1');
var curves = require('./curves.json');

function verify(sig, hash, key, signType, tag) {
  var pub = parseKeys(key);
  if (pub.type === 'ec') {
    // rsa keys can be interpreted as ecdsa ones in openssl
    if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') { throw new Error('wrong public key type'); }
    return ecVerify(sig, hash, pub);
  } else if (pub.type === 'dsa') {
    if (signType !== 'dsa') { throw new Error('wrong public key type'); }
    return dsaVerify(sig, hash, pub);
  }
  if (signType !== 'rsa' && signType !== 'ecdsa/rsa') { throw new Error('wrong public key type'); }

  hash = Buffer.concat([tag, hash]);
  var len = pub.modulus.byteLength();
  var pad = [1];
  var padNum = 0;
  while (hash.length + pad.length + 2 < len) {
    pad.push(0xff);
    padNum += 1;
  }
  pad.push(0x00);
  var i = -1;
  while (++i < hash.length) {
    pad.push(hash[i]);
  }
  pad = Buffer.from(pad);
  var red = BN.mont(pub.modulus);
  sig = new BN(sig).toRed(red);

  sig = sig.redPow(new BN(pub.publicExponent));
  sig = Buffer.from(sig.fromRed().toArray());
  var out = padNum < 8 ? 1 : 0;
  len = Math.min(sig.length, pad.length);
  if (sig.length !== pad.length) { out = 1; }

  i = -1;
  while (++i < len) { out |= sig[i] ^ pad[i]; }
  return out === 0;
}

function ecVerify(sig, hash, pub) {
  var curveId = curves[pub.data.algorithm.curve.join('.')];
  if (!curveId) { throw new Error('unknown curve ' + pub.data.algorithm.curve.join('.')); }

  var curve = new EC(curveId);
  var pubkey = pub.data.subjectPrivateKey.data;

  return curve.verify(hash, sig, pubkey);
}

function dsaVerify(sig, hash, pub) {
  var p = pub.data.p;
  var q = pub.data.q;
  var g = pub.data.g;
  var y = pub.data.pub_key;
  var unpacked = parseKeys.signature.decode(sig, 'der');
  var s = unpacked.s;
  var r = unpacked.r;
  checkValue(s, q);
  checkValue(r, q);
  var montp = BN.mont(p);
  var w = s.invm(q);
  var v = g.toRed(montp)
    .redPow(new BN(hash).mul(w).mod(q))
    .fromRed()
    .mul(y.toRed(montp).redPow(r.mul(w).mod(q)).fromRed())
    .mod(p)
    .mod(q);
  return v.cmp(r) === 0;
}

function checkValue(b, q) {
  if (b.cmpn(0) <= 0) { throw new Error('invalid sig'); }
  if (b.cmp(q) >= 0) { throw new Error('invalid sig'); }
}

module.exports = verify;

},{"./curves.json":78,"bn.js":52,"elliptic":162,"parse-asn1":241,"safe-buffer":513}],82:[function(require,module,exports){
(function (Buffer){(function (){
module.exports = function xor (a, b) {
  var length = Math.min(a.length, b.length)
  var buffer = new Buffer(length)

  for (var i = 0; i < length; ++i) {
    buffer[i] = a[i] ^ b[i]
  }

  return buffer
}

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":83}],83:[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":51,"buffer":83,"ieee754":218,"isarray":223}],84:[function(require,module,exports){
'use strict';

var bind = require('function-bind');

var $apply = require('./functionApply');
var $call = require('./functionCall');
var $reflectApply = require('./reflectApply');

/** @type {import('./actualApply')} */
module.exports = $reflectApply || bind.call($call, $apply);

},{"./functionApply":86,"./functionCall":87,"./reflectApply":89,"function-bind":192}],85:[function(require,module,exports){
'use strict';

var bind = require('function-bind');
var $apply = require('./functionApply');
var actualApply = require('./actualApply');

/** @type {import('./applyBind')} */
module.exports = function applyBind() {
	return actualApply(bind, $apply, arguments);
};

},{"./actualApply":84,"./functionApply":86,"function-bind":192}],86:[function(require,module,exports){
'use strict';

/** @type {import('./functionApply')} */
module.exports = Function.prototype.apply;

},{}],87:[function(require,module,exports){
'use strict';

/** @type {import('./functionCall')} */
module.exports = Function.prototype.call;

},{}],88:[function(require,module,exports){
'use strict';

var bind = require('function-bind');
var $TypeError = require('es-errors/type');

var $call = require('./functionCall');
var $actualApply = require('./actualApply');

/** @type {(args: [Function, thisArg?: unknown, ...args: unknown[]]) => Function} TODO FIXME, find a way to use import('.') */
module.exports = function callBindBasic(args) {
	if (args.length < 1 || typeof args[0] !== 'function') {
		throw new $TypeError('a function is required');
	}
	return $actualApply(bind, $call, args);
};

},{"./actualApply":84,"./functionCall":87,"es-errors/type":185,"function-bind":192}],89:[function(require,module,exports){
'use strict';

/** @type {import('./reflectApply')} */
module.exports = typeof Reflect !== 'undefined' && Reflect && Reflect.apply;

},{}],90:[function(require,module,exports){
'use strict';

var setFunctionLength = require('set-function-length');

var $defineProperty = require('es-define-property');

var callBindBasic = require('call-bind-apply-helpers');
var applyBind = require('call-bind-apply-helpers/applyBind');

module.exports = function callBind(originalFunction) {
	var func = callBindBasic(arguments);
	var adjustedLength = originalFunction.length - (arguments.length - 1);
	return setFunctionLength(
		func,
		1 + (adjustedLength > 0 ? adjustedLength : 0),
		true
	);
};

if ($defineProperty) {
	$defineProperty(module.exports, 'apply', { value: applyBind });
} else {
	module.exports.apply = applyBind;
}

},{"call-bind-apply-helpers":88,"call-bind-apply-helpers/applyBind":85,"es-define-property":179,"set-function-length":514}],91:[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBindBasic = require('call-bind-apply-helpers');

/** @type {(thisArg: string, searchString: string, position?: number) => number} */
var $indexOf = callBindBasic([GetIntrinsic('%String.prototype.indexOf%')]);

/** @type {import('.')} */
module.exports = function callBoundIntrinsic(name, allowMissing) {
	/* eslint no-extra-parens: 0 */

	var intrinsic = /** @type {(this: unknown, ...args: unknown[]) => unknown} */ (GetIntrinsic(name, !!allowMissing));
	if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
		return callBindBasic(/** @type {const} */ ([intrinsic]));
	}
	return intrinsic;
};

},{"call-bind-apply-helpers":88,"get-intrinsic":193}],92:[function(require,module,exports){
var Buffer = require('safe-buffer').Buffer
var Transform = require('stream').Transform
var StringDecoder = require('string_decoder').StringDecoder
var inherits = require('inherits')

function CipherBase (hashMode) {
  Transform.call(this)
  this.hashMode = typeof hashMode === 'string'
  if (this.hashMode) {
    this[hashMode] = this._finalOrDigest
  } else {
    this.final = this._finalOrDigest
  }
  if (this._final) {
    this.__final = this._final
    this._final = null
  }
  this._decoder = null
  this._encoding = null
}
inherits(CipherBase, Transform)

CipherBase.prototype.update = function (data, inputEnc, outputEnc) {
  if (typeof data === 'string') {
    data = Buffer.from(data, inputEnc)
  }

  var outData = this._update(data)
  if (this.hashMode) return this

  if (outputEnc) {
    outData = this._toString(outData, outputEnc)
  }

  return outData
}

CipherBase.prototype.setAutoPadding = function () {}
CipherBase.prototype.getAuthTag = function () {
  throw new Error('trying to get auth tag in unsupported state')
}

CipherBase.prototype.setAuthTag = function () {
  throw new Error('trying to set auth tag in unsupported state')
}

CipherBase.prototype.setAAD = function () {
  throw new Error('trying to set aad in unsupported state')
}

CipherBase.prototype._transform = function (data, _, next) {
  var err
  try {
    if (this.hashMode) {
      this._update(data)
    } else {
      this.push(this._update(data))
    }
  } catch (e) {
    err = e
  } finally {
    next(err)
  }
}
CipherBase.prototype._flush = function (done) {
  var err
  try {
    this.push(this.__final())
  } catch (e) {
    err = e
  }

  done(err)
}
CipherBase.prototype._finalOrDigest = function (outputEnc) {
  var outData = this.__final() || Buffer.alloc(0)
  if (outputEnc) {
    outData = this._toString(outData, outputEnc, true)
  }
  return outData
}

CipherBase.prototype._toString = function (value, enc, fin) {
  if (!this._decoder) {
    this._decoder = new StringDecoder(enc)
    this._encoding = enc
  }

  if (this._encoding !== enc) throw new Error('can\'t switch encodings')

  var out = this._decoder.write(value)
  if (fin) {
    out += this._decoder.end()
  }

  return out
}

module.exports = CipherBase

},{"inherits":219,"safe-buffer":513,"stream":523,"string_decoder":538}],93:[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":110,"../ipc-via-protobuf/protobuf-msg":111,"../lib-client/protobuf-type":113,"../protos/bytes.proto":123}],94:[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":103,"../core/id-manager/mailerid-cap-ipc":104,"../core/keyring/keyrings-cap-ipc":105,"../core/storage/storage-cap-ipc":107,"../ipc-via-protobuf/connector":110,"./generic":97,"./log-cap":101}],95:[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.vListVersions = exports.vGetByteSink = exports.updateXAttrs = exports.vGetByteSource = exports.vReadJSON = exports.vReadTxt = exports.vReadBytes = exports.vListXAttrs = exports.vGetXAttr = 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.packFileEvent = packFileEvent;
exports.unpackFileEvent = unpackFileEvent;
exports.versionedReadFlagsFromMsg = versionedReadFlagsFromMsg;
exports.versionedReadFlagsToMsg = versionedReadFlagsToMsg;
exports.xattrToMsg = xattrToMsg;
exports.xattrFromMsg = xattrFromMsg;
exports.optionsToUploadLocalToMsg = optionsToUploadLocalToMsg;
exports.optionsToUploadLocalFromMsg = optionsToUploadLocalFromMsg;
exports.remoteAdoptionOptsToMsg = remoteAdoptionOptsToMsg;
exports.remoteAdoptionOptsFromMsg = remoteAdoptionOptsFromMsg;
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 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),
            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 = {
                status: vsStatus.makeCaller(caller, vsPath),
                updateStatusInfo: vsUpdateStatusInfo.makeCaller(caller, vsPath),
                isRemoteVersionOnDisk: vsIsRemoteVersionOnDisk.makeCaller(caller, vsPath),
                download: vsDownload.makeCaller(caller, vsPath),
                adoptRemote: vsAdoptRemote.makeCaller(caller, vsPath),
            };
            if (file.writable) {
                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),
            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 = {
                status: vsStatus.wrapService(file.v.sync.status),
                updateStatusInfo: vsUpdateStatusInfo.wrapService(file.v.sync.updateStatusInfo),
                isRemoteVersionOnDisk: vsIsRemoteVersionOnDisk.wrapService(file.v.sync.isRemoteVersionOnDisk),
                download: vsDownload.wrapService(file.v.sync.download),
                adoptRemote: vsAdoptRemote.wrapService(file.v.sync.adoptRemote),
            };
            if (file.writable) {
                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) {
    const msg = {
        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),
    };
    return statsMsgType.pack(msg);
}
function unpackStats(buf) {
    const m = statsMsgType.unpack(buf);
    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),
        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)
    };
}
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)
    };
}
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)
    };
}
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 fileEventType = protobuf_type_1.ProtoType.for(file_proto_1.file.FileEventMsg);
function packFileEvent(e) {
    const { type, path } = e;
    switch (type) {
        case 'file-change':
            return fileEventType.pack({
                type, path,
                src: (0, protobuf_msg_1.toVal)(e.src),
                newVersion: (0, protobuf_msg_1.toOptVal)(e.newVersion)
            });
        case 'removed':
            return fileEventType.pack({
                type, path,
                src: (0, protobuf_msg_1.toVal)(e.src)
            });
        case 'remote-change':
            return fileEventType.pack({
                type, path, newVersion: (0, protobuf_msg_1.toOptVal)(e.newVersion)
            });
        case 'remote-removal':
            return fileEventType.pack({
                type, path
            });
        case 'remote-arch-ver-removal':
            return fileEventType.pack({
                type, path, removedArchVer: (0, protobuf_msg_1.toOptVal)(e.removedArchVer)
            });
        case 'remote-version-archival':
            return fileEventType.pack({
                type, path, archivedVersion: (0, protobuf_msg_1.toOptVal)(e.archivedVersion)
            });
        default:
            throw new Error(`Unknown event type ${type}`);
    }
}
function unpackFileEvent(buf) {
    const m = fileEventType.unpack(buf);
    const { type, path } = m;
    switch (type) {
        case 'file-change':
            return {
                type, path,
                src: (0, protobuf_msg_1.valOf)(m.src),
                newVersion: (0, protobuf_msg_1.valOfOptInt)(m.newVersion)
            };
        case 'removed':
            return {
                type, path,
                src: (0, protobuf_msg_1.valOf)(m.src)
            };
        case 'remote-removal':
            return {
                type, path
            };
        case 'remote-change':
            return {
                type, path, newVersion: (0, protobuf_msg_1.intValOf)(m.newVersion)
            };
        case 'remote-arch-ver-removal':
            return {
                type, path, removedArchVer: (0, protobuf_msg_1.intValOf)(m.removedArchVer)
            };
        case 'remote-version-archival':
            return {
                type, path, archivedVersion: (0, protobuf_msg_1.intValOf)(m.archivedVersion)
            };
        default:
            throw new Error(`Unknown event type ${type}`);
    }
}
var watch;
(function (watch) {
    function wrapService(fn) {
        return buf => {
            const s = new rxjs_1.Subject();
            const obs = s.asObservable().pipe((0, operators_1.map)(packFileEvent));
            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)(unpackFileEvent))
                .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 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 vsStatus;
(function (vsStatus) {
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(packSyncStatus);
            return { promise };
        };
    }
    vsStatus.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'status');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(unpackSyncStatus);
    }
    vsStatus.makeCaller = makeCaller;
})(vsStatus || (vsStatus = {}));
Object.freeze(vsStatus);
var vsUpdateStatusInfo;
(function (vsUpdateStatusInfo) {
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(packSyncStatus);
            return { promise };
        };
    }
    vsUpdateStatusInfo.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'updateStatusInfo');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(unpackSyncStatus);
    }
    vsUpdateStatusInfo.makeCaller = makeCaller;
})(vsUpdateStatusInfo || (vsUpdateStatusInfo = {}));
Object.freeze(vsUpdateStatusInfo);
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 vsDownload;
(function (vsDownload) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.FileSyncDownloadRequestBody);
    function wrapService(fn) {
        return buf => {
            const { version } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.fixInt)(version));
            return { promise };
        };
    }
    vsDownload.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'download');
        return version => caller
            .startPromiseCall(path, requestType.pack({ version }));
    }
    vsDownload.makeCaller = makeCaller;
})(vsDownload || (vsDownload = {}));
Object.freeze(vsDownload);
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 vsUpload;
(function (vsUpload) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.FileSyncUploadRequestBody);
    const replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.FileSyncUploadReplyBody);
    function wrapService(fn) {
        return buf => {
            const { opts } = requestType.unpack(buf);
            const promise = fn(optionsToUploadLocalFromMsg(opts))
                .then(uploadedVersion => 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, requestType.pack({
            opts: optionsToUploadLocalToMsg(opts)
        }))
            .then(buf => (0, protobuf_msg_1.valOfOptInt)(replyType.unpack(buf).uploadedVersion));
    }
    vsUpload.makeCaller = makeCaller;
})(vsUpload || (vsUpload = {}));
Object.freeze(vsUpload);
function remoteAdoptionOptsToMsg(opts) {
    if (!opts) {
        return;
    }
    return {
        dropLocalVer: (0, protobuf_msg_1.toOptVal)(opts.dropLocalVer),
        remoteVersion: (0, protobuf_msg_1.toOptVal)(opts.remoteVersion)
    };
}
function remoteAdoptionOptsFromMsg(msg) {
    if (!msg) {
        return;
    }
    return {
        dropLocalVer: (0, protobuf_msg_1.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);
Object.freeze(exports);

}).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
},{"../../../is-buffer/index.js":220,"../ipc-via-protobuf/connector":110,"../ipc-via-protobuf/protobuf-msg":111,"../lib-client/protobuf-type":113,"../lib-common/buffer-utils":115,"../lib-common/exceptions/error":116,"../lib-common/utils-for-observables":121,"../protos/file.proto":125,"./bytes":93,"rxjs":287,"rxjs/operators":512}],96:[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.fsItem = exports.fsMsgType = void 0;
exports.makeFSCaller = makeFSCaller;
exports.exposeFSService = exposeFSService;
exports.optionsToAdoptRemoteItemToMsg = optionsToAdoptRemoteItemToMsg;
exports.optionsToAdoptRemoteItemFromMsg = optionsToAdoptRemoteItemFromMsg;
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),
            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 = {
                status: vsStatus.makeCaller(caller, vsPath),
                updateStatusInfo: vsUpdateStatusInfo.makeCaller(caller, vsPath),
                isRemoteVersionOnDisk: vsIsRemoteVersionOnDisk.makeCaller(caller, vsPath),
                download: vsDownload.makeCaller(caller, vsPath),
                adoptRemote: vsAdoptRemote.makeCaller(caller, vsPath),
                diffCurrentAndRemoteFolderVersions: vsDiffCurrentAndRemoteFolderVersions.makeCaller(caller, vsPath)
            };
            if (fs.writable) {
                fs.v.sync.upload = vsUpload.makeCaller(caller, vsPath);
                fs.v.sync.adoptRemoteFolderItem =
                    vsAdoptRemoteFolderItem.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, packFSEvent),
        watchFile: watch.wrapService(fs.watchFile, file_1.packFileEvent),
        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),
            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 = {
                status: vsStatus.wrapService(fs.v.sync.status),
                updateStatusInfo: vsUpdateStatusInfo.wrapService(fs.v.sync.updateStatusInfo),
                isRemoteVersionOnDisk: vsIsRemoteVersionOnDisk.wrapService(fs.v.sync.isRemoteVersionOnDisk),
                download: vsDownload.wrapService(fs.v.sync.download),
                adoptRemote: vsAdoptRemote.wrapService(fs.v.sync.adoptRemote),
                diffCurrentAndRemoteFolderVersions: vsDiffCurrentAndRemoteFolderVersions.wrapService(fs.v.sync.diffCurrentAndRemoteFolderVersions)
            };
            if (fs.writable) {
                implExp.v.sync.upload = vsUpload.wrapService(fs.v.sync.upload);
                implExp.v.sync.adoptRemoteFolderItem =
                    vsAdoptRemoteFolderItem.wrapService(fs.v.sync.adoptRemoteFolderItem);
            }
        }
    }
    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);
const fsEventMsgType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSEventMsg);
function packFSEvent(e) {
    const { type, path } = e;
    switch (type) {
        case 'removed':
            return fsEventMsgType.pack({
                type, path,
                src: (0, protobuf_msg_1.toVal)(e.src)
            });
        case 'remote-removal':
            return fsEventMsgType.pack({
                type, path
            });
        case 'file-change':
            return fsEventMsgType.pack({
                type, path,
                src: (0, protobuf_msg_1.toVal)(e.src),
                newVersion: (0, protobuf_msg_1.toOptVal)(e.newVersion)
            });
        case 'remote-change':
            return fsEventMsgType.pack({
                type, path,
                newVersion: (0, protobuf_msg_1.toOptVal)(e.newVersion)
            });
        case 'entry-addition':
            return fsEventMsgType.pack({
                type, path,
                src: (0, protobuf_msg_1.toVal)(e.src),
                newVersion: (0, protobuf_msg_1.toOptVal)(e.newVersion),
                entry: lsEntryToMsg(e.entry),
                moveLabel: (0, protobuf_msg_1.toOptVal)(e.moveLabel)
            });
        case 'entry-removal':
            return fsEventMsgType.pack({
                type, path,
                src: (0, protobuf_msg_1.toVal)(e.src),
                newVersion: (0, protobuf_msg_1.toOptVal)(e.newVersion),
                name: (0, protobuf_msg_1.toVal)(e.name),
                moveLabel: (0, protobuf_msg_1.toOptVal)(e.moveLabel)
            });
        case 'entry-renaming':
            return fsEventMsgType.pack({
                type, path,
                src: (0, protobuf_msg_1.toVal)(e.src),
                newVersion: (0, protobuf_msg_1.toOptVal)(e.newVersion),
                oldName: (0, protobuf_msg_1.toVal)(e.oldName),
                newName: (0, protobuf_msg_1.toVal)(e.newName)
            });
        case 'remote-arch-ver-removal':
            return fsEventMsgType.pack({
                type, path,
                removedArchVer: (0, protobuf_msg_1.toVal)(e.removedArchVer)
            });
        case 'remote-version-archival':
            return fsEventMsgType.pack({
                type, path,
                archivedVersion: (0, protobuf_msg_1.toVal)(e.archivedVersion)
            });
        default:
            throw new Error(`Unknown event type ${type}`);
    }
}
function unpackFSEvent(buf) {
    const m = fsEventMsgType.unpack(buf);
    const { type, path } = m;
    switch (type) {
        case 'entry-addition':
            return {
                type, path,
                src: (0, protobuf_msg_1.valOf)(m.src),
                newVersion: (0, protobuf_msg_1.valOfOptInt)(m.newVersion),
                entry: lsEntryFromMsg(m.entry),
                moveLabel: (0, protobuf_msg_1.valOfOptInt)(m.moveLabel)
            };
        case 'entry-removal':
            return {
                type, path,
                src: (0, protobuf_msg_1.valOf)(m.src),
                newVersion: (0, protobuf_msg_1.valOfOptInt)(m.newVersion),
                name: (0, protobuf_msg_1.valOf)(m.name),
                moveLabel: (0, protobuf_msg_1.valOfOptInt)(m.moveLabel)
            };
        case 'entry-renaming':
            return {
                type, path,
                src: (0, protobuf_msg_1.valOf)(m.src),
                newVersion: (0, protobuf_msg_1.valOfOptInt)(m.newVersion),
                oldName: (0, protobuf_msg_1.valOf)(m.oldName),
                newName: (0, protobuf_msg_1.valOf)(m.newName)
            };
        case 'file-change':
            return {
                type, path,
                src: (0, protobuf_msg_1.valOf)(m.src),
                newVersion: (0, protobuf_msg_1.valOfOptInt)(m.newVersion)
            };
        case 'removed':
            return {
                type, path,
                src: (0, protobuf_msg_1.valOf)(m.src)
            };
        case 'remote-removal':
            return {
                type, path
            };
        case 'remote-change':
            return {
                type, path, newVersion: (0, protobuf_msg_1.intValOf)(m.newVersion)
            };
        case 'remote-arch-ver-removal':
            return {
                type, path, removedArchVer: (0, protobuf_msg_1.intValOf)(m.removedArchVer)
            };
        case 'remote-version-archival':
            return {
                type, path, archivedVersion: (0, protobuf_msg_1.intValOf)(m.archivedVersion)
            };
        default:
            throw new Error(`Unknown event type ${type}`);
    }
}
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, packEvent) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const s = new rxjs_1.Subject();
            const obs = s.asObservable().pipe((0, operators_1.map)(packEvent));
            const onCancel = fn(path, s);
            return { obs, onCancel };
        };
    }
    watch.wrapService = wrapService;
    function makeCaller(caller, ipcPath, unpackEvent) {
        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)(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, unpackFSEvent);
    }
    watch.makeFolderCaller = makeFolderCaller;
    function makeFileCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'watchFile');
        return makeCaller(caller, ipcPath, file_1.unpackFileEvent);
    }
    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)(packFSEvent));
            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)(unpackFSEvent))
                .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 requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.ListFolderReplyBody);
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(lst => requestType.pack({ entries: lst.map(lsEntryToMsg) }));
            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(buf => (0, protobuf_msg_1.fixArray)(requestType.unpack(buf).entries).map(lsEntryFromMsg));
    }
    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 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) {
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(file.packSyncStatus);
            return { promise };
        };
    }
    vsStatus.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'status');
        return (path) => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(file.unpackSyncStatus);
    }
    vsStatus.makeCaller = makeCaller;
})(vsStatus || (vsStatus = {}));
Object.freeze(vsStatus);
var vsUpdateStatusInfo;
(function (vsUpdateStatusInfo) {
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(file.packSyncStatus);
            return { promise };
        };
    }
    vsUpdateStatusInfo.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'updateStatusInfo');
        return (path) => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(file.unpackSyncStatus);
    }
    vsUpdateStatusInfo.makeCaller = makeCaller;
})(vsUpdateStatusInfo || (vsUpdateStatusInfo = {}));
Object.freeze(vsUpdateStatusInfo);
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.FSSyncDownloadRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, version } = requestType.unpack(buf);
            const promise = fn(path, (0, protobuf_msg_1.fixInt)(version));
            return { promise };
        };
    }
    vsDownload.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'download');
        return (path, version) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, version
        }));
    }
    vsDownload.makeCaller = makeCaller;
})(vsDownload || (vsDownload = {}));
Object.freeze(vsDownload);
var vsUpload;
(function (vsUpload) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSSyncUploadRequestBody);
    const replyType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSSyncUploadReplyBody);
    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);
function optionsToAdoptRemoteItemToMsg(opts) {
    if (!opts) {
        return;
    }
    return {
        localVersion: (0, protobuf_msg_1.toOptVal)(opts.localVersion),
        remoteVersion: (0, protobuf_msg_1.toOptVal)(opts.remoteVersion)
    };
}
function optionsToAdoptRemoteItemFromMsg(msg) {
    if (!msg) {
        return;
    }
    return {
        localVersion: (0, protobuf_msg_1.valOfOptInt)(msg.localVersion),
        remoteVersion: (0, protobuf_msg_1.valOfOptInt)(msg.remoteVersion)
    };
}
var vsAdoptRemoteFolderItem;
(function (vsAdoptRemoteFolderItem) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AdoptRemoteFolderItemRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, itemName, opts } = requestType.unpack(buf);
            const promise = fn(path, itemName, optionsToAdoptRemoteItemFromMsg(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: optionsToAdoptRemoteItemToMsg(opts)
        }))
            .then(protobuf_msg_1.unpackInt);
    }
    vsAdoptRemoteFolderItem.makeCaller = makeCaller;
})(vsAdoptRemoteFolderItem || (vsAdoptRemoteFolderItem = {}));
Object.freeze(vsAdoptRemoteFolderItem);
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);
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);
function folderDiffToMsg(diff) {
    var _a, _b, _c, _d;
    if (!diff) {
        return;
    }
    return {
        remoteVersion: (0, protobuf_msg_1.toOptVal)(diff.remoteVersion),
        currentVersion: diff.currentVersion,
        isCurrentLocal: diff.isCurrentLocal,
        isRemoteArchived: diff.isRemoteArchived,
        inCurrent: (_a = diff.inCurrent) === null || _a === void 0 ? void 0 : _a.map(lsEntryToMsg),
        inRemote: (_b = diff.inRemote) === null || _b === void 0 ? void 0 : _b.map(lsEntryToMsg),
        nameOverlaps: diff.nameOverlaps,
        ctime: diffTStoMsg(diff.ctime),
        mtime: diffTStoMsg(diff.mtime),
        xattrs: (diff.xattrs ? {
            inCurrent: (_c = diff.xattrs.inCurrent) === null || _c === void 0 ? void 0 : _c.map(({ name, value }) => file.xattrToMsg(name, value)),
            inRemote: (_d = diff.xattrs.inRemote) === null || _d === void 0 ? void 0 : _d.map(({ name, value }) => file.xattrToMsg(name, value)),
            nameOverlaps: diff.xattrs.nameOverlaps
        } : undefined)
    };
}
function diffTStoMsg(diffTS) {
    var _a;
    return {
        current: diffTS.current.valueOf(),
        remote: (0, protobuf_msg_1.toOptVal)((_a = diffTS.remote) === null || _a === void 0 ? void 0 : _a.valueOf())
    };
}
function folderDiffFromMsg(msg) {
    if (!msg) {
        return;
    }
    return {
        remoteVersion: (0, protobuf_msg_1.valOfOptInt)(msg.remoteVersion),
        currentVersion: (0, protobuf_msg_1.fixInt)(msg.currentVersion),
        isCurrentLocal: msg.isCurrentLocal,
        isRemoteArchived: msg.isRemoteArchived,
        inCurrent: ((msg.inCurrent.length > 0) ?
            msg.inCurrent.map(lsEntryFromMsg) : undefined),
        inRemote: ((msg.inRemote.length > 0) ?
            msg.inRemote.map(lsEntryFromMsg) : undefined),
        nameOverlaps: ((msg.nameOverlaps.length > 0) ?
            msg.nameOverlaps : undefined),
        ctime: diffTSfromMsg(msg.ctime),
        mtime: diffTSfromMsg(msg.mtime),
        xattrs: (msg.xattrs ? {
            inCurrent: ((msg.xattrs.inCurrent.length > 0) ?
                msg.xattrs.inCurrent.map(file.xattrFromMsg) : undefined),
            inRemote: ((msg.xattrs.inRemote.length > 0) ?
                msg.xattrs.inRemote.map(file.xattrFromMsg) : undefined),
            nameOverlaps: ((msg.xattrs.nameOverlaps.length > 0) ?
                msg.xattrs.nameOverlaps : undefined)
        } : undefined)
    };
}
function diffTSfromMsg(m) {
    return {
        current: new Date((0, protobuf_msg_1.fixInt)(m.current)),
        remote: (m.remote ? new Date((0, protobuf_msg_1.intValOf)(m.remote)) : undefined)
    };
}
var vsDiffCurrentAndRemoteFolderVersions;
(function (vsDiffCurrentAndRemoteFolderVersions) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.DiffCurrentAndRemoteRequestBody);
    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":110,"../ipc-via-protobuf/protobuf-msg":111,"../lib-client/protobuf-type":113,"../lib-common/assert":114,"../lib-common/processes/deferred":119,"../lib-common/utils-for-observables":121,"../protos/fs.proto":126,"./bytes":93,"./file":95,"rxjs":287,"rxjs/operators":512}],97:[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":110,"../lib-common/assert":114}],98:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 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.makeReqRepFuncCaller = makeReqRepFuncCaller;
exports.makeReqRepObjCaller = makeReqRepObjCaller;
exports.makeObservableFuncCaller = makeObservableFuncCaller;
const rxjs_1 = require("rxjs");
const json_n_binary_1 = require("./json-n-binary");
function replyFromPassedDatum(data, unpack) {
    if (!data) {
        return;
    }
    if (unpack) {
        if (unpack === 'noop') {
            return [data.bytes];
        }
        else {
            return unpack(data);
        }
    }
    else {
        const { bytes, passedByReference } = data;
        return (bytes ? (0, json_n_binary_1.deserializeArgs)(bytes, passedByReference)[0] : undefined);
    }
}
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, json_n_binary_1.serializeArgs)(args);
    }
}
function makeReqRepFuncCaller(clientSide, path, transforms) {
    return (async (...args) => {
        const req = argsToPassedDatum(args, transforms === null || transforms === void 0 ? void 0 : transforms.packRequest);
        if (req === null || req === void 0 ? void 0 : req.passedByReference) {
            throw new Error(`Passing by reference is notimplemented, yet.`);
        }
        const reply = await clientSide.startPromiseCall(path, req === null || req === void 0 ? void 0 : req.bytes);
        return replyFromPassedDatum({
            bytes: reply
        }, transforms === null || transforms === void 0 ? void 0 : transforms.unpackReply);
    });
}
function makeReqRepObjCaller(clientSide, objPath, method, transforms) {
    return makeReqRepFuncCaller(clientSide, objPath.concat(method), transforms);
}
function makeObservableFuncCaller(clientSide, path, transforms) {
    return (obs, ...args) => {
        const req = argsToPassedDatum(args, transforms === null || transforms === void 0 ? void 0 : transforms.packRequest);
        const s = new rxjs_1.Subject();
        const unsub = clientSide.startObservableCall(path, req === null || req === void 0 ? void 0 : req.bytes, s);
        s.subscribe({
            next: data => {
                if (!obs.next) {
                    return;
                }
                const ev = replyFromPassedDatum({ bytes: data }, transforms === null || transforms === void 0 ? void 0 : transforms.unpackReply);
                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":99,"rxjs":287}],99:[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.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) {
    const { seq, passedByReference } = argsToValuesSequence(args);
    return { bytes: valuesType.pack(seq), passedByReference };
}
function argsToValuesSequence(args) {
    const seq = { values: [] };
    const passedByReference = [];
    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) {
                const indexInPassed = addToArray(passedByReference, arg);
                seq.values.push({
                    transferred: { indexInPassed, objLocation: [] }
                });
            }
            else {
                seq.values.push(turnToJsonExtractingBinaryAndTransferable(arg, passedByReference));
            }
        }
        else {
            seq.values.push({
                json: JSON.stringify(arg)
            });
        }
    }
    return {
        seq,
        passedByReference: ((passedByReference.length > 0) ?
            passedByReference : undefined)
    };
}
function addToArray(arr, o) {
    let foundIndex = arr.indexOf(o);
    if (foundIndex < 0) {
        arr.push(o);
        return arr.length - 1;
    }
    else {
        return foundIndex;
    }
}
function turnToJsonExtractingBinaryAndTransferable(arg, passedByReference) {
    const parts = extractNonJsonableFrom(arg, passedByReference);
    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, passedByReference) {
    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) {
            const indexInPassed = addToArray(passedByReference, nonJson);
            transferredInJson.push({ indexInPassed, objLocation });
        }
        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 getInitAndSetNewValueAt(o, objLocation, newValue) {
    const value = o[objLocation[0]];
    if (objLocation.length > 1) {
        return getInitAndSetNewValueAt(value, objLocation.slice(1), newValue);
    }
    else {
        o[objLocation[0]] = newValue;
        return value;
    }
}
function deserializeArgs(bytes, passedByReference) {
    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) {
            args.push(getTransferred(transferred.indexInPassed, passedByReference));
        }
        else if ((typeof json === 'string') && (json.length > 0)) {
            const arg = JSON.parse(json);
            if (binaryInJson) {
                attachBinaryArrays(arg, binaryInJson);
            }
            if (transferredInJson) {
                attachTransferred(arg, transferredInJson, passedByReference);
            }
            args.push(arg);
        }
        else {
            args.push(undefined);
        }
    }
    return args;
}
function attachBinaryArrays(arg, binaryInJson) {
    for (const { arr, objLocation } of binaryInJson) {
        setNewValueAtObjLocation(arg, objLocation, arr);
    }
}
function getTransferred(indexInPassed, passedByReference) {
    if (!passedByReference) {
        // XXX throw error here
        throw new Error(`need better error`);
    }
    const o = passedByReference[indexInPassed];
    if (!o || !o._isObjectFromCore) {
        // XXX throw error here
        throw new Error(`need better error`);
    }
    return o;
}
function attachTransferred(arg, transferredInJson, passedByReference) {
    for (const { indexInPassed, objLocation } of transferredInJson) {
        setNewValueAtObjLocation(arg, objLocation, getTransferred(indexInPassed, passedByReference));
    }
}

},{"../../lib-client/protobuf-type":113,"../../lib-common/json-utils":118,"../../protos/json-ipc.proto":128}],100:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 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.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 = argsFromBuffer(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 argsFromBuffer(buf, transforms) {
    return argsFromPassedDatum({ bytes: buf }, transforms === null || transforms === void 0 ? void 0 : transforms.unpackRequest);
}
function resultToBuffer(data, transforms) {
    const sequencePack = toPassedDatum(data, transforms === null || transforms === void 0 ? void 0 : transforms.packReply);
    return sequencePack === null || sequencePack === void 0 ? void 0 : sequencePack.bytes;
}
function argsFromPassedDatum(data, unpack) {
    if (!data) {
        return;
    }
    if (unpack) {
        if (unpack === 'noop') {
            return [data.bytes];
        }
        else {
            return unpack(data);
        }
    }
    else {
        const { bytes, passedByReference } = data;
        return (bytes ? (0, json_n_binary_1.deserializeArgs)(bytes, passedByReference) : undefined);
    }
}
function toPassedDatum(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, json_n_binary_1.serializeArgs)([data]);
    }
}
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 = argsFromBuffer(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":99,"rxjs":287}],101:[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":116,"./json-ipc-wrapping/caller-side-wrap":98,"./json-ipc-wrapping/service-side-wrap":100}],102:[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":106,"../ipc-via-protobuf/connector":110,"./generic":97}],103:[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: exposeCofigCAP(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 exposeCofigCAP(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":96,"../../core-ipc/json-ipc-wrapping/caller-side-wrap":98,"../../core-ipc/json-ipc-wrapping/service-side-wrap":100,"../../ipc-via-protobuf/connector":110,"../../ipc-via-protobuf/protobuf-msg":111,"../../lib-client/protobuf-type":113,"../../lib-common/utils-for-observables":121,"../../protos/asmail.proto":122,"rxjs":287,"rxjs/operators":512}],104:[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":98,"../../core-ipc/json-ipc-wrapping/service-side-wrap":100}],105:[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":98,"../../core-ipc/json-ipc-wrapping/service-side-wrap":100}],106:[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)();
    // let doneRes: boolean|undefined;
    const obs = {
        next: ({ p, decrResult }) => {
            if (typeof decrResult === 'boolean') {
                completion === null || completion === void 0 ? void 0 : completion.resolve(decrResult);
                completion = undefined;
            }
            else {
                progressCB(p);
            }
        },
        complete: () => completion === null || completion === void 0 ? void 0 : completion.reject(new Error()),
        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":98,"../../core-ipc/json-ipc-wrapping/service-side-wrap":100,"../../lib-common/processes/deferred":119}],107:[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":96,"../../ipc-via-protobuf/protobuf-msg":111,"../../lib-client/protobuf-type":113,"../../protos/storage.proto":129}],108:[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":119,"./connector":110,"./protobuf-msg":111}],109:[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 random_node_1 = require("../lib-common/random-node");
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 = (0, random_node_1.stringOfB64CharsSync)(20);
        } 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);

},{"../lib-common/random-node":120,"./connector":110,"./protobuf-msg":111}],110:[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":113,"../protos/ipc.proto":127,"./connector-clients-side":108,"./connector-services-side":109,"./protobuf-msg":111}],111:[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":220,"../lib-client/protobuf-type":113,"../lib-common/buffer-utils":115,"../lib-common/exceptions/error":116,"../protos/common.proto":124,"./connector":110}],112:[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":93,"./core-ipc/common-caps":94,"./core-ipc/file":95,"./core-ipc/fs":96,"./core-ipc/json-ipc-wrapping/caller-side-wrap":98,"./core-ipc/json-ipc-wrapping/service-side-wrap":100,"./core-ipc/log-cap":101,"./core-ipc/startup-caps":102,"./ipc-via-protobuf/connector":110}],113:[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":83}],114:[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);

},{}],115:[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.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) {
    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":83}],116:[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":117}],117:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 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.makeRuntimeException = makeRuntimeException;
function makeRuntimeException(type, params, flags) {
    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;
        }
    }
    return exc;
}
Object.freeze(exports);

},{}],118:[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);

},{}],119:[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);

},{}],120:[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.bytesSync = bytesSync;
exports.bytes = bytes;
exports.uint8Sync = uint8Sync;
exports.uint8 = uint8;
exports.uint48Sync = uint48Sync;
exports.uint48 = uint48;
exports.stringOfB64UrlSafeCharsSync = stringOfB64UrlSafeCharsSync;
exports.stringOfB64CharsSync = stringOfB64CharsSync;
exports.stringOfB64UrlSafeChars = stringOfB64UrlSafeChars;
exports.stringOfB64Chars = stringOfB64Chars;
const buffer_utils_1 = require("./buffer-utils");
const crypto_1 = require("crypto");
function bytesSync(numOfBytes) {
    return (0, crypto_1.randomBytes)(numOfBytes);
}
function bytes(numOfBytes) {
    return new Promise((res, rej) => (0, crypto_1.randomBytes)(numOfBytes, (err, buf) => {
        if (err) {
            rej(err);
        }
        else {
            res(buf);
        }
    }));
}
function uint8Sync() {
    return (0, crypto_1.randomBytes)(1)[0];
}
async function uint8() {
    return (await (0, crypto_1.randomBytes)(1))[0];
}
function uint48Sync() {
    const b = (0, crypto_1.randomBytes)(6);
    const l = b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
    const h = b[4] + (b[5] << 8);
    return h * 0x100000000 + l;
}
async function uint48() {
    const b = await bytes(6);
    const l = b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
    const h = b[4] + (b[5] << 8);
    return h * 0x100000000 + l;
}
function stringOfB64UrlSafeCharsSync(numOfChars) {
    const numOfbytes = 3 * (1 + Math.floor(numOfChars / 4));
    const byteArr = (0, crypto_1.randomBytes)(numOfbytes);
    return buffer_utils_1.base64urlSafe.pack(byteArr).substring(0, numOfChars);
}
function stringOfB64CharsSync(numOfChars) {
    const numOfbytes = 3 * (1 + Math.floor(numOfChars / 4));
    return (0, crypto_1.randomBytes)(numOfbytes).toString('base64').substring(0, numOfChars);
}
async function stringOfB64UrlSafeChars(numOfChars) {
    const numOfbytes = 3 * (1 + Math.floor(numOfChars / 4));
    const byteArr = await bytes(numOfbytes);
    return buffer_utils_1.base64urlSafe.pack(byteArr).substring(0, numOfChars);
}
async function stringOfB64Chars(numOfChars) {
    const numOfbytes = 3 * (1 + Math.floor(numOfChars / 4));
    const byteArr = await bytes(numOfbytes);
    return byteArr.toString('base64').substring(0, numOfChars);
}
Object.freeze(exports);

},{"./buffer-utils":115,"crypto":148}],121:[function(require,module,exports){
arguments[4][6][0].apply(exports,arguments)
},{"dup":6,"rxjs":287,"rxjs/operators":512}],122:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.fromTS != null && Object.hasOwnProperty.call(message, "fromTS"))
                $root.common.UInt64Value.encode(message.fromTS, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ListMsgsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.fromTS = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.fromTS != null && message.hasOwnProperty("fromTS")) {
                var error = $root.common.UInt64Value.verify(message.fromTS);
                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) {
            if (object instanceof $root.asmail.ListMsgsRequestBody)
                return object;
            var message = new $root.asmail.ListMsgsRequestBody();
            if (object.fromTS != null) {
                if (typeof object.fromTS !== "object")
                    throw TypeError(".asmail.ListMsgsRequestBody.fromTS: object expected");
                message.fromTS = $root.common.UInt64Value.fromObject(object.fromTS);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.fromTS = null;
            if (message.fromTS != null && message.hasOwnProperty("fromTS"))
                object.fromTS = $root.common.UInt64Value.toObject(message.fromTS, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ListMsgsInboxReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.infos && message.infos.length))
                            message.infos = [];
                        message.infos.push($root.asmail.ListMsgsInboxReplyBody.MsgInfo.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.infos != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.asmail.ListMsgsInboxReplyBody)
                return object;
            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 (typeof object.infos[i] !== "object")
                        throw TypeError(".asmail.ListMsgsInboxReplyBody.infos: object expected");
                    message.infos[i] = $root.asmail.ListMsgsInboxReplyBody.MsgInfo.fromObject(object.infos[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ListMsgsInboxReplyBody.MsgInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.msgId != null && message.hasOwnProperty("msgId"))
                    if (!$util.isString(message.msgId))
                        return "msgId: string expected";
                if (message.deliveryTS != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
                if (object instanceof $root.asmail.ListMsgsInboxReplyBody.MsgInfo)
                    return object;
                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)).unsigned = 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) {
                if (!options)
                    options = {};
                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() : long;
                    } else
                        object.deliveryTS = options.longs === String ? "0" : 0;
                    object.msgType = "";
                }
                if (message.msgId != null && message.hasOwnProperty("msgId"))
                    object.msgId = message.msgId;
                if (message.deliveryTS != null && message.hasOwnProperty("deliveryTS"))
                    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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.RemoveMsgRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.msgId = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.msgId != null && message.hasOwnProperty("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) {
            if (object instanceof $root.asmail.RemoveMsgRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.msgId = "";
            if (message.msgId != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.GetMsgRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.msgId = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.msgId != null && message.hasOwnProperty("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) {
            if (object instanceof $root.asmail.GetMsgRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.msgId = "";
            if (message.msgId != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.plainTxtBody != null && Object.hasOwnProperty.call(message, "plainTxtBody"))
                $root.common.StringValue.encode(message.plainTxtBody, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();
            if (message.htmlTxtBody != null && Object.hasOwnProperty.call(message, "htmlTxtBody"))
                $root.common.StringValue.encode(message.htmlTxtBody, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();
            if (message.jsonBody != null && Object.hasOwnProperty.call(message, "jsonBody"))
                $root.common.StringValue.encode(message.jsonBody, writer.uint32(/* id 15, wireType 2 =*/122).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.IncomingMessageMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                case 13: {
                        message.plainTxtBody = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 14: {
                        message.htmlTxtBody = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 15: {
                        message.jsonBody = $root.common.StringValue.decode(reader, reader.uint32());
                        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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.msgId != null && message.hasOwnProperty("msgId"))
                if (!$util.isString(message.msgId))
                    return "msgId: string expected";
            if (message.deliveryTS != null && message.hasOwnProperty("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 && message.hasOwnProperty("sender"))
                if (!$util.isString(message.sender))
                    return "sender: string expected";
            if (message.establishedSenderKeyChain != null && message.hasOwnProperty("establishedSenderKeyChain"))
                if (typeof message.establishedSenderKeyChain !== "boolean")
                    return "establishedSenderKeyChain: boolean expected";
            if (message.msgType != null && message.hasOwnProperty("msgType"))
                if (!$util.isString(message.msgType))
                    return "msgType: string expected";
            if (message.recipients != null && message.hasOwnProperty("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 && message.hasOwnProperty("subject")) {
                var error = $root.common.StringValue.verify(message.subject);
                if (error)
                    return "subject." + error;
            }
            if (message.plainTxtBody != null && message.hasOwnProperty("plainTxtBody")) {
                var error = $root.common.StringValue.verify(message.plainTxtBody);
                if (error)
                    return "plainTxtBody." + error;
            }
            if (message.htmlTxtBody != null && message.hasOwnProperty("htmlTxtBody")) {
                var error = $root.common.StringValue.verify(message.htmlTxtBody);
                if (error)
                    return "htmlTxtBody." + error;
            }
            if (message.jsonBody != null && message.hasOwnProperty("jsonBody")) {
                var error = $root.common.StringValue.verify(message.jsonBody);
                if (error)
                    return "jsonBody." + error;
            }
            if (message.carbonCopy != null && message.hasOwnProperty("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 && message.hasOwnProperty("attachments")) {
                var error = $root.fs.FS.verify(message.attachments);
                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) {
            if (object instanceof $root.asmail.IncomingMessageMsg)
                return object;
            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)).unsigned = 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 (typeof object.subject !== "object")
                    throw TypeError(".asmail.IncomingMessageMsg.subject: object expected");
                message.subject = $root.common.StringValue.fromObject(object.subject);
            }
            if (object.plainTxtBody != null) {
                if (typeof object.plainTxtBody !== "object")
                    throw TypeError(".asmail.IncomingMessageMsg.plainTxtBody: object expected");
                message.plainTxtBody = $root.common.StringValue.fromObject(object.plainTxtBody);
            }
            if (object.htmlTxtBody != null) {
                if (typeof object.htmlTxtBody !== "object")
                    throw TypeError(".asmail.IncomingMessageMsg.htmlTxtBody: object expected");
                message.htmlTxtBody = $root.common.StringValue.fromObject(object.htmlTxtBody);
            }
            if (object.jsonBody != null) {
                if (typeof object.jsonBody !== "object")
                    throw TypeError(".asmail.IncomingMessageMsg.jsonBody: object expected");
                message.jsonBody = $root.common.StringValue.fromObject(object.jsonBody);
            }
            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 (typeof object.attachments !== "object")
                    throw TypeError(".asmail.IncomingMessageMsg.attachments: object expected");
                message.attachments = $root.fs.FS.fromObject(object.attachments);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.deliveryTS = options.longs === String ? "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 && message.hasOwnProperty("msgId"))
                object.msgId = message.msgId;
            if (message.deliveryTS != null && message.hasOwnProperty("deliveryTS"))
                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 && message.hasOwnProperty("sender"))
                object.sender = message.sender;
            if (message.establishedSenderKeyChain != null && message.hasOwnProperty("establishedSenderKeyChain"))
                object.establishedSenderKeyChain = message.establishedSenderKeyChain;
            if (message.msgType != null && message.hasOwnProperty("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 && message.hasOwnProperty("subject"))
                object.subject = $root.common.StringValue.toObject(message.subject, options);
            if (message.plainTxtBody != null && message.hasOwnProperty("plainTxtBody"))
                object.plainTxtBody = $root.common.StringValue.toObject(message.plainTxtBody, options);
            if (message.htmlTxtBody != null && message.hasOwnProperty("htmlTxtBody"))
                object.htmlTxtBody = $root.common.StringValue.toObject(message.htmlTxtBody, options);
            if (message.jsonBody != null && message.hasOwnProperty("jsonBody"))
                object.jsonBody = $root.common.StringValue.toObject(message.jsonBody, options);
            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 && message.hasOwnProperty("attachments"))
                object.attachments = $root.fs.FS.toObject(message.attachments, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.SubscribeStartCallBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.event = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.event != null && message.hasOwnProperty("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) {
            if (object instanceof $root.asmail.SubscribeStartCallBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.event = "";
            if (message.event != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.PreFlightRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.toAddress = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.toAddress != null && message.hasOwnProperty("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) {
            if (object instanceof $root.asmail.PreFlightRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.toAddress = "";
            if (message.toAddress != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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()).ldelim();
            if (message.localMeta != null && Object.hasOwnProperty.call(message, "localMeta"))
                $root.common.AnyValue.encode(message.localMeta, writer.uint32(/* id 5, wireType 2 =*/42).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.AddMsgRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                case 3: {
                        message.id = reader.string();
                        break;
                    }
                case 4: {
                        message.sendImmediately = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.localMeta = $root.common.AnyValue.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.retryRecipient = $root.asmail.AddMsgRequestBody.RetryOpt.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.recipients != null && message.hasOwnProperty("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 && message.hasOwnProperty("msg")) {
                var error = $root.asmail.OutgoingMessageMsg.verify(message.msg);
                if (error)
                    return "msg." + error;
            }
            if (message.id != null && message.hasOwnProperty("id"))
                if (!$util.isString(message.id))
                    return "id: string expected";
            if (message.sendImmediately != null && message.hasOwnProperty("sendImmediately")) {
                var error = $root.common.BooleanValue.verify(message.sendImmediately);
                if (error)
                    return "sendImmediately." + error;
            }
            if (message.localMeta != null && message.hasOwnProperty("localMeta")) {
                var error = $root.common.AnyValue.verify(message.localMeta);
                if (error)
                    return "localMeta." + error;
            }
            if (message.retryRecipient != null && message.hasOwnProperty("retryRecipient")) {
                var error = $root.asmail.AddMsgRequestBody.RetryOpt.verify(message.retryRecipient);
                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) {
            if (object instanceof $root.asmail.AddMsgRequestBody)
                return object;
            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 (typeof object.msg !== "object")
                    throw TypeError(".asmail.AddMsgRequestBody.msg: object expected");
                message.msg = $root.asmail.OutgoingMessageMsg.fromObject(object.msg);
            }
            if (object.id != null)
                message.id = String(object.id);
            if (object.sendImmediately != null) {
                if (typeof object.sendImmediately !== "object")
                    throw TypeError(".asmail.AddMsgRequestBody.sendImmediately: object expected");
                message.sendImmediately = $root.common.BooleanValue.fromObject(object.sendImmediately);
            }
            if (object.localMeta != null) {
                if (typeof object.localMeta !== "object")
                    throw TypeError(".asmail.AddMsgRequestBody.localMeta: object expected");
                message.localMeta = $root.common.AnyValue.fromObject(object.localMeta);
            }
            if (object.retryRecipient != null) {
                if (typeof object.retryRecipient !== "object")
                    throw TypeError(".asmail.AddMsgRequestBody.retryRecipient: object expected");
                message.retryRecipient = $root.asmail.AddMsgRequestBody.RetryOpt.fromObject(object.retryRecipient);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("msg"))
                object.msg = $root.asmail.OutgoingMessageMsg.toObject(message.msg, options);
            if (message.id != null && message.hasOwnProperty("id"))
                object.id = message.id;
            if (message.sendImmediately != null && message.hasOwnProperty("sendImmediately"))
                object.sendImmediately = $root.common.BooleanValue.toObject(message.sendImmediately, options);
            if (message.localMeta != null && message.hasOwnProperty("localMeta"))
                object.localMeta = $root.common.AnyValue.toObject(message.localMeta, options);
            if (message.retryRecipient != null && message.hasOwnProperty("retryRecipient"))
                object.retryRecipient = $root.asmail.AddMsgRequestBody.RetryOpt.toObject(message.retryRecipient, options);
            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.AddMsgRequestBody.RetryOpt();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.numOfAttempts = reader.uint32();
                            break;
                        }
                    case 2: {
                            message.timeBetweenAttempts = reader.uint32();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.numOfAttempts != null && message.hasOwnProperty("numOfAttempts"))
                    if (!$util.isInteger(message.numOfAttempts))
                        return "numOfAttempts: integer expected";
                if (message.timeBetweenAttempts != null && message.hasOwnProperty("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) {
                if (object instanceof $root.asmail.AddMsgRequestBody.RetryOpt)
                    return object;
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.numOfAttempts = 0;
                    object.timeBetweenAttempts = 0;
                }
                if (message.numOfAttempts != null && message.hasOwnProperty("numOfAttempts"))
                    object.numOfAttempts = message.numOfAttempts;
                if (message.timeBetweenAttempts != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                $root.common.StringValue.encode(message.msgId, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).ldelim();
            if (message.plainTxtBody != null && Object.hasOwnProperty.call(message, "plainTxtBody"))
                $root.common.StringValue.encode(message.plainTxtBody, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();
            if (message.htmlTxtBody != null && Object.hasOwnProperty.call(message, "htmlTxtBody"))
                $root.common.StringValue.encode(message.htmlTxtBody, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();
            if (message.jsonBody != null && Object.hasOwnProperty.call(message, "jsonBody"))
                $root.common.StringValue.encode(message.jsonBody, writer.uint32(/* id 15, wireType 2 =*/122).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.OutgoingMessageMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.msgId = $root.common.StringValue.decode(reader, reader.uint32());
                        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());
                        break;
                    }
                case 13: {
                        message.plainTxtBody = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 14: {
                        message.htmlTxtBody = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 15: {
                        message.jsonBody = $root.common.StringValue.decode(reader, reader.uint32());
                        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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.msgId != null && message.hasOwnProperty("msgId")) {
                var error = $root.common.StringValue.verify(message.msgId);
                if (error)
                    return "msgId." + error;
            }
            if (message.msgType != null && message.hasOwnProperty("msgType"))
                if (!$util.isString(message.msgType))
                    return "msgType: string expected";
            if (message.recipients != null && message.hasOwnProperty("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 && message.hasOwnProperty("subject")) {
                var error = $root.common.StringValue.verify(message.subject);
                if (error)
                    return "subject." + error;
            }
            if (message.plainTxtBody != null && message.hasOwnProperty("plainTxtBody")) {
                var error = $root.common.StringValue.verify(message.plainTxtBody);
                if (error)
                    return "plainTxtBody." + error;
            }
            if (message.htmlTxtBody != null && message.hasOwnProperty("htmlTxtBody")) {
                var error = $root.common.StringValue.verify(message.htmlTxtBody);
                if (error)
                    return "htmlTxtBody." + error;
            }
            if (message.jsonBody != null && message.hasOwnProperty("jsonBody")) {
                var error = $root.common.StringValue.verify(message.jsonBody);
                if (error)
                    return "jsonBody." + error;
            }
            if (message.carbonCopy != null && message.hasOwnProperty("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 && message.hasOwnProperty("attachments")) {
                var error = $root.asmail.OutgoingMessageMsg.AttachmentsContainer.verify(message.attachments);
                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) {
            if (object instanceof $root.asmail.OutgoingMessageMsg)
                return object;
            var message = new $root.asmail.OutgoingMessageMsg();
            if (object.msgId != null) {
                if (typeof object.msgId !== "object")
                    throw TypeError(".asmail.OutgoingMessageMsg.msgId: object expected");
                message.msgId = $root.common.StringValue.fromObject(object.msgId);
            }
            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 (typeof object.subject !== "object")
                    throw TypeError(".asmail.OutgoingMessageMsg.subject: object expected");
                message.subject = $root.common.StringValue.fromObject(object.subject);
            }
            if (object.plainTxtBody != null) {
                if (typeof object.plainTxtBody !== "object")
                    throw TypeError(".asmail.OutgoingMessageMsg.plainTxtBody: object expected");
                message.plainTxtBody = $root.common.StringValue.fromObject(object.plainTxtBody);
            }
            if (object.htmlTxtBody != null) {
                if (typeof object.htmlTxtBody !== "object")
                    throw TypeError(".asmail.OutgoingMessageMsg.htmlTxtBody: object expected");
                message.htmlTxtBody = $root.common.StringValue.fromObject(object.htmlTxtBody);
            }
            if (object.jsonBody != null) {
                if (typeof object.jsonBody !== "object")
                    throw TypeError(".asmail.OutgoingMessageMsg.jsonBody: object expected");
                message.jsonBody = $root.common.StringValue.fromObject(object.jsonBody);
            }
            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 (typeof object.attachments !== "object")
                    throw TypeError(".asmail.OutgoingMessageMsg.attachments: object expected");
                message.attachments = $root.asmail.OutgoingMessageMsg.AttachmentsContainer.fromObject(object.attachments);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("msgId"))
                object.msgId = $root.common.StringValue.toObject(message.msgId, options);
            if (message.msgType != null && message.hasOwnProperty("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 && message.hasOwnProperty("subject"))
                object.subject = $root.common.StringValue.toObject(message.subject, options);
            if (message.plainTxtBody != null && message.hasOwnProperty("plainTxtBody"))
                object.plainTxtBody = $root.common.StringValue.toObject(message.plainTxtBody, options);
            if (message.htmlTxtBody != null && message.hasOwnProperty("htmlTxtBody"))
                object.htmlTxtBody = $root.common.StringValue.toObject(message.htmlTxtBody, options);
            if (message.jsonBody != null && message.hasOwnProperty("jsonBody"))
                object.jsonBody = $root.common.StringValue.toObject(message.jsonBody, options);
            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 && message.hasOwnProperty("attachments"))
                object.attachments = $root.asmail.OutgoingMessageMsg.AttachmentsContainer.toObject(message.attachments, options);
            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                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()).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()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.OutgoingMessageMsg.AttachmentsContainer();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            if (!(message.files && message.files.length))
                                message.files = [];
                            message.files.push($root.asmail.OutgoingMessageMsg.NamedFSItem.decode(reader, reader.uint32()));
                            break;
                        }
                    case 2: {
                            if (!(message.folders && message.folders.length))
                                message.folders = [];
                            message.folders.push($root.asmail.OutgoingMessageMsg.NamedFSItem.decode(reader, reader.uint32()));
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.files != null && message.hasOwnProperty("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]);
                        if (error)
                            return "files." + error;
                    }
                }
                if (message.folders != null && message.hasOwnProperty("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]);
                        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) {
                if (object instanceof $root.asmail.OutgoingMessageMsg.AttachmentsContainer)
                    return object;
                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 (typeof object.files[i] !== "object")
                            throw TypeError(".asmail.OutgoingMessageMsg.AttachmentsContainer.files: object expected");
                        message.files[i] = $root.asmail.OutgoingMessageMsg.NamedFSItem.fromObject(object.files[i]);
                    }
                }
                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 (typeof object.folders[i] !== "object")
                            throw TypeError(".asmail.OutgoingMessageMsg.AttachmentsContainer.folders: object expected");
                        message.folders[i] = $root.asmail.OutgoingMessageMsg.NamedFSItem.fromObject(object.folders[i]);
                    }
                }
                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) {
                if (!options)
                    options = {};
                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);
                }
                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);
                }
                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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                    $root.common.ObjectReference.encode(message.item, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.OutgoingMessageMsg.NamedFSItem();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.name = reader.string();
                            break;
                        }
                    case 2: {
                            message.item = $root.common.ObjectReference.decode(reader, reader.uint32());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.name != null && message.hasOwnProperty("name"))
                    if (!$util.isString(message.name))
                        return "name: string expected";
                if (message.item != null && message.hasOwnProperty("item")) {
                    var error = $root.common.ObjectReference.verify(message.item);
                    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) {
                if (object instanceof $root.asmail.OutgoingMessageMsg.NamedFSItem)
                    return object;
                var message = new $root.asmail.OutgoingMessageMsg.NamedFSItem();
                if (object.name != null)
                    message.name = String(object.name);
                if (object.item != null) {
                    if (typeof object.item !== "object")
                        throw TypeError(".asmail.OutgoingMessageMsg.NamedFSItem.item: object expected");
                    message.item = $root.common.ObjectReference.fromObject(object.item);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.name = "";
                    object.item = null;
                }
                if (message.name != null && message.hasOwnProperty("name"))
                    object.name = message.name;
                if (message.item != null && message.hasOwnProperty("item"))
                    object.item = $root.common.ObjectReference.toObject(message.item, options);
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ListMsgsDeliveryReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.msgs && message.msgs.length))
                            message.msgs = [];
                        message.msgs.push($root.asmail.ListMsgsDeliveryReplyBody.MsgInfo.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.msgs != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.asmail.ListMsgsDeliveryReplyBody)
                return object;
            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 (typeof object.msgs[i] !== "object")
                        throw TypeError(".asmail.ListMsgsDeliveryReplyBody.msgs: object expected");
                    message.msgs[i] = $root.asmail.ListMsgsDeliveryReplyBody.MsgInfo.fromObject(object.msgs[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                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()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ListMsgsDeliveryReplyBody.MsgInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.id = reader.string();
                            break;
                        }
                    case 2: {
                            message.info = $root.asmail.DeliveryProgressMsg.decode(reader, reader.uint32());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.id != null && message.hasOwnProperty("id"))
                    if (!$util.isString(message.id))
                        return "id: string expected";
                if (message.info != null && message.hasOwnProperty("info")) {
                    var error = $root.asmail.DeliveryProgressMsg.verify(message.info);
                    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) {
                if (object instanceof $root.asmail.ListMsgsDeliveryReplyBody.MsgInfo)
                    return object;
                var message = new $root.asmail.ListMsgsDeliveryReplyBody.MsgInfo();
                if (object.id != null)
                    message.id = String(object.id);
                if (object.info != null) {
                    if (typeof object.info !== "object")
                        throw TypeError(".asmail.ListMsgsDeliveryReplyBody.MsgInfo.info: object expected");
                    message.info = $root.asmail.DeliveryProgressMsg.fromObject(object.info);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.id = "";
                    object.info = null;
                }
                if (message.id != null && message.hasOwnProperty("id"))
                    object.id = message.id;
                if (message.info != null && message.hasOwnProperty("info"))
                    object.info = $root.asmail.DeliveryProgressMsg.toObject(message.info, options);
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.notConnected != null && Object.hasOwnProperty.call(message, "notConnected"))
                $root.common.BooleanValue.encode(message.notConnected, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.allDone != null && Object.hasOwnProperty.call(message, "allDone"))
                $root.common.StringValue.encode(message.allDone, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.DeliveryProgressMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.notConnected = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.allDone = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.msgSize = reader.uint64();
                        break;
                    }
                case 4: {
                        message.localMeta = $root.common.AnyValue.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        if (!(message.recipients && message.recipients.length))
                            message.recipients = [];
                        message.recipients.push($root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.notConnected != null && message.hasOwnProperty("notConnected")) {
                var error = $root.common.BooleanValue.verify(message.notConnected);
                if (error)
                    return "notConnected." + error;
            }
            if (message.allDone != null && message.hasOwnProperty("allDone")) {
                var error = $root.common.StringValue.verify(message.allDone);
                if (error)
                    return "allDone." + error;
            }
            if (message.msgSize != null && message.hasOwnProperty("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 && message.hasOwnProperty("localMeta")) {
                var error = $root.common.AnyValue.verify(message.localMeta);
                if (error)
                    return "localMeta." + error;
            }
            if (message.recipients != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.asmail.DeliveryProgressMsg)
                return object;
            var message = new $root.asmail.DeliveryProgressMsg();
            if (object.notConnected != null) {
                if (typeof object.notConnected !== "object")
                    throw TypeError(".asmail.DeliveryProgressMsg.notConnected: object expected");
                message.notConnected = $root.common.BooleanValue.fromObject(object.notConnected);
            }
            if (object.allDone != null) {
                if (typeof object.allDone !== "object")
                    throw TypeError(".asmail.DeliveryProgressMsg.allDone: object expected");
                message.allDone = $root.common.StringValue.fromObject(object.allDone);
            }
            if (object.msgSize != null)
                if ($util.Long)
                    (message.msgSize = $util.Long.fromValue(object.msgSize)).unsigned = 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 (typeof object.localMeta !== "object")
                    throw TypeError(".asmail.DeliveryProgressMsg.localMeta: object expected");
                message.localMeta = $root.common.AnyValue.fromObject(object.localMeta);
            }
            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 (typeof object.recipients[i] !== "object")
                        throw TypeError(".asmail.DeliveryProgressMsg.recipients: object expected");
                    message.recipients[i] = $root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo.fromObject(object.recipients[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.msgSize = options.longs === String ? "0" : 0;
                object.localMeta = null;
            }
            if (message.notConnected != null && message.hasOwnProperty("notConnected"))
                object.notConnected = $root.common.BooleanValue.toObject(message.notConnected, options);
            if (message.allDone != null && message.hasOwnProperty("allDone"))
                object.allDone = $root.common.StringValue.toObject(message.allDone, options);
            if (message.msgSize != null && message.hasOwnProperty("msgSize"))
                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 && message.hasOwnProperty("localMeta"))
                object.localMeta = $root.common.AnyValue.toObject(message.localMeta, options);
            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);
            }
            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                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()).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()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.DeliveryProgressMsg.DeliveryInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.done = reader.bool();
                            break;
                        }
                    case 2: {
                            message.idOnDelivery = $root.common.StringValue.decode(reader, reader.uint32());
                            break;
                        }
                    case 3: {
                            message.bytesSent = reader.uint64();
                            break;
                        }
                    case 4: {
                            message.err = $root.common.ErrorValue.decode(reader, reader.uint32());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.done != null && message.hasOwnProperty("done"))
                    if (typeof message.done !== "boolean")
                        return "done: boolean expected";
                if (message.idOnDelivery != null && message.hasOwnProperty("idOnDelivery")) {
                    var error = $root.common.StringValue.verify(message.idOnDelivery);
                    if (error)
                        return "idOnDelivery." + error;
                }
                if (message.bytesSent != null && message.hasOwnProperty("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 && message.hasOwnProperty("err")) {
                    var error = $root.common.ErrorValue.verify(message.err);
                    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) {
                if (object instanceof $root.asmail.DeliveryProgressMsg.DeliveryInfo)
                    return object;
                var message = new $root.asmail.DeliveryProgressMsg.DeliveryInfo();
                if (object.done != null)
                    message.done = Boolean(object.done);
                if (object.idOnDelivery != null) {
                    if (typeof object.idOnDelivery !== "object")
                        throw TypeError(".asmail.DeliveryProgressMsg.DeliveryInfo.idOnDelivery: object expected");
                    message.idOnDelivery = $root.common.StringValue.fromObject(object.idOnDelivery);
                }
                if (object.bytesSent != null)
                    if ($util.Long)
                        (message.bytesSent = $util.Long.fromValue(object.bytesSent)).unsigned = 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 (typeof object.err !== "object")
                        throw TypeError(".asmail.DeliveryProgressMsg.DeliveryInfo.err: object expected");
                    message.err = $root.common.ErrorValue.fromObject(object.err);
                }
                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) {
                if (!options)
                    options = {};
                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() : long;
                    } else
                        object.bytesSent = options.longs === String ? "0" : 0;
                    object.err = null;
                }
                if (message.done != null && message.hasOwnProperty("done"))
                    object.done = message.done;
                if (message.idOnDelivery != null && message.hasOwnProperty("idOnDelivery"))
                    object.idOnDelivery = $root.common.StringValue.toObject(message.idOnDelivery, options);
                if (message.bytesSent != null && message.hasOwnProperty("bytesSent"))
                    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 && message.hasOwnProperty("err"))
                    object.err = $root.common.ErrorValue.toObject(message.err, options);
                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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                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()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.address = reader.string();
                            break;
                        }
                    case 2: {
                            message.info = $root.asmail.DeliveryProgressMsg.DeliveryInfo.decode(reader, reader.uint32());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.address != null && message.hasOwnProperty("address"))
                    if (!$util.isString(message.address))
                        return "address: string expected";
                if (message.info != null && message.hasOwnProperty("info")) {
                    var error = $root.asmail.DeliveryProgressMsg.DeliveryInfo.verify(message.info);
                    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) {
                if (object instanceof $root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo)
                    return object;
                var message = new $root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo();
                if (object.address != null)
                    message.address = String(object.address);
                if (object.info != null) {
                    if (typeof object.info !== "object")
                        throw TypeError(".asmail.DeliveryProgressMsg.AddrAndDeliveryInfo.info: object expected");
                    message.info = $root.asmail.DeliveryProgressMsg.DeliveryInfo.fromObject(object.info);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.address = "";
                    object.info = null;
                }
                if (message.address != null && message.hasOwnProperty("address"))
                    object.address = message.address;
                if (message.info != null && message.hasOwnProperty("info"))
                    object.info = $root.asmail.DeliveryProgressMsg.DeliveryInfo.toObject(message.info, options);
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.CurrentStateRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.id = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.id != null && message.hasOwnProperty("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) {
            if (object instanceof $root.asmail.CurrentStateRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.id = "";
            if (message.id != null && message.hasOwnProperty("id"))
                object.id = message.id;
            return object;
        };

        /**
         * Converts this 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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ObserveDeliveryRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.id = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.id != null && message.hasOwnProperty("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) {
            if (object instanceof $root.asmail.ObserveDeliveryRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.id = "";
            if (message.id != null && message.hasOwnProperty("id"))
                object.id = message.id;
            return object;
        };

        /**
         * Converts this 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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.RmMsgRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.id = reader.string();
                        break;
                    }
                case 2: {
                        message.cancelSending = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.id != null && message.hasOwnProperty("id"))
                if (!$util.isString(message.id))
                    return "id: string expected";
            if (message.cancelSending != null && message.hasOwnProperty("cancelSending")) {
                var error = $root.common.BooleanValue.verify(message.cancelSending);
                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) {
            if (object instanceof $root.asmail.RmMsgRequestBody)
                return object;
            var message = new $root.asmail.RmMsgRequestBody();
            if (object.id != null)
                message.id = String(object.id);
            if (object.cancelSending != null) {
                if (typeof object.cancelSending !== "object")
                    throw TypeError(".asmail.RmMsgRequestBody.cancelSending: object expected");
                message.cancelSending = $root.common.BooleanValue.fromObject(object.cancelSending);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.id = "";
                object.cancelSending = null;
            }
            if (message.id != null && message.hasOwnProperty("id"))
                object.id = message.id;
            if (message.cancelSending != null && message.hasOwnProperty("cancelSending"))
                object.cancelSending = $root.common.BooleanValue.toObject(message.cancelSending, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.DeliveryNotificationWithId();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.id = reader.string();
                        break;
                    }
                case 2: {
                        message.progress = $root.asmail.DeliveryProgressMsg.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.id != null && message.hasOwnProperty("id"))
                if (!$util.isString(message.id))
                    return "id: string expected";
            if (message.progress != null && message.hasOwnProperty("progress")) {
                var error = $root.asmail.DeliveryProgressMsg.verify(message.progress);
                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) {
            if (object instanceof $root.asmail.DeliveryNotificationWithId)
                return object;
            var message = new $root.asmail.DeliveryNotificationWithId();
            if (object.id != null)
                message.id = String(object.id);
            if (object.progress != null) {
                if (typeof object.progress !== "object")
                    throw TypeError(".asmail.DeliveryNotificationWithId.progress: object expected");
                message.progress = $root.asmail.DeliveryProgressMsg.fromObject(object.progress);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.id = "";
                object.progress = null;
            }
            if (message.id != null && message.hasOwnProperty("id"))
                object.id = message.id;
            if (message.progress != null && message.hasOwnProperty("progress"))
                object.progress = $root.asmail.DeliveryProgressMsg.toObject(message.progress, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.File();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                if (typeof message.isNew !== "boolean")
                    return "isNew: boolean expected";
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.File)
                return object;
            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 (typeof object.impl !== "object")
                    throw TypeError(".file.File.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                object.isNew = message.isNew;
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            if (message.isSynced != null && message.hasOwnProperty("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
         */

        /**
         * 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)
                        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;

        /**
         * 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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                $root.file.SyncVersionsBranchMsg.encode(message.synced, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                $root.file.SyncVersionsBranchMsg.encode(message.remote, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                $root.common.BooleanValue.encode(message.existsInSyncedParent, writer.uint32(/* id 5, wireType 2 =*/42).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncStatusMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.state = reader.string();
                        break;
                    }
                case 2: {
                        message.local = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.synced = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.remote = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.existsInSyncedParent = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.state != null && message.hasOwnProperty("state"))
                if (!$util.isString(message.state))
                    return "state: string expected";
            if (message.local != null && message.hasOwnProperty("local")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.local);
                if (error)
                    return "local." + error;
            }
            if (message.synced != null && message.hasOwnProperty("synced")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.synced);
                if (error)
                    return "synced." + error;
            }
            if (message.remote != null && message.hasOwnProperty("remote")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.remote);
                if (error)
                    return "remote." + error;
            }
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent")) {
                var error = $root.common.BooleanValue.verify(message.existsInSyncedParent);
                if (error)
                    return "existsInSyncedParent." + 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) {
            if (object instanceof $root.file.SyncStatusMsg)
                return object;
            var message = new $root.file.SyncStatusMsg();
            if (object.state != null)
                message.state = String(object.state);
            if (object.local != null) {
                if (typeof object.local !== "object")
                    throw TypeError(".file.SyncStatusMsg.local: object expected");
                message.local = $root.file.SyncVersionsBranchMsg.fromObject(object.local);
            }
            if (object.synced != null) {
                if (typeof object.synced !== "object")
                    throw TypeError(".file.SyncStatusMsg.synced: object expected");
                message.synced = $root.file.SyncVersionsBranchMsg.fromObject(object.synced);
            }
            if (object.remote != null) {
                if (typeof object.remote !== "object")
                    throw TypeError(".file.SyncStatusMsg.remote: object expected");
                message.remote = $root.file.SyncVersionsBranchMsg.fromObject(object.remote);
            }
            if (object.existsInSyncedParent != null) {
                if (typeof object.existsInSyncedParent !== "object")
                    throw TypeError(".file.SyncStatusMsg.existsInSyncedParent: object expected");
                message.existsInSyncedParent = $root.common.BooleanValue.fromObject(object.existsInSyncedParent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.state = "";
                object.local = null;
                object.synced = null;
                object.remote = null;
                object.existsInSyncedParent = null;
            }
            if (message.state != null && message.hasOwnProperty("state"))
                object.state = message.state;
            if (message.local != null && message.hasOwnProperty("local"))
                object.local = $root.file.SyncVersionsBranchMsg.toObject(message.local, options);
            if (message.synced != null && message.hasOwnProperty("synced"))
                object.synced = $root.file.SyncVersionsBranchMsg.toObject(message.synced, options);
            if (message.remote != null && message.hasOwnProperty("remote"))
                object.remote = $root.file.SyncVersionsBranchMsg.toObject(message.remote, options);
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent"))
                object.existsInSyncedParent = $root.common.BooleanValue.toObject(message.existsInSyncedParent, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                $root.common.UInt64Value.encode(message.latest, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncVersionsBranchMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.latest = $root.common.UInt64Value.decode(reader, reader.uint32());
                        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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.latest != null && message.hasOwnProperty("latest")) {
                var error = $root.common.UInt64Value.verify(message.latest);
                if (error)
                    return "latest." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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 && message.hasOwnProperty("isArchived")) {
                var error = $root.common.BooleanValue.verify(message.isArchived);
                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) {
            if (object instanceof $root.file.SyncVersionsBranchMsg)
                return object;
            var message = new $root.file.SyncVersionsBranchMsg();
            if (object.latest != null) {
                if (typeof object.latest !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.latest: object expected");
                message.latest = $root.common.UInt64Value.fromObject(object.latest);
            }
            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])).unsigned = 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 (typeof object.isArchived !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.isArchived: object expected");
                message.isArchived = $root.common.BooleanValue.fromObject(object.isArchived);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults) {
                object.latest = null;
                object.isArchived = null;
            }
            if (message.latest != null && message.hasOwnProperty("latest"))
                object.latest = $root.common.UInt64Value.toObject(message.latest, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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 && message.hasOwnProperty("isArchived"))
                object.isArchived = $root.common.BooleanValue.toObject(message.isArchived, options);
            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.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 {file.ISyncStatusMsg|null} [sync] StatsMsg sync
         */

        /**
         * 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)
                        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 sync.
         * @member {file.ISyncStatusMsg|null|undefined} sync
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.sync = 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) {
            if (!writer)
                writer = $Writer.create();
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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()).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.common.UInt64Value.encode(message.mtime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.common.UInt64Value.encode(message.ctime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.sync != null && Object.hasOwnProperty.call(message, "sync"))
                $root.file.SyncStatusMsg.encode(message.sync, writer.uint32(/* id 9, wireType 2 =*/74).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.StatsMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.writable = reader.bool();
                        break;
                    }
                case 5: {
                        message.size = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.mtime = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 7: {
                        message.ctime = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 8: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 9: {
                        message.sync = $root.file.SyncStatusMsg.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                if (error)
                    return "isLink." + error;
            }
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.size != null && message.hasOwnProperty("size")) {
                var error = $root.common.UInt64Value.verify(message.size);
                if (error)
                    return "size." + error;
            }
            if (message.mtime != null && message.hasOwnProperty("mtime")) {
                var error = $root.common.UInt64Value.verify(message.mtime);
                if (error)
                    return "mtime." + error;
            }
            if (message.ctime != null && message.hasOwnProperty("ctime")) {
                var error = $root.common.UInt64Value.verify(message.ctime);
                if (error)
                    return "ctime." + error;
            }
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                if (error)
                    return "version." + error;
            }
            if (message.sync != null && message.hasOwnProperty("sync")) {
                var error = $root.file.SyncStatusMsg.verify(message.sync);
                if (error)
                    return "sync." + 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) {
            if (object instanceof $root.file.StatsMsg)
                return object;
            var message = new $root.file.StatsMsg();
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".file.StatsMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".file.StatsMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".file.StatsMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.size != null) {
                if (typeof object.size !== "object")
                    throw TypeError(".file.StatsMsg.size: object expected");
                message.size = $root.common.UInt64Value.fromObject(object.size);
            }
            if (object.mtime != null) {
                if (typeof object.mtime !== "object")
                    throw TypeError(".file.StatsMsg.mtime: object expected");
                message.mtime = $root.common.UInt64Value.fromObject(object.mtime);
            }
            if (object.ctime != null) {
                if (typeof object.ctime !== "object")
                    throw TypeError(".file.StatsMsg.ctime: object expected");
                message.ctime = $root.common.UInt64Value.fromObject(object.ctime);
            }
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.StatsMsg.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            if (object.sync != null) {
                if (typeof object.sync !== "object")
                    throw TypeError(".file.StatsMsg.sync: object expected");
                message.sync = $root.file.SyncStatusMsg.fromObject(object.sync);
            }
            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) {
            if (!options)
                options = {};
            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.sync = null;
            }
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            if (message.writable != null && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.size != null && message.hasOwnProperty("size"))
                object.size = $root.common.UInt64Value.toObject(message.size, options);
            if (message.mtime != null && message.hasOwnProperty("mtime"))
                object.mtime = $root.common.UInt64Value.toObject(message.mtime, options);
            if (message.ctime != null && message.hasOwnProperty("ctime"))
                object.ctime = $root.common.UInt64Value.toObject(message.ctime, options);
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            if (message.sync != null && message.hasOwnProperty("sync"))
                object.sync = $root.file.SyncStatusMsg.toObject(message.sync, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.GetXAttrRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.xaName = "";
            if (message.xaName != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.XAttrValue)
                return object;
            var message = new $root.file.XAttrValue();
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.XAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.XAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.XAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                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) {
            if (object instanceof $root.file.ReadBytesRequestBody)
                return object;
            var message = new $root.file.ReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.ReadBytesReplyBody)
                return object;
            var message = new $root.file.ReadBytesReplyBody();
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.ReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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.FileEventMsg = (function() {

        /**
         * Properties of a FileEventMsg.
         * @memberof file
         * @interface IFileEventMsg
         * @property {string|null} [type] FileEventMsg type
         * @property {string|null} [path] FileEventMsg path
         * @property {common.IStringValue|null} [src] FileEventMsg src
         * @property {common.IUInt64Value|null} [newVersion] FileEventMsg newVersion
         * @property {common.IUInt64Value|null} [removedArchVer] FileEventMsg removedArchVer
         * @property {common.IUInt64Value|null} [archivedVersion] FileEventMsg archivedVersion
         */

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

        /**
         * FileEventMsg type.
         * @member {string} type
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.type = "";

        /**
         * FileEventMsg path.
         * @member {string} path
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.path = "";

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

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

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

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

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

        /**
         * Encodes the specified FileEventMsg message. Does not implicitly {@link file.FileEventMsg.verify|verify} messages.
         * @function encode
         * @memberof file.FileEventMsg
         * @static
         * @param {file.IFileEventMsg} message FileEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileEventMsg.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.StringValue.encode(message.src, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.removedArchVer != null && Object.hasOwnProperty.call(message, "removedArchVer"))
                $root.common.UInt64Value.encode(message.removedArchVer, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a FileEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileEventMsg} FileEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileEventMsg.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = reader.string();
                        break;
                    }
                case 3: {
                        message.src = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.removedArchVer = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a FileEventMsg message.
         * @function verify
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileEventMsg.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.src != null && message.hasOwnProperty("src")) {
                var error = $root.common.StringValue.verify(message.src);
                if (error)
                    return "src." + error;
            }
            if (message.newVersion != null && message.hasOwnProperty("newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion);
                if (error)
                    return "newVersion." + error;
            }
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer")) {
                var error = $root.common.UInt64Value.verify(message.removedArchVer);
                if (error)
                    return "removedArchVer." + error;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FileEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileEventMsg} FileEventMsg
         */
        FileEventMsg.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileEventMsg)
                return object;
            var message = new $root.file.FileEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null)
                message.path = String(object.path);
            if (object.src != null) {
                if (typeof object.src !== "object")
                    throw TypeError(".file.FileEventMsg.src: object expected");
                message.src = $root.common.StringValue.fromObject(object.src);
            }
            if (object.newVersion != null) {
                if (typeof object.newVersion !== "object")
                    throw TypeError(".file.FileEventMsg.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion);
            }
            if (object.removedArchVer != null) {
                if (typeof object.removedArchVer !== "object")
                    throw TypeError(".file.FileEventMsg.removedArchVer: object expected");
                message.removedArchVer = $root.common.UInt64Value.fromObject(object.removedArchVer);
            }
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.FileEventMsg.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileEventMsg
         * @static
         * @param {file.FileEventMsg} message FileEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileEventMsg.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = "";
                object.src = null;
                object.newVersion = null;
                object.removedArchVer = null;
                object.archivedVersion = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = $root.common.StringValue.toObject(message.src, options);
            if (message.newVersion != null && message.hasOwnProperty("newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options);
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer"))
                object.removedArchVer = $root.common.UInt64Value.toObject(message.removedArchVer, options);
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            return object;
        };

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

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

        return FileEventMsg;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.VersionedReadFlags)
                return object;
            var message = new $root.file.VersionedReadFlags();
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.archivedVersion = null;
                object.remoteVersion = null;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.RequestWithVersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.RequestWithVersionedReadFlags)
                return object;
            var message = new $root.file.RequestWithVersionedReadFlags();
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.RequestWithVersionedReadFlags.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.flags = null;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrRequestBody)
                return object;
            var message = new $root.file.VersionedGetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.flags = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrReplyBody)
                return object;
            var message = new $root.file.VersionedGetXAttrReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.str !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedListXAttrsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedListXAttrsReplyBody)
                return object;
            var message = new $root.file.VersionedListXAttrsReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedReadBytesRequestBody)
                return object;
            var message = new $root.file.VersionedReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedReadBytesReplyBody)
                return object;
            var message = new $root.file.VersionedReadBytesReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadTxtReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadTxtReplyBody)
                return object;
            var message = new $root.file.VersionedReadTxtReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.txt = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadJsonReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadJsonReplyBody)
                return object;
            var message = new $root.file.VersionedReadJsonReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.json = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.src = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("src")) {
                var error = $root.common.ObjectReference.verify(message.src);
                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) {
            if (object instanceof $root.file.VersionedGetByteSourceReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSourceReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.src !== "object")
                    throw TypeError(".file.VersionedGetByteSourceReplyBody.src: object expected");
                message.src = $root.common.ObjectReference.fromObject(object.src);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.src = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("src"))
                object.src = $root.common.ObjectReference.toObject(message.src, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                $root.common.UInt64Value.encode(message.current, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ListVersionsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.current = $root.common.UInt64Value.decode(reader, reader.uint32());
                        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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.current != null && message.hasOwnProperty("current")) {
                var error = $root.common.UInt64Value.verify(message.current);
                if (error)
                    return "current." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.ListVersionsReplyBody)
                return object;
            var message = new $root.file.ListVersionsReplyBody();
            if (object.current != null) {
                if (typeof object.current !== "object")
                    throw TypeError(".file.ListVersionsReplyBody.current: object expected");
                message.current = $root.common.UInt64Value.fromObject(object.current);
            }
            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])).unsigned = 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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults)
                object.current = null;
            if (message.current != null && message.hasOwnProperty("current"))
                object.current = $root.common.UInt64Value.toObject(message.current, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.changes != null && message.hasOwnProperty("changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes);
                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) {
            if (object instanceof $root.file.UpdateXAttrsRequestBody)
                return object;
            var message = new $root.file.UpdateXAttrsRequestBody();
            if (object.changes != null) {
                if (typeof object.changes !== "object")
                    throw TypeError(".file.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.changes = null;
            if (message.changes != null && message.hasOwnProperty("changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.NameAndXAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.NameAndXAttrValue)
                return object;
            var message = new $root.file.NameAndXAttrValue();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.NameAndXAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.NameAndXAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.NameAndXAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrsChanges();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.set && message.set.length))
                            message.set = [];
                        message.set.push($root.file.NameAndXAttrValue.decode(reader, reader.uint32()));
                        break;
                    }
                case 2: {
                        if (!(message.remove && message.remove.length))
                            message.remove = [];
                        message.remove.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.set != null && message.hasOwnProperty("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]);
                    if (error)
                        return "set." + error;
                }
            }
            if (message.remove != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.XAttrsChanges)
                return object;
            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 (typeof object.set[i] !== "object")
                        throw TypeError(".file.XAttrsChanges.set: object expected");
                    message.set[i] = $root.file.NameAndXAttrValue.fromObject(object.set[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteBytesRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteTxtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.txt != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteTxtRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.txt = "";
            if (message.txt != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteJsonRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.json != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteJsonRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.json = "";
            if (message.json != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                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) {
            if (object instanceof $root.file.GetByteSinkRequestBody)
                return object;
            var message = new $root.file.GetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.GetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.truncateFile = null;
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.CopyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.common.ObjectReference.verify(message.file);
                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) {
            if (object instanceof $root.file.CopyRequestBody)
                return object;
            var message = new $root.file.CopyRequestBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".file.CopyRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                if (error)
                    return "truncateFile." + error;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkRequestBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            if (object.currentVersion != null) {
                if (typeof object.currentVersion !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncateFile = null;
                object.currentVersion = null;
            }
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.sink = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("sink")) {
                var error = $root.common.ObjectReference.verify(message.sink);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.sink !== "object")
                    throw TypeError(".file.VersionedGetByteSinkReplyBody.sink: object expected");
                message.sink = $root.common.ObjectReference.fromObject(object.sink);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.sink = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("sink"))
                object.sink = $root.common.ObjectReference.toObject(message.sink, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                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) {
            if (object instanceof $root.file.ArchiveCurrentRequestBody)
                return object;
            var message = new $root.file.ArchiveCurrentRequestBody();
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.version = null;
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskRequestBody)
                return object;
            var message = new $root.file.FileSyncIsOnDiskRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.status != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskReplyBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && message.hasOwnProperty("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.FileSyncDownloadRequestBody = (function() {

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

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

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

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

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

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

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

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

        /**
         * Verifies a FileSyncDownloadRequestBody message.
         * @function verify
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncDownloadRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 FileSyncDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncDownloadRequestBody} FileSyncDownloadRequestBody
         */
        FileSyncDownloadRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileSyncDownloadRequestBody)
                return object;
            var message = new $root.file.FileSyncDownloadRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 FileSyncDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {file.FileSyncDownloadRequestBody} message FileSyncDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncDownloadRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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 FileSyncDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

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

        return FileSyncDownloadRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts);
                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) {
            if (object instanceof $root.file.AdoptRemoteRequestBody)
                return object;
            var message = new $root.file.AdoptRemoteRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                $root.common.BooleanValue.encode(message.dropLocalVer, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToAdopteRemote();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.dropLocalVer = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer")) {
                var error = $root.common.BooleanValue.verify(message.dropLocalVer);
                if (error)
                    return "dropLocalVer." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.OptionsToAdopteRemote)
                return object;
            var message = new $root.file.OptionsToAdopteRemote();
            if (object.dropLocalVer != null) {
                if (typeof object.dropLocalVer !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.dropLocalVer: object expected");
                message.dropLocalVer = $root.common.BooleanValue.fromObject(object.dropLocalVer);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.dropLocalVer = null;
                object.remoteVersion = null;
            }
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer"))
                object.dropLocalVer = $root.common.BooleanValue.toObject(message.dropLocalVer, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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.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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts);
                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) {
            if (object instanceof $root.file.FileSyncUploadRequestBody)
                return object;
            var message = new $root.file.FileSyncUploadRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.FileSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.uploadedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion);
                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) {
            if (object instanceof $root.file.FileSyncUploadReplyBody)
                return object;
            var message = new $root.file.FileSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (typeof object.uploadedVersion !== "object")
                    throw TypeError(".file.FileSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options);
            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.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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToUploadLocal();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.localVersion != null && message.hasOwnProperty("localVersion")) {
                var error = $root.common.UInt64Value.verify(message.localVersion);
                if (error)
                    return "localVersion." + error;
            }
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadVersion);
                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) {
            if (object instanceof $root.file.OptionsToUploadLocal)
                return object;
            var message = new $root.file.OptionsToUploadLocal();
            if (object.localVersion != null) {
                if (typeof object.localVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.localVersion: object expected");
                message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion);
            }
            if (object.uploadVersion != null) {
                if (typeof object.uploadVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.uploadVersion: object expected");
                message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.localVersion = null;
                object.uploadVersion = null;
            }
            if (message.localVersion != null && message.hasOwnProperty("localVersion"))
                object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options);
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion"))
                object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options);
            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;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FS();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FS)
                return object;
            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 (typeof object.impl !== "object")
                    throw TypeError(".fs.FS.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.writable != null && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            if (message.isSynced != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CheckPresenceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.throwIfMissing = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.throwIfMissing != null && message.hasOwnProperty("throwIfMissing")) {
                var error = $root.common.BooleanValue.verify(message.throwIfMissing);
                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) {
            if (object instanceof $root.fs.CheckPresenceRequestBody)
                return object;
            var message = new $root.fs.CheckPresenceRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.throwIfMissing != null) {
                if (typeof object.throwIfMissing !== "object")
                    throw TypeError(".fs.CheckPresenceRequestBody.throwIfMissing: object expected");
                message.throwIfMissing = $root.common.BooleanValue.fromObject(object.throwIfMissing);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.throwIfMissing = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.throwIfMissing != null && message.hasOwnProperty("throwIfMissing"))
                object.throwIfMissing = $root.common.BooleanValue.toObject(message.throwIfMissing, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathOnlyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.PathOnlyRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.path = "";
            if (message.path != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.GetXAttrRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.xaName != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLink();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.readonly = reader.bool();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.readonly != null && message.hasOwnProperty("readonly"))
                if (typeof message.readonly !== "boolean")
                    return "readonly: boolean expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                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) {
            if (object instanceof $root.fs.SymLink)
                return object;
            var message = new $root.fs.SymLink();
            if (object.readonly != null)
                message.readonly = Boolean(object.readonly);
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.SymLink.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.SymLink.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.impl != null) {
                if (typeof object.impl !== "object")
                    throw TypeError(".fs.SymLink.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.readonly = false;
                object.isFile = null;
                object.isFolder = null;
                object.impl = null;
            }
            if (message.readonly != null && message.hasOwnProperty("readonly"))
                object.readonly = message.readonly;
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLinkTargetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.fs = $root.fs.FS.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.file = $root.file.File.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.fs != null && message.hasOwnProperty("fs")) {
                var error = $root.fs.FS.verify(message.fs);
                if (error)
                    return "fs." + error;
            }
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.file.File.verify(message.file);
                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) {
            if (object instanceof $root.fs.SymLinkTargetReplyBody)
                return object;
            var message = new $root.fs.SymLinkTargetReplyBody();
            if (object.fs != null) {
                if (typeof object.fs !== "object")
                    throw TypeError(".fs.SymLinkTargetReplyBody.fs: object expected");
                message.fs = $root.fs.FS.fromObject(object.fs);
            }
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".fs.SymLinkTargetReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.fs = null;
                object.file = null;
            }
            if (message.fs != null && message.hasOwnProperty("fs"))
                object.fs = $root.fs.FS.toObject(message.fs, options);
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.file.File.toObject(message.file, options);
            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.FSEventMsg = (function() {

        /**
         * Properties of a FSEventMsg.
         * @memberof fs
         * @interface IFSEventMsg
         * @property {string|null} [type] FSEventMsg type
         * @property {string|null} [path] FSEventMsg path
         * @property {common.IStringValue|null} [src] FSEventMsg src
         * @property {common.IUInt64Value|null} [newVersion] FSEventMsg newVersion
         * @property {common.IStringValue|null} [name] FSEventMsg name
         * @property {common.IStringValue|null} [oldName] FSEventMsg oldName
         * @property {common.IStringValue|null} [newName] FSEventMsg newName
         * @property {fs.IListingEntryMsg|null} [entry] FSEventMsg entry
         * @property {common.IUInt64Value|null} [moveLabel] FSEventMsg moveLabel
         * @property {common.IUInt64Value|null} [removedArchVer] FSEventMsg removedArchVer
         * @property {common.IUInt64Value|null} [archivedVersion] FSEventMsg archivedVersion
         */

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

        /**
         * FSEventMsg type.
         * @member {string} type
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.type = "";

        /**
         * FSEventMsg path.
         * @member {string} path
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.path = "";

        /**
         * FSEventMsg src.
         * @member {common.IStringValue|null|undefined} src
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.src = null;

        /**
         * FSEventMsg newVersion.
         * @member {common.IUInt64Value|null|undefined} newVersion
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.newVersion = null;

        /**
         * FSEventMsg name.
         * @member {common.IStringValue|null|undefined} name
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.name = null;

        /**
         * FSEventMsg oldName.
         * @member {common.IStringValue|null|undefined} oldName
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.oldName = null;

        /**
         * FSEventMsg newName.
         * @member {common.IStringValue|null|undefined} newName
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.newName = null;

        /**
         * FSEventMsg entry.
         * @member {fs.IListingEntryMsg|null|undefined} entry
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.entry = null;

        /**
         * FSEventMsg moveLabel.
         * @member {common.IUInt64Value|null|undefined} moveLabel
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.moveLabel = null;

        /**
         * FSEventMsg removedArchVer.
         * @member {common.IUInt64Value|null|undefined} removedArchVer
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.removedArchVer = null;

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

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

        /**
         * Encodes the specified FSEventMsg message. Does not implicitly {@link fs.FSEventMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.FSEventMsg
         * @static
         * @param {fs.IFSEventMsg} message FSEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSEventMsg.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.StringValue.encode(message.src, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                $root.common.StringValue.encode(message.name, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.oldName != null && Object.hasOwnProperty.call(message, "oldName"))
                $root.common.StringValue.encode(message.oldName, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.newName != null && Object.hasOwnProperty.call(message, "newName"))
                $root.common.StringValue.encode(message.newName, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.entry != null && Object.hasOwnProperty.call(message, "entry"))
                $root.fs.ListingEntryMsg.encode(message.entry, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.moveLabel != null && Object.hasOwnProperty.call(message, "moveLabel"))
                $root.common.UInt64Value.encode(message.moveLabel, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
            if (message.removedArchVer != null && Object.hasOwnProperty.call(message, "removedArchVer"))
                $root.common.UInt64Value.encode(message.removedArchVer, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a FSEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSEventMsg} FSEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSEventMsg.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = reader.string();
                        break;
                    }
                case 3: {
                        message.src = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.name = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.oldName = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 7: {
                        message.newName = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 8: {
                        message.entry = $root.fs.ListingEntryMsg.decode(reader, reader.uint32());
                        break;
                    }
                case 9: {
                        message.moveLabel = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 10: {
                        message.removedArchVer = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 11: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a FSEventMsg message.
         * @function verify
         * @memberof fs.FSEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSEventMsg.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.src != null && message.hasOwnProperty("src")) {
                var error = $root.common.StringValue.verify(message.src);
                if (error)
                    return "src." + error;
            }
            if (message.newVersion != null && message.hasOwnProperty("newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion);
                if (error)
                    return "newVersion." + error;
            }
            if (message.name != null && message.hasOwnProperty("name")) {
                var error = $root.common.StringValue.verify(message.name);
                if (error)
                    return "name." + error;
            }
            if (message.oldName != null && message.hasOwnProperty("oldName")) {
                var error = $root.common.StringValue.verify(message.oldName);
                if (error)
                    return "oldName." + error;
            }
            if (message.newName != null && message.hasOwnProperty("newName")) {
                var error = $root.common.StringValue.verify(message.newName);
                if (error)
                    return "newName." + error;
            }
            if (message.entry != null && message.hasOwnProperty("entry")) {
                var error = $root.fs.ListingEntryMsg.verify(message.entry);
                if (error)
                    return "entry." + error;
            }
            if (message.moveLabel != null && message.hasOwnProperty("moveLabel")) {
                var error = $root.common.UInt64Value.verify(message.moveLabel);
                if (error)
                    return "moveLabel." + error;
            }
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer")) {
                var error = $root.common.UInt64Value.verify(message.removedArchVer);
                if (error)
                    return "removedArchVer." + error;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FSEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSEventMsg} FSEventMsg
         */
        FSEventMsg.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSEventMsg)
                return object;
            var message = new $root.fs.FSEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null)
                message.path = String(object.path);
            if (object.src != null) {
                if (typeof object.src !== "object")
                    throw TypeError(".fs.FSEventMsg.src: object expected");
                message.src = $root.common.StringValue.fromObject(object.src);
            }
            if (object.newVersion != null) {
                if (typeof object.newVersion !== "object")
                    throw TypeError(".fs.FSEventMsg.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion);
            }
            if (object.name != null) {
                if (typeof object.name !== "object")
                    throw TypeError(".fs.FSEventMsg.name: object expected");
                message.name = $root.common.StringValue.fromObject(object.name);
            }
            if (object.oldName != null) {
                if (typeof object.oldName !== "object")
                    throw TypeError(".fs.FSEventMsg.oldName: object expected");
                message.oldName = $root.common.StringValue.fromObject(object.oldName);
            }
            if (object.newName != null) {
                if (typeof object.newName !== "object")
                    throw TypeError(".fs.FSEventMsg.newName: object expected");
                message.newName = $root.common.StringValue.fromObject(object.newName);
            }
            if (object.entry != null) {
                if (typeof object.entry !== "object")
                    throw TypeError(".fs.FSEventMsg.entry: object expected");
                message.entry = $root.fs.ListingEntryMsg.fromObject(object.entry);
            }
            if (object.moveLabel != null) {
                if (typeof object.moveLabel !== "object")
                    throw TypeError(".fs.FSEventMsg.moveLabel: object expected");
                message.moveLabel = $root.common.UInt64Value.fromObject(object.moveLabel);
            }
            if (object.removedArchVer != null) {
                if (typeof object.removedArchVer !== "object")
                    throw TypeError(".fs.FSEventMsg.removedArchVer: object expected");
                message.removedArchVer = $root.common.UInt64Value.fromObject(object.removedArchVer);
            }
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".fs.FSEventMsg.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSEventMsg
         * @static
         * @param {fs.FSEventMsg} message FSEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSEventMsg.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = "";
                object.src = null;
                object.newVersion = null;
                object.name = null;
                object.oldName = null;
                object.newName = null;
                object.entry = null;
                object.moveLabel = null;
                object.removedArchVer = null;
                object.archivedVersion = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = $root.common.StringValue.toObject(message.src, options);
            if (message.newVersion != null && message.hasOwnProperty("newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options);
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = $root.common.StringValue.toObject(message.name, options);
            if (message.oldName != null && message.hasOwnProperty("oldName"))
                object.oldName = $root.common.StringValue.toObject(message.oldName, options);
            if (message.newName != null && message.hasOwnProperty("newName"))
                object.newName = $root.common.StringValue.toObject(message.newName, options);
            if (message.entry != null && message.hasOwnProperty("entry"))
                object.entry = $root.fs.ListingEntryMsg.toObject(message.entry, options);
            if (message.moveLabel != null && message.hasOwnProperty("moveLabel"))
                object.moveLabel = $root.common.UInt64Value.toObject(message.moveLabel, options);
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer"))
                object.removedArchVer = $root.common.UInt64Value.toObject(message.removedArchVer, options);
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            return object;
        };

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

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

        return FSEventMsg;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WatchTreeRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.depth = $root.common.UInt32Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.depth != null && message.hasOwnProperty("depth")) {
                var error = $root.common.UInt32Value.verify(message.depth);
                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) {
            if (object instanceof $root.fs.WatchTreeRequestBody)
                return object;
            var message = new $root.fs.WatchTreeRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.depth != null) {
                if (typeof object.depth !== "object")
                    throw TypeError(".fs.WatchTreeRequestBody.depth: object expected");
                message.depth = $root.common.UInt32Value.fromObject(object.depth);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.depth = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.depth != null && message.hasOwnProperty("depth"))
                object.depth = $root.common.UInt32Value.toObject(message.depth, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.entries && message.entries.length))
                            message.entries = [];
                        message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.entries != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.ListFolderReplyBody)
                return object;
            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 (typeof object.entries[i] !== "object")
                        throw TypeError(".fs.ListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListingEntryMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                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) {
            if (object instanceof $root.fs.ListingEntryMsg)
                return object;
            var message = new $root.fs.ListingEntryMsg();
            if (object.name != null)
                message.name = String(object.name);
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
            }
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                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) {
            if (object instanceof $root.fs.ReadBytesRequestBody)
                return object;
            var message = new $root.fs.ReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".fs.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".fs.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.criteria = $root.fs.SelectRequestBody.SelectCriteria.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.criteria != null && message.hasOwnProperty("criteria")) {
                var error = $root.fs.SelectRequestBody.SelectCriteria.verify(message.criteria);
                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) {
            if (object instanceof $root.fs.SelectRequestBody)
                return object;
            var message = new $root.fs.SelectRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.criteria != null) {
                if (typeof object.criteria !== "object")
                    throw TypeError(".fs.SelectRequestBody.criteria: object expected");
                message.criteria = $root.fs.SelectRequestBody.SelectCriteria.fromObject(object.criteria);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.criteria = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.criteria != null && message.hasOwnProperty("criteria"))
                object.criteria = $root.fs.SelectRequestBody.SelectCriteria.toObject(message.criteria, options);
            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    $root.common.StringValue.encode(message.exactName, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    $root.common.StringValue.encode(message.pattern, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    $root.common.StringValue.encode(message.regexp, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody.SelectCriteria();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.exactName = $root.common.StringValue.decode(reader, reader.uint32());
                            break;
                        }
                    case 2: {
                            message.pattern = $root.common.StringValue.decode(reader, reader.uint32());
                            break;
                        }
                    case 3: {
                            message.regexp = $root.common.StringValue.decode(reader, reader.uint32());
                            break;
                        }
                    case 4: {
                            message.depth = $root.common.UInt32Value.decode(reader, reader.uint32());
                            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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.exactName != null && message.hasOwnProperty("exactName")) {
                    var error = $root.common.StringValue.verify(message.exactName);
                    if (error)
                        return "exactName." + error;
                }
                if (message.pattern != null && message.hasOwnProperty("pattern")) {
                    var error = $root.common.StringValue.verify(message.pattern);
                    if (error)
                        return "pattern." + error;
                }
                if (message.regexp != null && message.hasOwnProperty("regexp")) {
                    var error = $root.common.StringValue.verify(message.regexp);
                    if (error)
                        return "regexp." + error;
                }
                if (message.depth != null && message.hasOwnProperty("depth")) {
                    var error = $root.common.UInt32Value.verify(message.depth);
                    if (error)
                        return "depth." + error;
                }
                if (message.type != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
                if (object instanceof $root.fs.SelectRequestBody.SelectCriteria)
                    return object;
                var message = new $root.fs.SelectRequestBody.SelectCriteria();
                if (object.exactName != null) {
                    if (typeof object.exactName !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.exactName: object expected");
                    message.exactName = $root.common.StringValue.fromObject(object.exactName);
                }
                if (object.pattern != null) {
                    if (typeof object.pattern !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.pattern: object expected");
                    message.pattern = $root.common.StringValue.fromObject(object.pattern);
                }
                if (object.regexp != null) {
                    if (typeof object.regexp !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.regexp: object expected");
                    message.regexp = $root.common.StringValue.fromObject(object.regexp);
                }
                if (object.depth != null) {
                    if (typeof object.depth !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.depth: object expected");
                    message.depth = $root.common.UInt32Value.fromObject(object.depth);
                }
                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) {
                if (!options)
                    options = {};
                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 && message.hasOwnProperty("exactName"))
                    object.exactName = $root.common.StringValue.toObject(message.exactName, options);
                if (message.pattern != null && message.hasOwnProperty("pattern"))
                    object.pattern = $root.common.StringValue.toObject(message.pattern, options);
                if (message.regexp != null && message.hasOwnProperty("regexp"))
                    object.regexp = $root.common.StringValue.toObject(message.regexp, options);
                if (message.depth != null && message.hasOwnProperty("depth"))
                    object.depth = $root.common.UInt32Value.toObject(message.depth, options);
                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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            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) {
            if (object instanceof $root.fs.FSCGetRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.name = "";
            if (message.name != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.FSCGetReplyBody)
                return object;
            var message = new $root.fs.FSCGetReplyBody();
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.FSCGetReplyBody.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.item = null;
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                $root.common.BooleanValue.encode(message.isCollection, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.isCollection = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.item = $root.fs.FSItem.Item.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.location = $root.fs.FSItem.Location.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                if (error)
                    return "isLink." + error;
            }
            if (message.isCollection != null && message.hasOwnProperty("isCollection")) {
                var error = $root.common.BooleanValue.verify(message.isCollection);
                if (error)
                    return "isCollection." + error;
            }
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.Item.verify(message.item);
                if (error)
                    return "item." + error;
            }
            if (message.location != null && message.hasOwnProperty("location")) {
                var error = $root.fs.FSItem.Location.verify(message.location);
                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) {
            if (object instanceof $root.fs.FSItem)
                return object;
            var message = new $root.fs.FSItem();
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.FSItem.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.FSItem.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".fs.FSItem.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            if (object.isCollection != null) {
                if (typeof object.isCollection !== "object")
                    throw TypeError(".fs.FSItem.isCollection: object expected");
                message.isCollection = $root.common.BooleanValue.fromObject(object.isCollection);
            }
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.FSItem.item: object expected");
                message.item = $root.fs.FSItem.Item.fromObject(object.item);
            }
            if (object.location != null) {
                if (typeof object.location !== "object")
                    throw TypeError(".fs.FSItem.location: object expected");
                message.location = $root.fs.FSItem.Location.fromObject(object.location);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            if (message.isCollection != null && message.hasOwnProperty("isCollection"))
                object.isCollection = $root.common.BooleanValue.toObject(message.isCollection, options);
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.Item.toObject(message.item, options);
            if (message.location != null && message.hasOwnProperty("location"))
                object.location = $root.fs.FSItem.Location.toObject(message.location, options);
            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Location();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32());
                            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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.fs != null && message.hasOwnProperty("fs")) {
                    var error = $root.fs.FS.verify(message.fs);
                    if (error)
                        return "fs." + error;
                }
                if (message.path != null && message.hasOwnProperty("path"))
                    if (!$util.isString(message.path))
                        return "path: string expected";
                if (message.storageUse != null && message.hasOwnProperty("storageUse"))
                    if (!$util.isString(message.storageUse))
                        return "storageUse: string expected";
                if (message.storageType != null && message.hasOwnProperty("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) {
                if (object instanceof $root.fs.FSItem.Location)
                    return object;
                var message = new $root.fs.FSItem.Location();
                if (object.fs != null) {
                    if (typeof object.fs !== "object")
                        throw TypeError(".fs.FSItem.Location.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.path = "";
                    object.storageUse = "";
                    object.storageType = "";
                }
                if (message.fs != null && message.hasOwnProperty("fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options);
                if (message.path != null && message.hasOwnProperty("path"))
                    object.path = message.path;
                if (message.storageUse != null && message.hasOwnProperty("storageUse"))
                    object.storageUse = message.storageUse;
                if (message.storageType != null && message.hasOwnProperty("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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    $root.common.ObjectReference.encode(message.collection, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Item();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32());
                            break;
                        }
                    case 2: {
                            message.file = $root.file.File.decode(reader, reader.uint32());
                            break;
                        }
                    case 3: {
                            message.collection = $root.common.ObjectReference.decode(reader, reader.uint32());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.fs != null && message.hasOwnProperty("fs")) {
                    var error = $root.fs.FS.verify(message.fs);
                    if (error)
                        return "fs." + error;
                }
                if (message.file != null && message.hasOwnProperty("file")) {
                    var error = $root.file.File.verify(message.file);
                    if (error)
                        return "file." + error;
                }
                if (message.collection != null && message.hasOwnProperty("collection")) {
                    var error = $root.common.ObjectReference.verify(message.collection);
                    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) {
                if (object instanceof $root.fs.FSItem.Item)
                    return object;
                var message = new $root.fs.FSItem.Item();
                if (object.fs != null) {
                    if (typeof object.fs !== "object")
                        throw TypeError(".fs.FSItem.Item.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs);
                }
                if (object.file != null) {
                    if (typeof object.file !== "object")
                        throw TypeError(".fs.FSItem.Item.file: object expected");
                    message.file = $root.file.File.fromObject(object.file);
                }
                if (object.collection != null) {
                    if (typeof object.collection !== "object")
                        throw TypeError(".fs.FSItem.Item.collection: object expected");
                    message.collection = $root.common.ObjectReference.fromObject(object.collection);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.file = null;
                    object.collection = null;
                }
                if (message.fs != null && message.hasOwnProperty("fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options);
                if (message.file != null && message.hasOwnProperty("file"))
                    object.file = $root.file.File.toObject(message.file, options);
                if (message.collection != null && message.hasOwnProperty("collection"))
                    object.collection = $root.common.ObjectReference.toObject(message.collection, options);
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetAllReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.items && message.items.length))
                            message.items = [];
                        message.items.push($root.fs.NameAndItem.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.items != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.FSCGetAllReplyBody)
                return object;
            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 (typeof object.items[i] !== "object")
                        throw TypeError(".fs.FSCGetAllReplyBody.items: object expected");
                    message.items[i] = $root.fs.NameAndItem.fromObject(object.items[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.NameAndItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.NameAndItem)
                return object;
            var message = new $root.fs.NameAndItem();
            if (object.name != null)
                message.name = String(object.name);
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.NameAndItem.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.item = null;
            }
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                $root.common.BooleanValue.encode(message.done, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                $root.fs.NameAndItem.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.IterResMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.done = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.value = $root.fs.NameAndItem.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.done != null && message.hasOwnProperty("done")) {
                var error = $root.common.BooleanValue.verify(message.done);
                if (error)
                    return "done." + error;
            }
            if (message.value != null && message.hasOwnProperty("value")) {
                var error = $root.fs.NameAndItem.verify(message.value);
                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) {
            if (object instanceof $root.fs.IterResMsg)
                return object;
            var message = new $root.fs.IterResMsg();
            if (object.done != null) {
                if (typeof object.done !== "object")
                    throw TypeError(".fs.IterResMsg.done: object expected");
                message.done = $root.common.BooleanValue.fromObject(object.done);
            }
            if (object.value != null) {
                if (typeof object.value !== "object")
                    throw TypeError(".fs.IterResMsg.value: object expected");
                message.value = $root.fs.NameAndItem.fromObject(object.value);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.done = null;
                object.value = null;
            }
            if (message.done != null && message.hasOwnProperty("done"))
                object.done = $root.common.BooleanValue.toObject(message.done, options);
            if (message.value != null && message.hasOwnProperty("value"))
                object.value = $root.fs.NameAndItem.toObject(message.value, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CollectionEvent();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path")) {
                var error = $root.common.StringValue.verify(message.path);
                if (error)
                    return "path." + error;
            }
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.CollectionEvent)
                return object;
            var message = new $root.fs.CollectionEvent();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (typeof object.path !== "object")
                    throw TypeError(".fs.CollectionEvent.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path);
            }
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.CollectionEvent.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
                object.item = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = $root.common.StringValue.toObject(message.path, options);
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedGetXAttrRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndFlagsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.PathAndFlagsRequestBody)
                return object;
            var message = new $root.fs.PathAndFlagsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.PathAndFlagsRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.VersionedListFolderReplyBody)
                return object;
            var message = new $root.fs.VersionedListFolderReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.entries[i] !== "object")
                        throw TypeError(".fs.VersionedListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
            }
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedReadBytesRequestBody)
                return object;
            var message = new $root.fs.VersionedReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.changes != null && message.hasOwnProperty("changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes);
                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) {
            if (object instanceof $root.fs.UpdateXAttrsRequestBody)
                return object;
            var message = new $root.fs.UpdateXAttrsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.changes != null) {
                if (typeof object.changes !== "object")
                    throw TypeError(".fs.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.changes = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.changes != null && message.hasOwnProperty("changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MakeFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                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) {
            if (object instanceof $root.fs.MakeFolderRequestBody)
                return object;
            var message = new $root.fs.MakeFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.MakeFolderRequestBody.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.exclusive = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DeleteFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.removeContent = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.removeContent != null && message.hasOwnProperty("removeContent")) {
                var error = $root.common.BooleanValue.verify(message.removeContent);
                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) {
            if (object instanceof $root.fs.DeleteFolderRequestBody)
                return object;
            var message = new $root.fs.DeleteFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.removeContent != null) {
                if (typeof object.removeContent !== "object")
                    throw TypeError(".fs.DeleteFolderRequestBody.removeContent: object expected");
                message.removeContent = $root.common.BooleanValue.fromObject(object.removeContent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.removeContent = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.removeContent != null && message.hasOwnProperty("removeContent"))
                object.removeContent = $root.common.BooleanValue.toObject(message.removeContent, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MoveRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.MoveRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && message.hasOwnProperty("overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite);
                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) {
            if (object instanceof $root.fs.CopyFileRequestBody)
                return object;
            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 (typeof object.overwrite !== "object")
                    throw TypeError(".fs.CopyFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.overwrite = null;
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.overwrite != null && message.hasOwnProperty("overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite);
                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) {
            if (object instanceof $root.fs.CopyFolderRequestBody)
                return object;
            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 (typeof object.mergeAndOverwrite !== "object")
                    throw TypeError(".fs.CopyFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.common.ObjectReference.verify(message.file);
                if (error)
                    return "file." + error;
            }
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && message.hasOwnProperty("overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite);
                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) {
            if (object instanceof $root.fs.SaveFileRequestBody)
                return object;
            var message = new $root.fs.SaveFileRequestBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".fs.SaveFileRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (typeof object.overwrite !== "object")
                    throw TypeError(".fs.SaveFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.file = null;
                object.dst = "";
                object.overwrite = null;
            }
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options);
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.overwrite != null && message.hasOwnProperty("overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.common.ObjectReference.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.folder = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.folder != null && message.hasOwnProperty("folder")) {
                var error = $root.common.ObjectReference.verify(message.folder);
                if (error)
                    return "folder." + error;
            }
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite);
                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) {
            if (object instanceof $root.fs.SaveFolderRequestBody)
                return object;
            var message = new $root.fs.SaveFolderRequestBody();
            if (object.folder != null) {
                if (typeof object.folder !== "object")
                    throw TypeError(".fs.SaveFolderRequestBody.folder: object expected");
                message.folder = $root.common.ObjectReference.fromObject(object.folder);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (typeof object.mergeAndOverwrite !== "object")
                    throw TypeError(".fs.SaveFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.folder = null;
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.folder != null && message.hasOwnProperty("folder"))
                object.folder = $root.common.ObjectReference.toObject(message.folder, options);
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.LinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.target = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.target != null && message.hasOwnProperty("target")) {
                var error = $root.common.ObjectReference.verify(message.target);
                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) {
            if (object instanceof $root.fs.LinkRequestBody)
                return object;
            var message = new $root.fs.LinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.target != null) {
                if (typeof object.target !== "object")
                    throw TypeError(".fs.LinkRequestBody.target: object expected");
                message.target = $root.common.ObjectReference.fromObject(object.target);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.target = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.target != null && message.hasOwnProperty("target"))
                object.target = $root.common.ObjectReference.toObject(message.target, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndOptFileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.PathAndOptFileFlags)
                return object;
            var message = new $root.fs.PathAndOptFileFlags();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.PathAndOptFileFlags.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncate != null && message.hasOwnProperty("truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && message.hasOwnProperty("create")) {
                var error = $root.common.BooleanValue.verify(message.create);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                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) {
            if (object instanceof $root.fs.FileFlags)
                return object;
            var message = new $root.fs.FileFlags();
            if (object.truncate != null) {
                if (typeof object.truncate !== "object")
                    throw TypeError(".fs.FileFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate);
            }
            if (object.create != null) {
                if (typeof object.create !== "object")
                    throw TypeError(".fs.FileFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create);
            }
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.FileFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
            }
            if (message.truncate != null && message.hasOwnProperty("truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options);
            if (message.create != null && message.hasOwnProperty("create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options);
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && message.hasOwnProperty("json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteJsonFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = message.json;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && message.hasOwnProperty("txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteTxtFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.txt != null && message.hasOwnProperty("txt"))
                object.txt = message.txt;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteBytesRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.bytes != null && message.hasOwnProperty("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 && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && message.hasOwnProperty("json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteJsonFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = message.json;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedFileWriteFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 10: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncate != null && message.hasOwnProperty("truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && message.hasOwnProperty("create")) {
                var error = $root.common.BooleanValue.verify(message.create);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                if (error)
                    return "exclusive." + error;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion);
                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) {
            if (object instanceof $root.fs.VersionedFileWriteFlags)
                return object;
            var message = new $root.fs.VersionedFileWriteFlags();
            if (object.truncate != null) {
                if (typeof object.truncate !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate);
            }
            if (object.create != null) {
                if (typeof object.create !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create);
            }
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            if (object.currentVersion != null) {
                if (typeof object.currentVersion !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
                object.currentVersion = null;
            }
            if (message.truncate != null && message.hasOwnProperty("truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options);
            if (message.create != null && message.hasOwnProperty("create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options);
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && message.hasOwnProperty("txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteTxtFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.txt != null && message.hasOwnProperty("txt"))
                object.txt = message.txt;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteBytesRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.bytes != null && message.hasOwnProperty("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 && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedGetByteSinkRequestBody)
                return object;
            var message = new $root.fs.VersionedGetByteSinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedGetByteSinkRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                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) {
            if (object instanceof $root.fs.ArchiveCurrentRequestBody)
                return object;
            var message = new $root.fs.ArchiveCurrentRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".fs.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.version = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            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.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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FSSyncIsOnDiskRequestBody)
                return object;
            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)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.status != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FSSyncIsOnDiskReplyBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && message.hasOwnProperty("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.FSSyncDownloadRequestBody = (function() {

        /**
         * Properties of a FSSyncDownloadRequestBody.
         * @memberof fs
         * @interface IFSSyncDownloadRequestBody
         * @property {string|null} [path] FSSyncDownloadRequestBody path
         * @property {number|Long|null} [version] FSSyncDownloadRequestBody version
         */

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

        /**
         * FSSyncDownloadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncDownloadRequestBody
         * @instance
         */
        FSSyncDownloadRequestBody.prototype.path = "";

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

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

        /**
         * Encodes the specified FSSyncDownloadRequestBody message. Does not implicitly {@link fs.FSSyncDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.IFSSyncDownloadRequestBody} message FSSyncDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncDownloadRequestBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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 FSSyncDownloadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.IFSSyncDownloadRequestBody} message FSSyncDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

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

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

        /**
         * Verifies a FSSyncDownloadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncDownloadRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("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 FSSyncDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncDownloadRequestBody} FSSyncDownloadRequestBody
         */
        FSSyncDownloadRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSSyncDownloadRequestBody)
                return object;
            var message = new $root.fs.FSSyncDownloadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 FSSyncDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.FSSyncDownloadRequestBody} message FSSyncDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncDownloadRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                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 FSSyncDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

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

        return FSSyncDownloadRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts);
                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) {
            if (object instanceof $root.fs.AdoptRemoteRequestBody)
                return object;
            var message = new $root.fs.AdoptRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".fs.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options);
            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.DiffCurrentAndRemoteRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteRequestBody path
         * @property {common.IUInt64Value|null} [remoteVersion] DiffCurrentAndRemoteRequestBody remoteVersion
         */

        /**
         * Constructs a new DiffCurrentAndRemoteRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteRequestBody.
         * @implements IDiffCurrentAndRemoteRequestBody
         * @constructor
         * @param {fs.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)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @instance
         */
        DiffCurrentAndRemoteRequestBody.prototype.path = "";

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

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

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.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).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.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 fs.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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         */
        DiffCurrentAndRemoteRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteRequestBody)
                return object;
            var message = new $root.fs.DiffCurrentAndRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".fs.DiffCurrentAndRemoteRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteVersion = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof fs.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 fs.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 + "/fs.DiffCurrentAndRemoteRequestBody";
        };

        return DiffCurrentAndRemoteRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.fs.FolderDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.diff = $root.fs.FolderDiff.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.diff != null && message.hasOwnProperty("diff")) {
                var error = $root.fs.FolderDiff.verify(message.diff);
                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) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteReplyBody)
                return object;
            var message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (typeof object.diff !== "object")
                    throw TypeError(".fs.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.fs.FolderDiff.fromObject(object.diff);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && message.hasOwnProperty("diff"))
                object.diff = $root.fs.FolderDiff.toObject(message.diff, options);
            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 {common.IUInt64Value|null} [remoteVersion] FolderDiff remoteVersion
         * @property {Array.<fs.IListingEntryMsg>|null} [inCurrent] FolderDiff inCurrent
         * @property {Array.<fs.IListingEntryMsg>|null} [inRemote] FolderDiff inRemote
         * @property {Array.<string>|null} [nameOverlaps] FolderDiff nameOverlaps
         * @property {fs.FolderDiff.ITimeStamps|null} [ctime] FolderDiff ctime
         * @property {fs.FolderDiff.ITimeStamps|null} [mtime] FolderDiff mtime
         * @property {fs.FolderDiff.IXAttrs|null} [xattrs] FolderDiff xattrs
         */

        /**
         * Constructs a new FolderDiff.
         * @memberof fs
         * @classdesc Represents a FolderDiff.
         * @implements IFolderDiff
         * @constructor
         * @param {fs.IFolderDiff=} [properties] Properties to set
         */
        function FolderDiff(properties) {
            this.inCurrent = [];
            this.inRemote = [];
            this.nameOverlaps = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

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

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

        /**
         * FolderDiff inCurrent.
         * @member {Array.<fs.IListingEntryMsg>} inCurrent
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.inCurrent = $util.emptyArray;

        /**
         * FolderDiff inRemote.
         * @member {Array.<fs.IListingEntryMsg>} inRemote
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.inRemote = $util.emptyArray;

        /**
         * FolderDiff nameOverlaps.
         * @member {Array.<string>} nameOverlaps
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.nameOverlaps = $util.emptyArray;

        /**
         * FolderDiff ctime.
         * @member {fs.FolderDiff.ITimeStamps|null|undefined} ctime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.ctime = null;

        /**
         * FolderDiff mtime.
         * @member {fs.FolderDiff.ITimeStamps|null|undefined} mtime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.mtime = null;

        /**
         * FolderDiff xattrs.
         * @member {fs.FolderDiff.IXAttrs|null|undefined} xattrs
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.xattrs = null;

        /**
         * 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) {
            if (!writer)
                writer = $Writer.create();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.inCurrent != null && message.inCurrent.length)
                for (var i = 0; i < message.inCurrent.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.inCurrent[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.inRemote != null && message.inRemote.length)
                for (var i = 0; i < message.inRemote.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.inRemote[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.nameOverlaps != null && message.nameOverlaps.length)
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    writer.uint32(/* id 5, wireType 2 =*/42).string(message.nameOverlaps[i]);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.fs.FolderDiff.TimeStamps.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.fs.FolderDiff.TimeStamps.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs"))
                $root.fs.FolderDiff.XAttrs.encode(message.xattrs, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.currentVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        if (!(message.inCurrent && message.inCurrent.length))
                            message.inCurrent = [];
                        message.inCurrent.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                        break;
                    }
                case 4: {
                        if (!(message.inRemote && message.inRemote.length))
                            message.inRemote = [];
                        message.inRemote.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                        break;
                    }
                case 5: {
                        if (!(message.nameOverlaps && message.nameOverlaps.length))
                            message.nameOverlaps = [];
                        message.nameOverlaps.push(reader.string());
                        break;
                    }
                case 6: {
                        message.ctime = $root.fs.FolderDiff.TimeStamps.decode(reader, reader.uint32());
                        break;
                    }
                case 7: {
                        message.mtime = $root.fs.FolderDiff.TimeStamps.decode(reader, reader.uint32());
                        break;
                    }
                case 8: {
                        message.xattrs = $root.fs.FolderDiff.XAttrs.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.currentVersion != null && message.hasOwnProperty("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.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.inCurrent != null && message.hasOwnProperty("inCurrent")) {
                if (!Array.isArray(message.inCurrent))
                    return "inCurrent: array expected";
                for (var i = 0; i < message.inCurrent.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.inCurrent[i]);
                    if (error)
                        return "inCurrent." + error;
                }
            }
            if (message.inRemote != null && message.hasOwnProperty("inRemote")) {
                if (!Array.isArray(message.inRemote))
                    return "inRemote: array expected";
                for (var i = 0; i < message.inRemote.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.inRemote[i]);
                    if (error)
                        return "inRemote." + error;
                }
            }
            if (message.nameOverlaps != null && message.hasOwnProperty("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";
            }
            if (message.ctime != null && message.hasOwnProperty("ctime")) {
                var error = $root.fs.FolderDiff.TimeStamps.verify(message.ctime);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && message.hasOwnProperty("mtime")) {
                var error = $root.fs.FolderDiff.TimeStamps.verify(message.mtime);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && message.hasOwnProperty("xattrs")) {
                var error = $root.fs.FolderDiff.XAttrs.verify(message.xattrs);
                if (error)
                    return "xattrs." + error;
            }
            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) {
            if (object instanceof $root.fs.FolderDiff)
                return object;
            var message = new $root.fs.FolderDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    (message.currentVersion = $util.Long.fromValue(object.currentVersion)).unsigned = 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.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".fs.FolderDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            if (object.inCurrent) {
                if (!Array.isArray(object.inCurrent))
                    throw TypeError(".fs.FolderDiff.inCurrent: array expected");
                message.inCurrent = [];
                for (var i = 0; i < object.inCurrent.length; ++i) {
                    if (typeof object.inCurrent[i] !== "object")
                        throw TypeError(".fs.FolderDiff.inCurrent: object expected");
                    message.inCurrent[i] = $root.fs.ListingEntryMsg.fromObject(object.inCurrent[i]);
                }
            }
            if (object.inRemote) {
                if (!Array.isArray(object.inRemote))
                    throw TypeError(".fs.FolderDiff.inRemote: array expected");
                message.inRemote = [];
                for (var i = 0; i < object.inRemote.length; ++i) {
                    if (typeof object.inRemote[i] !== "object")
                        throw TypeError(".fs.FolderDiff.inRemote: object expected");
                    message.inRemote[i] = $root.fs.ListingEntryMsg.fromObject(object.inRemote[i]);
                }
            }
            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]);
            }
            if (object.ctime != null) {
                if (typeof object.ctime !== "object")
                    throw TypeError(".fs.FolderDiff.ctime: object expected");
                message.ctime = $root.fs.FolderDiff.TimeStamps.fromObject(object.ctime);
            }
            if (object.mtime != null) {
                if (typeof object.mtime !== "object")
                    throw TypeError(".fs.FolderDiff.mtime: object expected");
                message.mtime = $root.fs.FolderDiff.TimeStamps.fromObject(object.mtime);
            }
            if (object.xattrs != null) {
                if (typeof object.xattrs !== "object")
                    throw TypeError(".fs.FolderDiff.xattrs: object expected");
                message.xattrs = $root.fs.FolderDiff.XAttrs.fromObject(object.xattrs);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults) {
                object.inCurrent = [];
                object.inRemote = [];
                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() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : 0;
                object.remoteVersion = null;
                object.ctime = null;
                object.mtime = null;
                object.xattrs = null;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                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.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            if (message.inCurrent && message.inCurrent.length) {
                object.inCurrent = [];
                for (var j = 0; j < message.inCurrent.length; ++j)
                    object.inCurrent[j] = $root.fs.ListingEntryMsg.toObject(message.inCurrent[j], options);
            }
            if (message.inRemote && message.inRemote.length) {
                object.inRemote = [];
                for (var j = 0; j < message.inRemote.length; ++j)
                    object.inRemote[j] = $root.fs.ListingEntryMsg.toObject(message.inRemote[j], options);
            }
            if (message.nameOverlaps && message.nameOverlaps.length) {
                object.nameOverlaps = [];
                for (var j = 0; j < message.nameOverlaps.length; ++j)
                    object.nameOverlaps[j] = message.nameOverlaps[j];
            }
            if (message.ctime != null && message.hasOwnProperty("ctime"))
                object.ctime = $root.fs.FolderDiff.TimeStamps.toObject(message.ctime, options);
            if (message.mtime != null && message.hasOwnProperty("mtime"))
                object.mtime = $root.fs.FolderDiff.TimeStamps.toObject(message.mtime, options);
            if (message.xattrs != null && message.hasOwnProperty("xattrs"))
                object.xattrs = $root.fs.FolderDiff.XAttrs.toObject(message.xattrs, options);
            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.TimeStamps = (function() {

            /**
             * Properties of a TimeStamps.
             * @memberof fs.FolderDiff
             * @interface ITimeStamps
             * @property {number|Long|null} [current] TimeStamps current
             * @property {common.IUInt64Value|null} [remote] TimeStamps remote
             */

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

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

            /**
             * TimeStamps remote.
             * @member {common.IUInt64Value|null|undefined} remote
             * @memberof fs.FolderDiff.TimeStamps
             * @instance
             */
            TimeStamps.prototype.remote = null;

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

            /**
             * Encodes the specified TimeStamps message. Does not implicitly {@link fs.FolderDiff.TimeStamps.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.ITimeStamps} message TimeStamps message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TimeStamps.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                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"))
                    $root.common.UInt64Value.encode(message.remote, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                return writer;
            };

            /**
             * Encodes the specified TimeStamps message, length delimited. Does not implicitly {@link fs.FolderDiff.TimeStamps.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.ITimeStamps} message TimeStamps message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TimeStamps.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

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

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

            /**
             * Verifies a TimeStamps message.
             * @function verify
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            TimeStamps.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.current != null && message.hasOwnProperty("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 && message.hasOwnProperty("remote")) {
                    var error = $root.common.UInt64Value.verify(message.remote);
                    if (error)
                        return "remote." + error;
                }
                return null;
            };

            /**
             * Creates a TimeStamps message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.TimeStamps} TimeStamps
             */
            TimeStamps.fromObject = function fromObject(object) {
                if (object instanceof $root.fs.FolderDiff.TimeStamps)
                    return object;
                var message = new $root.fs.FolderDiff.TimeStamps();
                if (object.current != null)
                    if ($util.Long)
                        (message.current = $util.Long.fromValue(object.current)).unsigned = 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 (typeof object.remote !== "object")
                        throw TypeError(".fs.FolderDiff.TimeStamps.remote: object expected");
                    message.remote = $root.common.UInt64Value.fromObject(object.remote);
                }
                return message;
            };

            /**
             * Creates a plain object from a TimeStamps message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.TimeStamps} message TimeStamps
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            TimeStamps.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                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() : long;
                    } else
                        object.current = options.longs === String ? "0" : 0;
                    object.remote = null;
                }
                if (message.current != null && message.hasOwnProperty("current"))
                    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 && message.hasOwnProperty("remote"))
                    object.remote = $root.common.UInt64Value.toObject(message.remote, options);
                return object;
            };

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

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

            return TimeStamps;
        })();

        FolderDiff.XAttrs = (function() {

            /**
             * Properties of a XAttrs.
             * @memberof fs.FolderDiff
             * @interface IXAttrs
             * @property {Array.<file.INameAndXAttrValue>|null} [inCurrent] XAttrs inCurrent
             * @property {Array.<file.INameAndXAttrValue>|null} [inRemote] XAttrs inRemote
             * @property {Array.<string>|null} [nameOverlaps] XAttrs nameOverlaps
             */

            /**
             * Constructs a new XAttrs.
             * @memberof fs.FolderDiff
             * @classdesc Represents a XAttrs.
             * @implements IXAttrs
             * @constructor
             * @param {fs.FolderDiff.IXAttrs=} [properties] Properties to set
             */
            function XAttrs(properties) {
                this.inCurrent = [];
                this.inRemote = [];
                this.nameOverlaps = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * XAttrs inCurrent.
             * @member {Array.<file.INameAndXAttrValue>} inCurrent
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.inCurrent = $util.emptyArray;

            /**
             * XAttrs inRemote.
             * @member {Array.<file.INameAndXAttrValue>} inRemote
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.inRemote = $util.emptyArray;

            /**
             * XAttrs nameOverlaps.
             * @member {Array.<string>} nameOverlaps
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.nameOverlaps = $util.emptyArray;

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

            /**
             * Encodes the specified XAttrs message. Does not implicitly {@link fs.FolderDiff.XAttrs.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.IXAttrs} message XAttrs message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            XAttrs.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.inCurrent != null && message.inCurrent.length)
                    for (var i = 0; i < message.inCurrent.length; ++i)
                        $root.file.NameAndXAttrValue.encode(message.inCurrent[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.inRemote != null && message.inRemote.length)
                    for (var i = 0; i < message.inRemote.length; ++i)
                        $root.file.NameAndXAttrValue.encode(message.inRemote[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.nameOverlaps != null && message.nameOverlaps.length)
                    for (var i = 0; i < message.nameOverlaps.length; ++i)
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.nameOverlaps[i]);
                return writer;
            };

            /**
             * Encodes the specified XAttrs message, length delimited. Does not implicitly {@link fs.FolderDiff.XAttrs.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.IXAttrs} message XAttrs message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            XAttrs.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

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

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

            /**
             * Verifies a XAttrs message.
             * @function verify
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            XAttrs.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.inCurrent != null && message.hasOwnProperty("inCurrent")) {
                    if (!Array.isArray(message.inCurrent))
                        return "inCurrent: array expected";
                    for (var i = 0; i < message.inCurrent.length; ++i) {
                        var error = $root.file.NameAndXAttrValue.verify(message.inCurrent[i]);
                        if (error)
                            return "inCurrent." + error;
                    }
                }
                if (message.inRemote != null && message.hasOwnProperty("inRemote")) {
                    if (!Array.isArray(message.inRemote))
                        return "inRemote: array expected";
                    for (var i = 0; i < message.inRemote.length; ++i) {
                        var error = $root.file.NameAndXAttrValue.verify(message.inRemote[i]);
                        if (error)
                            return "inRemote." + error;
                    }
                }
                if (message.nameOverlaps != null && message.hasOwnProperty("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 XAttrs message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.XAttrs} XAttrs
             */
            XAttrs.fromObject = function fromObject(object) {
                if (object instanceof $root.fs.FolderDiff.XAttrs)
                    return object;
                var message = new $root.fs.FolderDiff.XAttrs();
                if (object.inCurrent) {
                    if (!Array.isArray(object.inCurrent))
                        throw TypeError(".fs.FolderDiff.XAttrs.inCurrent: array expected");
                    message.inCurrent = [];
                    for (var i = 0; i < object.inCurrent.length; ++i) {
                        if (typeof object.inCurrent[i] !== "object")
                            throw TypeError(".fs.FolderDiff.XAttrs.inCurrent: object expected");
                        message.inCurrent[i] = $root.file.NameAndXAttrValue.fromObject(object.inCurrent[i]);
                    }
                }
                if (object.inRemote) {
                    if (!Array.isArray(object.inRemote))
                        throw TypeError(".fs.FolderDiff.XAttrs.inRemote: array expected");
                    message.inRemote = [];
                    for (var i = 0; i < object.inRemote.length; ++i) {
                        if (typeof object.inRemote[i] !== "object")
                            throw TypeError(".fs.FolderDiff.XAttrs.inRemote: object expected");
                        message.inRemote[i] = $root.file.NameAndXAttrValue.fromObject(object.inRemote[i]);
                    }
                }
                if (object.nameOverlaps) {
                    if (!Array.isArray(object.nameOverlaps))
                        throw TypeError(".fs.FolderDiff.XAttrs.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 XAttrs message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.XAttrs} message XAttrs
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            XAttrs.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.arrays || options.defaults) {
                    object.inCurrent = [];
                    object.inRemote = [];
                    object.nameOverlaps = [];
                }
                if (message.inCurrent && message.inCurrent.length) {
                    object.inCurrent = [];
                    for (var j = 0; j < message.inCurrent.length; ++j)
                        object.inCurrent[j] = $root.file.NameAndXAttrValue.toObject(message.inCurrent[j], options);
                }
                if (message.inRemote && message.inRemote.length) {
                    object.inRemote = [];
                    for (var j = 0; j < message.inRemote.length; ++j)
                        object.inRemote[j] = $root.file.NameAndXAttrValue.toObject(message.inRemote[j], options);
                }
                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 XAttrs to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            XAttrs.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

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

            return XAttrs;
        })();

        return FolderDiff;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts);
                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) {
            if (object instanceof $root.fs.FSSyncUploadRequestBody)
                return object;
            var message = new $root.fs.FSSyncUploadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".fs.FSSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options);
            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.FSSyncUploadReplyBody = (function() {

        /**
         * Properties of a FSSyncUploadReplyBody.
         * @memberof fs
         * @interface IFSSyncUploadReplyBody
         * @property {common.IUInt64Value|null} [uploadedVersion] FSSyncUploadReplyBody uploadedVersion
         */

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

        /**
         * FSSyncUploadReplyBody uploadedVersion.
         * @member {common.IUInt64Value|null|undefined} uploadedVersion
         * @memberof fs.FSSyncUploadReplyBody
         * @instance
         */
        FSSyncUploadReplyBody.prototype.uploadedVersion = null;

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

        /**
         * Encodes the specified FSSyncUploadReplyBody message. Does not implicitly {@link fs.FSSyncUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {fs.IFSSyncUploadReplyBody} message FSSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadReplyBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

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

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

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

        /**
         * Verifies a FSSyncUploadReplyBody message.
         * @function verify
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncUploadReplyBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion);
                if (error)
                    return "uploadedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FSSyncUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncUploadReplyBody} FSSyncUploadReplyBody
         */
        FSSyncUploadReplyBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSSyncUploadReplyBody)
                return object;
            var message = new $root.fs.FSSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (typeof object.uploadedVersion !== "object")
                    throw TypeError(".fs.FSSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSSyncUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {fs.FSSyncUploadReplyBody} message FSSyncUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncUploadReplyBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options);
            return object;
        };

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

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

        return FSSyncUploadReplyBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.itemName != null && message.hasOwnProperty("itemName"))
                if (!$util.isString(message.itemName))
                    return "itemName: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.fs.AdoptRemoteFolderItemRequestBody.Options.verify(message.opts);
                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) {
            if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody)
                return object;
            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 (typeof object.opts !== "object")
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.opts: object expected");
                message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.itemName = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.itemName != null && message.hasOwnProperty("itemName"))
                object.itemName = message.itemName;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.toObject(message.opts, options);
            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
             */

            /**
             * 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)
                            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;

            /**
             * 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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                            break;
                        }
                    case 2: {
                            message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.localVersion != null && message.hasOwnProperty("localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion")) {
                    var error = $root.common.UInt64Value.verify(message.uploadVersion);
                    if (error)
                        return "uploadVersion." + 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) {
                if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody.Options)
                    return object;
                var message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                if (object.localVersion != null) {
                    if (typeof object.localVersion !== "object")
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion);
                }
                if (object.uploadVersion != null) {
                    if (typeof object.uploadVersion !== "object")
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.uploadVersion: object expected");
                    message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.uploadVersion = null;
                }
                if (message.localVersion != null && message.hasOwnProperty("localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options);
                if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion"))
                    object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options);
                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;
    })();

    return fs;
})();

module.exports = $root;

},{"protobufjs/minimal":130}],123:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.SpliceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.pos != null && message.hasOwnProperty("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 && message.hasOwnProperty("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 && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.bytes.SpliceRequestBody)
                return object;
            var message = new $root.bytes.SpliceRequestBody();
            if (object.pos != null)
                if ($util.Long)
                    (message.pos = $util.Long.fromValue(object.pos)).unsigned = 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)).unsigned = 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 (typeof object.bytes !== "object")
                    throw TypeError(".bytes.SpliceRequestBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.pos = options.longs === String ? "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() : long;
                } else
                    object.del = options.longs === String ? "0" : 0;
                object.bytes = null;
            }
            if (message.pos != null && message.hasOwnProperty("pos"))
                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 && message.hasOwnProperty("del"))
                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 && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.TruncateRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.size = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.size != null && message.hasOwnProperty("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) {
            if (object instanceof $root.bytes.TruncateRequestBody)
                return object;
            var message = new $root.bytes.TruncateRequestBody();
            if (object.size != null)
                if ($util.Long)
                    (message.size = $util.Long.fromValue(object.size)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.size = options.longs === String ? "0" : 0;
            if (message.size != null && message.hasOwnProperty("size"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.base != null && Object.hasOwnProperty.call(message, "base"))
                $root.common.UInt64Value.encode(message.base, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.FileLayoutMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.base = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        if (!(message.sections && message.sections.length))
                            message.sections = [];
                        message.sections.push($root.bytes.FileLayoutMsg.LayoutSection.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.base != null && message.hasOwnProperty("base")) {
                var error = $root.common.UInt64Value.verify(message.base);
                if (error)
                    return "base." + error;
            }
            if (message.sections != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.bytes.FileLayoutMsg)
                return object;
            var message = new $root.bytes.FileLayoutMsg();
            if (object.base != null) {
                if (typeof object.base !== "object")
                    throw TypeError(".bytes.FileLayoutMsg.base: object expected");
                message.base = $root.common.UInt64Value.fromObject(object.base);
            }
            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 (typeof object.sections[i] !== "object")
                        throw TypeError(".bytes.FileLayoutMsg.sections: object expected");
                    message.sections[i] = $root.bytes.FileLayoutMsg.LayoutSection.fromObject(object.sections[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.sections = [];
            if (options.defaults)
                object.base = null;
            if (message.base != null && message.hasOwnProperty("base"))
                object.base = $root.common.UInt64Value.toObject(message.base, options);
            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);
            }
            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.FileLayoutMsg.LayoutSection();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.src != null && message.hasOwnProperty("src"))
                    if (!$util.isString(message.src))
                        return "src: string expected";
                if (message.ofs != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
                if (object instanceof $root.bytes.FileLayoutMsg.LayoutSection)
                    return object;
                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)).unsigned = 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)).unsigned = 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) {
                if (!options)
                    options = {};
                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() : long;
                    } else
                        object.ofs = options.longs === String ? "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() : long;
                    } else
                        object.len = options.longs === String ? "0" : 0;
                }
                if (message.src != null && message.hasOwnProperty("src"))
                    object.src = message.src;
                if (message.ofs != null && message.hasOwnProperty("ofs"))
                    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 && message.hasOwnProperty("len"))
                    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                $root.common.ErrorValue.encode(message.err, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.DoneRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.err = $root.common.ErrorValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.err != null && message.hasOwnProperty("err")) {
                var error = $root.common.ErrorValue.verify(message.err);
                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) {
            if (object instanceof $root.bytes.DoneRequestBody)
                return object;
            var message = new $root.bytes.DoneRequestBody();
            if (object.err != null) {
                if (typeof object.err !== "object")
                    throw TypeError(".bytes.DoneRequestBody.err: object expected");
                message.err = $root.common.ErrorValue.fromObject(object.err);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.err = null;
            if (message.err != null && message.hasOwnProperty("err"))
                object.err = $root.common.ErrorValue.toObject(message.err, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.ReadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.bytes.ReadReplyBody)
                return object;
            var message = new $root.bytes.ReadReplyBody();
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".bytes.ReadReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.len != null && Object.hasOwnProperty.call(message, "len"))
                $root.common.UInt64Value.encode(message.len, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.ReadNextRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.len = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.len != null && message.hasOwnProperty("len")) {
                var error = $root.common.UInt64Value.verify(message.len);
                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) {
            if (object instanceof $root.bytes.ReadNextRequestBody)
                return object;
            var message = new $root.bytes.ReadNextRequestBody();
            if (object.len != null) {
                if (typeof object.len !== "object")
                    throw TypeError(".bytes.ReadNextRequestBody.len: object expected");
                message.len = $root.common.UInt64Value.fromObject(object.len);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.len = null;
            if (message.len != null && message.hasOwnProperty("len"))
                object.len = $root.common.UInt64Value.toObject(message.len, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.ReadAtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.pos = reader.uint64();
                        break;
                    }
                case 2: {
                        message.len = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.pos != null && message.hasOwnProperty("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 && message.hasOwnProperty("len")) {
                var error = $root.common.UInt64Value.verify(message.len);
                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) {
            if (object instanceof $root.bytes.ReadAtRequestBody)
                return object;
            var message = new $root.bytes.ReadAtRequestBody();
            if (object.pos != null)
                if ($util.Long)
                    (message.pos = $util.Long.fromValue(object.pos)).unsigned = 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 (typeof object.len !== "object")
                    throw TypeError(".bytes.ReadAtRequestBody.len: object expected");
                message.len = $root.common.UInt64Value.fromObject(object.len);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.pos = options.longs === String ? "0" : 0;
                object.len = null;
            }
            if (message.pos != null && message.hasOwnProperty("pos"))
                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 && message.hasOwnProperty("len"))
                object.len = $root.common.UInt64Value.toObject(message.len, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.SeekRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.offset = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.offset != null && message.hasOwnProperty("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) {
            if (object instanceof $root.bytes.SeekRequestBody)
                return object;
            var message = new $root.bytes.SeekRequestBody();
            if (object.offset != null)
                if ($util.Long)
                    (message.offset = $util.Long.fromValue(object.offset)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.offset = options.longs === String ? "0" : 0;
            if (message.offset != null && message.hasOwnProperty("offset"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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":130}],124:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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":130}],125:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.File();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                if (typeof message.isNew !== "boolean")
                    return "isNew: boolean expected";
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.File)
                return object;
            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 (typeof object.impl !== "object")
                    throw TypeError(".file.File.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                object.isNew = message.isNew;
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            if (message.isSynced != null && message.hasOwnProperty("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
         */

        /**
         * 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)
                        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;

        /**
         * 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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                $root.file.SyncVersionsBranchMsg.encode(message.synced, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                $root.file.SyncVersionsBranchMsg.encode(message.remote, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                $root.common.BooleanValue.encode(message.existsInSyncedParent, writer.uint32(/* id 5, wireType 2 =*/42).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncStatusMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.state = reader.string();
                        break;
                    }
                case 2: {
                        message.local = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.synced = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.remote = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.existsInSyncedParent = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.state != null && message.hasOwnProperty("state"))
                if (!$util.isString(message.state))
                    return "state: string expected";
            if (message.local != null && message.hasOwnProperty("local")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.local);
                if (error)
                    return "local." + error;
            }
            if (message.synced != null && message.hasOwnProperty("synced")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.synced);
                if (error)
                    return "synced." + error;
            }
            if (message.remote != null && message.hasOwnProperty("remote")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.remote);
                if (error)
                    return "remote." + error;
            }
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent")) {
                var error = $root.common.BooleanValue.verify(message.existsInSyncedParent);
                if (error)
                    return "existsInSyncedParent." + 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) {
            if (object instanceof $root.file.SyncStatusMsg)
                return object;
            var message = new $root.file.SyncStatusMsg();
            if (object.state != null)
                message.state = String(object.state);
            if (object.local != null) {
                if (typeof object.local !== "object")
                    throw TypeError(".file.SyncStatusMsg.local: object expected");
                message.local = $root.file.SyncVersionsBranchMsg.fromObject(object.local);
            }
            if (object.synced != null) {
                if (typeof object.synced !== "object")
                    throw TypeError(".file.SyncStatusMsg.synced: object expected");
                message.synced = $root.file.SyncVersionsBranchMsg.fromObject(object.synced);
            }
            if (object.remote != null) {
                if (typeof object.remote !== "object")
                    throw TypeError(".file.SyncStatusMsg.remote: object expected");
                message.remote = $root.file.SyncVersionsBranchMsg.fromObject(object.remote);
            }
            if (object.existsInSyncedParent != null) {
                if (typeof object.existsInSyncedParent !== "object")
                    throw TypeError(".file.SyncStatusMsg.existsInSyncedParent: object expected");
                message.existsInSyncedParent = $root.common.BooleanValue.fromObject(object.existsInSyncedParent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.state = "";
                object.local = null;
                object.synced = null;
                object.remote = null;
                object.existsInSyncedParent = null;
            }
            if (message.state != null && message.hasOwnProperty("state"))
                object.state = message.state;
            if (message.local != null && message.hasOwnProperty("local"))
                object.local = $root.file.SyncVersionsBranchMsg.toObject(message.local, options);
            if (message.synced != null && message.hasOwnProperty("synced"))
                object.synced = $root.file.SyncVersionsBranchMsg.toObject(message.synced, options);
            if (message.remote != null && message.hasOwnProperty("remote"))
                object.remote = $root.file.SyncVersionsBranchMsg.toObject(message.remote, options);
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent"))
                object.existsInSyncedParent = $root.common.BooleanValue.toObject(message.existsInSyncedParent, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                $root.common.UInt64Value.encode(message.latest, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncVersionsBranchMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.latest = $root.common.UInt64Value.decode(reader, reader.uint32());
                        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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.latest != null && message.hasOwnProperty("latest")) {
                var error = $root.common.UInt64Value.verify(message.latest);
                if (error)
                    return "latest." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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 && message.hasOwnProperty("isArchived")) {
                var error = $root.common.BooleanValue.verify(message.isArchived);
                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) {
            if (object instanceof $root.file.SyncVersionsBranchMsg)
                return object;
            var message = new $root.file.SyncVersionsBranchMsg();
            if (object.latest != null) {
                if (typeof object.latest !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.latest: object expected");
                message.latest = $root.common.UInt64Value.fromObject(object.latest);
            }
            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])).unsigned = 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 (typeof object.isArchived !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.isArchived: object expected");
                message.isArchived = $root.common.BooleanValue.fromObject(object.isArchived);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults) {
                object.latest = null;
                object.isArchived = null;
            }
            if (message.latest != null && message.hasOwnProperty("latest"))
                object.latest = $root.common.UInt64Value.toObject(message.latest, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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 && message.hasOwnProperty("isArchived"))
                object.isArchived = $root.common.BooleanValue.toObject(message.isArchived, options);
            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.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 {file.ISyncStatusMsg|null} [sync] StatsMsg sync
         */

        /**
         * 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)
                        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 sync.
         * @member {file.ISyncStatusMsg|null|undefined} sync
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.sync = 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) {
            if (!writer)
                writer = $Writer.create();
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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()).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.common.UInt64Value.encode(message.mtime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.common.UInt64Value.encode(message.ctime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.sync != null && Object.hasOwnProperty.call(message, "sync"))
                $root.file.SyncStatusMsg.encode(message.sync, writer.uint32(/* id 9, wireType 2 =*/74).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.StatsMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.writable = reader.bool();
                        break;
                    }
                case 5: {
                        message.size = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.mtime = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 7: {
                        message.ctime = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 8: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 9: {
                        message.sync = $root.file.SyncStatusMsg.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                if (error)
                    return "isLink." + error;
            }
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.size != null && message.hasOwnProperty("size")) {
                var error = $root.common.UInt64Value.verify(message.size);
                if (error)
                    return "size." + error;
            }
            if (message.mtime != null && message.hasOwnProperty("mtime")) {
                var error = $root.common.UInt64Value.verify(message.mtime);
                if (error)
                    return "mtime." + error;
            }
            if (message.ctime != null && message.hasOwnProperty("ctime")) {
                var error = $root.common.UInt64Value.verify(message.ctime);
                if (error)
                    return "ctime." + error;
            }
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                if (error)
                    return "version." + error;
            }
            if (message.sync != null && message.hasOwnProperty("sync")) {
                var error = $root.file.SyncStatusMsg.verify(message.sync);
                if (error)
                    return "sync." + 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) {
            if (object instanceof $root.file.StatsMsg)
                return object;
            var message = new $root.file.StatsMsg();
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".file.StatsMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".file.StatsMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".file.StatsMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.size != null) {
                if (typeof object.size !== "object")
                    throw TypeError(".file.StatsMsg.size: object expected");
                message.size = $root.common.UInt64Value.fromObject(object.size);
            }
            if (object.mtime != null) {
                if (typeof object.mtime !== "object")
                    throw TypeError(".file.StatsMsg.mtime: object expected");
                message.mtime = $root.common.UInt64Value.fromObject(object.mtime);
            }
            if (object.ctime != null) {
                if (typeof object.ctime !== "object")
                    throw TypeError(".file.StatsMsg.ctime: object expected");
                message.ctime = $root.common.UInt64Value.fromObject(object.ctime);
            }
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.StatsMsg.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            if (object.sync != null) {
                if (typeof object.sync !== "object")
                    throw TypeError(".file.StatsMsg.sync: object expected");
                message.sync = $root.file.SyncStatusMsg.fromObject(object.sync);
            }
            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) {
            if (!options)
                options = {};
            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.sync = null;
            }
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            if (message.writable != null && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.size != null && message.hasOwnProperty("size"))
                object.size = $root.common.UInt64Value.toObject(message.size, options);
            if (message.mtime != null && message.hasOwnProperty("mtime"))
                object.mtime = $root.common.UInt64Value.toObject(message.mtime, options);
            if (message.ctime != null && message.hasOwnProperty("ctime"))
                object.ctime = $root.common.UInt64Value.toObject(message.ctime, options);
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            if (message.sync != null && message.hasOwnProperty("sync"))
                object.sync = $root.file.SyncStatusMsg.toObject(message.sync, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.GetXAttrRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.xaName = "";
            if (message.xaName != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.XAttrValue)
                return object;
            var message = new $root.file.XAttrValue();
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.XAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.XAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.XAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                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) {
            if (object instanceof $root.file.ReadBytesRequestBody)
                return object;
            var message = new $root.file.ReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.ReadBytesReplyBody)
                return object;
            var message = new $root.file.ReadBytesReplyBody();
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.ReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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.FileEventMsg = (function() {

        /**
         * Properties of a FileEventMsg.
         * @memberof file
         * @interface IFileEventMsg
         * @property {string|null} [type] FileEventMsg type
         * @property {string|null} [path] FileEventMsg path
         * @property {common.IStringValue|null} [src] FileEventMsg src
         * @property {common.IUInt64Value|null} [newVersion] FileEventMsg newVersion
         * @property {common.IUInt64Value|null} [removedArchVer] FileEventMsg removedArchVer
         * @property {common.IUInt64Value|null} [archivedVersion] FileEventMsg archivedVersion
         */

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

        /**
         * FileEventMsg type.
         * @member {string} type
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.type = "";

        /**
         * FileEventMsg path.
         * @member {string} path
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.path = "";

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

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

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

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

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

        /**
         * Encodes the specified FileEventMsg message. Does not implicitly {@link file.FileEventMsg.verify|verify} messages.
         * @function encode
         * @memberof file.FileEventMsg
         * @static
         * @param {file.IFileEventMsg} message FileEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileEventMsg.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.StringValue.encode(message.src, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.removedArchVer != null && Object.hasOwnProperty.call(message, "removedArchVer"))
                $root.common.UInt64Value.encode(message.removedArchVer, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a FileEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileEventMsg} FileEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileEventMsg.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = reader.string();
                        break;
                    }
                case 3: {
                        message.src = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.removedArchVer = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a FileEventMsg message.
         * @function verify
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileEventMsg.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.src != null && message.hasOwnProperty("src")) {
                var error = $root.common.StringValue.verify(message.src);
                if (error)
                    return "src." + error;
            }
            if (message.newVersion != null && message.hasOwnProperty("newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion);
                if (error)
                    return "newVersion." + error;
            }
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer")) {
                var error = $root.common.UInt64Value.verify(message.removedArchVer);
                if (error)
                    return "removedArchVer." + error;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FileEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileEventMsg} FileEventMsg
         */
        FileEventMsg.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileEventMsg)
                return object;
            var message = new $root.file.FileEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null)
                message.path = String(object.path);
            if (object.src != null) {
                if (typeof object.src !== "object")
                    throw TypeError(".file.FileEventMsg.src: object expected");
                message.src = $root.common.StringValue.fromObject(object.src);
            }
            if (object.newVersion != null) {
                if (typeof object.newVersion !== "object")
                    throw TypeError(".file.FileEventMsg.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion);
            }
            if (object.removedArchVer != null) {
                if (typeof object.removedArchVer !== "object")
                    throw TypeError(".file.FileEventMsg.removedArchVer: object expected");
                message.removedArchVer = $root.common.UInt64Value.fromObject(object.removedArchVer);
            }
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.FileEventMsg.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileEventMsg
         * @static
         * @param {file.FileEventMsg} message FileEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileEventMsg.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = "";
                object.src = null;
                object.newVersion = null;
                object.removedArchVer = null;
                object.archivedVersion = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = $root.common.StringValue.toObject(message.src, options);
            if (message.newVersion != null && message.hasOwnProperty("newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options);
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer"))
                object.removedArchVer = $root.common.UInt64Value.toObject(message.removedArchVer, options);
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            return object;
        };

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

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

        return FileEventMsg;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.VersionedReadFlags)
                return object;
            var message = new $root.file.VersionedReadFlags();
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.archivedVersion = null;
                object.remoteVersion = null;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.RequestWithVersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.RequestWithVersionedReadFlags)
                return object;
            var message = new $root.file.RequestWithVersionedReadFlags();
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.RequestWithVersionedReadFlags.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.flags = null;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrRequestBody)
                return object;
            var message = new $root.file.VersionedGetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.flags = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrReplyBody)
                return object;
            var message = new $root.file.VersionedGetXAttrReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.str !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedListXAttrsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedListXAttrsReplyBody)
                return object;
            var message = new $root.file.VersionedListXAttrsReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedReadBytesRequestBody)
                return object;
            var message = new $root.file.VersionedReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedReadBytesReplyBody)
                return object;
            var message = new $root.file.VersionedReadBytesReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadTxtReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadTxtReplyBody)
                return object;
            var message = new $root.file.VersionedReadTxtReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.txt = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadJsonReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadJsonReplyBody)
                return object;
            var message = new $root.file.VersionedReadJsonReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.json = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.src = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("src")) {
                var error = $root.common.ObjectReference.verify(message.src);
                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) {
            if (object instanceof $root.file.VersionedGetByteSourceReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSourceReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.src !== "object")
                    throw TypeError(".file.VersionedGetByteSourceReplyBody.src: object expected");
                message.src = $root.common.ObjectReference.fromObject(object.src);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.src = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("src"))
                object.src = $root.common.ObjectReference.toObject(message.src, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                $root.common.UInt64Value.encode(message.current, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ListVersionsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.current = $root.common.UInt64Value.decode(reader, reader.uint32());
                        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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.current != null && message.hasOwnProperty("current")) {
                var error = $root.common.UInt64Value.verify(message.current);
                if (error)
                    return "current." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.ListVersionsReplyBody)
                return object;
            var message = new $root.file.ListVersionsReplyBody();
            if (object.current != null) {
                if (typeof object.current !== "object")
                    throw TypeError(".file.ListVersionsReplyBody.current: object expected");
                message.current = $root.common.UInt64Value.fromObject(object.current);
            }
            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])).unsigned = 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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults)
                object.current = null;
            if (message.current != null && message.hasOwnProperty("current"))
                object.current = $root.common.UInt64Value.toObject(message.current, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.changes != null && message.hasOwnProperty("changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes);
                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) {
            if (object instanceof $root.file.UpdateXAttrsRequestBody)
                return object;
            var message = new $root.file.UpdateXAttrsRequestBody();
            if (object.changes != null) {
                if (typeof object.changes !== "object")
                    throw TypeError(".file.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.changes = null;
            if (message.changes != null && message.hasOwnProperty("changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.NameAndXAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.NameAndXAttrValue)
                return object;
            var message = new $root.file.NameAndXAttrValue();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.NameAndXAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.NameAndXAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.NameAndXAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrsChanges();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.set && message.set.length))
                            message.set = [];
                        message.set.push($root.file.NameAndXAttrValue.decode(reader, reader.uint32()));
                        break;
                    }
                case 2: {
                        if (!(message.remove && message.remove.length))
                            message.remove = [];
                        message.remove.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.set != null && message.hasOwnProperty("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]);
                    if (error)
                        return "set." + error;
                }
            }
            if (message.remove != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.XAttrsChanges)
                return object;
            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 (typeof object.set[i] !== "object")
                        throw TypeError(".file.XAttrsChanges.set: object expected");
                    message.set[i] = $root.file.NameAndXAttrValue.fromObject(object.set[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteBytesRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteTxtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.txt != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteTxtRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.txt = "";
            if (message.txt != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteJsonRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.json != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteJsonRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.json = "";
            if (message.json != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                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) {
            if (object instanceof $root.file.GetByteSinkRequestBody)
                return object;
            var message = new $root.file.GetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.GetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.truncateFile = null;
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.CopyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.common.ObjectReference.verify(message.file);
                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) {
            if (object instanceof $root.file.CopyRequestBody)
                return object;
            var message = new $root.file.CopyRequestBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".file.CopyRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                if (error)
                    return "truncateFile." + error;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkRequestBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            if (object.currentVersion != null) {
                if (typeof object.currentVersion !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncateFile = null;
                object.currentVersion = null;
            }
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.sink = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("sink")) {
                var error = $root.common.ObjectReference.verify(message.sink);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.sink !== "object")
                    throw TypeError(".file.VersionedGetByteSinkReplyBody.sink: object expected");
                message.sink = $root.common.ObjectReference.fromObject(object.sink);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.sink = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("sink"))
                object.sink = $root.common.ObjectReference.toObject(message.sink, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                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) {
            if (object instanceof $root.file.ArchiveCurrentRequestBody)
                return object;
            var message = new $root.file.ArchiveCurrentRequestBody();
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.version = null;
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskRequestBody)
                return object;
            var message = new $root.file.FileSyncIsOnDiskRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.status != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskReplyBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && message.hasOwnProperty("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.FileSyncDownloadRequestBody = (function() {

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

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

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

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

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

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

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

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

        /**
         * Verifies a FileSyncDownloadRequestBody message.
         * @function verify
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncDownloadRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 FileSyncDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncDownloadRequestBody} FileSyncDownloadRequestBody
         */
        FileSyncDownloadRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileSyncDownloadRequestBody)
                return object;
            var message = new $root.file.FileSyncDownloadRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 FileSyncDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {file.FileSyncDownloadRequestBody} message FileSyncDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncDownloadRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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 FileSyncDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

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

        return FileSyncDownloadRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts);
                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) {
            if (object instanceof $root.file.AdoptRemoteRequestBody)
                return object;
            var message = new $root.file.AdoptRemoteRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                $root.common.BooleanValue.encode(message.dropLocalVer, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToAdopteRemote();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.dropLocalVer = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer")) {
                var error = $root.common.BooleanValue.verify(message.dropLocalVer);
                if (error)
                    return "dropLocalVer." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.OptionsToAdopteRemote)
                return object;
            var message = new $root.file.OptionsToAdopteRemote();
            if (object.dropLocalVer != null) {
                if (typeof object.dropLocalVer !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.dropLocalVer: object expected");
                message.dropLocalVer = $root.common.BooleanValue.fromObject(object.dropLocalVer);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.dropLocalVer = null;
                object.remoteVersion = null;
            }
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer"))
                object.dropLocalVer = $root.common.BooleanValue.toObject(message.dropLocalVer, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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.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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts);
                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) {
            if (object instanceof $root.file.FileSyncUploadRequestBody)
                return object;
            var message = new $root.file.FileSyncUploadRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.FileSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.uploadedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion);
                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) {
            if (object instanceof $root.file.FileSyncUploadReplyBody)
                return object;
            var message = new $root.file.FileSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (typeof object.uploadedVersion !== "object")
                    throw TypeError(".file.FileSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options);
            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.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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToUploadLocal();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.localVersion != null && message.hasOwnProperty("localVersion")) {
                var error = $root.common.UInt64Value.verify(message.localVersion);
                if (error)
                    return "localVersion." + error;
            }
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadVersion);
                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) {
            if (object instanceof $root.file.OptionsToUploadLocal)
                return object;
            var message = new $root.file.OptionsToUploadLocal();
            if (object.localVersion != null) {
                if (typeof object.localVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.localVersion: object expected");
                message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion);
            }
            if (object.uploadVersion != null) {
                if (typeof object.uploadVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.uploadVersion: object expected");
                message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.localVersion = null;
                object.uploadVersion = null;
            }
            if (message.localVersion != null && message.hasOwnProperty("localVersion"))
                object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options);
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion"))
                object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options);
            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;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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":130}],126:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FS();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FS)
                return object;
            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 (typeof object.impl !== "object")
                    throw TypeError(".fs.FS.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.writable != null && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            if (message.isSynced != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CheckPresenceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.throwIfMissing = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.throwIfMissing != null && message.hasOwnProperty("throwIfMissing")) {
                var error = $root.common.BooleanValue.verify(message.throwIfMissing);
                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) {
            if (object instanceof $root.fs.CheckPresenceRequestBody)
                return object;
            var message = new $root.fs.CheckPresenceRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.throwIfMissing != null) {
                if (typeof object.throwIfMissing !== "object")
                    throw TypeError(".fs.CheckPresenceRequestBody.throwIfMissing: object expected");
                message.throwIfMissing = $root.common.BooleanValue.fromObject(object.throwIfMissing);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.throwIfMissing = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.throwIfMissing != null && message.hasOwnProperty("throwIfMissing"))
                object.throwIfMissing = $root.common.BooleanValue.toObject(message.throwIfMissing, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathOnlyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.PathOnlyRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.path = "";
            if (message.path != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.GetXAttrRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.xaName != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLink();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.readonly = reader.bool();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.readonly != null && message.hasOwnProperty("readonly"))
                if (typeof message.readonly !== "boolean")
                    return "readonly: boolean expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                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) {
            if (object instanceof $root.fs.SymLink)
                return object;
            var message = new $root.fs.SymLink();
            if (object.readonly != null)
                message.readonly = Boolean(object.readonly);
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.SymLink.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.SymLink.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.impl != null) {
                if (typeof object.impl !== "object")
                    throw TypeError(".fs.SymLink.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.readonly = false;
                object.isFile = null;
                object.isFolder = null;
                object.impl = null;
            }
            if (message.readonly != null && message.hasOwnProperty("readonly"))
                object.readonly = message.readonly;
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLinkTargetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.fs = $root.fs.FS.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.file = $root.file.File.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.fs != null && message.hasOwnProperty("fs")) {
                var error = $root.fs.FS.verify(message.fs);
                if (error)
                    return "fs." + error;
            }
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.file.File.verify(message.file);
                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) {
            if (object instanceof $root.fs.SymLinkTargetReplyBody)
                return object;
            var message = new $root.fs.SymLinkTargetReplyBody();
            if (object.fs != null) {
                if (typeof object.fs !== "object")
                    throw TypeError(".fs.SymLinkTargetReplyBody.fs: object expected");
                message.fs = $root.fs.FS.fromObject(object.fs);
            }
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".fs.SymLinkTargetReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.fs = null;
                object.file = null;
            }
            if (message.fs != null && message.hasOwnProperty("fs"))
                object.fs = $root.fs.FS.toObject(message.fs, options);
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.file.File.toObject(message.file, options);
            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.FSEventMsg = (function() {

        /**
         * Properties of a FSEventMsg.
         * @memberof fs
         * @interface IFSEventMsg
         * @property {string|null} [type] FSEventMsg type
         * @property {string|null} [path] FSEventMsg path
         * @property {common.IStringValue|null} [src] FSEventMsg src
         * @property {common.IUInt64Value|null} [newVersion] FSEventMsg newVersion
         * @property {common.IStringValue|null} [name] FSEventMsg name
         * @property {common.IStringValue|null} [oldName] FSEventMsg oldName
         * @property {common.IStringValue|null} [newName] FSEventMsg newName
         * @property {fs.IListingEntryMsg|null} [entry] FSEventMsg entry
         * @property {common.IUInt64Value|null} [moveLabel] FSEventMsg moveLabel
         * @property {common.IUInt64Value|null} [removedArchVer] FSEventMsg removedArchVer
         * @property {common.IUInt64Value|null} [archivedVersion] FSEventMsg archivedVersion
         */

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

        /**
         * FSEventMsg type.
         * @member {string} type
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.type = "";

        /**
         * FSEventMsg path.
         * @member {string} path
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.path = "";

        /**
         * FSEventMsg src.
         * @member {common.IStringValue|null|undefined} src
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.src = null;

        /**
         * FSEventMsg newVersion.
         * @member {common.IUInt64Value|null|undefined} newVersion
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.newVersion = null;

        /**
         * FSEventMsg name.
         * @member {common.IStringValue|null|undefined} name
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.name = null;

        /**
         * FSEventMsg oldName.
         * @member {common.IStringValue|null|undefined} oldName
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.oldName = null;

        /**
         * FSEventMsg newName.
         * @member {common.IStringValue|null|undefined} newName
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.newName = null;

        /**
         * FSEventMsg entry.
         * @member {fs.IListingEntryMsg|null|undefined} entry
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.entry = null;

        /**
         * FSEventMsg moveLabel.
         * @member {common.IUInt64Value|null|undefined} moveLabel
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.moveLabel = null;

        /**
         * FSEventMsg removedArchVer.
         * @member {common.IUInt64Value|null|undefined} removedArchVer
         * @memberof fs.FSEventMsg
         * @instance
         */
        FSEventMsg.prototype.removedArchVer = null;

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

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

        /**
         * Encodes the specified FSEventMsg message. Does not implicitly {@link fs.FSEventMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.FSEventMsg
         * @static
         * @param {fs.IFSEventMsg} message FSEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSEventMsg.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.StringValue.encode(message.src, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                $root.common.StringValue.encode(message.name, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.oldName != null && Object.hasOwnProperty.call(message, "oldName"))
                $root.common.StringValue.encode(message.oldName, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.newName != null && Object.hasOwnProperty.call(message, "newName"))
                $root.common.StringValue.encode(message.newName, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.entry != null && Object.hasOwnProperty.call(message, "entry"))
                $root.fs.ListingEntryMsg.encode(message.entry, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.moveLabel != null && Object.hasOwnProperty.call(message, "moveLabel"))
                $root.common.UInt64Value.encode(message.moveLabel, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
            if (message.removedArchVer != null && Object.hasOwnProperty.call(message, "removedArchVer"))
                $root.common.UInt64Value.encode(message.removedArchVer, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a FSEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSEventMsg} FSEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSEventMsg.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = reader.string();
                        break;
                    }
                case 3: {
                        message.src = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.name = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.oldName = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 7: {
                        message.newName = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 8: {
                        message.entry = $root.fs.ListingEntryMsg.decode(reader, reader.uint32());
                        break;
                    }
                case 9: {
                        message.moveLabel = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 10: {
                        message.removedArchVer = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 11: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a FSEventMsg message.
         * @function verify
         * @memberof fs.FSEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSEventMsg.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.src != null && message.hasOwnProperty("src")) {
                var error = $root.common.StringValue.verify(message.src);
                if (error)
                    return "src." + error;
            }
            if (message.newVersion != null && message.hasOwnProperty("newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion);
                if (error)
                    return "newVersion." + error;
            }
            if (message.name != null && message.hasOwnProperty("name")) {
                var error = $root.common.StringValue.verify(message.name);
                if (error)
                    return "name." + error;
            }
            if (message.oldName != null && message.hasOwnProperty("oldName")) {
                var error = $root.common.StringValue.verify(message.oldName);
                if (error)
                    return "oldName." + error;
            }
            if (message.newName != null && message.hasOwnProperty("newName")) {
                var error = $root.common.StringValue.verify(message.newName);
                if (error)
                    return "newName." + error;
            }
            if (message.entry != null && message.hasOwnProperty("entry")) {
                var error = $root.fs.ListingEntryMsg.verify(message.entry);
                if (error)
                    return "entry." + error;
            }
            if (message.moveLabel != null && message.hasOwnProperty("moveLabel")) {
                var error = $root.common.UInt64Value.verify(message.moveLabel);
                if (error)
                    return "moveLabel." + error;
            }
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer")) {
                var error = $root.common.UInt64Value.verify(message.removedArchVer);
                if (error)
                    return "removedArchVer." + error;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FSEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSEventMsg} FSEventMsg
         */
        FSEventMsg.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSEventMsg)
                return object;
            var message = new $root.fs.FSEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null)
                message.path = String(object.path);
            if (object.src != null) {
                if (typeof object.src !== "object")
                    throw TypeError(".fs.FSEventMsg.src: object expected");
                message.src = $root.common.StringValue.fromObject(object.src);
            }
            if (object.newVersion != null) {
                if (typeof object.newVersion !== "object")
                    throw TypeError(".fs.FSEventMsg.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion);
            }
            if (object.name != null) {
                if (typeof object.name !== "object")
                    throw TypeError(".fs.FSEventMsg.name: object expected");
                message.name = $root.common.StringValue.fromObject(object.name);
            }
            if (object.oldName != null) {
                if (typeof object.oldName !== "object")
                    throw TypeError(".fs.FSEventMsg.oldName: object expected");
                message.oldName = $root.common.StringValue.fromObject(object.oldName);
            }
            if (object.newName != null) {
                if (typeof object.newName !== "object")
                    throw TypeError(".fs.FSEventMsg.newName: object expected");
                message.newName = $root.common.StringValue.fromObject(object.newName);
            }
            if (object.entry != null) {
                if (typeof object.entry !== "object")
                    throw TypeError(".fs.FSEventMsg.entry: object expected");
                message.entry = $root.fs.ListingEntryMsg.fromObject(object.entry);
            }
            if (object.moveLabel != null) {
                if (typeof object.moveLabel !== "object")
                    throw TypeError(".fs.FSEventMsg.moveLabel: object expected");
                message.moveLabel = $root.common.UInt64Value.fromObject(object.moveLabel);
            }
            if (object.removedArchVer != null) {
                if (typeof object.removedArchVer !== "object")
                    throw TypeError(".fs.FSEventMsg.removedArchVer: object expected");
                message.removedArchVer = $root.common.UInt64Value.fromObject(object.removedArchVer);
            }
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".fs.FSEventMsg.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSEventMsg
         * @static
         * @param {fs.FSEventMsg} message FSEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSEventMsg.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = "";
                object.src = null;
                object.newVersion = null;
                object.name = null;
                object.oldName = null;
                object.newName = null;
                object.entry = null;
                object.moveLabel = null;
                object.removedArchVer = null;
                object.archivedVersion = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = $root.common.StringValue.toObject(message.src, options);
            if (message.newVersion != null && message.hasOwnProperty("newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options);
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = $root.common.StringValue.toObject(message.name, options);
            if (message.oldName != null && message.hasOwnProperty("oldName"))
                object.oldName = $root.common.StringValue.toObject(message.oldName, options);
            if (message.newName != null && message.hasOwnProperty("newName"))
                object.newName = $root.common.StringValue.toObject(message.newName, options);
            if (message.entry != null && message.hasOwnProperty("entry"))
                object.entry = $root.fs.ListingEntryMsg.toObject(message.entry, options);
            if (message.moveLabel != null && message.hasOwnProperty("moveLabel"))
                object.moveLabel = $root.common.UInt64Value.toObject(message.moveLabel, options);
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer"))
                object.removedArchVer = $root.common.UInt64Value.toObject(message.removedArchVer, options);
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            return object;
        };

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

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

        return FSEventMsg;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WatchTreeRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.depth = $root.common.UInt32Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.depth != null && message.hasOwnProperty("depth")) {
                var error = $root.common.UInt32Value.verify(message.depth);
                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) {
            if (object instanceof $root.fs.WatchTreeRequestBody)
                return object;
            var message = new $root.fs.WatchTreeRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.depth != null) {
                if (typeof object.depth !== "object")
                    throw TypeError(".fs.WatchTreeRequestBody.depth: object expected");
                message.depth = $root.common.UInt32Value.fromObject(object.depth);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.depth = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.depth != null && message.hasOwnProperty("depth"))
                object.depth = $root.common.UInt32Value.toObject(message.depth, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.entries && message.entries.length))
                            message.entries = [];
                        message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.entries != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.ListFolderReplyBody)
                return object;
            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 (typeof object.entries[i] !== "object")
                        throw TypeError(".fs.ListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListingEntryMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                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) {
            if (object instanceof $root.fs.ListingEntryMsg)
                return object;
            var message = new $root.fs.ListingEntryMsg();
            if (object.name != null)
                message.name = String(object.name);
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".fs.ListingEntryMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
            }
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                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) {
            if (object instanceof $root.fs.ReadBytesRequestBody)
                return object;
            var message = new $root.fs.ReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".fs.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".fs.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.criteria = $root.fs.SelectRequestBody.SelectCriteria.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.criteria != null && message.hasOwnProperty("criteria")) {
                var error = $root.fs.SelectRequestBody.SelectCriteria.verify(message.criteria);
                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) {
            if (object instanceof $root.fs.SelectRequestBody)
                return object;
            var message = new $root.fs.SelectRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.criteria != null) {
                if (typeof object.criteria !== "object")
                    throw TypeError(".fs.SelectRequestBody.criteria: object expected");
                message.criteria = $root.fs.SelectRequestBody.SelectCriteria.fromObject(object.criteria);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.criteria = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.criteria != null && message.hasOwnProperty("criteria"))
                object.criteria = $root.fs.SelectRequestBody.SelectCriteria.toObject(message.criteria, options);
            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    $root.common.StringValue.encode(message.exactName, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    $root.common.StringValue.encode(message.pattern, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    $root.common.StringValue.encode(message.regexp, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody.SelectCriteria();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.exactName = $root.common.StringValue.decode(reader, reader.uint32());
                            break;
                        }
                    case 2: {
                            message.pattern = $root.common.StringValue.decode(reader, reader.uint32());
                            break;
                        }
                    case 3: {
                            message.regexp = $root.common.StringValue.decode(reader, reader.uint32());
                            break;
                        }
                    case 4: {
                            message.depth = $root.common.UInt32Value.decode(reader, reader.uint32());
                            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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.exactName != null && message.hasOwnProperty("exactName")) {
                    var error = $root.common.StringValue.verify(message.exactName);
                    if (error)
                        return "exactName." + error;
                }
                if (message.pattern != null && message.hasOwnProperty("pattern")) {
                    var error = $root.common.StringValue.verify(message.pattern);
                    if (error)
                        return "pattern." + error;
                }
                if (message.regexp != null && message.hasOwnProperty("regexp")) {
                    var error = $root.common.StringValue.verify(message.regexp);
                    if (error)
                        return "regexp." + error;
                }
                if (message.depth != null && message.hasOwnProperty("depth")) {
                    var error = $root.common.UInt32Value.verify(message.depth);
                    if (error)
                        return "depth." + error;
                }
                if (message.type != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
                if (object instanceof $root.fs.SelectRequestBody.SelectCriteria)
                    return object;
                var message = new $root.fs.SelectRequestBody.SelectCriteria();
                if (object.exactName != null) {
                    if (typeof object.exactName !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.exactName: object expected");
                    message.exactName = $root.common.StringValue.fromObject(object.exactName);
                }
                if (object.pattern != null) {
                    if (typeof object.pattern !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.pattern: object expected");
                    message.pattern = $root.common.StringValue.fromObject(object.pattern);
                }
                if (object.regexp != null) {
                    if (typeof object.regexp !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.regexp: object expected");
                    message.regexp = $root.common.StringValue.fromObject(object.regexp);
                }
                if (object.depth != null) {
                    if (typeof object.depth !== "object")
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.depth: object expected");
                    message.depth = $root.common.UInt32Value.fromObject(object.depth);
                }
                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) {
                if (!options)
                    options = {};
                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 && message.hasOwnProperty("exactName"))
                    object.exactName = $root.common.StringValue.toObject(message.exactName, options);
                if (message.pattern != null && message.hasOwnProperty("pattern"))
                    object.pattern = $root.common.StringValue.toObject(message.pattern, options);
                if (message.regexp != null && message.hasOwnProperty("regexp"))
                    object.regexp = $root.common.StringValue.toObject(message.regexp, options);
                if (message.depth != null && message.hasOwnProperty("depth"))
                    object.depth = $root.common.UInt32Value.toObject(message.depth, options);
                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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            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) {
            if (object instanceof $root.fs.FSCGetRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.name = "";
            if (message.name != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.FSCGetReplyBody)
                return object;
            var message = new $root.fs.FSCGetReplyBody();
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.FSCGetReplyBody.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.item = null;
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                $root.common.BooleanValue.encode(message.isCollection, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.isCollection = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.item = $root.fs.FSItem.Item.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.location = $root.fs.FSItem.Location.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                if (error)
                    return "isLink." + error;
            }
            if (message.isCollection != null && message.hasOwnProperty("isCollection")) {
                var error = $root.common.BooleanValue.verify(message.isCollection);
                if (error)
                    return "isCollection." + error;
            }
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.Item.verify(message.item);
                if (error)
                    return "item." + error;
            }
            if (message.location != null && message.hasOwnProperty("location")) {
                var error = $root.fs.FSItem.Location.verify(message.location);
                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) {
            if (object instanceof $root.fs.FSItem)
                return object;
            var message = new $root.fs.FSItem();
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".fs.FSItem.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".fs.FSItem.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".fs.FSItem.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            if (object.isCollection != null) {
                if (typeof object.isCollection !== "object")
                    throw TypeError(".fs.FSItem.isCollection: object expected");
                message.isCollection = $root.common.BooleanValue.fromObject(object.isCollection);
            }
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.FSItem.item: object expected");
                message.item = $root.fs.FSItem.Item.fromObject(object.item);
            }
            if (object.location != null) {
                if (typeof object.location !== "object")
                    throw TypeError(".fs.FSItem.location: object expected");
                message.location = $root.fs.FSItem.Location.fromObject(object.location);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            if (message.isCollection != null && message.hasOwnProperty("isCollection"))
                object.isCollection = $root.common.BooleanValue.toObject(message.isCollection, options);
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.Item.toObject(message.item, options);
            if (message.location != null && message.hasOwnProperty("location"))
                object.location = $root.fs.FSItem.Location.toObject(message.location, options);
            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Location();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32());
                            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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.fs != null && message.hasOwnProperty("fs")) {
                    var error = $root.fs.FS.verify(message.fs);
                    if (error)
                        return "fs." + error;
                }
                if (message.path != null && message.hasOwnProperty("path"))
                    if (!$util.isString(message.path))
                        return "path: string expected";
                if (message.storageUse != null && message.hasOwnProperty("storageUse"))
                    if (!$util.isString(message.storageUse))
                        return "storageUse: string expected";
                if (message.storageType != null && message.hasOwnProperty("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) {
                if (object instanceof $root.fs.FSItem.Location)
                    return object;
                var message = new $root.fs.FSItem.Location();
                if (object.fs != null) {
                    if (typeof object.fs !== "object")
                        throw TypeError(".fs.FSItem.Location.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.path = "";
                    object.storageUse = "";
                    object.storageType = "";
                }
                if (message.fs != null && message.hasOwnProperty("fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options);
                if (message.path != null && message.hasOwnProperty("path"))
                    object.path = message.path;
                if (message.storageUse != null && message.hasOwnProperty("storageUse"))
                    object.storageUse = message.storageUse;
                if (message.storageType != null && message.hasOwnProperty("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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    $root.common.ObjectReference.encode(message.collection, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Item();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32());
                            break;
                        }
                    case 2: {
                            message.file = $root.file.File.decode(reader, reader.uint32());
                            break;
                        }
                    case 3: {
                            message.collection = $root.common.ObjectReference.decode(reader, reader.uint32());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.fs != null && message.hasOwnProperty("fs")) {
                    var error = $root.fs.FS.verify(message.fs);
                    if (error)
                        return "fs." + error;
                }
                if (message.file != null && message.hasOwnProperty("file")) {
                    var error = $root.file.File.verify(message.file);
                    if (error)
                        return "file." + error;
                }
                if (message.collection != null && message.hasOwnProperty("collection")) {
                    var error = $root.common.ObjectReference.verify(message.collection);
                    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) {
                if (object instanceof $root.fs.FSItem.Item)
                    return object;
                var message = new $root.fs.FSItem.Item();
                if (object.fs != null) {
                    if (typeof object.fs !== "object")
                        throw TypeError(".fs.FSItem.Item.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs);
                }
                if (object.file != null) {
                    if (typeof object.file !== "object")
                        throw TypeError(".fs.FSItem.Item.file: object expected");
                    message.file = $root.file.File.fromObject(object.file);
                }
                if (object.collection != null) {
                    if (typeof object.collection !== "object")
                        throw TypeError(".fs.FSItem.Item.collection: object expected");
                    message.collection = $root.common.ObjectReference.fromObject(object.collection);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.file = null;
                    object.collection = null;
                }
                if (message.fs != null && message.hasOwnProperty("fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options);
                if (message.file != null && message.hasOwnProperty("file"))
                    object.file = $root.file.File.toObject(message.file, options);
                if (message.collection != null && message.hasOwnProperty("collection"))
                    object.collection = $root.common.ObjectReference.toObject(message.collection, options);
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetAllReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.items && message.items.length))
                            message.items = [];
                        message.items.push($root.fs.NameAndItem.decode(reader, reader.uint32()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.items != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.FSCGetAllReplyBody)
                return object;
            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 (typeof object.items[i] !== "object")
                        throw TypeError(".fs.FSCGetAllReplyBody.items: object expected");
                    message.items[i] = $root.fs.NameAndItem.fromObject(object.items[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.NameAndItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.NameAndItem)
                return object;
            var message = new $root.fs.NameAndItem();
            if (object.name != null)
                message.name = String(object.name);
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.NameAndItem.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.item = null;
            }
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                $root.common.BooleanValue.encode(message.done, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                $root.fs.NameAndItem.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.IterResMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.done = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.value = $root.fs.NameAndItem.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.done != null && message.hasOwnProperty("done")) {
                var error = $root.common.BooleanValue.verify(message.done);
                if (error)
                    return "done." + error;
            }
            if (message.value != null && message.hasOwnProperty("value")) {
                var error = $root.fs.NameAndItem.verify(message.value);
                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) {
            if (object instanceof $root.fs.IterResMsg)
                return object;
            var message = new $root.fs.IterResMsg();
            if (object.done != null) {
                if (typeof object.done !== "object")
                    throw TypeError(".fs.IterResMsg.done: object expected");
                message.done = $root.common.BooleanValue.fromObject(object.done);
            }
            if (object.value != null) {
                if (typeof object.value !== "object")
                    throw TypeError(".fs.IterResMsg.value: object expected");
                message.value = $root.fs.NameAndItem.fromObject(object.value);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.done = null;
                object.value = null;
            }
            if (message.done != null && message.hasOwnProperty("done"))
                object.done = $root.common.BooleanValue.toObject(message.done, options);
            if (message.value != null && message.hasOwnProperty("value"))
                object.value = $root.fs.NameAndItem.toObject(message.value, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CollectionEvent();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path")) {
                var error = $root.common.StringValue.verify(message.path);
                if (error)
                    return "path." + error;
            }
            if (message.item != null && message.hasOwnProperty("item")) {
                var error = $root.fs.FSItem.verify(message.item);
                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) {
            if (object instanceof $root.fs.CollectionEvent)
                return object;
            var message = new $root.fs.CollectionEvent();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (typeof object.path !== "object")
                    throw TypeError(".fs.CollectionEvent.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path);
            }
            if (object.item != null) {
                if (typeof object.item !== "object")
                    throw TypeError(".fs.CollectionEvent.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
                object.item = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = $root.common.StringValue.toObject(message.path, options);
            if (message.item != null && message.hasOwnProperty("item"))
                object.item = $root.fs.FSItem.toObject(message.item, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedGetXAttrRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndFlagsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.PathAndFlagsRequestBody)
                return object;
            var message = new $root.fs.PathAndFlagsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.PathAndFlagsRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.fs.VersionedListFolderReplyBody)
                return object;
            var message = new $root.fs.VersionedListFolderReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.entries[i] !== "object")
                        throw TypeError(".fs.VersionedListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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);
            }
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedReadBytesRequestBody)
                return object;
            var message = new $root.fs.VersionedReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.changes != null && message.hasOwnProperty("changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes);
                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) {
            if (object instanceof $root.fs.UpdateXAttrsRequestBody)
                return object;
            var message = new $root.fs.UpdateXAttrsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.changes != null) {
                if (typeof object.changes !== "object")
                    throw TypeError(".fs.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.changes = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.changes != null && message.hasOwnProperty("changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MakeFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                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) {
            if (object instanceof $root.fs.MakeFolderRequestBody)
                return object;
            var message = new $root.fs.MakeFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.MakeFolderRequestBody.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.exclusive = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DeleteFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.removeContent = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.removeContent != null && message.hasOwnProperty("removeContent")) {
                var error = $root.common.BooleanValue.verify(message.removeContent);
                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) {
            if (object instanceof $root.fs.DeleteFolderRequestBody)
                return object;
            var message = new $root.fs.DeleteFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.removeContent != null) {
                if (typeof object.removeContent !== "object")
                    throw TypeError(".fs.DeleteFolderRequestBody.removeContent: object expected");
                message.removeContent = $root.common.BooleanValue.fromObject(object.removeContent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.removeContent = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.removeContent != null && message.hasOwnProperty("removeContent"))
                object.removeContent = $root.common.BooleanValue.toObject(message.removeContent, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MoveRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.MoveRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && message.hasOwnProperty("overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite);
                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) {
            if (object instanceof $root.fs.CopyFileRequestBody)
                return object;
            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 (typeof object.overwrite !== "object")
                    throw TypeError(".fs.CopyFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.overwrite = null;
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.overwrite != null && message.hasOwnProperty("overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.src != null && message.hasOwnProperty("src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite);
                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) {
            if (object instanceof $root.fs.CopyFolderRequestBody)
                return object;
            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 (typeof object.mergeAndOverwrite !== "object")
                    throw TypeError(".fs.CopyFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = message.src;
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.common.ObjectReference.verify(message.file);
                if (error)
                    return "file." + error;
            }
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && message.hasOwnProperty("overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite);
                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) {
            if (object instanceof $root.fs.SaveFileRequestBody)
                return object;
            var message = new $root.fs.SaveFileRequestBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".fs.SaveFileRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (typeof object.overwrite !== "object")
                    throw TypeError(".fs.SaveFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.file = null;
                object.dst = "";
                object.overwrite = null;
            }
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options);
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.overwrite != null && message.hasOwnProperty("overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.common.ObjectReference.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.folder = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.folder != null && message.hasOwnProperty("folder")) {
                var error = $root.common.ObjectReference.verify(message.folder);
                if (error)
                    return "folder." + error;
            }
            if (message.dst != null && message.hasOwnProperty("dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite);
                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) {
            if (object instanceof $root.fs.SaveFolderRequestBody)
                return object;
            var message = new $root.fs.SaveFolderRequestBody();
            if (object.folder != null) {
                if (typeof object.folder !== "object")
                    throw TypeError(".fs.SaveFolderRequestBody.folder: object expected");
                message.folder = $root.common.ObjectReference.fromObject(object.folder);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (typeof object.mergeAndOverwrite !== "object")
                    throw TypeError(".fs.SaveFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.folder = null;
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.folder != null && message.hasOwnProperty("folder"))
                object.folder = $root.common.ObjectReference.toObject(message.folder, options);
            if (message.dst != null && message.hasOwnProperty("dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && message.hasOwnProperty("mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.LinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.target = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.target != null && message.hasOwnProperty("target")) {
                var error = $root.common.ObjectReference.verify(message.target);
                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) {
            if (object instanceof $root.fs.LinkRequestBody)
                return object;
            var message = new $root.fs.LinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.target != null) {
                if (typeof object.target !== "object")
                    throw TypeError(".fs.LinkRequestBody.target: object expected");
                message.target = $root.common.ObjectReference.fromObject(object.target);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.target = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.target != null && message.hasOwnProperty("target"))
                object.target = $root.common.ObjectReference.toObject(message.target, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndOptFileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.PathAndOptFileFlags)
                return object;
            var message = new $root.fs.PathAndOptFileFlags();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.PathAndOptFileFlags.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncate != null && message.hasOwnProperty("truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && message.hasOwnProperty("create")) {
                var error = $root.common.BooleanValue.verify(message.create);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                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) {
            if (object instanceof $root.fs.FileFlags)
                return object;
            var message = new $root.fs.FileFlags();
            if (object.truncate != null) {
                if (typeof object.truncate !== "object")
                    throw TypeError(".fs.FileFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate);
            }
            if (object.create != null) {
                if (typeof object.create !== "object")
                    throw TypeError(".fs.FileFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create);
            }
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.FileFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
            }
            if (message.truncate != null && message.hasOwnProperty("truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options);
            if (message.create != null && message.hasOwnProperty("create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options);
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && message.hasOwnProperty("json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteJsonFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = message.json;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && message.hasOwnProperty("txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteTxtFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.txt != null && message.hasOwnProperty("txt"))
                object.txt = message.txt;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.FileFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.WriteBytesRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.WriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.bytes != null && message.hasOwnProperty("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 && message.hasOwnProperty("flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && message.hasOwnProperty("json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteJsonFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = message.json;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedFileWriteFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 10: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncate != null && message.hasOwnProperty("truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && message.hasOwnProperty("create")) {
                var error = $root.common.BooleanValue.verify(message.create);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && message.hasOwnProperty("exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive);
                if (error)
                    return "exclusive." + error;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion);
                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) {
            if (object instanceof $root.fs.VersionedFileWriteFlags)
                return object;
            var message = new $root.fs.VersionedFileWriteFlags();
            if (object.truncate != null) {
                if (typeof object.truncate !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate);
            }
            if (object.create != null) {
                if (typeof object.create !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create);
            }
            if (object.exclusive != null) {
                if (typeof object.exclusive !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive);
            }
            if (object.currentVersion != null) {
                if (typeof object.currentVersion !== "object")
                    throw TypeError(".fs.VersionedFileWriteFlags.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
                object.currentVersion = null;
            }
            if (message.truncate != null && message.hasOwnProperty("truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options);
            if (message.create != null && message.hasOwnProperty("create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options);
            if (message.exclusive != null && message.hasOwnProperty("exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options);
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && message.hasOwnProperty("txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteTxtFileRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.txt != null && message.hasOwnProperty("txt"))
                object.txt = message.txt;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedWriteBytesRequestBody)
                return object;
            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 (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedWriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.bytes != null && message.hasOwnProperty("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 && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags);
                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) {
            if (object instanceof $root.fs.VersionedGetByteSinkRequestBody)
                return object;
            var message = new $root.fs.VersionedGetByteSinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".fs.VersionedGetByteSinkRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                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) {
            if (object instanceof $root.fs.ArchiveCurrentRequestBody)
                return object;
            var message = new $root.fs.ArchiveCurrentRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".fs.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.version = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            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.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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FSSyncIsOnDiskRequestBody)
                return object;
            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)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.status != null && message.hasOwnProperty("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) {
            if (object instanceof $root.fs.FSSyncIsOnDiskReplyBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && message.hasOwnProperty("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.FSSyncDownloadRequestBody = (function() {

        /**
         * Properties of a FSSyncDownloadRequestBody.
         * @memberof fs
         * @interface IFSSyncDownloadRequestBody
         * @property {string|null} [path] FSSyncDownloadRequestBody path
         * @property {number|Long|null} [version] FSSyncDownloadRequestBody version
         */

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

        /**
         * FSSyncDownloadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncDownloadRequestBody
         * @instance
         */
        FSSyncDownloadRequestBody.prototype.path = "";

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

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

        /**
         * Encodes the specified FSSyncDownloadRequestBody message. Does not implicitly {@link fs.FSSyncDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.IFSSyncDownloadRequestBody} message FSSyncDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncDownloadRequestBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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 FSSyncDownloadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.IFSSyncDownloadRequestBody} message FSSyncDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer).ldelim();
        };

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

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

        /**
         * Verifies a FSSyncDownloadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncDownloadRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && message.hasOwnProperty("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 FSSyncDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncDownloadRequestBody} FSSyncDownloadRequestBody
         */
        FSSyncDownloadRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSSyncDownloadRequestBody)
                return object;
            var message = new $root.fs.FSSyncDownloadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 FSSyncDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncDownloadRequestBody
         * @static
         * @param {fs.FSSyncDownloadRequestBody} message FSSyncDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncDownloadRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.version != null && message.hasOwnProperty("version"))
                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 FSSyncDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

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

        return FSSyncDownloadRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts);
                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) {
            if (object instanceof $root.fs.AdoptRemoteRequestBody)
                return object;
            var message = new $root.fs.AdoptRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".fs.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options);
            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.DiffCurrentAndRemoteRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteRequestBody path
         * @property {common.IUInt64Value|null} [remoteVersion] DiffCurrentAndRemoteRequestBody remoteVersion
         */

        /**
         * Constructs a new DiffCurrentAndRemoteRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteRequestBody.
         * @implements IDiffCurrentAndRemoteRequestBody
         * @constructor
         * @param {fs.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)
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @instance
         */
        DiffCurrentAndRemoteRequestBody.prototype.path = "";

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

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

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.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).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.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 fs.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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         */
        DiffCurrentAndRemoteRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteRequestBody)
                return object;
            var message = new $root.fs.DiffCurrentAndRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".fs.DiffCurrentAndRemoteRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteVersion = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof fs.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 fs.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 + "/fs.DiffCurrentAndRemoteRequestBody";
        };

        return DiffCurrentAndRemoteRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.fs.FolderDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.diff = $root.fs.FolderDiff.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.diff != null && message.hasOwnProperty("diff")) {
                var error = $root.fs.FolderDiff.verify(message.diff);
                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) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteReplyBody)
                return object;
            var message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (typeof object.diff !== "object")
                    throw TypeError(".fs.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.fs.FolderDiff.fromObject(object.diff);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && message.hasOwnProperty("diff"))
                object.diff = $root.fs.FolderDiff.toObject(message.diff, options);
            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 {common.IUInt64Value|null} [remoteVersion] FolderDiff remoteVersion
         * @property {Array.<fs.IListingEntryMsg>|null} [inCurrent] FolderDiff inCurrent
         * @property {Array.<fs.IListingEntryMsg>|null} [inRemote] FolderDiff inRemote
         * @property {Array.<string>|null} [nameOverlaps] FolderDiff nameOverlaps
         * @property {fs.FolderDiff.ITimeStamps|null} [ctime] FolderDiff ctime
         * @property {fs.FolderDiff.ITimeStamps|null} [mtime] FolderDiff mtime
         * @property {fs.FolderDiff.IXAttrs|null} [xattrs] FolderDiff xattrs
         */

        /**
         * Constructs a new FolderDiff.
         * @memberof fs
         * @classdesc Represents a FolderDiff.
         * @implements IFolderDiff
         * @constructor
         * @param {fs.IFolderDiff=} [properties] Properties to set
         */
        function FolderDiff(properties) {
            this.inCurrent = [];
            this.inRemote = [];
            this.nameOverlaps = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null)
                        this[keys[i]] = properties[keys[i]];
        }

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

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

        /**
         * FolderDiff inCurrent.
         * @member {Array.<fs.IListingEntryMsg>} inCurrent
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.inCurrent = $util.emptyArray;

        /**
         * FolderDiff inRemote.
         * @member {Array.<fs.IListingEntryMsg>} inRemote
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.inRemote = $util.emptyArray;

        /**
         * FolderDiff nameOverlaps.
         * @member {Array.<string>} nameOverlaps
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.nameOverlaps = $util.emptyArray;

        /**
         * FolderDiff ctime.
         * @member {fs.FolderDiff.ITimeStamps|null|undefined} ctime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.ctime = null;

        /**
         * FolderDiff mtime.
         * @member {fs.FolderDiff.ITimeStamps|null|undefined} mtime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.mtime = null;

        /**
         * FolderDiff xattrs.
         * @member {fs.FolderDiff.IXAttrs|null|undefined} xattrs
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.xattrs = null;

        /**
         * 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) {
            if (!writer)
                writer = $Writer.create();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.inCurrent != null && message.inCurrent.length)
                for (var i = 0; i < message.inCurrent.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.inCurrent[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.inRemote != null && message.inRemote.length)
                for (var i = 0; i < message.inRemote.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.inRemote[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.nameOverlaps != null && message.nameOverlaps.length)
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    writer.uint32(/* id 5, wireType 2 =*/42).string(message.nameOverlaps[i]);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.fs.FolderDiff.TimeStamps.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.fs.FolderDiff.TimeStamps.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs"))
                $root.fs.FolderDiff.XAttrs.encode(message.xattrs, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.currentVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        if (!(message.inCurrent && message.inCurrent.length))
                            message.inCurrent = [];
                        message.inCurrent.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                        break;
                    }
                case 4: {
                        if (!(message.inRemote && message.inRemote.length))
                            message.inRemote = [];
                        message.inRemote.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32()));
                        break;
                    }
                case 5: {
                        if (!(message.nameOverlaps && message.nameOverlaps.length))
                            message.nameOverlaps = [];
                        message.nameOverlaps.push(reader.string());
                        break;
                    }
                case 6: {
                        message.ctime = $root.fs.FolderDiff.TimeStamps.decode(reader, reader.uint32());
                        break;
                    }
                case 7: {
                        message.mtime = $root.fs.FolderDiff.TimeStamps.decode(reader, reader.uint32());
                        break;
                    }
                case 8: {
                        message.xattrs = $root.fs.FolderDiff.XAttrs.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.currentVersion != null && message.hasOwnProperty("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.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.inCurrent != null && message.hasOwnProperty("inCurrent")) {
                if (!Array.isArray(message.inCurrent))
                    return "inCurrent: array expected";
                for (var i = 0; i < message.inCurrent.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.inCurrent[i]);
                    if (error)
                        return "inCurrent." + error;
                }
            }
            if (message.inRemote != null && message.hasOwnProperty("inRemote")) {
                if (!Array.isArray(message.inRemote))
                    return "inRemote: array expected";
                for (var i = 0; i < message.inRemote.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.inRemote[i]);
                    if (error)
                        return "inRemote." + error;
                }
            }
            if (message.nameOverlaps != null && message.hasOwnProperty("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";
            }
            if (message.ctime != null && message.hasOwnProperty("ctime")) {
                var error = $root.fs.FolderDiff.TimeStamps.verify(message.ctime);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && message.hasOwnProperty("mtime")) {
                var error = $root.fs.FolderDiff.TimeStamps.verify(message.mtime);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && message.hasOwnProperty("xattrs")) {
                var error = $root.fs.FolderDiff.XAttrs.verify(message.xattrs);
                if (error)
                    return "xattrs." + error;
            }
            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) {
            if (object instanceof $root.fs.FolderDiff)
                return object;
            var message = new $root.fs.FolderDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    (message.currentVersion = $util.Long.fromValue(object.currentVersion)).unsigned = 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.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".fs.FolderDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            if (object.inCurrent) {
                if (!Array.isArray(object.inCurrent))
                    throw TypeError(".fs.FolderDiff.inCurrent: array expected");
                message.inCurrent = [];
                for (var i = 0; i < object.inCurrent.length; ++i) {
                    if (typeof object.inCurrent[i] !== "object")
                        throw TypeError(".fs.FolderDiff.inCurrent: object expected");
                    message.inCurrent[i] = $root.fs.ListingEntryMsg.fromObject(object.inCurrent[i]);
                }
            }
            if (object.inRemote) {
                if (!Array.isArray(object.inRemote))
                    throw TypeError(".fs.FolderDiff.inRemote: array expected");
                message.inRemote = [];
                for (var i = 0; i < object.inRemote.length; ++i) {
                    if (typeof object.inRemote[i] !== "object")
                        throw TypeError(".fs.FolderDiff.inRemote: object expected");
                    message.inRemote[i] = $root.fs.ListingEntryMsg.fromObject(object.inRemote[i]);
                }
            }
            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]);
            }
            if (object.ctime != null) {
                if (typeof object.ctime !== "object")
                    throw TypeError(".fs.FolderDiff.ctime: object expected");
                message.ctime = $root.fs.FolderDiff.TimeStamps.fromObject(object.ctime);
            }
            if (object.mtime != null) {
                if (typeof object.mtime !== "object")
                    throw TypeError(".fs.FolderDiff.mtime: object expected");
                message.mtime = $root.fs.FolderDiff.TimeStamps.fromObject(object.mtime);
            }
            if (object.xattrs != null) {
                if (typeof object.xattrs !== "object")
                    throw TypeError(".fs.FolderDiff.xattrs: object expected");
                message.xattrs = $root.fs.FolderDiff.XAttrs.fromObject(object.xattrs);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults) {
                object.inCurrent = [];
                object.inRemote = [];
                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() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : 0;
                object.remoteVersion = null;
                object.ctime = null;
                object.mtime = null;
                object.xattrs = null;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                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.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            if (message.inCurrent && message.inCurrent.length) {
                object.inCurrent = [];
                for (var j = 0; j < message.inCurrent.length; ++j)
                    object.inCurrent[j] = $root.fs.ListingEntryMsg.toObject(message.inCurrent[j], options);
            }
            if (message.inRemote && message.inRemote.length) {
                object.inRemote = [];
                for (var j = 0; j < message.inRemote.length; ++j)
                    object.inRemote[j] = $root.fs.ListingEntryMsg.toObject(message.inRemote[j], options);
            }
            if (message.nameOverlaps && message.nameOverlaps.length) {
                object.nameOverlaps = [];
                for (var j = 0; j < message.nameOverlaps.length; ++j)
                    object.nameOverlaps[j] = message.nameOverlaps[j];
            }
            if (message.ctime != null && message.hasOwnProperty("ctime"))
                object.ctime = $root.fs.FolderDiff.TimeStamps.toObject(message.ctime, options);
            if (message.mtime != null && message.hasOwnProperty("mtime"))
                object.mtime = $root.fs.FolderDiff.TimeStamps.toObject(message.mtime, options);
            if (message.xattrs != null && message.hasOwnProperty("xattrs"))
                object.xattrs = $root.fs.FolderDiff.XAttrs.toObject(message.xattrs, options);
            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.TimeStamps = (function() {

            /**
             * Properties of a TimeStamps.
             * @memberof fs.FolderDiff
             * @interface ITimeStamps
             * @property {number|Long|null} [current] TimeStamps current
             * @property {common.IUInt64Value|null} [remote] TimeStamps remote
             */

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

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

            /**
             * TimeStamps remote.
             * @member {common.IUInt64Value|null|undefined} remote
             * @memberof fs.FolderDiff.TimeStamps
             * @instance
             */
            TimeStamps.prototype.remote = null;

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

            /**
             * Encodes the specified TimeStamps message. Does not implicitly {@link fs.FolderDiff.TimeStamps.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.ITimeStamps} message TimeStamps message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TimeStamps.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                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"))
                    $root.common.UInt64Value.encode(message.remote, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                return writer;
            };

            /**
             * Encodes the specified TimeStamps message, length delimited. Does not implicitly {@link fs.FolderDiff.TimeStamps.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.ITimeStamps} message TimeStamps message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TimeStamps.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

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

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

            /**
             * Verifies a TimeStamps message.
             * @function verify
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            TimeStamps.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.current != null && message.hasOwnProperty("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 && message.hasOwnProperty("remote")) {
                    var error = $root.common.UInt64Value.verify(message.remote);
                    if (error)
                        return "remote." + error;
                }
                return null;
            };

            /**
             * Creates a TimeStamps message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.TimeStamps} TimeStamps
             */
            TimeStamps.fromObject = function fromObject(object) {
                if (object instanceof $root.fs.FolderDiff.TimeStamps)
                    return object;
                var message = new $root.fs.FolderDiff.TimeStamps();
                if (object.current != null)
                    if ($util.Long)
                        (message.current = $util.Long.fromValue(object.current)).unsigned = 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 (typeof object.remote !== "object")
                        throw TypeError(".fs.FolderDiff.TimeStamps.remote: object expected");
                    message.remote = $root.common.UInt64Value.fromObject(object.remote);
                }
                return message;
            };

            /**
             * Creates a plain object from a TimeStamps message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.TimeStamps
             * @static
             * @param {fs.FolderDiff.TimeStamps} message TimeStamps
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            TimeStamps.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                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() : long;
                    } else
                        object.current = options.longs === String ? "0" : 0;
                    object.remote = null;
                }
                if (message.current != null && message.hasOwnProperty("current"))
                    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 && message.hasOwnProperty("remote"))
                    object.remote = $root.common.UInt64Value.toObject(message.remote, options);
                return object;
            };

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

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

            return TimeStamps;
        })();

        FolderDiff.XAttrs = (function() {

            /**
             * Properties of a XAttrs.
             * @memberof fs.FolderDiff
             * @interface IXAttrs
             * @property {Array.<file.INameAndXAttrValue>|null} [inCurrent] XAttrs inCurrent
             * @property {Array.<file.INameAndXAttrValue>|null} [inRemote] XAttrs inRemote
             * @property {Array.<string>|null} [nameOverlaps] XAttrs nameOverlaps
             */

            /**
             * Constructs a new XAttrs.
             * @memberof fs.FolderDiff
             * @classdesc Represents a XAttrs.
             * @implements IXAttrs
             * @constructor
             * @param {fs.FolderDiff.IXAttrs=} [properties] Properties to set
             */
            function XAttrs(properties) {
                this.inCurrent = [];
                this.inRemote = [];
                this.nameOverlaps = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * XAttrs inCurrent.
             * @member {Array.<file.INameAndXAttrValue>} inCurrent
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.inCurrent = $util.emptyArray;

            /**
             * XAttrs inRemote.
             * @member {Array.<file.INameAndXAttrValue>} inRemote
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.inRemote = $util.emptyArray;

            /**
             * XAttrs nameOverlaps.
             * @member {Array.<string>} nameOverlaps
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             */
            XAttrs.prototype.nameOverlaps = $util.emptyArray;

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

            /**
             * Encodes the specified XAttrs message. Does not implicitly {@link fs.FolderDiff.XAttrs.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.IXAttrs} message XAttrs message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            XAttrs.encode = function encode(message, writer) {
                if (!writer)
                    writer = $Writer.create();
                if (message.inCurrent != null && message.inCurrent.length)
                    for (var i = 0; i < message.inCurrent.length; ++i)
                        $root.file.NameAndXAttrValue.encode(message.inCurrent[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.inRemote != null && message.inRemote.length)
                    for (var i = 0; i < message.inRemote.length; ++i)
                        $root.file.NameAndXAttrValue.encode(message.inRemote[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                if (message.nameOverlaps != null && message.nameOverlaps.length)
                    for (var i = 0; i < message.nameOverlaps.length; ++i)
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.nameOverlaps[i]);
                return writer;
            };

            /**
             * Encodes the specified XAttrs message, length delimited. Does not implicitly {@link fs.FolderDiff.XAttrs.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.IXAttrs} message XAttrs message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            XAttrs.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer).ldelim();
            };

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

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

            /**
             * Verifies a XAttrs message.
             * @function verify
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            XAttrs.verify = function verify(message) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.inCurrent != null && message.hasOwnProperty("inCurrent")) {
                    if (!Array.isArray(message.inCurrent))
                        return "inCurrent: array expected";
                    for (var i = 0; i < message.inCurrent.length; ++i) {
                        var error = $root.file.NameAndXAttrValue.verify(message.inCurrent[i]);
                        if (error)
                            return "inCurrent." + error;
                    }
                }
                if (message.inRemote != null && message.hasOwnProperty("inRemote")) {
                    if (!Array.isArray(message.inRemote))
                        return "inRemote: array expected";
                    for (var i = 0; i < message.inRemote.length; ++i) {
                        var error = $root.file.NameAndXAttrValue.verify(message.inRemote[i]);
                        if (error)
                            return "inRemote." + error;
                    }
                }
                if (message.nameOverlaps != null && message.hasOwnProperty("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 XAttrs message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.XAttrs} XAttrs
             */
            XAttrs.fromObject = function fromObject(object) {
                if (object instanceof $root.fs.FolderDiff.XAttrs)
                    return object;
                var message = new $root.fs.FolderDiff.XAttrs();
                if (object.inCurrent) {
                    if (!Array.isArray(object.inCurrent))
                        throw TypeError(".fs.FolderDiff.XAttrs.inCurrent: array expected");
                    message.inCurrent = [];
                    for (var i = 0; i < object.inCurrent.length; ++i) {
                        if (typeof object.inCurrent[i] !== "object")
                            throw TypeError(".fs.FolderDiff.XAttrs.inCurrent: object expected");
                        message.inCurrent[i] = $root.file.NameAndXAttrValue.fromObject(object.inCurrent[i]);
                    }
                }
                if (object.inRemote) {
                    if (!Array.isArray(object.inRemote))
                        throw TypeError(".fs.FolderDiff.XAttrs.inRemote: array expected");
                    message.inRemote = [];
                    for (var i = 0; i < object.inRemote.length; ++i) {
                        if (typeof object.inRemote[i] !== "object")
                            throw TypeError(".fs.FolderDiff.XAttrs.inRemote: object expected");
                        message.inRemote[i] = $root.file.NameAndXAttrValue.fromObject(object.inRemote[i]);
                    }
                }
                if (object.nameOverlaps) {
                    if (!Array.isArray(object.nameOverlaps))
                        throw TypeError(".fs.FolderDiff.XAttrs.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 XAttrs message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.XAttrs
             * @static
             * @param {fs.FolderDiff.XAttrs} message XAttrs
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            XAttrs.toObject = function toObject(message, options) {
                if (!options)
                    options = {};
                var object = {};
                if (options.arrays || options.defaults) {
                    object.inCurrent = [];
                    object.inRemote = [];
                    object.nameOverlaps = [];
                }
                if (message.inCurrent && message.inCurrent.length) {
                    object.inCurrent = [];
                    for (var j = 0; j < message.inCurrent.length; ++j)
                        object.inCurrent[j] = $root.file.NameAndXAttrValue.toObject(message.inCurrent[j], options);
                }
                if (message.inRemote && message.inRemote.length) {
                    object.inRemote = [];
                    for (var j = 0; j < message.inRemote.length; ++j)
                        object.inRemote[j] = $root.file.NameAndXAttrValue.toObject(message.inRemote[j], options);
                }
                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 XAttrs to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.XAttrs
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            XAttrs.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

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

            return XAttrs;
        })();

        return FolderDiff;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts);
                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) {
            if (object instanceof $root.fs.FSSyncUploadRequestBody)
                return object;
            var message = new $root.fs.FSSyncUploadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".fs.FSSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options);
            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.FSSyncUploadReplyBody = (function() {

        /**
         * Properties of a FSSyncUploadReplyBody.
         * @memberof fs
         * @interface IFSSyncUploadReplyBody
         * @property {common.IUInt64Value|null} [uploadedVersion] FSSyncUploadReplyBody uploadedVersion
         */

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

        /**
         * FSSyncUploadReplyBody uploadedVersion.
         * @member {common.IUInt64Value|null|undefined} uploadedVersion
         * @memberof fs.FSSyncUploadReplyBody
         * @instance
         */
        FSSyncUploadReplyBody.prototype.uploadedVersion = null;

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

        /**
         * Encodes the specified FSSyncUploadReplyBody message. Does not implicitly {@link fs.FSSyncUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {fs.IFSSyncUploadReplyBody} message FSSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadReplyBody.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            return writer;
        };

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

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

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

        /**
         * Verifies a FSSyncUploadReplyBody message.
         * @function verify
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncUploadReplyBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion);
                if (error)
                    return "uploadedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FSSyncUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncUploadReplyBody} FSSyncUploadReplyBody
         */
        FSSyncUploadReplyBody.fromObject = function fromObject(object) {
            if (object instanceof $root.fs.FSSyncUploadReplyBody)
                return object;
            var message = new $root.fs.FSSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (typeof object.uploadedVersion !== "object")
                    throw TypeError(".fs.FSSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSSyncUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncUploadReplyBody
         * @static
         * @param {fs.FSSyncUploadReplyBody} message FSSyncUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncUploadReplyBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options);
            return object;
        };

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

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

        return FSSyncUploadReplyBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.itemName != null && message.hasOwnProperty("itemName"))
                if (!$util.isString(message.itemName))
                    return "itemName: string expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.fs.AdoptRemoteFolderItemRequestBody.Options.verify(message.opts);
                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) {
            if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody)
                return object;
            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 (typeof object.opts !== "object")
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.opts: object expected");
                message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.itemName = "";
                object.opts = null;
            }
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.itemName != null && message.hasOwnProperty("itemName"))
                object.itemName = message.itemName;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.toObject(message.opts, options);
            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
             */

            /**
             * 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)
                            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;

            /**
             * 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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                            break;
                        }
                    case 2: {
                            message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.localVersion != null && message.hasOwnProperty("localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion")) {
                    var error = $root.common.UInt64Value.verify(message.uploadVersion);
                    if (error)
                        return "uploadVersion." + 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) {
                if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody.Options)
                    return object;
                var message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                if (object.localVersion != null) {
                    if (typeof object.localVersion !== "object")
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion);
                }
                if (object.uploadVersion != null) {
                    if (typeof object.uploadVersion !== "object")
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.uploadVersion: object expected");
                    message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.uploadVersion = null;
                }
                if (message.localVersion != null && message.hasOwnProperty("localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options);
                if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion"))
                    object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options);
                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;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.File();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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());
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.name != null && message.hasOwnProperty("name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                if (typeof message.isNew !== "boolean")
                    return "isNew: boolean expected";
            if (message.impl != null && message.hasOwnProperty("impl")) {
                var error = $root.common.ObjectReference.verify(message.impl);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.File)
                return object;
            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 (typeof object.impl !== "object")
                    throw TypeError(".file.File.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl);
            }
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.isVersioned != null && message.hasOwnProperty("isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.name != null && message.hasOwnProperty("name"))
                object.name = message.name;
            if (message.isNew != null && message.hasOwnProperty("isNew"))
                object.isNew = message.isNew;
            if (message.impl != null && message.hasOwnProperty("impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options);
            if (message.isSynced != null && message.hasOwnProperty("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
         */

        /**
         * 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)
                        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;

        /**
         * 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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                $root.file.SyncVersionsBranchMsg.encode(message.synced, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                $root.file.SyncVersionsBranchMsg.encode(message.remote, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                $root.common.BooleanValue.encode(message.existsInSyncedParent, writer.uint32(/* id 5, wireType 2 =*/42).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncStatusMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.state = reader.string();
                        break;
                    }
                case 2: {
                        message.local = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.synced = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.remote = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.existsInSyncedParent = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.state != null && message.hasOwnProperty("state"))
                if (!$util.isString(message.state))
                    return "state: string expected";
            if (message.local != null && message.hasOwnProperty("local")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.local);
                if (error)
                    return "local." + error;
            }
            if (message.synced != null && message.hasOwnProperty("synced")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.synced);
                if (error)
                    return "synced." + error;
            }
            if (message.remote != null && message.hasOwnProperty("remote")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.remote);
                if (error)
                    return "remote." + error;
            }
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent")) {
                var error = $root.common.BooleanValue.verify(message.existsInSyncedParent);
                if (error)
                    return "existsInSyncedParent." + 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) {
            if (object instanceof $root.file.SyncStatusMsg)
                return object;
            var message = new $root.file.SyncStatusMsg();
            if (object.state != null)
                message.state = String(object.state);
            if (object.local != null) {
                if (typeof object.local !== "object")
                    throw TypeError(".file.SyncStatusMsg.local: object expected");
                message.local = $root.file.SyncVersionsBranchMsg.fromObject(object.local);
            }
            if (object.synced != null) {
                if (typeof object.synced !== "object")
                    throw TypeError(".file.SyncStatusMsg.synced: object expected");
                message.synced = $root.file.SyncVersionsBranchMsg.fromObject(object.synced);
            }
            if (object.remote != null) {
                if (typeof object.remote !== "object")
                    throw TypeError(".file.SyncStatusMsg.remote: object expected");
                message.remote = $root.file.SyncVersionsBranchMsg.fromObject(object.remote);
            }
            if (object.existsInSyncedParent != null) {
                if (typeof object.existsInSyncedParent !== "object")
                    throw TypeError(".file.SyncStatusMsg.existsInSyncedParent: object expected");
                message.existsInSyncedParent = $root.common.BooleanValue.fromObject(object.existsInSyncedParent);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.state = "";
                object.local = null;
                object.synced = null;
                object.remote = null;
                object.existsInSyncedParent = null;
            }
            if (message.state != null && message.hasOwnProperty("state"))
                object.state = message.state;
            if (message.local != null && message.hasOwnProperty("local"))
                object.local = $root.file.SyncVersionsBranchMsg.toObject(message.local, options);
            if (message.synced != null && message.hasOwnProperty("synced"))
                object.synced = $root.file.SyncVersionsBranchMsg.toObject(message.synced, options);
            if (message.remote != null && message.hasOwnProperty("remote"))
                object.remote = $root.file.SyncVersionsBranchMsg.toObject(message.remote, options);
            if (message.existsInSyncedParent != null && message.hasOwnProperty("existsInSyncedParent"))
                object.existsInSyncedParent = $root.common.BooleanValue.toObject(message.existsInSyncedParent, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                $root.common.UInt64Value.encode(message.latest, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncVersionsBranchMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.latest = $root.common.UInt64Value.decode(reader, reader.uint32());
                        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());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.latest != null && message.hasOwnProperty("latest")) {
                var error = $root.common.UInt64Value.verify(message.latest);
                if (error)
                    return "latest." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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 && message.hasOwnProperty("isArchived")) {
                var error = $root.common.BooleanValue.verify(message.isArchived);
                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) {
            if (object instanceof $root.file.SyncVersionsBranchMsg)
                return object;
            var message = new $root.file.SyncVersionsBranchMsg();
            if (object.latest != null) {
                if (typeof object.latest !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.latest: object expected");
                message.latest = $root.common.UInt64Value.fromObject(object.latest);
            }
            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])).unsigned = 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 (typeof object.isArchived !== "object")
                    throw TypeError(".file.SyncVersionsBranchMsg.isArchived: object expected");
                message.isArchived = $root.common.BooleanValue.fromObject(object.isArchived);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults) {
                object.latest = null;
                object.isArchived = null;
            }
            if (message.latest != null && message.hasOwnProperty("latest"))
                object.latest = $root.common.UInt64Value.toObject(message.latest, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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 && message.hasOwnProperty("isArchived"))
                object.isArchived = $root.common.BooleanValue.toObject(message.isArchived, options);
            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.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 {file.ISyncStatusMsg|null} [sync] StatsMsg sync
         */

        /**
         * 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)
                        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 sync.
         * @member {file.ISyncStatusMsg|null|undefined} sync
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.sync = 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) {
            if (!writer)
                writer = $Writer.create();
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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()).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.common.UInt64Value.encode(message.mtime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.common.UInt64Value.encode(message.ctime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
            if (message.sync != null && Object.hasOwnProperty.call(message, "sync"))
                $root.file.SyncStatusMsg.encode(message.sync, writer.uint32(/* id 9, wireType 2 =*/74).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.StatsMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.writable = reader.bool();
                        break;
                    }
                case 5: {
                        message.size = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.mtime = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 7: {
                        message.ctime = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 8: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 9: {
                        message.sync = $root.file.SyncStatusMsg.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.isFile != null && message.hasOwnProperty("isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && message.hasOwnProperty("isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && message.hasOwnProperty("isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink);
                if (error)
                    return "isLink." + error;
            }
            if (message.writable != null && message.hasOwnProperty("writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.size != null && message.hasOwnProperty("size")) {
                var error = $root.common.UInt64Value.verify(message.size);
                if (error)
                    return "size." + error;
            }
            if (message.mtime != null && message.hasOwnProperty("mtime")) {
                var error = $root.common.UInt64Value.verify(message.mtime);
                if (error)
                    return "mtime." + error;
            }
            if (message.ctime != null && message.hasOwnProperty("ctime")) {
                var error = $root.common.UInt64Value.verify(message.ctime);
                if (error)
                    return "ctime." + error;
            }
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                if (error)
                    return "version." + error;
            }
            if (message.sync != null && message.hasOwnProperty("sync")) {
                var error = $root.file.SyncStatusMsg.verify(message.sync);
                if (error)
                    return "sync." + 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) {
            if (object instanceof $root.file.StatsMsg)
                return object;
            var message = new $root.file.StatsMsg();
            if (object.isFile != null) {
                if (typeof object.isFile !== "object")
                    throw TypeError(".file.StatsMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile);
            }
            if (object.isFolder != null) {
                if (typeof object.isFolder !== "object")
                    throw TypeError(".file.StatsMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder);
            }
            if (object.isLink != null) {
                if (typeof object.isLink !== "object")
                    throw TypeError(".file.StatsMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink);
            }
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.size != null) {
                if (typeof object.size !== "object")
                    throw TypeError(".file.StatsMsg.size: object expected");
                message.size = $root.common.UInt64Value.fromObject(object.size);
            }
            if (object.mtime != null) {
                if (typeof object.mtime !== "object")
                    throw TypeError(".file.StatsMsg.mtime: object expected");
                message.mtime = $root.common.UInt64Value.fromObject(object.mtime);
            }
            if (object.ctime != null) {
                if (typeof object.ctime !== "object")
                    throw TypeError(".file.StatsMsg.ctime: object expected");
                message.ctime = $root.common.UInt64Value.fromObject(object.ctime);
            }
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.StatsMsg.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            if (object.sync != null) {
                if (typeof object.sync !== "object")
                    throw TypeError(".file.StatsMsg.sync: object expected");
                message.sync = $root.file.SyncStatusMsg.fromObject(object.sync);
            }
            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) {
            if (!options)
                options = {};
            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.sync = null;
            }
            if (message.isFile != null && message.hasOwnProperty("isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options);
            if (message.isFolder != null && message.hasOwnProperty("isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options);
            if (message.isLink != null && message.hasOwnProperty("isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options);
            if (message.writable != null && message.hasOwnProperty("writable"))
                object.writable = message.writable;
            if (message.size != null && message.hasOwnProperty("size"))
                object.size = $root.common.UInt64Value.toObject(message.size, options);
            if (message.mtime != null && message.hasOwnProperty("mtime"))
                object.mtime = $root.common.UInt64Value.toObject(message.mtime, options);
            if (message.ctime != null && message.hasOwnProperty("ctime"))
                object.ctime = $root.common.UInt64Value.toObject(message.ctime, options);
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            if (message.sync != null && message.hasOwnProperty("sync"))
                object.sync = $root.file.SyncStatusMsg.toObject(message.sync, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.GetXAttrRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.xaName = "";
            if (message.xaName != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.XAttrValue)
                return object;
            var message = new $root.file.XAttrValue();
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.XAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.XAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.XAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                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) {
            if (object instanceof $root.file.ReadBytesRequestBody)
                return object;
            var message = new $root.file.ReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.ReadBytesReplyBody)
                return object;
            var message = new $root.file.ReadBytesReplyBody();
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.ReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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.FileEventMsg = (function() {

        /**
         * Properties of a FileEventMsg.
         * @memberof file
         * @interface IFileEventMsg
         * @property {string|null} [type] FileEventMsg type
         * @property {string|null} [path] FileEventMsg path
         * @property {common.IStringValue|null} [src] FileEventMsg src
         * @property {common.IUInt64Value|null} [newVersion] FileEventMsg newVersion
         * @property {common.IUInt64Value|null} [removedArchVer] FileEventMsg removedArchVer
         * @property {common.IUInt64Value|null} [archivedVersion] FileEventMsg archivedVersion
         */

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

        /**
         * FileEventMsg type.
         * @member {string} type
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.type = "";

        /**
         * FileEventMsg path.
         * @member {string} path
         * @memberof file.FileEventMsg
         * @instance
         */
        FileEventMsg.prototype.path = "";

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

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

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

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

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

        /**
         * Encodes the specified FileEventMsg message. Does not implicitly {@link file.FileEventMsg.verify|verify} messages.
         * @function encode
         * @memberof file.FileEventMsg
         * @static
         * @param {file.IFileEventMsg} message FileEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileEventMsg.encode = function encode(message, writer) {
            if (!writer)
                writer = $Writer.create();
            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"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.StringValue.encode(message.src, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
            if (message.removedArchVer != null && Object.hasOwnProperty.call(message, "removedArchVer"))
                $root.common.UInt64Value.encode(message.removedArchVer, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
            return writer;
        };

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

        /**
         * Decodes a FileEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileEventMsg} FileEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileEventMsg.decode = function decode(reader, length) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = reader.string();
                        break;
                    }
                case 3: {
                        message.src = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 5: {
                        message.removedArchVer = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 6: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    break;
                }
            }
            return message;
        };

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

        /**
         * Verifies a FileEventMsg message.
         * @function verify
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileEventMsg.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.src != null && message.hasOwnProperty("src")) {
                var error = $root.common.StringValue.verify(message.src);
                if (error)
                    return "src." + error;
            }
            if (message.newVersion != null && message.hasOwnProperty("newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion);
                if (error)
                    return "newVersion." + error;
            }
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer")) {
                var error = $root.common.UInt64Value.verify(message.removedArchVer);
                if (error)
                    return "removedArchVer." + error;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FileEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileEventMsg} FileEventMsg
         */
        FileEventMsg.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileEventMsg)
                return object;
            var message = new $root.file.FileEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null)
                message.path = String(object.path);
            if (object.src != null) {
                if (typeof object.src !== "object")
                    throw TypeError(".file.FileEventMsg.src: object expected");
                message.src = $root.common.StringValue.fromObject(object.src);
            }
            if (object.newVersion != null) {
                if (typeof object.newVersion !== "object")
                    throw TypeError(".file.FileEventMsg.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion);
            }
            if (object.removedArchVer != null) {
                if (typeof object.removedArchVer !== "object")
                    throw TypeError(".file.FileEventMsg.removedArchVer: object expected");
                message.removedArchVer = $root.common.UInt64Value.fromObject(object.removedArchVer);
            }
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.FileEventMsg.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileEventMsg
         * @static
         * @param {file.FileEventMsg} message FileEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileEventMsg.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = "";
                object.src = null;
                object.newVersion = null;
                object.removedArchVer = null;
                object.archivedVersion = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = message.path;
            if (message.src != null && message.hasOwnProperty("src"))
                object.src = $root.common.StringValue.toObject(message.src, options);
            if (message.newVersion != null && message.hasOwnProperty("newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options);
            if (message.removedArchVer != null && message.hasOwnProperty("removedArchVer"))
                object.removedArchVer = $root.common.UInt64Value.toObject(message.removedArchVer, options);
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            return object;
        };

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

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

        return FileEventMsg;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion);
                if (error)
                    return "archivedVersion." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.VersionedReadFlags)
                return object;
            var message = new $root.file.VersionedReadFlags();
            if (object.archivedVersion != null) {
                if (typeof object.archivedVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.VersionedReadFlags.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.archivedVersion = null;
                object.remoteVersion = null;
            }
            if (message.archivedVersion != null && message.hasOwnProperty("archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.RequestWithVersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.RequestWithVersionedReadFlags)
                return object;
            var message = new $root.file.RequestWithVersionedReadFlags();
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.RequestWithVersionedReadFlags.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.flags = null;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrRequestBody)
                return object;
            var message = new $root.file.VersionedGetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.flags = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedGetXAttrReplyBody)
                return object;
            var message = new $root.file.VersionedGetXAttrReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.str !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedGetXAttrReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedListXAttrsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedListXAttrsReplyBody)
                return object;
            var message = new $root.file.VersionedListXAttrsReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.start != null && message.hasOwnProperty("start")) {
                var error = $root.common.UInt64Value.verify(message.start);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && message.hasOwnProperty("end")) {
                var error = $root.common.UInt64Value.verify(message.end);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && message.hasOwnProperty("flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags);
                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) {
            if (object instanceof $root.file.VersionedReadBytesRequestBody)
                return object;
            var message = new $root.file.VersionedReadBytesRequestBody();
            if (object.start != null) {
                if (typeof object.start !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start);
            }
            if (object.end != null) {
                if (typeof object.end !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end);
            }
            if (object.flags != null) {
                if (typeof object.flags !== "object")
                    throw TypeError(".file.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.start != null && message.hasOwnProperty("start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options);
            if (message.end != null && message.hasOwnProperty("end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options);
            if (message.flags != null && message.hasOwnProperty("flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.VersionedReadBytesReplyBody)
                return object;
            var message = new $root.file.VersionedReadBytesReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.bytes !== "object")
                    throw TypeError(".file.VersionedReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.bytes = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadTxtReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadTxtReplyBody)
                return object;
            var message = new $root.file.VersionedReadTxtReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.txt = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadJsonReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("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) {
            if (object instanceof $root.file.VersionedReadJsonReplyBody)
                return object;
            var message = new $root.file.VersionedReadJsonReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.json = "";
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.src = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("src")) {
                var error = $root.common.ObjectReference.verify(message.src);
                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) {
            if (object instanceof $root.file.VersionedGetByteSourceReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSourceReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.src !== "object")
                    throw TypeError(".file.VersionedGetByteSourceReplyBody.src: object expected");
                message.src = $root.common.ObjectReference.fromObject(object.src);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.src = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("src"))
                object.src = $root.common.ObjectReference.toObject(message.src, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                $root.common.UInt64Value.encode(message.current, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ListVersionsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.current = $root.common.UInt64Value.decode(reader, reader.uint32());
                        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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.current != null && message.hasOwnProperty("current")) {
                var error = $root.common.UInt64Value.verify(message.current);
                if (error)
                    return "current." + error;
            }
            if (message.archived != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.ListVersionsReplyBody)
                return object;
            var message = new $root.file.ListVersionsReplyBody();
            if (object.current != null) {
                if (typeof object.current !== "object")
                    throw TypeError(".file.ListVersionsReplyBody.current: object expected");
                message.current = $root.common.UInt64Value.fromObject(object.current);
            }
            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])).unsigned = 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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults)
                object.current = null;
            if (message.current != null && message.hasOwnProperty("current"))
                object.current = $root.common.UInt64Value.toObject(message.current, options);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.changes != null && message.hasOwnProperty("changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes);
                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) {
            if (object instanceof $root.file.UpdateXAttrsRequestBody)
                return object;
            var message = new $root.file.UpdateXAttrsRequestBody();
            if (object.changes != null) {
                if (typeof object.changes !== "object")
                    throw TypeError(".file.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.changes = null;
            if (message.changes != null && message.hasOwnProperty("changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.NameAndXAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.str != null && message.hasOwnProperty("str")) {
                var error = $root.common.StringValue.verify(message.str);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.file.NameAndXAttrValue)
                return object;
            var message = new $root.file.NameAndXAttrValue();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.str != null) {
                if (typeof object.str !== "object")
                    throw TypeError(".file.NameAndXAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str);
            }
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".file.NameAndXAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".file.NameAndXAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.xaName != null && message.hasOwnProperty("xaName"))
                object.xaName = message.xaName;
            if (message.str != null && message.hasOwnProperty("str"))
                object.str = $root.common.StringValue.toObject(message.str, options);
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrsChanges();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.set && message.set.length))
                            message.set = [];
                        message.set.push($root.file.NameAndXAttrValue.decode(reader, reader.uint32()));
                        break;
                    }
                case 2: {
                        if (!(message.remove && message.remove.length))
                            message.remove = [];
                        message.remove.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.set != null && message.hasOwnProperty("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]);
                    if (error)
                        return "set." + error;
                }
            }
            if (message.remove != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.XAttrsChanges)
                return object;
            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 (typeof object.set[i] !== "object")
                        throw TypeError(".file.XAttrsChanges.set: object expected");
                    message.set[i] = $root.file.NameAndXAttrValue.fromObject(object.set[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.bytes != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteBytesRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteTxtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.txt != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteTxtRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.txt = "";
            if (message.txt != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteJsonRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.json != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.WriteJsonRequestBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.json = "";
            if (message.json != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                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) {
            if (object instanceof $root.file.GetByteSinkRequestBody)
                return object;
            var message = new $root.file.GetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.GetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.truncateFile = null;
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.CopyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.file != null && message.hasOwnProperty("file")) {
                var error = $root.common.ObjectReference.verify(message.file);
                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) {
            if (object instanceof $root.file.CopyRequestBody)
                return object;
            var message = new $root.file.CopyRequestBody();
            if (object.file != null) {
                if (typeof object.file !== "object")
                    throw TypeError(".file.CopyRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && message.hasOwnProperty("file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile);
                if (error)
                    return "truncateFile." + error;
            }
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkRequestBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (typeof object.truncateFile !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile);
            }
            if (object.currentVersion != null) {
                if (typeof object.currentVersion !== "object")
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.truncateFile = null;
                object.currentVersion = null;
            }
            if (message.truncateFile != null && message.hasOwnProperty("truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options);
            if (message.currentVersion != null && message.hasOwnProperty("currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.sink = $root.common.ObjectReference.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 && message.hasOwnProperty("sink")) {
                var error = $root.common.ObjectReference.verify(message.sink);
                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) {
            if (object instanceof $root.file.VersionedGetByteSinkReplyBody)
                return object;
            var message = new $root.file.VersionedGetByteSinkReplyBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 (typeof object.sink !== "object")
                    throw TypeError(".file.VersionedGetByteSinkReplyBody.sink: object expected");
                message.sink = $root.common.ObjectReference.fromObject(object.sink);
            }
            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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
                object.sink = null;
            }
            if (message.version != null && message.hasOwnProperty("version"))
                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 && message.hasOwnProperty("sink"))
                object.sink = $root.common.ObjectReference.toObject(message.sink, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("version")) {
                var error = $root.common.UInt64Value.verify(message.version);
                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) {
            if (object instanceof $root.file.ArchiveCurrentRequestBody)
                return object;
            var message = new $root.file.ArchiveCurrentRequestBody();
            if (object.version != null) {
                if (typeof object.version !== "object")
                    throw TypeError(".file.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.version = null;
            if (message.version != null && message.hasOwnProperty("version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskRequestBody)
                return object;
            var message = new $root.file.FileSyncIsOnDiskRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.status != null && message.hasOwnProperty("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) {
            if (object instanceof $root.file.FileSyncIsOnDiskReplyBody)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && message.hasOwnProperty("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.FileSyncDownloadRequestBody = (function() {

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

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

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

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

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

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

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

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

        /**
         * Verifies a FileSyncDownloadRequestBody message.
         * @function verify
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncDownloadRequestBody.verify = function verify(message) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.version != null && message.hasOwnProperty("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 FileSyncDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncDownloadRequestBody} FileSyncDownloadRequestBody
         */
        FileSyncDownloadRequestBody.fromObject = function fromObject(object) {
            if (object instanceof $root.file.FileSyncDownloadRequestBody)
                return object;
            var message = new $root.file.FileSyncDownloadRequestBody();
            if (object.version != null)
                if ($util.Long)
                    (message.version = $util.Long.fromValue(object.version)).unsigned = 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 FileSyncDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncDownloadRequestBody
         * @static
         * @param {file.FileSyncDownloadRequestBody} message FileSyncDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncDownloadRequestBody.toObject = function toObject(message, options) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.version = options.longs === String ? "0" : 0;
            if (message.version != null && message.hasOwnProperty("version"))
                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 FileSyncDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

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

        return FileSyncDownloadRequestBody;
    })();

    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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts);
                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) {
            if (object instanceof $root.file.AdoptRemoteRequestBody)
                return object;
            var message = new $root.file.AdoptRemoteRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                $root.common.BooleanValue.encode(message.dropLocalVer, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToAdopteRemote();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.dropLocalVer = $root.common.BooleanValue.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer")) {
                var error = $root.common.BooleanValue.verify(message.dropLocalVer);
                if (error)
                    return "dropLocalVer." + error;
            }
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion);
                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) {
            if (object instanceof $root.file.OptionsToAdopteRemote)
                return object;
            var message = new $root.file.OptionsToAdopteRemote();
            if (object.dropLocalVer != null) {
                if (typeof object.dropLocalVer !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.dropLocalVer: object expected");
                message.dropLocalVer = $root.common.BooleanValue.fromObject(object.dropLocalVer);
            }
            if (object.remoteVersion != null) {
                if (typeof object.remoteVersion !== "object")
                    throw TypeError(".file.OptionsToAdopteRemote.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.dropLocalVer = null;
                object.remoteVersion = null;
            }
            if (message.dropLocalVer != null && message.hasOwnProperty("dropLocalVer"))
                object.dropLocalVer = $root.common.BooleanValue.toObject(message.dropLocalVer, options);
            if (message.remoteVersion != null && message.hasOwnProperty("remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options);
            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.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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.opts != null && message.hasOwnProperty("opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts);
                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) {
            if (object instanceof $root.file.FileSyncUploadRequestBody)
                return object;
            var message = new $root.file.FileSyncUploadRequestBody();
            if (object.opts != null) {
                if (typeof object.opts !== "object")
                    throw TypeError(".file.FileSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && message.hasOwnProperty("opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.uploadedVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion);
                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) {
            if (object instanceof $root.file.FileSyncUploadReplyBody)
                return object;
            var message = new $root.file.FileSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (typeof object.uploadedVersion !== "object")
                    throw TypeError(".file.FileSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && message.hasOwnProperty("uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options);
            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.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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToUploadLocal();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.localVersion != null && message.hasOwnProperty("localVersion")) {
                var error = $root.common.UInt64Value.verify(message.localVersion);
                if (error)
                    return "localVersion." + error;
            }
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadVersion);
                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) {
            if (object instanceof $root.file.OptionsToUploadLocal)
                return object;
            var message = new $root.file.OptionsToUploadLocal();
            if (object.localVersion != null) {
                if (typeof object.localVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.localVersion: object expected");
                message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion);
            }
            if (object.uploadVersion != null) {
                if (typeof object.uploadVersion !== "object")
                    throw TypeError(".file.OptionsToUploadLocal.uploadVersion: object expected");
                message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.localVersion = null;
                object.uploadVersion = null;
            }
            if (message.localVersion != null && message.hasOwnProperty("localVersion"))
                object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options);
            if (message.uploadVersion != null && message.hasOwnProperty("uploadVersion"))
                object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options);
            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;
    })();

    return file;
})();

module.exports = $root;

},{"protobufjs/minimal":130}],127:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ipc.EnvelopeHeaders();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.msgType = reader.string();
                        break;
                    }
                case 2: {
                        message.fnCallNum = $root.common.UInt64Value.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.msgType != null && message.hasOwnProperty("msgType"))
                if (!$util.isString(message.msgType))
                    return "msgType: string expected";
            if (message.fnCallNum != null && message.hasOwnProperty("fnCallNum")) {
                var error = $root.common.UInt64Value.verify(message.fnCallNum);
                if (error)
                    return "fnCallNum." + error;
            }
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.ipc.EnvelopeHeaders)
                return object;
            var message = new $root.ipc.EnvelopeHeaders();
            if (object.msgType != null)
                message.msgType = String(object.msgType);
            if (object.fnCallNum != null) {
                if (typeof object.fnCallNum !== "object")
                    throw TypeError(".ipc.EnvelopeHeaders.fnCallNum: object expected");
                message.fnCallNum = $root.common.UInt64Value.fromObject(object.fnCallNum);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults) {
                object.msgType = "";
                object.fnCallNum = null;
            }
            if (message.msgType != null && message.hasOwnProperty("msgType"))
                object.msgType = message.msgType;
            if (message.fnCallNum != null && message.hasOwnProperty("fnCallNum"))
                object.fnCallNum = $root.common.UInt64Value.toObject(message.fnCallNum, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.headers != null && Object.hasOwnProperty.call(message, "headers"))
                $root.ipc.EnvelopeHeaders.encode(message.headers, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
            if (message.body != null && Object.hasOwnProperty.call(message, "body"))
                $root.common.BytesValue.encode(message.body, writer.uint32(/* id 2, wireType 2 =*/18).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ipc.Envelope();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.headers = $root.ipc.EnvelopeHeaders.decode(reader, reader.uint32());
                        break;
                    }
                case 2: {
                        message.body = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.headers != null && message.hasOwnProperty("headers")) {
                var error = $root.ipc.EnvelopeHeaders.verify(message.headers);
                if (error)
                    return "headers." + error;
            }
            if (message.body != null && message.hasOwnProperty("body")) {
                var error = $root.common.BytesValue.verify(message.body);
                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) {
            if (object instanceof $root.ipc.Envelope)
                return object;
            var message = new $root.ipc.Envelope();
            if (object.headers != null) {
                if (typeof object.headers !== "object")
                    throw TypeError(".ipc.Envelope.headers: object expected");
                message.headers = $root.ipc.EnvelopeHeaders.fromObject(object.headers);
            }
            if (object.body != null) {
                if (typeof object.body !== "object")
                    throw TypeError(".ipc.Envelope.body: object expected");
                message.body = $root.common.BytesValue.fromObject(object.body);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.headers = null;
                object.body = null;
            }
            if (message.headers != null && message.hasOwnProperty("headers"))
                object.headers = $root.ipc.EnvelopeHeaders.toObject(message.headers, options);
            if (message.body != null && message.hasOwnProperty("body"))
                object.body = $root.common.BytesValue.toObject(message.body, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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":130}],128:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.json_ipc.ValuesSequence();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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()));
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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]);
                    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) {
            if (object instanceof $root.json_ipc.ValuesSequence)
                return object;
            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 (typeof object.values[i] !== "object")
                        throw TypeError(".json_ipc.ValuesSequence.values: object expected");
                    message.values[i] = $root.json_ipc.ValuesSequence.Value.fromObject(object.values[i]);
                }
            }
            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) {
            if (!options)
                options = {};
            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);
            }
            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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.json_ipc.ValuesSequence.BinaryValue();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    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);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.arr != null && message.hasOwnProperty("arr"))
                    if (!(message.arr && typeof message.arr.length === "number" || $util.isString(message.arr)))
                        return "arr: buffer expected";
                if (message.objLocation != null && message.hasOwnProperty("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) {
                if (object instanceof $root.json_ipc.ValuesSequence.BinaryValue)
                    return object;
                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) {
                if (!options)
                    options = {};
                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 && message.hasOwnProperty("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 {number|null} [indexInPassed] TransferredObj indexInPassed
             * @property {Array.<string>|null} [objLocation] TransferredObj objLocation
             */

            /**
             * 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)
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * TransferredObj indexInPassed.
             * @member {number} indexInPassed
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @instance
             */
            TransferredObj.prototype.indexInPassed = 0;

            /**
             * TransferredObj objLocation.
             * @member {Array.<string>} objLocation
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @instance
             */
            TransferredObj.prototype.objLocation = $util.emptyArray;

            /**
             * 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) {
                if (!writer)
                    writer = $Writer.create();
                if (message.indexInPassed != null && Object.hasOwnProperty.call(message, "indexInPassed"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.indexInPassed);
                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 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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.json_ipc.ValuesSequence.TransferredObj();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    switch (tag >>> 3) {
                    case 1: {
                            message.indexInPassed = reader.uint32();
                            break;
                        }
                    case 2: {
                            if (!(message.objLocation && message.objLocation.length))
                                message.objLocation = [];
                            message.objLocation.push(reader.string());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.indexInPassed != null && message.hasOwnProperty("indexInPassed"))
                    if (!$util.isInteger(message.indexInPassed))
                        return "indexInPassed: integer expected";
                if (message.objLocation != null && message.hasOwnProperty("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 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) {
                if (object instanceof $root.json_ipc.ValuesSequence.TransferredObj)
                    return object;
                var message = new $root.json_ipc.ValuesSequence.TransferredObj();
                if (object.indexInPassed != null)
                    message.indexInPassed = object.indexInPassed >>> 0;
                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]);
                }
                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) {
                if (!options)
                    options = {};
                var object = {};
                if (options.arrays || options.defaults)
                    object.objLocation = [];
                if (options.defaults)
                    object.indexInPassed = 0;
                if (message.indexInPassed != null && message.hasOwnProperty("indexInPassed"))
                    object.indexInPassed = message.indexInPassed;
                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 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)
                            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) {
                if (!writer)
                    writer = $Writer.create();
                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()).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()).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()).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()).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).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) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.json_ipc.ValuesSequence.Value();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    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()));
                            break;
                        }
                    case 3: {
                            if (!(message.transferredInJson && message.transferredInJson.length))
                                message.transferredInJson = [];
                            message.transferredInJson.push($root.json_ipc.ValuesSequence.TransferredObj.decode(reader, reader.uint32()));
                            break;
                        }
                    case 4: {
                            message.arr = $root.json_ipc.ValuesSequence.BinaryValue.decode(reader, reader.uint32());
                            break;
                        }
                    case 5: {
                            message.transferred = $root.json_ipc.ValuesSequence.TransferredObj.decode(reader, reader.uint32());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7);
                        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) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (message.json != null && message.hasOwnProperty("json"))
                    if (!$util.isString(message.json))
                        return "json: string expected";
                if (message.binaryInJson != null && message.hasOwnProperty("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]);
                        if (error)
                            return "binaryInJson." + error;
                    }
                }
                if (message.transferredInJson != null && message.hasOwnProperty("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]);
                        if (error)
                            return "transferredInJson." + error;
                    }
                }
                if (message.arr != null && message.hasOwnProperty("arr")) {
                    var error = $root.json_ipc.ValuesSequence.BinaryValue.verify(message.arr);
                    if (error)
                        return "arr." + error;
                }
                if (message.transferred != null && message.hasOwnProperty("transferred")) {
                    var error = $root.json_ipc.ValuesSequence.TransferredObj.verify(message.transferred);
                    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) {
                if (object instanceof $root.json_ipc.ValuesSequence.Value)
                    return object;
                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 (typeof object.binaryInJson[i] !== "object")
                            throw TypeError(".json_ipc.ValuesSequence.Value.binaryInJson: object expected");
                        message.binaryInJson[i] = $root.json_ipc.ValuesSequence.BinaryValue.fromObject(object.binaryInJson[i]);
                    }
                }
                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 (typeof object.transferredInJson[i] !== "object")
                            throw TypeError(".json_ipc.ValuesSequence.Value.transferredInJson: object expected");
                        message.transferredInJson[i] = $root.json_ipc.ValuesSequence.TransferredObj.fromObject(object.transferredInJson[i]);
                    }
                }
                if (object.arr != null) {
                    if (typeof object.arr !== "object")
                        throw TypeError(".json_ipc.ValuesSequence.Value.arr: object expected");
                    message.arr = $root.json_ipc.ValuesSequence.BinaryValue.fromObject(object.arr);
                }
                if (object.transferred != null) {
                    if (typeof object.transferred !== "object")
                        throw TypeError(".json_ipc.ValuesSequence.Value.transferred: object expected");
                    message.transferred = $root.json_ipc.ValuesSequence.TransferredObj.fromObject(object.transferred);
                }
                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) {
                if (!options)
                    options = {};
                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 && message.hasOwnProperty("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);
                }
                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);
                }
                if (message.arr != null && message.hasOwnProperty("arr"))
                    object.arr = $root.json_ipc.ValuesSequence.BinaryValue.toObject(message.arr, options);
                if (message.transferred != null && message.hasOwnProperty("transferred"))
                    object.transferred = $root.json_ipc.ValuesSequence.TransferredObj.toObject(message.transferred, options);
                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;
})();

module.exports = $root;

},{"protobufjs/minimal":130}],129:[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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.appName != null && Object.hasOwnProperty.call(message, "appName"))
                $root.common.StringValue.encode(message.appName, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.storage.GetAppLocalFSRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.appName = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.appName != null && message.hasOwnProperty("appName")) {
                var error = $root.common.StringValue.verify(message.appName);
                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) {
            if (object instanceof $root.storage.GetAppLocalFSRequestBody)
                return object;
            var message = new $root.storage.GetAppLocalFSRequestBody();
            if (object.appName != null) {
                if (typeof object.appName !== "object")
                    throw TypeError(".storage.GetAppLocalFSRequestBody.appName: object expected");
                message.appName = $root.common.StringValue.fromObject(object.appName);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.appName = null;
            if (message.appName != null && message.hasOwnProperty("appName"))
                object.appName = $root.common.StringValue.toObject(message.appName, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            if (message.appName != null && Object.hasOwnProperty.call(message, "appName"))
                $root.common.StringValue.encode(message.appName, writer.uint32(/* id 1, wireType 2 =*/10).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.storage.GetAppSyncedFSRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.appName = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.appName != null && message.hasOwnProperty("appName")) {
                var error = $root.common.StringValue.verify(message.appName);
                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) {
            if (object instanceof $root.storage.GetAppSyncedFSRequestBody)
                return object;
            var message = new $root.storage.GetAppSyncedFSRequestBody();
            if (object.appName != null) {
                if (typeof object.appName !== "object")
                    throw TypeError(".storage.GetAppSyncedFSRequestBody.appName: object expected");
                message.appName = $root.common.StringValue.fromObject(object.appName);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.appName = null;
            if (message.appName != null && message.hasOwnProperty("appName"))
                object.appName = $root.common.StringValue.toObject(message.appName, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.storage.GetUserFSRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path")) {
                var error = $root.common.StringValue.verify(message.path);
                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) {
            if (object instanceof $root.storage.GetUserFSRequestBody)
                return object;
            var message = new $root.storage.GetUserFSRequestBody();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (typeof object.path !== "object")
                    throw TypeError(".storage.GetUserFSRequestBody.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = $root.common.StringValue.toObject(message.path, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.storage.GetSysFSRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && message.hasOwnProperty("path")) {
                var error = $root.common.StringValue.verify(message.path);
                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) {
            if (object instanceof $root.storage.GetSysFSRequestBody)
                return object;
            var message = new $root.storage.GetSysFSRequestBody();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (typeof object.path !== "object")
                    throw TypeError(".storage.GetSysFSRequestBody.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.path != null && message.hasOwnProperty("path"))
                object.path = $root.common.StringValue.toObject(message.path, options);
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                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);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.objType != null && message.hasOwnProperty("objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.values != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            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) {
            if (!options)
                options = {};
            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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    (message.value = $util.Long.fromValue(object.value)).unsigned = 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) {
            if (!options)
                options = {};
            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() : long;
                } else
                    object.value = options.longs === String ? "0" : 0;
            if (message.value != null && message.hasOwnProperty("value"))
                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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.StringValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.value != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.BytesValue)
                return object;
            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) {
            if (!options)
                options = {};
            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 && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && message.hasOwnProperty("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) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && message.hasOwnProperty("runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && message.hasOwnProperty("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)
                        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) {
            if (!writer)
                writer = $Writer.create();
            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()).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork()).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).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) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32());
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32());
                        break;
                    }
                default:
                    reader.skipType(tag & 7);
                    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) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (message.type != null && message.hasOwnProperty("type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && message.hasOwnProperty("json")) {
                var error = $root.common.StringValue.verify(message.json);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && message.hasOwnProperty("bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes);
                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) {
            if (object instanceof $root.common.AnyValue)
                return object;
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (typeof object.json !== "object")
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json);
            }
            if (object.bytes != null) {
                if (typeof object.bytes !== "object")
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes);
            }
            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) {
            if (!options)
                options = {};
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && message.hasOwnProperty("type"))
                object.type = message.type;
            if (message.json != null && message.hasOwnProperty("json"))
                object.json = $root.common.StringValue.toObject(message.json, options);
            if (message.bytes != null && message.hasOwnProperty("bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options);
            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":130}],130:[function(require,module,exports){
// minimal library entry point.

"use strict";
module.exports = require("./src/index-minimal");

},{"./src/index-minimal":131}],131:[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":132,"./reader_buffer":133,"./roots":134,"./rpc":135,"./util/minimal":138,"./writer":139,"./writer_buffer":140}],132:[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;
};

/**
 * Skips the next element of the specified wire type.
 * @param {number} wireType Wire type received
 * @returns {Reader} `this`
 */
Reader.prototype.skipType = function(wireType) {
    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);
            }
            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":138}],133:[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":132,"./util/minimal":138}],134:[function(require,module,exports){
"use strict";
module.exports = {};

/**
 * 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"];
 */

},{}],135:[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":136}],136:[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":138}],137:[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":138}],138:[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");

// requires modules optionally and hides the call from bundlers
util.inquire = require("@protobufjs/inquire");

// 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");

/**
 * 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 && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins
        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.inquire("buffer").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
         || util.inquire("long");

/**
 * 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,*>} src Source object
 * @param {boolean} [ifNotSet=false] Merges only if the key is not already set
 * @returns {Object.<string,*>} Destination object
 */
function merge(dst, src, ifNotSet) { // used by converters
    for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)
        if (dst[keys[i]] === undefined || !ifNotSet)
            dst[keys[i]] = src[keys[i]];
    return dst;
}

util.merge = merge;

/**
 * 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":137,"@protobufjs/aspromise":28,"@protobufjs/base64":29,"@protobufjs/eventemitter":30,"@protobufjs/float":31,"@protobufjs/inquire":32,"@protobufjs/pool":33,"@protobufjs/utf8":34}],139:[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
        ? 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) {
    while (val.hi) {
        buf[pos++] = val.lo & 127 | 128;
        val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;
        val.hi >>>= 7;
    }
    while (val.lo > 127) {
        buf[pos++] = val.lo & 127 | 128;
        val.lo = val.lo >>> 7;
    }
    buf[pos++] = val.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":138}],140:[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":138,"./writer":139}],141:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.

function isArray(arg) {
  if (Array.isArray) {
    return Array.isArray(arg);
  }
  return objectToString(arg) === '[object Array]';
}
exports.isArray = isArray;

function isBoolean(arg) {
  return typeof arg === 'boolean';
}
exports.isBoolean = isBoolean;

function isNull(arg) {
  return arg === null;
}
exports.isNull = isNull;

function isNullOrUndefined(arg) {
  return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;

function isNumber(arg) {
  return typeof arg === 'number';
}
exports.isNumber = isNumber;

function isString(arg) {
  return typeof arg === 'string';
}
exports.isString = isString;

function isSymbol(arg) {
  return typeof arg === 'symbol';
}
exports.isSymbol = isSymbol;

function isUndefined(arg) {
  return arg === void 0;
}
exports.isUndefined = isUndefined;

function isRegExp(re) {
  return objectToString(re) === '[object RegExp]';
}
exports.isRegExp = isRegExp;

function isObject(arg) {
  return typeof arg === 'object' && arg !== null;
}
exports.isObject = isObject;

function isDate(d) {
  return objectToString(d) === '[object Date]';
}
exports.isDate = isDate;

function isError(e) {
  return (objectToString(e) === '[object Error]' || e instanceof Error);
}
exports.isError = isError;

function isFunction(arg) {
  return typeof arg === 'function';
}
exports.isFunction = isFunction;

function isPrimitive(arg) {
  return arg === null ||
         typeof arg === 'boolean' ||
         typeof arg === 'number' ||
         typeof arg === 'string' ||
         typeof arg === 'symbol' ||  // ES6 symbol
         typeof arg === 'undefined';
}
exports.isPrimitive = isPrimitive;

exports.isBuffer = require('buffer').Buffer.isBuffer;

function objectToString(o) {
  return Object.prototype.toString.call(o);
}

},{"buffer":83}],142:[function(require,module,exports){
(function (Buffer){(function (){
var elliptic = require('elliptic')
var BN = require('bn.js')

module.exports = function createECDH (curve) {
  return new ECDH(curve)
}

var aliases = {
  secp256k1: {
    name: 'secp256k1',
    byteLength: 32
  },
  secp224r1: {
    name: 'p224',
    byteLength: 28
  },
  prime256v1: {
    name: 'p256',
    byteLength: 32
  },
  prime192v1: {
    name: 'p192',
    byteLength: 24
  },
  ed25519: {
    name: 'ed25519',
    byteLength: 32
  },
  secp384r1: {
    name: 'p384',
    byteLength: 48
  },
  secp521r1: {
    name: 'p521',
    byteLength: 66
  }
}

aliases.p224 = aliases.secp224r1
aliases.p256 = aliases.secp256r1 = aliases.prime256v1
aliases.p192 = aliases.secp192r1 = aliases.prime192v1
aliases.p384 = aliases.secp384r1
aliases.p521 = aliases.secp521r1

function ECDH (curve) {
  this.curveType = aliases[curve]
  if (!this.curveType) {
    this.curveType = {
      name: curve
    }
  }
  this.curve = new elliptic.ec(this.curveType.name) // eslint-disable-line new-cap
  this.keys = void 0
}

ECDH.prototype.generateKeys = function (enc, format) {
  this.keys = this.curve.genKeyPair()
  return this.getPublicKey(enc, format)
}

ECDH.prototype.computeSecret = function (other, inenc, enc) {
  inenc = inenc || 'utf8'
  if (!Buffer.isBuffer(other)) {
    other = new Buffer(other, inenc)
  }
  var otherPub = this.curve.keyFromPublic(other).getPublic()
  var out = otherPub.mul(this.keys.getPrivate()).getX()
  return formatReturnValue(out, enc, this.curveType.byteLength)
}

ECDH.prototype.getPublicKey = function (enc, format) {
  var key = this.keys.getPublic(format === 'compressed', true)
  if (format === 'hybrid') {
    if (key[key.length - 1] % 2) {
      key[0] = 7
    } else {
      key[0] = 6
    }
  }
  return formatReturnValue(key, enc)
}

ECDH.prototype.getPrivateKey = function (enc) {
  return formatReturnValue(this.keys.getPrivate(), enc)
}

ECDH.prototype.setPublicKey = function (pub, enc) {
  enc = enc || 'utf8'
  if (!Buffer.isBuffer(pub)) {
    pub = new Buffer(pub, enc)
  }
  this.keys._importPublic(pub)
  return this
}

ECDH.prototype.setPrivateKey = function (priv, enc) {
  enc = enc || 'utf8'
  if (!Buffer.isBuffer(priv)) {
    priv = new Buffer(priv, enc)
  }

  var _priv = new BN(priv)
  _priv = _priv.toString(16)
  this.keys = this.curve.genKeyPair()
  this.keys._importPrivate(_priv)
  return this
}

function formatReturnValue (bn, enc, len) {
  if (!Array.isArray(bn)) {
    bn = bn.toArray()
  }
  var buf = new Buffer(bn)
  if (len && buf.length < len) {
    var zeros = new Buffer(len - buf.length)
    zeros.fill(0)
    buf = Buffer.concat([zeros, buf])
  }
  if (!enc) {
    return buf
  } else {
    return buf.toString(enc)
  }
}

}).call(this)}).call(this,require("buffer").Buffer)
},{"bn.js":143,"buffer":83,"elliptic":162}],143:[function(require,module,exports){
arguments[4][49][0].apply(exports,arguments)
},{"buffer":54,"dup":49}],144:[function(require,module,exports){
'use strict'
var inherits = require('inherits')
var MD5 = require('md5.js')
var RIPEMD160 = require('ripemd160')
var sha = require('sha.js')
var Base = require('cipher-base')

function Hash (hash) {
  Base.call(this, 'digest')

  this._hash = hash
}

inherits(Hash, Base)

Hash.prototype._update = function (data) {
  this._hash.update(data)
}

Hash.prototype._final = function () {
  return this._hash.digest()
}

module.exports = function createHash (alg) {
  alg = alg.toLowerCase()
  if (alg === 'md5') return new MD5()
  if (alg === 'rmd160' || alg === 'ripemd160') return new RIPEMD160()

  return new Hash(sha(alg))
}

},{"cipher-base":92,"inherits":219,"md5.js":232,"ripemd160":286,"sha.js":516}],145:[function(require,module,exports){
var MD5 = require('md5.js')

module.exports = function (buffer) {
  return new MD5().update(buffer).digest()
}

},{"md5.js":232}],146:[function(require,module,exports){
'use strict'
var inherits = require('inherits')
var Legacy = require('./legacy')
var Base = require('cipher-base')
var Buffer = require('safe-buffer').Buffer
var md5 = require('create-hash/md5')
var RIPEMD160 = require('ripemd160')

var sha = require('sha.js')

var ZEROS = Buffer.alloc(128)

function Hmac (alg, key) {
  Base.call(this, 'digest')
  if (typeof key === 'string') {
    key = Buffer.from(key)
  }

  var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64

  this._alg = alg
  this._key = key
  if (key.length > blocksize) {
    var hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg)
    key = hash.update(key).digest()
  } else if (key.length < blocksize) {
    key = Buffer.concat([key, ZEROS], blocksize)
  }

  var ipad = this._ipad = Buffer.allocUnsafe(blocksize)
  var opad = this._opad = Buffer.allocUnsafe(blocksize)

  for (var i = 0; i < blocksize; i++) {
    ipad[i] = key[i] ^ 0x36
    opad[i] = key[i] ^ 0x5C
  }
  this._hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg)
  this._hash.update(ipad)
}

inherits(Hmac, Base)

Hmac.prototype._update = function (data) {
  this._hash.update(data)
}

Hmac.prototype._final = function () {
  var h = this._hash.digest()
  var hash = this._alg === 'rmd160' ? new RIPEMD160() : sha(this._alg)
  return hash.update(this._opad).update(h).digest()
}

module.exports = function createHmac (alg, key) {
  alg = alg.toLowerCase()
  if (alg === 'rmd160' || alg === 'ripemd160') {
    return new Hmac('rmd160', key)
  }
  if (alg === 'md5') {
    return new Legacy(md5, key)
  }
  return new Hmac(alg, key)
}

},{"./legacy":147,"cipher-base":92,"create-hash/md5":145,"inherits":219,"ripemd160":286,"safe-buffer":513,"sha.js":516}],147:[function(require,module,exports){
'use strict'
var inherits = require('inherits')
var Buffer = require('safe-buffer').Buffer

var Base = require('cipher-base')

var ZEROS = Buffer.alloc(128)
var blocksize = 64

function Hmac (alg, key) {
  Base.call(this, 'digest')
  if (typeof key === 'string') {
    key = Buffer.from(key)
  }

  this._alg = alg
  this._key = key

  if (key.length > blocksize) {
    key = alg(key)
  } else if (key.length < blocksize) {
    key = Buffer.concat([key, ZEROS], blocksize)
  }

  var ipad = this._ipad = Buffer.allocUnsafe(blocksize)
  var opad = this._opad = Buffer.allocUnsafe(blocksize)

  for (var i = 0; i < blocksize; i++) {
    ipad[i] = key[i] ^ 0x36
    opad[i] = key[i] ^ 0x5C
  }

  this._hash = [ipad]
}

inherits(Hmac, Base)

Hmac.prototype._update = function (data) {
  this._hash.push(data)
}

Hmac.prototype._final = function () {
  var h = this._alg(Buffer.concat(this._hash))
  return this._alg(Buffer.concat([this._opad, h]))
}
module.exports = Hmac

},{"cipher-base":92,"inherits":219,"safe-buffer":513}],148:[function(require,module,exports){
'use strict'

exports.randomBytes = exports.rng = exports.pseudoRandomBytes = exports.prng = require('randombytes')
exports.createHash = exports.Hash = require('create-hash')
exports.createHmac = exports.Hmac = require('create-hmac')

var algos = require('browserify-sign/algos')
var algoKeys = Object.keys(algos)
var hashes = ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160'].concat(algoKeys)
exports.getHashes = function () {
  return hashes
}

var p = require('pbkdf2')
exports.pbkdf2 = p.pbkdf2
exports.pbkdf2Sync = p.pbkdf2Sync

var aes = require('browserify-cipher')

exports.Cipher = aes.Cipher
exports.createCipher = aes.createCipher
exports.Cipheriv = aes.Cipheriv
exports.createCipheriv = aes.createCipheriv
exports.Decipher = aes.Decipher
exports.createDecipher = aes.createDecipher
exports.Decipheriv = aes.Decipheriv
exports.createDecipheriv = aes.createDecipheriv
exports.getCiphers = aes.getCiphers
exports.listCiphers = aes.listCiphers

var dh = require('diffie-hellman')

exports.DiffieHellmanGroup = dh.DiffieHellmanGroup
exports.createDiffieHellmanGroup = dh.createDiffieHellmanGroup
exports.getDiffieHellman = dh.getDiffieHellman
exports.createDiffieHellman = dh.createDiffieHellman
exports.DiffieHellman = dh.DiffieHellman

var sign = require('browserify-sign')

exports.createSign = sign.createSign
exports.Sign = sign.Sign
exports.createVerify = sign.createVerify
exports.Verify = sign.Verify

exports.createECDH = require('create-ecdh')

var publicEncrypt = require('public-encrypt')

exports.publicEncrypt = publicEncrypt.publicEncrypt
exports.privateEncrypt = publicEncrypt.privateEncrypt
exports.publicDecrypt = publicEncrypt.publicDecrypt
exports.privateDecrypt = publicEncrypt.privateDecrypt

// the least I can do is make error messages for the rest of the node.js/crypto api.
// ;[
//   'createCredentials'
// ].forEach(function (name) {
//   exports[name] = function () {
//     throw new Error([
//       'sorry, ' + name + ' is not implemented yet',
//       'we accept pull requests',
//       'https://github.com/crypto-browserify/crypto-browserify'
//     ].join('\n'))
//   }
// })

var rf = require('randomfill')

exports.randomFill = rf.randomFill
exports.randomFillSync = rf.randomFillSync

exports.createCredentials = function () {
  throw new Error([
    'sorry, createCredentials is not implemented yet',
    'we accept pull requests',
    'https://github.com/crypto-browserify/crypto-browserify'
  ].join('\n'))
}

exports.constants = {
  'DH_CHECK_P_NOT_SAFE_PRIME': 2,
  'DH_CHECK_P_NOT_PRIME': 1,
  'DH_UNABLE_TO_CHECK_GENERATOR': 4,
  'DH_NOT_SUITABLE_GENERATOR': 8,
  'NPN_ENABLED': 1,
  'ALPN_ENABLED': 1,
  'RSA_PKCS1_PADDING': 1,
  'RSA_SSLV23_PADDING': 2,
  'RSA_NO_PADDING': 3,
  'RSA_PKCS1_OAEP_PADDING': 4,
  'RSA_X931_PADDING': 5,
  'RSA_PKCS1_PSS_PADDING': 6,
  'POINT_CONVERSION_COMPRESSED': 2,
  'POINT_CONVERSION_UNCOMPRESSED': 4,
  'POINT_CONVERSION_HYBRID': 6
}

},{"browserify-cipher":72,"browserify-sign":79,"browserify-sign/algos":76,"create-ecdh":142,"create-hash":144,"create-hmac":146,"diffie-hellman":156,"pbkdf2":242,"public-encrypt":266,"randombytes":273,"randomfill":274}],149:[function(require,module,exports){
'use strict';

var $defineProperty = require('es-define-property');

var $SyntaxError = require('es-errors/syntax');
var $TypeError = require('es-errors/type');

var gopd = require('gopd');

/** @type {import('.')} */
module.exports = function defineDataProperty(
	obj,
	property,
	value
) {
	if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) {
		throw new $TypeError('`obj` must be an object or a function`');
	}
	if (typeof property !== 'string' && typeof property !== 'symbol') {
		throw new $TypeError('`property` must be a string or a symbol`');
	}
	if (arguments.length > 3 && typeof arguments[3] !== 'boolean' && arguments[3] !== null) {
		throw new $TypeError('`nonEnumerable`, if provided, must be a boolean or null');
	}
	if (arguments.length > 4 && typeof arguments[4] !== 'boolean' && arguments[4] !== null) {
		throw new $TypeError('`nonWritable`, if provided, must be a boolean or null');
	}
	if (arguments.length > 5 && typeof arguments[5] !== 'boolean' && arguments[5] !== null) {
		throw new $TypeError('`nonConfigurable`, if provided, must be a boolean or null');
	}
	if (arguments.length > 6 && typeof arguments[6] !== 'boolean') {
		throw new $TypeError('`loose`, if provided, must be a boolean');
	}

	var nonEnumerable = arguments.length > 3 ? arguments[3] : null;
	var nonWritable = arguments.length > 4 ? arguments[4] : null;
	var nonConfigurable = arguments.length > 5 ? arguments[5] : null;
	var loose = arguments.length > 6 ? arguments[6] : false;

	/* @type {false | TypedPropertyDescriptor<unknown>} */
	var desc = !!gopd && gopd(obj, property);

	if ($defineProperty) {
		$defineProperty(obj, property, {
			configurable: nonConfigurable === null && desc ? desc.configurable : !nonConfigurable,
			enumerable: nonEnumerable === null && desc ? desc.enumerable : !nonEnumerable,
			value: value,
			writable: nonWritable === null && desc ? desc.writable : !nonWritable
		});
	} else if (loose || (!nonEnumerable && !nonWritable && !nonConfigurable)) {
		// must fall back to [[Set]], and was not explicitly asked to make non-enumerable, non-writable, or non-configurable
		obj[property] = value; // eslint-disable-line no-param-reassign
	} else {
		throw new $SyntaxError('This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.');
	}
};

},{"es-define-property":179,"es-errors/syntax":184,"es-errors/type":185,"gopd":198}],150:[function(require,module,exports){
'use strict';

exports.utils = require('./des/utils');
exports.Cipher = require('./des/cipher');
exports.DES = require('./des/des');
exports.CBC = require('./des/cbc');
exports.EDE = require('./des/ede');

},{"./des/cbc":151,"./des/cipher":152,"./des/des":153,"./des/ede":154,"./des/utils":155}],151:[function(require,module,exports){
'use strict';

var assert = require('minimalistic-assert');
var inherits = require('inherits');

var proto = {};

function CBCState(iv) {
  assert.equal(iv.length, 8, 'Invalid IV length');

  this.iv = new Array(8);
  for (var i = 0; i < this.iv.length; i++)
    this.iv[i] = iv[i];
}

function instantiate(Base) {
  function CBC(options) {
    Base.call(this, options);
    this._cbcInit();
  }
  inherits(CBC, Base);

  var keys = Object.keys(proto);
  for (var i = 0; i < keys.length; i++) {
    var key = keys[i];
    CBC.prototype[key] = proto[key];
  }

  CBC.create = function create(options) {
    return new CBC(options);
  };

  return CBC;
}

exports.instantiate = instantiate;

proto._cbcInit = function _cbcInit() {
  var state = new CBCState(this.options.iv);
  this._cbcState = state;
};

proto._update = function _update(inp, inOff, out, outOff) {
  var state = this._cbcState;
  var superProto = this.constructor.super_.prototype;

  var iv = state.iv;
  if (this.type === 'encrypt') {
    for (var i = 0; i < this.blockSize; i++)
      iv[i] ^= inp[inOff + i];

    superProto._update.call(this, iv, 0, out, outOff);

    for (var i = 0; i < this.blockSize; i++)
      iv[i] = out[outOff + i];
  } else {
    superProto._update.call(this, inp, inOff, out, outOff);

    for (var i = 0; i < this.blockSize; i++)
      out[outOff + i] ^= iv[i];

    for (var i = 0; i < this.blockSize; i++)
      iv[i] = inp[inOff + i];
  }
};

},{"inherits":219,"minimalistic-assert":235}],152:[function(require,module,exports){
'use strict';

var assert = require('minimalistic-assert');

function Cipher(options) {
  this.options = options;

  this.type = this.options.type;
  this.blockSize = 8;
  this._init();

  this.buffer = new Array(this.blockSize);
  this.bufferOff = 0;
  this.padding = options.padding !== false
}
module.exports = Cipher;

Cipher.prototype._init = function _init() {
  // Might be overrided
};

Cipher.prototype.update = function update(data) {
  if (data.length === 0)
    return [];

  if (this.type === 'decrypt')
    return this._updateDecrypt(data);
  else
    return this._updateEncrypt(data);
};

Cipher.prototype._buffer = function _buffer(data, off) {
  // Append data to buffer
  var min = Math.min(this.buffer.length - this.bufferOff, data.length - off);
  for (var i = 0; i < min; i++)
    this.buffer[this.bufferOff + i] = data[off + i];
  this.bufferOff += min;

  // Shift next
  return min;
};

Cipher.prototype._flushBuffer = function _flushBuffer(out, off) {
  this._update(this.buffer, 0, out, off);
  this.bufferOff = 0;
  return this.blockSize;
};

Cipher.prototype._updateEncrypt = function _updateEncrypt(data) {
  var inputOff = 0;
  var outputOff = 0;

  var count = ((this.bufferOff + data.length) / this.blockSize) | 0;
  var out = new Array(count * this.blockSize);

  if (this.bufferOff !== 0) {
    inputOff += this._buffer(data, inputOff);

    if (this.bufferOff === this.buffer.length)
      outputOff += this._flushBuffer(out, outputOff);
  }

  // Write blocks
  var max = data.length - ((data.length - inputOff) % this.blockSize);
  for (; inputOff < max; inputOff += this.blockSize) {
    this._update(data, inputOff, out, outputOff);
    outputOff += this.blockSize;
  }

  // Queue rest
  for (; inputOff < data.length; inputOff++, this.bufferOff++)
    this.buffer[this.bufferOff] = data[inputOff];

  return out;
};

Cipher.prototype._updateDecrypt = function _updateDecrypt(data) {
  var inputOff = 0;
  var outputOff = 0;

  var count = Math.ceil((this.bufferOff + data.length) / this.blockSize) - 1;
  var out = new Array(count * this.blockSize);

  // TODO(indutny): optimize it, this is far from optimal
  for (; count > 0; count--) {
    inputOff += this._buffer(data, inputOff);
    outputOff += this._flushBuffer(out, outputOff);
  }

  // Buffer rest of the input
  inputOff += this._buffer(data, inputOff);

  return out;
};

Cipher.prototype.final = function final(buffer) {
  var first;
  if (buffer)
    first = this.update(buffer);

  var last;
  if (this.type === 'encrypt')
    last = this._finalEncrypt();
  else
    last = this._finalDecrypt();

  if (first)
    return first.concat(last);
  else
    return last;
};

Cipher.prototype._pad = function _pad(buffer, off) {
  if (off === 0)
    return false;

  while (off < buffer.length)
    buffer[off++] = 0;

  return true;
};

Cipher.prototype._finalEncrypt = function _finalEncrypt() {
  if (!this._pad(this.buffer, this.bufferOff))
    return [];

  var out = new Array(this.blockSize);
  this._update(this.buffer, 0, out, 0);
  return out;
};

Cipher.prototype._unpad = function _unpad(buffer) {
  return buffer;
};

Cipher.prototype._finalDecrypt = function _finalDecrypt() {
  assert.equal(this.bufferOff, this.blockSize, 'Not enough data to decrypt');
  var out = new Array(this.blockSize);
  this._flushBuffer(out, 0);

  return this._unpad(out);
};

},{"minimalistic-assert":235}],153:[function(require,module,exports){
'use strict';

var assert = require('minimalistic-assert');
var inherits = require('inherits');

var utils = require('./utils');
var Cipher = require('./cipher');

function DESState() {
  this.tmp = new Array(2);
  this.keys = null;
}

function DES(options) {
  Cipher.call(this, options);

  var state = new DESState();
  this._desState = state;

  this.deriveKeys(state, options.key);
}
inherits(DES, Cipher);
module.exports = DES;

DES.create = function create(options) {
  return new DES(options);
};

var shiftTable = [
  1, 1, 2, 2, 2, 2, 2, 2,
  1, 2, 2, 2, 2, 2, 2, 1
];

DES.prototype.deriveKeys = function deriveKeys(state, key) {
  state.keys = new Array(16 * 2);

  assert.equal(key.length, this.blockSize, 'Invalid key length');

  var kL = utils.readUInt32BE(key, 0);
  var kR = utils.readUInt32BE(key, 4);

  utils.pc1(kL, kR, state.tmp, 0);
  kL = state.tmp[0];
  kR = state.tmp[1];
  for (var i = 0; i < state.keys.length; i += 2) {
    var shift = shiftTable[i >>> 1];
    kL = utils.r28shl(kL, shift);
    kR = utils.r28shl(kR, shift);
    utils.pc2(kL, kR, state.keys, i);
  }
};

DES.prototype._update = function _update(inp, inOff, out, outOff) {
  var state = this._desState;

  var l = utils.readUInt32BE(inp, inOff);
  var r = utils.readUInt32BE(inp, inOff + 4);

  // Initial Permutation
  utils.ip(l, r, state.tmp, 0);
  l = state.tmp[0];
  r = state.tmp[1];

  if (this.type === 'encrypt')
    this._encrypt(state, l, r, state.tmp, 0);
  else
    this._decrypt(state, l, r, state.tmp, 0);

  l = state.tmp[0];
  r = state.tmp[1];

  utils.writeUInt32BE(out, l, outOff);
  utils.writeUInt32BE(out, r, outOff + 4);
};

DES.prototype._pad = function _pad(buffer, off) {
  if (this.padding === false) {
    return false;
  }

  var value = buffer.length - off;
  for (var i = off; i < buffer.length; i++)
    buffer[i] = value;

  return true;
};

DES.prototype._unpad = function _unpad(buffer) {
  if (this.padding === false) {
    return buffer;
  }

  var pad = buffer[buffer.length - 1];
  for (var i = buffer.length - pad; i < buffer.length; i++)
    assert.equal(buffer[i], pad);

  return buffer.slice(0, buffer.length - pad);
};

DES.prototype._encrypt = function _encrypt(state, lStart, rStart, out, off) {
  var l = lStart;
  var r = rStart;

  // Apply f() x16 times
  for (var i = 0; i < state.keys.length; i += 2) {
    var keyL = state.keys[i];
    var keyR = state.keys[i + 1];

    // f(r, k)
    utils.expand(r, state.tmp, 0);

    keyL ^= state.tmp[0];
    keyR ^= state.tmp[1];
    var s = utils.substitute(keyL, keyR);
    var f = utils.permute(s);

    var t = r;
    r = (l ^ f) >>> 0;
    l = t;
  }

  // Reverse Initial Permutation
  utils.rip(r, l, out, off);
};

DES.prototype._decrypt = function _decrypt(state, lStart, rStart, out, off) {
  var l = rStart;
  var r = lStart;

  // Apply f() x16 times
  for (var i = state.keys.length - 2; i >= 0; i -= 2) {
    var keyL = state.keys[i];
    var keyR = state.keys[i + 1];

    // f(r, k)
    utils.expand(l, state.tmp, 0);

    keyL ^= state.tmp[0];
    keyR ^= state.tmp[1];
    var s = utils.substitute(keyL, keyR);
    var f = utils.permute(s);

    var t = l;
    l = (r ^ f) >>> 0;
    r = t;
  }

  // Reverse Initial Permutation
  utils.rip(l, r, out, off);
};

},{"./cipher":152,"./utils":155,"inherits":219,"minimalistic-assert":235}],154:[function(require,module,exports){
'use strict';

var assert = require('minimalistic-assert');
var inherits = require('inherits');

var Cipher = require('./cipher');
var DES = require('./des');

function EDEState(type, key) {
  assert.equal(key.length, 24, 'Invalid key length');

  var k1 = key.slice(0, 8);
  var k2 = key.slice(8, 16);
  var k3 = key.slice(16, 24);

  if (type === 'encrypt') {
    this.ciphers = [
      DES.create({ type: 'encrypt', key: k1 }),
      DES.create({ type: 'decrypt', key: k2 }),
      DES.create({ type: 'encrypt', key: k3 })
    ];
  } else {
    this.ciphers = [
      DES.create({ type: 'decrypt', key: k3 }),
      DES.create({ type: 'encrypt', key: k2 }),
      DES.create({ type: 'decrypt', key: k1 })
    ];
  }
}

function EDE(options) {
  Cipher.call(this, options);

  var state = new EDEState(this.type, this.options.key);
  this._edeState = state;
}
inherits(EDE, Cipher);

module.exports = EDE;

EDE.create = function create(options) {
  return new EDE(options);
};

EDE.prototype._update = function _update(inp, inOff, out, outOff) {
  var state = this._edeState;

  state.ciphers[0]._update(inp, inOff, out, outOff);
  state.ciphers[1]._update(out, outOff, out, outOff);
  state.ciphers[2]._update(out, outOff, out, outOff);
};

EDE.prototype._pad = DES.prototype._pad;
EDE.prototype._unpad = DES.prototype._unpad;

},{"./cipher":152,"./des":153,"inherits":219,"minimalistic-assert":235}],155:[function(require,module,exports){
'use strict';

exports.readUInt32BE = function readUInt32BE(bytes, off) {
  var res =  (bytes[0 + off] << 24) |
             (bytes[1 + off] << 16) |
             (bytes[2 + off] << 8) |
             bytes[3 + off];
  return res >>> 0;
};

exports.writeUInt32BE = function writeUInt32BE(bytes, value, off) {
  bytes[0 + off] = value >>> 24;
  bytes[1 + off] = (value >>> 16) & 0xff;
  bytes[2 + off] = (value >>> 8) & 0xff;
  bytes[3 + off] = value & 0xff;
};

exports.ip = function ip(inL, inR, out, off) {
  var outL = 0;
  var outR = 0;

  for (var i = 6; i >= 0; i -= 2) {
    for (var j = 0; j <= 24; j += 8) {
      outL <<= 1;
      outL |= (inR >>> (j + i)) & 1;
    }
    for (var j = 0; j <= 24; j += 8) {
      outL <<= 1;
      outL |= (inL >>> (j + i)) & 1;
    }
  }

  for (var i = 6; i >= 0; i -= 2) {
    for (var j = 1; j <= 25; j += 8) {
      outR <<= 1;
      outR |= (inR >>> (j + i)) & 1;
    }
    for (var j = 1; j <= 25; j += 8) {
      outR <<= 1;
      outR |= (inL >>> (j + i)) & 1;
    }
  }

  out[off + 0] = outL >>> 0;
  out[off + 1] = outR >>> 0;
};

exports.rip = function rip(inL, inR, out, off) {
  var outL = 0;
  var outR = 0;

  for (var i = 0; i < 4; i++) {
    for (var j = 24; j >= 0; j -= 8) {
      outL <<= 1;
      outL |= (inR >>> (j + i)) & 1;
      outL <<= 1;
      outL |= (inL >>> (j + i)) & 1;
    }
  }
  for (var i = 4; i < 8; i++) {
    for (var j = 24; j >= 0; j -= 8) {
      outR <<= 1;
      outR |= (inR >>> (j + i)) & 1;
      outR <<= 1;
      outR |= (inL >>> (j + i)) & 1;
    }
  }

  out[off + 0] = outL >>> 0;
  out[off + 1] = outR >>> 0;
};

exports.pc1 = function pc1(inL, inR, out, off) {
  var outL = 0;
  var outR = 0;

  // 7, 15, 23, 31, 39, 47, 55, 63
  // 6, 14, 22, 30, 39, 47, 55, 63
  // 5, 13, 21, 29, 39, 47, 55, 63
  // 4, 12, 20, 28
  for (var i = 7; i >= 5; i--) {
    for (var j = 0; j <= 24; j += 8) {
      outL <<= 1;
      outL |= (inR >> (j + i)) & 1;
    }
    for (var j = 0; j <= 24; j += 8) {
      outL <<= 1;
      outL |= (inL >> (j + i)) & 1;
    }
  }
  for (var j = 0; j <= 24; j += 8) {
    outL <<= 1;
    outL |= (inR >> (j + i)) & 1;
  }

  // 1, 9, 17, 25, 33, 41, 49, 57
  // 2, 10, 18, 26, 34, 42, 50, 58
  // 3, 11, 19, 27, 35, 43, 51, 59
  // 36, 44, 52, 60
  for (var i = 1; i <= 3; i++) {
    for (var j = 0; j <= 24; j += 8) {
      outR <<= 1;
      outR |= (inR >> (j + i)) & 1;
    }
    for (var j = 0; j <= 24; j += 8) {
      outR <<= 1;
      outR |= (inL >> (j + i)) & 1;
    }
  }
  for (var j = 0; j <= 24; j += 8) {
    outR <<= 1;
    outR |= (inL >> (j + i)) & 1;
  }

  out[off + 0] = outL >>> 0;
  out[off + 1] = outR >>> 0;
};

exports.r28shl = function r28shl(num, shift) {
  return ((num << shift) & 0xfffffff) | (num >>> (28 - shift));
};

var pc2table = [
  // inL => outL
  14, 11, 17, 4, 27, 23, 25, 0,
  13, 22, 7, 18, 5, 9, 16, 24,
  2, 20, 12, 21, 1, 8, 15, 26,

  // inR => outR
  15, 4, 25, 19, 9, 1, 26, 16,
  5, 11, 23, 8, 12, 7, 17, 0,
  22, 3, 10, 14, 6, 20, 27, 24
];

exports.pc2 = function pc2(inL, inR, out, off) {
  var outL = 0;
  var outR = 0;

  var len = pc2table.length >>> 1;
  for (var i = 0; i < len; i++) {
    outL <<= 1;
    outL |= (inL >>> pc2table[i]) & 0x1;
  }
  for (var i = len; i < pc2table.length; i++) {
    outR <<= 1;
    outR |= (inR >>> pc2table[i]) & 0x1;
  }

  out[off + 0] = outL >>> 0;
  out[off + 1] = outR >>> 0;
};

exports.expand = function expand(r, out, off) {
  var outL = 0;
  var outR = 0;

  outL = ((r & 1) << 5) | (r >>> 27);
  for (var i = 23; i >= 15; i -= 4) {
    outL <<= 6;
    outL |= (r >>> i) & 0x3f;
  }
  for (var i = 11; i >= 3; i -= 4) {
    outR |= (r >>> i) & 0x3f;
    outR <<= 6;
  }
  outR |= ((r & 0x1f) << 1) | (r >>> 31);

  out[off + 0] = outL >>> 0;
  out[off + 1] = outR >>> 0;
};

var sTable = [
  14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1,
  3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8,
  4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7,
  15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13,

  15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14,
  9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5,
  0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2,
  5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9,

  10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10,
  1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1,
  13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7,
  11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12,

  7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3,
  1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9,
  10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8,
  15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14,

  2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1,
  8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6,
  4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13,
  15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3,

  12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5,
  0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8,
  9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10,
  7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13,

  4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10,
  3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6,
  1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7,
  10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12,

  13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4,
  10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2,
  7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13,
  0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11
];

exports.substitute = function substitute(inL, inR) {
  var out = 0;
  for (var i = 0; i < 4; i++) {
    var b = (inL >>> (18 - i * 6)) & 0x3f;
    var sb = sTable[i * 0x40 + b];

    out <<= 4;
    out |= sb;
  }
  for (var i = 0; i < 4; i++) {
    var b = (inR >>> (18 - i * 6)) & 0x3f;
    var sb = sTable[4 * 0x40 + i * 0x40 + b];

    out <<= 4;
    out |= sb;
  }
  return out >>> 0;
};

var permuteTable = [
  16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22,
  30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7
];

exports.permute = function permute(num) {
  var out = 0;
  for (var i = 0; i < permuteTable.length; i++) {
    out <<= 1;
    out |= (num >>> permuteTable[i]) & 0x1;
  }
  return out >>> 0;
};

exports.padSplit = function padSplit(num, size, group) {
  var str = num.toString(2);
  while (str.length < size)
    str = '0' + str;

  var out = [];
  for (var i = 0; i < size; i += group)
    out.push(str.slice(i, i + group));
  return out.join(' ');
};

},{}],156:[function(require,module,exports){
(function (Buffer){(function (){
var generatePrime = require('./lib/generatePrime')
var primes = require('./lib/primes.json')

var DH = require('./lib/dh')

function getDiffieHellman (mod) {
  var prime = new Buffer(primes[mod].prime, 'hex')
  var gen = new Buffer(primes[mod].gen, 'hex')

  return new DH(prime, gen)
}

var ENCODINGS = {
  'binary': true, 'hex': true, 'base64': true
}

function createDiffieHellman (prime, enc, generator, genc) {
  if (Buffer.isBuffer(enc) || ENCODINGS[enc] === undefined) {
    return createDiffieHellman(prime, 'binary', enc, generator)
  }

  enc = enc || 'binary'
  genc = genc || 'binary'
  generator = generator || new Buffer([2])

  if (!Buffer.isBuffer(generator)) {
    generator = new Buffer(generator, genc)
  }

  if (typeof prime === 'number') {
    return new DH(generatePrime(prime, generator), generator, true)
  }

  if (!Buffer.isBuffer(prime)) {
    prime = new Buffer(prime, enc)
  }

  return new DH(prime, generator, true)
}

exports.DiffieHellmanGroup = exports.createDiffieHellmanGroup = exports.getDiffieHellman = getDiffieHellman
exports.createDiffieHellman = exports.DiffieHellman = createDiffieHellman

}).call(this)}).call(this,require("buffer").Buffer)
},{"./lib/dh":157,"./lib/generatePrime":158,"./lib/primes.json":159,"buffer":83}],157:[function(require,module,exports){
(function (Buffer){(function (){
var BN = require('bn.js');
var MillerRabin = require('miller-rabin');
var millerRabin = new MillerRabin();
var TWENTYFOUR = new BN(24);
var ELEVEN = new BN(11);
var TEN = new BN(10);
var THREE = new BN(3);
var SEVEN = new BN(7);
var primes = require('./generatePrime');
var randomBytes = require('randombytes');
module.exports = DH;

function setPublicKey(pub, enc) {
  enc = enc || 'utf8';
  if (!Buffer.isBuffer(pub)) {
    pub = new Buffer(pub, enc);
  }
  this._pub = new BN(pub);
  return this;
}

function setPrivateKey(priv, enc) {
  enc = enc || 'utf8';
  if (!Buffer.isBuffer(priv)) {
    priv = new Buffer(priv, enc);
  }
  this._priv = new BN(priv);
  return this;
}

var primeCache = {};
function checkPrime(prime, generator) {
  var gen = generator.toString('hex');
  var hex = [gen, prime.toString(16)].join('_');
  if (hex in primeCache) {
    return primeCache[hex];
  }
  var error = 0;

  if (prime.isEven() ||
    !primes.simpleSieve ||
    !primes.fermatTest(prime) ||
    !millerRabin.test(prime)) {
    //not a prime so +1
    error += 1;

    if (gen === '02' || gen === '05') {
      // we'd be able to check the generator
      // it would fail so +8
      error += 8;
    } else {
      //we wouldn't be able to test the generator
      // so +4
      error += 4;
    }
    primeCache[hex] = error;
    return error;
  }
  if (!millerRabin.test(prime.shrn(1))) {
    //not a safe prime
    error += 2;
  }
  var rem;
  switch (gen) {
    case '02':
      if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) {
        // unsuidable generator
        error += 8;
      }
      break;
    case '05':
      rem = prime.mod(TEN);
      if (rem.cmp(THREE) && rem.cmp(SEVEN)) {
        // prime mod 10 needs to equal 3 or 7
        error += 8;
      }
      break;
    default:
      error += 4;
  }
  primeCache[hex] = error;
  return error;
}

function DH(prime, generator, malleable) {
  this.setGenerator(generator);
  this.__prime = new BN(prime);
  this._prime = BN.mont(this.__prime);
  this._primeLen = prime.length;
  this._pub = undefined;
  this._priv = undefined;
  this._primeCode = undefined;
  if (malleable) {
    this.setPublicKey = setPublicKey;
    this.setPrivateKey = setPrivateKey;
  } else {
    this._primeCode = 8;
  }
}
Object.defineProperty(DH.prototype, 'verifyError', {
  enumerable: true,
  get: function () {
    if (typeof this._primeCode !== 'number') {
      this._primeCode = checkPrime(this.__prime, this.__gen);
    }
    return this._primeCode;
  }
});
DH.prototype.generateKeys = function () {
  if (!this._priv) {
    this._priv = new BN(randomBytes(this._primeLen));
  }
  this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed();
  return this.getPublicKey();
};

DH.prototype.computeSecret = function (other) {
  other = new BN(other);
  other = other.toRed(this._prime);
  var secret = other.redPow(this._priv).fromRed();
  var out = new Buffer(secret.toArray());
  var prime = this.getPrime();
  if (out.length < prime.length) {
    var front = new Buffer(prime.length - out.length);
    front.fill(0);
    out = Buffer.concat([front, out]);
  }
  return out;
};

DH.prototype.getPublicKey = function getPublicKey(enc) {
  return formatReturnValue(this._pub, enc);
};

DH.prototype.getPrivateKey = function getPrivateKey(enc) {
  return formatReturnValue(this._priv, enc);
};

DH.prototype.getPrime = function (enc) {
  return formatReturnValue(this.__prime, enc);
};

DH.prototype.getGenerator = function (enc) {
  return formatReturnValue(this._gen, enc);
};

DH.prototype.setGenerator = function (gen, enc) {
  enc = enc || 'utf8';
  if (!Buffer.isBuffer(gen)) {
    gen = new Buffer(gen, enc);
  }
  this.__gen = gen;
  this._gen = new BN(gen);
  return this;
};

function formatReturnValue(bn, enc) {
  var buf = new Buffer(bn.toArray());
  if (!enc) {
    return buf;
  } else {
    return buf.toString(enc);
  }
}

}).call(this)}).call(this,require("buffer").Buffer)
},{"./generatePrime":158,"bn.js":160,"buffer":83,"miller-rabin":233,"randombytes":273}],158:[function(require,module,exports){
var randomBytes = require('randombytes');
module.exports = findPrime;
findPrime.simpleSieve = simpleSieve;
findPrime.fermatTest = fermatTest;
var BN = require('bn.js');
var TWENTYFOUR = new BN(24);
var MillerRabin = require('miller-rabin');
var millerRabin = new MillerRabin();
var ONE = new BN(1);
var TWO = new BN(2);
var FIVE = new BN(5);
var SIXTEEN = new BN(16);
var EIGHT = new BN(8);
var TEN = new BN(10);
var THREE = new BN(3);
var SEVEN = new BN(7);
var ELEVEN = new BN(11);
var FOUR = new BN(4);
var TWELVE = new BN(12);
var primes = null;

function _getPrimes() {
  if (primes !== null)
    return primes;

  var limit = 0x100000;
  var res = [];
  res[0] = 2;
  for (var i = 1, k = 3; k < limit; k += 2) {
    var sqrt = Math.ceil(Math.sqrt(k));
    for (var j = 0; j < i && res[j] <= sqrt; j++)
      if (k % res[j] === 0)
        break;

    if (i !== j && res[j] <= sqrt)
      continue;

    res[i++] = k;
  }
  primes = res;
  return res;
}

function simpleSieve(p) {
  var primes = _getPrimes();

  for (var i = 0; i < primes.length; i++)
    if (p.modn(primes[i]) === 0) {
      if (p.cmpn(primes[i]) === 0) {
        return true;
      } else {
        return false;
      }
    }

  return true;
}

function fermatTest(p) {
  var red = BN.mont(p);
  return TWO.toRed(red).redPow(p.subn(1)).fromRed().cmpn(1) === 0;
}

function findPrime(bits, gen) {
  if (bits < 16) {
    // this is what openssl does
    if (gen === 2 || gen === 5) {
      return new BN([0x8c, 0x7b]);
    } else {
      return new BN([0x8c, 0x27]);
    }
  }
  gen = new BN(gen);

  var num, n2;

  while (true) {
    num = new BN(randomBytes(Math.ceil(bits / 8)));
    while (num.bitLength() > bits) {
      num.ishrn(1);
    }
    if (num.isEven()) {
      num.iadd(ONE);
    }
    if (!num.testn(1)) {
      num.iadd(TWO);
    }
    if (!gen.cmp(TWO)) {
      while (num.mod(TWENTYFOUR).cmp(ELEVEN)) {
        num.iadd(FOUR);
      }
    } else if (!gen.cmp(FIVE)) {
      while (num.mod(TEN).cmp(THREE)) {
        num.iadd(FOUR);
      }
    }
    n2 = num.shrn(1);
    if (simpleSieve(n2) && simpleSieve(num) &&
      fermatTest(n2) && fermatTest(num) &&
      millerRabin.test(n2) && millerRabin.test(num)) {
      return num;
    }
  }

}

},{"bn.js":160,"miller-rabin":233,"randombytes":273}],159:[function(require,module,exports){
module.exports={
    "modp1": {
        "gen": "02",
        "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff"
    },
    "modp2": {
        "gen": "02",
        "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"
    },
    "modp5": {
        "gen": "02",
        "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff"
    },
    "modp14": {
        "gen": "02",
        "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"
    },
    "modp15": {
        "gen": "02",
        "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"
    },
    "modp16": {
        "gen": "02",
        "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff"
    },
    "modp17": {
        "gen": "02",
        "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff"
    },
    "modp18": {
        "gen": "02",
        "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff"
    }
}
},{}],160:[function(require,module,exports){
arguments[4][49][0].apply(exports,arguments)
},{"buffer":54,"dup":49}],161:[function(require,module,exports){
'use strict';

var callBind = require('call-bind-apply-helpers');
var gOPD = require('gopd');

var hasProtoAccessor;
try {
	// eslint-disable-next-line no-extra-parens, no-proto
	hasProtoAccessor = /** @type {{ __proto__?: typeof Array.prototype }} */ ([]).__proto__ === Array.prototype;
} catch (e) {
	if (!e || typeof e !== 'object' || !('code' in e) || e.code !== 'ERR_PROTO_ACCESS') {
		throw e;
	}
}

// eslint-disable-next-line no-extra-parens
var desc = !!hasProtoAccessor && gOPD && gOPD(Object.prototype, /** @type {keyof typeof Object.prototype} */ ('__proto__'));

var $Object = Object;
var $getPrototypeOf = $Object.getPrototypeOf;

/** @type {import('./get')} */
module.exports = desc && typeof desc.get === 'function'
	? callBind([desc.get])
	: typeof $getPrototypeOf === 'function'
		? /** @type {import('./get')} */ function getDunder(value) {
			// eslint-disable-next-line eqeqeq
			return $getPrototypeOf(value == null ? value : $Object(value));
		}
		: false;

},{"call-bind-apply-helpers":88,"gopd":198}],162:[function(require,module,exports){
'use strict';

var elliptic = exports;

elliptic.version = require('../package.json').version;
elliptic.utils = require('./elliptic/utils');
elliptic.rand = require('brorand');
elliptic.curve = require('./elliptic/curve');
elliptic.curves = require('./elliptic/curves');

// Protocols
elliptic.ec = require('./elliptic/ec');
elliptic.eddsa = require('./elliptic/eddsa');

},{"../package.json":178,"./elliptic/curve":165,"./elliptic/curves":168,"./elliptic/ec":169,"./elliptic/eddsa":172,"./elliptic/utils":176,"brorand":53}],163:[function(require,module,exports){
'use strict';

var BN = require('bn.js');
var utils = require('../utils');
var getNAF = utils.getNAF;
var getJSF = utils.getJSF;
var assert = utils.assert;

function BaseCurve(type, conf) {
  this.type = type;
  this.p = new BN(conf.p, 16);

  // Use Montgomery, when there is no fast reduction for the prime
  this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);

  // Useful for many curves
  this.zero = new BN(0).toRed(this.red);
  this.one = new BN(1).toRed(this.red);
  this.two = new BN(2).toRed(this.red);

  // Curve configuration, optional
  this.n = conf.n && new BN(conf.n, 16);
  this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);

  // Temporary arrays
  this._wnafT1 = new Array(4);
  this._wnafT2 = new Array(4);
  this._wnafT3 = new Array(4);
  this._wnafT4 = new Array(4);

  this._bitLength = this.n ? this.n.bitLength() : 0;

  // Generalized Greg Maxwell's trick
  var adjustCount = this.n && this.p.div(this.n);
  if (!adjustCount || adjustCount.cmpn(100) > 0) {
    this.redN = null;
  } else {
    this._maxwellTrick = true;
    this.redN = this.n.toRed(this.red);
  }
}
module.exports = BaseCurve;

BaseCurve.prototype.point = function point() {
  throw new Error('Not implemented');
};

BaseCurve.prototype.validate = function validate() {
  throw new Error('Not implemented');
};

BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {
  assert(p.precomputed);
  var doubles = p._getDoubles();

  var naf = getNAF(k, 1, this._bitLength);
  var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1);
  I /= 3;

  // Translate into more windowed form
  var repr = [];
  var j;
  var nafW;
  for (j = 0; j < naf.length; j += doubles.step) {
    nafW = 0;
    for (var l = j + doubles.step - 1; l >= j; l--)
      nafW = (nafW << 1) + naf[l];
    repr.push(nafW);
  }

  var a = this.jpoint(null, null, null);
  var b = this.jpoint(null, null, null);
  for (var i = I; i > 0; i--) {
    for (j = 0; j < repr.length; j++) {
      nafW = repr[j];
      if (nafW === i)
        b = b.mixedAdd(doubles.points[j]);
      else if (nafW === -i)
        b = b.mixedAdd(doubles.points[j].neg());
    }
    a = a.add(b);
  }
  return a.toP();
};

BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {
  var w = 4;

  // Precompute window
  var nafPoints = p._getNAFPoints(w);
  w = nafPoints.wnd;
  var wnd = nafPoints.points;

  // Get NAF form
  var naf = getNAF(k, w, this._bitLength);

  // Add `this`*(N+1) for every w-NAF index
  var acc = this.jpoint(null, null, null);
  for (var i = naf.length - 1; i >= 0; i--) {
    // Count zeroes
    for (var l = 0; i >= 0 && naf[i] === 0; i--)
      l++;
    if (i >= 0)
      l++;
    acc = acc.dblp(l);

    if (i < 0)
      break;
    var z = naf[i];
    assert(z !== 0);
    if (p.type === 'affine') {
      // J +- P
      if (z > 0)
        acc = acc.mixedAdd(wnd[(z - 1) >> 1]);
      else
        acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg());
    } else {
      // J +- J
      if (z > 0)
        acc = acc.add(wnd[(z - 1) >> 1]);
      else
        acc = acc.add(wnd[(-z - 1) >> 1].neg());
    }
  }
  return p.type === 'affine' ? acc.toP() : acc;
};

BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW,
  points,
  coeffs,
  len,
  jacobianResult) {
  var wndWidth = this._wnafT1;
  var wnd = this._wnafT2;
  var naf = this._wnafT3;

  // Fill all arrays
  var max = 0;
  var i;
  var j;
  var p;
  for (i = 0; i < len; i++) {
    p = points[i];
    var nafPoints = p._getNAFPoints(defW);
    wndWidth[i] = nafPoints.wnd;
    wnd[i] = nafPoints.points;
  }

  // Comb small window NAFs
  for (i = len - 1; i >= 1; i -= 2) {
    var a = i - 1;
    var b = i;
    if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {
      naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);
      naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);
      max = Math.max(naf[a].length, max);
      max = Math.max(naf[b].length, max);
      continue;
    }

    var comb = [
      points[a], /* 1 */
      null, /* 3 */
      null, /* 5 */
      points[b], /* 7 */
    ];

    // Try to avoid Projective points, if possible
    if (points[a].y.cmp(points[b].y) === 0) {
      comb[1] = points[a].add(points[b]);
      comb[2] = points[a].toJ().mixedAdd(points[b].neg());
    } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {
      comb[1] = points[a].toJ().mixedAdd(points[b]);
      comb[2] = points[a].add(points[b].neg());
    } else {
      comb[1] = points[a].toJ().mixedAdd(points[b]);
      comb[2] = points[a].toJ().mixedAdd(points[b].neg());
    }

    var index = [
      -3, /* -1 -1 */
      -1, /* -1 0 */
      -5, /* -1 1 */
      -7, /* 0 -1 */
      0, /* 0 0 */
      7, /* 0 1 */
      5, /* 1 -1 */
      1, /* 1 0 */
      3,  /* 1 1 */
    ];

    var jsf = getJSF(coeffs[a], coeffs[b]);
    max = Math.max(jsf[0].length, max);
    naf[a] = new Array(max);
    naf[b] = new Array(max);
    for (j = 0; j < max; j++) {
      var ja = jsf[0][j] | 0;
      var jb = jsf[1][j] | 0;

      naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];
      naf[b][j] = 0;
      wnd[a] = comb;
    }
  }

  var acc = this.jpoint(null, null, null);
  var tmp = this._wnafT4;
  for (i = max; i >= 0; i--) {
    var k = 0;

    while (i >= 0) {
      var zero = true;
      for (j = 0; j < len; j++) {
        tmp[j] = naf[j][i] | 0;
        if (tmp[j] !== 0)
          zero = false;
      }
      if (!zero)
        break;
      k++;
      i--;
    }
    if (i >= 0)
      k++;
    acc = acc.dblp(k);
    if (i < 0)
      break;

    for (j = 0; j < len; j++) {
      var z = tmp[j];
      p;
      if (z === 0)
        continue;
      else if (z > 0)
        p = wnd[j][(z - 1) >> 1];
      else if (z < 0)
        p = wnd[j][(-z - 1) >> 1].neg();

      if (p.type === 'affine')
        acc = acc.mixedAdd(p);
      else
        acc = acc.add(p);
    }
  }
  // Zeroify references
  for (i = 0; i < len; i++)
    wnd[i] = null;

  if (jacobianResult)
    return acc;
  else
    return acc.toP();
};

function BasePoint(curve, type) {
  this.curve = curve;
  this.type = type;
  this.precomputed = null;
}
BaseCurve.BasePoint = BasePoint;

BasePoint.prototype.eq = function eq(/*other*/) {
  throw new Error('Not implemented');
};

BasePoint.prototype.validate = function validate() {
  return this.curve.validate(this);
};

BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
  bytes = utils.toArray(bytes, enc);

  var len = this.p.byteLength();

  // uncompressed, hybrid-odd, hybrid-even
  if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) &&
      bytes.length - 1 === 2 * len) {
    if (bytes[0] === 0x06)
      assert(bytes[bytes.length - 1] % 2 === 0);
    else if (bytes[0] === 0x07)
      assert(bytes[bytes.length - 1] % 2 === 1);

    var res =  this.point(bytes.slice(1, 1 + len),
      bytes.slice(1 + len, 1 + 2 * len));

    return res;
  } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) &&
              bytes.length - 1 === len) {
    return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03);
  }
  throw new Error('Unknown point format');
};

BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {
  return this.encode(enc, true);
};

BasePoint.prototype._encode = function _encode(compact) {
  var len = this.curve.p.byteLength();
  var x = this.getX().toArray('be', len);

  if (compact)
    return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x);

  return [ 0x04 ].concat(x, this.getY().toArray('be', len));
};

BasePoint.prototype.encode = function encode(enc, compact) {
  return utils.encode(this._encode(compact), enc);
};

BasePoint.prototype.precompute = function precompute(power) {
  if (this.precomputed)
    return this;

  var precomputed = {
    doubles: null,
    naf: null,
    beta: null,
  };
  precomputed.naf = this._getNAFPoints(8);
  precomputed.doubles = this._getDoubles(4, power);
  precomputed.beta = this._getBeta();
  this.precomputed = precomputed;

  return this;
};

BasePoint.prototype._hasDoubles = function _hasDoubles(k) {
  if (!this.precomputed)
    return false;

  var doubles = this.precomputed.doubles;
  if (!doubles)
    return false;

  return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);
};

BasePoint.prototype._getDoubles = function _getDoubles(step, power) {
  if (this.precomputed && this.precomputed.doubles)
    return this.precomputed.doubles;

  var doubles = [ this ];
  var acc = this;
  for (var i = 0; i < power; i += step) {
    for (var j = 0; j < step; j++)
      acc = acc.dbl();
    doubles.push(acc);
  }
  return {
    step: step,
    points: doubles,
  };
};

BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {
  if (this.precomputed && this.precomputed.naf)
    return this.precomputed.naf;

  var res = [ this ];
  var max = (1 << wnd) - 1;
  var dbl = max === 1 ? null : this.dbl();
  for (var i = 1; i < max; i++)
    res[i] = res[i - 1].add(dbl);
  return {
    wnd: wnd,
    points: res,
  };
};

BasePoint.prototype._getBeta = function _getBeta() {
  return null;
};

BasePoint.prototype.dblp = function dblp(k) {
  var r = this;
  for (var i = 0; i < k; i++)
    r = r.dbl();
  return r;
};

},{"../utils":176,"bn.js":177}],164:[function(require,module,exports){
'use strict';

var utils = require('../utils');
var BN = require('bn.js');
var inherits = require('inherits');
var Base = require('./base');

var assert = utils.assert;

function EdwardsCurve(conf) {
  // NOTE: Important as we are creating point in Base.call()
  this.twisted = (conf.a | 0) !== 1;
  this.mOneA = this.twisted && (conf.a | 0) === -1;
  this.extended = this.mOneA;

  Base.call(this, 'edwards', conf);

  this.a = new BN(conf.a, 16).umod(this.red.m);
  this.a = this.a.toRed(this.red);
  this.c = new BN(conf.c, 16).toRed(this.red);
  this.c2 = this.c.redSqr();
  this.d = new BN(conf.d, 16).toRed(this.red);
  this.dd = this.d.redAdd(this.d);

  assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);
  this.oneC = (conf.c | 0) === 1;
}
inherits(EdwardsCurve, Base);
module.exports = EdwardsCurve;

EdwardsCurve.prototype._mulA = function _mulA(num) {
  if (this.mOneA)
    return num.redNeg();
  else
    return this.a.redMul(num);
};

EdwardsCurve.prototype._mulC = function _mulC(num) {
  if (this.oneC)
    return num;
  else
    return this.c.redMul(num);
};

// Just for compatibility with Short curve
EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {
  return this.point(x, y, z, t);
};

EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {
  x = new BN(x, 16);
  if (!x.red)
    x = x.toRed(this.red);

  var x2 = x.redSqr();
  var rhs = this.c2.redSub(this.a.redMul(x2));
  var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));

  var y2 = rhs.redMul(lhs.redInvm());
  var y = y2.redSqrt();
  if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
    throw new Error('invalid point');

  var isOdd = y.fromRed().isOdd();
  if (odd && !isOdd || !odd && isOdd)
    y = y.redNeg();

  return this.point(x, y);
};

EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {
  y = new BN(y, 16);
  if (!y.red)
    y = y.toRed(this.red);

  // x^2 = (y^2 - c^2) / (c^2 d y^2 - a)
  var y2 = y.redSqr();
  var lhs = y2.redSub(this.c2);
  var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);
  var x2 = lhs.redMul(rhs.redInvm());

  if (x2.cmp(this.zero) === 0) {
    if (odd)
      throw new Error('invalid point');
    else
      return this.point(this.zero, y);
  }

  var x = x2.redSqrt();
  if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)
    throw new Error('invalid point');

  if (x.fromRed().isOdd() !== odd)
    x = x.redNeg();

  return this.point(x, y);
};

EdwardsCurve.prototype.validate = function validate(point) {
  if (point.isInfinity())
    return true;

  // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2)
  point.normalize();

  var x2 = point.x.redSqr();
  var y2 = point.y.redSqr();
  var lhs = x2.redMul(this.a).redAdd(y2);
  var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));

  return lhs.cmp(rhs) === 0;
};

function Point(curve, x, y, z, t) {
  Base.BasePoint.call(this, curve, 'projective');
  if (x === null && y === null && z === null) {
    this.x = this.curve.zero;
    this.y = this.curve.one;
    this.z = this.curve.one;
    this.t = this.curve.zero;
    this.zOne = true;
  } else {
    this.x = new BN(x, 16);
    this.y = new BN(y, 16);
    this.z = z ? new BN(z, 16) : this.curve.one;
    this.t = t && new BN(t, 16);
    if (!this.x.red)
      this.x = this.x.toRed(this.curve.red);
    if (!this.y.red)
      this.y = this.y.toRed(this.curve.red);
    if (!this.z.red)
      this.z = this.z.toRed(this.curve.red);
    if (this.t && !this.t.red)
      this.t = this.t.toRed(this.curve.red);
    this.zOne = this.z === this.curve.one;

    // Use extended coordinates
    if (this.curve.extended && !this.t) {
      this.t = this.x.redMul(this.y);
      if (!this.zOne)
        this.t = this.t.redMul(this.z.redInvm());
    }
  }
}
inherits(Point, Base.BasePoint);

EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
  return Point.fromJSON(this, obj);
};

EdwardsCurve.prototype.point = function point(x, y, z, t) {
  return new Point(this, x, y, z, t);
};

Point.fromJSON = function fromJSON(curve, obj) {
  return new Point(curve, obj[0], obj[1], obj[2]);
};

Point.prototype.inspect = function inspect() {
  if (this.isInfinity())
    return '<EC Point Infinity>';
  return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +
      ' y: ' + this.y.fromRed().toString(16, 2) +
      ' z: ' + this.z.fromRed().toString(16, 2) + '>';
};

Point.prototype.isInfinity = function isInfinity() {
  // XXX This code assumes that zero is always zero in red
  return this.x.cmpn(0) === 0 &&
    (this.y.cmp(this.z) === 0 ||
    (this.zOne && this.y.cmp(this.curve.c) === 0));
};

Point.prototype._extDbl = function _extDbl() {
  // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html
  //     #doubling-dbl-2008-hwcd
  // 4M + 4S

  // A = X1^2
  var a = this.x.redSqr();
  // B = Y1^2
  var b = this.y.redSqr();
  // C = 2 * Z1^2
  var c = this.z.redSqr();
  c = c.redIAdd(c);
  // D = a * A
  var d = this.curve._mulA(a);
  // E = (X1 + Y1)^2 - A - B
  var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);
  // G = D + B
  var g = d.redAdd(b);
  // F = G - C
  var f = g.redSub(c);
  // H = D - B
  var h = d.redSub(b);
  // X3 = E * F
  var nx = e.redMul(f);
  // Y3 = G * H
  var ny = g.redMul(h);
  // T3 = E * H
  var nt = e.redMul(h);
  // Z3 = F * G
  var nz = f.redMul(g);
  return this.curve.point(nx, ny, nz, nt);
};

Point.prototype._projDbl = function _projDbl() {
  // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html
  //     #doubling-dbl-2008-bbjlp
  //     #doubling-dbl-2007-bl
  // and others
  // Generally 3M + 4S or 2M + 4S

  // B = (X1 + Y1)^2
  var b = this.x.redAdd(this.y).redSqr();
  // C = X1^2
  var c = this.x.redSqr();
  // D = Y1^2
  var d = this.y.redSqr();

  var nx;
  var ny;
  var nz;
  var e;
  var h;
  var j;
  if (this.curve.twisted) {
    // E = a * C
    e = this.curve._mulA(c);
    // F = E + D
    var f = e.redAdd(d);
    if (this.zOne) {
      // X3 = (B - C - D) * (F - 2)
      nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));
      // Y3 = F * (E - D)
      ny = f.redMul(e.redSub(d));
      // Z3 = F^2 - 2 * F
      nz = f.redSqr().redSub(f).redSub(f);
    } else {
      // H = Z1^2
      h = this.z.redSqr();
      // J = F - 2 * H
      j = f.redSub(h).redISub(h);
      // X3 = (B-C-D)*J
      nx = b.redSub(c).redISub(d).redMul(j);
      // Y3 = F * (E - D)
      ny = f.redMul(e.redSub(d));
      // Z3 = F * J
      nz = f.redMul(j);
    }
  } else {
    // E = C + D
    e = c.redAdd(d);
    // H = (c * Z1)^2
    h = this.curve._mulC(this.z).redSqr();
    // J = E - 2 * H
    j = e.redSub(h).redSub(h);
    // X3 = c * (B - E) * J
    nx = this.curve._mulC(b.redISub(e)).redMul(j);
    // Y3 = c * E * (C - D)
    ny = this.curve._mulC(e).redMul(c.redISub(d));
    // Z3 = E * J
    nz = e.redMul(j);
  }
  return this.curve.point(nx, ny, nz);
};

Point.prototype.dbl = function dbl() {
  if (this.isInfinity())
    return this;

  // Double in extended coordinates
  if (this.curve.extended)
    return this._extDbl();
  else
    return this._projDbl();
};

Point.prototype._extAdd = function _extAdd(p) {
  // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html
  //     #addition-add-2008-hwcd-3
  // 8M

  // A = (Y1 - X1) * (Y2 - X2)
  var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));
  // B = (Y1 + X1) * (Y2 + X2)
  var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));
  // C = T1 * k * T2
  var c = this.t.redMul(this.curve.dd).redMul(p.t);
  // D = Z1 * 2 * Z2
  var d = this.z.redMul(p.z.redAdd(p.z));
  // E = B - A
  var e = b.redSub(a);
  // F = D - C
  var f = d.redSub(c);
  // G = D + C
  var g = d.redAdd(c);
  // H = B + A
  var h = b.redAdd(a);
  // X3 = E * F
  var nx = e.redMul(f);
  // Y3 = G * H
  var ny = g.redMul(h);
  // T3 = E * H
  var nt = e.redMul(h);
  // Z3 = F * G
  var nz = f.redMul(g);
  return this.curve.point(nx, ny, nz, nt);
};

Point.prototype._projAdd = function _projAdd(p) {
  // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html
  //     #addition-add-2008-bbjlp
  //     #addition-add-2007-bl
  // 10M + 1S

  // A = Z1 * Z2
  var a = this.z.redMul(p.z);
  // B = A^2
  var b = a.redSqr();
  // C = X1 * X2
  var c = this.x.redMul(p.x);
  // D = Y1 * Y2
  var d = this.y.redMul(p.y);
  // E = d * C * D
  var e = this.curve.d.redMul(c).redMul(d);
  // F = B - E
  var f = b.redSub(e);
  // G = B + E
  var g = b.redAdd(e);
  // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D)
  var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);
  var nx = a.redMul(f).redMul(tmp);
  var ny;
  var nz;
  if (this.curve.twisted) {
    // Y3 = A * G * (D - a * C)
    ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));
    // Z3 = F * G
    nz = f.redMul(g);
  } else {
    // Y3 = A * G * (D - C)
    ny = a.redMul(g).redMul(d.redSub(c));
    // Z3 = c * F * G
    nz = this.curve._mulC(f).redMul(g);
  }
  return this.curve.point(nx, ny, nz);
};

Point.prototype.add = function add(p) {
  if (this.isInfinity())
    return p;
  if (p.isInfinity())
    return this;

  if (this.curve.extended)
    return this._extAdd(p);
  else
    return this._projAdd(p);
};

Point.prototype.mul = function mul(k) {
  if (this._hasDoubles(k))
    return this.curve._fixedNafMul(this, k);
  else
    return this.curve._wnafMul(this, k);
};

Point.prototype.mulAdd = function mulAdd(k1, p, k2) {
  return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, false);
};

Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {
  return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, true);
};

Point.prototype.normalize = function normalize() {
  if (this.zOne)
    return this;

  // Normalize coordinates
  var zi = this.z.redInvm();
  this.x = this.x.redMul(zi);
  this.y = this.y.redMul(zi);
  if (this.t)
    this.t = this.t.redMul(zi);
  this.z = this.curve.one;
  this.zOne = true;
  return this;
};

Point.prototype.neg = function neg() {
  return this.curve.point(this.x.redNeg(),
    this.y,
    this.z,
    this.t && this.t.redNeg());
};

Point.prototype.getX = function getX() {
  this.normalize();
  return this.x.fromRed();
};

Point.prototype.getY = function getY() {
  this.normalize();
  return this.y.fromRed();
};

Point.prototype.eq = function eq(other) {
  return this === other ||
         this.getX().cmp(other.getX()) === 0 &&
         this.getY().cmp(other.getY()) === 0;
};

Point.prototype.eqXToP = function eqXToP(x) {
  var rx = x.toRed(this.curve.red).redMul(this.z);
  if (this.x.cmp(rx) === 0)
    return true;

  var xc = x.clone();
  var t = this.curve.redN.redMul(this.z);
  for (;;) {
    xc.iadd(this.curve.n);
    if (xc.cmp(this.curve.p) >= 0)
      return false;

    rx.redIAdd(t);
    if (this.x.cmp(rx) === 0)
      return true;
  }
};

// Compatibility with BaseCurve
Point.prototype.toP = Point.prototype.normalize;
Point.prototype.mixedAdd = Point.prototype.add;

},{"../utils":176,"./base":163,"bn.js":177,"inherits":219}],165:[function(require,module,exports){
'use strict';

var curve = exports;

curve.base = require('./base');
curve.short = require('./short');
curve.mont = require('./mont');
curve.edwards = require('./edwards');

},{"./base":163,"./edwards":164,"./mont":166,"./short":167}],166:[function(require,module,exports){
'use strict';

var BN = require('bn.js');
var inherits = require('inherits');
var Base = require('./base');

var utils = require('../utils');

function MontCurve(conf) {
  Base.call(this, 'mont', conf);

  this.a = new BN(conf.a, 16).toRed(this.red);
  this.b = new BN(conf.b, 16).toRed(this.red);
  this.i4 = new BN(4).toRed(this.red).redInvm();
  this.two = new BN(2).toRed(this.red);
  this.a24 = this.i4.redMul(this.a.redAdd(this.two));
}
inherits(MontCurve, Base);
module.exports = MontCurve;

MontCurve.prototype.validate = function validate(point) {
  var x = point.normalize().x;
  var x2 = x.redSqr();
  var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);
  var y = rhs.redSqrt();

  return y.redSqr().cmp(rhs) === 0;
};

function Point(curve, x, z) {
  Base.BasePoint.call(this, curve, 'projective');
  if (x === null && z === null) {
    this.x = this.curve.one;
    this.z = this.curve.zero;
  } else {
    this.x = new BN(x, 16);
    this.z = new BN(z, 16);
    if (!this.x.red)
      this.x = this.x.toRed(this.curve.red);
    if (!this.z.red)
      this.z = this.z.toRed(this.curve.red);
  }
}
inherits(Point, Base.BasePoint);

MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
  return this.point(utils.toArray(bytes, enc), 1);
};

MontCurve.prototype.point = function point(x, z) {
  return new Point(this, x, z);
};

MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
  return Point.fromJSON(this, obj);
};

Point.prototype.precompute = function precompute() {
  // No-op
};

Point.prototype._encode = function _encode() {
  return this.getX().toArray('be', this.curve.p.byteLength());
};

Point.fromJSON = function fromJSON(curve, obj) {
  return new Point(curve, obj[0], obj[1] || curve.one);
};

Point.prototype.inspect = function inspect() {
  if (this.isInfinity())
    return '<EC Point Infinity>';
  return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +
      ' z: ' + this.z.fromRed().toString(16, 2) + '>';
};

Point.prototype.isInfinity = function isInfinity() {
  // XXX This code assumes that zero is always zero in red
  return this.z.cmpn(0) === 0;
};

Point.prototype.dbl = function dbl() {
  // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#doubling-dbl-1987-m-3
  // 2M + 2S + 4A

  // A = X1 + Z1
  var a = this.x.redAdd(this.z);
  // AA = A^2
  var aa = a.redSqr();
  // B = X1 - Z1
  var b = this.x.redSub(this.z);
  // BB = B^2
  var bb = b.redSqr();
  // C = AA - BB
  var c = aa.redSub(bb);
  // X3 = AA * BB
  var nx = aa.redMul(bb);
  // Z3 = C * (BB + A24 * C)
  var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));
  return this.curve.point(nx, nz);
};

Point.prototype.add = function add() {
  throw new Error('Not supported on Montgomery curve');
};

Point.prototype.diffAdd = function diffAdd(p, diff) {
  // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#diffadd-dadd-1987-m-3
  // 4M + 2S + 6A

  // A = X2 + Z2
  var a = this.x.redAdd(this.z);
  // B = X2 - Z2
  var b = this.x.redSub(this.z);
  // C = X3 + Z3
  var c = p.x.redAdd(p.z);
  // D = X3 - Z3
  var d = p.x.redSub(p.z);
  // DA = D * A
  var da = d.redMul(a);
  // CB = C * B
  var cb = c.redMul(b);
  // X5 = Z1 * (DA + CB)^2
  var nx = diff.z.redMul(da.redAdd(cb).redSqr());
  // Z5 = X1 * (DA - CB)^2
  var nz = diff.x.redMul(da.redISub(cb).redSqr());
  return this.curve.point(nx, nz);
};

Point.prototype.mul = function mul(k) {
  var t = k.clone();
  var a = this; // (N / 2) * Q + Q
  var b = this.curve.point(null, null); // (N / 2) * Q
  var c = this; // Q

  for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1))
    bits.push(t.andln(1));

  for (var i = bits.length - 1; i >= 0; i--) {
    if (bits[i] === 0) {
      // N * Q + Q = ((N / 2) * Q + Q)) + (N / 2) * Q
      a = a.diffAdd(b, c);
      // N * Q = 2 * ((N / 2) * Q + Q))
      b = b.dbl();
    } else {
      // N * Q = ((N / 2) * Q + Q) + ((N / 2) * Q)
      b = a.diffAdd(b, c);
      // N * Q + Q = 2 * ((N / 2) * Q + Q)
      a = a.dbl();
    }
  }
  return b;
};

Point.prototype.mulAdd = function mulAdd() {
  throw new Error('Not supported on Montgomery curve');
};

Point.prototype.jumlAdd = function jumlAdd() {
  throw new Error('Not supported on Montgomery curve');
};

Point.prototype.eq = function eq(other) {
  return this.getX().cmp(other.getX()) === 0;
};

Point.prototype.normalize = function normalize() {
  this.x = this.x.redMul(this.z.redInvm());
  this.z = this.curve.one;
  return this;
};

Point.prototype.getX = function getX() {
  // Normalize coordinates
  this.normalize();

  return this.x.fromRed();
};

},{"../utils":176,"./base":163,"bn.js":177,"inherits":219}],167:[function(require,module,exports){
'use strict';

var utils = require('../utils');
var BN = require('bn.js');
var inherits = require('inherits');
var Base = require('./base');

var assert = utils.assert;

function ShortCurve(conf) {
  Base.call(this, 'short', conf);

  this.a = new BN(conf.a, 16).toRed(this.red);
  this.b = new BN(conf.b, 16).toRed(this.red);
  this.tinv = this.two.redInvm();

  this.zeroA = this.a.fromRed().cmpn(0) === 0;
  this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;

  // If the curve is endomorphic, precalculate beta and lambda
  this.endo = this._getEndomorphism(conf);
  this._endoWnafT1 = new Array(4);
  this._endoWnafT2 = new Array(4);
}
inherits(ShortCurve, Base);
module.exports = ShortCurve;

ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {
  // No efficient endomorphism
  if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)
    return;

  // Compute beta and lambda, that lambda * P = (beta * Px; Py)
  var beta;
  var lambda;
  if (conf.beta) {
    beta = new BN(conf.beta, 16).toRed(this.red);
  } else {
    var betas = this._getEndoRoots(this.p);
    // Choose the smallest beta
    beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];
    beta = beta.toRed(this.red);
  }
  if (conf.lambda) {
    lambda = new BN(conf.lambda, 16);
  } else {
    // Choose the lambda that is matching selected beta
    var lambdas = this._getEndoRoots(this.n);
    if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {
      lambda = lambdas[0];
    } else {
      lambda = lambdas[1];
      assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);
    }
  }

  // Get basis vectors, used for balanced length-two representation
  var basis;
  if (conf.basis) {
    basis = conf.basis.map(function(vec) {
      return {
        a: new BN(vec.a, 16),
        b: new BN(vec.b, 16),
      };
    });
  } else {
    basis = this._getEndoBasis(lambda);
  }

  return {
    beta: beta,
    lambda: lambda,
    basis: basis,
  };
};

ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {
  // Find roots of for x^2 + x + 1 in F
  // Root = (-1 +- Sqrt(-3)) / 2
  //
  var red = num === this.p ? this.red : BN.mont(num);
  var tinv = new BN(2).toRed(red).redInvm();
  var ntinv = tinv.redNeg();

  var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);

  var l1 = ntinv.redAdd(s).fromRed();
  var l2 = ntinv.redSub(s).fromRed();
  return [ l1, l2 ];
};

ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {
  // aprxSqrt >= sqrt(this.n)
  var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));

  // 3.74
  // Run EGCD, until r(L + 1) < aprxSqrt
  var u = lambda;
  var v = this.n.clone();
  var x1 = new BN(1);
  var y1 = new BN(0);
  var x2 = new BN(0);
  var y2 = new BN(1);

  // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n)
  var a0;
  var b0;
  // First vector
  var a1;
  var b1;
  // Second vector
  var a2;
  var b2;

  var prevR;
  var i = 0;
  var r;
  var x;
  while (u.cmpn(0) !== 0) {
    var q = v.div(u);
    r = v.sub(q.mul(u));
    x = x2.sub(q.mul(x1));
    var y = y2.sub(q.mul(y1));

    if (!a1 && r.cmp(aprxSqrt) < 0) {
      a0 = prevR.neg();
      b0 = x1;
      a1 = r.neg();
      b1 = x;
    } else if (a1 && ++i === 2) {
      break;
    }
    prevR = r;

    v = u;
    u = r;
    x2 = x1;
    x1 = x;
    y2 = y1;
    y1 = y;
  }
  a2 = r.neg();
  b2 = x;

  var len1 = a1.sqr().add(b1.sqr());
  var len2 = a2.sqr().add(b2.sqr());
  if (len2.cmp(len1) >= 0) {
    a2 = a0;
    b2 = b0;
  }

  // Normalize signs
  if (a1.negative) {
    a1 = a1.neg();
    b1 = b1.neg();
  }
  if (a2.negative) {
    a2 = a2.neg();
    b2 = b2.neg();
  }

  return [
    { a: a1, b: b1 },
    { a: a2, b: b2 },
  ];
};

ShortCurve.prototype._endoSplit = function _endoSplit(k) {
  var basis = this.endo.basis;
  var v1 = basis[0];
  var v2 = basis[1];

  var c1 = v2.b.mul(k).divRound(this.n);
  var c2 = v1.b.neg().mul(k).divRound(this.n);

  var p1 = c1.mul(v1.a);
  var p2 = c2.mul(v2.a);
  var q1 = c1.mul(v1.b);
  var q2 = c2.mul(v2.b);

  // Calculate answer
  var k1 = k.sub(p1).sub(p2);
  var k2 = q1.add(q2).neg();
  return { k1: k1, k2: k2 };
};

ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {
  x = new BN(x, 16);
  if (!x.red)
    x = x.toRed(this.red);

  var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);
  var y = y2.redSqrt();
  if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
    throw new Error('invalid point');

  // XXX Is there any way to tell if the number is odd without converting it
  // to non-red form?
  var isOdd = y.fromRed().isOdd();
  if (odd && !isOdd || !odd && isOdd)
    y = y.redNeg();

  return this.point(x, y);
};

ShortCurve.prototype.validate = function validate(point) {
  if (point.inf)
    return true;

  var x = point.x;
  var y = point.y;

  var ax = this.a.redMul(x);
  var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);
  return y.redSqr().redISub(rhs).cmpn(0) === 0;
};

ShortCurve.prototype._endoWnafMulAdd =
    function _endoWnafMulAdd(points, coeffs, jacobianResult) {
      var npoints = this._endoWnafT1;
      var ncoeffs = this._endoWnafT2;
      for (var i = 0; i < points.length; i++) {
        var split = this._endoSplit(coeffs[i]);
        var p = points[i];
        var beta = p._getBeta();

        if (split.k1.negative) {
          split.k1.ineg();
          p = p.neg(true);
        }
        if (split.k2.negative) {
          split.k2.ineg();
          beta = beta.neg(true);
        }

        npoints[i * 2] = p;
        npoints[i * 2 + 1] = beta;
        ncoeffs[i * 2] = split.k1;
        ncoeffs[i * 2 + 1] = split.k2;
      }
      var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);

      // Clean-up references to points and coefficients
      for (var j = 0; j < i * 2; j++) {
        npoints[j] = null;
        ncoeffs[j] = null;
      }
      return res;
    };

function Point(curve, x, y, isRed) {
  Base.BasePoint.call(this, curve, 'affine');
  if (x === null && y === null) {
    this.x = null;
    this.y = null;
    this.inf = true;
  } else {
    this.x = new BN(x, 16);
    this.y = new BN(y, 16);
    // Force redgomery representation when loading from JSON
    if (isRed) {
      this.x.forceRed(this.curve.red);
      this.y.forceRed(this.curve.red);
    }
    if (!this.x.red)
      this.x = this.x.toRed(this.curve.red);
    if (!this.y.red)
      this.y = this.y.toRed(this.curve.red);
    this.inf = false;
  }
}
inherits(Point, Base.BasePoint);

ShortCurve.prototype.point = function point(x, y, isRed) {
  return new Point(this, x, y, isRed);
};

ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {
  return Point.fromJSON(this, obj, red);
};

Point.prototype._getBeta = function _getBeta() {
  if (!this.curve.endo)
    return;

  var pre = this.precomputed;
  if (pre && pre.beta)
    return pre.beta;

  var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);
  if (pre) {
    var curve = this.curve;
    var endoMul = function(p) {
      return curve.point(p.x.redMul(curve.endo.beta), p.y);
    };
    pre.beta = beta;
    beta.precomputed = {
      beta: null,
      naf: pre.naf && {
        wnd: pre.naf.wnd,
        points: pre.naf.points.map(endoMul),
      },
      doubles: pre.doubles && {
        step: pre.doubles.step,
        points: pre.doubles.points.map(endoMul),
      },
    };
  }
  return beta;
};

Point.prototype.toJSON = function toJSON() {
  if (!this.precomputed)
    return [ this.x, this.y ];

  return [ this.x, this.y, this.precomputed && {
    doubles: this.precomputed.doubles && {
      step: this.precomputed.doubles.step,
      points: this.precomputed.doubles.points.slice(1),
    },
    naf: this.precomputed.naf && {
      wnd: this.precomputed.naf.wnd,
      points: this.precomputed.naf.points.slice(1),
    },
  } ];
};

Point.fromJSON = function fromJSON(curve, obj, red) {
  if (typeof obj === 'string')
    obj = JSON.parse(obj);
  var res = curve.point(obj[0], obj[1], red);
  if (!obj[2])
    return res;

  function obj2point(obj) {
    return curve.point(obj[0], obj[1], red);
  }

  var pre = obj[2];
  res.precomputed = {
    beta: null,
    doubles: pre.doubles && {
      step: pre.doubles.step,
      points: [ res ].concat(pre.doubles.points.map(obj2point)),
    },
    naf: pre.naf && {
      wnd: pre.naf.wnd,
      points: [ res ].concat(pre.naf.points.map(obj2point)),
    },
  };
  return res;
};

Point.prototype.inspect = function inspect() {
  if (this.isInfinity())
    return '<EC Point Infinity>';
  return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +
      ' y: ' + this.y.fromRed().toString(16, 2) + '>';
};

Point.prototype.isInfinity = function isInfinity() {
  return this.inf;
};

Point.prototype.add = function add(p) {
  // O + P = P
  if (this.inf)
    return p;

  // P + O = P
  if (p.inf)
    return this;

  // P + P = 2P
  if (this.eq(p))
    return this.dbl();

  // P + (-P) = O
  if (this.neg().eq(p))
    return this.curve.point(null, null);

  // P + Q = O
  if (this.x.cmp(p.x) === 0)
    return this.curve.point(null, null);

  var c = this.y.redSub(p.y);
  if (c.cmpn(0) !== 0)
    c = c.redMul(this.x.redSub(p.x).redInvm());
  var nx = c.redSqr().redISub(this.x).redISub(p.x);
  var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
  return this.curve.point(nx, ny);
};

Point.prototype.dbl = function dbl() {
  if (this.inf)
    return this;

  // 2P = O
  var ys1 = this.y.redAdd(this.y);
  if (ys1.cmpn(0) === 0)
    return this.curve.point(null, null);

  var a = this.curve.a;

  var x2 = this.x.redSqr();
  var dyinv = ys1.redInvm();
  var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);

  var nx = c.redSqr().redISub(this.x.redAdd(this.x));
  var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
  return this.curve.point(nx, ny);
};

Point.prototype.getX = function getX() {
  return this.x.fromRed();
};

Point.prototype.getY = function getY() {
  return this.y.fromRed();
};

Point.prototype.mul = function mul(k) {
  k = new BN(k, 16);
  if (this.isInfinity())
    return this;
  else if (this._hasDoubles(k))
    return this.curve._fixedNafMul(this, k);
  else if (this.curve.endo)
    return this.curve._endoWnafMulAdd([ this ], [ k ]);
  else
    return this.curve._wnafMul(this, k);
};

Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {
  var points = [ this, p2 ];
  var coeffs = [ k1, k2 ];
  if (this.curve.endo)
    return this.curve._endoWnafMulAdd(points, coeffs);
  else
    return this.curve._wnafMulAdd(1, points, coeffs, 2);
};

Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {
  var points = [ this, p2 ];
  var coeffs = [ k1, k2 ];
  if (this.curve.endo)
    return this.curve._endoWnafMulAdd(points, coeffs, true);
  else
    return this.curve._wnafMulAdd(1, points, coeffs, 2, true);
};

Point.prototype.eq = function eq(p) {
  return this === p ||
         this.inf === p.inf &&
             (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);
};

Point.prototype.neg = function neg(_precompute) {
  if (this.inf)
    return this;

  var res = this.curve.point(this.x, this.y.redNeg());
  if (_precompute && this.precomputed) {
    var pre = this.precomputed;
    var negate = function(p) {
      return p.neg();
    };
    res.precomputed = {
      naf: pre.naf && {
        wnd: pre.naf.wnd,
        points: pre.naf.points.map(negate),
      },
      doubles: pre.doubles && {
        step: pre.doubles.step,
        points: pre.doubles.points.map(negate),
      },
    };
  }
  return res;
};

Point.prototype.toJ = function toJ() {
  if (this.inf)
    return this.curve.jpoint(null, null, null);

  var res = this.curve.jpoint(this.x, this.y, this.curve.one);
  return res;
};

function JPoint(curve, x, y, z) {
  Base.BasePoint.call(this, curve, 'jacobian');
  if (x === null && y === null && z === null) {
    this.x = this.curve.one;
    this.y = this.curve.one;
    this.z = new BN(0);
  } else {
    this.x = new BN(x, 16);
    this.y = new BN(y, 16);
    this.z = new BN(z, 16);
  }
  if (!this.x.red)
    this.x = this.x.toRed(this.curve.red);
  if (!this.y.red)
    this.y = this.y.toRed(this.curve.red);
  if (!this.z.red)
    this.z = this.z.toRed(this.curve.red);

  this.zOne = this.z === this.curve.one;
}
inherits(JPoint, Base.BasePoint);

ShortCurve.prototype.jpoint = function jpoint(x, y, z) {
  return new JPoint(this, x, y, z);
};

JPoint.prototype.toP = function toP() {
  if (this.isInfinity())
    return this.curve.point(null, null);

  var zinv = this.z.redInvm();
  var zinv2 = zinv.redSqr();
  var ax = this.x.redMul(zinv2);
  var ay = this.y.redMul(zinv2).redMul(zinv);

  return this.curve.point(ax, ay);
};

JPoint.prototype.neg = function neg() {
  return this.curve.jpoint(this.x, this.y.redNeg(), this.z);
};

JPoint.prototype.add = function add(p) {
  // O + P = P
  if (this.isInfinity())
    return p;

  // P + O = P
  if (p.isInfinity())
    return this;

  // 12M + 4S + 7A
  var pz2 = p.z.redSqr();
  var z2 = this.z.redSqr();
  var u1 = this.x.redMul(pz2);
  var u2 = p.x.redMul(z2);
  var s1 = this.y.redMul(pz2.redMul(p.z));
  var s2 = p.y.redMul(z2.redMul(this.z));

  var h = u1.redSub(u2);
  var r = s1.redSub(s2);
  if (h.cmpn(0) === 0) {
    if (r.cmpn(0) !== 0)
      return this.curve.jpoint(null, null, null);
    else
      return this.dbl();
  }

  var h2 = h.redSqr();
  var h3 = h2.redMul(h);
  var v = u1.redMul(h2);

  var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
  var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
  var nz = this.z.redMul(p.z).redMul(h);

  return this.curve.jpoint(nx, ny, nz);
};

JPoint.prototype.mixedAdd = function mixedAdd(p) {
  // O + P = P
  if (this.isInfinity())
    return p.toJ();

  // P + O = P
  if (p.isInfinity())
    return this;

  // 8M + 3S + 7A
  var z2 = this.z.redSqr();
  var u1 = this.x;
  var u2 = p.x.redMul(z2);
  var s1 = this.y;
  var s2 = p.y.redMul(z2).redMul(this.z);

  var h = u1.redSub(u2);
  var r = s1.redSub(s2);
  if (h.cmpn(0) === 0) {
    if (r.cmpn(0) !== 0)
      return this.curve.jpoint(null, null, null);
    else
      return this.dbl();
  }

  var h2 = h.redSqr();
  var h3 = h2.redMul(h);
  var v = u1.redMul(h2);

  var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
  var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
  var nz = this.z.redMul(h);

  return this.curve.jpoint(nx, ny, nz);
};

JPoint.prototype.dblp = function dblp(pow) {
  if (pow === 0)
    return this;
  if (this.isInfinity())
    return this;
  if (!pow)
    return this.dbl();

  var i;
  if (this.curve.zeroA || this.curve.threeA) {
    var r = this;
    for (i = 0; i < pow; i++)
      r = r.dbl();
    return r;
  }

  // 1M + 2S + 1A + N * (4S + 5M + 8A)
  // N = 1 => 6M + 6S + 9A
  var a = this.curve.a;
  var tinv = this.curve.tinv;

  var jx = this.x;
  var jy = this.y;
  var jz = this.z;
  var jz4 = jz.redSqr().redSqr();

  // Reuse results
  var jyd = jy.redAdd(jy);
  for (i = 0; i < pow; i++) {
    var jx2 = jx.redSqr();
    var jyd2 = jyd.redSqr();
    var jyd4 = jyd2.redSqr();
    var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));

    var t1 = jx.redMul(jyd2);
    var nx = c.redSqr().redISub(t1.redAdd(t1));
    var t2 = t1.redISub(nx);
    var dny = c.redMul(t2);
    dny = dny.redIAdd(dny).redISub(jyd4);
    var nz = jyd.redMul(jz);
    if (i + 1 < pow)
      jz4 = jz4.redMul(jyd4);

    jx = nx;
    jz = nz;
    jyd = dny;
  }

  return this.curve.jpoint(jx, jyd.redMul(tinv), jz);
};

JPoint.prototype.dbl = function dbl() {
  if (this.isInfinity())
    return this;

  if (this.curve.zeroA)
    return this._zeroDbl();
  else if (this.curve.threeA)
    return this._threeDbl();
  else
    return this._dbl();
};

JPoint.prototype._zeroDbl = function _zeroDbl() {
  var nx;
  var ny;
  var nz;
  // Z = 1
  if (this.zOne) {
    // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html
    //     #doubling-mdbl-2007-bl
    // 1M + 5S + 14A

    // XX = X1^2
    var xx = this.x.redSqr();
    // YY = Y1^2
    var yy = this.y.redSqr();
    // YYYY = YY^2
    var yyyy = yy.redSqr();
    // S = 2 * ((X1 + YY)^2 - XX - YYYY)
    var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
    s = s.redIAdd(s);
    // M = 3 * XX + a; a = 0
    var m = xx.redAdd(xx).redIAdd(xx);
    // T = M ^ 2 - 2*S
    var t = m.redSqr().redISub(s).redISub(s);

    // 8 * YYYY
    var yyyy8 = yyyy.redIAdd(yyyy);
    yyyy8 = yyyy8.redIAdd(yyyy8);
    yyyy8 = yyyy8.redIAdd(yyyy8);

    // X3 = T
    nx = t;
    // Y3 = M * (S - T) - 8 * YYYY
    ny = m.redMul(s.redISub(t)).redISub(yyyy8);
    // Z3 = 2*Y1
    nz = this.y.redAdd(this.y);
  } else {
    // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html
    //     #doubling-dbl-2009-l
    // 2M + 5S + 13A

    // A = X1^2
    var a = this.x.redSqr();
    // B = Y1^2
    var b = this.y.redSqr();
    // C = B^2
    var c = b.redSqr();
    // D = 2 * ((X1 + B)^2 - A - C)
    var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);
    d = d.redIAdd(d);
    // E = 3 * A
    var e = a.redAdd(a).redIAdd(a);
    // F = E^2
    var f = e.redSqr();

    // 8 * C
    var c8 = c.redIAdd(c);
    c8 = c8.redIAdd(c8);
    c8 = c8.redIAdd(c8);

    // X3 = F - 2 * D
    nx = f.redISub(d).redISub(d);
    // Y3 = E * (D - X3) - 8 * C
    ny = e.redMul(d.redISub(nx)).redISub(c8);
    // Z3 = 2 * Y1 * Z1
    nz = this.y.redMul(this.z);
    nz = nz.redIAdd(nz);
  }

  return this.curve.jpoint(nx, ny, nz);
};

JPoint.prototype._threeDbl = function _threeDbl() {
  var nx;
  var ny;
  var nz;
  // Z = 1
  if (this.zOne) {
    // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html
    //     #doubling-mdbl-2007-bl
    // 1M + 5S + 15A

    // XX = X1^2
    var xx = this.x.redSqr();
    // YY = Y1^2
    var yy = this.y.redSqr();
    // YYYY = YY^2
    var yyyy = yy.redSqr();
    // S = 2 * ((X1 + YY)^2 - XX - YYYY)
    var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
    s = s.redIAdd(s);
    // M = 3 * XX + a
    var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);
    // T = M^2 - 2 * S
    var t = m.redSqr().redISub(s).redISub(s);
    // X3 = T
    nx = t;
    // Y3 = M * (S - T) - 8 * YYYY
    var yyyy8 = yyyy.redIAdd(yyyy);
    yyyy8 = yyyy8.redIAdd(yyyy8);
    yyyy8 = yyyy8.redIAdd(yyyy8);
    ny = m.redMul(s.redISub(t)).redISub(yyyy8);
    // Z3 = 2 * Y1
    nz = this.y.redAdd(this.y);
  } else {
    // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
    // 3M + 5S

    // delta = Z1^2
    var delta = this.z.redSqr();
    // gamma = Y1^2
    var gamma = this.y.redSqr();
    // beta = X1 * gamma
    var beta = this.x.redMul(gamma);
    // alpha = 3 * (X1 - delta) * (X1 + delta)
    var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));
    alpha = alpha.redAdd(alpha).redIAdd(alpha);
    // X3 = alpha^2 - 8 * beta
    var beta4 = beta.redIAdd(beta);
    beta4 = beta4.redIAdd(beta4);
    var beta8 = beta4.redAdd(beta4);
    nx = alpha.redSqr().redISub(beta8);
    // Z3 = (Y1 + Z1)^2 - gamma - delta
    nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);
    // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2
    var ggamma8 = gamma.redSqr();
    ggamma8 = ggamma8.redIAdd(ggamma8);
    ggamma8 = ggamma8.redIAdd(ggamma8);
    ggamma8 = ggamma8.redIAdd(ggamma8);
    ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);
  }

  return this.curve.jpoint(nx, ny, nz);
};

JPoint.prototype._dbl = function _dbl() {
  var a = this.curve.a;

  // 4M + 6S + 10A
  var jx = this.x;
  var jy = this.y;
  var jz = this.z;
  var jz4 = jz.redSqr().redSqr();

  var jx2 = jx.redSqr();
  var jy2 = jy.redSqr();

  var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));

  var jxd4 = jx.redAdd(jx);
  jxd4 = jxd4.redIAdd(jxd4);
  var t1 = jxd4.redMul(jy2);
  var nx = c.redSqr().redISub(t1.redAdd(t1));
  var t2 = t1.redISub(nx);

  var jyd8 = jy2.redSqr();
  jyd8 = jyd8.redIAdd(jyd8);
  jyd8 = jyd8.redIAdd(jyd8);
  jyd8 = jyd8.redIAdd(jyd8);
  var ny = c.redMul(t2).redISub(jyd8);
  var nz = jy.redAdd(jy).redMul(jz);

  return this.curve.jpoint(nx, ny, nz);
};

JPoint.prototype.trpl = function trpl() {
  if (!this.curve.zeroA)
    return this.dbl().add(this);

  // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl
  // 5M + 10S + ...

  // XX = X1^2
  var xx = this.x.redSqr();
  // YY = Y1^2
  var yy = this.y.redSqr();
  // ZZ = Z1^2
  var zz = this.z.redSqr();
  // YYYY = YY^2
  var yyyy = yy.redSqr();
  // M = 3 * XX + a * ZZ2; a = 0
  var m = xx.redAdd(xx).redIAdd(xx);
  // MM = M^2
  var mm = m.redSqr();
  // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM
  var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
  e = e.redIAdd(e);
  e = e.redAdd(e).redIAdd(e);
  e = e.redISub(mm);
  // EE = E^2
  var ee = e.redSqr();
  // T = 16*YYYY
  var t = yyyy.redIAdd(yyyy);
  t = t.redIAdd(t);
  t = t.redIAdd(t);
  t = t.redIAdd(t);
  // U = (M + E)^2 - MM - EE - T
  var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);
  // X3 = 4 * (X1 * EE - 4 * YY * U)
  var yyu4 = yy.redMul(u);
  yyu4 = yyu4.redIAdd(yyu4);
  yyu4 = yyu4.redIAdd(yyu4);
  var nx = this.x.redMul(ee).redISub(yyu4);
  nx = nx.redIAdd(nx);
  nx = nx.redIAdd(nx);
  // Y3 = 8 * Y1 * (U * (T - U) - E * EE)
  var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));
  ny = ny.redIAdd(ny);
  ny = ny.redIAdd(ny);
  ny = ny.redIAdd(ny);
  // Z3 = (Z1 + E)^2 - ZZ - EE
  var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);

  return this.curve.jpoint(nx, ny, nz);
};

JPoint.prototype.mul = function mul(k, kbase) {
  k = new BN(k, kbase);

  return this.curve._wnafMul(this, k);
};

JPoint.prototype.eq = function eq(p) {
  if (p.type === 'affine')
    return this.eq(p.toJ());

  if (this === p)
    return true;

  // x1 * z2^2 == x2 * z1^2
  var z2 = this.z.redSqr();
  var pz2 = p.z.redSqr();
  if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)
    return false;

  // y1 * z2^3 == y2 * z1^3
  var z3 = z2.redMul(this.z);
  var pz3 = pz2.redMul(p.z);
  return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;
};

JPoint.prototype.eqXToP = function eqXToP(x) {
  var zs = this.z.redSqr();
  var rx = x.toRed(this.curve.red).redMul(zs);
  if (this.x.cmp(rx) === 0)
    return true;

  var xc = x.clone();
  var t = this.curve.redN.redMul(zs);
  for (;;) {
    xc.iadd(this.curve.n);
    if (xc.cmp(this.curve.p) >= 0)
      return false;

    rx.redIAdd(t);
    if (this.x.cmp(rx) === 0)
      return true;
  }
};

JPoint.prototype.inspect = function inspect() {
  if (this.isInfinity())
    return '<EC JPoint Infinity>';
  return '<EC JPoint x: ' + this.x.toString(16, 2) +
      ' y: ' + this.y.toString(16, 2) +
      ' z: ' + this.z.toString(16, 2) + '>';
};

JPoint.prototype.isInfinity = function isInfinity() {
  // XXX This code assumes that zero is always zero in red
  return this.z.cmpn(0) === 0;
};

},{"../utils":176,"./base":163,"bn.js":177,"inherits":219}],168:[function(require,module,exports){
'use strict';

var curves = exports;

var hash = require('hash.js');
var curve = require('./curve');
var utils = require('./utils');

var assert = utils.assert;

function PresetCurve(options) {
  if (options.type === 'short')
    this.curve = new curve.short(options);
  else if (options.type === 'edwards')
    this.curve = new curve.edwards(options);
  else
    this.curve = new curve.mont(options);
  this.g = this.curve.g;
  this.n = this.curve.n;
  this.hash = options.hash;

  assert(this.g.validate(), 'Invalid curve');
  assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O');
}
curves.PresetCurve = PresetCurve;

function defineCurve(name, options) {
  Object.defineProperty(curves, name, {
    configurable: true,
    enumerable: true,
    get: function() {
      var curve = new PresetCurve(options);
      Object.defineProperty(curves, name, {
        configurable: true,
        enumerable: true,
        value: curve,
      });
      return curve;
    },
  });
}

defineCurve('p192', {
  type: 'short',
  prime: 'p192',
  p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff',
  a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc',
  b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1',
  n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831',
  hash: hash.sha256,
  gRed: false,
  g: [
    '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012',
    '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811',
  ],
});

defineCurve('p224', {
  type: 'short',
  prime: 'p224',
  p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001',
  a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe',
  b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4',
  n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d',
  hash: hash.sha256,
  gRed: false,
  g: [
    'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21',
    'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34',
  ],
});

defineCurve('p256', {
  type: 'short',
  prime: null,
  p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff',
  a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc',
  b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b',
  n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551',
  hash: hash.sha256,
  gRed: false,
  g: [
    '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296',
    '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5',
  ],
});

defineCurve('p384', {
  type: 'short',
  prime: null,
  p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
     'fffffffe ffffffff 00000000 00000000 ffffffff',
  a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
     'fffffffe ffffffff 00000000 00000000 fffffffc',
  b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' +
     '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef',
  n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' +
     'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973',
  hash: hash.sha384,
  gRed: false,
  g: [
    'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' +
    '5502f25d bf55296c 3a545e38 72760ab7',
    '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' +
    '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f',
  ],
});

defineCurve('p521', {
  type: 'short',
  prime: null,
  p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
     'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
     'ffffffff ffffffff ffffffff ffffffff ffffffff',
  a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
     'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
     'ffffffff ffffffff ffffffff ffffffff fffffffc',
  b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' +
     '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' +
     '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00',
  n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
     'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' +
     'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409',
  hash: hash.sha512,
  gRed: false,
  g: [
    '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' +
    '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' +
    'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66',
    '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' +
    '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' +
    '3fad0761 353c7086 a272c240 88be9476 9fd16650',
  ],
});

defineCurve('curve25519', {
  type: 'mont',
  prime: 'p25519',
  p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',
  a: '76d06',
  b: '1',
  n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',
  hash: hash.sha256,
  gRed: false,
  g: [
    '9',
  ],
});

defineCurve('ed25519', {
  type: 'edwards',
  prime: 'p25519',
  p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',
  a: '-1',
  c: '1',
  // -121665 * (121666^(-1)) (mod P)
  d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3',
  n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',
  hash: hash.sha256,
  gRed: false,
  g: [
    '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a',

    // 4/5
    '6666666666666666666666666666666666666666666666666666666666666658',
  ],
});

var pre;
try {
  pre = require('./precomputed/secp256k1');
} catch (e) {
  pre = undefined;
}

defineCurve('secp256k1', {
  type: 'short',
  prime: 'k256',
  p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f',
  a: '0',
  b: '7',
  n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141',
  h: '1',
  hash: hash.sha256,

  // Precomputed endomorphism
  beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee',
  lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72',
  basis: [
    {
      a: '3086d221a7d46bcde86c90e49284eb15',
      b: '-e4437ed6010e88286f547fa90abfe4c3',
    },
    {
      a: '114ca50f7a8e2f3f657c1108d9d44cfd8',
      b: '3086d221a7d46bcde86c90e49284eb15',
    },
  ],

  gRed: false,
  g: [
    '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
    '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8',
    pre,
  ],
});

},{"./curve":165,"./precomputed/secp256k1":175,"./utils":176,"hash.js":204}],169:[function(require,module,exports){
'use strict';

var BN = require('bn.js');
var HmacDRBG = require('hmac-drbg');
var utils = require('../utils');
var curves = require('../curves');
var rand = require('brorand');
var assert = utils.assert;

var KeyPair = require('./key');
var Signature = require('./signature');

function EC(options) {
  if (!(this instanceof EC))
    return new EC(options);

  // Shortcut `elliptic.ec(curve-name)`
  if (typeof options === 'string') {
    assert(Object.prototype.hasOwnProperty.call(curves, options),
      'Unknown curve ' + options);

    options = curves[options];
  }

  // Shortcut for `elliptic.ec(elliptic.curves.curveName)`
  if (options instanceof curves.PresetCurve)
    options = { curve: options };

  this.curve = options.curve.curve;
  this.n = this.curve.n;
  this.nh = this.n.ushrn(1);
  this.g = this.curve.g;

  // Point on curve
  this.g = options.curve.g;
  this.g.precompute(options.curve.n.bitLength() + 1);

  // Hash for function for DRBG
  this.hash = options.hash || options.curve.hash;
}
module.exports = EC;

EC.prototype.keyPair = function keyPair(options) {
  return new KeyPair(this, options);
};

EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {
  return KeyPair.fromPrivate(this, priv, enc);
};

EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {
  return KeyPair.fromPublic(this, pub, enc);
};

EC.prototype.genKeyPair = function genKeyPair(options) {
  if (!options)
    options = {};

  // Instantiate Hmac_DRBG
  var drbg = new HmacDRBG({
    hash: this.hash,
    pers: options.pers,
    persEnc: options.persEnc || 'utf8',
    entropy: options.entropy || rand(this.hash.hmacStrength),
    entropyEnc: options.entropy && options.entropyEnc || 'utf8',
    nonce: this.n.toArray(),
  });

  var bytes = this.n.byteLength();
  var ns2 = this.n.sub(new BN(2));
  for (;;) {
    var priv = new BN(drbg.generate(bytes));
    if (priv.cmp(ns2) > 0)
      continue;

    priv.iaddn(1);
    return this.keyFromPrivate(priv);
  }
};

EC.prototype._truncateToN = function _truncateToN(msg, truncOnly, bitLength) {
  var byteLength;
  if (BN.isBN(msg) || typeof msg === 'number') {
    msg = new BN(msg, 16);
    byteLength = msg.byteLength();
  } else if (typeof msg === 'object') {
    // BN assumes an array-like input and asserts length
    byteLength = msg.length;
    msg = new BN(msg, 16);
  } else {
    // BN converts the value to string
    var str = msg.toString();
    // HEX encoding
    byteLength = (str.length + 1) >>> 1;
    msg = new BN(str, 16);
  }
  // Allow overriding
  if (typeof bitLength !== 'number') {
    bitLength = byteLength * 8;
  }
  var delta = bitLength - this.n.bitLength();
  if (delta > 0)
    msg = msg.ushrn(delta);
  if (!truncOnly && msg.cmp(this.n) >= 0)
    return msg.sub(this.n);
  else
    return msg;
};

EC.prototype.sign = function sign(msg, key, enc, options) {
  if (typeof enc === 'object') {
    options = enc;
    enc = null;
  }
  if (!options)
    options = {};

  if (typeof msg !== 'string' && typeof msg !== 'number' && !BN.isBN(msg)) {
    assert(typeof msg === 'object' && msg && typeof msg.length === 'number',
      'Expected message to be an array-like, a hex string, or a BN instance');
    assert((msg.length >>> 0) === msg.length); // non-negative 32-bit integer
    for (var i = 0; i < msg.length; i++) assert((msg[i] & 255) === msg[i]);
  }

  key = this.keyFromPrivate(key, enc);
  msg = this._truncateToN(msg, false, options.msgBitLength);

  // Would fail further checks, but let's make the error message clear
  assert(!msg.isNeg(), 'Can not sign a negative message');

  // Zero-extend key to provide enough entropy
  var bytes = this.n.byteLength();
  var bkey = key.getPrivate().toArray('be', bytes);

  // Zero-extend nonce to have the same byte size as N
  var nonce = msg.toArray('be', bytes);

  // Recheck nonce to be bijective to msg
  assert((new BN(nonce)).eq(msg), 'Can not sign message');

  // Instantiate Hmac_DRBG
  var drbg = new HmacDRBG({
    hash: this.hash,
    entropy: bkey,
    nonce: nonce,
    pers: options.pers,
    persEnc: options.persEnc || 'utf8',
  });

  // Number of bytes to generate
  var ns1 = this.n.sub(new BN(1));

  for (var iter = 0; ; iter++) {
    var k = options.k ?
      options.k(iter) :
      new BN(drbg.generate(this.n.byteLength()));
    k = this._truncateToN(k, true);
    if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)
      continue;

    var kp = this.g.mul(k);
    if (kp.isInfinity())
      continue;

    var kpX = kp.getX();
    var r = kpX.umod(this.n);
    if (r.cmpn(0) === 0)
      continue;

    var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));
    s = s.umod(this.n);
    if (s.cmpn(0) === 0)
      continue;

    var recoveryParam = (kp.getY().isOdd() ? 1 : 0) |
                        (kpX.cmp(r) !== 0 ? 2 : 0);

    // Use complement of `s`, if it is > `n / 2`
    if (options.canonical && s.cmp(this.nh) > 0) {
      s = this.n.sub(s);
      recoveryParam ^= 1;
    }

    return new Signature({ r: r, s: s, recoveryParam: recoveryParam });
  }
};

EC.prototype.verify = function verify(msg, signature, key, enc, options) {
  if (!options)
    options = {};

  msg = this._truncateToN(msg, false, options.msgBitLength);
  key = this.keyFromPublic(key, enc);
  signature = new Signature(signature, 'hex');

  // Perform primitive values validation
  var r = signature.r;
  var s = signature.s;
  if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)
    return false;
  if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)
    return false;

  // Validate signature
  var sinv = s.invm(this.n);
  var u1 = sinv.mul(msg).umod(this.n);
  var u2 = sinv.mul(r).umod(this.n);
  var p;

  if (!this.curve._maxwellTrick) {
    p = this.g.mulAdd(u1, key.getPublic(), u2);
    if (p.isInfinity())
      return false;

    return p.getX().umod(this.n).cmp(r) === 0;
  }

  // NOTE: Greg Maxwell's trick, inspired by:
  // https://git.io/vad3K

  p = this.g.jmulAdd(u1, key.getPublic(), u2);
  if (p.isInfinity())
    return false;

  // Compare `p.x` of Jacobian point with `r`,
  // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the
  // inverse of `p.z^2`
  return p.eqXToP(r);
};

EC.prototype.recoverPubKey = function(msg, signature, j, enc) {
  assert((3 & j) === j, 'The recovery param is more than two bits');
  signature = new Signature(signature, enc);

  var n = this.n;
  var e = new BN(msg);
  var r = signature.r;
  var s = signature.s;

  // A set LSB signifies that the y-coordinate is odd
  var isYOdd = j & 1;
  var isSecondKey = j >> 1;
  if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)
    throw new Error('Unable to find sencond key candinate');

  // 1.1. Let x = r + jn.
  if (isSecondKey)
    r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);
  else
    r = this.curve.pointFromX(r, isYOdd);

  var rInv = signature.r.invm(n);
  var s1 = n.sub(e).mul(rInv).umod(n);
  var s2 = s.mul(rInv).umod(n);

  // 1.6.1 Compute Q = r^-1 (sR -  eG)
  //               Q = r^-1 (sR + -eG)
  return this.g.mulAdd(s1, r, s2);
};

EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {
  signature = new Signature(signature, enc);
  if (signature.recoveryParam !== null)
    return signature.recoveryParam;

  for (var i = 0; i < 4; i++) {
    var Qprime;
    try {
      Qprime = this.recoverPubKey(e, signature, i);
    } catch (e) {
      continue;
    }

    if (Qprime.eq(Q))
      return i;
  }
  throw new Error('Unable to find valid recovery factor');
};

},{"../curves":168,"../utils":176,"./key":170,"./signature":171,"bn.js":177,"brorand":53,"hmac-drbg":217}],170:[function(require,module,exports){
'use strict';

var BN = require('bn.js');
var utils = require('../utils');
var assert = utils.assert;

function KeyPair(ec, options) {
  this.ec = ec;
  this.priv = null;
  this.pub = null;

  // KeyPair(ec, { priv: ..., pub: ... })
  if (options.priv)
    this._importPrivate(options.priv, options.privEnc);
  if (options.pub)
    this._importPublic(options.pub, options.pubEnc);
}
module.exports = KeyPair;

KeyPair.fromPublic = function fromPublic(ec, pub, enc) {
  if (pub instanceof KeyPair)
    return pub;

  return new KeyPair(ec, {
    pub: pub,
    pubEnc: enc,
  });
};

KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {
  if (priv instanceof KeyPair)
    return priv;

  return new KeyPair(ec, {
    priv: priv,
    privEnc: enc,
  });
};

KeyPair.prototype.validate = function validate() {
  var pub = this.getPublic();

  if (pub.isInfinity())
    return { result: false, reason: 'Invalid public key' };
  if (!pub.validate())
    return { result: false, reason: 'Public key is not a point' };
  if (!pub.mul(this.ec.curve.n).isInfinity())
    return { result: false, reason: 'Public key * N != O' };

  return { result: true, reason: null };
};

KeyPair.prototype.getPublic = function getPublic(compact, enc) {
  // compact is optional argument
  if (typeof compact === 'string') {
    enc = compact;
    compact = null;
  }

  if (!this.pub)
    this.pub = this.ec.g.mul(this.priv);

  if (!enc)
    return this.pub;

  return this.pub.encode(enc, compact);
};

KeyPair.prototype.getPrivate = function getPrivate(enc) {
  if (enc === 'hex')
    return this.priv.toString(16, 2);
  else
    return this.priv;
};

KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {
  this.priv = new BN(key, enc || 16);

  // Ensure that the priv won't be bigger than n, otherwise we may fail
  // in fixed multiplication method
  this.priv = this.priv.umod(this.ec.curve.n);
};

KeyPair.prototype._importPublic = function _importPublic(key, enc) {
  if (key.x || key.y) {
    // Montgomery points only have an `x` coordinate.
    // Weierstrass/Edwards points on the other hand have both `x` and
    // `y` coordinates.
    if (this.ec.curve.type === 'mont') {
      assert(key.x, 'Need x coordinate');
    } else if (this.ec.curve.type === 'short' ||
               this.ec.curve.type === 'edwards') {
      assert(key.x && key.y, 'Need both x and y coordinate');
    }
    this.pub = this.ec.curve.point(key.x, key.y);
    return;
  }
  this.pub = this.ec.curve.decodePoint(key, enc);
};

// ECDH
KeyPair.prototype.derive = function derive(pub) {
  if(!pub.validate()) {
    assert(pub.validate(), 'public point not validated');
  }
  return pub.mul(this.priv).getX();
};

// ECDSA
KeyPair.prototype.sign = function sign(msg, enc, options) {
  return this.ec.sign(msg, this, enc, options);
};

KeyPair.prototype.verify = function verify(msg, signature, options) {
  return this.ec.verify(msg, signature, this, undefined, options);
};

KeyPair.prototype.inspect = function inspect() {
  return '<Key priv: ' + (this.priv && this.priv.toString(16, 2)) +
         ' pub: ' + (this.pub && this.pub.inspect()) + ' >';
};

},{"../utils":176,"bn.js":177}],171:[function(require,module,exports){
'use strict';

var BN = require('bn.js');

var utils = require('../utils');
var assert = utils.assert;

function Signature(options, enc) {
  if (options instanceof Signature)
    return options;

  if (this._importDER(options, enc))
    return;

  assert(options.r && options.s, 'Signature without r or s');
  this.r = new BN(options.r, 16);
  this.s = new BN(options.s, 16);
  if (options.recoveryParam === undefined)
    this.recoveryParam = null;
  else
    this.recoveryParam = options.recoveryParam;
}
module.exports = Signature;

function Position() {
  this.place = 0;
}

function getLength(buf, p) {
  var initial = buf[p.place++];
  if (!(initial & 0x80)) {
    return initial;
  }
  var octetLen = initial & 0xf;

  // Indefinite length or overflow
  if (octetLen === 0 || octetLen > 4) {
    return false;
  }

  if(buf[p.place] === 0x00) {
    return false;
  }

  var val = 0;
  for (var i = 0, off = p.place; i < octetLen; i++, off++) {
    val <<= 8;
    val |= buf[off];
    val >>>= 0;
  }

  // Leading zeroes
  if (val <= 0x7f) {
    return false;
  }

  p.place = off;
  return val;
}

function rmPadding(buf) {
  var i = 0;
  var len = buf.length - 1;
  while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) {
    i++;
  }
  if (i === 0) {
    return buf;
  }
  return buf.slice(i);
}

Signature.prototype._importDER = function _importDER(data, enc) {
  data = utils.toArray(data, enc);
  var p = new Position();
  if (data[p.place++] !== 0x30) {
    return false;
  }
  var len = getLength(data, p);
  if (len === false) {
    return false;
  }
  if ((len + p.place) !== data.length) {
    return false;
  }
  if (data[p.place++] !== 0x02) {
    return false;
  }
  var rlen = getLength(data, p);
  if (rlen === false) {
    return false;
  }
  if ((data[p.place] & 128) !== 0) {
    return false;
  }
  var r = data.slice(p.place, rlen + p.place);
  p.place += rlen;
  if (data[p.place++] !== 0x02) {
    return false;
  }
  var slen = getLength(data, p);
  if (slen === false) {
    return false;
  }
  if (data.length !== slen + p.place) {
    return false;
  }
  if ((data[p.place] & 128) !== 0) {
    return false;
  }
  var s = data.slice(p.place, slen + p.place);
  if (r[0] === 0) {
    if (r[1] & 0x80) {
      r = r.slice(1);
    } else {
      // Leading zeroes
      return false;
    }
  }
  if (s[0] === 0) {
    if (s[1] & 0x80) {
      s = s.slice(1);
    } else {
      // Leading zeroes
      return false;
    }
  }

  this.r = new BN(r);
  this.s = new BN(s);
  this.recoveryParam = null;

  return true;
};

function constructLength(arr, len) {
  if (len < 0x80) {
    arr.push(len);
    return;
  }
  var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);
  arr.push(octets | 0x80);
  while (--octets) {
    arr.push((len >>> (octets << 3)) & 0xff);
  }
  arr.push(len);
}

Signature.prototype.toDER = function toDER(enc) {
  var r = this.r.toArray();
  var s = this.s.toArray();

  // Pad values
  if (r[0] & 0x80)
    r = [ 0 ].concat(r);
  // Pad values
  if (s[0] & 0x80)
    s = [ 0 ].concat(s);

  r = rmPadding(r);
  s = rmPadding(s);

  while (!s[0] && !(s[1] & 0x80)) {
    s = s.slice(1);
  }
  var arr = [ 0x02 ];
  constructLength(arr, r.length);
  arr = arr.concat(r);
  arr.push(0x02);
  constructLength(arr, s.length);
  var backHalf = arr.concat(s);
  var res = [ 0x30 ];
  constructLength(res, backHalf.length);
  res = res.concat(backHalf);
  return utils.encode(res, enc);
};

},{"../utils":176,"bn.js":177}],172:[function(require,module,exports){
'use strict';

var hash = require('hash.js');
var curves = require('../curves');
var utils = require('../utils');
var assert = utils.assert;
var parseBytes = utils.parseBytes;
var KeyPair = require('./key');
var Signature = require('./signature');

function EDDSA(curve) {
  assert(curve === 'ed25519', 'only tested with ed25519 so far');

  if (!(this instanceof EDDSA))
    return new EDDSA(curve);

  curve = curves[curve].curve;
  this.curve = curve;
  this.g = curve.g;
  this.g.precompute(curve.n.bitLength() + 1);

  this.pointClass = curve.point().constructor;
  this.encodingLength = Math.ceil(curve.n.bitLength() / 8);
  this.hash = hash.sha512;
}

module.exports = EDDSA;

/**
* @param {Array|String} message - message bytes
* @param {Array|String|KeyPair} secret - secret bytes or a keypair
* @returns {Signature} - signature
*/
EDDSA.prototype.sign = function sign(message, secret) {
  message = parseBytes(message);
  var key = this.keyFromSecret(secret);
  var r = this.hashInt(key.messagePrefix(), message);
  var R = this.g.mul(r);
  var Rencoded = this.encodePoint(R);
  var s_ = this.hashInt(Rencoded, key.pubBytes(), message)
    .mul(key.priv());
  var S = r.add(s_).umod(this.curve.n);
  return this.makeSignature({ R: R, S: S, Rencoded: Rencoded });
};

/**
* @param {Array} message - message bytes
* @param {Array|String|Signature} sig - sig bytes
* @param {Array|String|Point|KeyPair} pub - public key
* @returns {Boolean} - true if public key matches sig of message
*/
EDDSA.prototype.verify = function verify(message, sig, pub) {
  message = parseBytes(message);
  sig = this.makeSignature(sig);
  if (sig.S().gte(sig.eddsa.curve.n) || sig.S().isNeg()) {
    return false;
  }
  var key = this.keyFromPublic(pub);
  var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);
  var SG = this.g.mul(sig.S());
  var RplusAh = sig.R().add(key.pub().mul(h));
  return RplusAh.eq(SG);
};

EDDSA.prototype.hashInt = function hashInt() {
  var hash = this.hash();
  for (var i = 0; i < arguments.length; i++)
    hash.update(arguments[i]);
  return utils.intFromLE(hash.digest()).umod(this.curve.n);
};

EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {
  return KeyPair.fromPublic(this, pub);
};

EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {
  return KeyPair.fromSecret(this, secret);
};

EDDSA.prototype.makeSignature = function makeSignature(sig) {
  if (sig instanceof Signature)
    return sig;
  return new Signature(this, sig);
};

/**
* * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2
*
* EDDSA defines methods for encoding and decoding points and integers. These are
* helper convenience methods, that pass along to utility functions implied
* parameters.
*
*/
EDDSA.prototype.encodePoint = function encodePoint(point) {
  var enc = point.getY().toArray('le', this.encodingLength);
  enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0;
  return enc;
};

EDDSA.prototype.decodePoint = function decodePoint(bytes) {
  bytes = utils.parseBytes(bytes);

  var lastIx = bytes.length - 1;
  var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80);
  var xIsOdd = (bytes[lastIx] & 0x80) !== 0;

  var y = utils.intFromLE(normed);
  return this.curve.pointFromY(y, xIsOdd);
};

EDDSA.prototype.encodeInt = function encodeInt(num) {
  return num.toArray('le', this.encodingLength);
};

EDDSA.prototype.decodeInt = function decodeInt(bytes) {
  return utils.intFromLE(bytes);
};

EDDSA.prototype.isPoint = function isPoint(val) {
  return val instanceof this.pointClass;
};

},{"../curves":168,"../utils":176,"./key":173,"./signature":174,"hash.js":204}],173:[function(require,module,exports){
'use strict';

var utils = require('../utils');
var assert = utils.assert;
var parseBytes = utils.parseBytes;
var cachedProperty = utils.cachedProperty;

/**
* @param {EDDSA} eddsa - instance
* @param {Object} params - public/private key parameters
*
* @param {Array<Byte>} [params.secret] - secret seed bytes
* @param {Point} [params.pub] - public key point (aka `A` in eddsa terms)
* @param {Array<Byte>} [params.pub] - public key point encoded as bytes
*
*/
function KeyPair(eddsa, params) {
  this.eddsa = eddsa;
  this._secret = parseBytes(params.secret);
  if (eddsa.isPoint(params.pub))
    this._pub = params.pub;
  else
    this._pubBytes = parseBytes(params.pub);
}

KeyPair.fromPublic = function fromPublic(eddsa, pub) {
  if (pub instanceof KeyPair)
    return pub;
  return new KeyPair(eddsa, { pub: pub });
};

KeyPair.fromSecret = function fromSecret(eddsa, secret) {
  if (secret instanceof KeyPair)
    return secret;
  return new KeyPair(eddsa, { secret: secret });
};

KeyPair.prototype.secret = function secret() {
  return this._secret;
};

cachedProperty(KeyPair, 'pubBytes', function pubBytes() {
  return this.eddsa.encodePoint(this.pub());
});

cachedProperty(KeyPair, 'pub', function pub() {
  if (this._pubBytes)
    return this.eddsa.decodePoint(this._pubBytes);
  return this.eddsa.g.mul(this.priv());
});

cachedProperty(KeyPair, 'privBytes', function privBytes() {
  var eddsa = this.eddsa;
  var hash = this.hash();
  var lastIx = eddsa.encodingLength - 1;

  var a = hash.slice(0, eddsa.encodingLength);
  a[0] &= 248;
  a[lastIx] &= 127;
  a[lastIx] |= 64;

  return a;
});

cachedProperty(KeyPair, 'priv', function priv() {
  return this.eddsa.decodeInt(this.privBytes());
});

cachedProperty(KeyPair, 'hash', function hash() {
  return this.eddsa.hash().update(this.secret()).digest();
});

cachedProperty(KeyPair, 'messagePrefix', function messagePrefix() {
  return this.hash().slice(this.eddsa.encodingLength);
});

KeyPair.prototype.sign = function sign(message) {
  assert(this._secret, 'KeyPair can only verify');
  return this.eddsa.sign(message, this);
};

KeyPair.prototype.verify = function verify(message, sig) {
  return this.eddsa.verify(message, sig, this);
};

KeyPair.prototype.getSecret = function getSecret(enc) {
  assert(this._secret, 'KeyPair is public only');
  return utils.encode(this.secret(), enc);
};

KeyPair.prototype.getPublic = function getPublic(enc) {
  return utils.encode(this.pubBytes(), enc);
};

module.exports = KeyPair;

},{"../utils":176}],174:[function(require,module,exports){
'use strict';

var BN = require('bn.js');
var utils = require('../utils');
var assert = utils.assert;
var cachedProperty = utils.cachedProperty;
var parseBytes = utils.parseBytes;

/**
* @param {EDDSA} eddsa - eddsa instance
* @param {Array<Bytes>|Object} sig -
* @param {Array<Bytes>|Point} [sig.R] - R point as Point or bytes
* @param {Array<Bytes>|bn} [sig.S] - S scalar as bn or bytes
* @param {Array<Bytes>} [sig.Rencoded] - R point encoded
* @param {Array<Bytes>} [sig.Sencoded] - S scalar encoded
*/
function Signature(eddsa, sig) {
  this.eddsa = eddsa;

  if (typeof sig !== 'object')
    sig = parseBytes(sig);

  if (Array.isArray(sig)) {
    assert(sig.length === eddsa.encodingLength * 2, 'Signature has invalid size');
    sig = {
      R: sig.slice(0, eddsa.encodingLength),
      S: sig.slice(eddsa.encodingLength),
    };
  }

  assert(sig.R && sig.S, 'Signature without R or S');

  if (eddsa.isPoint(sig.R))
    this._R = sig.R;
  if (sig.S instanceof BN)
    this._S = sig.S;

  this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;
  this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;
}

cachedProperty(Signature, 'S', function S() {
  return this.eddsa.decodeInt(this.Sencoded());
});

cachedProperty(Signature, 'R', function R() {
  return this.eddsa.decodePoint(this.Rencoded());
});

cachedProperty(Signature, 'Rencoded', function Rencoded() {
  return this.eddsa.encodePoint(this.R());
});

cachedProperty(Signature, 'Sencoded', function Sencoded() {
  return this.eddsa.encodeInt(this.S());
});

Signature.prototype.toBytes = function toBytes() {
  return this.Rencoded().concat(this.Sencoded());
};

Signature.prototype.toHex = function toHex() {
  return utils.encode(this.toBytes(), 'hex').toUpperCase();
};

module.exports = Signature;

},{"../utils":176,"bn.js":177}],175:[function(require,module,exports){
module.exports = {
  doubles: {
    step: 4,
    points: [
      [
        'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a',
        'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821',
      ],
      [
        '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508',
        '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf',
      ],
      [
        '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739',
        'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695',
      ],
      [
        '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640',
        '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9',
      ],
      [
        '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c',
        '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36',
      ],
      [
        '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda',
        '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f',
      ],
      [
        'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa',
        '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999',
      ],
      [
        '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0',
        'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09',
      ],
      [
        'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d',
        '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d',
      ],
      [
        'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d',
        'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088',
      ],
      [
        'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1',
        '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d',
      ],
      [
        '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0',
        '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8',
      ],
      [
        '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047',
        '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a',
      ],
      [
        '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862',
        '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453',
      ],
      [
        '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7',
        '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160',
      ],
      [
        '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd',
        '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0',
      ],
      [
        '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83',
        '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6',
      ],
      [
        '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a',
        '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589',
      ],
      [
        '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8',
        'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17',
      ],
      [
        'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d',
        '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda',
      ],
      [
        'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725',
        '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd',
      ],
      [
        '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754',
        '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2',
      ],
      [
        '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c',
        '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6',
      ],
      [
        'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6',
        '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f',
      ],
      [
        '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39',
        'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01',
      ],
      [
        'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891',
        '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3',
      ],
      [
        'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b',
        'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f',
      ],
      [
        'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03',
        '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7',
      ],
      [
        'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d',
        'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78',
      ],
      [
        'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070',
        '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1',
      ],
      [
        '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4',
        'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150',
      ],
      [
        '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da',
        '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82',
      ],
      [
        'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11',
        '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc',
      ],
      [
        '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e',
        'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b',
      ],
      [
        'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41',
        '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51',
      ],
      [
        'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef',
        '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45',
      ],
      [
        'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8',
        'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120',
      ],
      [
        '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d',
        '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84',
      ],
      [
        '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96',
        '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d',
      ],
      [
        '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd',
        'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d',
      ],
      [
        '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5',
        '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8',
      ],
      [
        'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266',
        '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8',
      ],
      [
        '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71',
        '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac',
      ],
      [
        '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac',
        'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f',
      ],
      [
        '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751',
        '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962',
      ],
      [
        'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e',
        '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907',
      ],
      [
        '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241',
        'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec',
      ],
      [
        'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3',
        'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d',
      ],
      [
        'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f',
        '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414',
      ],
      [
        '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19',
        'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd',
      ],
      [
        '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be',
        'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0',
      ],
      [
        'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9',
        '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811',
      ],
      [
        'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2',
        '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1',
      ],
      [
        'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13',
        '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c',
      ],
      [
        '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c',
        'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73',
      ],
      [
        '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba',
        '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd',
      ],
      [
        'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151',
        'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405',
      ],
      [
        '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073',
        'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589',
      ],
      [
        '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458',
        '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e',
      ],
      [
        '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b',
        '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27',
      ],
      [
        'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366',
        'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1',
      ],
      [
        '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa',
        '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482',
      ],
      [
        '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0',
        '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945',
      ],
      [
        'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787',
        '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573',
      ],
      [
        'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e',
        'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82',
      ],
    ],
  },
  naf: {
    wnd: 7,
    points: [
      [
        'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9',
        '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672',
      ],
      [
        '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4',
        'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6',
      ],
      [
        '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc',
        '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da',
      ],
      [
        'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe',
        'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37',
      ],
      [
        '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb',
        'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b',
      ],
      [
        'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8',
        'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81',
      ],
      [
        'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e',
        '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58',
      ],
      [
        'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34',
        '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77',
      ],
      [
        '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c',
        '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a',
      ],
      [
        '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5',
        '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c',
      ],
      [
        '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f',
        '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67',
      ],
      [
        '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714',
        '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402',
      ],
      [
        'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729',
        'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55',
      ],
      [
        'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db',
        '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482',
      ],
      [
        '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4',
        'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82',
      ],
      [
        '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5',
        'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396',
      ],
      [
        '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479',
        '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49',
      ],
      [
        '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d',
        '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf',
      ],
      [
        '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f',
        '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a',
      ],
      [
        '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb',
        'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7',
      ],
      [
        'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9',
        'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933',
      ],
      [
        '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963',
        '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a',
      ],
      [
        '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74',
        '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6',
      ],
      [
        'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530',
        'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37',
      ],
      [
        '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b',
        '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e',
      ],
      [
        'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247',
        'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6',
      ],
      [
        'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1',
        'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476',
      ],
      [
        '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120',
        '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40',
      ],
      [
        '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435',
        '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61',
      ],
      [
        '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18',
        '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683',
      ],
      [
        'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8',
        '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5',
      ],
      [
        '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb',
        '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b',
      ],
      [
        'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f',
        '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417',
      ],
      [
        '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143',
        'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868',
      ],
      [
        '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba',
        'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a',
      ],
      [
        'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45',
        'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6',
      ],
      [
        '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a',
        '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996',
      ],
      [
        '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e',
        'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e',
      ],
      [
        'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8',
        'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d',
      ],
      [
        '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c',
        '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2',
      ],
      [
        '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519',
        'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e',
      ],
      [
        '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab',
        '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437',
      ],
      [
        '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca',
        'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311',
      ],
      [
        'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf',
        '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4',
      ],
      [
        '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610',
        '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575',
      ],
      [
        '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4',
        'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d',
      ],
      [
        '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c',
        'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d',
      ],
      [
        'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940',
        'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629',
      ],
      [
        'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980',
        'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06',
      ],
      [
        '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3',
        '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374',
      ],
      [
        '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf',
        '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee',
      ],
      [
        'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63',
        '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1',
      ],
      [
        'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448',
        'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b',
      ],
      [
        '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf',
        '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661',
      ],
      [
        '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5',
        '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6',
      ],
      [
        'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6',
        '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e',
      ],
      [
        '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5',
        '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d',
      ],
      [
        'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99',
        'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc',
      ],
      [
        '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51',
        'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4',
      ],
      [
        '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5',
        '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c',
      ],
      [
        'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5',
        '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b',
      ],
      [
        'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997',
        '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913',
      ],
      [
        '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881',
        '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154',
      ],
      [
        '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5',
        '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865',
      ],
      [
        '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66',
        'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc',
      ],
      [
        '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726',
        'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224',
      ],
      [
        '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede',
        '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e',
      ],
      [
        '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94',
        '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6',
      ],
      [
        '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31',
        '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511',
      ],
      [
        '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51',
        'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b',
      ],
      [
        'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252',
        'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2',
      ],
      [
        '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5',
        'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c',
      ],
      [
        'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b',
        '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3',
      ],
      [
        'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4',
        '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d',
      ],
      [
        'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f',
        '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700',
      ],
      [
        'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889',
        '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4',
      ],
      [
        '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246',
        'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196',
      ],
      [
        '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984',
        '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4',
      ],
      [
        '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a',
        'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257',
      ],
      [
        'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030',
        'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13',
      ],
      [
        'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197',
        '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096',
      ],
      [
        'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593',
        'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38',
      ],
      [
        'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef',
        '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f',
      ],
      [
        '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38',
        '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448',
      ],
      [
        'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a',
        '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a',
      ],
      [
        'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111',
        '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4',
      ],
      [
        '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502',
        '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437',
      ],
      [
        '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea',
        'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7',
      ],
      [
        'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26',
        '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d',
      ],
      [
        'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986',
        '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a',
      ],
      [
        'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e',
        '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54',
      ],
      [
        '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4',
        '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77',
      ],
      [
        'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda',
        'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517',
      ],
      [
        '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859',
        'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10',
      ],
      [
        'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f',
        'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125',
      ],
      [
        'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c',
        '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e',
      ],
      [
        '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942',
        'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1',
      ],
      [
        'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a',
        '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2',
      ],
      [
        'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80',
        '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423',
      ],
      [
        'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d',
        '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8',
      ],
      [
        '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1',
        'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758',
      ],
      [
        '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63',
        'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375',
      ],
      [
        'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352',
        '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d',
      ],
      [
        '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193',
        'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec',
      ],
      [
        '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00',
        '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0',
      ],
      [
        '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58',
        'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c',
      ],
      [
        'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7',
        'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4',
      ],
      [
        '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8',
        'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f',
      ],
      [
        '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e',
        '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649',
      ],
      [
        '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d',
        'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826',
      ],
      [
        '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b',
        '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5',
      ],
      [
        'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f',
        'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87',
      ],
      [
        '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6',
        '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b',
      ],
      [
        'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297',
        '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc',
      ],
      [
        '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a',
        '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c',
      ],
      [
        'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c',
        'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f',
      ],
      [
        'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52',
        '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a',
      ],
      [
        'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb',
        'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46',
      ],
      [
        '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065',
        'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f',
      ],
      [
        '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917',
        '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03',
      ],
      [
        '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9',
        'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08',
      ],
      [
        '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3',
        '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8',
      ],
      [
        '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57',
        '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373',
      ],
      [
        '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66',
        'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3',
      ],
      [
        '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8',
        '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8',
      ],
      [
        '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721',
        '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1',
      ],
      [
        '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180',
        '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9',
      ],
    ],
  },
};

},{}],176:[function(require,module,exports){
'use strict';

var utils = exports;
var BN = require('bn.js');
var minAssert = require('minimalistic-assert');
var minUtils = require('minimalistic-crypto-utils');

utils.assert = minAssert;
utils.toArray = minUtils.toArray;
utils.zero2 = minUtils.zero2;
utils.toHex = minUtils.toHex;
utils.encode = minUtils.encode;

// Represent num in a w-NAF form
function getNAF(num, w, bits) {
  var naf = new Array(Math.max(num.bitLength(), bits) + 1);
  var i;
  for (i = 0; i < naf.length; i += 1) {
    naf[i] = 0;
  }

  var ws = 1 << (w + 1);
  var k = num.clone();

  for (i = 0; i < naf.length; i++) {
    var z;
    var mod = k.andln(ws - 1);
    if (k.isOdd()) {
      if (mod > (ws >> 1) - 1)
        z = (ws >> 1) - mod;
      else
        z = mod;
      k.isubn(z);
    } else {
      z = 0;
    }

    naf[i] = z;
    k.iushrn(1);
  }

  return naf;
}
utils.getNAF = getNAF;

// Represent k1, k2 in a Joint Sparse Form
function getJSF(k1, k2) {
  var jsf = [
    [],
    [],
  ];

  k1 = k1.clone();
  k2 = k2.clone();
  var d1 = 0;
  var d2 = 0;
  var m8;
  while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {
    // First phase
    var m14 = (k1.andln(3) + d1) & 3;
    var m24 = (k2.andln(3) + d2) & 3;
    if (m14 === 3)
      m14 = -1;
    if (m24 === 3)
      m24 = -1;
    var u1;
    if ((m14 & 1) === 0) {
      u1 = 0;
    } else {
      m8 = (k1.andln(7) + d1) & 7;
      if ((m8 === 3 || m8 === 5) && m24 === 2)
        u1 = -m14;
      else
        u1 = m14;
    }
    jsf[0].push(u1);

    var u2;
    if ((m24 & 1) === 0) {
      u2 = 0;
    } else {
      m8 = (k2.andln(7) + d2) & 7;
      if ((m8 === 3 || m8 === 5) && m14 === 2)
        u2 = -m24;
      else
        u2 = m24;
    }
    jsf[1].push(u2);

    // Second phase
    if (2 * d1 === u1 + 1)
      d1 = 1 - d1;
    if (2 * d2 === u2 + 1)
      d2 = 1 - d2;
    k1.iushrn(1);
    k2.iushrn(1);
  }

  return jsf;
}
utils.getJSF = getJSF;

function cachedProperty(obj, name, computer) {
  var key = '_' + name;
  obj.prototype[name] = function cachedProperty() {
    return this[key] !== undefined ? this[key] :
      this[key] = computer.call(this);
  };
}
utils.cachedProperty = cachedProperty;

function parseBytes(bytes) {
  return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') :
    bytes;
}
utils.parseBytes = parseBytes;

function intFromLE(bytes) {
  return new BN(bytes, 'hex', 'le');
}
utils.intFromLE = intFromLE;


},{"bn.js":177,"minimalistic-assert":235,"minimalistic-crypto-utils":236}],177:[function(require,module,exports){
arguments[4][49][0].apply(exports,arguments)
},{"buffer":54,"dup":49}],178:[function(require,module,exports){
module.exports={
  "name": "elliptic",
  "version": "6.6.1",
  "description": "EC cryptography",
  "main": "lib/elliptic.js",
  "files": [
    "lib"
  ],
  "scripts": {
    "lint": "eslint lib test",
    "lint:fix": "npm run lint -- --fix",
    "unit": "istanbul test _mocha --reporter=spec test/index.js",
    "test": "npm run lint && npm run unit",
    "version": "grunt dist && git add dist/"
  },
  "repository": {
    "type": "git",
    "url": "git@github.com:indutny/elliptic"
  },
  "keywords": [
    "EC",
    "Elliptic",
    "curve",
    "Cryptography"
  ],
  "author": "Fedor Indutny <fedor@indutny.com>",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/indutny/elliptic/issues"
  },
  "homepage": "https://github.com/indutny/elliptic",
  "devDependencies": {
    "brfs": "^2.0.2",
    "coveralls": "^3.1.0",
    "eslint": "^7.6.0",
    "grunt": "^1.2.1",
    "grunt-browserify": "^5.3.0",
    "grunt-cli": "^1.3.2",
    "grunt-contrib-connect": "^3.0.0",
    "grunt-contrib-copy": "^1.0.0",
    "grunt-contrib-uglify": "^5.0.0",
    "grunt-mocha-istanbul": "^5.0.2",
    "grunt-saucelabs": "^9.0.1",
    "istanbul": "^0.4.5",
    "mocha": "^8.0.1"
  },
  "dependencies": {
    "bn.js": "^4.11.9",
    "brorand": "^1.1.0",
    "hash.js": "^1.0.0",
    "hmac-drbg": "^1.0.1",
    "inherits": "^2.0.4",
    "minimalistic-assert": "^1.0.1",
    "minimalistic-crypto-utils": "^1.0.1"
  }
}

},{}],179:[function(require,module,exports){
'use strict';

/** @type {import('.')} */
var $defineProperty = Object.defineProperty || false;
if ($defineProperty) {
	try {
		$defineProperty({}, 'a', { value: 1 });
	} catch (e) {
		// IE 8 has a broken defineProperty
		$defineProperty = false;
	}
}

module.exports = $defineProperty;

},{}],180:[function(require,module,exports){
'use strict';

/** @type {import('./eval')} */
module.exports = EvalError;

},{}],181:[function(require,module,exports){
'use strict';

/** @type {import('.')} */
module.exports = Error;

},{}],182:[function(require,module,exports){
'use strict';

/** @type {import('./range')} */
module.exports = RangeError;

},{}],183:[function(require,module,exports){
'use strict';

/** @type {import('./ref')} */
module.exports = ReferenceError;

},{}],184:[function(require,module,exports){
'use strict';

/** @type {import('./syntax')} */
module.exports = SyntaxError;

},{}],185:[function(require,module,exports){
'use strict';

/** @type {import('./type')} */
module.exports = TypeError;

},{}],186:[function(require,module,exports){
'use strict';

/** @type {import('./uri')} */
module.exports = URIError;

},{}],187:[function(require,module,exports){
'use strict';

/** @type {import('.')} */
module.exports = Object;

},{}],188:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

var R = typeof Reflect === 'object' ? Reflect : null
var ReflectApply = R && typeof R.apply === 'function'
  ? R.apply
  : function ReflectApply(target, receiver, args) {
    return Function.prototype.apply.call(target, receiver, args);
  }

var ReflectOwnKeys
if (R && typeof R.ownKeys === 'function') {
  ReflectOwnKeys = R.ownKeys
} else if (Object.getOwnPropertySymbols) {
  ReflectOwnKeys = function ReflectOwnKeys(target) {
    return Object.getOwnPropertyNames(target)
      .concat(Object.getOwnPropertySymbols(target));
  };
} else {
  ReflectOwnKeys = function ReflectOwnKeys(target) {
    return Object.getOwnPropertyNames(target);
  };
}

function ProcessEmitWarning(warning) {
  if (console && console.warn) console.warn(warning);
}

var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
  return value !== value;
}

function EventEmitter() {
  EventEmitter.init.call(this);
}
module.exports = EventEmitter;
module.exports.once = once;

// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;

EventEmitter.prototype._events = undefined;
EventEmitter.prototype._eventsCount = 0;
EventEmitter.prototype._maxListeners = undefined;

// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
var defaultMaxListeners = 10;

function checkListener(listener) {
  if (typeof listener !== 'function') {
    throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
  }
}

Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
  enumerable: true,
  get: function() {
    return defaultMaxListeners;
  },
  set: function(arg) {
    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
      throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
    }
    defaultMaxListeners = arg;
  }
});

EventEmitter.init = function() {

  if (this._events === undefined ||
      this._events === Object.getPrototypeOf(this)._events) {
    this._events = Object.create(null);
    this._eventsCount = 0;
  }

  this._maxListeners = this._maxListeners || undefined;
};

// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
    throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
  }
  this._maxListeners = n;
  return this;
};

function _getMaxListeners(that) {
  if (that._maxListeners === undefined)
    return EventEmitter.defaultMaxListeners;
  return that._maxListeners;
}

EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
  return _getMaxListeners(this);
};

EventEmitter.prototype.emit = function emit(type) {
  var args = [];
  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
  var doError = (type === 'error');

  var events = this._events;
  if (events !== undefined)
    doError = (doError && events.error === undefined);
  else if (!doError)
    return false;

  // If there is no 'error' event listener then throw.
  if (doError) {
    var er;
    if (args.length > 0)
      er = args[0];
    if (er instanceof Error) {
      // Note: The comments on the `throw` lines are intentional, they show
      // up in Node's output if this results in an unhandled exception.
      throw er; // Unhandled 'error' event
    }
    // At least give some kind of context to the user
    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
    err.context = er;
    throw err; // Unhandled 'error' event
  }

  var handler = events[type];

  if (handler === undefined)
    return false;

  if (typeof handler === 'function') {
    ReflectApply(handler, this, args);
  } else {
    var len = handler.length;
    var listeners = arrayClone(handler, len);
    for (var i = 0; i < len; ++i)
      ReflectApply(listeners[i], this, args);
  }

  return true;
};

function _addListener(target, type, listener, prepend) {
  var m;
  var events;
  var existing;

  checkListener(listener);

  events = target._events;
  if (events === undefined) {
    events = target._events = Object.create(null);
    target._eventsCount = 0;
  } else {
    // To avoid recursion in the case that type === "newListener"! Before
    // adding it to the listeners, first emit "newListener".
    if (events.newListener !== undefined) {
      target.emit('newListener', type,
                  listener.listener ? listener.listener : listener);

      // Re-assign `events` because a newListener handler could have caused the
      // this._events to be assigned to a new object
      events = target._events;
    }
    existing = events[type];
  }

  if (existing === undefined) {
    // Optimize the case of one listener. Don't need the extra array object.
    existing = events[type] = listener;
    ++target._eventsCount;
  } else {
    if (typeof existing === 'function') {
      // Adding the second element, need to change to array.
      existing = events[type] =
        prepend ? [listener, existing] : [existing, listener];
      // If we've already got an array, just append.
    } else if (prepend) {
      existing.unshift(listener);
    } else {
      existing.push(listener);
    }

    // Check for listener leak
    m = _getMaxListeners(target);
    if (m > 0 && existing.length > m && !existing.warned) {
      existing.warned = true;
      // No error code for this since it is a Warning
      // eslint-disable-next-line no-restricted-syntax
      var w = new Error('Possible EventEmitter memory leak detected. ' +
                          existing.length + ' ' + String(type) + ' listeners ' +
                          'added. Use emitter.setMaxListeners() to ' +
                          'increase limit');
      w.name = 'MaxListenersExceededWarning';
      w.emitter = target;
      w.type = type;
      w.count = existing.length;
      ProcessEmitWarning(w);
    }
  }

  return target;
}

EventEmitter.prototype.addListener = function addListener(type, listener) {
  return _addListener(this, type, listener, false);
};

EventEmitter.prototype.on = EventEmitter.prototype.addListener;

EventEmitter.prototype.prependListener =
    function prependListener(type, listener) {
      return _addListener(this, type, listener, true);
    };

function onceWrapper() {
  if (!this.fired) {
    this.target.removeListener(this.type, this.wrapFn);
    this.fired = true;
    if (arguments.length === 0)
      return this.listener.call(this.target);
    return this.listener.apply(this.target, arguments);
  }
}

function _onceWrap(target, type, listener) {
  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
  var wrapped = onceWrapper.bind(state);
  wrapped.listener = listener;
  state.wrapFn = wrapped;
  return wrapped;
}

EventEmitter.prototype.once = function once(type, listener) {
  checkListener(listener);
  this.on(type, _onceWrap(this, type, listener));
  return this;
};

EventEmitter.prototype.prependOnceListener =
    function prependOnceListener(type, listener) {
      checkListener(listener);
      this.prependListener(type, _onceWrap(this, type, listener));
      return this;
    };

// Emits a 'removeListener' event if and only if the listener was removed.
EventEmitter.prototype.removeListener =
    function removeListener(type, listener) {
      var list, events, position, i, originalListener;

      checkListener(listener);

      events = this._events;
      if (events === undefined)
        return this;

      list = events[type];
      if (list === undefined)
        return this;

      if (list === listener || list.listener === listener) {
        if (--this._eventsCount === 0)
          this._events = Object.create(null);
        else {
          delete events[type];
          if (events.removeListener)
            this.emit('removeListener', type, list.listener || listener);
        }
      } else if (typeof list !== 'function') {
        position = -1;

        for (i = list.length - 1; i >= 0; i--) {
          if (list[i] === listener || list[i].listener === listener) {
            originalListener = list[i].listener;
            position = i;
            break;
          }
        }

        if (position < 0)
          return this;

        if (position === 0)
          list.shift();
        else {
          spliceOne(list, position);
        }

        if (list.length === 1)
          events[type] = list[0];

        if (events.removeListener !== undefined)
          this.emit('removeListener', type, originalListener || listener);
      }

      return this;
    };

EventEmitter.prototype.off = EventEmitter.prototype.removeListener;

EventEmitter.prototype.removeAllListeners =
    function removeAllListeners(type) {
      var listeners, events, i;

      events = this._events;
      if (events === undefined)
        return this;

      // not listening for removeListener, no need to emit
      if (events.removeListener === undefined) {
        if (arguments.length === 0) {
          this._events = Object.create(null);
          this._eventsCount = 0;
        } else if (events[type] !== undefined) {
          if (--this._eventsCount === 0)
            this._events = Object.create(null);
          else
            delete events[type];
        }
        return this;
      }

      // emit removeListener for all listeners on all events
      if (arguments.length === 0) {
        var keys = Object.keys(events);
        var key;
        for (i = 0; i < keys.length; ++i) {
          key = keys[i];
          if (key === 'removeListener') continue;
          this.removeAllListeners(key);
        }
        this.removeAllListeners('removeListener');
        this._events = Object.create(null);
        this._eventsCount = 0;
        return this;
      }

      listeners = events[type];

      if (typeof listeners === 'function') {
        this.removeListener(type, listeners);
      } else if (listeners !== undefined) {
        // LIFO order
        for (i = listeners.length - 1; i >= 0; i--) {
          this.removeListener(type, listeners[i]);
        }
      }

      return this;
    };

function _listeners(target, type, unwrap) {
  var events = target._events;

  if (events === undefined)
    return [];

  var evlistener = events[type];
  if (evlistener === undefined)
    return [];

  if (typeof evlistener === 'function')
    return unwrap ? [evlistener.listener || evlistener] : [evlistener];

  return unwrap ?
    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
}

EventEmitter.prototype.listeners = function listeners(type) {
  return _listeners(this, type, true);
};

EventEmitter.prototype.rawListeners = function rawListeners(type) {
  return _listeners(this, type, false);
};

EventEmitter.listenerCount = function(emitter, type) {
  if (typeof emitter.listenerCount === 'function') {
    return emitter.listenerCount(type);
  } else {
    return listenerCount.call(emitter, type);
  }
};

EventEmitter.prototype.listenerCount = listenerCount;
function listenerCount(type) {
  var events = this._events;

  if (events !== undefined) {
    var evlistener = events[type];

    if (typeof evlistener === 'function') {
      return 1;
    } else if (evlistener !== undefined) {
      return evlistener.length;
    }
  }

  return 0;
}

EventEmitter.prototype.eventNames = function eventNames() {
  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
};

function arrayClone(arr, n) {
  var copy = new Array(n);
  for (var i = 0; i < n; ++i)
    copy[i] = arr[i];
  return copy;
}

function spliceOne(list, index) {
  for (; index + 1 < list.length; index++)
    list[index] = list[index + 1];
  list.pop();
}

function unwrapListeners(arr) {
  var ret = new Array(arr.length);
  for (var i = 0; i < ret.length; ++i) {
    ret[i] = arr[i].listener || arr[i];
  }
  return ret;
}

function once(emitter, name) {
  return new Promise(function (resolve, reject) {
    function errorListener(err) {
      emitter.removeListener(name, resolver);
      reject(err);
    }

    function resolver() {
      if (typeof emitter.removeListener === 'function') {
        emitter.removeListener('error', errorListener);
      }
      resolve([].slice.call(arguments));
    };

    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
    if (name !== 'error') {
      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
    }
  });
}

function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
  if (typeof emitter.on === 'function') {
    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
  }
}

function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
  if (typeof emitter.on === 'function') {
    if (flags.once) {
      emitter.once(name, listener);
    } else {
      emitter.on(name, listener);
    }
  } else if (typeof emitter.addEventListener === 'function') {
    // EventTarget does not have `error` event semantics like Node
    // EventEmitters, we do not listen for `error` events here.
    emitter.addEventListener(name, function wrapListener(arg) {
      // IE does not have builtin `{ once: true }` support so we
      // have to do it manually.
      if (flags.once) {
        emitter.removeEventListener(name, wrapListener);
      }
      listener(arg);
    });
  } else {
    throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
  }
}

},{}],189:[function(require,module,exports){
var Buffer = require('safe-buffer').Buffer
var MD5 = require('md5.js')

/* eslint-disable camelcase */
function EVP_BytesToKey (password, salt, keyBits, ivLen) {
  if (!Buffer.isBuffer(password)) password = Buffer.from(password, 'binary')
  if (salt) {
    if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, 'binary')
    if (salt.length !== 8) throw new RangeError('salt should be Buffer with 8 byte length')
  }

  var keyLen = keyBits / 8
  var key = Buffer.alloc(keyLen)
  var iv = Buffer.alloc(ivLen || 0)
  var tmp = Buffer.alloc(0)

  while (keyLen > 0 || ivLen > 0) {
    var hash = new MD5()
    hash.update(tmp)
    hash.update(password)
    if (salt) hash.update(salt)
    tmp = hash.digest()

    var used = 0

    if (keyLen > 0) {
      var keyStart = key.length - keyLen
      used = Math.min(keyLen, tmp.length)
      tmp.copy(key, keyStart, 0, used)
      keyLen -= used
    }

    if (used < tmp.length && ivLen > 0) {
      var ivStart = iv.length - ivLen
      var length = Math.min(ivLen, tmp.length - used)
      tmp.copy(iv, ivStart, used, used + length)
      ivLen -= length
    }
  }

  tmp.fill(0)
  return { key: key, iv: iv }
}

module.exports = EVP_BytesToKey

},{"md5.js":232,"safe-buffer":513}],190:[function(require,module,exports){
'use strict';

var isCallable = require('is-callable');

var toStr = Object.prototype.toString;
var hasOwnProperty = Object.prototype.hasOwnProperty;

/** @type {<This, A extends readonly unknown[]>(arr: A, iterator: (this: This | void, value: A[number], index: number, arr: A) => void, receiver: This | undefined) => void} */
var forEachArray = function forEachArray(array, iterator, receiver) {
    for (var i = 0, len = array.length; i < len; i++) {
        if (hasOwnProperty.call(array, i)) {
            if (receiver == null) {
                iterator(array[i], i, array);
            } else {
                iterator.call(receiver, array[i], i, array);
            }
        }
    }
};

/** @type {<This, S extends string>(string: S, iterator: (this: This | void, value: S[number], index: number, string: S) => void, receiver: This | undefined) => void} */
var forEachString = function forEachString(string, iterator, receiver) {
    for (var i = 0, len = string.length; i < len; i++) {
        // no such thing as a sparse string.
        if (receiver == null) {
            iterator(string.charAt(i), i, string);
        } else {
            iterator.call(receiver, string.charAt(i), i, string);
        }
    }
};

/** @type {<This, O>(obj: O, iterator: (this: This | void, value: O[keyof O], index: keyof O, obj: O) => void, receiver: This | undefined) => void} */
var forEachObject = function forEachObject(object, iterator, receiver) {
    for (var k in object) {
        if (hasOwnProperty.call(object, k)) {
            if (receiver == null) {
                iterator(object[k], k, object);
            } else {
                iterator.call(receiver, object[k], k, object);
            }
        }
    }
};

/** @type {(x: unknown) => x is readonly unknown[]} */
function isArray(x) {
    return toStr.call(x) === '[object Array]';
}

/** @type {import('.')._internal} */
module.exports = function forEach(list, iterator, thisArg) {
    if (!isCallable(iterator)) {
        throw new TypeError('iterator must be a function');
    }

    var receiver;
    if (arguments.length >= 3) {
        receiver = thisArg;
    }

    if (isArray(list)) {
        forEachArray(list, iterator, receiver);
    } else if (typeof list === 'string') {
        forEachString(list, iterator, receiver);
    } else {
        forEachObject(list, iterator, receiver);
    }
};

},{"is-callable":221}],191:[function(require,module,exports){
'use strict';

/* eslint no-invalid-this: 1 */

var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var toStr = Object.prototype.toString;
var max = Math.max;
var funcType = '[object Function]';

var concatty = function concatty(a, b) {
    var arr = [];

    for (var i = 0; i < a.length; i += 1) {
        arr[i] = a[i];
    }
    for (var j = 0; j < b.length; j += 1) {
        arr[j + a.length] = b[j];
    }

    return arr;
};

var slicy = function slicy(arrLike, offset) {
    var arr = [];
    for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {
        arr[j] = arrLike[i];
    }
    return arr;
};

var joiny = function (arr, joiner) {
    var str = '';
    for (var i = 0; i < arr.length; i += 1) {
        str += arr[i];
        if (i + 1 < arr.length) {
            str += joiner;
        }
    }
    return str;
};

module.exports = function bind(that) {
    var target = this;
    if (typeof target !== 'function' || toStr.apply(target) !== funcType) {
        throw new TypeError(ERROR_MESSAGE + target);
    }
    var args = slicy(arguments, 1);

    var bound;
    var binder = function () {
        if (this instanceof bound) {
            var result = target.apply(
                this,
                concatty(args, arguments)
            );
            if (Object(result) === result) {
                return result;
            }
            return this;
        }
        return target.apply(
            that,
            concatty(args, arguments)
        );

    };

    var boundLength = max(0, target.length - args.length);
    var boundArgs = [];
    for (var i = 0; i < boundLength; i++) {
        boundArgs[i] = '$' + i;
    }

    bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder);

    if (target.prototype) {
        var Empty = function Empty() {};
        Empty.prototype = target.prototype;
        bound.prototype = new Empty();
        Empty.prototype = null;
    }

    return bound;
};

},{}],192:[function(require,module,exports){
'use strict';

var implementation = require('./implementation');

module.exports = Function.prototype.bind || implementation;

},{"./implementation":191}],193:[function(require,module,exports){
'use strict';

var undefined;

var $Object = require('es-object-atoms');

var $Error = require('es-errors');
var $EvalError = require('es-errors/eval');
var $RangeError = require('es-errors/range');
var $ReferenceError = require('es-errors/ref');
var $SyntaxError = require('es-errors/syntax');
var $TypeError = require('es-errors/type');
var $URIError = require('es-errors/uri');

var abs = require('math-intrinsics/abs');
var floor = require('math-intrinsics/floor');
var max = require('math-intrinsics/max');
var min = require('math-intrinsics/min');
var pow = require('math-intrinsics/pow');
var round = require('math-intrinsics/round');
var sign = require('math-intrinsics/sign');

var $Function = Function;

// eslint-disable-next-line consistent-return
var getEvalledConstructor = function (expressionSyntax) {
	try {
		return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
	} catch (e) {}
};

var $gOPD = require('gopd');
var $defineProperty = require('es-define-property');

var throwTypeError = function () {
	throw new $TypeError();
};
var ThrowTypeError = $gOPD
	? (function () {
		try {
			// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
			arguments.callee; // IE 8 does not throw here
			return throwTypeError;
		} catch (calleeThrows) {
			try {
				// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
				return $gOPD(arguments, 'callee').get;
			} catch (gOPDthrows) {
				return throwTypeError;
			}
		}
	}())
	: throwTypeError;

var hasSymbols = require('has-symbols')();

var getProto = require('get-proto');
var $ObjectGPO = require('get-proto/Object.getPrototypeOf');
var $ReflectGPO = require('get-proto/Reflect.getPrototypeOf');

var $apply = require('call-bind-apply-helpers/functionApply');
var $call = require('call-bind-apply-helpers/functionCall');

var needsEval = {};

var TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array);

var INTRINSICS = {
	__proto__: null,
	'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
	'%Array%': Array,
	'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
	'%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined,
	'%AsyncFromSyncIteratorPrototype%': undefined,
	'%AsyncFunction%': needsEval,
	'%AsyncGenerator%': needsEval,
	'%AsyncGeneratorFunction%': needsEval,
	'%AsyncIteratorPrototype%': needsEval,
	'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
	'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
	'%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array,
	'%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array,
	'%Boolean%': Boolean,
	'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
	'%Date%': Date,
	'%decodeURI%': decodeURI,
	'%decodeURIComponent%': decodeURIComponent,
	'%encodeURI%': encodeURI,
	'%encodeURIComponent%': encodeURIComponent,
	'%Error%': $Error,
	'%eval%': eval, // eslint-disable-line no-eval
	'%EvalError%': $EvalError,
	'%Float16Array%': typeof Float16Array === 'undefined' ? undefined : Float16Array,
	'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
	'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
	'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
	'%Function%': $Function,
	'%GeneratorFunction%': needsEval,
	'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
	'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
	'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
	'%isFinite%': isFinite,
	'%isNaN%': isNaN,
	'%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined,
	'%JSON%': typeof JSON === 'object' ? JSON : undefined,
	'%Map%': typeof Map === 'undefined' ? undefined : Map,
	'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()),
	'%Math%': Math,
	'%Number%': Number,
	'%Object%': $Object,
	'%Object.getOwnPropertyDescriptor%': $gOPD,
	'%parseFloat%': parseFloat,
	'%parseInt%': parseInt,
	'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
	'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
	'%RangeError%': $RangeError,
	'%ReferenceError%': $ReferenceError,
	'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
	'%RegExp%': RegExp,
	'%Set%': typeof Set === 'undefined' ? undefined : Set,
	'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()),
	'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
	'%String%': String,
	'%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined,
	'%Symbol%': hasSymbols ? Symbol : undefined,
	'%SyntaxError%': $SyntaxError,
	'%ThrowTypeError%': ThrowTypeError,
	'%TypedArray%': TypedArray,
	'%TypeError%': $TypeError,
	'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
	'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
	'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
	'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
	'%URIError%': $URIError,
	'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
	'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
	'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,

	'%Function.prototype.call%': $call,
	'%Function.prototype.apply%': $apply,
	'%Object.defineProperty%': $defineProperty,
	'%Object.getPrototypeOf%': $ObjectGPO,
	'%Math.abs%': abs,
	'%Math.floor%': floor,
	'%Math.max%': max,
	'%Math.min%': min,
	'%Math.pow%': pow,
	'%Math.round%': round,
	'%Math.sign%': sign,
	'%Reflect.getPrototypeOf%': $ReflectGPO
};

if (getProto) {
	try {
		null.error; // eslint-disable-line no-unused-expressions
	} catch (e) {
		// https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229
		var errorProto = getProto(getProto(e));
		INTRINSICS['%Error.prototype%'] = errorProto;
	}
}

var doEval = function doEval(name) {
	var value;
	if (name === '%AsyncFunction%') {
		value = getEvalledConstructor('async function () {}');
	} else if (name === '%GeneratorFunction%') {
		value = getEvalledConstructor('function* () {}');
	} else if (name === '%AsyncGeneratorFunction%') {
		value = getEvalledConstructor('async function* () {}');
	} else if (name === '%AsyncGenerator%') {
		var fn = doEval('%AsyncGeneratorFunction%');
		if (fn) {
			value = fn.prototype;
		}
	} else if (name === '%AsyncIteratorPrototype%') {
		var gen = doEval('%AsyncGenerator%');
		if (gen && getProto) {
			value = getProto(gen.prototype);
		}
	}

	INTRINSICS[name] = value;

	return value;
};

var LEGACY_ALIASES = {
	__proto__: null,
	'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
	'%ArrayPrototype%': ['Array', 'prototype'],
	'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
	'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
	'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
	'%ArrayProto_values%': ['Array', 'prototype', 'values'],
	'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
	'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
	'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
	'%BooleanPrototype%': ['Boolean', 'prototype'],
	'%DataViewPrototype%': ['DataView', 'prototype'],
	'%DatePrototype%': ['Date', 'prototype'],
	'%ErrorPrototype%': ['Error', 'prototype'],
	'%EvalErrorPrototype%': ['EvalError', 'prototype'],
	'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
	'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
	'%FunctionPrototype%': ['Function', 'prototype'],
	'%Generator%': ['GeneratorFunction', 'prototype'],
	'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
	'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
	'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
	'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
	'%JSONParse%': ['JSON', 'parse'],
	'%JSONStringify%': ['JSON', 'stringify'],
	'%MapPrototype%': ['Map', 'prototype'],
	'%NumberPrototype%': ['Number', 'prototype'],
	'%ObjectPrototype%': ['Object', 'prototype'],
	'%ObjProto_toString%': ['Object', 'prototype', 'toString'],
	'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
	'%PromisePrototype%': ['Promise', 'prototype'],
	'%PromiseProto_then%': ['Promise', 'prototype', 'then'],
	'%Promise_all%': ['Promise', 'all'],
	'%Promise_reject%': ['Promise', 'reject'],
	'%Promise_resolve%': ['Promise', 'resolve'],
	'%RangeErrorPrototype%': ['RangeError', 'prototype'],
	'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
	'%RegExpPrototype%': ['RegExp', 'prototype'],
	'%SetPrototype%': ['Set', 'prototype'],
	'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
	'%StringPrototype%': ['String', 'prototype'],
	'%SymbolPrototype%': ['Symbol', 'prototype'],
	'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
	'%TypedArrayPrototype%': ['TypedArray', 'prototype'],
	'%TypeErrorPrototype%': ['TypeError', 'prototype'],
	'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
	'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
	'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
	'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
	'%URIErrorPrototype%': ['URIError', 'prototype'],
	'%WeakMapPrototype%': ['WeakMap', 'prototype'],
	'%WeakSetPrototype%': ['WeakSet', 'prototype']
};

var bind = require('function-bind');
var hasOwn = require('hasown');
var $concat = bind.call($call, Array.prototype.concat);
var $spliceApply = bind.call($apply, Array.prototype.splice);
var $replace = bind.call($call, String.prototype.replace);
var $strSlice = bind.call($call, String.prototype.slice);
var $exec = bind.call($call, RegExp.prototype.exec);

/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
var stringToPath = function stringToPath(string) {
	var first = $strSlice(string, 0, 1);
	var last = $strSlice(string, -1);
	if (first === '%' && last !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`');
	} else if (last === '%' && first !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`');
	}
	var result = [];
	$replace(string, rePropName, function (match, number, quote, subString) {
		result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
	});
	return result;
};
/* end adaptation */

var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
	var intrinsicName = name;
	var alias;
	if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
		alias = LEGACY_ALIASES[intrinsicName];
		intrinsicName = '%' + alias[0] + '%';
	}

	if (hasOwn(INTRINSICS, intrinsicName)) {
		var value = INTRINSICS[intrinsicName];
		if (value === needsEval) {
			value = doEval(intrinsicName);
		}
		if (typeof value === 'undefined' && !allowMissing) {
			throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
		}

		return {
			alias: alias,
			name: intrinsicName,
			value: value
		};
	}

	throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
};

module.exports = function GetIntrinsic(name, allowMissing) {
	if (typeof name !== 'string' || name.length === 0) {
		throw new $TypeError('intrinsic name must be a non-empty string');
	}
	if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
		throw new $TypeError('"allowMissing" argument must be a boolean');
	}

	if ($exec(/^%?[^%]*%?$/, name) === null) {
		throw new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name');
	}
	var parts = stringToPath(name);
	var intrinsicBaseName = parts.length > 0 ? parts[0] : '';

	var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
	var intrinsicRealName = intrinsic.name;
	var value = intrinsic.value;
	var skipFurtherCaching = false;

	var alias = intrinsic.alias;
	if (alias) {
		intrinsicBaseName = alias[0];
		$spliceApply(parts, $concat([0, 1], alias));
	}

	for (var i = 1, isOwn = true; i < parts.length; i += 1) {
		var part = parts[i];
		var first = $strSlice(part, 0, 1);
		var last = $strSlice(part, -1);
		if (
			(
				(first === '"' || first === "'" || first === '`')
				|| (last === '"' || last === "'" || last === '`')
			)
			&& first !== last
		) {
			throw new $SyntaxError('property names with quotes must have matching quotes');
		}
		if (part === 'constructor' || !isOwn) {
			skipFurtherCaching = true;
		}

		intrinsicBaseName += '.' + part;
		intrinsicRealName = '%' + intrinsicBaseName + '%';

		if (hasOwn(INTRINSICS, intrinsicRealName)) {
			value = INTRINSICS[intrinsicRealName];
		} else if (value != null) {
			if (!(part in value)) {
				if (!allowMissing) {
					throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
				}
				return void undefined;
			}
			if ($gOPD && (i + 1) >= parts.length) {
				var desc = $gOPD(value, part);
				isOwn = !!desc;

				// By convention, when a data property is converted to an accessor
				// property to emulate a data property that does not suffer from
				// the override mistake, that accessor's getter is marked with
				// an `originalValue` property. Here, when we detect this, we
				// uphold the illusion by pretending to see that original data
				// property, i.e., returning the value rather than the getter
				// itself.
				if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
					value = desc.get;
				} else {
					value = value[part];
				}
			} else {
				isOwn = hasOwn(value, part);
				value = value[part];
			}

			if (isOwn && !skipFurtherCaching) {
				INTRINSICS[intrinsicRealName] = value;
			}
		}
	}
	return value;
};

},{"call-bind-apply-helpers/functionApply":86,"call-bind-apply-helpers/functionCall":87,"es-define-property":179,"es-errors":181,"es-errors/eval":180,"es-errors/range":182,"es-errors/ref":183,"es-errors/syntax":184,"es-errors/type":185,"es-errors/uri":186,"es-object-atoms":187,"function-bind":192,"get-proto":196,"get-proto/Object.getPrototypeOf":194,"get-proto/Reflect.getPrototypeOf":195,"gopd":198,"has-symbols":200,"hasown":216,"math-intrinsics/abs":224,"math-intrinsics/floor":225,"math-intrinsics/max":227,"math-intrinsics/min":228,"math-intrinsics/pow":229,"math-intrinsics/round":230,"math-intrinsics/sign":231}],194:[function(require,module,exports){
'use strict';

var $Object = require('es-object-atoms');

/** @type {import('./Object.getPrototypeOf')} */
module.exports = $Object.getPrototypeOf || null;

},{"es-object-atoms":187}],195:[function(require,module,exports){
'use strict';

/** @type {import('./Reflect.getPrototypeOf')} */
module.exports = (typeof Reflect !== 'undefined' && Reflect.getPrototypeOf) || null;

},{}],196:[function(require,module,exports){
'use strict';

var reflectGetProto = require('./Reflect.getPrototypeOf');
var originalGetProto = require('./Object.getPrototypeOf');

var getDunderProto = require('dunder-proto/get');

/** @type {import('.')} */
module.exports = reflectGetProto
	? function getProto(O) {
		// @ts-expect-error TS can't narrow inside a closure, for some reason
		return reflectGetProto(O);
	}
	: originalGetProto
		? function getProto(O) {
			if (!O || (typeof O !== 'object' && typeof O !== 'function')) {
				throw new TypeError('getProto: not an object');
			}
			// @ts-expect-error TS can't narrow inside a closure, for some reason
			return originalGetProto(O);
		}
		: getDunderProto
			? function getProto(O) {
				// @ts-expect-error TS can't narrow inside a closure, for some reason
				return getDunderProto(O);
			}
			: null;

},{"./Object.getPrototypeOf":194,"./Reflect.getPrototypeOf":195,"dunder-proto/get":161}],197:[function(require,module,exports){
'use strict';

/** @type {import('./gOPD')} */
module.exports = Object.getOwnPropertyDescriptor;

},{}],198:[function(require,module,exports){
'use strict';

/** @type {import('.')} */
var $gOPD = require('./gOPD');

if ($gOPD) {
	try {
		$gOPD([], 'length');
	} catch (e) {
		// IE 8 has a broken gOPD
		$gOPD = null;
	}
}

module.exports = $gOPD;

},{"./gOPD":197}],199:[function(require,module,exports){
'use strict';

var $defineProperty = require('es-define-property');

var hasPropertyDescriptors = function hasPropertyDescriptors() {
	return !!$defineProperty;
};

hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() {
	// node v0.6 has a bug where array lengths can be Set but not Defined
	if (!$defineProperty) {
		return null;
	}
	try {
		return $defineProperty([], 'length', { value: 1 }).length !== 1;
	} catch (e) {
		// In Firefox 4-22, defining length on an array throws an exception.
		return true;
	}
};

module.exports = hasPropertyDescriptors;

},{"es-define-property":179}],200:[function(require,module,exports){
'use strict';

var origSymbol = typeof Symbol !== 'undefined' && Symbol;
var hasSymbolSham = require('./shams');

/** @type {import('.')} */
module.exports = function hasNativeSymbols() {
	if (typeof origSymbol !== 'function') { return false; }
	if (typeof Symbol !== 'function') { return false; }
	if (typeof origSymbol('foo') !== 'symbol') { return false; }
	if (typeof Symbol('bar') !== 'symbol') { return false; }

	return hasSymbolSham();
};

},{"./shams":201}],201:[function(require,module,exports){
'use strict';

/** @type {import('./shams')} */
/* eslint complexity: [2, 18], max-statements: [2, 33] */
module.exports = function hasSymbols() {
	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
	if (typeof Symbol.iterator === 'symbol') { return true; }

	/** @type {{ [k in symbol]?: unknown }} */
	var obj = {};
	var sym = Symbol('test');
	var symObj = Object(sym);
	if (typeof sym === 'string') { return false; }

	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }

	// temp disabled per https://github.com/ljharb/object.assign/issues/17
	// if (sym instanceof Symbol) { return false; }
	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
	// if (!(symObj instanceof Symbol)) { return false; }

	// if (typeof Symbol.prototype.toString !== 'function') { return false; }
	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }

	var symVal = 42;
	obj[sym] = symVal;
	for (var _ in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }

	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }

	var syms = Object.getOwnPropertySymbols(obj);
	if (syms.length !== 1 || syms[0] !== sym) { return false; }

	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }

	if (typeof Object.getOwnPropertyDescriptor === 'function') {
		// eslint-disable-next-line no-extra-parens
		var descriptor = /** @type {PropertyDescriptor} */ (Object.getOwnPropertyDescriptor(obj, sym));
		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
	}

	return true;
};

},{}],202:[function(require,module,exports){
'use strict';

var hasSymbols = require('has-symbols/shams');

/** @type {import('.')} */
module.exports = function hasToStringTagShams() {
	return hasSymbols() && !!Symbol.toStringTag;
};

},{"has-symbols/shams":201}],203:[function(require,module,exports){
'use strict'
var Buffer = require('safe-buffer').Buffer
var Transform = require('stream').Transform
var inherits = require('inherits')

function throwIfNotStringOrBuffer (val, prefix) {
  if (!Buffer.isBuffer(val) && typeof val !== 'string') {
    throw new TypeError(prefix + ' must be a string or a buffer')
  }
}

function HashBase (blockSize) {
  Transform.call(this)

  this._block = Buffer.allocUnsafe(blockSize)
  this._blockSize = blockSize
  this._blockOffset = 0
  this._length = [0, 0, 0, 0]

  this._finalized = false
}

inherits(HashBase, Transform)

HashBase.prototype._transform = function (chunk, encoding, callback) {
  var error = null
  try {
    this.update(chunk, encoding)
  } catch (err) {
    error = err
  }

  callback(error)
}

HashBase.prototype._flush = function (callback) {
  var error = null
  try {
    this.push(this.digest())
  } catch (err) {
    error = err
  }

  callback(error)
}

HashBase.prototype.update = function (data, encoding) {
  throwIfNotStringOrBuffer(data, 'Data')
  if (this._finalized) throw new Error('Digest already called')
  if (!Buffer.isBuffer(data)) data = Buffer.from(data, encoding)

  // consume data
  var block = this._block
  var offset = 0
  while (this._blockOffset + data.length - offset >= this._blockSize) {
    for (var i = this._blockOffset; i < this._blockSize;) block[i++] = data[offset++]
    this._update()
    this._blockOffset = 0
  }
  while (offset < data.length) block[this._blockOffset++] = data[offset++]

  // update length
  for (var j = 0, carry = data.length * 8; carry > 0; ++j) {
    this._length[j] += carry
    carry = (this._length[j] / 0x0100000000) | 0
    if (carry > 0) this._length[j] -= 0x0100000000 * carry
  }

  return this
}

HashBase.prototype._update = function () {
  throw new Error('_update is not implemented')
}

HashBase.prototype.digest = function (encoding) {
  if (this._finalized) throw new Error('Digest already called')
  this._finalized = true

  var digest = this._digest()
  if (encoding !== undefined) digest = digest.toString(encoding)

  // reset state
  this._block.fill(0)
  this._blockOffset = 0
  for (var i = 0; i < 4; ++i) this._length[i] = 0

  return digest
}

HashBase.prototype._digest = function () {
  throw new Error('_digest is not implemented')
}

module.exports = HashBase

},{"inherits":219,"safe-buffer":513,"stream":523}],204:[function(require,module,exports){
var hash = exports;

hash.utils = require('./hash/utils');
hash.common = require('./hash/common');
hash.sha = require('./hash/sha');
hash.ripemd = require('./hash/ripemd');
hash.hmac = require('./hash/hmac');

// Proxy hash functions to the main object
hash.sha1 = hash.sha.sha1;
hash.sha256 = hash.sha.sha256;
hash.sha224 = hash.sha.sha224;
hash.sha384 = hash.sha.sha384;
hash.sha512 = hash.sha.sha512;
hash.ripemd160 = hash.ripemd.ripemd160;

},{"./hash/common":205,"./hash/hmac":206,"./hash/ripemd":207,"./hash/sha":208,"./hash/utils":215}],205:[function(require,module,exports){
'use strict';

var utils = require('./utils');
var assert = require('minimalistic-assert');

function BlockHash() {
  this.pending = null;
  this.pendingTotal = 0;
  this.blockSize = this.constructor.blockSize;
  this.outSize = this.constructor.outSize;
  this.hmacStrength = this.constructor.hmacStrength;
  this.padLength = this.constructor.padLength / 8;
  this.endian = 'big';

  this._delta8 = this.blockSize / 8;
  this._delta32 = this.blockSize / 32;
}
exports.BlockHash = BlockHash;

BlockHash.prototype.update = function update(msg, enc) {
  // Convert message to array, pad it, and join into 32bit blocks
  msg = utils.toArray(msg, enc);
  if (!this.pending)
    this.pending = msg;
  else
    this.pending = this.pending.concat(msg);
  this.pendingTotal += msg.length;

  // Enough data, try updating
  if (this.pending.length >= this._delta8) {
    msg = this.pending;

    // Process pending data in blocks
    var r = msg.length % this._delta8;
    this.pending = msg.slice(msg.length - r, msg.length);
    if (this.pending.length === 0)
      this.pending = null;

    msg = utils.join32(msg, 0, msg.length - r, this.endian);
    for (var i = 0; i < msg.length; i += this._delta32)
      this._update(msg, i, i + this._delta32);
  }

  return this;
};

BlockHash.prototype.digest = function digest(enc) {
  this.update(this._pad());
  assert(this.pending === null);

  return this._digest(enc);
};

BlockHash.prototype._pad = function pad() {
  var len = this.pendingTotal;
  var bytes = this._delta8;
  var k = bytes - ((len + this.padLength) % bytes);
  var res = new Array(k + this.padLength);
  res[0] = 0x80;
  for (var i = 1; i < k; i++)
    res[i] = 0;

  // Append length
  len <<= 3;
  if (this.endian === 'big') {
    for (var t = 8; t < this.padLength; t++)
      res[i++] = 0;

    res[i++] = 0;
    res[i++] = 0;
    res[i++] = 0;
    res[i++] = 0;
    res[i++] = (len >>> 24) & 0xff;
    res[i++] = (len >>> 16) & 0xff;
    res[i++] = (len >>> 8) & 0xff;
    res[i++] = len & 0xff;
  } else {
    res[i++] = len & 0xff;
    res[i++] = (len >>> 8) & 0xff;
    res[i++] = (len >>> 16) & 0xff;
    res[i++] = (len >>> 24) & 0xff;
    res[i++] = 0;
    res[i++] = 0;
    res[i++] = 0;
    res[i++] = 0;

    for (t = 8; t < this.padLength; t++)
      res[i++] = 0;
  }

  return res;
};

},{"./utils":215,"minimalistic-assert":235}],206:[function(require,module,exports){
'use strict';

var utils = require('./utils');
var assert = require('minimalistic-assert');

function Hmac(hash, key, enc) {
  if (!(this instanceof Hmac))
    return new Hmac(hash, key, enc);
  this.Hash = hash;
  this.blockSize = hash.blockSize / 8;
  this.outSize = hash.outSize / 8;
  this.inner = null;
  this.outer = null;

  this._init(utils.toArray(key, enc));
}
module.exports = Hmac;

Hmac.prototype._init = function init(key) {
  // Shorten key, if needed
  if (key.length > this.blockSize)
    key = new this.Hash().update(key).digest();
  assert(key.length <= this.blockSize);

  // Add padding to key
  for (var i = key.length; i < this.blockSize; i++)
    key.push(0);

  for (i = 0; i < key.length; i++)
    key[i] ^= 0x36;
  this.inner = new this.Hash().update(key);

  // 0x36 ^ 0x5c = 0x6a
  for (i = 0; i < key.length; i++)
    key[i] ^= 0x6a;
  this.outer = new this.Hash().update(key);
};

Hmac.prototype.update = function update(msg, enc) {
  this.inner.update(msg, enc);
  return this;
};

Hmac.prototype.digest = function digest(enc) {
  this.outer.update(this.inner.digest());
  return this.outer.digest(enc);
};

},{"./utils":215,"minimalistic-assert":235}],207:[function(require,module,exports){
'use strict';

var utils = require('./utils');
var common = require('./common');

var rotl32 = utils.rotl32;
var sum32 = utils.sum32;
var sum32_3 = utils.sum32_3;
var sum32_4 = utils.sum32_4;
var BlockHash = common.BlockHash;

function RIPEMD160() {
  if (!(this instanceof RIPEMD160))
    return new RIPEMD160();

  BlockHash.call(this);

  this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ];
  this.endian = 'little';
}
utils.inherits(RIPEMD160, BlockHash);
exports.ripemd160 = RIPEMD160;

RIPEMD160.blockSize = 512;
RIPEMD160.outSize = 160;
RIPEMD160.hmacStrength = 192;
RIPEMD160.padLength = 64;

RIPEMD160.prototype._update = function update(msg, start) {
  var A = this.h[0];
  var B = this.h[1];
  var C = this.h[2];
  var D = this.h[3];
  var E = this.h[4];
  var Ah = A;
  var Bh = B;
  var Ch = C;
  var Dh = D;
  var Eh = E;
  for (var j = 0; j < 80; j++) {
    var T = sum32(
      rotl32(
        sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)),
        s[j]),
      E);
    A = E;
    E = D;
    D = rotl32(C, 10);
    C = B;
    B = T;
    T = sum32(
      rotl32(
        sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)),
        sh[j]),
      Eh);
    Ah = Eh;
    Eh = Dh;
    Dh = rotl32(Ch, 10);
    Ch = Bh;
    Bh = T;
  }
  T = sum32_3(this.h[1], C, Dh);
  this.h[1] = sum32_3(this.h[2], D, Eh);
  this.h[2] = sum32_3(this.h[3], E, Ah);
  this.h[3] = sum32_3(this.h[4], A, Bh);
  this.h[4] = sum32_3(this.h[0], B, Ch);
  this.h[0] = T;
};

RIPEMD160.prototype._digest = function digest(enc) {
  if (enc === 'hex')
    return utils.toHex32(this.h, 'little');
  else
    return utils.split32(this.h, 'little');
};

function f(j, x, y, z) {
  if (j <= 15)
    return x ^ y ^ z;
  else if (j <= 31)
    return (x & y) | ((~x) & z);
  else if (j <= 47)
    return (x | (~y)) ^ z;
  else if (j <= 63)
    return (x & z) | (y & (~z));
  else
    return x ^ (y | (~z));
}

function K(j) {
  if (j <= 15)
    return 0x00000000;
  else if (j <= 31)
    return 0x5a827999;
  else if (j <= 47)
    return 0x6ed9eba1;
  else if (j <= 63)
    return 0x8f1bbcdc;
  else
    return 0xa953fd4e;
}

function Kh(j) {
  if (j <= 15)
    return 0x50a28be6;
  else if (j <= 31)
    return 0x5c4dd124;
  else if (j <= 47)
    return 0x6d703ef3;
  else if (j <= 63)
    return 0x7a6d76e9;
  else
    return 0x00000000;
}

var r = [
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
  3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
  1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
  4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
];

var rh = [
  5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
  6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
  15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
  8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
  12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
];

var s = [
  11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
  7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
  11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
  11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
  9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
];

var sh = [
  8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
  9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
  9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
  15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
  8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
];

},{"./common":205,"./utils":215}],208:[function(require,module,exports){
'use strict';

exports.sha1 = require('./sha/1');
exports.sha224 = require('./sha/224');
exports.sha256 = require('./sha/256');
exports.sha384 = require('./sha/384');
exports.sha512 = require('./sha/512');

},{"./sha/1":209,"./sha/224":210,"./sha/256":211,"./sha/384":212,"./sha/512":213}],209:[function(require,module,exports){
'use strict';

var utils = require('../utils');
var common = require('../common');
var shaCommon = require('./common');

var rotl32 = utils.rotl32;
var sum32 = utils.sum32;
var sum32_5 = utils.sum32_5;
var ft_1 = shaCommon.ft_1;
var BlockHash = common.BlockHash;

var sha1_K = [
  0x5A827999, 0x6ED9EBA1,
  0x8F1BBCDC, 0xCA62C1D6
];

function SHA1() {
  if (!(this instanceof SHA1))
    return new SHA1();

  BlockHash.call(this);
  this.h = [
    0x67452301, 0xefcdab89, 0x98badcfe,
    0x10325476, 0xc3d2e1f0 ];
  this.W = new Array(80);
}

utils.inherits(SHA1, BlockHash);
module.exports = SHA1;

SHA1.blockSize = 512;
SHA1.outSize = 160;
SHA1.hmacStrength = 80;
SHA1.padLength = 64;

SHA1.prototype._update = function _update(msg, start) {
  var W = this.W;

  for (var i = 0; i < 16; i++)
    W[i] = msg[start + i];

  for(; i < W.length; i++)
    W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);

  var a = this.h[0];
  var b = this.h[1];
  var c = this.h[2];
  var d = this.h[3];
  var e = this.h[4];

  for (i = 0; i < W.length; i++) {
    var s = ~~(i / 20);
    var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);
    e = d;
    d = c;
    c = rotl32(b, 30);
    b = a;
    a = t;
  }

  this.h[0] = sum32(this.h[0], a);
  this.h[1] = sum32(this.h[1], b);
  this.h[2] = sum32(this.h[2], c);
  this.h[3] = sum32(this.h[3], d);
  this.h[4] = sum32(this.h[4], e);
};

SHA1.prototype._digest = function digest(enc) {
  if (enc === 'hex')
    return utils.toHex32(this.h, 'big');
  else
    return utils.split32(this.h, 'big');
};

},{"../common":205,"../utils":215,"./common":214}],210:[function(require,module,exports){
'use strict';

var utils = require('../utils');
var SHA256 = require('./256');

function SHA224() {
  if (!(this instanceof SHA224))
    return new SHA224();

  SHA256.call(this);
  this.h = [
    0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
    0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ];
}
utils.inherits(SHA224, SHA256);
module.exports = SHA224;

SHA224.blockSize = 512;
SHA224.outSize = 224;
SHA224.hmacStrength = 192;
SHA224.padLength = 64;

SHA224.prototype._digest = function digest(enc) {
  // Just truncate output
  if (enc === 'hex')
    return utils.toHex32(this.h.slice(0, 7), 'big');
  else
    return utils.split32(this.h.slice(0, 7), 'big');
};


},{"../utils":215,"./256":211}],211:[function(require,module,exports){
'use strict';

var utils = require('../utils');
var common = require('../common');
var shaCommon = require('./common');
var assert = require('minimalistic-assert');

var sum32 = utils.sum32;
var sum32_4 = utils.sum32_4;
var sum32_5 = utils.sum32_5;
var ch32 = shaCommon.ch32;
var maj32 = shaCommon.maj32;
var s0_256 = shaCommon.s0_256;
var s1_256 = shaCommon.s1_256;
var g0_256 = shaCommon.g0_256;
var g1_256 = shaCommon.g1_256;

var BlockHash = common.BlockHash;

var sha256_K = [
  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
  0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
  0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
  0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
  0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
  0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
  0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
  0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
  0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
];

function SHA256() {
  if (!(this instanceof SHA256))
    return new SHA256();

  BlockHash.call(this);
  this.h = [
    0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
    0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
  ];
  this.k = sha256_K;
  this.W = new Array(64);
}
utils.inherits(SHA256, BlockHash);
module.exports = SHA256;

SHA256.blockSize = 512;
SHA256.outSize = 256;
SHA256.hmacStrength = 192;
SHA256.padLength = 64;

SHA256.prototype._update = function _update(msg, start) {
  var W = this.W;

  for (var i = 0; i < 16; i++)
    W[i] = msg[start + i];
  for (; i < W.length; i++)
    W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);

  var a = this.h[0];
  var b = this.h[1];
  var c = this.h[2];
  var d = this.h[3];
  var e = this.h[4];
  var f = this.h[5];
  var g = this.h[6];
  var h = this.h[7];

  assert(this.k.length === W.length);
  for (i = 0; i < W.length; i++) {
    var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);
    var T2 = sum32(s0_256(a), maj32(a, b, c));
    h = g;
    g = f;
    f = e;
    e = sum32(d, T1);
    d = c;
    c = b;
    b = a;
    a = sum32(T1, T2);
  }

  this.h[0] = sum32(this.h[0], a);
  this.h[1] = sum32(this.h[1], b);
  this.h[2] = sum32(this.h[2], c);
  this.h[3] = sum32(this.h[3], d);
  this.h[4] = sum32(this.h[4], e);
  this.h[5] = sum32(this.h[5], f);
  this.h[6] = sum32(this.h[6], g);
  this.h[7] = sum32(this.h[7], h);
};

SHA256.prototype._digest = function digest(enc) {
  if (enc === 'hex')
    return utils.toHex32(this.h, 'big');
  else
    return utils.split32(this.h, 'big');
};

},{"../common":205,"../utils":215,"./common":214,"minimalistic-assert":235}],212:[function(require,module,exports){
'use strict';

var utils = require('../utils');

var SHA512 = require('./512');

function SHA384() {
  if (!(this instanceof SHA384))
    return new SHA384();

  SHA512.call(this);
  this.h = [
    0xcbbb9d5d, 0xc1059ed8,
    0x629a292a, 0x367cd507,
    0x9159015a, 0x3070dd17,
    0x152fecd8, 0xf70e5939,
    0x67332667, 0xffc00b31,
    0x8eb44a87, 0x68581511,
    0xdb0c2e0d, 0x64f98fa7,
    0x47b5481d, 0xbefa4fa4 ];
}
utils.inherits(SHA384, SHA512);
module.exports = SHA384;

SHA384.blockSize = 1024;
SHA384.outSize = 384;
SHA384.hmacStrength = 192;
SHA384.padLength = 128;

SHA384.prototype._digest = function digest(enc) {
  if (enc === 'hex')
    return utils.toHex32(this.h.slice(0, 12), 'big');
  else
    return utils.split32(this.h.slice(0, 12), 'big');
};

},{"../utils":215,"./512":213}],213:[function(require,module,exports){
'use strict';

var utils = require('../utils');
var common = require('../common');
var assert = require('minimalistic-assert');

var rotr64_hi = utils.rotr64_hi;
var rotr64_lo = utils.rotr64_lo;
var shr64_hi = utils.shr64_hi;
var shr64_lo = utils.shr64_lo;
var sum64 = utils.sum64;
var sum64_hi = utils.sum64_hi;
var sum64_lo = utils.sum64_lo;
var sum64_4_hi = utils.sum64_4_hi;
var sum64_4_lo = utils.sum64_4_lo;
var sum64_5_hi = utils.sum64_5_hi;
var sum64_5_lo = utils.sum64_5_lo;

var BlockHash = common.BlockHash;

var sha512_K = [
  0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,
  0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,
  0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,
  0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,
  0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,
  0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,
  0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,
  0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,
  0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,
  0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,
  0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,
  0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,
  0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,
  0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,
  0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,
  0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,
  0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,
  0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,
  0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,
  0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,
  0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,
  0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,
  0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,
  0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,
  0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,
  0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,
  0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,
  0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,
  0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,
  0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,
  0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,
  0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,
  0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,
  0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,
  0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,
  0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,
  0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,
  0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,
  0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,
  0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817
];

function SHA512() {
  if (!(this instanceof SHA512))
    return new SHA512();

  BlockHash.call(this);
  this.h = [
    0x6a09e667, 0xf3bcc908,
    0xbb67ae85, 0x84caa73b,
    0x3c6ef372, 0xfe94f82b,
    0xa54ff53a, 0x5f1d36f1,
    0x510e527f, 0xade682d1,
    0x9b05688c, 0x2b3e6c1f,
    0x1f83d9ab, 0xfb41bd6b,
    0x5be0cd19, 0x137e2179 ];
  this.k = sha512_K;
  this.W = new Array(160);
}
utils.inherits(SHA512, BlockHash);
module.exports = SHA512;

SHA512.blockSize = 1024;
SHA512.outSize = 512;
SHA512.hmacStrength = 192;
SHA512.padLength = 128;

SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {
  var W = this.W;

  // 32 x 32bit words
  for (var i = 0; i < 32; i++)
    W[i] = msg[start + i];
  for (; i < W.length; i += 2) {
    var c0_hi = g1_512_hi(W[i - 4], W[i - 3]);  // i - 2
    var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);
    var c1_hi = W[i - 14];  // i - 7
    var c1_lo = W[i - 13];
    var c2_hi = g0_512_hi(W[i - 30], W[i - 29]);  // i - 15
    var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);
    var c3_hi = W[i - 32];  // i - 16
    var c3_lo = W[i - 31];

    W[i] = sum64_4_hi(
      c0_hi, c0_lo,
      c1_hi, c1_lo,
      c2_hi, c2_lo,
      c3_hi, c3_lo);
    W[i + 1] = sum64_4_lo(
      c0_hi, c0_lo,
      c1_hi, c1_lo,
      c2_hi, c2_lo,
      c3_hi, c3_lo);
  }
};

SHA512.prototype._update = function _update(msg, start) {
  this._prepareBlock(msg, start);

  var W = this.W;

  var ah = this.h[0];
  var al = this.h[1];
  var bh = this.h[2];
  var bl = this.h[3];
  var ch = this.h[4];
  var cl = this.h[5];
  var dh = this.h[6];
  var dl = this.h[7];
  var eh = this.h[8];
  var el = this.h[9];
  var fh = this.h[10];
  var fl = this.h[11];
  var gh = this.h[12];
  var gl = this.h[13];
  var hh = this.h[14];
  var hl = this.h[15];

  assert(this.k.length === W.length);
  for (var i = 0; i < W.length; i += 2) {
    var c0_hi = hh;
    var c0_lo = hl;
    var c1_hi = s1_512_hi(eh, el);
    var c1_lo = s1_512_lo(eh, el);
    var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);
    var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);
    var c3_hi = this.k[i];
    var c3_lo = this.k[i + 1];
    var c4_hi = W[i];
    var c4_lo = W[i + 1];

    var T1_hi = sum64_5_hi(
      c0_hi, c0_lo,
      c1_hi, c1_lo,
      c2_hi, c2_lo,
      c3_hi, c3_lo,
      c4_hi, c4_lo);
    var T1_lo = sum64_5_lo(
      c0_hi, c0_lo,
      c1_hi, c1_lo,
      c2_hi, c2_lo,
      c3_hi, c3_lo,
      c4_hi, c4_lo);

    c0_hi = s0_512_hi(ah, al);
    c0_lo = s0_512_lo(ah, al);
    c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);
    c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);

    var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);
    var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);

    hh = gh;
    hl = gl;

    gh = fh;
    gl = fl;

    fh = eh;
    fl = el;

    eh = sum64_hi(dh, dl, T1_hi, T1_lo);
    el = sum64_lo(dl, dl, T1_hi, T1_lo);

    dh = ch;
    dl = cl;

    ch = bh;
    cl = bl;

    bh = ah;
    bl = al;

    ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);
    al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);
  }

  sum64(this.h, 0, ah, al);
  sum64(this.h, 2, bh, bl);
  sum64(this.h, 4, ch, cl);
  sum64(this.h, 6, dh, dl);
  sum64(this.h, 8, eh, el);
  sum64(this.h, 10, fh, fl);
  sum64(this.h, 12, gh, gl);
  sum64(this.h, 14, hh, hl);
};

SHA512.prototype._digest = function digest(enc) {
  if (enc === 'hex')
    return utils.toHex32(this.h, 'big');
  else
    return utils.split32(this.h, 'big');
};

function ch64_hi(xh, xl, yh, yl, zh) {
  var r = (xh & yh) ^ ((~xh) & zh);
  if (r < 0)
    r += 0x100000000;
  return r;
}

function ch64_lo(xh, xl, yh, yl, zh, zl) {
  var r = (xl & yl) ^ ((~xl) & zl);
  if (r < 0)
    r += 0x100000000;
  return r;
}

function maj64_hi(xh, xl, yh, yl, zh) {
  var r = (xh & yh) ^ (xh & zh) ^ (yh & zh);
  if (r < 0)
    r += 0x100000000;
  return r;
}

function maj64_lo(xh, xl, yh, yl, zh, zl) {
  var r = (xl & yl) ^ (xl & zl) ^ (yl & zl);
  if (r < 0)
    r += 0x100000000;
  return r;
}

function s0_512_hi(xh, xl) {
  var c0_hi = rotr64_hi(xh, xl, 28);
  var c1_hi = rotr64_hi(xl, xh, 2);  // 34
  var c2_hi = rotr64_hi(xl, xh, 7);  // 39

  var r = c0_hi ^ c1_hi ^ c2_hi;
  if (r < 0)
    r += 0x100000000;
  return r;
}

function s0_512_lo(xh, xl) {
  var c0_lo = rotr64_lo(xh, xl, 28);
  var c1_lo = rotr64_lo(xl, xh, 2);  // 34
  var c2_lo = rotr64_lo(xl, xh, 7);  // 39

  var r = c0_lo ^ c1_lo ^ c2_lo;
  if (r < 0)
    r += 0x100000000;
  return r;
}

function s1_512_hi(xh, xl) {
  var c0_hi = rotr64_hi(xh, xl, 14);
  var c1_hi = rotr64_hi(xh, xl, 18);
  var c2_hi = rotr64_hi(xl, xh, 9);  // 41

  var r = c0_hi ^ c1_hi ^ c2_hi;
  if (r < 0)
    r += 0x100000000;
  return r;
}

function s1_512_lo(xh, xl) {
  var c0_lo = rotr64_lo(xh, xl, 14);
  var c1_lo = rotr64_lo(xh, xl, 18);
  var c2_lo = rotr64_lo(xl, xh, 9);  // 41

  var r = c0_lo ^ c1_lo ^ c2_lo;
  if (r < 0)
    r += 0x100000000;
  return r;
}

function g0_512_hi(xh, xl) {
  var c0_hi = rotr64_hi(xh, xl, 1);
  var c1_hi = rotr64_hi(xh, xl, 8);
  var c2_hi = shr64_hi(xh, xl, 7);

  var r = c0_hi ^ c1_hi ^ c2_hi;
  if (r < 0)
    r += 0x100000000;
  return r;
}

function g0_512_lo(xh, xl) {
  var c0_lo = rotr64_lo(xh, xl, 1);
  var c1_lo = rotr64_lo(xh, xl, 8);
  var c2_lo = shr64_lo(xh, xl, 7);

  var r = c0_lo ^ c1_lo ^ c2_lo;
  if (r < 0)
    r += 0x100000000;
  return r;
}

function g1_512_hi(xh, xl) {
  var c0_hi = rotr64_hi(xh, xl, 19);
  var c1_hi = rotr64_hi(xl, xh, 29);  // 61
  var c2_hi = shr64_hi(xh, xl, 6);

  var r = c0_hi ^ c1_hi ^ c2_hi;
  if (r < 0)
    r += 0x100000000;
  return r;
}

function g1_512_lo(xh, xl) {
  var c0_lo = rotr64_lo(xh, xl, 19);
  var c1_lo = rotr64_lo(xl, xh, 29);  // 61
  var c2_lo = shr64_lo(xh, xl, 6);

  var r = c0_lo ^ c1_lo ^ c2_lo;
  if (r < 0)
    r += 0x100000000;
  return r;
}

},{"../common":205,"../utils":215,"minimalistic-assert":235}],214:[function(require,module,exports){
'use strict';

var utils = require('../utils');
var rotr32 = utils.rotr32;

function ft_1(s, x, y, z) {
  if (s === 0)
    return ch32(x, y, z);
  if (s === 1 || s === 3)
    return p32(x, y, z);
  if (s === 2)
    return maj32(x, y, z);
}
exports.ft_1 = ft_1;

function ch32(x, y, z) {
  return (x & y) ^ ((~x) & z);
}
exports.ch32 = ch32;

function maj32(x, y, z) {
  return (x & y) ^ (x & z) ^ (y & z);
}
exports.maj32 = maj32;

function p32(x, y, z) {
  return x ^ y ^ z;
}
exports.p32 = p32;

function s0_256(x) {
  return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);
}
exports.s0_256 = s0_256;

function s1_256(x) {
  return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);
}
exports.s1_256 = s1_256;

function g0_256(x) {
  return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3);
}
exports.g0_256 = g0_256;

function g1_256(x) {
  return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10);
}
exports.g1_256 = g1_256;

},{"../utils":215}],215:[function(require,module,exports){
'use strict';

var assert = require('minimalistic-assert');
var inherits = require('inherits');

exports.inherits = inherits;

function isSurrogatePair(msg, i) {
  if ((msg.charCodeAt(i) & 0xFC00) !== 0xD800) {
    return false;
  }
  if (i < 0 || i + 1 >= msg.length) {
    return false;
  }
  return (msg.charCodeAt(i + 1) & 0xFC00) === 0xDC00;
}

function toArray(msg, enc) {
  if (Array.isArray(msg))
    return msg.slice();
  if (!msg)
    return [];
  var res = [];
  if (typeof msg === 'string') {
    if (!enc) {
      // Inspired by stringToUtf8ByteArray() in closure-library by Google
      // https://github.com/google/closure-library/blob/8598d87242af59aac233270742c8984e2b2bdbe0/closure/goog/crypt/crypt.js#L117-L143
      // Apache License 2.0
      // https://github.com/google/closure-library/blob/master/LICENSE
      var p = 0;
      for (var i = 0; i < msg.length; i++) {
        var c = msg.charCodeAt(i);
        if (c < 128) {
          res[p++] = c;
        } else if (c < 2048) {
          res[p++] = (c >> 6) | 192;
          res[p++] = (c & 63) | 128;
        } else if (isSurrogatePair(msg, i)) {
          c = 0x10000 + ((c & 0x03FF) << 10) + (msg.charCodeAt(++i) & 0x03FF);
          res[p++] = (c >> 18) | 240;
          res[p++] = ((c >> 12) & 63) | 128;
          res[p++] = ((c >> 6) & 63) | 128;
          res[p++] = (c & 63) | 128;
        } else {
          res[p++] = (c >> 12) | 224;
          res[p++] = ((c >> 6) & 63) | 128;
          res[p++] = (c & 63) | 128;
        }
      }
    } else if (enc === 'hex') {
      msg = msg.replace(/[^a-z0-9]+/ig, '');
      if (msg.length % 2 !== 0)
        msg = '0' + msg;
      for (i = 0; i < msg.length; i += 2)
        res.push(parseInt(msg[i] + msg[i + 1], 16));
    }
  } else {
    for (i = 0; i < msg.length; i++)
      res[i] = msg[i] | 0;
  }
  return res;
}
exports.toArray = toArray;

function toHex(msg) {
  var res = '';
  for (var i = 0; i < msg.length; i++)
    res += zero2(msg[i].toString(16));
  return res;
}
exports.toHex = toHex;

function htonl(w) {
  var res = (w >>> 24) |
            ((w >>> 8) & 0xff00) |
            ((w << 8) & 0xff0000) |
            ((w & 0xff) << 24);
  return res >>> 0;
}
exports.htonl = htonl;

function toHex32(msg, endian) {
  var res = '';
  for (var i = 0; i < msg.length; i++) {
    var w = msg[i];
    if (endian === 'little')
      w = htonl(w);
    res += zero8(w.toString(16));
  }
  return res;
}
exports.toHex32 = toHex32;

function zero2(word) {
  if (word.length === 1)
    return '0' + word;
  else
    return word;
}
exports.zero2 = zero2;

function zero8(word) {
  if (word.length === 7)
    return '0' + word;
  else if (word.length === 6)
    return '00' + word;
  else if (word.length === 5)
    return '000' + word;
  else if (word.length === 4)
    return '0000' + word;
  else if (word.length === 3)
    return '00000' + word;
  else if (word.length === 2)
    return '000000' + word;
  else if (word.length === 1)
    return '0000000' + word;
  else
    return word;
}
exports.zero8 = zero8;

function join32(msg, start, end, endian) {
  var len = end - start;
  assert(len % 4 === 0);
  var res = new Array(len / 4);
  for (var i = 0, k = start; i < res.length; i++, k += 4) {
    var w;
    if (endian === 'big')
      w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3];
    else
      w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k];
    res[i] = w >>> 0;
  }
  return res;
}
exports.join32 = join32;

function split32(msg, endian) {
  var res = new Array(msg.length * 4);
  for (var i = 0, k = 0; i < msg.length; i++, k += 4) {
    var m = msg[i];
    if (endian === 'big') {
      res[k] = m >>> 24;
      res[k + 1] = (m >>> 16) & 0xff;
      res[k + 2] = (m >>> 8) & 0xff;
      res[k + 3] = m & 0xff;
    } else {
      res[k + 3] = m >>> 24;
      res[k + 2] = (m >>> 16) & 0xff;
      res[k + 1] = (m >>> 8) & 0xff;
      res[k] = m & 0xff;
    }
  }
  return res;
}
exports.split32 = split32;

function rotr32(w, b) {
  return (w >>> b) | (w << (32 - b));
}
exports.rotr32 = rotr32;

function rotl32(w, b) {
  return (w << b) | (w >>> (32 - b));
}
exports.rotl32 = rotl32;

function sum32(a, b) {
  return (a + b) >>> 0;
}
exports.sum32 = sum32;

function sum32_3(a, b, c) {
  return (a + b + c) >>> 0;
}
exports.sum32_3 = sum32_3;

function sum32_4(a, b, c, d) {
  return (a + b + c + d) >>> 0;
}
exports.sum32_4 = sum32_4;

function sum32_5(a, b, c, d, e) {
  return (a + b + c + d + e) >>> 0;
}
exports.sum32_5 = sum32_5;

function sum64(buf, pos, ah, al) {
  var bh = buf[pos];
  var bl = buf[pos + 1];

  var lo = (al + bl) >>> 0;
  var hi = (lo < al ? 1 : 0) + ah + bh;
  buf[pos] = hi >>> 0;
  buf[pos + 1] = lo;
}
exports.sum64 = sum64;

function sum64_hi(ah, al, bh, bl) {
  var lo = (al + bl) >>> 0;
  var hi = (lo < al ? 1 : 0) + ah + bh;
  return hi >>> 0;
}
exports.sum64_hi = sum64_hi;

function sum64_lo(ah, al, bh, bl) {
  var lo = al + bl;
  return lo >>> 0;
}
exports.sum64_lo = sum64_lo;

function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {
  var carry = 0;
  var lo = al;
  lo = (lo + bl) >>> 0;
  carry += lo < al ? 1 : 0;
  lo = (lo + cl) >>> 0;
  carry += lo < cl ? 1 : 0;
  lo = (lo + dl) >>> 0;
  carry += lo < dl ? 1 : 0;

  var hi = ah + bh + ch + dh + carry;
  return hi >>> 0;
}
exports.sum64_4_hi = sum64_4_hi;

function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {
  var lo = al + bl + cl + dl;
  return lo >>> 0;
}
exports.sum64_4_lo = sum64_4_lo;

function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
  var carry = 0;
  var lo = al;
  lo = (lo + bl) >>> 0;
  carry += lo < al ? 1 : 0;
  lo = (lo + cl) >>> 0;
  carry += lo < cl ? 1 : 0;
  lo = (lo + dl) >>> 0;
  carry += lo < dl ? 1 : 0;
  lo = (lo + el) >>> 0;
  carry += lo < el ? 1 : 0;

  var hi = ah + bh + ch + dh + eh + carry;
  return hi >>> 0;
}
exports.sum64_5_hi = sum64_5_hi;

function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
  var lo = al + bl + cl + dl + el;

  return lo >>> 0;
}
exports.sum64_5_lo = sum64_5_lo;

function rotr64_hi(ah, al, num) {
  var r = (al << (32 - num)) | (ah >>> num);
  return r >>> 0;
}
exports.rotr64_hi = rotr64_hi;

function rotr64_lo(ah, al, num) {
  var r = (ah << (32 - num)) | (al >>> num);
  return r >>> 0;
}
exports.rotr64_lo = rotr64_lo;

function shr64_hi(ah, al, num) {
  return ah >>> num;
}
exports.shr64_hi = shr64_hi;

function shr64_lo(ah, al, num) {
  var r = (ah << (32 - num)) | (al >>> num);
  return r >>> 0;
}
exports.shr64_lo = shr64_lo;

},{"inherits":219,"minimalistic-assert":235}],216:[function(require,module,exports){
'use strict';

var call = Function.prototype.call;
var $hasOwn = Object.prototype.hasOwnProperty;
var bind = require('function-bind');

/** @type {import('.')} */
module.exports = bind.call(call, $hasOwn);

},{"function-bind":192}],217:[function(require,module,exports){
'use strict';

var hash = require('hash.js');
var utils = require('minimalistic-crypto-utils');
var assert = require('minimalistic-assert');

function HmacDRBG(options) {
  if (!(this instanceof HmacDRBG))
    return new HmacDRBG(options);
  this.hash = options.hash;
  this.predResist = !!options.predResist;

  this.outLen = this.hash.outSize;
  this.minEntropy = options.minEntropy || this.hash.hmacStrength;

  this._reseed = null;
  this.reseedInterval = null;
  this.K = null;
  this.V = null;

  var entropy = utils.toArray(options.entropy, options.entropyEnc || 'hex');
  var nonce = utils.toArray(options.nonce, options.nonceEnc || 'hex');
  var pers = utils.toArray(options.pers, options.persEnc || 'hex');
  assert(entropy.length >= (this.minEntropy / 8),
         'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits');
  this._init(entropy, nonce, pers);
}
module.exports = HmacDRBG;

HmacDRBG.prototype._init = function init(entropy, nonce, pers) {
  var seed = entropy.concat(nonce).concat(pers);

  this.K = new Array(this.outLen / 8);
  this.V = new Array(this.outLen / 8);
  for (var i = 0; i < this.V.length; i++) {
    this.K[i] = 0x00;
    this.V[i] = 0x01;
  }

  this._update(seed);
  this._reseed = 1;
  this.reseedInterval = 0x1000000000000;  // 2^48
};

HmacDRBG.prototype._hmac = function hmac() {
  return new hash.hmac(this.hash, this.K);
};

HmacDRBG.prototype._update = function update(seed) {
  var kmac = this._hmac()
                 .update(this.V)
                 .update([ 0x00 ]);
  if (seed)
    kmac = kmac.update(seed);
  this.K = kmac.digest();
  this.V = this._hmac().update(this.V).digest();
  if (!seed)
    return;

  this.K = this._hmac()
               .update(this.V)
               .update([ 0x01 ])
               .update(seed)
               .digest();
  this.V = this._hmac().update(this.V).digest();
};

HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {
  // Optional entropy enc
  if (typeof entropyEnc !== 'string') {
    addEnc = add;
    add = entropyEnc;
    entropyEnc = null;
  }

  entropy = utils.toArray(entropy, entropyEnc);
  add = utils.toArray(add, addEnc);

  assert(entropy.length >= (this.minEntropy / 8),
         'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits');

  this._update(entropy.concat(add || []));
  this._reseed = 1;
};

HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {
  if (this._reseed > this.reseedInterval)
    throw new Error('Reseed is required');

  // Optional encoding
  if (typeof enc !== 'string') {
    addEnc = add;
    add = enc;
    enc = null;
  }

  // Optional additional data
  if (add) {
    add = utils.toArray(add, addEnc || 'hex');
    this._update(add);
  }

  var temp = [];
  while (temp.length < len) {
    this.V = this._hmac().update(this.V).digest();
    temp = temp.concat(this.V);
  }

  var res = temp.slice(0, len);
  this._update(add);
  this._reseed++;
  return utils.encode(res, enc);
};

},{"hash.js":204,"minimalistic-assert":235,"minimalistic-crypto-utils":236}],218:[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
}

},{}],219:[function(require,module,exports){
if (typeof Object.create === 'function') {
  // implementation from standard node.js 'util' module
  module.exports = function inherits(ctor, superCtor) {
    if (superCtor) {
      ctor.super_ = superCtor
      ctor.prototype = Object.create(superCtor.prototype, {
        constructor: {
          value: ctor,
          enumerable: false,
          writable: true,
          configurable: true
        }
      })
    }
  };
} else {
  // old school shim for old browsers
  module.exports = function inherits(ctor, superCtor) {
    if (superCtor) {
      ctor.super_ = superCtor
      var TempCtor = function () {}
      TempCtor.prototype = superCtor.prototype
      ctor.prototype = new TempCtor()
      ctor.prototype.constructor = ctor
    }
  }
}

},{}],220:[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))
}

},{}],221:[function(require,module,exports){
'use strict';

var fnToStr = Function.prototype.toString;
var reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply;
var badArrayLike;
var isCallableMarker;
if (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') {
	try {
		badArrayLike = Object.defineProperty({}, 'length', {
			get: function () {
				throw isCallableMarker;
			}
		});
		isCallableMarker = {};
		// eslint-disable-next-line no-throw-literal
		reflectApply(function () { throw 42; }, null, badArrayLike);
	} catch (_) {
		if (_ !== isCallableMarker) {
			reflectApply = null;
		}
	}
} else {
	reflectApply = null;
}

var constructorRegex = /^\s*class\b/;
var isES6ClassFn = function isES6ClassFunction(value) {
	try {
		var fnStr = fnToStr.call(value);
		return constructorRegex.test(fnStr);
	} catch (e) {
		return false; // not a function
	}
};

var tryFunctionObject = function tryFunctionToStr(value) {
	try {
		if (isES6ClassFn(value)) { return false; }
		fnToStr.call(value);
		return true;
	} catch (e) {
		return false;
	}
};
var toStr = Object.prototype.toString;
var objectClass = '[object Object]';
var fnClass = '[object Function]';
var genClass = '[object GeneratorFunction]';
var ddaClass = '[object HTMLAllCollection]'; // IE 11
var ddaClass2 = '[object HTML document.all class]';
var ddaClass3 = '[object HTMLCollection]'; // IE 9-10
var hasToStringTag = typeof Symbol === 'function' && !!Symbol.toStringTag; // better: use `has-tostringtag`

var isIE68 = !(0 in [,]); // eslint-disable-line no-sparse-arrays, comma-spacing

var isDDA = function isDocumentDotAll() { return false; };
if (typeof document === 'object') {
	// Firefox 3 canonicalizes DDA to undefined when it's not accessed directly
	var all = document.all;
	if (toStr.call(all) === toStr.call(document.all)) {
		isDDA = function isDocumentDotAll(value) {
			/* globals document: false */
			// in IE 6-8, typeof document.all is "object" and it's truthy
			if ((isIE68 || !value) && (typeof value === 'undefined' || typeof value === 'object')) {
				try {
					var str = toStr.call(value);
					return (
						str === ddaClass
						|| str === ddaClass2
						|| str === ddaClass3 // opera 12.16
						|| str === objectClass // IE 6-8
					) && value('') == null; // eslint-disable-line eqeqeq
				} catch (e) { /**/ }
			}
			return false;
		};
	}
}

module.exports = reflectApply
	? function isCallable(value) {
		if (isDDA(value)) { return true; }
		if (!value) { return false; }
		if (typeof value !== 'function' && typeof value !== 'object') { return false; }
		try {
			reflectApply(value, null, badArrayLike);
		} catch (e) {
			if (e !== isCallableMarker) { return false; }
		}
		return !isES6ClassFn(value) && tryFunctionObject(value);
	}
	: function isCallable(value) {
		if (isDDA(value)) { return true; }
		if (!value) { return false; }
		if (typeof value !== 'function' && typeof value !== 'object') { return false; }
		if (hasToStringTag) { return tryFunctionObject(value); }
		if (isES6ClassFn(value)) { return false; }
		var strClass = toStr.call(value);
		if (strClass !== fnClass && strClass !== genClass && !(/^\[object HTML/).test(strClass)) { return false; }
		return tryFunctionObject(value);
	};

},{}],222:[function(require,module,exports){
'use strict';

var whichTypedArray = require('which-typed-array');

/** @type {import('.')} */
module.exports = function isTypedArray(value) {
	return !!whichTypedArray(value);
};

},{"which-typed-array":545}],223:[function(require,module,exports){
var toString = {}.toString;

module.exports = Array.isArray || function (arr) {
  return toString.call(arr) == '[object Array]';
};

},{}],224:[function(require,module,exports){
'use strict';

/** @type {import('./abs')} */
module.exports = Math.abs;

},{}],225:[function(require,module,exports){
'use strict';

/** @type {import('./floor')} */
module.exports = Math.floor;

},{}],226:[function(require,module,exports){
'use strict';

/** @type {import('./isNaN')} */
module.exports = Number.isNaN || function isNaN(a) {
	return a !== a;
};

},{}],227:[function(require,module,exports){
'use strict';

/** @type {import('./max')} */
module.exports = Math.max;

},{}],228:[function(require,module,exports){
'use strict';

/** @type {import('./min')} */
module.exports = Math.min;

},{}],229:[function(require,module,exports){
'use strict';

/** @type {import('./pow')} */
module.exports = Math.pow;

},{}],230:[function(require,module,exports){
'use strict';

/** @type {import('./round')} */
module.exports = Math.round;

},{}],231:[function(require,module,exports){
'use strict';

var $isNaN = require('./isNaN');

/** @type {import('./sign')} */
module.exports = function sign(number) {
	if ($isNaN(number) || number === 0) {
		return number;
	}
	return number < 0 ? -1 : +1;
};

},{"./isNaN":226}],232:[function(require,module,exports){
'use strict'
var inherits = require('inherits')
var HashBase = require('hash-base')
var Buffer = require('safe-buffer').Buffer

var ARRAY16 = new Array(16)

function MD5 () {
  HashBase.call(this, 64)

  // state
  this._a = 0x67452301
  this._b = 0xefcdab89
  this._c = 0x98badcfe
  this._d = 0x10325476
}

inherits(MD5, HashBase)

MD5.prototype._update = function () {
  var M = ARRAY16
  for (var i = 0; i < 16; ++i) M[i] = this._block.readInt32LE(i * 4)

  var a = this._a
  var b = this._b
  var c = this._c
  var d = this._d

  a = fnF(a, b, c, d, M[0], 0xd76aa478, 7)
  d = fnF(d, a, b, c, M[1], 0xe8c7b756, 12)
  c = fnF(c, d, a, b, M[2], 0x242070db, 17)
  b = fnF(b, c, d, a, M[3], 0xc1bdceee, 22)
  a = fnF(a, b, c, d, M[4], 0xf57c0faf, 7)
  d = fnF(d, a, b, c, M[5], 0x4787c62a, 12)
  c = fnF(c, d, a, b, M[6], 0xa8304613, 17)
  b = fnF(b, c, d, a, M[7], 0xfd469501, 22)
  a = fnF(a, b, c, d, M[8], 0x698098d8, 7)
  d = fnF(d, a, b, c, M[9], 0x8b44f7af, 12)
  c = fnF(c, d, a, b, M[10], 0xffff5bb1, 17)
  b = fnF(b, c, d, a, M[11], 0x895cd7be, 22)
  a = fnF(a, b, c, d, M[12], 0x6b901122, 7)
  d = fnF(d, a, b, c, M[13], 0xfd987193, 12)
  c = fnF(c, d, a, b, M[14], 0xa679438e, 17)
  b = fnF(b, c, d, a, M[15], 0x49b40821, 22)

  a = fnG(a, b, c, d, M[1], 0xf61e2562, 5)
  d = fnG(d, a, b, c, M[6], 0xc040b340, 9)
  c = fnG(c, d, a, b, M[11], 0x265e5a51, 14)
  b = fnG(b, c, d, a, M[0], 0xe9b6c7aa, 20)
  a = fnG(a, b, c, d, M[5], 0xd62f105d, 5)
  d = fnG(d, a, b, c, M[10], 0x02441453, 9)
  c = fnG(c, d, a, b, M[15], 0xd8a1e681, 14)
  b = fnG(b, c, d, a, M[4], 0xe7d3fbc8, 20)
  a = fnG(a, b, c, d, M[9], 0x21e1cde6, 5)
  d = fnG(d, a, b, c, M[14], 0xc33707d6, 9)
  c = fnG(c, d, a, b, M[3], 0xf4d50d87, 14)
  b = fnG(b, c, d, a, M[8], 0x455a14ed, 20)
  a = fnG(a, b, c, d, M[13], 0xa9e3e905, 5)
  d = fnG(d, a, b, c, M[2], 0xfcefa3f8, 9)
  c = fnG(c, d, a, b, M[7], 0x676f02d9, 14)
  b = fnG(b, c, d, a, M[12], 0x8d2a4c8a, 20)

  a = fnH(a, b, c, d, M[5], 0xfffa3942, 4)
  d = fnH(d, a, b, c, M[8], 0x8771f681, 11)
  c = fnH(c, d, a, b, M[11], 0x6d9d6122, 16)
  b = fnH(b, c, d, a, M[14], 0xfde5380c, 23)
  a = fnH(a, b, c, d, M[1], 0xa4beea44, 4)
  d = fnH(d, a, b, c, M[4], 0x4bdecfa9, 11)
  c = fnH(c, d, a, b, M[7], 0xf6bb4b60, 16)
  b = fnH(b, c, d, a, M[10], 0xbebfbc70, 23)
  a = fnH(a, b, c, d, M[13], 0x289b7ec6, 4)
  d = fnH(d, a, b, c, M[0], 0xeaa127fa, 11)
  c = fnH(c, d, a, b, M[3], 0xd4ef3085, 16)
  b = fnH(b, c, d, a, M[6], 0x04881d05, 23)
  a = fnH(a, b, c, d, M[9], 0xd9d4d039, 4)
  d = fnH(d, a, b, c, M[12], 0xe6db99e5, 11)
  c = fnH(c, d, a, b, M[15], 0x1fa27cf8, 16)
  b = fnH(b, c, d, a, M[2], 0xc4ac5665, 23)

  a = fnI(a, b, c, d, M[0], 0xf4292244, 6)
  d = fnI(d, a, b, c, M[7], 0x432aff97, 10)
  c = fnI(c, d, a, b, M[14], 0xab9423a7, 15)
  b = fnI(b, c, d, a, M[5], 0xfc93a039, 21)
  a = fnI(a, b, c, d, M[12], 0x655b59c3, 6)
  d = fnI(d, a, b, c, M[3], 0x8f0ccc92, 10)
  c = fnI(c, d, a, b, M[10], 0xffeff47d, 15)
  b = fnI(b, c, d, a, M[1], 0x85845dd1, 21)
  a = fnI(a, b, c, d, M[8], 0x6fa87e4f, 6)
  d = fnI(d, a, b, c, M[15], 0xfe2ce6e0, 10)
  c = fnI(c, d, a, b, M[6], 0xa3014314, 15)
  b = fnI(b, c, d, a, M[13], 0x4e0811a1, 21)
  a = fnI(a, b, c, d, M[4], 0xf7537e82, 6)
  d = fnI(d, a, b, c, M[11], 0xbd3af235, 10)
  c = fnI(c, d, a, b, M[2], 0x2ad7d2bb, 15)
  b = fnI(b, c, d, a, M[9], 0xeb86d391, 21)

  this._a = (this._a + a) | 0
  this._b = (this._b + b) | 0
  this._c = (this._c + c) | 0
  this._d = (this._d + d) | 0
}

MD5.prototype._digest = function () {
  // create padding and handle blocks
  this._block[this._blockOffset++] = 0x80
  if (this._blockOffset > 56) {
    this._block.fill(0, this._blockOffset, 64)
    this._update()
    this._blockOffset = 0
  }

  this._block.fill(0, this._blockOffset, 56)
  this._block.writeUInt32LE(this._length[0], 56)
  this._block.writeUInt32LE(this._length[1], 60)
  this._update()

  // produce result
  var buffer = Buffer.allocUnsafe(16)
  buffer.writeInt32LE(this._a, 0)
  buffer.writeInt32LE(this._b, 4)
  buffer.writeInt32LE(this._c, 8)
  buffer.writeInt32LE(this._d, 12)
  return buffer
}

function rotl (x, n) {
  return (x << n) | (x >>> (32 - n))
}

function fnF (a, b, c, d, m, k, s) {
  return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + b) | 0
}

function fnG (a, b, c, d, m, k, s) {
  return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + b) | 0
}

function fnH (a, b, c, d, m, k, s) {
  return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + b) | 0
}

function fnI (a, b, c, d, m, k, s) {
  return (rotl((a + ((c ^ (b | (~d)))) + m + k) | 0, s) + b) | 0
}

module.exports = MD5

},{"hash-base":203,"inherits":219,"safe-buffer":513}],233:[function(require,module,exports){
var bn = require('bn.js');
var brorand = require('brorand');

function MillerRabin(rand) {
  this.rand = rand || new brorand.Rand();
}
module.exports = MillerRabin;

MillerRabin.create = function create(rand) {
  return new MillerRabin(rand);
};

MillerRabin.prototype._randbelow = function _randbelow(n) {
  var len = n.bitLength();
  var min_bytes = Math.ceil(len / 8);

  // Generage random bytes until a number less than n is found.
  // This ensures that 0..n-1 have an equal probability of being selected.
  do
    var a = new bn(this.rand.generate(min_bytes));
  while (a.cmp(n) >= 0);

  return a;
};

MillerRabin.prototype._randrange = function _randrange(start, stop) {
  // Generate a random number greater than or equal to start and less than stop.
  var size = stop.sub(start);
  return start.add(this._randbelow(size));
};

MillerRabin.prototype.test = function test(n, k, cb) {
  var len = n.bitLength();
  var red = bn.mont(n);
  var rone = new bn(1).toRed(red);

  if (!k)
    k = Math.max(1, (len / 48) | 0);

  // Find d and s, (n - 1) = (2 ^ s) * d;
  var n1 = n.subn(1);
  for (var s = 0; !n1.testn(s); s++) {}
  var d = n.shrn(s);

  var rn1 = n1.toRed(red);

  var prime = true;
  for (; k > 0; k--) {
    var a = this._randrange(new bn(2), n1);
    if (cb)
      cb(a);

    var x = a.toRed(red).redPow(d);
    if (x.cmp(rone) === 0 || x.cmp(rn1) === 0)
      continue;

    for (var i = 1; i < s; i++) {
      x = x.redSqr();

      if (x.cmp(rone) === 0)
        return false;
      if (x.cmp(rn1) === 0)
        break;
    }

    if (i === s)
      return false;
  }

  return prime;
};

MillerRabin.prototype.getDivisor = function getDivisor(n, k) {
  var len = n.bitLength();
  var red = bn.mont(n);
  var rone = new bn(1).toRed(red);

  if (!k)
    k = Math.max(1, (len / 48) | 0);

  // Find d and s, (n - 1) = (2 ^ s) * d;
  var n1 = n.subn(1);
  for (var s = 0; !n1.testn(s); s++) {}
  var d = n.shrn(s);

  var rn1 = n1.toRed(red);

  for (; k > 0; k--) {
    var a = this._randrange(new bn(2), n1);

    var g = n.gcd(a);
    if (g.cmpn(1) !== 0)
      return g;

    var x = a.toRed(red).redPow(d);
    if (x.cmp(rone) === 0 || x.cmp(rn1) === 0)
      continue;

    for (var i = 1; i < s; i++) {
      x = x.redSqr();

      if (x.cmp(rone) === 0)
        return x.fromRed().subn(1).gcd(n);
      if (x.cmp(rn1) === 0)
        break;
    }

    if (i === s) {
      x = x.redSqr();
      return x.fromRed().subn(1).gcd(n);
    }
  }

  return false;
};

},{"bn.js":234,"brorand":53}],234:[function(require,module,exports){
arguments[4][49][0].apply(exports,arguments)
},{"buffer":54,"dup":49}],235:[function(require,module,exports){
module.exports = assert;

function assert(val, msg) {
  if (!val)
    throw new Error(msg || 'Assertion failed');
}

assert.equal = function assertEqual(l, r, msg) {
  if (l != r)
    throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r));
};

},{}],236:[function(require,module,exports){
'use strict';

var utils = exports;

function toArray(msg, enc) {
  if (Array.isArray(msg))
    return msg.slice();
  if (!msg)
    return [];
  var res = [];
  if (typeof msg !== 'string') {
    for (var i = 0; i < msg.length; i++)
      res[i] = msg[i] | 0;
    return res;
  }
  if (enc === 'hex') {
    msg = msg.replace(/[^a-z0-9]+/ig, '');
    if (msg.length % 2 !== 0)
      msg = '0' + msg;
    for (var i = 0; i < msg.length; i += 2)
      res.push(parseInt(msg[i] + msg[i + 1], 16));
  } else {
    for (var i = 0; i < msg.length; i++) {
      var c = msg.charCodeAt(i);
      var hi = c >> 8;
      var lo = c & 0xff;
      if (hi)
        res.push(hi, lo);
      else
        res.push(lo);
    }
  }
  return res;
}
utils.toArray = toArray;

function zero2(word) {
  if (word.length === 1)
    return '0' + word;
  else
    return word;
}
utils.zero2 = zero2;

function toHex(msg) {
  var res = '';
  for (var i = 0; i < msg.length; i++)
    res += zero2(msg[i].toString(16));
  return res;
}
utils.toHex = toHex;

utils.encode = function encode(arr, enc) {
  if (enc === 'hex')
    return toHex(arr);
  else
    return arr;
};

},{}],237:[function(require,module,exports){
module.exports={"2.16.840.1.101.3.4.1.1": "aes-128-ecb",
"2.16.840.1.101.3.4.1.2": "aes-128-cbc",
"2.16.840.1.101.3.4.1.3": "aes-128-ofb",
"2.16.840.1.101.3.4.1.4": "aes-128-cfb",
"2.16.840.1.101.3.4.1.21": "aes-192-ecb",
"2.16.840.1.101.3.4.1.22": "aes-192-cbc",
"2.16.840.1.101.3.4.1.23": "aes-192-ofb",
"2.16.840.1.101.3.4.1.24": "aes-192-cfb",
"2.16.840.1.101.3.4.1.41": "aes-256-ecb",
"2.16.840.1.101.3.4.1.42": "aes-256-cbc",
"2.16.840.1.101.3.4.1.43": "aes-256-ofb",
"2.16.840.1.101.3.4.1.44": "aes-256-cfb"
}
},{}],238:[function(require,module,exports){
// from https://github.com/indutny/self-signed/blob/gh-pages/lib/asn1.js
// Fedor, you are amazing.

'use strict';

var asn1 = require('asn1.js');

exports.certificate = require('./certificate');

var RSAPrivateKey = asn1.define('RSAPrivateKey', function () {
	this.seq().obj(
		this.key('version')['int'](),
		this.key('modulus')['int'](),
		this.key('publicExponent')['int'](),
		this.key('privateExponent')['int'](),
		this.key('prime1')['int'](),
		this.key('prime2')['int'](),
		this.key('exponent1')['int'](),
		this.key('exponent2')['int'](),
		this.key('coefficient')['int']()
	);
});
exports.RSAPrivateKey = RSAPrivateKey;

var RSAPublicKey = asn1.define('RSAPublicKey', function () {
	this.seq().obj(
		this.key('modulus')['int'](),
		this.key('publicExponent')['int']()
	);
});
exports.RSAPublicKey = RSAPublicKey;

var AlgorithmIdentifier = asn1.define('AlgorithmIdentifier', function () {
	this.seq().obj(
		this.key('algorithm').objid(),
		this.key('none').null_().optional(),
		this.key('curve').objid().optional(),
		this.key('params').seq().obj(
			this.key('p')['int'](),
			this.key('q')['int'](),
			this.key('g')['int']()
		).optional()
	);
});

var PublicKey = asn1.define('SubjectPublicKeyInfo', function () {
	this.seq().obj(
		this.key('algorithm').use(AlgorithmIdentifier),
		this.key('subjectPublicKey').bitstr()
	);
});
exports.PublicKey = PublicKey;

var PrivateKeyInfo = asn1.define('PrivateKeyInfo', function () {
	this.seq().obj(
		this.key('version')['int'](),
		this.key('algorithm').use(AlgorithmIdentifier),
		this.key('subjectPrivateKey').octstr()
	);
});
exports.PrivateKey = PrivateKeyInfo;
var EncryptedPrivateKeyInfo = asn1.define('EncryptedPrivateKeyInfo', function () {
	this.seq().obj(
		this.key('algorithm').seq().obj(
			this.key('id').objid(),
			this.key('decrypt').seq().obj(
				this.key('kde').seq().obj(
					this.key('id').objid(),
					this.key('kdeparams').seq().obj(
						this.key('salt').octstr(),
						this.key('iters')['int']()
					)
				),
				this.key('cipher').seq().obj(
					this.key('algo').objid(),
					this.key('iv').octstr()
				)
			)
		),
		this.key('subjectPrivateKey').octstr()
	);
});

exports.EncryptedPrivateKey = EncryptedPrivateKeyInfo;

var DSAPrivateKey = asn1.define('DSAPrivateKey', function () {
	this.seq().obj(
		this.key('version')['int'](),
		this.key('p')['int'](),
		this.key('q')['int'](),
		this.key('g')['int'](),
		this.key('pub_key')['int'](),
		this.key('priv_key')['int']()
	);
});
exports.DSAPrivateKey = DSAPrivateKey;

exports.DSAparam = asn1.define('DSAparam', function () {
	this['int']();
});

var ECParameters = asn1.define('ECParameters', function () {
	this.choice({
		namedCurve: this.objid()
	});
});

var ECPrivateKey = asn1.define('ECPrivateKey', function () {
	this.seq().obj(
		this.key('version')['int'](),
		this.key('privateKey').octstr(),
		this.key('parameters').optional().explicit(0).use(ECParameters),
		this.key('publicKey').optional().explicit(1).bitstr()
	);
});
exports.ECPrivateKey = ECPrivateKey;

exports.signature = asn1.define('signature', function () {
	this.seq().obj(
		this.key('r')['int'](),
		this.key('s')['int']()
	);
});

},{"./certificate":239,"asn1.js":35}],239:[function(require,module,exports){
// from https://github.com/Rantanen/node-dtls/blob/25a7dc861bda38cfeac93a723500eea4f0ac2e86/Certificate.js
// thanks to @Rantanen

'use strict';

var asn = require('asn1.js');

var Time = asn.define('Time', function () {
	this.choice({
		utcTime: this.utctime(),
		generalTime: this.gentime()
	});
});

var AttributeTypeValue = asn.define('AttributeTypeValue', function () {
	this.seq().obj(
		this.key('type').objid(),
		this.key('value').any()
	);
});

var AlgorithmIdentifier = asn.define('AlgorithmIdentifier', function () {
	this.seq().obj(
		this.key('algorithm').objid(),
		this.key('parameters').optional(),
		this.key('curve').objid().optional()
	);
});

var SubjectPublicKeyInfo = asn.define('SubjectPublicKeyInfo', function () {
	this.seq().obj(
		this.key('algorithm').use(AlgorithmIdentifier),
		this.key('subjectPublicKey').bitstr()
	);
});

var RelativeDistinguishedName = asn.define('RelativeDistinguishedName', function () {
	this.setof(AttributeTypeValue);
});

var RDNSequence = asn.define('RDNSequence', function () {
	this.seqof(RelativeDistinguishedName);
});

var Name = asn.define('Name', function () {
	this.choice({
		rdnSequence: this.use(RDNSequence)
	});
});

var Validity = asn.define('Validity', function () {
	this.seq().obj(
		this.key('notBefore').use(Time),
		this.key('notAfter').use(Time)
	);
});

var Extension = asn.define('Extension', function () {
	this.seq().obj(
		this.key('extnID').objid(),
		this.key('critical').bool().def(false),
		this.key('extnValue').octstr()
	);
});

var TBSCertificate = asn.define('TBSCertificate', function () {
	this.seq().obj(
		this.key('version').explicit(0)['int']().optional(),
		this.key('serialNumber')['int'](),
		this.key('signature').use(AlgorithmIdentifier),
		this.key('issuer').use(Name),
		this.key('validity').use(Validity),
		this.key('subject').use(Name),
		this.key('subjectPublicKeyInfo').use(SubjectPublicKeyInfo),
		this.key('issuerUniqueID').implicit(1).bitstr().optional(),
		this.key('subjectUniqueID').implicit(2).bitstr().optional(),
		this.key('extensions').explicit(3).seqof(Extension).optional()
	);
});

var X509Certificate = asn.define('X509Certificate', function () {
	this.seq().obj(
		this.key('tbsCertificate').use(TBSCertificate),
		this.key('signatureAlgorithm').use(AlgorithmIdentifier),
		this.key('signatureValue').bitstr()
	);
});

module.exports = X509Certificate;

},{"asn1.js":35}],240:[function(require,module,exports){
'use strict';

// adapted from https://github.com/apatil/pemstrip
var findProc = /Proc-Type: 4,ENCRYPTED[\n\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\n\r]+([0-9A-z\n\r+/=]+)[\n\r]+/m;
var startRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----/m;
var fullRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----([0-9A-z\n\r+/=]+)-----END \1-----$/m;
var evp = require('evp_bytestokey');
var ciphers = require('browserify-aes');
var Buffer = require('safe-buffer').Buffer;
module.exports = function (okey, password) {
	var key = okey.toString();
	var match = key.match(findProc);
	var decrypted;
	if (!match) {
		var match2 = key.match(fullRegex);
		decrypted = Buffer.from(match2[2].replace(/[\r\n]/g, ''), 'base64');
	} else {
		var suite = 'aes' + match[1];
		var iv = Buffer.from(match[2], 'hex');
		var cipherText = Buffer.from(match[3].replace(/[\r\n]/g, ''), 'base64');
		var cipherKey = evp(password, iv.slice(0, 8), parseInt(match[1], 10)).key;
		var out = [];
		var cipher = ciphers.createDecipheriv(suite, cipherKey, iv);
		out.push(cipher.update(cipherText));
		out.push(cipher['final']());
		decrypted = Buffer.concat(out);
	}
	var tag = key.match(startRegex)[1];
	return {
		tag: tag,
		data: decrypted
	};
};

},{"browserify-aes":57,"evp_bytestokey":189,"safe-buffer":513}],241:[function(require,module,exports){
'use strict';

var asn1 = require('./asn1');
var aesid = require('./aesid.json');
var fixProc = require('./fixProc');
var ciphers = require('browserify-aes');
var compat = require('pbkdf2');
var Buffer = require('safe-buffer').Buffer;

function decrypt(data, password) {
	var salt = data.algorithm.decrypt.kde.kdeparams.salt;
	var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(), 10);
	var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')];
	var iv = data.algorithm.decrypt.cipher.iv;
	var cipherText = data.subjectPrivateKey;
	var keylen = parseInt(algo.split('-')[1], 10) / 8;
	var key = compat.pbkdf2Sync(password, salt, iters, keylen, 'sha1');
	var cipher = ciphers.createDecipheriv(algo, key, iv);
	var out = [];
	out.push(cipher.update(cipherText));
	out.push(cipher['final']());
	return Buffer.concat(out);
}

function parseKeys(buffer) {
	var password;
	if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) {
		password = buffer.passphrase;
		buffer = buffer.key;
	}
	if (typeof buffer === 'string') {
		buffer = Buffer.from(buffer);
	}

	var stripped = fixProc(buffer, password);

	var type = stripped.tag;
	var data = stripped.data;
	var subtype, ndata;
	switch (type) {
		case 'CERTIFICATE':
			ndata = asn1.certificate.decode(data, 'der').tbsCertificate.subjectPublicKeyInfo;
			// falls through
		case 'PUBLIC KEY':
			if (!ndata) {
				ndata = asn1.PublicKey.decode(data, 'der');
			}
			subtype = ndata.algorithm.algorithm.join('.');
			switch (subtype) {
				case '1.2.840.113549.1.1.1':
					return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data, 'der');
				case '1.2.840.10045.2.1':
					ndata.subjectPrivateKey = ndata.subjectPublicKey;
					return {
						type: 'ec',
						data: ndata
					};
				case '1.2.840.10040.4.1':
					ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data, 'der');
					return {
						type: 'dsa',
						data: ndata.algorithm.params
					};
				default: throw new Error('unknown key id ' + subtype);
			}
			// throw new Error('unknown key type ' + type)
		case 'ENCRYPTED PRIVATE KEY':
			data = asn1.EncryptedPrivateKey.decode(data, 'der');
			data = decrypt(data, password);
			// falls through
		case 'PRIVATE KEY':
			ndata = asn1.PrivateKey.decode(data, 'der');
			subtype = ndata.algorithm.algorithm.join('.');
			switch (subtype) {
				case '1.2.840.113549.1.1.1':
					return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey, 'der');
				case '1.2.840.10045.2.1':
					return {
						curve: ndata.algorithm.curve,
						privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey, 'der').privateKey
					};
				case '1.2.840.10040.4.1':
					ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey, 'der');
					return {
						type: 'dsa',
						params: ndata.algorithm.params
					};
				default: throw new Error('unknown key id ' + subtype);
			}
			// throw new Error('unknown key type ' + type)
		case 'RSA PUBLIC KEY':
			return asn1.RSAPublicKey.decode(data, 'der');
		case 'RSA PRIVATE KEY':
			return asn1.RSAPrivateKey.decode(data, 'der');
		case 'DSA PRIVATE KEY':
			return {
				type: 'dsa',
				params: asn1.DSAPrivateKey.decode(data, 'der')
			};
		case 'EC PRIVATE KEY':
			data = asn1.ECPrivateKey.decode(data, 'der');
			return {
				curve: data.parameters.value,
				privateKey: data.privateKey
			};
		default: throw new Error('unknown key type ' + type);
	}
}
parseKeys.signature = asn1.signature;

module.exports = parseKeys;

},{"./aesid.json":237,"./asn1":238,"./fixProc":240,"browserify-aes":57,"pbkdf2":242,"safe-buffer":513}],242:[function(require,module,exports){
'use strict';

exports.pbkdf2 = require('./lib/async');
exports.pbkdf2Sync = require('./lib/sync');

},{"./lib/async":243,"./lib/sync":246}],243:[function(require,module,exports){
(function (global){(function (){
'use strict';

var Buffer = require('safe-buffer').Buffer;

var checkParameters = require('./precondition');
var defaultEncoding = require('./default-encoding');
var sync = require('./sync');
var toBuffer = require('./to-buffer');

var ZERO_BUF;
var subtle = global.crypto && global.crypto.subtle;
var toBrowser = {
	sha: 'SHA-1',
	'sha-1': 'SHA-1',
	sha1: 'SHA-1',
	sha256: 'SHA-256',
	'sha-256': 'SHA-256',
	sha384: 'SHA-384',
	'sha-384': 'SHA-384',
	'sha-512': 'SHA-512',
	sha512: 'SHA-512'
};
var checks = [];
var nextTick;
function getNextTick() {
	if (nextTick) {
		return nextTick;
	}
	if (global.process && global.process.nextTick) {
		nextTick = global.process.nextTick;
	} else if (global.queueMicrotask) {
		nextTick = global.queueMicrotask;
	} else if (global.setImmediate) {
		nextTick = global.setImmediate;
	} else {
		nextTick = global.setTimeout;
	}
	return nextTick;
}
function browserPbkdf2(password, salt, iterations, length, algo) {
	return subtle.importKey('raw', password, { name: 'PBKDF2' }, false, ['deriveBits']).then(function (key) {
		return subtle.deriveBits({
			name: 'PBKDF2',
			salt: salt,
			iterations: iterations,
			hash: {
				name: algo
			}
		}, key, length << 3);
	}).then(function (res) {
		return Buffer.from(res);
	});
}
function checkNative(algo) {
	if (global.process && !global.process.browser) {
		return Promise.resolve(false);
	}
	if (!subtle || !subtle.importKey || !subtle.deriveBits) {
		return Promise.resolve(false);
	}
	if (checks[algo] !== undefined) {
		return checks[algo];
	}
	ZERO_BUF = ZERO_BUF || Buffer.alloc(8);
	var prom = browserPbkdf2(ZERO_BUF, ZERO_BUF, 10, 128, algo)
		.then(
			function () { return true; },
			function () { return false; }
		);
	checks[algo] = prom;
	return prom;
}

function resolvePromise(promise, callback) {
	promise.then(function (out) {
		getNextTick()(function () {
			callback(null, out);
		});
	}, function (e) {
		getNextTick()(function () {
			callback(e);
		});
	});
}
module.exports = function (password, salt, iterations, keylen, digest, callback) {
	if (typeof digest === 'function') {
		callback = digest;
		digest = undefined;
	}

	digest = digest || 'sha1';
	var algo = toBrowser[digest.toLowerCase()];

	if (!algo || typeof global.Promise !== 'function') {
		getNextTick()(function () {
			var out;
			try {
				out = sync(password, salt, iterations, keylen, digest);
			} catch (e) {
				callback(e);
				return;
			}
			callback(null, out);
		});
		return;
	}

	checkParameters(iterations, keylen);
	password = toBuffer(password, defaultEncoding, 'Password');
	salt = toBuffer(salt, defaultEncoding, 'Salt');
	if (typeof callback !== 'function') {
		throw new Error('No callback provided to pbkdf2');
	}

	resolvePromise(checkNative(algo).then(function (resp) {
		if (resp) {
			return browserPbkdf2(password, salt, iterations, keylen, algo);
		}

		return sync(password, salt, iterations, keylen, digest);
	}), callback);
};

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./default-encoding":244,"./precondition":245,"./sync":246,"./to-buffer":247,"safe-buffer":513}],244:[function(require,module,exports){
(function (process,global){(function (){
'use strict';

var defaultEncoding;
/* istanbul ignore next */
if (global.process && global.process.browser) {
	defaultEncoding = 'utf-8';
} else if (global.process && global.process.version) {
	var pVersionMajor = parseInt(process.version.split('.')[0].slice(1), 10);

	defaultEncoding = pVersionMajor >= 6 ? 'utf-8' : 'binary';
} else {
	defaultEncoding = 'utf-8';
}
module.exports = defaultEncoding;

}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"_process":254}],245:[function(require,module,exports){
'use strict';

var MAX_ALLOC = Math.pow(2, 30) - 1; // default in iojs

module.exports = function (iterations, keylen) {
	if (typeof iterations !== 'number') {
		throw new TypeError('Iterations not a number');
	}

	if (iterations < 0) {
		throw new TypeError('Bad iterations');
	}

	if (typeof keylen !== 'number') {
		throw new TypeError('Key length not a number');
	}

	if (keylen < 0 || keylen > MAX_ALLOC || keylen !== keylen) { /* eslint no-self-compare: 0 */
		throw new TypeError('Bad key length');
	}
};

},{}],246:[function(require,module,exports){
'use strict';

var md5 = require('create-hash/md5');
var RIPEMD160 = require('ripemd160');
var sha = require('sha.js');
var Buffer = require('safe-buffer').Buffer;

var checkParameters = require('./precondition');
var defaultEncoding = require('./default-encoding');
var toBuffer = require('./to-buffer');

var ZEROS = Buffer.alloc(128);
var sizes = {
	__proto__: null,
	md5: 16,
	sha1: 20,
	sha224: 28,
	sha256: 32,
	sha384: 48,
	sha512: 64,
	'sha512-256': 32,
	ripemd160: 20,
	rmd160: 20
};

var mapping = {
	__proto__: null,
	'sha-1': 'sha1',
	'sha-224': 'sha224',
	'sha-256': 'sha256',
	'sha-384': 'sha384',
	'sha-512': 'sha512',
	'ripemd-160': 'ripemd160'
};

function rmd160Func(data) {
	return new RIPEMD160().update(data).digest();
}

function getDigest(alg) {
	function shaFunc(data) {
		return sha(alg).update(data).digest();
	}

	if (alg === 'rmd160' || alg === 'ripemd160') {
		return rmd160Func;
	}
	if (alg === 'md5') {
		return md5;
	}
	return shaFunc;
}

function Hmac(alg, key, saltLen) {
	var hash = getDigest(alg);
	var blocksize = alg === 'sha512' || alg === 'sha384' ? 128 : 64;

	if (key.length > blocksize) {
		key = hash(key);
	} else if (key.length < blocksize) {
		key = Buffer.concat([key, ZEROS], blocksize);
	}

	var ipad = Buffer.allocUnsafe(blocksize + sizes[alg]);
	var opad = Buffer.allocUnsafe(blocksize + sizes[alg]);
	for (var i = 0; i < blocksize; i++) {
		ipad[i] = key[i] ^ 0x36;
		opad[i] = key[i] ^ 0x5C;
	}

	var ipad1 = Buffer.allocUnsafe(blocksize + saltLen + 4);
	ipad.copy(ipad1, 0, 0, blocksize);
	this.ipad1 = ipad1;
	this.ipad2 = ipad;
	this.opad = opad;
	this.alg = alg;
	this.blocksize = blocksize;
	this.hash = hash;
	this.size = sizes[alg];
}

Hmac.prototype.run = function (data, ipad) {
	data.copy(ipad, this.blocksize);
	var h = this.hash(ipad);
	h.copy(this.opad, this.blocksize);
	return this.hash(this.opad);
};

function pbkdf2(password, salt, iterations, keylen, digest) {
	checkParameters(iterations, keylen);
	password = toBuffer(password, defaultEncoding, 'Password');
	salt = toBuffer(salt, defaultEncoding, 'Salt');

	var lowerDigest = (digest || 'sha1').toLowerCase();
	var mappedDigest = mapping[lowerDigest] || lowerDigest;
	var size = sizes[mappedDigest];
	if (typeof size !== 'number' || !size) {
		throw new TypeError('Digest algorithm not supported: ' + digest);
	}

	var hmac = new Hmac(mappedDigest, password, salt.length);

	var DK = Buffer.allocUnsafe(keylen);
	var block1 = Buffer.allocUnsafe(salt.length + 4);
	salt.copy(block1, 0, 0, salt.length);

	var destPos = 0;
	var hLen = size;
	var l = Math.ceil(keylen / hLen);

	for (var i = 1; i <= l; i++) {
		block1.writeUInt32BE(i, salt.length);

		var T = hmac.run(block1, hmac.ipad1);
		var U = T;

		for (var j = 1; j < iterations; j++) {
			U = hmac.run(U, hmac.ipad2);
			for (var k = 0; k < hLen; k++) {
				T[k] ^= U[k];
			}
		}

		T.copy(DK, destPos);
		destPos += hLen;
	}

	return DK;
}

module.exports = pbkdf2;

},{"./default-encoding":244,"./precondition":245,"./to-buffer":247,"create-hash/md5":249,"ripemd160":251,"safe-buffer":513,"sha.js":516}],247:[function(require,module,exports){
'use strict';

var Buffer = require('safe-buffer').Buffer;
var toBuffer = require('to-buffer');

var useUint8Array = typeof Uint8Array !== 'undefined';
var useArrayBuffer = useUint8Array && typeof ArrayBuffer !== 'undefined';
var isView = useArrayBuffer && ArrayBuffer.isView;

module.exports = function (thing, encoding, name) {
	if (
		typeof thing === 'string'
		|| Buffer.isBuffer(thing)
		|| (useUint8Array && thing instanceof Uint8Array)
		|| (isView && isView(thing))
	) {
		return toBuffer(thing, encoding);
	}
	throw new TypeError(name + ' must be a string, a Buffer, a Uint8Array, or a DataView');
};

},{"safe-buffer":513,"to-buffer":540}],248:[function(require,module,exports){
(function (Buffer){(function (){
'use strict'
var intSize = 4
var zeroBuffer = new Buffer(intSize)
zeroBuffer.fill(0)

var charSize = 8
var hashSize = 16

function toArray (buf) {
  if ((buf.length % intSize) !== 0) {
    var len = buf.length + (intSize - (buf.length % intSize))
    buf = Buffer.concat([buf, zeroBuffer], len)
  }

  var arr = new Array(buf.length >>> 2)
  for (var i = 0, j = 0; i < buf.length; i += intSize, j++) {
    arr[j] = buf.readInt32LE(i)
  }

  return arr
}

module.exports = function hash (buf, fn) {
  var arr = fn(toArray(buf), buf.length * charSize)
  buf = new Buffer(hashSize)
  for (var i = 0; i < arr.length; i++) {
    buf.writeInt32LE(arr[i], i << 2, true)
  }
  return buf
}

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":83}],249:[function(require,module,exports){
'use strict'
/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */

var makeHash = require('./make-hash')

/*
 * Calculate the MD5 of an array of little-endian words, and a bit length
 */
function core_md5 (x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << ((len) % 32)
  x[(((len + 64) >>> 9) << 4) + 14] = len

  var a = 1732584193
  var b = -271733879
  var c = -1732584194
  var d = 271733878

  for (var i = 0; i < x.length; i += 16) {
    var olda = a
    var oldb = b
    var oldc = c
    var oldd = d

    a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936)
    d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586)
    c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819)
    b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330)
    a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897)
    d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426)
    c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341)
    b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983)
    a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416)
    d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417)
    c = md5_ff(c, d, a, b, x[i + 10], 17, -42063)
    b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162)
    a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682)
    d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101)
    c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290)
    b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329)

    a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510)
    d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632)
    c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713)
    b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302)
    a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691)
    d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083)
    c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335)
    b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848)
    a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438)
    d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690)
    c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961)
    b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501)
    a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467)
    d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784)
    c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473)
    b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734)

    a = md5_hh(a, b, c, d, x[i + 5], 4, -378558)
    d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463)
    c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562)
    b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556)
    a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060)
    d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353)
    c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632)
    b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640)
    a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174)
    d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222)
    c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979)
    b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189)
    a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487)
    d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835)
    c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520)
    b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651)

    a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844)
    d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415)
    c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905)
    b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055)
    a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571)
    d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606)
    c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523)
    b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799)
    a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359)
    d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744)
    c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380)
    b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649)
    a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070)
    d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379)
    c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259)
    b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551)

    a = safe_add(a, olda)
    b = safe_add(b, oldb)
    c = safe_add(c, oldc)
    d = safe_add(d, oldd)
  }

  return [a, b, c, d]
}

/*
 * These functions implement the four basic operations the algorithm uses.
 */
function md5_cmn (q, a, b, x, s, t) {
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b)
}

function md5_ff (a, b, c, d, x, s, t) {
  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t)
}

function md5_gg (a, b, c, d, x, s, t) {
  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t)
}

function md5_hh (a, b, c, d, x, s, t) {
  return md5_cmn(b ^ c ^ d, a, b, x, s, t)
}

function md5_ii (a, b, c, d, x, s, t) {
  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t)
}

/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
function safe_add (x, y) {
  var lsw = (x & 0xFFFF) + (y & 0xFFFF)
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
  return (msw << 16) | (lsw & 0xFFFF)
}

/*
 * Bitwise rotate a 32-bit number to the left.
 */
function bit_rol (num, cnt) {
  return (num << cnt) | (num >>> (32 - cnt))
}

module.exports = function md5 (buf) {
  return makeHash(buf, core_md5)
}

},{"./make-hash":248}],250:[function(require,module,exports){
(function (Buffer){(function (){
'use strict'
var Transform = require('stream').Transform
var inherits = require('inherits')

function HashBase (blockSize) {
  Transform.call(this)

  this._block = new Buffer(blockSize)
  this._blockSize = blockSize
  this._blockOffset = 0
  this._length = [0, 0, 0, 0]

  this._finalized = false
}

inherits(HashBase, Transform)

HashBase.prototype._transform = function (chunk, encoding, callback) {
  var error = null
  try {
    if (encoding !== 'buffer') chunk = new Buffer(chunk, encoding)
    this.update(chunk)
  } catch (err) {
    error = err
  }

  callback(error)
}

HashBase.prototype._flush = function (callback) {
  var error = null
  try {
    this.push(this._digest())
  } catch (err) {
    error = err
  }

  callback(error)
}

HashBase.prototype.update = function (data, encoding) {
  if (!Buffer.isBuffer(data) && typeof data !== 'string') throw new TypeError('Data must be a string or a buffer')
  if (this._finalized) throw new Error('Digest already called')
  if (!Buffer.isBuffer(data)) data = new Buffer(data, encoding || 'binary')

  // consume data
  var block = this._block
  var offset = 0
  while (this._blockOffset + data.length - offset >= this._blockSize) {
    for (var i = this._blockOffset; i < this._blockSize;) block[i++] = data[offset++]
    this._update()
    this._blockOffset = 0
  }
  while (offset < data.length) block[this._blockOffset++] = data[offset++]

  // update length
  for (var j = 0, carry = data.length * 8; carry > 0; ++j) {
    this._length[j] += carry
    carry = (this._length[j] / 0x0100000000) | 0
    if (carry > 0) this._length[j] -= 0x0100000000 * carry
  }

  return this
}

HashBase.prototype._update = function (data) {
  throw new Error('_update is not implemented')
}

HashBase.prototype.digest = function (encoding) {
  if (this._finalized) throw new Error('Digest already called')
  this._finalized = true

  var digest = this._digest()
  if (encoding !== undefined) digest = digest.toString(encoding)
  return digest
}

HashBase.prototype._digest = function () {
  throw new Error('_digest is not implemented')
}

module.exports = HashBase

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":83,"inherits":219,"stream":523}],251:[function(require,module,exports){
(function (Buffer){(function (){
'use strict'
var inherits = require('inherits')
var HashBase = require('hash-base')

function RIPEMD160 () {
  HashBase.call(this, 64)

  // state
  this._a = 0x67452301
  this._b = 0xefcdab89
  this._c = 0x98badcfe
  this._d = 0x10325476
  this._e = 0xc3d2e1f0
}

inherits(RIPEMD160, HashBase)

RIPEMD160.prototype._update = function () {
  var m = new Array(16)
  for (var i = 0; i < 16; ++i) m[i] = this._block.readInt32LE(i * 4)

  var al = this._a
  var bl = this._b
  var cl = this._c
  var dl = this._d
  var el = this._e

  // Mj = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
  // K = 0x00000000
  // Sj = 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8
  al = fn1(al, bl, cl, dl, el, m[0], 0x00000000, 11); cl = rotl(cl, 10)
  el = fn1(el, al, bl, cl, dl, m[1], 0x00000000, 14); bl = rotl(bl, 10)
  dl = fn1(dl, el, al, bl, cl, m[2], 0x00000000, 15); al = rotl(al, 10)
  cl = fn1(cl, dl, el, al, bl, m[3], 0x00000000, 12); el = rotl(el, 10)
  bl = fn1(bl, cl, dl, el, al, m[4], 0x00000000, 5); dl = rotl(dl, 10)
  al = fn1(al, bl, cl, dl, el, m[5], 0x00000000, 8); cl = rotl(cl, 10)
  el = fn1(el, al, bl, cl, dl, m[6], 0x00000000, 7); bl = rotl(bl, 10)
  dl = fn1(dl, el, al, bl, cl, m[7], 0x00000000, 9); al = rotl(al, 10)
  cl = fn1(cl, dl, el, al, bl, m[8], 0x00000000, 11); el = rotl(el, 10)
  bl = fn1(bl, cl, dl, el, al, m[9], 0x00000000, 13); dl = rotl(dl, 10)
  al = fn1(al, bl, cl, dl, el, m[10], 0x00000000, 14); cl = rotl(cl, 10)
  el = fn1(el, al, bl, cl, dl, m[11], 0x00000000, 15); bl = rotl(bl, 10)
  dl = fn1(dl, el, al, bl, cl, m[12], 0x00000000, 6); al = rotl(al, 10)
  cl = fn1(cl, dl, el, al, bl, m[13], 0x00000000, 7); el = rotl(el, 10)
  bl = fn1(bl, cl, dl, el, al, m[14], 0x00000000, 9); dl = rotl(dl, 10)
  al = fn1(al, bl, cl, dl, el, m[15], 0x00000000, 8); cl = rotl(cl, 10)

  // Mj = 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8
  // K = 0x5a827999
  // Sj = 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12
  el = fn2(el, al, bl, cl, dl, m[7], 0x5a827999, 7); bl = rotl(bl, 10)
  dl = fn2(dl, el, al, bl, cl, m[4], 0x5a827999, 6); al = rotl(al, 10)
  cl = fn2(cl, dl, el, al, bl, m[13], 0x5a827999, 8); el = rotl(el, 10)
  bl = fn2(bl, cl, dl, el, al, m[1], 0x5a827999, 13); dl = rotl(dl, 10)
  al = fn2(al, bl, cl, dl, el, m[10], 0x5a827999, 11); cl = rotl(cl, 10)
  el = fn2(el, al, bl, cl, dl, m[6], 0x5a827999, 9); bl = rotl(bl, 10)
  dl = fn2(dl, el, al, bl, cl, m[15], 0x5a827999, 7); al = rotl(al, 10)
  cl = fn2(cl, dl, el, al, bl, m[3], 0x5a827999, 15); el = rotl(el, 10)
  bl = fn2(bl, cl, dl, el, al, m[12], 0x5a827999, 7); dl = rotl(dl, 10)
  al = fn2(al, bl, cl, dl, el, m[0], 0x5a827999, 12); cl = rotl(cl, 10)
  el = fn2(el, al, bl, cl, dl, m[9], 0x5a827999, 15); bl = rotl(bl, 10)
  dl = fn2(dl, el, al, bl, cl, m[5], 0x5a827999, 9); al = rotl(al, 10)
  cl = fn2(cl, dl, el, al, bl, m[2], 0x5a827999, 11); el = rotl(el, 10)
  bl = fn2(bl, cl, dl, el, al, m[14], 0x5a827999, 7); dl = rotl(dl, 10)
  al = fn2(al, bl, cl, dl, el, m[11], 0x5a827999, 13); cl = rotl(cl, 10)
  el = fn2(el, al, bl, cl, dl, m[8], 0x5a827999, 12); bl = rotl(bl, 10)

  // Mj = 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12
  // K = 0x6ed9eba1
  // Sj = 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5
  dl = fn3(dl, el, al, bl, cl, m[3], 0x6ed9eba1, 11); al = rotl(al, 10)
  cl = fn3(cl, dl, el, al, bl, m[10], 0x6ed9eba1, 13); el = rotl(el, 10)
  bl = fn3(bl, cl, dl, el, al, m[14], 0x6ed9eba1, 6); dl = rotl(dl, 10)
  al = fn3(al, bl, cl, dl, el, m[4], 0x6ed9eba1, 7); cl = rotl(cl, 10)
  el = fn3(el, al, bl, cl, dl, m[9], 0x6ed9eba1, 14); bl = rotl(bl, 10)
  dl = fn3(dl, el, al, bl, cl, m[15], 0x6ed9eba1, 9); al = rotl(al, 10)
  cl = fn3(cl, dl, el, al, bl, m[8], 0x6ed9eba1, 13); el = rotl(el, 10)
  bl = fn3(bl, cl, dl, el, al, m[1], 0x6ed9eba1, 15); dl = rotl(dl, 10)
  al = fn3(al, bl, cl, dl, el, m[2], 0x6ed9eba1, 14); cl = rotl(cl, 10)
  el = fn3(el, al, bl, cl, dl, m[7], 0x6ed9eba1, 8); bl = rotl(bl, 10)
  dl = fn3(dl, el, al, bl, cl, m[0], 0x6ed9eba1, 13); al = rotl(al, 10)
  cl = fn3(cl, dl, el, al, bl, m[6], 0x6ed9eba1, 6); el = rotl(el, 10)
  bl = fn3(bl, cl, dl, el, al, m[13], 0x6ed9eba1, 5); dl = rotl(dl, 10)
  al = fn3(al, bl, cl, dl, el, m[11], 0x6ed9eba1, 12); cl = rotl(cl, 10)
  el = fn3(el, al, bl, cl, dl, m[5], 0x6ed9eba1, 7); bl = rotl(bl, 10)
  dl = fn3(dl, el, al, bl, cl, m[12], 0x6ed9eba1, 5); al = rotl(al, 10)

  // Mj = 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2
  // K = 0x8f1bbcdc
  // Sj = 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12
  cl = fn4(cl, dl, el, al, bl, m[1], 0x8f1bbcdc, 11); el = rotl(el, 10)
  bl = fn4(bl, cl, dl, el, al, m[9], 0x8f1bbcdc, 12); dl = rotl(dl, 10)
  al = fn4(al, bl, cl, dl, el, m[11], 0x8f1bbcdc, 14); cl = rotl(cl, 10)
  el = fn4(el, al, bl, cl, dl, m[10], 0x8f1bbcdc, 15); bl = rotl(bl, 10)
  dl = fn4(dl, el, al, bl, cl, m[0], 0x8f1bbcdc, 14); al = rotl(al, 10)
  cl = fn4(cl, dl, el, al, bl, m[8], 0x8f1bbcdc, 15); el = rotl(el, 10)
  bl = fn4(bl, cl, dl, el, al, m[12], 0x8f1bbcdc, 9); dl = rotl(dl, 10)
  al = fn4(al, bl, cl, dl, el, m[4], 0x8f1bbcdc, 8); cl = rotl(cl, 10)
  el = fn4(el, al, bl, cl, dl, m[13], 0x8f1bbcdc, 9); bl = rotl(bl, 10)
  dl = fn4(dl, el, al, bl, cl, m[3], 0x8f1bbcdc, 14); al = rotl(al, 10)
  cl = fn4(cl, dl, el, al, bl, m[7], 0x8f1bbcdc, 5); el = rotl(el, 10)
  bl = fn4(bl, cl, dl, el, al, m[15], 0x8f1bbcdc, 6); dl = rotl(dl, 10)
  al = fn4(al, bl, cl, dl, el, m[14], 0x8f1bbcdc, 8); cl = rotl(cl, 10)
  el = fn4(el, al, bl, cl, dl, m[5], 0x8f1bbcdc, 6); bl = rotl(bl, 10)
  dl = fn4(dl, el, al, bl, cl, m[6], 0x8f1bbcdc, 5); al = rotl(al, 10)
  cl = fn4(cl, dl, el, al, bl, m[2], 0x8f1bbcdc, 12); el = rotl(el, 10)

  // Mj = 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
  // K = 0xa953fd4e
  // Sj = 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
  bl = fn5(bl, cl, dl, el, al, m[4], 0xa953fd4e, 9); dl = rotl(dl, 10)
  al = fn5(al, bl, cl, dl, el, m[0], 0xa953fd4e, 15); cl = rotl(cl, 10)
  el = fn5(el, al, bl, cl, dl, m[5], 0xa953fd4e, 5); bl = rotl(bl, 10)
  dl = fn5(dl, el, al, bl, cl, m[9], 0xa953fd4e, 11); al = rotl(al, 10)
  cl = fn5(cl, dl, el, al, bl, m[7], 0xa953fd4e, 6); el = rotl(el, 10)
  bl = fn5(bl, cl, dl, el, al, m[12], 0xa953fd4e, 8); dl = rotl(dl, 10)
  al = fn5(al, bl, cl, dl, el, m[2], 0xa953fd4e, 13); cl = rotl(cl, 10)
  el = fn5(el, al, bl, cl, dl, m[10], 0xa953fd4e, 12); bl = rotl(bl, 10)
  dl = fn5(dl, el, al, bl, cl, m[14], 0xa953fd4e, 5); al = rotl(al, 10)
  cl = fn5(cl, dl, el, al, bl, m[1], 0xa953fd4e, 12); el = rotl(el, 10)
  bl = fn5(bl, cl, dl, el, al, m[3], 0xa953fd4e, 13); dl = rotl(dl, 10)
  al = fn5(al, bl, cl, dl, el, m[8], 0xa953fd4e, 14); cl = rotl(cl, 10)
  el = fn5(el, al, bl, cl, dl, m[11], 0xa953fd4e, 11); bl = rotl(bl, 10)
  dl = fn5(dl, el, al, bl, cl, m[6], 0xa953fd4e, 8); al = rotl(al, 10)
  cl = fn5(cl, dl, el, al, bl, m[15], 0xa953fd4e, 5); el = rotl(el, 10)
  bl = fn5(bl, cl, dl, el, al, m[13], 0xa953fd4e, 6); dl = rotl(dl, 10)

  var ar = this._a
  var br = this._b
  var cr = this._c
  var dr = this._d
  var er = this._e

  // M'j = 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12
  // K' = 0x50a28be6
  // S'j = 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6
  ar = fn5(ar, br, cr, dr, er, m[5], 0x50a28be6, 8); cr = rotl(cr, 10)
  er = fn5(er, ar, br, cr, dr, m[14], 0x50a28be6, 9); br = rotl(br, 10)
  dr = fn5(dr, er, ar, br, cr, m[7], 0x50a28be6, 9); ar = rotl(ar, 10)
  cr = fn5(cr, dr, er, ar, br, m[0], 0x50a28be6, 11); er = rotl(er, 10)
  br = fn5(br, cr, dr, er, ar, m[9], 0x50a28be6, 13); dr = rotl(dr, 10)
  ar = fn5(ar, br, cr, dr, er, m[2], 0x50a28be6, 15); cr = rotl(cr, 10)
  er = fn5(er, ar, br, cr, dr, m[11], 0x50a28be6, 15); br = rotl(br, 10)
  dr = fn5(dr, er, ar, br, cr, m[4], 0x50a28be6, 5); ar = rotl(ar, 10)
  cr = fn5(cr, dr, er, ar, br, m[13], 0x50a28be6, 7); er = rotl(er, 10)
  br = fn5(br, cr, dr, er, ar, m[6], 0x50a28be6, 7); dr = rotl(dr, 10)
  ar = fn5(ar, br, cr, dr, er, m[15], 0x50a28be6, 8); cr = rotl(cr, 10)
  er = fn5(er, ar, br, cr, dr, m[8], 0x50a28be6, 11); br = rotl(br, 10)
  dr = fn5(dr, er, ar, br, cr, m[1], 0x50a28be6, 14); ar = rotl(ar, 10)
  cr = fn5(cr, dr, er, ar, br, m[10], 0x50a28be6, 14); er = rotl(er, 10)
  br = fn5(br, cr, dr, er, ar, m[3], 0x50a28be6, 12); dr = rotl(dr, 10)
  ar = fn5(ar, br, cr, dr, er, m[12], 0x50a28be6, 6); cr = rotl(cr, 10)

  // M'j = 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2
  // K' = 0x5c4dd124
  // S'j = 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11
  er = fn4(er, ar, br, cr, dr, m[6], 0x5c4dd124, 9); br = rotl(br, 10)
  dr = fn4(dr, er, ar, br, cr, m[11], 0x5c4dd124, 13); ar = rotl(ar, 10)
  cr = fn4(cr, dr, er, ar, br, m[3], 0x5c4dd124, 15); er = rotl(er, 10)
  br = fn4(br, cr, dr, er, ar, m[7], 0x5c4dd124, 7); dr = rotl(dr, 10)
  ar = fn4(ar, br, cr, dr, er, m[0], 0x5c4dd124, 12); cr = rotl(cr, 10)
  er = fn4(er, ar, br, cr, dr, m[13], 0x5c4dd124, 8); br = rotl(br, 10)
  dr = fn4(dr, er, ar, br, cr, m[5], 0x5c4dd124, 9); ar = rotl(ar, 10)
  cr = fn4(cr, dr, er, ar, br, m[10], 0x5c4dd124, 11); er = rotl(er, 10)
  br = fn4(br, cr, dr, er, ar, m[14], 0x5c4dd124, 7); dr = rotl(dr, 10)
  ar = fn4(ar, br, cr, dr, er, m[15], 0x5c4dd124, 7); cr = rotl(cr, 10)
  er = fn4(er, ar, br, cr, dr, m[8], 0x5c4dd124, 12); br = rotl(br, 10)
  dr = fn4(dr, er, ar, br, cr, m[12], 0x5c4dd124, 7); ar = rotl(ar, 10)
  cr = fn4(cr, dr, er, ar, br, m[4], 0x5c4dd124, 6); er = rotl(er, 10)
  br = fn4(br, cr, dr, er, ar, m[9], 0x5c4dd124, 15); dr = rotl(dr, 10)
  ar = fn4(ar, br, cr, dr, er, m[1], 0x5c4dd124, 13); cr = rotl(cr, 10)
  er = fn4(er, ar, br, cr, dr, m[2], 0x5c4dd124, 11); br = rotl(br, 10)

  // M'j = 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13
  // K' = 0x6d703ef3
  // S'j = 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5
  dr = fn3(dr, er, ar, br, cr, m[15], 0x6d703ef3, 9); ar = rotl(ar, 10)
  cr = fn3(cr, dr, er, ar, br, m[5], 0x6d703ef3, 7); er = rotl(er, 10)
  br = fn3(br, cr, dr, er, ar, m[1], 0x6d703ef3, 15); dr = rotl(dr, 10)
  ar = fn3(ar, br, cr, dr, er, m[3], 0x6d703ef3, 11); cr = rotl(cr, 10)
  er = fn3(er, ar, br, cr, dr, m[7], 0x6d703ef3, 8); br = rotl(br, 10)
  dr = fn3(dr, er, ar, br, cr, m[14], 0x6d703ef3, 6); ar = rotl(ar, 10)
  cr = fn3(cr, dr, er, ar, br, m[6], 0x6d703ef3, 6); er = rotl(er, 10)
  br = fn3(br, cr, dr, er, ar, m[9], 0x6d703ef3, 14); dr = rotl(dr, 10)
  ar = fn3(ar, br, cr, dr, er, m[11], 0x6d703ef3, 12); cr = rotl(cr, 10)
  er = fn3(er, ar, br, cr, dr, m[8], 0x6d703ef3, 13); br = rotl(br, 10)
  dr = fn3(dr, er, ar, br, cr, m[12], 0x6d703ef3, 5); ar = rotl(ar, 10)
  cr = fn3(cr, dr, er, ar, br, m[2], 0x6d703ef3, 14); er = rotl(er, 10)
  br = fn3(br, cr, dr, er, ar, m[10], 0x6d703ef3, 13); dr = rotl(dr, 10)
  ar = fn3(ar, br, cr, dr, er, m[0], 0x6d703ef3, 13); cr = rotl(cr, 10)
  er = fn3(er, ar, br, cr, dr, m[4], 0x6d703ef3, 7); br = rotl(br, 10)
  dr = fn3(dr, er, ar, br, cr, m[13], 0x6d703ef3, 5); ar = rotl(ar, 10)

  // M'j = 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14
  // K' = 0x7a6d76e9
  // S'j = 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8
  cr = fn2(cr, dr, er, ar, br, m[8], 0x7a6d76e9, 15); er = rotl(er, 10)
  br = fn2(br, cr, dr, er, ar, m[6], 0x7a6d76e9, 5); dr = rotl(dr, 10)
  ar = fn2(ar, br, cr, dr, er, m[4], 0x7a6d76e9, 8); cr = rotl(cr, 10)
  er = fn2(er, ar, br, cr, dr, m[1], 0x7a6d76e9, 11); br = rotl(br, 10)
  dr = fn2(dr, er, ar, br, cr, m[3], 0x7a6d76e9, 14); ar = rotl(ar, 10)
  cr = fn2(cr, dr, er, ar, br, m[11], 0x7a6d76e9, 14); er = rotl(er, 10)
  br = fn2(br, cr, dr, er, ar, m[15], 0x7a6d76e9, 6); dr = rotl(dr, 10)
  ar = fn2(ar, br, cr, dr, er, m[0], 0x7a6d76e9, 14); cr = rotl(cr, 10)
  er = fn2(er, ar, br, cr, dr, m[5], 0x7a6d76e9, 6); br = rotl(br, 10)
  dr = fn2(dr, er, ar, br, cr, m[12], 0x7a6d76e9, 9); ar = rotl(ar, 10)
  cr = fn2(cr, dr, er, ar, br, m[2], 0x7a6d76e9, 12); er = rotl(er, 10)
  br = fn2(br, cr, dr, er, ar, m[13], 0x7a6d76e9, 9); dr = rotl(dr, 10)
  ar = fn2(ar, br, cr, dr, er, m[9], 0x7a6d76e9, 12); cr = rotl(cr, 10)
  er = fn2(er, ar, br, cr, dr, m[7], 0x7a6d76e9, 5); br = rotl(br, 10)
  dr = fn2(dr, er, ar, br, cr, m[10], 0x7a6d76e9, 15); ar = rotl(ar, 10)
  cr = fn2(cr, dr, er, ar, br, m[14], 0x7a6d76e9, 8); er = rotl(er, 10)

  // M'j = 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
  // K' = 0x00000000
  // S'j = 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
  br = fn1(br, cr, dr, er, ar, m[12], 0x00000000, 8); dr = rotl(dr, 10)
  ar = fn1(ar, br, cr, dr, er, m[15], 0x00000000, 5); cr = rotl(cr, 10)
  er = fn1(er, ar, br, cr, dr, m[10], 0x00000000, 12); br = rotl(br, 10)
  dr = fn1(dr, er, ar, br, cr, m[4], 0x00000000, 9); ar = rotl(ar, 10)
  cr = fn1(cr, dr, er, ar, br, m[1], 0x00000000, 12); er = rotl(er, 10)
  br = fn1(br, cr, dr, er, ar, m[5], 0x00000000, 5); dr = rotl(dr, 10)
  ar = fn1(ar, br, cr, dr, er, m[8], 0x00000000, 14); cr = rotl(cr, 10)
  er = fn1(er, ar, br, cr, dr, m[7], 0x00000000, 6); br = rotl(br, 10)
  dr = fn1(dr, er, ar, br, cr, m[6], 0x00000000, 8); ar = rotl(ar, 10)
  cr = fn1(cr, dr, er, ar, br, m[2], 0x00000000, 13); er = rotl(er, 10)
  br = fn1(br, cr, dr, er, ar, m[13], 0x00000000, 6); dr = rotl(dr, 10)
  ar = fn1(ar, br, cr, dr, er, m[14], 0x00000000, 5); cr = rotl(cr, 10)
  er = fn1(er, ar, br, cr, dr, m[0], 0x00000000, 15); br = rotl(br, 10)
  dr = fn1(dr, er, ar, br, cr, m[3], 0x00000000, 13); ar = rotl(ar, 10)
  cr = fn1(cr, dr, er, ar, br, m[9], 0x00000000, 11); er = rotl(er, 10)
  br = fn1(br, cr, dr, er, ar, m[11], 0x00000000, 11); dr = rotl(dr, 10)

  // change state
  var t = (this._b + cl + dr) | 0
  this._b = (this._c + dl + er) | 0
  this._c = (this._d + el + ar) | 0
  this._d = (this._e + al + br) | 0
  this._e = (this._a + bl + cr) | 0
  this._a = t
}

RIPEMD160.prototype._digest = function () {
  // create padding and handle blocks
  this._block[this._blockOffset++] = 0x80
  if (this._blockOffset > 56) {
    this._block.fill(0, this._blockOffset, 64)
    this._update()
    this._blockOffset = 0
  }

  this._block.fill(0, this._blockOffset, 56)
  this._block.writeUInt32LE(this._length[0], 56)
  this._block.writeUInt32LE(this._length[1], 60)
  this._update()

  // produce result
  var buffer = new Buffer(20)
  buffer.writeInt32LE(this._a, 0)
  buffer.writeInt32LE(this._b, 4)
  buffer.writeInt32LE(this._c, 8)
  buffer.writeInt32LE(this._d, 12)
  buffer.writeInt32LE(this._e, 16)
  return buffer
}

function rotl (x, n) {
  return (x << n) | (x >>> (32 - n))
}

function fn1 (a, b, c, d, e, m, k, s) {
  return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + e) | 0
}

function fn2 (a, b, c, d, e, m, k, s) {
  return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + e) | 0
}

function fn3 (a, b, c, d, e, m, k, s) {
  return (rotl((a + ((b | (~c)) ^ d) + m + k) | 0, s) + e) | 0
}

function fn4 (a, b, c, d, e, m, k, s) {
  return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + e) | 0
}

function fn5 (a, b, c, d, e, m, k, s) {
  return (rotl((a + (b ^ (c | (~d))) + m + k) | 0, s) + e) | 0
}

module.exports = RIPEMD160

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":83,"hash-base":250,"inherits":219}],252:[function(require,module,exports){
'use strict';

/** @type {import('.')} */
module.exports = [
	'Float32Array',
	'Float64Array',
	'Int8Array',
	'Int16Array',
	'Int32Array',
	'Uint8Array',
	'Uint8ClampedArray',
	'Uint16Array',
	'Uint32Array',
	'BigInt64Array',
	'BigUint64Array'
];

},{}],253:[function(require,module,exports){
(function (process){(function (){
'use strict';

if (typeof process === 'undefined' ||
    !process.version ||
    process.version.indexOf('v0.') === 0 ||
    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
  module.exports = { nextTick: nextTick };
} else {
  module.exports = process
}

function nextTick(fn, arg1, arg2, arg3) {
  if (typeof fn !== 'function') {
    throw new TypeError('"callback" argument must be a function');
  }
  var len = arguments.length;
  var args, i;
  switch (len) {
  case 0:
  case 1:
    return process.nextTick(fn);
  case 2:
    return process.nextTick(function afterTickOne() {
      fn.call(null, arg1);
    });
  case 3:
    return process.nextTick(function afterTickTwo() {
      fn.call(null, arg1, arg2);
    });
  case 4:
    return process.nextTick(function afterTickThree() {
      fn.call(null, arg1, arg2, arg3);
    });
  default:
    args = new Array(len - 1);
    i = 0;
    while (i < args.length) {
      args[i++] = arguments[i];
    }
    return process.nextTick(function afterTick() {
      fn.apply(null, args);
    });
  }
}


}).call(this)}).call(this,require('_process'))
},{"_process":254}],254:[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; };

},{}],255:[function(require,module,exports){
// minimal library entry point.

"use strict";
module.exports = require("./src/index-minimal");

},{"./src/index-minimal":256}],256:[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":257,"./reader_buffer":258,"./roots":259,"./rpc":260,"./util/minimal":263,"./writer":264,"./writer_buffer":265}],257:[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);
    return start === end // fix for IE 10/Win8 and others' subarray returning array of size 1
        ? new this.buf.constructor(0)
        : 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;
};

/**
 * Skips the next element of the specified wire type.
 * @param {number} wireType Wire type received
 * @returns {Reader} `this`
 */
Reader.prototype.skipType = function(wireType) {
    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);
            }
            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":263}],258:[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":257,"./util/minimal":263}],259:[function(require,module,exports){
"use strict";
module.exports = {};

/**
 * 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 accross 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"];
 */

},{}],260:[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":261}],261:[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":263}],262:[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":263}],263:[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");

// requires modules optionally and hides the call from bundlers
util.inquire = require("@protobufjs/inquire");

// 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");

/**
 * 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 && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins
        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.inquire("buffer").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
         || util.inquire("long");

/**
 * 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,*>} src Source object
 * @param {boolean} [ifNotSet=false] Merges only if the key is not already set
 * @returns {Object.<string,*>} Destination object
 */
function merge(dst, src, ifNotSet) { // used by converters
    for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)
        if (dst[keys[i]] === undefined || !ifNotSet)
            dst[keys[i]] = src[keys[i]];
    return dst;
}

util.merge = merge;

/**
 * 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 = CustomError;

    Object.defineProperty(CustomError.prototype, "name", { get: function() { return name; } });

    CustomError.prototype.toString = function toString() {
        return this.name + ": " + this.message;
    };

    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":262,"@protobufjs/aspromise":28,"@protobufjs/base64":29,"@protobufjs/eventemitter":30,"@protobufjs/float":31,"@protobufjs/inquire":32,"@protobufjs/pool":33,"@protobufjs/utf8":34}],264:[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
        ? 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) {
    while (val.hi) {
        buf[pos++] = val.lo & 127 | 128;
        val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;
        val.hi >>>= 7;
    }
    while (val.lo > 127) {
        buf[pos++] = val.lo & 127 | 128;
        val.lo = val.lo >>> 7;
    }
    buf[pos++] = val.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":263}],265:[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":263,"./writer":264}],266:[function(require,module,exports){
exports.publicEncrypt = require('./publicEncrypt')
exports.privateDecrypt = require('./privateDecrypt')

exports.privateEncrypt = function privateEncrypt (key, buf) {
  return exports.publicEncrypt(key, buf, true)
}

exports.publicDecrypt = function publicDecrypt (key, buf) {
  return exports.privateDecrypt(key, buf, true)
}

},{"./privateDecrypt":269,"./publicEncrypt":270}],267:[function(require,module,exports){
var createHash = require('create-hash')
var Buffer = require('safe-buffer').Buffer

module.exports = function (seed, len) {
  var t = Buffer.alloc(0)
  var i = 0
  var c
  while (t.length < len) {
    c = i2ops(i++)
    t = Buffer.concat([t, createHash('sha1').update(seed).update(c).digest()])
  }
  return t.slice(0, len)
}

function i2ops (c) {
  var out = Buffer.allocUnsafe(4)
  out.writeUInt32BE(c, 0)
  return out
}

},{"create-hash":144,"safe-buffer":513}],268:[function(require,module,exports){
arguments[4][49][0].apply(exports,arguments)
},{"buffer":54,"dup":49}],269:[function(require,module,exports){
var parseKeys = require('parse-asn1')
var mgf = require('./mgf')
var xor = require('./xor')
var BN = require('bn.js')
var crt = require('browserify-rsa')
var createHash = require('create-hash')
var withPublic = require('./withPublic')
var Buffer = require('safe-buffer').Buffer

module.exports = function privateDecrypt (privateKey, enc, reverse) {
  var padding
  if (privateKey.padding) {
    padding = privateKey.padding
  } else if (reverse) {
    padding = 1
  } else {
    padding = 4
  }

  var key = parseKeys(privateKey)
  var k = key.modulus.byteLength()
  if (enc.length > k || new BN(enc).cmp(key.modulus) >= 0) {
    throw new Error('decryption error')
  }
  var msg
  if (reverse) {
    msg = withPublic(new BN(enc), key)
  } else {
    msg = crt(enc, key)
  }
  var zBuffer = Buffer.alloc(k - msg.length)
  msg = Buffer.concat([zBuffer, msg], k)
  if (padding === 4) {
    return oaep(key, msg)
  } else if (padding === 1) {
    return pkcs1(key, msg, reverse)
  } else if (padding === 3) {
    return msg
  } else {
    throw new Error('unknown padding')
  }
}

function oaep (key, msg) {
  var k = key.modulus.byteLength()
  var iHash = createHash('sha1').update(Buffer.alloc(0)).digest()
  var hLen = iHash.length
  if (msg[0] !== 0) {
    throw new Error('decryption error')
  }
  var maskedSeed = msg.slice(1, hLen + 1)
  var maskedDb = msg.slice(hLen + 1)
  var seed = xor(maskedSeed, mgf(maskedDb, hLen))
  var db = xor(maskedDb, mgf(seed, k - hLen - 1))
  if (compare(iHash, db.slice(0, hLen))) {
    throw new Error('decryption error')
  }
  var i = hLen
  while (db[i] === 0) {
    i++
  }
  if (db[i++] !== 1) {
    throw new Error('decryption error')
  }
  return db.slice(i)
}

function pkcs1 (key, msg, reverse) {
  var p1 = msg.slice(0, 2)
  var i = 2
  var status = 0
  while (msg[i++] !== 0) {
    if (i >= msg.length) {
      status++
      break
    }
  }
  var ps = msg.slice(2, i - 1)

  if ((p1.toString('hex') !== '0002' && !reverse) || (p1.toString('hex') !== '0001' && reverse)) {
    status++
  }
  if (ps.length < 8) {
    status++
  }
  if (status) {
    throw new Error('decryption error')
  }
  return msg.slice(i)
}
function compare (a, b) {
  a = Buffer.from(a)
  b = Buffer.from(b)
  var dif = 0
  var len = a.length
  if (a.length !== b.length) {
    dif++
    len = Math.min(a.length, b.length)
  }
  var i = -1
  while (++i < len) {
    dif += (a[i] ^ b[i])
  }
  return dif
}

},{"./mgf":267,"./withPublic":271,"./xor":272,"bn.js":268,"browserify-rsa":75,"create-hash":144,"parse-asn1":241,"safe-buffer":513}],270:[function(require,module,exports){
var parseKeys = require('parse-asn1')
var randomBytes = require('randombytes')
var createHash = require('create-hash')
var mgf = require('./mgf')
var xor = require('./xor')
var BN = require('bn.js')
var withPublic = require('./withPublic')
var crt = require('browserify-rsa')
var Buffer = require('safe-buffer').Buffer

module.exports = function publicEncrypt (publicKey, msg, reverse) {
  var padding
  if (publicKey.padding) {
    padding = publicKey.padding
  } else if (reverse) {
    padding = 1
  } else {
    padding = 4
  }
  var key = parseKeys(publicKey)
  var paddedMsg
  if (padding === 4) {
    paddedMsg = oaep(key, msg)
  } else if (padding === 1) {
    paddedMsg = pkcs1(key, msg, reverse)
  } else if (padding === 3) {
    paddedMsg = new BN(msg)
    if (paddedMsg.cmp(key.modulus) >= 0) {
      throw new Error('data too long for modulus')
    }
  } else {
    throw new Error('unknown padding')
  }
  if (reverse) {
    return crt(paddedMsg, key)
  } else {
    return withPublic(paddedMsg, key)
  }
}

function oaep (key, msg) {
  var k = key.modulus.byteLength()
  var mLen = msg.length
  var iHash = createHash('sha1').update(Buffer.alloc(0)).digest()
  var hLen = iHash.length
  var hLen2 = 2 * hLen
  if (mLen > k - hLen2 - 2) {
    throw new Error('message too long')
  }
  var ps = Buffer.alloc(k - mLen - hLen2 - 2)
  var dblen = k - hLen - 1
  var seed = randomBytes(hLen)
  var maskedDb = xor(Buffer.concat([iHash, ps, Buffer.alloc(1, 1), msg], dblen), mgf(seed, dblen))
  var maskedSeed = xor(seed, mgf(maskedDb, hLen))
  return new BN(Buffer.concat([Buffer.alloc(1), maskedSeed, maskedDb], k))
}
function pkcs1 (key, msg, reverse) {
  var mLen = msg.length
  var k = key.modulus.byteLength()
  if (mLen > k - 11) {
    throw new Error('message too long')
  }
  var ps
  if (reverse) {
    ps = Buffer.alloc(k - mLen - 3, 0xff)
  } else {
    ps = nonZero(k - mLen - 3)
  }
  return new BN(Buffer.concat([Buffer.from([0, reverse ? 1 : 2]), ps, Buffer.alloc(1), msg], k))
}
function nonZero (len) {
  var out = Buffer.allocUnsafe(len)
  var i = 0
  var cache = randomBytes(len * 2)
  var cur = 0
  var num
  while (i < len) {
    if (cur === cache.length) {
      cache = randomBytes(len * 2)
      cur = 0
    }
    num = cache[cur++]
    if (num) {
      out[i++] = num
    }
  }
  return out
}

},{"./mgf":267,"./withPublic":271,"./xor":272,"bn.js":268,"browserify-rsa":75,"create-hash":144,"parse-asn1":241,"randombytes":273,"safe-buffer":513}],271:[function(require,module,exports){
var BN = require('bn.js')
var Buffer = require('safe-buffer').Buffer

function withPublic (paddedMsg, key) {
  return Buffer.from(paddedMsg
    .toRed(BN.mont(key.modulus))
    .redPow(new BN(key.publicExponent))
    .fromRed()
    .toArray())
}

module.exports = withPublic

},{"bn.js":268,"safe-buffer":513}],272:[function(require,module,exports){
module.exports = function xor (a, b) {
  var len = a.length
  var i = -1
  while (++i < len) {
    a[i] ^= b[i]
  }
  return a
}

},{}],273:[function(require,module,exports){
(function (process,global){(function (){
'use strict'

// limit of Crypto.getRandomValues()
// https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues
var MAX_BYTES = 65536

// Node supports requesting up to this number of bytes
// https://github.com/nodejs/node/blob/master/lib/internal/crypto/random.js#L48
var MAX_UINT32 = 4294967295

function oldBrowser () {
  throw new Error('Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11')
}

var Buffer = require('safe-buffer').Buffer
var crypto = global.crypto || global.msCrypto

if (crypto && crypto.getRandomValues) {
  module.exports = randomBytes
} else {
  module.exports = oldBrowser
}

function randomBytes (size, cb) {
  // phantomjs needs to throw
  if (size > MAX_UINT32) throw new RangeError('requested too many random bytes')

  var bytes = Buffer.allocUnsafe(size)

  if (size > 0) {  // getRandomValues fails on IE if size == 0
    if (size > MAX_BYTES) { // this is the max bytes crypto.getRandomValues
      // can do at once see https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues
      for (var generated = 0; generated < size; generated += MAX_BYTES) {
        // buffer.slice automatically checks if the end is past the end of
        // the buffer so we don't have to here
        crypto.getRandomValues(bytes.slice(generated, generated + MAX_BYTES))
      }
    } else {
      crypto.getRandomValues(bytes)
    }
  }

  if (typeof cb === 'function') {
    return process.nextTick(function () {
      cb(null, bytes)
    })
  }

  return bytes
}

}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"_process":254,"safe-buffer":513}],274:[function(require,module,exports){
(function (process,global){(function (){
'use strict'

function oldBrowser () {
  throw new Error('secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11')
}
var safeBuffer = require('safe-buffer')
var randombytes = require('randombytes')
var Buffer = safeBuffer.Buffer
var kBufferMaxLength = safeBuffer.kMaxLength
var crypto = global.crypto || global.msCrypto
var kMaxUint32 = Math.pow(2, 32) - 1
function assertOffset (offset, length) {
  if (typeof offset !== 'number' || offset !== offset) { // eslint-disable-line no-self-compare
    throw new TypeError('offset must be a number')
  }

  if (offset > kMaxUint32 || offset < 0) {
    throw new TypeError('offset must be a uint32')
  }

  if (offset > kBufferMaxLength || offset > length) {
    throw new RangeError('offset out of range')
  }
}

function assertSize (size, offset, length) {
  if (typeof size !== 'number' || size !== size) { // eslint-disable-line no-self-compare
    throw new TypeError('size must be a number')
  }

  if (size > kMaxUint32 || size < 0) {
    throw new TypeError('size must be a uint32')
  }

  if (size + offset > length || size > kBufferMaxLength) {
    throw new RangeError('buffer too small')
  }
}
if ((crypto && crypto.getRandomValues) || !process.browser) {
  exports.randomFill = randomFill
  exports.randomFillSync = randomFillSync
} else {
  exports.randomFill = oldBrowser
  exports.randomFillSync = oldBrowser
}
function randomFill (buf, offset, size, cb) {
  if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) {
    throw new TypeError('"buf" argument must be a Buffer or Uint8Array')
  }

  if (typeof offset === 'function') {
    cb = offset
    offset = 0
    size = buf.length
  } else if (typeof size === 'function') {
    cb = size
    size = buf.length - offset
  } else if (typeof cb !== 'function') {
    throw new TypeError('"cb" argument must be a function')
  }
  assertOffset(offset, buf.length)
  assertSize(size, offset, buf.length)
  return actualFill(buf, offset, size, cb)
}

function actualFill (buf, offset, size, cb) {
  if (process.browser) {
    var ourBuf = buf.buffer
    var uint = new Uint8Array(ourBuf, offset, size)
    crypto.getRandomValues(uint)
    if (cb) {
      process.nextTick(function () {
        cb(null, buf)
      })
      return
    }
    return buf
  }
  if (cb) {
    randombytes(size, function (err, bytes) {
      if (err) {
        return cb(err)
      }
      bytes.copy(buf, offset)
      cb(null, buf)
    })
    return
  }
  var bytes = randombytes(size)
  bytes.copy(buf, offset)
  return buf
}
function randomFillSync (buf, offset, size) {
  if (typeof offset === 'undefined') {
    offset = 0
  }
  if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) {
    throw new TypeError('"buf" argument must be a Buffer or Uint8Array')
  }

  assertOffset(offset, buf.length)

  if (size === undefined) size = buf.length - offset

  assertSize(size, offset, buf.length)

  return actualFill(buf, offset, size)
}

}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"_process":254,"randombytes":273,"safe-buffer":513}],275:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a duplex stream is just a stream that is both readable and writable.
// Since JS doesn't have multiple prototypal inheritance, this class
// prototypally inherits from Readable, and then parasitically from
// Writable.

'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

/*<replacement>*/
var objectKeys = Object.keys || function (obj) {
  var keys = [];
  for (var key in obj) {
    keys.push(key);
  }return keys;
};
/*</replacement>*/

module.exports = Duplex;

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

var Readable = require('./_stream_readable');
var Writable = require('./_stream_writable');

util.inherits(Duplex, Readable);

{
  // avoid scope creep, the keys array can then be collected
  var keys = objectKeys(Writable.prototype);
  for (var v = 0; v < keys.length; v++) {
    var method = keys[v];
    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
  }
}

function Duplex(options) {
  if (!(this instanceof Duplex)) return new Duplex(options);

  Readable.call(this, options);
  Writable.call(this, options);

  if (options && options.readable === false) this.readable = false;

  if (options && options.writable === false) this.writable = false;

  this.allowHalfOpen = true;
  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;

  this.once('end', onend);
}

Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function () {
    return this._writableState.highWaterMark;
  }
});

// the no-half-open enforcer
function onend() {
  // if we allow half-open state, or if the writable side ended,
  // then we're ok.
  if (this.allowHalfOpen || this._writableState.ended) return;

  // no more data can be written.
  // But allow more writes to happen in this tick.
  pna.nextTick(onEndNT, this);
}

function onEndNT(self) {
  self.end();
}

Object.defineProperty(Duplex.prototype, 'destroyed', {
  get: function () {
    if (this._readableState === undefined || this._writableState === undefined) {
      return false;
    }
    return this._readableState.destroyed && this._writableState.destroyed;
  },
  set: function (value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (this._readableState === undefined || this._writableState === undefined) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._readableState.destroyed = value;
    this._writableState.destroyed = value;
  }
});

Duplex.prototype._destroy = function (err, cb) {
  this.push(null);
  this.end();

  pna.nextTick(cb, err);
};
},{"./_stream_readable":277,"./_stream_writable":279,"core-util-is":141,"inherits":219,"process-nextick-args":253}],276:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a passthrough stream.
// basically just the most minimal sort of Transform stream.
// Every written chunk gets output as-is.

'use strict';

module.exports = PassThrough;

var Transform = require('./_stream_transform');

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

util.inherits(PassThrough, Transform);

function PassThrough(options) {
  if (!(this instanceof PassThrough)) return new PassThrough(options);

  Transform.call(this, options);
}

PassThrough.prototype._transform = function (chunk, encoding, cb) {
  cb(null, chunk);
};
},{"./_stream_transform":278,"core-util-is":141,"inherits":219}],277:[function(require,module,exports){
(function (process,global){(function (){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

module.exports = Readable;

/*<replacement>*/
var isArray = require('isarray');
/*</replacement>*/

/*<replacement>*/
var Duplex;
/*</replacement>*/

Readable.ReadableState = ReadableState;

/*<replacement>*/
var EE = require('events').EventEmitter;

var EElistenerCount = function (emitter, type) {
  return emitter.listeners(type).length;
};
/*</replacement>*/

/*<replacement>*/
var Stream = require('./internal/streams/stream');
/*</replacement>*/

/*<replacement>*/

var Buffer = require('safe-buffer').Buffer;
var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
function _uint8ArrayToBuffer(chunk) {
  return Buffer.from(chunk);
}
function _isUint8Array(obj) {
  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}

/*</replacement>*/

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

/*<replacement>*/
var debugUtil = require('util');
var debug = void 0;
if (debugUtil && debugUtil.debuglog) {
  debug = debugUtil.debuglog('stream');
} else {
  debug = function () {};
}
/*</replacement>*/

var BufferList = require('./internal/streams/BufferList');
var destroyImpl = require('./internal/streams/destroy');
var StringDecoder;

util.inherits(Readable, Stream);

var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];

function prependListener(emitter, event, fn) {
  // Sadly this is not cacheable as some libraries bundle their own
  // event emitter implementation with them.
  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);

  // This is a hack to make sure that our error handler is attached before any
  // userland ones.  NEVER DO THIS. This is here only because this code needs
  // to continue to work with older versions of Node.js that do not include
  // the prependListener() method. The goal is to eventually remove this hack.
  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
}

function ReadableState(options, stream) {
  Duplex = Duplex || require('./_stream_duplex');

  options = options || {};

  // Duplex streams are both readable and writable, but share
  // the same options object.
  // However, some cases require setting options to different
  // values for the readable and the writable sides of the duplex stream.
  // These options can be provided separately as readableXXX and writableXXX.
  var isDuplex = stream instanceof Duplex;

  // object stream flag. Used to make read(n) ignore n and to
  // make all the buffer merging and length checks go away
  this.objectMode = !!options.objectMode;

  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;

  // the point at which it stops calling _read() to fill the buffer
  // Note: 0 is a valid value, means "don't call _read preemptively ever"
  var hwm = options.highWaterMark;
  var readableHwm = options.readableHighWaterMark;
  var defaultHwm = this.objectMode ? 16 : 16 * 1024;

  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;

  // cast to ints.
  this.highWaterMark = Math.floor(this.highWaterMark);

  // A linked list is used to store data chunks instead of an array because the
  // linked list can remove elements from the beginning faster than
  // array.shift()
  this.buffer = new BufferList();
  this.length = 0;
  this.pipes = null;
  this.pipesCount = 0;
  this.flowing = null;
  this.ended = false;
  this.endEmitted = false;
  this.reading = false;

  // a flag to be able to tell if the event 'readable'/'data' is emitted
  // immediately, or on a later tick.  We set this to true at first, because
  // any actions that shouldn't happen until "later" should generally also
  // not happen before the first read call.
  this.sync = true;

  // whenever we return null, then we set a flag to say
  // that we're awaiting a 'readable' event emission.
  this.needReadable = false;
  this.emittedReadable = false;
  this.readableListening = false;
  this.resumeScheduled = false;

  // has it been destroyed
  this.destroyed = false;

  // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.
  this.defaultEncoding = options.defaultEncoding || 'utf8';

  // the number of writers that are awaiting a drain event in .pipe()s
  this.awaitDrain = 0;

  // if true, a maybeReadMore has been scheduled
  this.readingMore = false;

  this.decoder = null;
  this.encoding = null;
  if (options.encoding) {
    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
    this.decoder = new StringDecoder(options.encoding);
    this.encoding = options.encoding;
  }
}

function Readable(options) {
  Duplex = Duplex || require('./_stream_duplex');

  if (!(this instanceof Readable)) return new Readable(options);

  this._readableState = new ReadableState(options, this);

  // legacy
  this.readable = true;

  if (options) {
    if (typeof options.read === 'function') this._read = options.read;

    if (typeof options.destroy === 'function') this._destroy = options.destroy;
  }

  Stream.call(this);
}

Object.defineProperty(Readable.prototype, 'destroyed', {
  get: function () {
    if (this._readableState === undefined) {
      return false;
    }
    return this._readableState.destroyed;
  },
  set: function (value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (!this._readableState) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._readableState.destroyed = value;
  }
});

Readable.prototype.destroy = destroyImpl.destroy;
Readable.prototype._undestroy = destroyImpl.undestroy;
Readable.prototype._destroy = function (err, cb) {
  this.push(null);
  cb(err);
};

// Manually shove something into the read() buffer.
// This returns true if the highWaterMark has not been hit yet,
// similar to how Writable.write() returns true if you should
// write() some more.
Readable.prototype.push = function (chunk, encoding) {
  var state = this._readableState;
  var skipChunkCheck;

  if (!state.objectMode) {
    if (typeof chunk === 'string') {
      encoding = encoding || state.defaultEncoding;
      if (encoding !== state.encoding) {
        chunk = Buffer.from(chunk, encoding);
        encoding = '';
      }
      skipChunkCheck = true;
    }
  } else {
    skipChunkCheck = true;
  }

  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
};

// Unshift should *always* be something directly out of read()
Readable.prototype.unshift = function (chunk) {
  return readableAddChunk(this, chunk, null, true, false);
};

function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
  var state = stream._readableState;
  if (chunk === null) {
    state.reading = false;
    onEofChunk(stream, state);
  } else {
    var er;
    if (!skipChunkCheck) er = chunkInvalid(state, chunk);
    if (er) {
      stream.emit('error', er);
    } else if (state.objectMode || chunk && chunk.length > 0) {
      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
        chunk = _uint8ArrayToBuffer(chunk);
      }

      if (addToFront) {
        if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
      } else if (state.ended) {
        stream.emit('error', new Error('stream.push() after EOF'));
      } else {
        state.reading = false;
        if (state.decoder && !encoding) {
          chunk = state.decoder.write(chunk);
          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
        } else {
          addChunk(stream, state, chunk, false);
        }
      }
    } else if (!addToFront) {
      state.reading = false;
    }
  }

  return needMoreData(state);
}

function addChunk(stream, state, chunk, addToFront) {
  if (state.flowing && state.length === 0 && !state.sync) {
    stream.emit('data', chunk);
    stream.read(0);
  } else {
    // update the buffer info.
    state.length += state.objectMode ? 1 : chunk.length;
    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);

    if (state.needReadable) emitReadable(stream);
  }
  maybeReadMore(stream, state);
}

function chunkInvalid(state, chunk) {
  var er;
  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
    er = new TypeError('Invalid non-string/buffer chunk');
  }
  return er;
}

// if it's past the high water mark, we can push in some more.
// Also, if we have no data yet, we can stand some
// more bytes.  This is to work around cases where hwm=0,
// such as the repl.  Also, if the push() triggered a
// readable event, and the user called read(largeNumber) such that
// needReadable was set, then we ought to push more, so that another
// 'readable' event will be triggered.
function needMoreData(state) {
  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
}

Readable.prototype.isPaused = function () {
  return this._readableState.flowing === false;
};

// backwards compatibility.
Readable.prototype.setEncoding = function (enc) {
  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
  this._readableState.decoder = new StringDecoder(enc);
  this._readableState.encoding = enc;
  return this;
};

// Don't raise the hwm > 8MB
var MAX_HWM = 0x800000;
function computeNewHighWaterMark(n) {
  if (n >= MAX_HWM) {
    n = MAX_HWM;
  } else {
    // Get the next highest power of 2 to prevent increasing hwm excessively in
    // tiny amounts
    n--;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    n++;
  }
  return n;
}

// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function howMuchToRead(n, state) {
  if (n <= 0 || state.length === 0 && state.ended) return 0;
  if (state.objectMode) return 1;
  if (n !== n) {
    // Only flow one buffer at a time
    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
  }
  // If we're asking for more than the current hwm, then raise the hwm.
  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
  if (n <= state.length) return n;
  // Don't have enough
  if (!state.ended) {
    state.needReadable = true;
    return 0;
  }
  return state.length;
}

// you can override either this method, or the async _read(n) below.
Readable.prototype.read = function (n) {
  debug('read', n);
  n = parseInt(n, 10);
  var state = this._readableState;
  var nOrig = n;

  if (n !== 0) state.emittedReadable = false;

  // if we're doing read(0) to trigger a readable event, but we
  // already have a bunch of data in the buffer, then just trigger
  // the 'readable' event and move on.
  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
    debug('read: emitReadable', state.length, state.ended);
    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
    return null;
  }

  n = howMuchToRead(n, state);

  // if we've ended, and we're now clear, then finish it up.
  if (n === 0 && state.ended) {
    if (state.length === 0) endReadable(this);
    return null;
  }

  // All the actual chunk generation logic needs to be
  // *below* the call to _read.  The reason is that in certain
  // synthetic stream cases, such as passthrough streams, _read
  // may be a completely synchronous operation which may change
  // the state of the read buffer, providing enough data when
  // before there was *not* enough.
  //
  // So, the steps are:
  // 1. Figure out what the state of things will be after we do
  // a read from the buffer.
  //
  // 2. If that resulting state will trigger a _read, then call _read.
  // Note that this may be asynchronous, or synchronous.  Yes, it is
  // deeply ugly to write APIs this way, but that still doesn't mean
  // that the Readable class should behave improperly, as streams are
  // designed to be sync/async agnostic.
  // Take note if the _read call is sync or async (ie, if the read call
  // has returned yet), so that we know whether or not it's safe to emit
  // 'readable' etc.
  //
  // 3. Actually pull the requested chunks out of the buffer and return.

  // if we need a readable event, then we need to do some reading.
  var doRead = state.needReadable;
  debug('need readable', doRead);

  // if we currently have less than the highWaterMark, then also read some
  if (state.length === 0 || state.length - n < state.highWaterMark) {
    doRead = true;
    debug('length less than watermark', doRead);
  }

  // however, if we've ended, then there's no point, and if we're already
  // reading, then it's unnecessary.
  if (state.ended || state.reading) {
    doRead = false;
    debug('reading or ended', doRead);
  } else if (doRead) {
    debug('do read');
    state.reading = true;
    state.sync = true;
    // if the length is currently zero, then we *need* a readable event.
    if (state.length === 0) state.needReadable = true;
    // call internal read method
    this._read(state.highWaterMark);
    state.sync = false;
    // If _read pushed data synchronously, then `reading` will be false,
    // and we need to re-evaluate how much data we can return to the user.
    if (!state.reading) n = howMuchToRead(nOrig, state);
  }

  var ret;
  if (n > 0) ret = fromList(n, state);else ret = null;

  if (ret === null) {
    state.needReadable = true;
    n = 0;
  } else {
    state.length -= n;
  }

  if (state.length === 0) {
    // If we have nothing in the buffer, then we want to know
    // as soon as we *do* get something into the buffer.
    if (!state.ended) state.needReadable = true;

    // If we tried to read() past the EOF, then emit end on the next tick.
    if (nOrig !== n && state.ended) endReadable(this);
  }

  if (ret !== null) this.emit('data', ret);

  return ret;
};

function onEofChunk(stream, state) {
  if (state.ended) return;
  if (state.decoder) {
    var chunk = state.decoder.end();
    if (chunk && chunk.length) {
      state.buffer.push(chunk);
      state.length += state.objectMode ? 1 : chunk.length;
    }
  }
  state.ended = true;

  // emit 'readable' now to make sure it gets picked up.
  emitReadable(stream);
}

// Don't emit readable right away in sync mode, because this can trigger
// another read() call => stack overflow.  This way, it might trigger
// a nextTick recursion warning, but that's not so bad.
function emitReadable(stream) {
  var state = stream._readableState;
  state.needReadable = false;
  if (!state.emittedReadable) {
    debug('emitReadable', state.flowing);
    state.emittedReadable = true;
    if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
  }
}

function emitReadable_(stream) {
  debug('emit readable');
  stream.emit('readable');
  flow(stream);
}

// at this point, the user has presumably seen the 'readable' event,
// and called read() to consume some data.  that may have triggered
// in turn another _read(n) call, in which case reading = true if
// it's in progress.
// However, if we're not ended, or reading, and the length < hwm,
// then go ahead and try to read some more preemptively.
function maybeReadMore(stream, state) {
  if (!state.readingMore) {
    state.readingMore = true;
    pna.nextTick(maybeReadMore_, stream, state);
  }
}

function maybeReadMore_(stream, state) {
  var len = state.length;
  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
    debug('maybeReadMore read 0');
    stream.read(0);
    if (len === state.length)
      // didn't get any data, stop spinning.
      break;else len = state.length;
  }
  state.readingMore = false;
}

// abstract method.  to be overridden in specific implementation classes.
// call cb(er, data) where data is <= n in length.
// for virtual (non-string, non-buffer) streams, "length" is somewhat
// arbitrary, and perhaps not very meaningful.
Readable.prototype._read = function (n) {
  this.emit('error', new Error('_read() is not implemented'));
};

Readable.prototype.pipe = function (dest, pipeOpts) {
  var src = this;
  var state = this._readableState;

  switch (state.pipesCount) {
    case 0:
      state.pipes = dest;
      break;
    case 1:
      state.pipes = [state.pipes, dest];
      break;
    default:
      state.pipes.push(dest);
      break;
  }
  state.pipesCount += 1;
  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);

  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;

  var endFn = doEnd ? onend : unpipe;
  if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);

  dest.on('unpipe', onunpipe);
  function onunpipe(readable, unpipeInfo) {
    debug('onunpipe');
    if (readable === src) {
      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
        unpipeInfo.hasUnpiped = true;
        cleanup();
      }
    }
  }

  function onend() {
    debug('onend');
    dest.end();
  }

  // when the dest drains, it reduces the awaitDrain counter
  // on the source.  This would be more elegant with a .once()
  // handler in flow(), but adding and removing repeatedly is
  // too slow.
  var ondrain = pipeOnDrain(src);
  dest.on('drain', ondrain);

  var cleanedUp = false;
  function cleanup() {
    debug('cleanup');
    // cleanup event handlers once the pipe is broken
    dest.removeListener('close', onclose);
    dest.removeListener('finish', onfinish);
    dest.removeListener('drain', ondrain);
    dest.removeListener('error', onerror);
    dest.removeListener('unpipe', onunpipe);
    src.removeListener('end', onend);
    src.removeListener('end', unpipe);
    src.removeListener('data', ondata);

    cleanedUp = true;

    // if the reader is waiting for a drain event from this
    // specific writer, then it would cause it to never start
    // flowing again.
    // So, if this is awaiting a drain, then we just call it now.
    // If we don't know, then assume that we are waiting for one.
    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
  }

  // If the user pushes more data while we're writing to dest then we'll end up
  // in ondata again. However, we only want to increase awaitDrain once because
  // dest will only emit one 'drain' event for the multiple writes.
  // => Introduce a guard on increasing awaitDrain.
  var increasedAwaitDrain = false;
  src.on('data', ondata);
  function ondata(chunk) {
    debug('ondata');
    increasedAwaitDrain = false;
    var ret = dest.write(chunk);
    if (false === ret && !increasedAwaitDrain) {
      // If the user unpiped during `dest.write()`, it is possible
      // to get stuck in a permanently paused state if that write
      // also returned false.
      // => Check whether `dest` is still a piping destination.
      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
        debug('false write response, pause', state.awaitDrain);
        state.awaitDrain++;
        increasedAwaitDrain = true;
      }
      src.pause();
    }
  }

  // if the dest has an error, then stop piping into it.
  // however, don't suppress the throwing behavior for this.
  function onerror(er) {
    debug('onerror', er);
    unpipe();
    dest.removeListener('error', onerror);
    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
  }

  // Make sure our error handler is attached before userland ones.
  prependListener(dest, 'error', onerror);

  // Both close and finish should trigger unpipe, but only once.
  function onclose() {
    dest.removeListener('finish', onfinish);
    unpipe();
  }
  dest.once('close', onclose);
  function onfinish() {
    debug('onfinish');
    dest.removeListener('close', onclose);
    unpipe();
  }
  dest.once('finish', onfinish);

  function unpipe() {
    debug('unpipe');
    src.unpipe(dest);
  }

  // tell the dest that it's being piped to
  dest.emit('pipe', src);

  // start the flow if it hasn't been started already.
  if (!state.flowing) {
    debug('pipe resume');
    src.resume();
  }

  return dest;
};

function pipeOnDrain(src) {
  return function () {
    var state = src._readableState;
    debug('pipeOnDrain', state.awaitDrain);
    if (state.awaitDrain) state.awaitDrain--;
    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
      state.flowing = true;
      flow(src);
    }
  };
}

Readable.prototype.unpipe = function (dest) {
  var state = this._readableState;
  var unpipeInfo = { hasUnpiped: false };

  // if we're not piping anywhere, then do nothing.
  if (state.pipesCount === 0) return this;

  // just one destination.  most common case.
  if (state.pipesCount === 1) {
    // passed in one, but it's not the right one.
    if (dest && dest !== state.pipes) return this;

    if (!dest) dest = state.pipes;

    // got a match.
    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;
    if (dest) dest.emit('unpipe', this, unpipeInfo);
    return this;
  }

  // slow case. multiple pipe destinations.

  if (!dest) {
    // remove all.
    var dests = state.pipes;
    var len = state.pipesCount;
    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;

    for (var i = 0; i < len; i++) {
      dests[i].emit('unpipe', this, { hasUnpiped: false });
    }return this;
  }

  // try to find the right one.
  var index = indexOf(state.pipes, dest);
  if (index === -1) return this;

  state.pipes.splice(index, 1);
  state.pipesCount -= 1;
  if (state.pipesCount === 1) state.pipes = state.pipes[0];

  dest.emit('unpipe', this, unpipeInfo);

  return this;
};

// set up data events if they are asked for
// Ensure readable listeners eventually get something
Readable.prototype.on = function (ev, fn) {
  var res = Stream.prototype.on.call(this, ev, fn);

  if (ev === 'data') {
    // Start flowing on next tick if stream isn't explicitly paused
    if (this._readableState.flowing !== false) this.resume();
  } else if (ev === 'readable') {
    var state = this._readableState;
    if (!state.endEmitted && !state.readableListening) {
      state.readableListening = state.needReadable = true;
      state.emittedReadable = false;
      if (!state.reading) {
        pna.nextTick(nReadingNextTick, this);
      } else if (state.length) {
        emitReadable(this);
      }
    }
  }

  return res;
};
Readable.prototype.addListener = Readable.prototype.on;

function nReadingNextTick(self) {
  debug('readable nexttick read 0');
  self.read(0);
}

// pause() and resume() are remnants of the legacy readable stream API
// If the user uses them, then switch into old mode.
Readable.prototype.resume = function () {
  var state = this._readableState;
  if (!state.flowing) {
    debug('resume');
    state.flowing = true;
    resume(this, state);
  }
  return this;
};

function resume(stream, state) {
  if (!state.resumeScheduled) {
    state.resumeScheduled = true;
    pna.nextTick(resume_, stream, state);
  }
}

function resume_(stream, state) {
  if (!state.reading) {
    debug('resume read 0');
    stream.read(0);
  }

  state.resumeScheduled = false;
  state.awaitDrain = 0;
  stream.emit('resume');
  flow(stream);
  if (state.flowing && !state.reading) stream.read(0);
}

Readable.prototype.pause = function () {
  debug('call pause flowing=%j', this._readableState.flowing);
  if (false !== this._readableState.flowing) {
    debug('pause');
    this._readableState.flowing = false;
    this.emit('pause');
  }
  return this;
};

function flow(stream) {
  var state = stream._readableState;
  debug('flow', state.flowing);
  while (state.flowing && stream.read() !== null) {}
}

// wrap an old-style stream as the async data source.
// This is *not* part of the readable stream interface.
// It is an ugly unfortunate mess of history.
Readable.prototype.wrap = function (stream) {
  var _this = this;

  var state = this._readableState;
  var paused = false;

  stream.on('end', function () {
    debug('wrapped end');
    if (state.decoder && !state.ended) {
      var chunk = state.decoder.end();
      if (chunk && chunk.length) _this.push(chunk);
    }

    _this.push(null);
  });

  stream.on('data', function (chunk) {
    debug('wrapped data');
    if (state.decoder) chunk = state.decoder.write(chunk);

    // don't skip over falsy values in objectMode
    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;

    var ret = _this.push(chunk);
    if (!ret) {
      paused = true;
      stream.pause();
    }
  });

  // proxy all the other methods.
  // important when wrapping filters and duplexes.
  for (var i in stream) {
    if (this[i] === undefined && typeof stream[i] === 'function') {
      this[i] = function (method) {
        return function () {
          return stream[method].apply(stream, arguments);
        };
      }(i);
    }
  }

  // proxy certain important events.
  for (var n = 0; n < kProxyEvents.length; n++) {
    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
  }

  // when we try to consume some more bytes, simply unpause the
  // underlying stream.
  this._read = function (n) {
    debug('wrapped _read', n);
    if (paused) {
      paused = false;
      stream.resume();
    }
  };

  return this;
};

Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function () {
    return this._readableState.highWaterMark;
  }
});

// exposed for testing purposes only.
Readable._fromList = fromList;

// Pluck off n bytes from an array of buffers.
// Length is the combined lengths of all the buffers in the list.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function fromList(n, state) {
  // nothing buffered
  if (state.length === 0) return null;

  var ret;
  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
    // read it all, truncate the list
    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
    state.buffer.clear();
  } else {
    // read part of list
    ret = fromListPartial(n, state.buffer, state.decoder);
  }

  return ret;
}

// Extracts only enough buffered data to satisfy the amount requested.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function fromListPartial(n, list, hasStrings) {
  var ret;
  if (n < list.head.data.length) {
    // slice is the same for buffers and strings
    ret = list.head.data.slice(0, n);
    list.head.data = list.head.data.slice(n);
  } else if (n === list.head.data.length) {
    // first chunk is a perfect match
    ret = list.shift();
  } else {
    // result spans more than one buffer
    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
  }
  return ret;
}

// Copies a specified amount of characters from the list of buffered data
// chunks.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function copyFromBufferString(n, list) {
  var p = list.head;
  var c = 1;
  var ret = p.data;
  n -= ret.length;
  while (p = p.next) {
    var str = p.data;
    var nb = n > str.length ? str.length : n;
    if (nb === str.length) ret += str;else ret += str.slice(0, n);
    n -= nb;
    if (n === 0) {
      if (nb === str.length) {
        ++c;
        if (p.next) list.head = p.next;else list.head = list.tail = null;
      } else {
        list.head = p;
        p.data = str.slice(nb);
      }
      break;
    }
    ++c;
  }
  list.length -= c;
  return ret;
}

// Copies a specified amount of bytes from the list of buffered data chunks.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function copyFromBuffer(n, list) {
  var ret = Buffer.allocUnsafe(n);
  var p = list.head;
  var c = 1;
  p.data.copy(ret);
  n -= p.data.length;
  while (p = p.next) {
    var buf = p.data;
    var nb = n > buf.length ? buf.length : n;
    buf.copy(ret, ret.length - n, 0, nb);
    n -= nb;
    if (n === 0) {
      if (nb === buf.length) {
        ++c;
        if (p.next) list.head = p.next;else list.head = list.tail = null;
      } else {
        list.head = p;
        p.data = buf.slice(nb);
      }
      break;
    }
    ++c;
  }
  list.length -= c;
  return ret;
}

function endReadable(stream) {
  var state = stream._readableState;

  // If we get here before consuming all the bytes, then that is a
  // bug in node.  Should never happen.
  if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');

  if (!state.endEmitted) {
    state.ended = true;
    pna.nextTick(endReadableNT, state, stream);
  }
}

function endReadableNT(state, stream) {
  // Check that we didn't get one last unshift.
  if (!state.endEmitted && state.length === 0) {
    state.endEmitted = true;
    stream.readable = false;
    stream.emit('end');
  }
}

function indexOf(xs, x) {
  for (var i = 0, l = xs.length; i < l; i++) {
    if (xs[i] === x) return i;
  }
  return -1;
}
}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./_stream_duplex":275,"./internal/streams/BufferList":280,"./internal/streams/destroy":281,"./internal/streams/stream":282,"_process":254,"core-util-is":141,"events":188,"inherits":219,"isarray":223,"process-nextick-args":253,"safe-buffer":283,"string_decoder/":284,"util":54}],278:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a transform stream is a readable/writable stream where you do
// something with the data.  Sometimes it's called a "filter",
// but that's not a great name for it, since that implies a thing where
// some bits pass through, and others are simply ignored.  (That would
// be a valid example of a transform, of course.)
//
// While the output is causally related to the input, it's not a
// necessarily symmetric or synchronous transformation.  For example,
// a zlib stream might take multiple plain-text writes(), and then
// emit a single compressed chunk some time in the future.
//
// Here's how this works:
//
// The Transform stream has all the aspects of the readable and writable
// stream classes.  When you write(chunk), that calls _write(chunk,cb)
// internally, and returns false if there's a lot of pending writes
// buffered up.  When you call read(), that calls _read(n) until
// there's enough pending readable data buffered up.
//
// In a transform stream, the written data is placed in a buffer.  When
// _read(n) is called, it transforms the queued up data, calling the
// buffered _write cb's as it consumes chunks.  If consuming a single
// written chunk would result in multiple output chunks, then the first
// outputted bit calls the readcb, and subsequent chunks just go into
// the read buffer, and will cause it to emit 'readable' if necessary.
//
// This way, back-pressure is actually determined by the reading side,
// since _read has to be called to start processing a new chunk.  However,
// a pathological inflate type of transform can cause excessive buffering
// here.  For example, imagine a stream where every byte of input is
// interpreted as an integer from 0-255, and then results in that many
// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
// 1kb of data being output.  In this case, you could write a very small
// amount of input, and end up with a very large amount of output.  In
// such a pathological inflating mechanism, there'd be no way to tell
// the system to stop doing the transform.  A single 4MB write could
// cause the system to run out of memory.
//
// However, even in such a pathological case, only a single written chunk
// would be consumed, and then the rest would wait (un-transformed) until
// the results of the previous transformed chunk were consumed.

'use strict';

module.exports = Transform;

var Duplex = require('./_stream_duplex');

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

util.inherits(Transform, Duplex);

function afterTransform(er, data) {
  var ts = this._transformState;
  ts.transforming = false;

  var cb = ts.writecb;

  if (!cb) {
    return this.emit('error', new Error('write callback called multiple times'));
  }

  ts.writechunk = null;
  ts.writecb = null;

  if (data != null) // single equals check for both `null` and `undefined`
    this.push(data);

  cb(er);

  var rs = this._readableState;
  rs.reading = false;
  if (rs.needReadable || rs.length < rs.highWaterMark) {
    this._read(rs.highWaterMark);
  }
}

function Transform(options) {
  if (!(this instanceof Transform)) return new Transform(options);

  Duplex.call(this, options);

  this._transformState = {
    afterTransform: afterTransform.bind(this),
    needTransform: false,
    transforming: false,
    writecb: null,
    writechunk: null,
    writeencoding: null
  };

  // start out asking for a readable event once data is transformed.
  this._readableState.needReadable = true;

  // we have implemented the _read method, and done the other things
  // that Readable wants before the first _read call, so unset the
  // sync guard flag.
  this._readableState.sync = false;

  if (options) {
    if (typeof options.transform === 'function') this._transform = options.transform;

    if (typeof options.flush === 'function') this._flush = options.flush;
  }

  // When the writable side finishes, then flush out anything remaining.
  this.on('prefinish', prefinish);
}

function prefinish() {
  var _this = this;

  if (typeof this._flush === 'function') {
    this._flush(function (er, data) {
      done(_this, er, data);
    });
  } else {
    done(this, null, null);
  }
}

Transform.prototype.push = function (chunk, encoding) {
  this._transformState.needTransform = false;
  return Duplex.prototype.push.call(this, chunk, encoding);
};

// This is the part where you do stuff!
// override this function in implementation classes.
// 'chunk' is an input chunk.
//
// Call `push(newChunk)` to pass along transformed output
// to the readable side.  You may call 'push' zero or more times.
//
// Call `cb(err)` when you are done with this chunk.  If you pass
// an error, then that'll put the hurt on the whole operation.  If you
// never call cb(), then you'll never get another chunk.
Transform.prototype._transform = function (chunk, encoding, cb) {
  throw new Error('_transform() is not implemented');
};

Transform.prototype._write = function (chunk, encoding, cb) {
  var ts = this._transformState;
  ts.writecb = cb;
  ts.writechunk = chunk;
  ts.writeencoding = encoding;
  if (!ts.transforming) {
    var rs = this._readableState;
    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
  }
};

// Doesn't matter what the args are here.
// _transform does all the work.
// That we got here means that the readable side wants more data.
Transform.prototype._read = function (n) {
  var ts = this._transformState;

  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
    ts.transforming = true;
    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
  } else {
    // mark that we need a transform, so that any data that comes in
    // will get processed, now that we've asked for it.
    ts.needTransform = true;
  }
};

Transform.prototype._destroy = function (err, cb) {
  var _this2 = this;

  Duplex.prototype._destroy.call(this, err, function (err2) {
    cb(err2);
    _this2.emit('close');
  });
};

function done(stream, er, data) {
  if (er) return stream.emit('error', er);

  if (data != null) // single equals check for both `null` and `undefined`
    stream.push(data);

  // if there's nothing in the write buffer, then that means
  // that nothing more will ever be provided
  if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');

  if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');

  return stream.push(null);
}
},{"./_stream_duplex":275,"core-util-is":141,"inherits":219}],279:[function(require,module,exports){
(function (process,global,setImmediate){(function (){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// A bit simpler than readable streams.
// Implement an async ._write(chunk, encoding, cb), and it'll handle all
// the drain event emission and buffering.

'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

module.exports = Writable;

/* <replacement> */
function WriteReq(chunk, encoding, cb) {
  this.chunk = chunk;
  this.encoding = encoding;
  this.callback = cb;
  this.next = null;
}

// It seems a linked list but it is not
// there will be only 2 of these for each stream
function CorkedRequest(state) {
  var _this = this;

  this.next = null;
  this.entry = null;
  this.finish = function () {
    onCorkedFinish(_this, state);
  };
}
/* </replacement> */

/*<replacement>*/
var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;
/*</replacement>*/

/*<replacement>*/
var Duplex;
/*</replacement>*/

Writable.WritableState = WritableState;

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

/*<replacement>*/
var internalUtil = {
  deprecate: require('util-deprecate')
};
/*</replacement>*/

/*<replacement>*/
var Stream = require('./internal/streams/stream');
/*</replacement>*/

/*<replacement>*/

var Buffer = require('safe-buffer').Buffer;
var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
function _uint8ArrayToBuffer(chunk) {
  return Buffer.from(chunk);
}
function _isUint8Array(obj) {
  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}

/*</replacement>*/

var destroyImpl = require('./internal/streams/destroy');

util.inherits(Writable, Stream);

function nop() {}

function WritableState(options, stream) {
  Duplex = Duplex || require('./_stream_duplex');

  options = options || {};

  // Duplex streams are both readable and writable, but share
  // the same options object.
  // However, some cases require setting options to different
  // values for the readable and the writable sides of the duplex stream.
  // These options can be provided separately as readableXXX and writableXXX.
  var isDuplex = stream instanceof Duplex;

  // object stream flag to indicate whether or not this stream
  // contains buffers or objects.
  this.objectMode = !!options.objectMode;

  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;

  // the point at which write() starts returning false
  // Note: 0 is a valid value, means that we always return false if
  // the entire buffer is not flushed immediately on write()
  var hwm = options.highWaterMark;
  var writableHwm = options.writableHighWaterMark;
  var defaultHwm = this.objectMode ? 16 : 16 * 1024;

  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;

  // cast to ints.
  this.highWaterMark = Math.floor(this.highWaterMark);

  // if _final has been called
  this.finalCalled = false;

  // drain event flag.
  this.needDrain = false;
  // at the start of calling end()
  this.ending = false;
  // when end() has been called, and returned
  this.ended = false;
  // when 'finish' is emitted
  this.finished = false;

  // has it been destroyed
  this.destroyed = false;

  // should we decode strings into buffers before passing to _write?
  // this is here so that some node-core streams can optimize string
  // handling at a lower level.
  var noDecode = options.decodeStrings === false;
  this.decodeStrings = !noDecode;

  // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.
  this.defaultEncoding = options.defaultEncoding || 'utf8';

  // not an actual buffer we keep track of, but a measurement
  // of how much we're waiting to get pushed to some underlying
  // socket or file.
  this.length = 0;

  // a flag to see when we're in the middle of a write.
  this.writing = false;

  // when true all writes will be buffered until .uncork() call
  this.corked = 0;

  // a flag to be able to tell if the onwrite cb is called immediately,
  // or on a later tick.  We set this to true at first, because any
  // actions that shouldn't happen until "later" should generally also
  // not happen before the first write call.
  this.sync = true;

  // a flag to know if we're processing previously buffered items, which
  // may call the _write() callback in the same tick, so that we don't
  // end up in an overlapped onwrite situation.
  this.bufferProcessing = false;

  // the callback that's passed to _write(chunk,cb)
  this.onwrite = function (er) {
    onwrite(stream, er);
  };

  // the callback that the user supplies to write(chunk,encoding,cb)
  this.writecb = null;

  // the amount that is being written when _write is called.
  this.writelen = 0;

  this.bufferedRequest = null;
  this.lastBufferedRequest = null;

  // number of pending user-supplied write callbacks
  // this must be 0 before 'finish' can be emitted
  this.pendingcb = 0;

  // emit prefinish if the only thing we're waiting for is _write cbs
  // This is relevant for synchronous Transform streams
  this.prefinished = false;

  // True if the error was already emitted and should not be thrown again
  this.errorEmitted = false;

  // count buffered requests
  this.bufferedRequestCount = 0;

  // allocate the first CorkedRequest, there is always
  // one allocated and free to use, and we maintain at most two
  this.corkedRequestsFree = new CorkedRequest(this);
}

WritableState.prototype.getBuffer = function getBuffer() {
  var current = this.bufferedRequest;
  var out = [];
  while (current) {
    out.push(current);
    current = current.next;
  }
  return out;
};

(function () {
  try {
    Object.defineProperty(WritableState.prototype, 'buffer', {
      get: internalUtil.deprecate(function () {
        return this.getBuffer();
      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
    });
  } catch (_) {}
})();

// Test _writableState for inheritance to account for Duplex streams,
// whose prototype chain only points to Readable.
var realHasInstance;
if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
  realHasInstance = Function.prototype[Symbol.hasInstance];
  Object.defineProperty(Writable, Symbol.hasInstance, {
    value: function (object) {
      if (realHasInstance.call(this, object)) return true;
      if (this !== Writable) return false;

      return object && object._writableState instanceof WritableState;
    }
  });
} else {
  realHasInstance = function (object) {
    return object instanceof this;
  };
}

function Writable(options) {
  Duplex = Duplex || require('./_stream_duplex');

  // Writable ctor is applied to Duplexes, too.
  // `realHasInstance` is necessary because using plain `instanceof`
  // would return false, as no `_writableState` property is attached.

  // Trying to use the custom `instanceof` for Writable here will also break the
  // Node.js LazyTransform implementation, which has a non-trivial getter for
  // `_writableState` that would lead to infinite recursion.
  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
    return new Writable(options);
  }

  this._writableState = new WritableState(options, this);

  // legacy.
  this.writable = true;

  if (options) {
    if (typeof options.write === 'function') this._write = options.write;

    if (typeof options.writev === 'function') this._writev = options.writev;

    if (typeof options.destroy === 'function') this._destroy = options.destroy;

    if (typeof options.final === 'function') this._final = options.final;
  }

  Stream.call(this);
}

// Otherwise people can pipe Writable streams, which is just wrong.
Writable.prototype.pipe = function () {
  this.emit('error', new Error('Cannot pipe, not readable'));
};

function writeAfterEnd(stream, cb) {
  var er = new Error('write after end');
  // TODO: defer error events consistently everywhere, not just the cb
  stream.emit('error', er);
  pna.nextTick(cb, er);
}

// Checks that a user-supplied chunk is valid, especially for the particular
// mode the stream is in. Currently this means that `null` is never accepted
// and undefined/non-string values are only allowed in object mode.
function validChunk(stream, state, chunk, cb) {
  var valid = true;
  var er = false;

  if (chunk === null) {
    er = new TypeError('May not write null values to stream');
  } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
    er = new TypeError('Invalid non-string/buffer chunk');
  }
  if (er) {
    stream.emit('error', er);
    pna.nextTick(cb, er);
    valid = false;
  }
  return valid;
}

Writable.prototype.write = function (chunk, encoding, cb) {
  var state = this._writableState;
  var ret = false;
  var isBuf = !state.objectMode && _isUint8Array(chunk);

  if (isBuf && !Buffer.isBuffer(chunk)) {
    chunk = _uint8ArrayToBuffer(chunk);
  }

  if (typeof encoding === 'function') {
    cb = encoding;
    encoding = null;
  }

  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;

  if (typeof cb !== 'function') cb = nop;

  if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
    state.pendingcb++;
    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
  }

  return ret;
};

Writable.prototype.cork = function () {
  var state = this._writableState;

  state.corked++;
};

Writable.prototype.uncork = function () {
  var state = this._writableState;

  if (state.corked) {
    state.corked--;

    if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
  }
};

Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
  // node::ParseEncoding() requires lower case.
  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
  this._writableState.defaultEncoding = encoding;
  return this;
};

function decodeChunk(state, chunk, encoding) {
  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
    chunk = Buffer.from(chunk, encoding);
  }
  return chunk;
}

Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function () {
    return this._writableState.highWaterMark;
  }
});

// if we're already writing something, then just put this
// in the queue, and wait our turn.  Otherwise, call _write
// If we return false, then we need a drain event, so set that flag.
function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
  if (!isBuf) {
    var newChunk = decodeChunk(state, chunk, encoding);
    if (chunk !== newChunk) {
      isBuf = true;
      encoding = 'buffer';
      chunk = newChunk;
    }
  }
  var len = state.objectMode ? 1 : chunk.length;

  state.length += len;

  var ret = state.length < state.highWaterMark;
  // we must ensure that previous needDrain will not be reset to false.
  if (!ret) state.needDrain = true;

  if (state.writing || state.corked) {
    var last = state.lastBufferedRequest;
    state.lastBufferedRequest = {
      chunk: chunk,
      encoding: encoding,
      isBuf: isBuf,
      callback: cb,
      next: null
    };
    if (last) {
      last.next = state.lastBufferedRequest;
    } else {
      state.bufferedRequest = state.lastBufferedRequest;
    }
    state.bufferedRequestCount += 1;
  } else {
    doWrite(stream, state, false, len, chunk, encoding, cb);
  }

  return ret;
}

function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  state.writelen = len;
  state.writecb = cb;
  state.writing = true;
  state.sync = true;
  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
  state.sync = false;
}

function onwriteError(stream, state, sync, er, cb) {
  --state.pendingcb;

  if (sync) {
    // defer the callback if we are being called synchronously
    // to avoid piling up things on the stack
    pna.nextTick(cb, er);
    // this can emit finish, and it will always happen
    // after error
    pna.nextTick(finishMaybe, stream, state);
    stream._writableState.errorEmitted = true;
    stream.emit('error', er);
  } else {
    // the caller expect this to happen before if
    // it is async
    cb(er);
    stream._writableState.errorEmitted = true;
    stream.emit('error', er);
    // this can emit finish, but finish must
    // always follow error
    finishMaybe(stream, state);
  }
}

function onwriteStateUpdate(state) {
  state.writing = false;
  state.writecb = null;
  state.length -= state.writelen;
  state.writelen = 0;
}

function onwrite(stream, er) {
  var state = stream._writableState;
  var sync = state.sync;
  var cb = state.writecb;

  onwriteStateUpdate(state);

  if (er) onwriteError(stream, state, sync, er, cb);else {
    // Check if we're actually ready to finish, but don't emit yet
    var finished = needFinish(state);

    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
      clearBuffer(stream, state);
    }

    if (sync) {
      /*<replacement>*/
      asyncWrite(afterWrite, stream, state, finished, cb);
      /*</replacement>*/
    } else {
      afterWrite(stream, state, finished, cb);
    }
  }
}

function afterWrite(stream, state, finished, cb) {
  if (!finished) onwriteDrain(stream, state);
  state.pendingcb--;
  cb();
  finishMaybe(stream, state);
}

// Must force callback to be called on nextTick, so that we don't
// emit 'drain' before the write() consumer gets the 'false' return
// value, and has a chance to attach a 'drain' listener.
function onwriteDrain(stream, state) {
  if (state.length === 0 && state.needDrain) {
    state.needDrain = false;
    stream.emit('drain');
  }
}

// if there's something in the buffer waiting, then process it
function clearBuffer(stream, state) {
  state.bufferProcessing = true;
  var entry = state.bufferedRequest;

  if (stream._writev && entry && entry.next) {
    // Fast case, write everything using _writev()
    var l = state.bufferedRequestCount;
    var buffer = new Array(l);
    var holder = state.corkedRequestsFree;
    holder.entry = entry;

    var count = 0;
    var allBuffers = true;
    while (entry) {
      buffer[count] = entry;
      if (!entry.isBuf) allBuffers = false;
      entry = entry.next;
      count += 1;
    }
    buffer.allBuffers = allBuffers;

    doWrite(stream, state, true, state.length, buffer, '', holder.finish);

    // doWrite is almost always async, defer these to save a bit of time
    // as the hot path ends with doWrite
    state.pendingcb++;
    state.lastBufferedRequest = null;
    if (holder.next) {
      state.corkedRequestsFree = holder.next;
      holder.next = null;
    } else {
      state.corkedRequestsFree = new CorkedRequest(state);
    }
    state.bufferedRequestCount = 0;
  } else {
    // Slow case, write chunks one-by-one
    while (entry) {
      var chunk = entry.chunk;
      var encoding = entry.encoding;
      var cb = entry.callback;
      var len = state.objectMode ? 1 : chunk.length;

      doWrite(stream, state, false, len, chunk, encoding, cb);
      entry = entry.next;
      state.bufferedRequestCount--;
      // if we didn't call the onwrite immediately, then
      // it means that we need to wait until it does.
      // also, that means that the chunk and cb are currently
      // being processed, so move the buffer counter past them.
      if (state.writing) {
        break;
      }
    }

    if (entry === null) state.lastBufferedRequest = null;
  }

  state.bufferedRequest = entry;
  state.bufferProcessing = false;
}

Writable.prototype._write = function (chunk, encoding, cb) {
  cb(new Error('_write() is not implemented'));
};

Writable.prototype._writev = null;

Writable.prototype.end = function (chunk, encoding, cb) {
  var state = this._writableState;

  if (typeof chunk === 'function') {
    cb = chunk;
    chunk = null;
    encoding = null;
  } else if (typeof encoding === 'function') {
    cb = encoding;
    encoding = null;
  }

  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);

  // .end() fully uncorks
  if (state.corked) {
    state.corked = 1;
    this.uncork();
  }

  // ignore unnecessary end() calls.
  if (!state.ending) endWritable(this, state, cb);
};

function needFinish(state) {
  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
}
function callFinal(stream, state) {
  stream._final(function (err) {
    state.pendingcb--;
    if (err) {
      stream.emit('error', err);
    }
    state.prefinished = true;
    stream.emit('prefinish');
    finishMaybe(stream, state);
  });
}
function prefinish(stream, state) {
  if (!state.prefinished && !state.finalCalled) {
    if (typeof stream._final === 'function') {
      state.pendingcb++;
      state.finalCalled = true;
      pna.nextTick(callFinal, stream, state);
    } else {
      state.prefinished = true;
      stream.emit('prefinish');
    }
  }
}

function finishMaybe(stream, state) {
  var need = needFinish(state);
  if (need) {
    prefinish(stream, state);
    if (state.pendingcb === 0) {
      state.finished = true;
      stream.emit('finish');
    }
  }
  return need;
}

function endWritable(stream, state, cb) {
  state.ending = true;
  finishMaybe(stream, state);
  if (cb) {
    if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);
  }
  state.ended = true;
  stream.writable = false;
}

function onCorkedFinish(corkReq, state, err) {
  var entry = corkReq.entry;
  corkReq.entry = null;
  while (entry) {
    var cb = entry.callback;
    state.pendingcb--;
    cb(err);
    entry = entry.next;
  }

  // reuse the free corkReq.
  state.corkedRequestsFree.next = corkReq;
}

Object.defineProperty(Writable.prototype, 'destroyed', {
  get: function () {
    if (this._writableState === undefined) {
      return false;
    }
    return this._writableState.destroyed;
  },
  set: function (value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (!this._writableState) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._writableState.destroyed = value;
  }
});

Writable.prototype.destroy = destroyImpl.destroy;
Writable.prototype._undestroy = destroyImpl.undestroy;
Writable.prototype._destroy = function (err, cb) {
  this.end();
  cb(err);
};
}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate)
},{"./_stream_duplex":275,"./internal/streams/destroy":281,"./internal/streams/stream":282,"_process":254,"core-util-is":141,"inherits":219,"process-nextick-args":253,"safe-buffer":283,"timers":539,"util-deprecate":543}],280:[function(require,module,exports){
'use strict';

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Buffer = require('safe-buffer').Buffer;
var util = require('util');

function copyBuffer(src, target, offset) {
  src.copy(target, offset);
}

module.exports = function () {
  function BufferList() {
    _classCallCheck(this, BufferList);

    this.head = null;
    this.tail = null;
    this.length = 0;
  }

  BufferList.prototype.push = function push(v) {
    var entry = { data: v, next: null };
    if (this.length > 0) this.tail.next = entry;else this.head = entry;
    this.tail = entry;
    ++this.length;
  };

  BufferList.prototype.unshift = function unshift(v) {
    var entry = { data: v, next: this.head };
    if (this.length === 0) this.tail = entry;
    this.head = entry;
    ++this.length;
  };

  BufferList.prototype.shift = function shift() {
    if (this.length === 0) return;
    var ret = this.head.data;
    if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
    --this.length;
    return ret;
  };

  BufferList.prototype.clear = function clear() {
    this.head = this.tail = null;
    this.length = 0;
  };

  BufferList.prototype.join = function join(s) {
    if (this.length === 0) return '';
    var p = this.head;
    var ret = '' + p.data;
    while (p = p.next) {
      ret += s + p.data;
    }return ret;
  };

  BufferList.prototype.concat = function concat(n) {
    if (this.length === 0) return Buffer.alloc(0);
    var ret = Buffer.allocUnsafe(n >>> 0);
    var p = this.head;
    var i = 0;
    while (p) {
      copyBuffer(p.data, ret, i);
      i += p.data.length;
      p = p.next;
    }
    return ret;
  };

  return BufferList;
}();

if (util && util.inspect && util.inspect.custom) {
  module.exports.prototype[util.inspect.custom] = function () {
    var obj = util.inspect({ length: this.length });
    return this.constructor.name + ' ' + obj;
  };
}
},{"safe-buffer":283,"util":54}],281:[function(require,module,exports){
'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

// undocumented cb() API, needed for core, not for public API
function destroy(err, cb) {
  var _this = this;

  var readableDestroyed = this._readableState && this._readableState.destroyed;
  var writableDestroyed = this._writableState && this._writableState.destroyed;

  if (readableDestroyed || writableDestroyed) {
    if (cb) {
      cb(err);
    } else if (err) {
      if (!this._writableState) {
        pna.nextTick(emitErrorNT, this, err);
      } else if (!this._writableState.errorEmitted) {
        this._writableState.errorEmitted = true;
        pna.nextTick(emitErrorNT, this, err);
      }
    }

    return this;
  }

  // we set destroyed to true before firing error callbacks in order
  // to make it re-entrance safe in case destroy() is called within callbacks

  if (this._readableState) {
    this._readableState.destroyed = true;
  }

  // if this is a duplex stream mark the writable part as destroyed as well
  if (this._writableState) {
    this._writableState.destroyed = true;
  }

  this._destroy(err || null, function (err) {
    if (!cb && err) {
      if (!_this._writableState) {
        pna.nextTick(emitErrorNT, _this, err);
      } else if (!_this._writableState.errorEmitted) {
        _this._writableState.errorEmitted = true;
        pna.nextTick(emitErrorNT, _this, err);
      }
    } else if (cb) {
      cb(err);
    }
  });

  return this;
}

function undestroy() {
  if (this._readableState) {
    this._readableState.destroyed = false;
    this._readableState.reading = false;
    this._readableState.ended = false;
    this._readableState.endEmitted = false;
  }

  if (this._writableState) {
    this._writableState.destroyed = false;
    this._writableState.ended = false;
    this._writableState.ending = false;
    this._writableState.finalCalled = false;
    this._writableState.prefinished = false;
    this._writableState.finished = false;
    this._writableState.errorEmitted = false;
  }
}

function emitErrorNT(self, err) {
  self.emit('error', err);
}

module.exports = {
  destroy: destroy,
  undestroy: undestroy
};
},{"process-nextick-args":253}],282:[function(require,module,exports){
module.exports = require('events').EventEmitter;

},{"events":188}],283:[function(require,module,exports){
/* eslint-disable node/no-deprecated-api */
var buffer = require('buffer')
var Buffer = buffer.Buffer

// alternative to using Object.keys for old browsers
function copyProps (src, dst) {
  for (var key in src) {
    dst[key] = src[key]
  }
}
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  module.exports = buffer
} else {
  // Copy properties from require('buffer')
  copyProps(buffer, exports)
  exports.Buffer = SafeBuffer
}

function SafeBuffer (arg, encodingOrOffset, length) {
  return Buffer(arg, encodingOrOffset, length)
}

// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)

SafeBuffer.from = function (arg, encodingOrOffset, length) {
  if (typeof arg === 'number') {
    throw new TypeError('Argument must not be a number')
  }
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.alloc = function (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  var buf = Buffer(size)
  if (fill !== undefined) {
    if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
  } else {
    buf.fill(0)
  }
  return buf
}

SafeBuffer.allocUnsafe = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return Buffer(size)
}

SafeBuffer.allocUnsafeSlow = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return buffer.SlowBuffer(size)
}

},{"buffer":83}],284:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

/*<replacement>*/

var Buffer = require('safe-buffer').Buffer;
/*</replacement>*/

var isEncoding = Buffer.isEncoding || function (encoding) {
  encoding = '' + encoding;
  switch (encoding && encoding.toLowerCase()) {
    case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
      return true;
    default:
      return false;
  }
};

function _normalizeEncoding(enc) {
  if (!enc) return 'utf8';
  var retried;
  while (true) {
    switch (enc) {
      case 'utf8':
      case 'utf-8':
        return 'utf8';
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return 'utf16le';
      case 'latin1':
      case 'binary':
        return 'latin1';
      case 'base64':
      case 'ascii':
      case 'hex':
        return enc;
      default:
        if (retried) return; // undefined
        enc = ('' + enc).toLowerCase();
        retried = true;
    }
  }
};

// Do not cache `Buffer.isEncoding` when checking encoding names as some
// modules monkey-patch it to support additional encodings
function normalizeEncoding(enc) {
  var nenc = _normalizeEncoding(enc);
  if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
  return nenc || enc;
}

// StringDecoder provides an interface for efficiently splitting a series of
// buffers into a series of JS strings without breaking apart multi-byte
// characters.
exports.StringDecoder = StringDecoder;
function StringDecoder(encoding) {
  this.encoding = normalizeEncoding(encoding);
  var nb;
  switch (this.encoding) {
    case 'utf16le':
      this.text = utf16Text;
      this.end = utf16End;
      nb = 4;
      break;
    case 'utf8':
      this.fillLast = utf8FillLast;
      nb = 4;
      break;
    case 'base64':
      this.text = base64Text;
      this.end = base64End;
      nb = 3;
      break;
    default:
      this.write = simpleWrite;
      this.end = simpleEnd;
      return;
  }
  this.lastNeed = 0;
  this.lastTotal = 0;
  this.lastChar = Buffer.allocUnsafe(nb);
}

StringDecoder.prototype.write = function (buf) {
  if (buf.length === 0) return '';
  var r;
  var i;
  if (this.lastNeed) {
    r = this.fillLast(buf);
    if (r === undefined) return '';
    i = this.lastNeed;
    this.lastNeed = 0;
  } else {
    i = 0;
  }
  if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
  return r || '';
};

StringDecoder.prototype.end = utf8End;

// Returns only complete characters in a Buffer
StringDecoder.prototype.text = utf8Text;

// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
StringDecoder.prototype.fillLast = function (buf) {
  if (this.lastNeed <= buf.length) {
    buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  }
  buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
  this.lastNeed -= buf.length;
};

// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
// continuation byte. If an invalid byte is detected, -2 is returned.
function utf8CheckByte(byte) {
  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
  return byte >> 6 === 0x02 ? -1 : -2;
}

// Checks at most 3 bytes at the end of a Buffer in order to detect an
// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
// needed to complete the UTF-8 character (if applicable) are returned.
function utf8CheckIncomplete(self, buf, i) {
  var j = buf.length - 1;
  if (j < i) return 0;
  var nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) self.lastNeed = nb - 1;
    return nb;
  }
  if (--j < i || nb === -2) return 0;
  nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) self.lastNeed = nb - 2;
    return nb;
  }
  if (--j < i || nb === -2) return 0;
  nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) {
      if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
    }
    return nb;
  }
  return 0;
}

// Validates as many continuation bytes for a multi-byte UTF-8 character as
// needed or are available. If we see a non-continuation byte where we expect
// one, we "replace" the validated continuation bytes we've seen so far with
// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
// behavior. The continuation byte check is included three times in the case
// where all of the continuation bytes for a character exist in the same buffer.
// It is also done this way as a slight performance increase instead of using a
// loop.
function utf8CheckExtraBytes(self, buf, p) {
  if ((buf[0] & 0xC0) !== 0x80) {
    self.lastNeed = 0;
    return '\ufffd';
  }
  if (self.lastNeed > 1 && buf.length > 1) {
    if ((buf[1] & 0xC0) !== 0x80) {
      self.lastNeed = 1;
      return '\ufffd';
    }
    if (self.lastNeed > 2 && buf.length > 2) {
      if ((buf[2] & 0xC0) !== 0x80) {
        self.lastNeed = 2;
        return '\ufffd';
      }
    }
  }
}

// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
function utf8FillLast(buf) {
  var p = this.lastTotal - this.lastNeed;
  var r = utf8CheckExtraBytes(this, buf, p);
  if (r !== undefined) return r;
  if (this.lastNeed <= buf.length) {
    buf.copy(this.lastChar, p, 0, this.lastNeed);
    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  }
  buf.copy(this.lastChar, p, 0, buf.length);
  this.lastNeed -= buf.length;
}

// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
// partial character, the character's bytes are buffered until the required
// number of bytes are available.
function utf8Text(buf, i) {
  var total = utf8CheckIncomplete(this, buf, i);
  if (!this.lastNeed) return buf.toString('utf8', i);
  this.lastTotal = total;
  var end = buf.length - (total - this.lastNeed);
  buf.copy(this.lastChar, 0, end);
  return buf.toString('utf8', i, end);
}

// For UTF-8, a replacement character is added when ending on a partial
// character.
function utf8End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) return r + '\ufffd';
  return r;
}

// UTF-16LE typically needs two bytes per character, but even if we have an even
// number of bytes available, we need to check if we end on a leading/high
// surrogate. In that case, we need to wait for the next two bytes in order to
// decode the last character properly.
function utf16Text(buf, i) {
  if ((buf.length - i) % 2 === 0) {
    var r = buf.toString('utf16le', i);
    if (r) {
      var c = r.charCodeAt(r.length - 1);
      if (c >= 0xD800 && c <= 0xDBFF) {
        this.lastNeed = 2;
        this.lastTotal = 4;
        this.lastChar[0] = buf[buf.length - 2];
        this.lastChar[1] = buf[buf.length - 1];
        return r.slice(0, -1);
      }
    }
    return r;
  }
  this.lastNeed = 1;
  this.lastTotal = 2;
  this.lastChar[0] = buf[buf.length - 1];
  return buf.toString('utf16le', i, buf.length - 1);
}

// For UTF-16LE we do not explicitly append special replacement characters if we
// end on a partial character, we simply let v8 handle that.
function utf16End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) {
    var end = this.lastTotal - this.lastNeed;
    return r + this.lastChar.toString('utf16le', 0, end);
  }
  return r;
}

function base64Text(buf, i) {
  var n = (buf.length - i) % 3;
  if (n === 0) return buf.toString('base64', i);
  this.lastNeed = 3 - n;
  this.lastTotal = 3;
  if (n === 1) {
    this.lastChar[0] = buf[buf.length - 1];
  } else {
    this.lastChar[0] = buf[buf.length - 2];
    this.lastChar[1] = buf[buf.length - 1];
  }
  return buf.toString('base64', i, buf.length - n);
}

function base64End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
  return r;
}

// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
function simpleWrite(buf) {
  return buf.toString(this.encoding);
}

function simpleEnd(buf) {
  return buf && buf.length ? this.write(buf) : '';
}
},{"safe-buffer":283}],285:[function(require,module,exports){
exports = module.exports = require('./lib/_stream_readable.js');
exports.Stream = exports;
exports.Readable = exports;
exports.Writable = require('./lib/_stream_writable.js');
exports.Duplex = require('./lib/_stream_duplex.js');
exports.Transform = require('./lib/_stream_transform.js');
exports.PassThrough = require('./lib/_stream_passthrough.js');

},{"./lib/_stream_duplex.js":275,"./lib/_stream_passthrough.js":276,"./lib/_stream_readable.js":277,"./lib/_stream_transform.js":278,"./lib/_stream_writable.js":279}],286:[function(require,module,exports){
'use strict'
var Buffer = require('buffer').Buffer
var inherits = require('inherits')
var HashBase = require('hash-base')

var ARRAY16 = new Array(16)

var zl = [
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
  3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
  1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
  4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
]

var zr = [
  5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
  6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
  15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
  8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
  12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
]

var sl = [
  11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
  7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
  11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
  11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
  9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
]

var sr = [
  8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
  9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
  9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
  15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
  8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
]

var hl = [0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e]
var hr = [0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000]

function RIPEMD160 () {
  HashBase.call(this, 64)

  // state
  this._a = 0x67452301
  this._b = 0xefcdab89
  this._c = 0x98badcfe
  this._d = 0x10325476
  this._e = 0xc3d2e1f0
}

inherits(RIPEMD160, HashBase)

RIPEMD160.prototype._update = function () {
  var words = ARRAY16
  for (var j = 0; j < 16; ++j) words[j] = this._block.readInt32LE(j * 4)

  var al = this._a | 0
  var bl = this._b | 0
  var cl = this._c | 0
  var dl = this._d | 0
  var el = this._e | 0

  var ar = this._a | 0
  var br = this._b | 0
  var cr = this._c | 0
  var dr = this._d | 0
  var er = this._e | 0

  // computation
  for (var i = 0; i < 80; i += 1) {
    var tl
    var tr
    if (i < 16) {
      tl = fn1(al, bl, cl, dl, el, words[zl[i]], hl[0], sl[i])
      tr = fn5(ar, br, cr, dr, er, words[zr[i]], hr[0], sr[i])
    } else if (i < 32) {
      tl = fn2(al, bl, cl, dl, el, words[zl[i]], hl[1], sl[i])
      tr = fn4(ar, br, cr, dr, er, words[zr[i]], hr[1], sr[i])
    } else if (i < 48) {
      tl = fn3(al, bl, cl, dl, el, words[zl[i]], hl[2], sl[i])
      tr = fn3(ar, br, cr, dr, er, words[zr[i]], hr[2], sr[i])
    } else if (i < 64) {
      tl = fn4(al, bl, cl, dl, el, words[zl[i]], hl[3], sl[i])
      tr = fn2(ar, br, cr, dr, er, words[zr[i]], hr[3], sr[i])
    } else { // if (i<80) {
      tl = fn5(al, bl, cl, dl, el, words[zl[i]], hl[4], sl[i])
      tr = fn1(ar, br, cr, dr, er, words[zr[i]], hr[4], sr[i])
    }

    al = el
    el = dl
    dl = rotl(cl, 10)
    cl = bl
    bl = tl

    ar = er
    er = dr
    dr = rotl(cr, 10)
    cr = br
    br = tr
  }

  // update state
  var t = (this._b + cl + dr) | 0
  this._b = (this._c + dl + er) | 0
  this._c = (this._d + el + ar) | 0
  this._d = (this._e + al + br) | 0
  this._e = (this._a + bl + cr) | 0
  this._a = t
}

RIPEMD160.prototype._digest = function () {
  // create padding and handle blocks
  this._block[this._blockOffset++] = 0x80
  if (this._blockOffset > 56) {
    this._block.fill(0, this._blockOffset, 64)
    this._update()
    this._blockOffset = 0
  }

  this._block.fill(0, this._blockOffset, 56)
  this._block.writeUInt32LE(this._length[0], 56)
  this._block.writeUInt32LE(this._length[1], 60)
  this._update()

  // produce result
  var buffer = Buffer.alloc ? Buffer.alloc(20) : new Buffer(20)
  buffer.writeInt32LE(this._a, 0)
  buffer.writeInt32LE(this._b, 4)
  buffer.writeInt32LE(this._c, 8)
  buffer.writeInt32LE(this._d, 12)
  buffer.writeInt32LE(this._e, 16)
  return buffer
}

function rotl (x, n) {
  return (x << n) | (x >>> (32 - n))
}

function fn1 (a, b, c, d, e, m, k, s) {
  return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + e) | 0
}

function fn2 (a, b, c, d, e, m, k, s) {
  return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + e) | 0
}

function fn3 (a, b, c, d, e, m, k, s) {
  return (rotl((a + ((b | (~c)) ^ d) + m + k) | 0, s) + e) | 0
}

function fn4 (a, b, c, d, e, m, k, s) {
  return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + e) | 0
}

function fn5 (a, b, c, d, e, m, k, s) {
  return (rotl((a + (b ^ (c | (~d))) + m + k) | 0, s) + e) | 0
}

module.exports = RIPEMD160

},{"buffer":83,"hash-base":203,"inherits":219}],287:[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":288,"./internal/BehaviorSubject":289,"./internal/Notification":290,"./internal/Observable":292,"./internal/ReplaySubject":293,"./internal/Scheduler":294,"./internal/Subject":295,"./internal/Subscriber":296,"./internal/Subscription":297,"./internal/config":298,"./internal/firstValueFrom":299,"./internal/lastValueFrom":300,"./internal/observable/ConnectableObservable":301,"./internal/observable/bindCallback":302,"./internal/observable/bindNodeCallback":304,"./internal/observable/combineLatest":305,"./internal/observable/concat":306,"./internal/observable/connectable":307,"./internal/observable/defer":308,"./internal/observable/dom/animationFrames":309,"./internal/observable/empty":310,"./internal/observable/forkJoin":311,"./internal/observable/from":312,"./internal/observable/fromEvent":313,"./internal/observable/fromEventPattern":314,"./internal/observable/generate":316,"./internal/observable/iif":317,"./internal/observable/interval":319,"./internal/observable/merge":320,"./internal/observable/never":321,"./internal/observable/of":322,"./internal/observable/onErrorResumeNext":323,"./internal/observable/pairs":324,"./internal/observable/partition":325,"./internal/observable/race":326,"./internal/observable/range":327,"./internal/observable/throwError":328,"./internal/observable/timer":329,"./internal/observable/using":330,"./internal/observable/zip":331,"./internal/operators/audit":333,"./internal/operators/auditTime":334,"./internal/operators/buffer":335,"./internal/operators/bufferCount":336,"./internal/operators/bufferTime":337,"./internal/operators/bufferToggle":338,"./internal/operators/bufferWhen":339,"./internal/operators/catchError":340,"./internal/operators/combineAll":341,"./internal/operators/combineLatestAll":343,"./internal/operators/combineLatestWith":344,"./internal/operators/concatAll":346,"./internal/operators/concatMap":347,"./internal/operators/concatMapTo":348,"./internal/operators/concatWith":349,"./internal/operators/connect":350,"./internal/operators/count":351,"./internal/operators/debounce":352,"./internal/operators/debounceTime":353,"./internal/operators/defaultIfEmpty":354,"./internal/operators/delay":355,"./internal/operators/delayWhen":356,"./internal/operators/dematerialize":357,"./internal/operators/distinct":358,"./internal/operators/distinctUntilChanged":359,"./internal/operators/distinctUntilKeyChanged":360,"./internal/operators/elementAt":361,"./internal/operators/endWith":362,"./internal/operators/every":363,"./internal/operators/exhaust":364,"./internal/operators/exhaustAll":365,"./internal/operators/exhaustMap":366,"./internal/operators/expand":367,"./internal/operators/filter":368,"./internal/operators/finalize":369,"./internal/operators/find":370,"./internal/operators/findIndex":371,"./internal/operators/first":372,"./internal/operators/flatMap":373,"./internal/operators/groupBy":374,"./internal/operators/ignoreElements":375,"./internal/operators/isEmpty":376,"./internal/operators/last":378,"./internal/operators/map":379,"./internal/operators/mapTo":380,"./internal/operators/materialize":381,"./internal/operators/max":382,"./internal/operators/mergeAll":384,"./internal/operators/mergeMap":386,"./internal/operators/mergeMapTo":387,"./internal/operators/mergeScan":388,"./internal/operators/mergeWith":389,"./internal/operators/min":390,"./internal/operators/multicast":391,"./internal/operators/observeOn":392,"./internal/operators/onErrorResumeNextWith":393,"./internal/operators/pairwise":394,"./internal/operators/pluck":396,"./internal/operators/publish":397,"./internal/operators/publishBehavior":398,"./internal/operators/publishLast":399,"./internal/operators/publishReplay":400,"./internal/operators/raceWith":402,"./internal/operators/reduce":403,"./internal/operators/refCount":404,"./internal/operators/repeat":405,"./internal/operators/repeatWhen":406,"./internal/operators/retry":407,"./internal/operators/retryWhen":408,"./internal/operators/sample":409,"./internal/operators/sampleTime":410,"./internal/operators/scan":411,"./internal/operators/sequenceEqual":413,"./internal/operators/share":414,"./internal/operators/shareReplay":415,"./internal/operators/single":416,"./internal/operators/skip":417,"./internal/operators/skipLast":418,"./internal/operators/skipUntil":419,"./internal/operators/skipWhile":420,"./internal/operators/startWith":421,"./internal/operators/subscribeOn":422,"./internal/operators/switchAll":423,"./internal/operators/switchMap":424,"./internal/operators/switchMapTo":425,"./internal/operators/switchScan":426,"./internal/operators/take":427,"./internal/operators/takeLast":428,"./internal/operators/takeUntil":429,"./internal/operators/takeWhile":430,"./internal/operators/tap":431,"./internal/operators/throttle":432,"./internal/operators/throttleTime":433,"./internal/operators/throwIfEmpty":434,"./internal/operators/timeInterval":435,"./internal/operators/timeout":436,"./internal/operators/timeoutWith":437,"./internal/operators/timestamp":438,"./internal/operators/toArray":439,"./internal/operators/window":440,"./internal/operators/windowCount":441,"./internal/operators/windowTime":442,"./internal/operators/windowToggle":443,"./internal/operators/windowWhen":444,"./internal/operators/withLatestFrom":445,"./internal/operators/zipAll":447,"./internal/operators/zipWith":448,"./internal/scheduled/scheduled":455,"./internal/scheduler/VirtualTimeScheduler":465,"./internal/scheduler/animationFrame":466,"./internal/scheduler/asap":468,"./internal/scheduler/async":469,"./internal/scheduler/queue":474,"./internal/symbol/observable":477,"./internal/types":478,"./internal/util/ArgumentOutOfRangeError":479,"./internal/util/EmptyError":480,"./internal/util/NotFoundError":482,"./internal/util/ObjectUnsubscribedError":483,"./internal/util/SequenceError":484,"./internal/util/UnsubscriptionError":485,"./internal/util/identity":494,"./internal/util/isObservable":501,"./internal/util/noop":507,"./internal/util/pipe":509}],288:[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":295}],289:[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":295}],290:[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":310,"./observable/of":322,"./observable/throwError":328,"./util/isFunction":498}],291:[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;

},{}],292:[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":296,"./Subscription":297,"./config":298,"./symbol/observable":477,"./util/errorContext":492,"./util/isFunction":498,"./util/pipe":509}],293:[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":295,"./scheduler/dateTimestampProvider":470}],294:[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":470}],295:[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":292,"./Subscription":297,"./util/ObjectUnsubscribedError":483,"./util/arrRemove":489,"./util/errorContext":492}],296:[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":291,"./Subscription":297,"./config":298,"./scheduler/timeoutProvider":475,"./util/errorContext":492,"./util/isFunction":498,"./util/noop":507,"./util/reportUnhandledError":510}],297:[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":485,"./util/arrRemove":489,"./util/isFunction":498}],298:[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,
};

},{}],299:[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":296,"./util/EmptyError":480}],300:[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":480}],301:[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":292,"../Subscription":297,"../operators/OperatorSubscriber":332,"../operators/refCount":404,"../util/lift":505}],302:[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":303}],303:[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":288,"../Observable":292,"../operators/observeOn":392,"../operators/subscribeOn":422,"../util/isScheduler":504,"../util/mapOneOrManyArgs":506}],304:[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":303}],305:[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":292,"../operators/OperatorSubscriber":332,"../util/args":486,"../util/argsArgArrayOrObject":487,"../util/createObject":491,"../util/executeSchedule":493,"../util/identity":494,"../util/mapOneOrManyArgs":506,"./from":312}],306:[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":346,"../util/args":486,"./from":312}],307:[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":292,"../Subject":295,"./defer":308}],308:[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":292,"./innerFrom":318}],309:[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":292,"../../scheduler/animationFrameProvider":467,"../../scheduler/performanceTimestampProvider":473}],310:[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":292}],311:[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":292,"../operators/OperatorSubscriber":332,"../util/args":486,"../util/argsArgArrayOrObject":487,"../util/createObject":491,"../util/mapOneOrManyArgs":506,"./innerFrom":318}],312:[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":455,"./innerFrom":318}],313:[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":292,"../observable/innerFrom":318,"../operators/mergeMap":386,"../util/isArrayLike":495,"../util/isFunction":498,"../util/mapOneOrManyArgs":506}],314:[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":292,"../util/isFunction":498,"../util/mapOneOrManyArgs":506}],315:[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":292}],316:[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":451,"../util/identity":494,"../util/isScheduler":504,"./defer":308}],317:[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":308}],318:[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":292,"../symbol/observable":477,"../util/isArrayLike":495,"../util/isAsyncIterable":496,"../util/isFunction":498,"../util/isInteropObservable":499,"../util/isIterable":500,"../util/isPromise":502,"../util/isReadableStreamLike":503,"../util/reportUnhandledError":510,"../util/throwUnobservableError":511,"_process":254}],319:[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":469,"./timer":329}],320:[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":384,"../util/args":486,"./empty":310,"./from":312,"./innerFrom":318}],321:[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":292,"../util/noop":507}],322:[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":486,"./from":312}],323:[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":292,"../operators/OperatorSubscriber":332,"../util/argsOrArgArray":488,"../util/noop":507,"./innerFrom":318}],324:[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":312}],325:[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":368,"../util/not":508,"./innerFrom":318}],326:[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":292,"../operators/OperatorSubscriber":332,"../util/argsOrArgArray":488,"./innerFrom":318}],327:[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":292,"./empty":310}],328:[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":292,"../util/isFunction":498}],329:[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":292,"../scheduler/async":469,"../util/isDate":497,"../util/isScheduler":504}],330:[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":292,"./empty":310,"./innerFrom":318}],331:[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":292,"../operators/OperatorSubscriber":332,"../util/args":486,"../util/argsOrArgArray":488,"./empty":310,"./innerFrom":318}],332:[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":296}],333:[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":318,"../util/lift":505,"./OperatorSubscriber":332}],334:[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":329,"../scheduler/async":469,"./audit":333}],335:[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":318,"../util/lift":505,"../util/noop":507,"./OperatorSubscriber":332}],336:[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":489,"../util/lift":505,"./OperatorSubscriber":332}],337:[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":297,"../scheduler/async":469,"../util/args":486,"../util/arrRemove":489,"../util/executeSchedule":493,"../util/lift":505,"./OperatorSubscriber":332}],338:[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":297,"../observable/innerFrom":318,"../util/arrRemove":489,"../util/lift":505,"../util/noop":507,"./OperatorSubscriber":332}],339:[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":318,"../util/lift":505,"../util/noop":507,"./OperatorSubscriber":332}],340:[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":318,"../util/lift":505,"./OperatorSubscriber":332}],341:[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":343}],342:[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":305,"../util/args":486,"../util/argsOrArgArray":488,"../util/lift":505,"../util/mapOneOrManyArgs":506,"../util/pipe":509}],343:[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":305,"./joinAllInternals":377}],344:[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":342}],345:[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":312,"../util/args":486,"../util/lift":505,"./concatAll":346}],346:[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":384}],347:[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":498,"./mergeMap":386}],348:[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":498,"./concatMap":347}],349:[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":345}],350:[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":295,"../observable/fromSubscribable":315,"../observable/innerFrom":318,"../util/lift":505}],351:[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":403}],352:[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":318,"../util/lift":505,"../util/noop":507,"./OperatorSubscriber":332}],353:[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":469,"../util/lift":505,"./OperatorSubscriber":332}],354:[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":505,"./OperatorSubscriber":332}],355:[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":329,"../scheduler/async":469,"./delayWhen":356}],356:[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":306,"../observable/innerFrom":318,"./ignoreElements":375,"./mapTo":380,"./mergeMap":386,"./take":427}],357:[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":290,"../util/lift":505,"./OperatorSubscriber":332}],358:[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":318,"../util/lift":505,"../util/noop":507,"./OperatorSubscriber":332}],359:[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":494,"../util/lift":505,"./OperatorSubscriber":332}],360:[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":359}],361:[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":479,"./defaultIfEmpty":354,"./filter":368,"./take":427,"./throwIfEmpty":434}],362:[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":306,"../observable/of":322}],363:[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":505,"./OperatorSubscriber":332}],364:[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":365}],365:[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":494,"./exhaustMap":366}],366:[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":318,"../util/lift":505,"./OperatorSubscriber":332,"./map":379}],367:[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":505,"./mergeInternals":385}],368:[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":505,"./OperatorSubscriber":332}],369:[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":505}],370:[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":505,"./OperatorSubscriber":332}],371:[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":505,"./find":370}],372:[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":480,"../util/identity":494,"./defaultIfEmpty":354,"./filter":368,"./take":427,"./throwIfEmpty":434}],373:[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":386}],374:[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":292,"../Subject":295,"../observable/innerFrom":318,"../util/lift":505,"./OperatorSubscriber":332}],375:[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":505,"../util/noop":507,"./OperatorSubscriber":332}],376:[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":505,"./OperatorSubscriber":332}],377:[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":494,"../util/mapOneOrManyArgs":506,"../util/pipe":509,"./mergeMap":386,"./toArray":439}],378:[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":480,"../util/identity":494,"./defaultIfEmpty":354,"./filter":368,"./takeLast":428,"./throwIfEmpty":434}],379:[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":505,"./OperatorSubscriber":332}],380:[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":379}],381:[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":290,"../util/lift":505,"./OperatorSubscriber":332}],382:[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":498,"./reduce":403}],383:[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 argsOrArgArray_1 = require("../util/argsOrArgArray");
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);
    args = argsOrArgArray_1.argsOrArgArray(args);
    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":312,"../util/args":486,"../util/argsOrArgArray":488,"../util/lift":505,"./mergeAll":384}],384:[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":494,"./mergeMap":386}],385:[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":318,"../util/executeSchedule":493,"./OperatorSubscriber":332}],386:[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":318,"../util/isFunction":498,"../util/lift":505,"./map":379,"./mergeInternals":385}],387:[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":498,"./mergeMap":386}],388:[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":505,"./mergeInternals":385}],389:[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":383}],390:[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":498,"./reduce":403}],391:[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":301,"../util/isFunction":498,"./connect":350}],392:[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":493,"../util/lift":505,"./OperatorSubscriber":332}],393:[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":323,"../util/argsOrArgArray":488}],394:[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":505,"./OperatorSubscriber":332}],395:[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":508,"./filter":368}],396:[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":379}],397:[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":295,"./connect":350,"./multicast":391}],398:[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":289,"../observable/ConnectableObservable":301}],399:[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":288,"../observable/ConnectableObservable":301}],400:[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":293,"../util/isFunction":498,"./multicast":391}],401:[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":488,"./raceWith":402}],402:[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":326,"../util/identity":494,"../util/lift":505}],403:[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":505,"./scanInternals":412}],404:[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":505,"./OperatorSubscriber":332}],405:[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":310,"../observable/innerFrom":318,"../observable/timer":329,"../util/lift":505,"./OperatorSubscriber":332}],406:[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":295,"../observable/innerFrom":318,"../util/lift":505,"./OperatorSubscriber":332}],407:[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":318,"../observable/timer":329,"../util/identity":494,"../util/lift":505,"./OperatorSubscriber":332}],408:[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":295,"../observable/innerFrom":318,"../util/lift":505,"./OperatorSubscriber":332}],409:[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":318,"../util/lift":505,"../util/noop":507,"./OperatorSubscriber":332}],410:[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":319,"../scheduler/async":469,"./sample":409}],411:[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":505,"./scanInternals":412}],412:[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":332}],413:[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":318,"../util/lift":505,"./OperatorSubscriber":332}],414:[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":295,"../Subscriber":296,"../observable/innerFrom":318,"../util/lift":505}],415:[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":293,"./share":414}],416:[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":480,"../util/NotFoundError":482,"../util/SequenceError":484,"../util/lift":505,"./OperatorSubscriber":332}],417:[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":368}],418:[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":494,"../util/lift":505,"./OperatorSubscriber":332}],419:[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":318,"../util/lift":505,"../util/noop":507,"./OperatorSubscriber":332}],420:[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":505,"./OperatorSubscriber":332}],421:[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":306,"../util/args":486,"../util/lift":505}],422:[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":505}],423:[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":494,"./switchMap":424}],424:[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":318,"../util/lift":505,"./OperatorSubscriber":332}],425:[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":498,"./switchMap":424}],426:[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":505,"./switchMap":424}],427:[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":310,"../util/lift":505,"./OperatorSubscriber":332}],428:[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":310,"../util/lift":505,"./OperatorSubscriber":332}],429:[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":318,"../util/lift":505,"../util/noop":507,"./OperatorSubscriber":332}],430:[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":505,"./OperatorSubscriber":332}],431:[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":494,"../util/isFunction":498,"../util/lift":505,"./OperatorSubscriber":332}],432:[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":318,"../util/lift":505,"./OperatorSubscriber":332}],433:[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":329,"../scheduler/async":469,"./throttle":432}],434:[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":480,"../util/lift":505,"./OperatorSubscriber":332}],435:[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":469,"../util/lift":505,"./OperatorSubscriber":332}],436:[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":318,"../scheduler/async":469,"../util/createErrorClass":490,"../util/executeSchedule":493,"../util/isDate":497,"../util/lift":505,"./OperatorSubscriber":332}],437:[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":469,"../util/isDate":497,"./timeout":436}],438:[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":470,"./map":379}],439:[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":505,"./reduce":403}],440:[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":295,"../observable/innerFrom":318,"../util/lift":505,"../util/noop":507,"./OperatorSubscriber":332}],441:[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":295,"../util/lift":505,"./OperatorSubscriber":332}],442:[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":295,"../Subscription":297,"../scheduler/async":469,"../util/args":486,"../util/arrRemove":489,"../util/executeSchedule":493,"../util/lift":505,"./OperatorSubscriber":332}],443:[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":295,"../Subscription":297,"../observable/innerFrom":318,"../util/arrRemove":489,"../util/lift":505,"../util/noop":507,"./OperatorSubscriber":332}],444:[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":295,"../observable/innerFrom":318,"../util/lift":505,"./OperatorSubscriber":332}],445:[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":318,"../util/args":486,"../util/identity":494,"../util/lift":505,"../util/noop":507,"./OperatorSubscriber":332}],446:[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":331,"../util/lift":505}],447:[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":331,"./joinAllInternals":377}],448:[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":446}],449:[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":292}],450:[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":292,"../util/executeSchedule":493}],451:[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":292,"../symbol/iterator":476,"../util/executeSchedule":493,"../util/isFunction":498}],452:[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":318,"../operators/observeOn":392,"../operators/subscribeOn":422}],453:[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":318,"../operators/observeOn":392,"../operators/subscribeOn":422}],454:[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":503,"./scheduleAsyncIterable":450}],455:[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":495,"../util/isAsyncIterable":496,"../util/isInteropObservable":499,"../util/isIterable":500,"../util/isPromise":502,"../util/isReadableStreamLike":503,"../util/throwUnobservableError":511,"./scheduleArray":449,"./scheduleAsyncIterable":450,"./scheduleIterable":451,"./scheduleObservable":452,"./schedulePromise":453,"./scheduleReadableStreamLike":454}],456:[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":297}],457:[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 && ((_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":461,"./animationFrameProvider":467}],458:[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 = 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":462}],459:[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":461,"./immediateProvider":471}],460:[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":462}],461:[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":489,"./Action":456,"./intervalProvider":472}],462:[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":294}],463:[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":461}],464:[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":462}],465:[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":297,"./AsyncAction":461,"./AsyncScheduler":462}],466:[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":457,"./AnimationFrameScheduler":458}],467:[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":297}],468:[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":459,"./AsapScheduler":460}],469:[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":461,"./AsyncScheduler":462}],470:[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,
};

},{}],471:[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":481}],472:[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,
};

},{}],473:[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,
};

},{}],474:[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":463,"./QueueScheduler":464}],475:[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,
};

},{}],476:[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();

},{}],477:[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'; })();

},{}],478:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });

},{}],479:[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":490}],480:[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":490}],481:[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;
    }
};

},{}],482:[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":490}],483:[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":490}],484:[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":490}],485:[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":490}],486:[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":498,"./isScheduler":504}],487:[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;
}

},{}],488:[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;

},{}],489:[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;

},{}],490:[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;

},{}],491:[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;

},{}],492:[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":298}],493:[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;

},{}],494:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.identity = void 0;
function identity(x) {
    return x;
}
exports.identity = identity;

},{}],495:[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'; });

},{}],496:[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":498}],497:[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;

},{}],498:[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;

},{}],499:[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":477,"./isFunction":498}],500:[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":476,"./isFunction":498}],501:[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":292,"./isFunction":498}],502:[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":498}],503:[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":498}],504:[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":498}],505:[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":498}],506:[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":379}],507:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.noop = void 0;
function noop() { }
exports.noop = noop;

},{}],508:[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;

},{}],509:[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":494}],510:[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":298,"../scheduler/timeoutProvider":475}],511:[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;

},{}],512:[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":333,"../internal/operators/auditTime":334,"../internal/operators/buffer":335,"../internal/operators/bufferCount":336,"../internal/operators/bufferTime":337,"../internal/operators/bufferToggle":338,"../internal/operators/bufferWhen":339,"../internal/operators/catchError":340,"../internal/operators/combineAll":341,"../internal/operators/combineLatest":342,"../internal/operators/combineLatestAll":343,"../internal/operators/combineLatestWith":344,"../internal/operators/concat":345,"../internal/operators/concatAll":346,"../internal/operators/concatMap":347,"../internal/operators/concatMapTo":348,"../internal/operators/concatWith":349,"../internal/operators/connect":350,"../internal/operators/count":351,"../internal/operators/debounce":352,"../internal/operators/debounceTime":353,"../internal/operators/defaultIfEmpty":354,"../internal/operators/delay":355,"../internal/operators/delayWhen":356,"../internal/operators/dematerialize":357,"../internal/operators/distinct":358,"../internal/operators/distinctUntilChanged":359,"../internal/operators/distinctUntilKeyChanged":360,"../internal/operators/elementAt":361,"../internal/operators/endWith":362,"../internal/operators/every":363,"../internal/operators/exhaust":364,"../internal/operators/exhaustAll":365,"../internal/operators/exhaustMap":366,"../internal/operators/expand":367,"../internal/operators/filter":368,"../internal/operators/finalize":369,"../internal/operators/find":370,"../internal/operators/findIndex":371,"../internal/operators/first":372,"../internal/operators/flatMap":373,"../internal/operators/groupBy":374,"../internal/operators/ignoreElements":375,"../internal/operators/isEmpty":376,"../internal/operators/last":378,"../internal/operators/map":379,"../internal/operators/mapTo":380,"../internal/operators/materialize":381,"../internal/operators/max":382,"../internal/operators/merge":383,"../internal/operators/mergeAll":384,"../internal/operators/mergeMap":386,"../internal/operators/mergeMapTo":387,"../internal/operators/mergeScan":388,"../internal/operators/mergeWith":389,"../internal/operators/min":390,"../internal/operators/multicast":391,"../internal/operators/observeOn":392,"../internal/operators/onErrorResumeNextWith":393,"../internal/operators/pairwise":394,"../internal/operators/partition":395,"../internal/operators/pluck":396,"../internal/operators/publish":397,"../internal/operators/publishBehavior":398,"../internal/operators/publishLast":399,"../internal/operators/publishReplay":400,"../internal/operators/race":401,"../internal/operators/raceWith":402,"../internal/operators/reduce":403,"../internal/operators/refCount":404,"../internal/operators/repeat":405,"../internal/operators/repeatWhen":406,"../internal/operators/retry":407,"../internal/operators/retryWhen":408,"../internal/operators/sample":409,"../internal/operators/sampleTime":410,"../internal/operators/scan":411,"../internal/operators/sequenceEqual":413,"../internal/operators/share":414,"../internal/operators/shareReplay":415,"../internal/operators/single":416,"../internal/operators/skip":417,"../internal/operators/skipLast":418,"../internal/operators/skipUntil":419,"../internal/operators/skipWhile":420,"../internal/operators/startWith":421,"../internal/operators/subscribeOn":422,"../internal/operators/switchAll":423,"../internal/operators/switchMap":424,"../internal/operators/switchMapTo":425,"../internal/operators/switchScan":426,"../internal/operators/take":427,"../internal/operators/takeLast":428,"../internal/operators/takeUntil":429,"../internal/operators/takeWhile":430,"../internal/operators/tap":431,"../internal/operators/throttle":432,"../internal/operators/throttleTime":433,"../internal/operators/throwIfEmpty":434,"../internal/operators/timeInterval":435,"../internal/operators/timeout":436,"../internal/operators/timeoutWith":437,"../internal/operators/timestamp":438,"../internal/operators/toArray":439,"../internal/operators/window":440,"../internal/operators/windowCount":441,"../internal/operators/windowTime":442,"../internal/operators/windowToggle":443,"../internal/operators/windowWhen":444,"../internal/operators/withLatestFrom":445,"../internal/operators/zip":446,"../internal/operators/zipAll":447,"../internal/operators/zipWith":448}],513:[function(require,module,exports){
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
/* eslint-disable node/no-deprecated-api */
var buffer = require('buffer')
var Buffer = buffer.Buffer

// alternative to using Object.keys for old browsers
function copyProps (src, dst) {
  for (var key in src) {
    dst[key] = src[key]
  }
}
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  module.exports = buffer
} else {
  // Copy properties from require('buffer')
  copyProps(buffer, exports)
  exports.Buffer = SafeBuffer
}

function SafeBuffer (arg, encodingOrOffset, length) {
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.prototype = Object.create(Buffer.prototype)

// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)

SafeBuffer.from = function (arg, encodingOrOffset, length) {
  if (typeof arg === 'number') {
    throw new TypeError('Argument must not be a number')
  }
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.alloc = function (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  var buf = Buffer(size)
  if (fill !== undefined) {
    if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
  } else {
    buf.fill(0)
  }
  return buf
}

SafeBuffer.allocUnsafe = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return Buffer(size)
}

SafeBuffer.allocUnsafeSlow = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return buffer.SlowBuffer(size)
}

},{"buffer":83}],514:[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');
var define = require('define-data-property');
var hasDescriptors = require('has-property-descriptors')();
var gOPD = require('gopd');

var $TypeError = require('es-errors/type');
var $floor = GetIntrinsic('%Math.floor%');

/** @type {import('.')} */
module.exports = function setFunctionLength(fn, length) {
	if (typeof fn !== 'function') {
		throw new $TypeError('`fn` is not a function');
	}
	if (typeof length !== 'number' || length < 0 || length > 0xFFFFFFFF || $floor(length) !== length) {
		throw new $TypeError('`length` must be a positive 32-bit integer');
	}

	var loose = arguments.length > 2 && !!arguments[2];

	var functionLengthIsConfigurable = true;
	var functionLengthIsWritable = true;
	if ('length' in fn && gOPD) {
		var desc = gOPD(fn, 'length');
		if (desc && !desc.configurable) {
			functionLengthIsConfigurable = false;
		}
		if (desc && !desc.writable) {
			functionLengthIsWritable = false;
		}
	}

	if (functionLengthIsConfigurable || functionLengthIsWritable || !loose) {
		if (hasDescriptors) {
			define(/** @type {Parameters<define>[0]} */ (fn), 'length', length, true, true);
		} else {
			define(/** @type {Parameters<define>[0]} */ (fn), 'length', length);
		}
	}
	return fn;
};

},{"define-data-property":149,"es-errors/type":185,"get-intrinsic":193,"gopd":198,"has-property-descriptors":199}],515:[function(require,module,exports){
var Buffer = require('safe-buffer').Buffer

// prototype class for hash functions
function Hash (blockSize, finalSize) {
  this._block = Buffer.alloc(blockSize)
  this._finalSize = finalSize
  this._blockSize = blockSize
  this._len = 0
}

Hash.prototype.update = function (data, enc) {
  if (typeof data === 'string') {
    enc = enc || 'utf8'
    data = Buffer.from(data, enc)
  }

  var block = this._block
  var blockSize = this._blockSize
  var length = data.length
  var accum = this._len

  for (var offset = 0; offset < length;) {
    var assigned = accum % blockSize
    var remainder = Math.min(length - offset, blockSize - assigned)

    for (var i = 0; i < remainder; i++) {
      block[assigned + i] = data[offset + i]
    }

    accum += remainder
    offset += remainder

    if ((accum % blockSize) === 0) {
      this._update(block)
    }
  }

  this._len += length
  return this
}

Hash.prototype.digest = function (enc) {
  var rem = this._len % this._blockSize

  this._block[rem] = 0x80

  // zero (rem + 1) trailing bits, where (rem + 1) is the smallest
  // non-negative solution to the equation (length + 1 + (rem + 1)) === finalSize mod blockSize
  this._block.fill(0, rem + 1)

  if (rem >= this._finalSize) {
    this._update(this._block)
    this._block.fill(0)
  }

  var bits = this._len * 8

  // uint32
  if (bits <= 0xffffffff) {
    this._block.writeUInt32BE(bits, this._blockSize - 4)

  // uint64
  } else {
    var lowBits = (bits & 0xffffffff) >>> 0
    var highBits = (bits - lowBits) / 0x100000000

    this._block.writeUInt32BE(highBits, this._blockSize - 8)
    this._block.writeUInt32BE(lowBits, this._blockSize - 4)
  }

  this._update(this._block)
  var hash = this._hash()

  return enc ? hash.toString(enc) : hash
}

Hash.prototype._update = function () {
  throw new Error('_update must be implemented by subclass')
}

module.exports = Hash

},{"safe-buffer":513}],516:[function(require,module,exports){
var exports = module.exports = function SHA (algorithm) {
  algorithm = algorithm.toLowerCase()

  var Algorithm = exports[algorithm]
  if (!Algorithm) throw new Error(algorithm + ' is not supported (we accept pull requests)')

  return new Algorithm()
}

exports.sha = require('./sha')
exports.sha1 = require('./sha1')
exports.sha224 = require('./sha224')
exports.sha256 = require('./sha256')
exports.sha384 = require('./sha384')
exports.sha512 = require('./sha512')

},{"./sha":517,"./sha1":518,"./sha224":519,"./sha256":520,"./sha384":521,"./sha512":522}],517:[function(require,module,exports){
/*
 * A JavaScript implementation of the Secure Hash Algorithm, SHA-0, as defined
 * in FIPS PUB 180-1
 * This source code is derived from sha1.js of the same repository.
 * The difference between SHA-0 and SHA-1 is just a bitwise rotate left
 * operation was added.
 */

var inherits = require('inherits')
var Hash = require('./hash')
var Buffer = require('safe-buffer').Buffer

var K = [
  0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0
]

var W = new Array(80)

function Sha () {
  this.init()
  this._w = W

  Hash.call(this, 64, 56)
}

inherits(Sha, Hash)

Sha.prototype.init = function () {
  this._a = 0x67452301
  this._b = 0xefcdab89
  this._c = 0x98badcfe
  this._d = 0x10325476
  this._e = 0xc3d2e1f0

  return this
}

function rotl5 (num) {
  return (num << 5) | (num >>> 27)
}

function rotl30 (num) {
  return (num << 30) | (num >>> 2)
}

function ft (s, b, c, d) {
  if (s === 0) return (b & c) | ((~b) & d)
  if (s === 2) return (b & c) | (b & d) | (c & d)
  return b ^ c ^ d
}

Sha.prototype._update = function (M) {
  var W = this._w

  var a = this._a | 0
  var b = this._b | 0
  var c = this._c | 0
  var d = this._d | 0
  var e = this._e | 0

  for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4)
  for (; i < 80; ++i) W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]

  for (var j = 0; j < 80; ++j) {
    var s = ~~(j / 20)
    var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0

    e = d
    d = c
    c = rotl30(b)
    b = a
    a = t
  }

  this._a = (a + this._a) | 0
  this._b = (b + this._b) | 0
  this._c = (c + this._c) | 0
  this._d = (d + this._d) | 0
  this._e = (e + this._e) | 0
}

Sha.prototype._hash = function () {
  var H = Buffer.allocUnsafe(20)

  H.writeInt32BE(this._a | 0, 0)
  H.writeInt32BE(this._b | 0, 4)
  H.writeInt32BE(this._c | 0, 8)
  H.writeInt32BE(this._d | 0, 12)
  H.writeInt32BE(this._e | 0, 16)

  return H
}

module.exports = Sha

},{"./hash":515,"inherits":219,"safe-buffer":513}],518:[function(require,module,exports){
/*
 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
 * in FIPS PUB 180-1
 * Version 2.1a Copyright Paul Johnston 2000 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for details.
 */

var inherits = require('inherits')
var Hash = require('./hash')
var Buffer = require('safe-buffer').Buffer

var K = [
  0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0
]

var W = new Array(80)

function Sha1 () {
  this.init()
  this._w = W

  Hash.call(this, 64, 56)
}

inherits(Sha1, Hash)

Sha1.prototype.init = function () {
  this._a = 0x67452301
  this._b = 0xefcdab89
  this._c = 0x98badcfe
  this._d = 0x10325476
  this._e = 0xc3d2e1f0

  return this
}

function rotl1 (num) {
  return (num << 1) | (num >>> 31)
}

function rotl5 (num) {
  return (num << 5) | (num >>> 27)
}

function rotl30 (num) {
  return (num << 30) | (num >>> 2)
}

function ft (s, b, c, d) {
  if (s === 0) return (b & c) | ((~b) & d)
  if (s === 2) return (b & c) | (b & d) | (c & d)
  return b ^ c ^ d
}

Sha1.prototype._update = function (M) {
  var W = this._w

  var a = this._a | 0
  var b = this._b | 0
  var c = this._c | 0
  var d = this._d | 0
  var e = this._e | 0

  for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4)
  for (; i < 80; ++i) W[i] = rotl1(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16])

  for (var j = 0; j < 80; ++j) {
    var s = ~~(j / 20)
    var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0

    e = d
    d = c
    c = rotl30(b)
    b = a
    a = t
  }

  this._a = (a + this._a) | 0
  this._b = (b + this._b) | 0
  this._c = (c + this._c) | 0
  this._d = (d + this._d) | 0
  this._e = (e + this._e) | 0
}

Sha1.prototype._hash = function () {
  var H = Buffer.allocUnsafe(20)

  H.writeInt32BE(this._a | 0, 0)
  H.writeInt32BE(this._b | 0, 4)
  H.writeInt32BE(this._c | 0, 8)
  H.writeInt32BE(this._d | 0, 12)
  H.writeInt32BE(this._e | 0, 16)

  return H
}

module.exports = Sha1

},{"./hash":515,"inherits":219,"safe-buffer":513}],519:[function(require,module,exports){
/**
 * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined
 * in FIPS 180-2
 * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 *
 */

var inherits = require('inherits')
var Sha256 = require('./sha256')
var Hash = require('./hash')
var Buffer = require('safe-buffer').Buffer

var W = new Array(64)

function Sha224 () {
  this.init()

  this._w = W // new Array(64)

  Hash.call(this, 64, 56)
}

inherits(Sha224, Sha256)

Sha224.prototype.init = function () {
  this._a = 0xc1059ed8
  this._b = 0x367cd507
  this._c = 0x3070dd17
  this._d = 0xf70e5939
  this._e = 0xffc00b31
  this._f = 0x68581511
  this._g = 0x64f98fa7
  this._h = 0xbefa4fa4

  return this
}

Sha224.prototype._hash = function () {
  var H = Buffer.allocUnsafe(28)

  H.writeInt32BE(this._a, 0)
  H.writeInt32BE(this._b, 4)
  H.writeInt32BE(this._c, 8)
  H.writeInt32BE(this._d, 12)
  H.writeInt32BE(this._e, 16)
  H.writeInt32BE(this._f, 20)
  H.writeInt32BE(this._g, 24)

  return H
}

module.exports = Sha224

},{"./hash":515,"./sha256":520,"inherits":219,"safe-buffer":513}],520:[function(require,module,exports){
/**
 * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined
 * in FIPS 180-2
 * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 *
 */

var inherits = require('inherits')
var Hash = require('./hash')
var Buffer = require('safe-buffer').Buffer

var K = [
  0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
  0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
  0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
  0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
  0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
  0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
  0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
  0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
  0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
  0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
  0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
  0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
  0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
  0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
  0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
  0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2
]

var W = new Array(64)

function Sha256 () {
  this.init()

  this._w = W // new Array(64)

  Hash.call(this, 64, 56)
}

inherits(Sha256, Hash)

Sha256.prototype.init = function () {
  this._a = 0x6a09e667
  this._b = 0xbb67ae85
  this._c = 0x3c6ef372
  this._d = 0xa54ff53a
  this._e = 0x510e527f
  this._f = 0x9b05688c
  this._g = 0x1f83d9ab
  this._h = 0x5be0cd19

  return this
}

function ch (x, y, z) {
  return z ^ (x & (y ^ z))
}

function maj (x, y, z) {
  return (x & y) | (z & (x | y))
}

function sigma0 (x) {
  return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10)
}

function sigma1 (x) {
  return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7)
}

function gamma0 (x) {
  return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ (x >>> 3)
}

function gamma1 (x) {
  return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ (x >>> 10)
}

Sha256.prototype._update = function (M) {
  var W = this._w

  var a = this._a | 0
  var b = this._b | 0
  var c = this._c | 0
  var d = this._d | 0
  var e = this._e | 0
  var f = this._f | 0
  var g = this._g | 0
  var h = this._h | 0

  for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4)
  for (; i < 64; ++i) W[i] = (gamma1(W[i - 2]) + W[i - 7] + gamma0(W[i - 15]) + W[i - 16]) | 0

  for (var j = 0; j < 64; ++j) {
    var T1 = (h + sigma1(e) + ch(e, f, g) + K[j] + W[j]) | 0
    var T2 = (sigma0(a) + maj(a, b, c)) | 0

    h = g
    g = f
    f = e
    e = (d + T1) | 0
    d = c
    c = b
    b = a
    a = (T1 + T2) | 0
  }

  this._a = (a + this._a) | 0
  this._b = (b + this._b) | 0
  this._c = (c + this._c) | 0
  this._d = (d + this._d) | 0
  this._e = (e + this._e) | 0
  this._f = (f + this._f) | 0
  this._g = (g + this._g) | 0
  this._h = (h + this._h) | 0
}

Sha256.prototype._hash = function () {
  var H = Buffer.allocUnsafe(32)

  H.writeInt32BE(this._a, 0)
  H.writeInt32BE(this._b, 4)
  H.writeInt32BE(this._c, 8)
  H.writeInt32BE(this._d, 12)
  H.writeInt32BE(this._e, 16)
  H.writeInt32BE(this._f, 20)
  H.writeInt32BE(this._g, 24)
  H.writeInt32BE(this._h, 28)

  return H
}

module.exports = Sha256

},{"./hash":515,"inherits":219,"safe-buffer":513}],521:[function(require,module,exports){
var inherits = require('inherits')
var SHA512 = require('./sha512')
var Hash = require('./hash')
var Buffer = require('safe-buffer').Buffer

var W = new Array(160)

function Sha384 () {
  this.init()
  this._w = W

  Hash.call(this, 128, 112)
}

inherits(Sha384, SHA512)

Sha384.prototype.init = function () {
  this._ah = 0xcbbb9d5d
  this._bh = 0x629a292a
  this._ch = 0x9159015a
  this._dh = 0x152fecd8
  this._eh = 0x67332667
  this._fh = 0x8eb44a87
  this._gh = 0xdb0c2e0d
  this._hh = 0x47b5481d

  this._al = 0xc1059ed8
  this._bl = 0x367cd507
  this._cl = 0x3070dd17
  this._dl = 0xf70e5939
  this._el = 0xffc00b31
  this._fl = 0x68581511
  this._gl = 0x64f98fa7
  this._hl = 0xbefa4fa4

  return this
}

Sha384.prototype._hash = function () {
  var H = Buffer.allocUnsafe(48)

  function writeInt64BE (h, l, offset) {
    H.writeInt32BE(h, offset)
    H.writeInt32BE(l, offset + 4)
  }

  writeInt64BE(this._ah, this._al, 0)
  writeInt64BE(this._bh, this._bl, 8)
  writeInt64BE(this._ch, this._cl, 16)
  writeInt64BE(this._dh, this._dl, 24)
  writeInt64BE(this._eh, this._el, 32)
  writeInt64BE(this._fh, this._fl, 40)

  return H
}

module.exports = Sha384

},{"./hash":515,"./sha512":522,"inherits":219,"safe-buffer":513}],522:[function(require,module,exports){
var inherits = require('inherits')
var Hash = require('./hash')
var Buffer = require('safe-buffer').Buffer

var K = [
  0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,
  0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,
  0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,
  0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,
  0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,
  0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,
  0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,
  0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,
  0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,
  0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,
  0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,
  0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,
  0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,
  0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,
  0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,
  0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,
  0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,
  0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,
  0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,
  0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,
  0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,
  0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,
  0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,
  0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,
  0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,
  0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,
  0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,
  0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,
  0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,
  0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,
  0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,
  0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,
  0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,
  0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,
  0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,
  0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,
  0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,
  0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,
  0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,
  0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817
]

var W = new Array(160)

function Sha512 () {
  this.init()
  this._w = W

  Hash.call(this, 128, 112)
}

inherits(Sha512, Hash)

Sha512.prototype.init = function () {
  this._ah = 0x6a09e667
  this._bh = 0xbb67ae85
  this._ch = 0x3c6ef372
  this._dh = 0xa54ff53a
  this._eh = 0x510e527f
  this._fh = 0x9b05688c
  this._gh = 0x1f83d9ab
  this._hh = 0x5be0cd19

  this._al = 0xf3bcc908
  this._bl = 0x84caa73b
  this._cl = 0xfe94f82b
  this._dl = 0x5f1d36f1
  this._el = 0xade682d1
  this._fl = 0x2b3e6c1f
  this._gl = 0xfb41bd6b
  this._hl = 0x137e2179

  return this
}

function Ch (x, y, z) {
  return z ^ (x & (y ^ z))
}

function maj (x, y, z) {
  return (x & y) | (z & (x | y))
}

function sigma0 (x, xl) {
  return (x >>> 28 | xl << 4) ^ (xl >>> 2 | x << 30) ^ (xl >>> 7 | x << 25)
}

function sigma1 (x, xl) {
  return (x >>> 14 | xl << 18) ^ (x >>> 18 | xl << 14) ^ (xl >>> 9 | x << 23)
}

function Gamma0 (x, xl) {
  return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7)
}

function Gamma0l (x, xl) {
  return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7 | xl << 25)
}

function Gamma1 (x, xl) {
  return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6)
}

function Gamma1l (x, xl) {
  return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6 | xl << 26)
}

function getCarry (a, b) {
  return (a >>> 0) < (b >>> 0) ? 1 : 0
}

Sha512.prototype._update = function (M) {
  var W = this._w

  var ah = this._ah | 0
  var bh = this._bh | 0
  var ch = this._ch | 0
  var dh = this._dh | 0
  var eh = this._eh | 0
  var fh = this._fh | 0
  var gh = this._gh | 0
  var hh = this._hh | 0

  var al = this._al | 0
  var bl = this._bl | 0
  var cl = this._cl | 0
  var dl = this._dl | 0
  var el = this._el | 0
  var fl = this._fl | 0
  var gl = this._gl | 0
  var hl = this._hl | 0

  for (var i = 0; i < 32; i += 2) {
    W[i] = M.readInt32BE(i * 4)
    W[i + 1] = M.readInt32BE(i * 4 + 4)
  }
  for (; i < 160; i += 2) {
    var xh = W[i - 15 * 2]
    var xl = W[i - 15 * 2 + 1]
    var gamma0 = Gamma0(xh, xl)
    var gamma0l = Gamma0l(xl, xh)

    xh = W[i - 2 * 2]
    xl = W[i - 2 * 2 + 1]
    var gamma1 = Gamma1(xh, xl)
    var gamma1l = Gamma1l(xl, xh)

    // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
    var Wi7h = W[i - 7 * 2]
    var Wi7l = W[i - 7 * 2 + 1]

    var Wi16h = W[i - 16 * 2]
    var Wi16l = W[i - 16 * 2 + 1]

    var Wil = (gamma0l + Wi7l) | 0
    var Wih = (gamma0 + Wi7h + getCarry(Wil, gamma0l)) | 0
    Wil = (Wil + gamma1l) | 0
    Wih = (Wih + gamma1 + getCarry(Wil, gamma1l)) | 0
    Wil = (Wil + Wi16l) | 0
    Wih = (Wih + Wi16h + getCarry(Wil, Wi16l)) | 0

    W[i] = Wih
    W[i + 1] = Wil
  }

  for (var j = 0; j < 160; j += 2) {
    Wih = W[j]
    Wil = W[j + 1]

    var majh = maj(ah, bh, ch)
    var majl = maj(al, bl, cl)

    var sigma0h = sigma0(ah, al)
    var sigma0l = sigma0(al, ah)
    var sigma1h = sigma1(eh, el)
    var sigma1l = sigma1(el, eh)

    // t1 = h + sigma1 + ch + K[j] + W[j]
    var Kih = K[j]
    var Kil = K[j + 1]

    var chh = Ch(eh, fh, gh)
    var chl = Ch(el, fl, gl)

    var t1l = (hl + sigma1l) | 0
    var t1h = (hh + sigma1h + getCarry(t1l, hl)) | 0
    t1l = (t1l + chl) | 0
    t1h = (t1h + chh + getCarry(t1l, chl)) | 0
    t1l = (t1l + Kil) | 0
    t1h = (t1h + Kih + getCarry(t1l, Kil)) | 0
    t1l = (t1l + Wil) | 0
    t1h = (t1h + Wih + getCarry(t1l, Wil)) | 0

    // t2 = sigma0 + maj
    var t2l = (sigma0l + majl) | 0
    var t2h = (sigma0h + majh + getCarry(t2l, sigma0l)) | 0

    hh = gh
    hl = gl
    gh = fh
    gl = fl
    fh = eh
    fl = el
    el = (dl + t1l) | 0
    eh = (dh + t1h + getCarry(el, dl)) | 0
    dh = ch
    dl = cl
    ch = bh
    cl = bl
    bh = ah
    bl = al
    al = (t1l + t2l) | 0
    ah = (t1h + t2h + getCarry(al, t1l)) | 0
  }

  this._al = (this._al + al) | 0
  this._bl = (this._bl + bl) | 0
  this._cl = (this._cl + cl) | 0
  this._dl = (this._dl + dl) | 0
  this._el = (this._el + el) | 0
  this._fl = (this._fl + fl) | 0
  this._gl = (this._gl + gl) | 0
  this._hl = (this._hl + hl) | 0

  this._ah = (this._ah + ah + getCarry(this._al, al)) | 0
  this._bh = (this._bh + bh + getCarry(this._bl, bl)) | 0
  this._ch = (this._ch + ch + getCarry(this._cl, cl)) | 0
  this._dh = (this._dh + dh + getCarry(this._dl, dl)) | 0
  this._eh = (this._eh + eh + getCarry(this._el, el)) | 0
  this._fh = (this._fh + fh + getCarry(this._fl, fl)) | 0
  this._gh = (this._gh + gh + getCarry(this._gl, gl)) | 0
  this._hh = (this._hh + hh + getCarry(this._hl, hl)) | 0
}

Sha512.prototype._hash = function () {
  var H = Buffer.allocUnsafe(64)

  function writeInt64BE (h, l, offset) {
    H.writeInt32BE(h, offset)
    H.writeInt32BE(l, offset + 4)
  }

  writeInt64BE(this._ah, this._al, 0)
  writeInt64BE(this._bh, this._bl, 8)
  writeInt64BE(this._ch, this._cl, 16)
  writeInt64BE(this._dh, this._dl, 24)
  writeInt64BE(this._eh, this._el, 32)
  writeInt64BE(this._fh, this._fl, 40)
  writeInt64BE(this._gh, this._gl, 48)
  writeInt64BE(this._hh, this._hl, 56)

  return H
}

module.exports = Sha512

},{"./hash":515,"inherits":219,"safe-buffer":513}],523:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

module.exports = Stream;

var EE = require('events').EventEmitter;
var inherits = require('inherits');

inherits(Stream, EE);
Stream.Readable = require('readable-stream/lib/_stream_readable.js');
Stream.Writable = require('readable-stream/lib/_stream_writable.js');
Stream.Duplex = require('readable-stream/lib/_stream_duplex.js');
Stream.Transform = require('readable-stream/lib/_stream_transform.js');
Stream.PassThrough = require('readable-stream/lib/_stream_passthrough.js');
Stream.finished = require('readable-stream/lib/internal/streams/end-of-stream.js')
Stream.pipeline = require('readable-stream/lib/internal/streams/pipeline.js')

// Backwards-compat with node 0.4.x
Stream.Stream = Stream;



// old-style streams.  Note that the pipe method (the only relevant
// part of this class) is overridden in the Readable class.

function Stream() {
  EE.call(this);
}

Stream.prototype.pipe = function(dest, options) {
  var source = this;

  function ondata(chunk) {
    if (dest.writable) {
      if (false === dest.write(chunk) && source.pause) {
        source.pause();
      }
    }
  }

  source.on('data', ondata);

  function ondrain() {
    if (source.readable && source.resume) {
      source.resume();
    }
  }

  dest.on('drain', ondrain);

  // If the 'end' option is not supplied, dest.end() will be called when
  // source gets the 'end' or 'close' events.  Only dest.end() once.
  if (!dest._isStdio && (!options || options.end !== false)) {
    source.on('end', onend);
    source.on('close', onclose);
  }

  var didOnEnd = false;
  function onend() {
    if (didOnEnd) return;
    didOnEnd = true;

    dest.end();
  }


  function onclose() {
    if (didOnEnd) return;
    didOnEnd = true;

    if (typeof dest.destroy === 'function') dest.destroy();
  }

  // don't leave dangling pipes when there are errors.
  function onerror(er) {
    cleanup();
    if (EE.listenerCount(this, 'error') === 0) {
      throw er; // Unhandled stream error in pipe.
    }
  }

  source.on('error', onerror);
  dest.on('error', onerror);

  // remove all the event listeners that were added.
  function cleanup() {
    source.removeListener('data', ondata);
    dest.removeListener('drain', ondrain);

    source.removeListener('end', onend);
    source.removeListener('close', onclose);

    source.removeListener('error', onerror);
    dest.removeListener('error', onerror);

    source.removeListener('end', cleanup);
    source.removeListener('close', cleanup);

    dest.removeListener('close', cleanup);
  }

  source.on('end', cleanup);
  source.on('close', cleanup);

  dest.on('close', cleanup);

  dest.emit('pipe', source);

  // Allow for unix-like usage: A.pipe(B).pipe(C)
  return dest;
};

},{"events":188,"inherits":219,"readable-stream/lib/_stream_duplex.js":525,"readable-stream/lib/_stream_passthrough.js":526,"readable-stream/lib/_stream_readable.js":527,"readable-stream/lib/_stream_transform.js":528,"readable-stream/lib/_stream_writable.js":529,"readable-stream/lib/internal/streams/end-of-stream.js":533,"readable-stream/lib/internal/streams/pipeline.js":535}],524:[function(require,module,exports){
'use strict';

function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }

var codes = {};

function createErrorType(code, message, Base) {
  if (!Base) {
    Base = Error;
  }

  function getMessage(arg1, arg2, arg3) {
    if (typeof message === 'string') {
      return message;
    } else {
      return message(arg1, arg2, arg3);
    }
  }

  var NodeError =
  /*#__PURE__*/
  function (_Base) {
    _inheritsLoose(NodeError, _Base);

    function NodeError(arg1, arg2, arg3) {
      return _Base.call(this, getMessage(arg1, arg2, arg3)) || this;
    }

    return NodeError;
  }(Base);

  NodeError.prototype.name = Base.name;
  NodeError.prototype.code = code;
  codes[code] = NodeError;
} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js


function oneOf(expected, thing) {
  if (Array.isArray(expected)) {
    var len = expected.length;
    expected = expected.map(function (i) {
      return String(i);
    });

    if (len > 2) {
      return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1];
    } else if (len === 2) {
      return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]);
    } else {
      return "of ".concat(thing, " ").concat(expected[0]);
    }
  } else {
    return "of ".concat(thing, " ").concat(String(expected));
  }
} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith


function startsWith(str, search, pos) {
  return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith


function endsWith(str, search, this_len) {
  if (this_len === undefined || this_len > str.length) {
    this_len = str.length;
  }

  return str.substring(this_len - search.length, this_len) === search;
} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes


function includes(str, search, start) {
  if (typeof start !== 'number') {
    start = 0;
  }

  if (start + search.length > str.length) {
    return false;
  } else {
    return str.indexOf(search, start) !== -1;
  }
}

createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
  return 'The value "' + value + '" is invalid for option "' + name + '"';
}, TypeError);
createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
  // determiner: 'must be' or 'must not be'
  var determiner;

  if (typeof expected === 'string' && startsWith(expected, 'not ')) {
    determiner = 'must not be';
    expected = expected.replace(/^not /, '');
  } else {
    determiner = 'must be';
  }

  var msg;

  if (endsWith(name, ' argument')) {
    // For cases like 'first argument'
    msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
  } else {
    var type = includes(name, '.') ? 'property' : 'argument';
    msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
  }

  msg += ". Received type ".concat(typeof actual);
  return msg;
}, TypeError);
createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
  return 'The ' + name + ' method is not implemented';
});
createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
createErrorType('ERR_STREAM_DESTROYED', function (name) {
  return 'Cannot call ' + name + ' after a stream was destroyed';
});
createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
  return 'Unknown encoding: ' + arg;
}, TypeError);
createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
module.exports.codes = codes;

},{}],525:[function(require,module,exports){
(function (process){(function (){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a duplex stream is just a stream that is both readable and writable.
// Since JS doesn't have multiple prototypal inheritance, this class
// prototypally inherits from Readable, and then parasitically from
// Writable.

'use strict';

/*<replacement>*/
var objectKeys = Object.keys || function (obj) {
  var keys = [];
  for (var key in obj) keys.push(key);
  return keys;
};
/*</replacement>*/

module.exports = Duplex;
var Readable = require('./_stream_readable');
var Writable = require('./_stream_writable');
require('inherits')(Duplex, Readable);
{
  // Allow the keys array to be GC'ed.
  var keys = objectKeys(Writable.prototype);
  for (var v = 0; v < keys.length; v++) {
    var method = keys[v];
    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
  }
}
function Duplex(options) {
  if (!(this instanceof Duplex)) return new Duplex(options);
  Readable.call(this, options);
  Writable.call(this, options);
  this.allowHalfOpen = true;
  if (options) {
    if (options.readable === false) this.readable = false;
    if (options.writable === false) this.writable = false;
    if (options.allowHalfOpen === false) {
      this.allowHalfOpen = false;
      this.once('end', onend);
    }
  }
}
Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState.highWaterMark;
  }
});
Object.defineProperty(Duplex.prototype, 'writableBuffer', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState && this._writableState.getBuffer();
  }
});
Object.defineProperty(Duplex.prototype, 'writableLength', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState.length;
  }
});

// the no-half-open enforcer
function onend() {
  // If the writable side ended, then we're ok.
  if (this._writableState.ended) return;

  // no more data can be written.
  // But allow more writes to happen in this tick.
  process.nextTick(onEndNT, this);
}
function onEndNT(self) {
  self.end();
}
Object.defineProperty(Duplex.prototype, 'destroyed', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    if (this._readableState === undefined || this._writableState === undefined) {
      return false;
    }
    return this._readableState.destroyed && this._writableState.destroyed;
  },
  set: function set(value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (this._readableState === undefined || this._writableState === undefined) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._readableState.destroyed = value;
    this._writableState.destroyed = value;
  }
});
}).call(this)}).call(this,require('_process'))
},{"./_stream_readable":527,"./_stream_writable":529,"_process":254,"inherits":219}],526:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a passthrough stream.
// basically just the most minimal sort of Transform stream.
// Every written chunk gets output as-is.

'use strict';

module.exports = PassThrough;
var Transform = require('./_stream_transform');
require('inherits')(PassThrough, Transform);
function PassThrough(options) {
  if (!(this instanceof PassThrough)) return new PassThrough(options);
  Transform.call(this, options);
}
PassThrough.prototype._transform = function (chunk, encoding, cb) {
  cb(null, chunk);
};
},{"./_stream_transform":528,"inherits":219}],527:[function(require,module,exports){
(function (process,global){(function (){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

module.exports = Readable;

/*<replacement>*/
var Duplex;
/*</replacement>*/

Readable.ReadableState = ReadableState;

/*<replacement>*/
var EE = require('events').EventEmitter;
var EElistenerCount = function EElistenerCount(emitter, type) {
  return emitter.listeners(type).length;
};
/*</replacement>*/

/*<replacement>*/
var Stream = require('./internal/streams/stream');
/*</replacement>*/

var Buffer = require('buffer').Buffer;
var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
function _uint8ArrayToBuffer(chunk) {
  return Buffer.from(chunk);
}
function _isUint8Array(obj) {
  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}

/*<replacement>*/
var debugUtil = require('util');
var debug;
if (debugUtil && debugUtil.debuglog) {
  debug = debugUtil.debuglog('stream');
} else {
  debug = function debug() {};
}
/*</replacement>*/

var BufferList = require('./internal/streams/buffer_list');
var destroyImpl = require('./internal/streams/destroy');
var _require = require('./internal/streams/state'),
  getHighWaterMark = _require.getHighWaterMark;
var _require$codes = require('../errors').codes,
  ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
  ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,
  ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
  ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;

// Lazy loaded to improve the startup performance.
var StringDecoder;
var createReadableStreamAsyncIterator;
var from;
require('inherits')(Readable, Stream);
var errorOrDestroy = destroyImpl.errorOrDestroy;
var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
function prependListener(emitter, event, fn) {
  // Sadly this is not cacheable as some libraries bundle their own
  // event emitter implementation with them.
  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);

  // This is a hack to make sure that our error handler is attached before any
  // userland ones.  NEVER DO THIS. This is here only because this code needs
  // to continue to work with older versions of Node.js that do not include
  // the prependListener() method. The goal is to eventually remove this hack.
  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
}
function ReadableState(options, stream, isDuplex) {
  Duplex = Duplex || require('./_stream_duplex');
  options = options || {};

  // Duplex streams are both readable and writable, but share
  // the same options object.
  // However, some cases require setting options to different
  // values for the readable and the writable sides of the duplex stream.
  // These options can be provided separately as readableXXX and writableXXX.
  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;

  // object stream flag. Used to make read(n) ignore n and to
  // make all the buffer merging and length checks go away
  this.objectMode = !!options.objectMode;
  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;

  // the point at which it stops calling _read() to fill the buffer
  // Note: 0 is a valid value, means "don't call _read preemptively ever"
  this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex);

  // A linked list is used to store data chunks instead of an array because the
  // linked list can remove elements from the beginning faster than
  // array.shift()
  this.buffer = new BufferList();
  this.length = 0;
  this.pipes = null;
  this.pipesCount = 0;
  this.flowing = null;
  this.ended = false;
  this.endEmitted = false;
  this.reading = false;

  // a flag to be able to tell if the event 'readable'/'data' is emitted
  // immediately, or on a later tick.  We set this to true at first, because
  // any actions that shouldn't happen until "later" should generally also
  // not happen before the first read call.
  this.sync = true;

  // whenever we return null, then we set a flag to say
  // that we're awaiting a 'readable' event emission.
  this.needReadable = false;
  this.emittedReadable = false;
  this.readableListening = false;
  this.resumeScheduled = false;
  this.paused = true;

  // Should close be emitted on destroy. Defaults to true.
  this.emitClose = options.emitClose !== false;

  // Should .destroy() be called after 'end' (and potentially 'finish')
  this.autoDestroy = !!options.autoDestroy;

  // has it been destroyed
  this.destroyed = false;

  // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.
  this.defaultEncoding = options.defaultEncoding || 'utf8';

  // the number of writers that are awaiting a drain event in .pipe()s
  this.awaitDrain = 0;

  // if true, a maybeReadMore has been scheduled
  this.readingMore = false;
  this.decoder = null;
  this.encoding = null;
  if (options.encoding) {
    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
    this.decoder = new StringDecoder(options.encoding);
    this.encoding = options.encoding;
  }
}
function Readable(options) {
  Duplex = Duplex || require('./_stream_duplex');
  if (!(this instanceof Readable)) return new Readable(options);

  // Checking for a Stream.Duplex instance is faster here instead of inside
  // the ReadableState constructor, at least with V8 6.5
  var isDuplex = this instanceof Duplex;
  this._readableState = new ReadableState(options, this, isDuplex);

  // legacy
  this.readable = true;
  if (options) {
    if (typeof options.read === 'function') this._read = options.read;
    if (typeof options.destroy === 'function') this._destroy = options.destroy;
  }
  Stream.call(this);
}
Object.defineProperty(Readable.prototype, 'destroyed', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    if (this._readableState === undefined) {
      return false;
    }
    return this._readableState.destroyed;
  },
  set: function set(value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (!this._readableState) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._readableState.destroyed = value;
  }
});
Readable.prototype.destroy = destroyImpl.destroy;
Readable.prototype._undestroy = destroyImpl.undestroy;
Readable.prototype._destroy = function (err, cb) {
  cb(err);
};

// Manually shove something into the read() buffer.
// This returns true if the highWaterMark has not been hit yet,
// similar to how Writable.write() returns true if you should
// write() some more.
Readable.prototype.push = function (chunk, encoding) {
  var state = this._readableState;
  var skipChunkCheck;
  if (!state.objectMode) {
    if (typeof chunk === 'string') {
      encoding = encoding || state.defaultEncoding;
      if (encoding !== state.encoding) {
        chunk = Buffer.from(chunk, encoding);
        encoding = '';
      }
      skipChunkCheck = true;
    }
  } else {
    skipChunkCheck = true;
  }
  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
};

// Unshift should *always* be something directly out of read()
Readable.prototype.unshift = function (chunk) {
  return readableAddChunk(this, chunk, null, true, false);
};
function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
  debug('readableAddChunk', chunk);
  var state = stream._readableState;
  if (chunk === null) {
    state.reading = false;
    onEofChunk(stream, state);
  } else {
    var er;
    if (!skipChunkCheck) er = chunkInvalid(state, chunk);
    if (er) {
      errorOrDestroy(stream, er);
    } else if (state.objectMode || chunk && chunk.length > 0) {
      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
        chunk = _uint8ArrayToBuffer(chunk);
      }
      if (addToFront) {
        if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
      } else if (state.ended) {
        errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
      } else if (state.destroyed) {
        return false;
      } else {
        state.reading = false;
        if (state.decoder && !encoding) {
          chunk = state.decoder.write(chunk);
          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
        } else {
          addChunk(stream, state, chunk, false);
        }
      }
    } else if (!addToFront) {
      state.reading = false;
      maybeReadMore(stream, state);
    }
  }

  // We can push more data if we are below the highWaterMark.
  // Also, if we have no data yet, we can stand some more bytes.
  // This is to work around cases where hwm=0, such as the repl.
  return !state.ended && (state.length < state.highWaterMark || state.length === 0);
}
function addChunk(stream, state, chunk, addToFront) {
  if (state.flowing && state.length === 0 && !state.sync) {
    state.awaitDrain = 0;
    stream.emit('data', chunk);
  } else {
    // update the buffer info.
    state.length += state.objectMode ? 1 : chunk.length;
    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
    if (state.needReadable) emitReadable(stream);
  }
  maybeReadMore(stream, state);
}
function chunkInvalid(state, chunk) {
  var er;
  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
  }
  return er;
}
Readable.prototype.isPaused = function () {
  return this._readableState.flowing === false;
};

// backwards compatibility.
Readable.prototype.setEncoding = function (enc) {
  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
  var decoder = new StringDecoder(enc);
  this._readableState.decoder = decoder;
  // If setEncoding(null), decoder.encoding equals utf8
  this._readableState.encoding = this._readableState.decoder.encoding;

  // Iterate over current buffer to convert already stored Buffers:
  var p = this._readableState.buffer.head;
  var content = '';
  while (p !== null) {
    content += decoder.write(p.data);
    p = p.next;
  }
  this._readableState.buffer.clear();
  if (content !== '') this._readableState.buffer.push(content);
  this._readableState.length = content.length;
  return this;
};

// Don't raise the hwm > 1GB
var MAX_HWM = 0x40000000;
function computeNewHighWaterMark(n) {
  if (n >= MAX_HWM) {
    // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.
    n = MAX_HWM;
  } else {
    // Get the next highest power of 2 to prevent increasing hwm excessively in
    // tiny amounts
    n--;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    n++;
  }
  return n;
}

// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function howMuchToRead(n, state) {
  if (n <= 0 || state.length === 0 && state.ended) return 0;
  if (state.objectMode) return 1;
  if (n !== n) {
    // Only flow one buffer at a time
    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
  }
  // If we're asking for more than the current hwm, then raise the hwm.
  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
  if (n <= state.length) return n;
  // Don't have enough
  if (!state.ended) {
    state.needReadable = true;
    return 0;
  }
  return state.length;
}

// you can override either this method, or the async _read(n) below.
Readable.prototype.read = function (n) {
  debug('read', n);
  n = parseInt(n, 10);
  var state = this._readableState;
  var nOrig = n;
  if (n !== 0) state.emittedReadable = false;

  // if we're doing read(0) to trigger a readable event, but we
  // already have a bunch of data in the buffer, then just trigger
  // the 'readable' event and move on.
  if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {
    debug('read: emitReadable', state.length, state.ended);
    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
    return null;
  }
  n = howMuchToRead(n, state);

  // if we've ended, and we're now clear, then finish it up.
  if (n === 0 && state.ended) {
    if (state.length === 0) endReadable(this);
    return null;
  }

  // All the actual chunk generation logic needs to be
  // *below* the call to _read.  The reason is that in certain
  // synthetic stream cases, such as passthrough streams, _read
  // may be a completely synchronous operation which may change
  // the state of the read buffer, providing enough data when
  // before there was *not* enough.
  //
  // So, the steps are:
  // 1. Figure out what the state of things will be after we do
  // a read from the buffer.
  //
  // 2. If that resulting state will trigger a _read, then call _read.
  // Note that this may be asynchronous, or synchronous.  Yes, it is
  // deeply ugly to write APIs this way, but that still doesn't mean
  // that the Readable class should behave improperly, as streams are
  // designed to be sync/async agnostic.
  // Take note if the _read call is sync or async (ie, if the read call
  // has returned yet), so that we know whether or not it's safe to emit
  // 'readable' etc.
  //
  // 3. Actually pull the requested chunks out of the buffer and return.

  // if we need a readable event, then we need to do some reading.
  var doRead = state.needReadable;
  debug('need readable', doRead);

  // if we currently have less than the highWaterMark, then also read some
  if (state.length === 0 || state.length - n < state.highWaterMark) {
    doRead = true;
    debug('length less than watermark', doRead);
  }

  // however, if we've ended, then there's no point, and if we're already
  // reading, then it's unnecessary.
  if (state.ended || state.reading) {
    doRead = false;
    debug('reading or ended', doRead);
  } else if (doRead) {
    debug('do read');
    state.reading = true;
    state.sync = true;
    // if the length is currently zero, then we *need* a readable event.
    if (state.length === 0) state.needReadable = true;
    // call internal read method
    this._read(state.highWaterMark);
    state.sync = false;
    // If _read pushed data synchronously, then `reading` will be false,
    // and we need to re-evaluate how much data we can return to the user.
    if (!state.reading) n = howMuchToRead(nOrig, state);
  }
  var ret;
  if (n > 0) ret = fromList(n, state);else ret = null;
  if (ret === null) {
    state.needReadable = state.length <= state.highWaterMark;
    n = 0;
  } else {
    state.length -= n;
    state.awaitDrain = 0;
  }
  if (state.length === 0) {
    // If we have nothing in the buffer, then we want to know
    // as soon as we *do* get something into the buffer.
    if (!state.ended) state.needReadable = true;

    // If we tried to read() past the EOF, then emit end on the next tick.
    if (nOrig !== n && state.ended) endReadable(this);
  }
  if (ret !== null) this.emit('data', ret);
  return ret;
};
function onEofChunk(stream, state) {
  debug('onEofChunk');
  if (state.ended) return;
  if (state.decoder) {
    var chunk = state.decoder.end();
    if (chunk && chunk.length) {
      state.buffer.push(chunk);
      state.length += state.objectMode ? 1 : chunk.length;
    }
  }
  state.ended = true;
  if (state.sync) {
    // if we are sync, wait until next tick to emit the data.
    // Otherwise we risk emitting data in the flow()
    // the readable code triggers during a read() call
    emitReadable(stream);
  } else {
    // emit 'readable' now to make sure it gets picked up.
    state.needReadable = false;
    if (!state.emittedReadable) {
      state.emittedReadable = true;
      emitReadable_(stream);
    }
  }
}

// Don't emit readable right away in sync mode, because this can trigger
// another read() call => stack overflow.  This way, it might trigger
// a nextTick recursion warning, but that's not so bad.
function emitReadable(stream) {
  var state = stream._readableState;
  debug('emitReadable', state.needReadable, state.emittedReadable);
  state.needReadable = false;
  if (!state.emittedReadable) {
    debug('emitReadable', state.flowing);
    state.emittedReadable = true;
    process.nextTick(emitReadable_, stream);
  }
}
function emitReadable_(stream) {
  var state = stream._readableState;
  debug('emitReadable_', state.destroyed, state.length, state.ended);
  if (!state.destroyed && (state.length || state.ended)) {
    stream.emit('readable');
    state.emittedReadable = false;
  }

  // The stream needs another readable event if
  // 1. It is not flowing, as the flow mechanism will take
  //    care of it.
  // 2. It is not ended.
  // 3. It is below the highWaterMark, so we can schedule
  //    another readable later.
  state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
  flow(stream);
}

// at this point, the user has presumably seen the 'readable' event,
// and called read() to consume some data.  that may have triggered
// in turn another _read(n) call, in which case reading = true if
// it's in progress.
// However, if we're not ended, or reading, and the length < hwm,
// then go ahead and try to read some more preemptively.
function maybeReadMore(stream, state) {
  if (!state.readingMore) {
    state.readingMore = true;
    process.nextTick(maybeReadMore_, stream, state);
  }
}
function maybeReadMore_(stream, state) {
  // Attempt to read more data if we should.
  //
  // The conditions for reading more data are (one of):
  // - Not enough data buffered (state.length < state.highWaterMark). The loop
  //   is responsible for filling the buffer with enough data if such data
  //   is available. If highWaterMark is 0 and we are not in the flowing mode
  //   we should _not_ attempt to buffer any extra data. We'll get more data
  //   when the stream consumer calls read() instead.
  // - No data in the buffer, and the stream is in flowing mode. In this mode
  //   the loop below is responsible for ensuring read() is called. Failing to
  //   call read here would abort the flow and there's no other mechanism for
  //   continuing the flow if the stream consumer has just subscribed to the
  //   'data' event.
  //
  // In addition to the above conditions to keep reading data, the following
  // conditions prevent the data from being read:
  // - The stream has ended (state.ended).
  // - There is already a pending 'read' operation (state.reading). This is a
  //   case where the the stream has called the implementation defined _read()
  //   method, but they are processing the call asynchronously and have _not_
  //   called push() with new data. In this case we skip performing more
  //   read()s. The execution ends in this method again after the _read() ends
  //   up calling push() with more data.
  while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {
    var len = state.length;
    debug('maybeReadMore read 0');
    stream.read(0);
    if (len === state.length)
      // didn't get any data, stop spinning.
      break;
  }
  state.readingMore = false;
}

// abstract method.  to be overridden in specific implementation classes.
// call cb(er, data) where data is <= n in length.
// for virtual (non-string, non-buffer) streams, "length" is somewhat
// arbitrary, and perhaps not very meaningful.
Readable.prototype._read = function (n) {
  errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
};
Readable.prototype.pipe = function (dest, pipeOpts) {
  var src = this;
  var state = this._readableState;
  switch (state.pipesCount) {
    case 0:
      state.pipes = dest;
      break;
    case 1:
      state.pipes = [state.pipes, dest];
      break;
    default:
      state.pipes.push(dest);
      break;
  }
  state.pipesCount += 1;
  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
  var endFn = doEnd ? onend : unpipe;
  if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);
  dest.on('unpipe', onunpipe);
  function onunpipe(readable, unpipeInfo) {
    debug('onunpipe');
    if (readable === src) {
      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
        unpipeInfo.hasUnpiped = true;
        cleanup();
      }
    }
  }
  function onend() {
    debug('onend');
    dest.end();
  }

  // when the dest drains, it reduces the awaitDrain counter
  // on the source.  This would be more elegant with a .once()
  // handler in flow(), but adding and removing repeatedly is
  // too slow.
  var ondrain = pipeOnDrain(src);
  dest.on('drain', ondrain);
  var cleanedUp = false;
  function cleanup() {
    debug('cleanup');
    // cleanup event handlers once the pipe is broken
    dest.removeListener('close', onclose);
    dest.removeListener('finish', onfinish);
    dest.removeListener('drain', ondrain);
    dest.removeListener('error', onerror);
    dest.removeListener('unpipe', onunpipe);
    src.removeListener('end', onend);
    src.removeListener('end', unpipe);
    src.removeListener('data', ondata);
    cleanedUp = true;

    // if the reader is waiting for a drain event from this
    // specific writer, then it would cause it to never start
    // flowing again.
    // So, if this is awaiting a drain, then we just call it now.
    // If we don't know, then assume that we are waiting for one.
    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
  }
  src.on('data', ondata);
  function ondata(chunk) {
    debug('ondata');
    var ret = dest.write(chunk);
    debug('dest.write', ret);
    if (ret === false) {
      // If the user unpiped during `dest.write()`, it is possible
      // to get stuck in a permanently paused state if that write
      // also returned false.
      // => Check whether `dest` is still a piping destination.
      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
        debug('false write response, pause', state.awaitDrain);
        state.awaitDrain++;
      }
      src.pause();
    }
  }

  // if the dest has an error, then stop piping into it.
  // however, don't suppress the throwing behavior for this.
  function onerror(er) {
    debug('onerror', er);
    unpipe();
    dest.removeListener('error', onerror);
    if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);
  }

  // Make sure our error handler is attached before userland ones.
  prependListener(dest, 'error', onerror);

  // Both close and finish should trigger unpipe, but only once.
  function onclose() {
    dest.removeListener('finish', onfinish);
    unpipe();
  }
  dest.once('close', onclose);
  function onfinish() {
    debug('onfinish');
    dest.removeListener('close', onclose);
    unpipe();
  }
  dest.once('finish', onfinish);
  function unpipe() {
    debug('unpipe');
    src.unpipe(dest);
  }

  // tell the dest that it's being piped to
  dest.emit('pipe', src);

  // start the flow if it hasn't been started already.
  if (!state.flowing) {
    debug('pipe resume');
    src.resume();
  }
  return dest;
};
function pipeOnDrain(src) {
  return function pipeOnDrainFunctionResult() {
    var state = src._readableState;
    debug('pipeOnDrain', state.awaitDrain);
    if (state.awaitDrain) state.awaitDrain--;
    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
      state.flowing = true;
      flow(src);
    }
  };
}
Readable.prototype.unpipe = function (dest) {
  var state = this._readableState;
  var unpipeInfo = {
    hasUnpiped: false
  };

  // if we're not piping anywhere, then do nothing.
  if (state.pipesCount === 0) return this;

  // just one destination.  most common case.
  if (state.pipesCount === 1) {
    // passed in one, but it's not the right one.
    if (dest && dest !== state.pipes) return this;
    if (!dest) dest = state.pipes;

    // got a match.
    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;
    if (dest) dest.emit('unpipe', this, unpipeInfo);
    return this;
  }

  // slow case. multiple pipe destinations.

  if (!dest) {
    // remove all.
    var dests = state.pipes;
    var len = state.pipesCount;
    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;
    for (var i = 0; i < len; i++) dests[i].emit('unpipe', this, {
      hasUnpiped: false
    });
    return this;
  }

  // try to find the right one.
  var index = indexOf(state.pipes, dest);
  if (index === -1) return this;
  state.pipes.splice(index, 1);
  state.pipesCount -= 1;
  if (state.pipesCount === 1) state.pipes = state.pipes[0];
  dest.emit('unpipe', this, unpipeInfo);
  return this;
};

// set up data events if they are asked for
// Ensure readable listeners eventually get something
Readable.prototype.on = function (ev, fn) {
  var res = Stream.prototype.on.call(this, ev, fn);
  var state = this._readableState;
  if (ev === 'data') {
    // update readableListening so that resume() may be a no-op
    // a few lines down. This is needed to support once('readable').
    state.readableListening = this.listenerCount('readable') > 0;

    // Try start flowing on next tick if stream isn't explicitly paused
    if (state.flowing !== false) this.resume();
  } else if (ev === 'readable') {
    if (!state.endEmitted && !state.readableListening) {
      state.readableListening = state.needReadable = true;
      state.flowing = false;
      state.emittedReadable = false;
      debug('on readable', state.length, state.reading);
      if (state.length) {
        emitReadable(this);
      } else if (!state.reading) {
        process.nextTick(nReadingNextTick, this);
      }
    }
  }
  return res;
};
Readable.prototype.addListener = Readable.prototype.on;
Readable.prototype.removeListener = function (ev, fn) {
  var res = Stream.prototype.removeListener.call(this, ev, fn);
  if (ev === 'readable') {
    // We need to check if there is someone still listening to
    // readable and reset the state. However this needs to happen
    // after readable has been emitted but before I/O (nextTick) to
    // support once('readable', fn) cycles. This means that calling
    // resume within the same tick will have no
    // effect.
    process.nextTick(updateReadableListening, this);
  }
  return res;
};
Readable.prototype.removeAllListeners = function (ev) {
  var res = Stream.prototype.removeAllListeners.apply(this, arguments);
  if (ev === 'readable' || ev === undefined) {
    // We need to check if there is someone still listening to
    // readable and reset the state. However this needs to happen
    // after readable has been emitted but before I/O (nextTick) to
    // support once('readable', fn) cycles. This means that calling
    // resume within the same tick will have no
    // effect.
    process.nextTick(updateReadableListening, this);
  }
  return res;
};
function updateReadableListening(self) {
  var state = self._readableState;
  state.readableListening = self.listenerCount('readable') > 0;
  if (state.resumeScheduled && !state.paused) {
    // flowing needs to be set to true now, otherwise
    // the upcoming resume will not flow.
    state.flowing = true;

    // crude way to check if we should resume
  } else if (self.listenerCount('data') > 0) {
    self.resume();
  }
}
function nReadingNextTick(self) {
  debug('readable nexttick read 0');
  self.read(0);
}

// pause() and resume() are remnants of the legacy readable stream API
// If the user uses them, then switch into old mode.
Readable.prototype.resume = function () {
  var state = this._readableState;
  if (!state.flowing) {
    debug('resume');
    // we flow only if there is no one listening
    // for readable, but we still have to call
    // resume()
    state.flowing = !state.readableListening;
    resume(this, state);
  }
  state.paused = false;
  return this;
};
function resume(stream, state) {
  if (!state.resumeScheduled) {
    state.resumeScheduled = true;
    process.nextTick(resume_, stream, state);
  }
}
function resume_(stream, state) {
  debug('resume', state.reading);
  if (!state.reading) {
    stream.read(0);
  }
  state.resumeScheduled = false;
  stream.emit('resume');
  flow(stream);
  if (state.flowing && !state.reading) stream.read(0);
}
Readable.prototype.pause = function () {
  debug('call pause flowing=%j', this._readableState.flowing);
  if (this._readableState.flowing !== false) {
    debug('pause');
    this._readableState.flowing = false;
    this.emit('pause');
  }
  this._readableState.paused = true;
  return this;
};
function flow(stream) {
  var state = stream._readableState;
  debug('flow', state.flowing);
  while (state.flowing && stream.read() !== null);
}

// wrap an old-style stream as the async data source.
// This is *not* part of the readable stream interface.
// It is an ugly unfortunate mess of history.
Readable.prototype.wrap = function (stream) {
  var _this = this;
  var state = this._readableState;
  var paused = false;
  stream.on('end', function () {
    debug('wrapped end');
    if (state.decoder && !state.ended) {
      var chunk = state.decoder.end();
      if (chunk && chunk.length) _this.push(chunk);
    }
    _this.push(null);
  });
  stream.on('data', function (chunk) {
    debug('wrapped data');
    if (state.decoder) chunk = state.decoder.write(chunk);

    // don't skip over falsy values in objectMode
    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
    var ret = _this.push(chunk);
    if (!ret) {
      paused = true;
      stream.pause();
    }
  });

  // proxy all the other methods.
  // important when wrapping filters and duplexes.
  for (var i in stream) {
    if (this[i] === undefined && typeof stream[i] === 'function') {
      this[i] = function methodWrap(method) {
        return function methodWrapReturnFunction() {
          return stream[method].apply(stream, arguments);
        };
      }(i);
    }
  }

  // proxy certain important events.
  for (var n = 0; n < kProxyEvents.length; n++) {
    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
  }

  // when we try to consume some more bytes, simply unpause the
  // underlying stream.
  this._read = function (n) {
    debug('wrapped _read', n);
    if (paused) {
      paused = false;
      stream.resume();
    }
  };
  return this;
};
if (typeof Symbol === 'function') {
  Readable.prototype[Symbol.asyncIterator] = function () {
    if (createReadableStreamAsyncIterator === undefined) {
      createReadableStreamAsyncIterator = require('./internal/streams/async_iterator');
    }
    return createReadableStreamAsyncIterator(this);
  };
}
Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._readableState.highWaterMark;
  }
});
Object.defineProperty(Readable.prototype, 'readableBuffer', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._readableState && this._readableState.buffer;
  }
});
Object.defineProperty(Readable.prototype, 'readableFlowing', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._readableState.flowing;
  },
  set: function set(state) {
    if (this._readableState) {
      this._readableState.flowing = state;
    }
  }
});

// exposed for testing purposes only.
Readable._fromList = fromList;
Object.defineProperty(Readable.prototype, 'readableLength', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._readableState.length;
  }
});

// Pluck off n bytes from an array of buffers.
// Length is the combined lengths of all the buffers in the list.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function fromList(n, state) {
  // nothing buffered
  if (state.length === 0) return null;
  var ret;
  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
    // read it all, truncate the list
    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);
    state.buffer.clear();
  } else {
    // read part of list
    ret = state.buffer.consume(n, state.decoder);
  }
  return ret;
}
function endReadable(stream) {
  var state = stream._readableState;
  debug('endReadable', state.endEmitted);
  if (!state.endEmitted) {
    state.ended = true;
    process.nextTick(endReadableNT, state, stream);
  }
}
function endReadableNT(state, stream) {
  debug('endReadableNT', state.endEmitted, state.length);

  // Check that we didn't get one last unshift.
  if (!state.endEmitted && state.length === 0) {
    state.endEmitted = true;
    stream.readable = false;
    stream.emit('end');
    if (state.autoDestroy) {
      // In case of duplex streams we need a way to detect
      // if the writable side is ready for autoDestroy as well
      var wState = stream._writableState;
      if (!wState || wState.autoDestroy && wState.finished) {
        stream.destroy();
      }
    }
  }
}
if (typeof Symbol === 'function') {
  Readable.from = function (iterable, opts) {
    if (from === undefined) {
      from = require('./internal/streams/from');
    }
    return from(Readable, iterable, opts);
  };
}
function indexOf(xs, x) {
  for (var i = 0, l = xs.length; i < l; i++) {
    if (xs[i] === x) return i;
  }
  return -1;
}
}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"../errors":524,"./_stream_duplex":525,"./internal/streams/async_iterator":530,"./internal/streams/buffer_list":531,"./internal/streams/destroy":532,"./internal/streams/from":534,"./internal/streams/state":536,"./internal/streams/stream":537,"_process":254,"buffer":83,"events":188,"inherits":219,"string_decoder/":538,"util":54}],528:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a transform stream is a readable/writable stream where you do
// something with the data.  Sometimes it's called a "filter",
// but that's not a great name for it, since that implies a thing where
// some bits pass through, and others are simply ignored.  (That would
// be a valid example of a transform, of course.)
//
// While the output is causally related to the input, it's not a
// necessarily symmetric or synchronous transformation.  For example,
// a zlib stream might take multiple plain-text writes(), and then
// emit a single compressed chunk some time in the future.
//
// Here's how this works:
//
// The Transform stream has all the aspects of the readable and writable
// stream classes.  When you write(chunk), that calls _write(chunk,cb)
// internally, and returns false if there's a lot of pending writes
// buffered up.  When you call read(), that calls _read(n) until
// there's enough pending readable data buffered up.
//
// In a transform stream, the written data is placed in a buffer.  When
// _read(n) is called, it transforms the queued up data, calling the
// buffered _write cb's as it consumes chunks.  If consuming a single
// written chunk would result in multiple output chunks, then the first
// outputted bit calls the readcb, and subsequent chunks just go into
// the read buffer, and will cause it to emit 'readable' if necessary.
//
// This way, back-pressure is actually determined by the reading side,
// since _read has to be called to start processing a new chunk.  However,
// a pathological inflate type of transform can cause excessive buffering
// here.  For example, imagine a stream where every byte of input is
// interpreted as an integer from 0-255, and then results in that many
// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
// 1kb of data being output.  In this case, you could write a very small
// amount of input, and end up with a very large amount of output.  In
// such a pathological inflating mechanism, there'd be no way to tell
// the system to stop doing the transform.  A single 4MB write could
// cause the system to run out of memory.
//
// However, even in such a pathological case, only a single written chunk
// would be consumed, and then the rest would wait (un-transformed) until
// the results of the previous transformed chunk were consumed.

'use strict';

module.exports = Transform;
var _require$codes = require('../errors').codes,
  ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
  ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
  ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,
  ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;
var Duplex = require('./_stream_duplex');
require('inherits')(Transform, Duplex);
function afterTransform(er, data) {
  var ts = this._transformState;
  ts.transforming = false;
  var cb = ts.writecb;
  if (cb === null) {
    return this.emit('error', new ERR_MULTIPLE_CALLBACK());
  }
  ts.writechunk = null;
  ts.writecb = null;
  if (data != null)
    // single equals check for both `null` and `undefined`
    this.push(data);
  cb(er);
  var rs = this._readableState;
  rs.reading = false;
  if (rs.needReadable || rs.length < rs.highWaterMark) {
    this._read(rs.highWaterMark);
  }
}
function Transform(options) {
  if (!(this instanceof Transform)) return new Transform(options);
  Duplex.call(this, options);
  this._transformState = {
    afterTransform: afterTransform.bind(this),
    needTransform: false,
    transforming: false,
    writecb: null,
    writechunk: null,
    writeencoding: null
  };

  // start out asking for a readable event once data is transformed.
  this._readableState.needReadable = true;

  // we have implemented the _read method, and done the other things
  // that Readable wants before the first _read call, so unset the
  // sync guard flag.
  this._readableState.sync = false;
  if (options) {
    if (typeof options.transform === 'function') this._transform = options.transform;
    if (typeof options.flush === 'function') this._flush = options.flush;
  }

  // When the writable side finishes, then flush out anything remaining.
  this.on('prefinish', prefinish);
}
function prefinish() {
  var _this = this;
  if (typeof this._flush === 'function' && !this._readableState.destroyed) {
    this._flush(function (er, data) {
      done(_this, er, data);
    });
  } else {
    done(this, null, null);
  }
}
Transform.prototype.push = function (chunk, encoding) {
  this._transformState.needTransform = false;
  return Duplex.prototype.push.call(this, chunk, encoding);
};

// This is the part where you do stuff!
// override this function in implementation classes.
// 'chunk' is an input chunk.
//
// Call `push(newChunk)` to pass along transformed output
// to the readable side.  You may call 'push' zero or more times.
//
// Call `cb(err)` when you are done with this chunk.  If you pass
// an error, then that'll put the hurt on the whole operation.  If you
// never call cb(), then you'll never get another chunk.
Transform.prototype._transform = function (chunk, encoding, cb) {
  cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));
};
Transform.prototype._write = function (chunk, encoding, cb) {
  var ts = this._transformState;
  ts.writecb = cb;
  ts.writechunk = chunk;
  ts.writeencoding = encoding;
  if (!ts.transforming) {
    var rs = this._readableState;
    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
  }
};

// Doesn't matter what the args are here.
// _transform does all the work.
// That we got here means that the readable side wants more data.
Transform.prototype._read = function (n) {
  var ts = this._transformState;
  if (ts.writechunk !== null && !ts.transforming) {
    ts.transforming = true;
    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
  } else {
    // mark that we need a transform, so that any data that comes in
    // will get processed, now that we've asked for it.
    ts.needTransform = true;
  }
};
Transform.prototype._destroy = function (err, cb) {
  Duplex.prototype._destroy.call(this, err, function (err2) {
    cb(err2);
  });
};
function done(stream, er, data) {
  if (er) return stream.emit('error', er);
  if (data != null)
    // single equals check for both `null` and `undefined`
    stream.push(data);

  // TODO(BridgeAR): Write a test for these two error cases
  // if there's nothing in the write buffer, then that means
  // that nothing more will ever be provided
  if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();
  if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();
  return stream.push(null);
}
},{"../errors":524,"./_stream_duplex":525,"inherits":219}],529:[function(require,module,exports){
(function (process,global){(function (){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// A bit simpler than readable streams.
// Implement an async ._write(chunk, encoding, cb), and it'll handle all
// the drain event emission and buffering.

'use strict';

module.exports = Writable;

/* <replacement> */
function WriteReq(chunk, encoding, cb) {
  this.chunk = chunk;
  this.encoding = encoding;
  this.callback = cb;
  this.next = null;
}

// It seems a linked list but it is not
// there will be only 2 of these for each stream
function CorkedRequest(state) {
  var _this = this;
  this.next = null;
  this.entry = null;
  this.finish = function () {
    onCorkedFinish(_this, state);
  };
}
/* </replacement> */

/*<replacement>*/
var Duplex;
/*</replacement>*/

Writable.WritableState = WritableState;

/*<replacement>*/
var internalUtil = {
  deprecate: require('util-deprecate')
};
/*</replacement>*/

/*<replacement>*/
var Stream = require('./internal/streams/stream');
/*</replacement>*/

var Buffer = require('buffer').Buffer;
var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
function _uint8ArrayToBuffer(chunk) {
  return Buffer.from(chunk);
}
function _isUint8Array(obj) {
  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}
var destroyImpl = require('./internal/streams/destroy');
var _require = require('./internal/streams/state'),
  getHighWaterMark = _require.getHighWaterMark;
var _require$codes = require('../errors').codes,
  ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
  ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
  ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
  ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,
  ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,
  ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,
  ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,
  ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;
var errorOrDestroy = destroyImpl.errorOrDestroy;
require('inherits')(Writable, Stream);
function nop() {}
function WritableState(options, stream, isDuplex) {
  Duplex = Duplex || require('./_stream_duplex');
  options = options || {};

  // Duplex streams are both readable and writable, but share
  // the same options object.
  // However, some cases require setting options to different
  // values for the readable and the writable sides of the duplex stream,
  // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;

  // object stream flag to indicate whether or not this stream
  // contains buffers or objects.
  this.objectMode = !!options.objectMode;
  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;

  // the point at which write() starts returning false
  // Note: 0 is a valid value, means that we always return false if
  // the entire buffer is not flushed immediately on write()
  this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex);

  // if _final has been called
  this.finalCalled = false;

  // drain event flag.
  this.needDrain = false;
  // at the start of calling end()
  this.ending = false;
  // when end() has been called, and returned
  this.ended = false;
  // when 'finish' is emitted
  this.finished = false;

  // has it been destroyed
  this.destroyed = false;

  // should we decode strings into buffers before passing to _write?
  // this is here so that some node-core streams can optimize string
  // handling at a lower level.
  var noDecode = options.decodeStrings === false;
  this.decodeStrings = !noDecode;

  // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.
  this.defaultEncoding = options.defaultEncoding || 'utf8';

  // not an actual buffer we keep track of, but a measurement
  // of how much we're waiting to get pushed to some underlying
  // socket or file.
  this.length = 0;

  // a flag to see when we're in the middle of a write.
  this.writing = false;

  // when true all writes will be buffered until .uncork() call
  this.corked = 0;

  // a flag to be able to tell if the onwrite cb is called immediately,
  // or on a later tick.  We set this to true at first, because any
  // actions that shouldn't happen until "later" should generally also
  // not happen before the first write call.
  this.sync = true;

  // a flag to know if we're processing previously buffered items, which
  // may call the _write() callback in the same tick, so that we don't
  // end up in an overlapped onwrite situation.
  this.bufferProcessing = false;

  // the callback that's passed to _write(chunk,cb)
  this.onwrite = function (er) {
    onwrite(stream, er);
  };

  // the callback that the user supplies to write(chunk,encoding,cb)
  this.writecb = null;

  // the amount that is being written when _write is called.
  this.writelen = 0;
  this.bufferedRequest = null;
  this.lastBufferedRequest = null;

  // number of pending user-supplied write callbacks
  // this must be 0 before 'finish' can be emitted
  this.pendingcb = 0;

  // emit prefinish if the only thing we're waiting for is _write cbs
  // This is relevant for synchronous Transform streams
  this.prefinished = false;

  // True if the error was already emitted and should not be thrown again
  this.errorEmitted = false;

  // Should close be emitted on destroy. Defaults to true.
  this.emitClose = options.emitClose !== false;

  // Should .destroy() be called after 'finish' (and potentially 'end')
  this.autoDestroy = !!options.autoDestroy;

  // count buffered requests
  this.bufferedRequestCount = 0;

  // allocate the first CorkedRequest, there is always
  // one allocated and free to use, and we maintain at most two
  this.corkedRequestsFree = new CorkedRequest(this);
}
WritableState.prototype.getBuffer = function getBuffer() {
  var current = this.bufferedRequest;
  var out = [];
  while (current) {
    out.push(current);
    current = current.next;
  }
  return out;
};
(function () {
  try {
    Object.defineProperty(WritableState.prototype, 'buffer', {
      get: internalUtil.deprecate(function writableStateBufferGetter() {
        return this.getBuffer();
      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
    });
  } catch (_) {}
})();

// Test _writableState for inheritance to account for Duplex streams,
// whose prototype chain only points to Readable.
var realHasInstance;
if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
  realHasInstance = Function.prototype[Symbol.hasInstance];
  Object.defineProperty(Writable, Symbol.hasInstance, {
    value: function value(object) {
      if (realHasInstance.call(this, object)) return true;
      if (this !== Writable) return false;
      return object && object._writableState instanceof WritableState;
    }
  });
} else {
  realHasInstance = function realHasInstance(object) {
    return object instanceof this;
  };
}
function Writable(options) {
  Duplex = Duplex || require('./_stream_duplex');

  // Writable ctor is applied to Duplexes, too.
  // `realHasInstance` is necessary because using plain `instanceof`
  // would return false, as no `_writableState` property is attached.

  // Trying to use the custom `instanceof` for Writable here will also break the
  // Node.js LazyTransform implementation, which has a non-trivial getter for
  // `_writableState` that would lead to infinite recursion.

  // Checking for a Stream.Duplex instance is faster here instead of inside
  // the WritableState constructor, at least with V8 6.5
  var isDuplex = this instanceof Duplex;
  if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);
  this._writableState = new WritableState(options, this, isDuplex);

  // legacy.
  this.writable = true;
  if (options) {
    if (typeof options.write === 'function') this._write = options.write;
    if (typeof options.writev === 'function') this._writev = options.writev;
    if (typeof options.destroy === 'function') this._destroy = options.destroy;
    if (typeof options.final === 'function') this._final = options.final;
  }
  Stream.call(this);
}

// Otherwise people can pipe Writable streams, which is just wrong.
Writable.prototype.pipe = function () {
  errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
};
function writeAfterEnd(stream, cb) {
  var er = new ERR_STREAM_WRITE_AFTER_END();
  // TODO: defer error events consistently everywhere, not just the cb
  errorOrDestroy(stream, er);
  process.nextTick(cb, er);
}

// Checks that a user-supplied chunk is valid, especially for the particular
// mode the stream is in. Currently this means that `null` is never accepted
// and undefined/non-string values are only allowed in object mode.
function validChunk(stream, state, chunk, cb) {
  var er;
  if (chunk === null) {
    er = new ERR_STREAM_NULL_VALUES();
  } else if (typeof chunk !== 'string' && !state.objectMode) {
    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);
  }
  if (er) {
    errorOrDestroy(stream, er);
    process.nextTick(cb, er);
    return false;
  }
  return true;
}
Writable.prototype.write = function (chunk, encoding, cb) {
  var state = this._writableState;
  var ret = false;
  var isBuf = !state.objectMode && _isUint8Array(chunk);
  if (isBuf && !Buffer.isBuffer(chunk)) {
    chunk = _uint8ArrayToBuffer(chunk);
  }
  if (typeof encoding === 'function') {
    cb = encoding;
    encoding = null;
  }
  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
  if (typeof cb !== 'function') cb = nop;
  if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
    state.pendingcb++;
    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
  }
  return ret;
};
Writable.prototype.cork = function () {
  this._writableState.corked++;
};
Writable.prototype.uncork = function () {
  var state = this._writableState;
  if (state.corked) {
    state.corked--;
    if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
  }
};
Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
  // node::ParseEncoding() requires lower case.
  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);
  this._writableState.defaultEncoding = encoding;
  return this;
};
Object.defineProperty(Writable.prototype, 'writableBuffer', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState && this._writableState.getBuffer();
  }
});
function decodeChunk(state, chunk, encoding) {
  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
    chunk = Buffer.from(chunk, encoding);
  }
  return chunk;
}
Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState.highWaterMark;
  }
});

// if we're already writing something, then just put this
// in the queue, and wait our turn.  Otherwise, call _write
// If we return false, then we need a drain event, so set that flag.
function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
  if (!isBuf) {
    var newChunk = decodeChunk(state, chunk, encoding);
    if (chunk !== newChunk) {
      isBuf = true;
      encoding = 'buffer';
      chunk = newChunk;
    }
  }
  var len = state.objectMode ? 1 : chunk.length;
  state.length += len;
  var ret = state.length < state.highWaterMark;
  // we must ensure that previous needDrain will not be reset to false.
  if (!ret) state.needDrain = true;
  if (state.writing || state.corked) {
    var last = state.lastBufferedRequest;
    state.lastBufferedRequest = {
      chunk: chunk,
      encoding: encoding,
      isBuf: isBuf,
      callback: cb,
      next: null
    };
    if (last) {
      last.next = state.lastBufferedRequest;
    } else {
      state.bufferedRequest = state.lastBufferedRequest;
    }
    state.bufferedRequestCount += 1;
  } else {
    doWrite(stream, state, false, len, chunk, encoding, cb);
  }
  return ret;
}
function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  state.writelen = len;
  state.writecb = cb;
  state.writing = true;
  state.sync = true;
  if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
  state.sync = false;
}
function onwriteError(stream, state, sync, er, cb) {
  --state.pendingcb;
  if (sync) {
    // defer the callback if we are being called synchronously
    // to avoid piling up things on the stack
    process.nextTick(cb, er);
    // this can emit finish, and it will always happen
    // after error
    process.nextTick(finishMaybe, stream, state);
    stream._writableState.errorEmitted = true;
    errorOrDestroy(stream, er);
  } else {
    // the caller expect this to happen before if
    // it is async
    cb(er);
    stream._writableState.errorEmitted = true;
    errorOrDestroy(stream, er);
    // this can emit finish, but finish must
    // always follow error
    finishMaybe(stream, state);
  }
}
function onwriteStateUpdate(state) {
  state.writing = false;
  state.writecb = null;
  state.length -= state.writelen;
  state.writelen = 0;
}
function onwrite(stream, er) {
  var state = stream._writableState;
  var sync = state.sync;
  var cb = state.writecb;
  if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();
  onwriteStateUpdate(state);
  if (er) onwriteError(stream, state, sync, er, cb);else {
    // Check if we're actually ready to finish, but don't emit yet
    var finished = needFinish(state) || stream.destroyed;
    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
      clearBuffer(stream, state);
    }
    if (sync) {
      process.nextTick(afterWrite, stream, state, finished, cb);
    } else {
      afterWrite(stream, state, finished, cb);
    }
  }
}
function afterWrite(stream, state, finished, cb) {
  if (!finished) onwriteDrain(stream, state);
  state.pendingcb--;
  cb();
  finishMaybe(stream, state);
}

// Must force callback to be called on nextTick, so that we don't
// emit 'drain' before the write() consumer gets the 'false' return
// value, and has a chance to attach a 'drain' listener.
function onwriteDrain(stream, state) {
  if (state.length === 0 && state.needDrain) {
    state.needDrain = false;
    stream.emit('drain');
  }
}

// if there's something in the buffer waiting, then process it
function clearBuffer(stream, state) {
  state.bufferProcessing = true;
  var entry = state.bufferedRequest;
  if (stream._writev && entry && entry.next) {
    // Fast case, write everything using _writev()
    var l = state.bufferedRequestCount;
    var buffer = new Array(l);
    var holder = state.corkedRequestsFree;
    holder.entry = entry;
    var count = 0;
    var allBuffers = true;
    while (entry) {
      buffer[count] = entry;
      if (!entry.isBuf) allBuffers = false;
      entry = entry.next;
      count += 1;
    }
    buffer.allBuffers = allBuffers;
    doWrite(stream, state, true, state.length, buffer, '', holder.finish);

    // doWrite is almost always async, defer these to save a bit of time
    // as the hot path ends with doWrite
    state.pendingcb++;
    state.lastBufferedRequest = null;
    if (holder.next) {
      state.corkedRequestsFree = holder.next;
      holder.next = null;
    } else {
      state.corkedRequestsFree = new CorkedRequest(state);
    }
    state.bufferedRequestCount = 0;
  } else {
    // Slow case, write chunks one-by-one
    while (entry) {
      var chunk = entry.chunk;
      var encoding = entry.encoding;
      var cb = entry.callback;
      var len = state.objectMode ? 1 : chunk.length;
      doWrite(stream, state, false, len, chunk, encoding, cb);
      entry = entry.next;
      state.bufferedRequestCount--;
      // if we didn't call the onwrite immediately, then
      // it means that we need to wait until it does.
      // also, that means that the chunk and cb are currently
      // being processed, so move the buffer counter past them.
      if (state.writing) {
        break;
      }
    }
    if (entry === null) state.lastBufferedRequest = null;
  }
  state.bufferedRequest = entry;
  state.bufferProcessing = false;
}
Writable.prototype._write = function (chunk, encoding, cb) {
  cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));
};
Writable.prototype._writev = null;
Writable.prototype.end = function (chunk, encoding, cb) {
  var state = this._writableState;
  if (typeof chunk === 'function') {
    cb = chunk;
    chunk = null;
    encoding = null;
  } else if (typeof encoding === 'function') {
    cb = encoding;
    encoding = null;
  }
  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);

  // .end() fully uncorks
  if (state.corked) {
    state.corked = 1;
    this.uncork();
  }

  // ignore unnecessary end() calls.
  if (!state.ending) endWritable(this, state, cb);
  return this;
};
Object.defineProperty(Writable.prototype, 'writableLength', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState.length;
  }
});
function needFinish(state) {
  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
}
function callFinal(stream, state) {
  stream._final(function (err) {
    state.pendingcb--;
    if (err) {
      errorOrDestroy(stream, err);
    }
    state.prefinished = true;
    stream.emit('prefinish');
    finishMaybe(stream, state);
  });
}
function prefinish(stream, state) {
  if (!state.prefinished && !state.finalCalled) {
    if (typeof stream._final === 'function' && !state.destroyed) {
      state.pendingcb++;
      state.finalCalled = true;
      process.nextTick(callFinal, stream, state);
    } else {
      state.prefinished = true;
      stream.emit('prefinish');
    }
  }
}
function finishMaybe(stream, state) {
  var need = needFinish(state);
  if (need) {
    prefinish(stream, state);
    if (state.pendingcb === 0) {
      state.finished = true;
      stream.emit('finish');
      if (state.autoDestroy) {
        // In case of duplex streams we need a way to detect
        // if the readable side is ready for autoDestroy as well
        var rState = stream._readableState;
        if (!rState || rState.autoDestroy && rState.endEmitted) {
          stream.destroy();
        }
      }
    }
  }
  return need;
}
function endWritable(stream, state, cb) {
  state.ending = true;
  finishMaybe(stream, state);
  if (cb) {
    if (state.finished) process.nextTick(cb);else stream.once('finish', cb);
  }
  state.ended = true;
  stream.writable = false;
}
function onCorkedFinish(corkReq, state, err) {
  var entry = corkReq.entry;
  corkReq.entry = null;
  while (entry) {
    var cb = entry.callback;
    state.pendingcb--;
    cb(err);
    entry = entry.next;
  }

  // reuse the free corkReq.
  state.corkedRequestsFree.next = corkReq;
}
Object.defineProperty(Writable.prototype, 'destroyed', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    if (this._writableState === undefined) {
      return false;
    }
    return this._writableState.destroyed;
  },
  set: function set(value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (!this._writableState) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._writableState.destroyed = value;
  }
});
Writable.prototype.destroy = destroyImpl.destroy;
Writable.prototype._undestroy = destroyImpl.undestroy;
Writable.prototype._destroy = function (err, cb) {
  cb(err);
};
}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"../errors":524,"./_stream_duplex":525,"./internal/streams/destroy":532,"./internal/streams/state":536,"./internal/streams/stream":537,"_process":254,"buffer":83,"inherits":219,"util-deprecate":543}],530:[function(require,module,exports){
(function (process){(function (){
'use strict';

var _Object$setPrototypeO;
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
var finished = require('./end-of-stream');
var kLastResolve = Symbol('lastResolve');
var kLastReject = Symbol('lastReject');
var kError = Symbol('error');
var kEnded = Symbol('ended');
var kLastPromise = Symbol('lastPromise');
var kHandlePromise = Symbol('handlePromise');
var kStream = Symbol('stream');
function createIterResult(value, done) {
  return {
    value: value,
    done: done
  };
}
function readAndResolve(iter) {
  var resolve = iter[kLastResolve];
  if (resolve !== null) {
    var data = iter[kStream].read();
    // we defer if data is null
    // we can be expecting either 'end' or
    // 'error'
    if (data !== null) {
      iter[kLastPromise] = null;
      iter[kLastResolve] = null;
      iter[kLastReject] = null;
      resolve(createIterResult(data, false));
    }
  }
}
function onReadable(iter) {
  // we wait for the next tick, because it might
  // emit an error with process.nextTick
  process.nextTick(readAndResolve, iter);
}
function wrapForNext(lastPromise, iter) {
  return function (resolve, reject) {
    lastPromise.then(function () {
      if (iter[kEnded]) {
        resolve(createIterResult(undefined, true));
        return;
      }
      iter[kHandlePromise](resolve, reject);
    }, reject);
  };
}
var AsyncIteratorPrototype = Object.getPrototypeOf(function () {});
var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {
  get stream() {
    return this[kStream];
  },
  next: function next() {
    var _this = this;
    // if we have detected an error in the meanwhile
    // reject straight away
    var error = this[kError];
    if (error !== null) {
      return Promise.reject(error);
    }
    if (this[kEnded]) {
      return Promise.resolve(createIterResult(undefined, true));
    }
    if (this[kStream].destroyed) {
      // We need to defer via nextTick because if .destroy(err) is
      // called, the error will be emitted via nextTick, and
      // we cannot guarantee that there is no error lingering around
      // waiting to be emitted.
      return new Promise(function (resolve, reject) {
        process.nextTick(function () {
          if (_this[kError]) {
            reject(_this[kError]);
          } else {
            resolve(createIterResult(undefined, true));
          }
        });
      });
    }

    // if we have multiple next() calls
    // we will wait for the previous Promise to finish
    // this logic is optimized to support for await loops,
    // where next() is only called once at a time
    var lastPromise = this[kLastPromise];
    var promise;
    if (lastPromise) {
      promise = new Promise(wrapForNext(lastPromise, this));
    } else {
      // fast path needed to support multiple this.push()
      // without triggering the next() queue
      var data = this[kStream].read();
      if (data !== null) {
        return Promise.resolve(createIterResult(data, false));
      }
      promise = new Promise(this[kHandlePromise]);
    }
    this[kLastPromise] = promise;
    return promise;
  }
}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {
  return this;
}), _defineProperty(_Object$setPrototypeO, "return", function _return() {
  var _this2 = this;
  // destroy(err, cb) is a private API
  // we can guarantee we have that here, because we control the
  // Readable class this is attached to
  return new Promise(function (resolve, reject) {
    _this2[kStream].destroy(null, function (err) {
      if (err) {
        reject(err);
        return;
      }
      resolve(createIterResult(undefined, true));
    });
  });
}), _Object$setPrototypeO), AsyncIteratorPrototype);
var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {
  var _Object$create;
  var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {
    value: stream,
    writable: true
  }), _defineProperty(_Object$create, kLastResolve, {
    value: null,
    writable: true
  }), _defineProperty(_Object$create, kLastReject, {
    value: null,
    writable: true
  }), _defineProperty(_Object$create, kError, {
    value: null,
    writable: true
  }), _defineProperty(_Object$create, kEnded, {
    value: stream._readableState.endEmitted,
    writable: true
  }), _defineProperty(_Object$create, kHandlePromise, {
    value: function value(resolve, reject) {
      var data = iterator[kStream].read();
      if (data) {
        iterator[kLastPromise] = null;
        iterator[kLastResolve] = null;
        iterator[kLastReject] = null;
        resolve(createIterResult(data, false));
      } else {
        iterator[kLastResolve] = resolve;
        iterator[kLastReject] = reject;
      }
    },
    writable: true
  }), _Object$create));
  iterator[kLastPromise] = null;
  finished(stream, function (err) {
    if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
      var reject = iterator[kLastReject];
      // reject if we are waiting for data in the Promise
      // returned by next() and store the error
      if (reject !== null) {
        iterator[kLastPromise] = null;
        iterator[kLastResolve] = null;
        iterator[kLastReject] = null;
        reject(err);
      }
      iterator[kError] = err;
      return;
    }
    var resolve = iterator[kLastResolve];
    if (resolve !== null) {
      iterator[kLastPromise] = null;
      iterator[kLastResolve] = null;
      iterator[kLastReject] = null;
      resolve(createIterResult(undefined, true));
    }
    iterator[kEnded] = true;
  });
  stream.on('readable', onReadable.bind(null, iterator));
  return iterator;
};
module.exports = createReadableStreamAsyncIterator;
}).call(this)}).call(this,require('_process'))
},{"./end-of-stream":533,"_process":254}],531:[function(require,module,exports){
'use strict';

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
var _require = require('buffer'),
  Buffer = _require.Buffer;
var _require2 = require('util'),
  inspect = _require2.inspect;
var custom = inspect && inspect.custom || 'inspect';
function copyBuffer(src, target, offset) {
  Buffer.prototype.copy.call(src, target, offset);
}
module.exports = /*#__PURE__*/function () {
  function BufferList() {
    _classCallCheck(this, BufferList);
    this.head = null;
    this.tail = null;
    this.length = 0;
  }
  _createClass(BufferList, [{
    key: "push",
    value: function push(v) {
      var entry = {
        data: v,
        next: null
      };
      if (this.length > 0) this.tail.next = entry;else this.head = entry;
      this.tail = entry;
      ++this.length;
    }
  }, {
    key: "unshift",
    value: function unshift(v) {
      var entry = {
        data: v,
        next: this.head
      };
      if (this.length === 0) this.tail = entry;
      this.head = entry;
      ++this.length;
    }
  }, {
    key: "shift",
    value: function shift() {
      if (this.length === 0) return;
      var ret = this.head.data;
      if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
      --this.length;
      return ret;
    }
  }, {
    key: "clear",
    value: function clear() {
      this.head = this.tail = null;
      this.length = 0;
    }
  }, {
    key: "join",
    value: function join(s) {
      if (this.length === 0) return '';
      var p = this.head;
      var ret = '' + p.data;
      while (p = p.next) ret += s + p.data;
      return ret;
    }
  }, {
    key: "concat",
    value: function concat(n) {
      if (this.length === 0) return Buffer.alloc(0);
      var ret = Buffer.allocUnsafe(n >>> 0);
      var p = this.head;
      var i = 0;
      while (p) {
        copyBuffer(p.data, ret, i);
        i += p.data.length;
        p = p.next;
      }
      return ret;
    }

    // Consumes a specified amount of bytes or characters from the buffered data.
  }, {
    key: "consume",
    value: function consume(n, hasStrings) {
      var ret;
      if (n < this.head.data.length) {
        // `slice` is the same for buffers and strings.
        ret = this.head.data.slice(0, n);
        this.head.data = this.head.data.slice(n);
      } else if (n === this.head.data.length) {
        // First chunk is a perfect match.
        ret = this.shift();
      } else {
        // Result spans more than one buffer.
        ret = hasStrings ? this._getString(n) : this._getBuffer(n);
      }
      return ret;
    }
  }, {
    key: "first",
    value: function first() {
      return this.head.data;
    }

    // Consumes a specified amount of characters from the buffered data.
  }, {
    key: "_getString",
    value: function _getString(n) {
      var p = this.head;
      var c = 1;
      var ret = p.data;
      n -= ret.length;
      while (p = p.next) {
        var str = p.data;
        var nb = n > str.length ? str.length : n;
        if (nb === str.length) ret += str;else ret += str.slice(0, n);
        n -= nb;
        if (n === 0) {
          if (nb === str.length) {
            ++c;
            if (p.next) this.head = p.next;else this.head = this.tail = null;
          } else {
            this.head = p;
            p.data = str.slice(nb);
          }
          break;
        }
        ++c;
      }
      this.length -= c;
      return ret;
    }

    // Consumes a specified amount of bytes from the buffered data.
  }, {
    key: "_getBuffer",
    value: function _getBuffer(n) {
      var ret = Buffer.allocUnsafe(n);
      var p = this.head;
      var c = 1;
      p.data.copy(ret);
      n -= p.data.length;
      while (p = p.next) {
        var buf = p.data;
        var nb = n > buf.length ? buf.length : n;
        buf.copy(ret, ret.length - n, 0, nb);
        n -= nb;
        if (n === 0) {
          if (nb === buf.length) {
            ++c;
            if (p.next) this.head = p.next;else this.head = this.tail = null;
          } else {
            this.head = p;
            p.data = buf.slice(nb);
          }
          break;
        }
        ++c;
      }
      this.length -= c;
      return ret;
    }

    // Make sure the linked list only shows the minimal necessary information.
  }, {
    key: custom,
    value: function value(_, options) {
      return inspect(this, _objectSpread(_objectSpread({}, options), {}, {
        // Only inspect one level.
        depth: 0,
        // It should not recurse.
        customInspect: false
      }));
    }
  }]);
  return BufferList;
}();
},{"buffer":83,"util":54}],532:[function(require,module,exports){
(function (process){(function (){
'use strict';

// undocumented cb() API, needed for core, not for public API
function destroy(err, cb) {
  var _this = this;
  var readableDestroyed = this._readableState && this._readableState.destroyed;
  var writableDestroyed = this._writableState && this._writableState.destroyed;
  if (readableDestroyed || writableDestroyed) {
    if (cb) {
      cb(err);
    } else if (err) {
      if (!this._writableState) {
        process.nextTick(emitErrorNT, this, err);
      } else if (!this._writableState.errorEmitted) {
        this._writableState.errorEmitted = true;
        process.nextTick(emitErrorNT, this, err);
      }
    }
    return this;
  }

  // we set destroyed to true before firing error callbacks in order
  // to make it re-entrance safe in case destroy() is called within callbacks

  if (this._readableState) {
    this._readableState.destroyed = true;
  }

  // if this is a duplex stream mark the writable part as destroyed as well
  if (this._writableState) {
    this._writableState.destroyed = true;
  }
  this._destroy(err || null, function (err) {
    if (!cb && err) {
      if (!_this._writableState) {
        process.nextTick(emitErrorAndCloseNT, _this, err);
      } else if (!_this._writableState.errorEmitted) {
        _this._writableState.errorEmitted = true;
        process.nextTick(emitErrorAndCloseNT, _this, err);
      } else {
        process.nextTick(emitCloseNT, _this);
      }
    } else if (cb) {
      process.nextTick(emitCloseNT, _this);
      cb(err);
    } else {
      process.nextTick(emitCloseNT, _this);
    }
  });
  return this;
}
function emitErrorAndCloseNT(self, err) {
  emitErrorNT(self, err);
  emitCloseNT(self);
}
function emitCloseNT(self) {
  if (self._writableState && !self._writableState.emitClose) return;
  if (self._readableState && !self._readableState.emitClose) return;
  self.emit('close');
}
function undestroy() {
  if (this._readableState) {
    this._readableState.destroyed = false;
    this._readableState.reading = false;
    this._readableState.ended = false;
    this._readableState.endEmitted = false;
  }
  if (this._writableState) {
    this._writableState.destroyed = false;
    this._writableState.ended = false;
    this._writableState.ending = false;
    this._writableState.finalCalled = false;
    this._writableState.prefinished = false;
    this._writableState.finished = false;
    this._writableState.errorEmitted = false;
  }
}
function emitErrorNT(self, err) {
  self.emit('error', err);
}
function errorOrDestroy(stream, err) {
  // We have tests that rely on errors being emitted
  // in the same tick, so changing this is semver major.
  // For now when you opt-in to autoDestroy we allow
  // the error to be emitted nextTick. In a future
  // semver major update we should change the default to this.

  var rState = stream._readableState;
  var wState = stream._writableState;
  if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);
}
module.exports = {
  destroy: destroy,
  undestroy: undestroy,
  errorOrDestroy: errorOrDestroy
};
}).call(this)}).call(this,require('_process'))
},{"_process":254}],533:[function(require,module,exports){
// Ported from https://github.com/mafintosh/end-of-stream with
// permission from the author, Mathias Buus (@mafintosh).

'use strict';

var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE;
function once(callback) {
  var called = false;
  return function () {
    if (called) return;
    called = true;
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
    callback.apply(this, args);
  };
}
function noop() {}
function isRequest(stream) {
  return stream.setHeader && typeof stream.abort === 'function';
}
function eos(stream, opts, callback) {
  if (typeof opts === 'function') return eos(stream, null, opts);
  if (!opts) opts = {};
  callback = once(callback || noop);
  var readable = opts.readable || opts.readable !== false && stream.readable;
  var writable = opts.writable || opts.writable !== false && stream.writable;
  var onlegacyfinish = function onlegacyfinish() {
    if (!stream.writable) onfinish();
  };
  var writableEnded = stream._writableState && stream._writableState.finished;
  var onfinish = function onfinish() {
    writable = false;
    writableEnded = true;
    if (!readable) callback.call(stream);
  };
  var readableEnded = stream._readableState && stream._readableState.endEmitted;
  var onend = function onend() {
    readable = false;
    readableEnded = true;
    if (!writable) callback.call(stream);
  };
  var onerror = function onerror(err) {
    callback.call(stream, err);
  };
  var onclose = function onclose() {
    var err;
    if (readable && !readableEnded) {
      if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
      return callback.call(stream, err);
    }
    if (writable && !writableEnded) {
      if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
      return callback.call(stream, err);
    }
  };
  var onrequest = function onrequest() {
    stream.req.on('finish', onfinish);
  };
  if (isRequest(stream)) {
    stream.on('complete', onfinish);
    stream.on('abort', onclose);
    if (stream.req) onrequest();else stream.on('request', onrequest);
  } else if (writable && !stream._writableState) {
    // legacy streams
    stream.on('end', onlegacyfinish);
    stream.on('close', onlegacyfinish);
  }
  stream.on('end', onend);
  stream.on('finish', onfinish);
  if (opts.error !== false) stream.on('error', onerror);
  stream.on('close', onclose);
  return function () {
    stream.removeListener('complete', onfinish);
    stream.removeListener('abort', onclose);
    stream.removeListener('request', onrequest);
    if (stream.req) stream.req.removeListener('finish', onfinish);
    stream.removeListener('end', onlegacyfinish);
    stream.removeListener('close', onlegacyfinish);
    stream.removeListener('finish', onfinish);
    stream.removeListener('end', onend);
    stream.removeListener('error', onerror);
    stream.removeListener('close', onclose);
  };
}
module.exports = eos;
},{"../../../errors":524}],534:[function(require,module,exports){
module.exports = function () {
  throw new Error('Readable.from is not available in the browser')
};

},{}],535:[function(require,module,exports){
// Ported from https://github.com/mafintosh/pump with
// permission from the author, Mathias Buus (@mafintosh).

'use strict';

var eos;
function once(callback) {
  var called = false;
  return function () {
    if (called) return;
    called = true;
    callback.apply(void 0, arguments);
  };
}
var _require$codes = require('../../../errors').codes,
  ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,
  ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;
function noop(err) {
  // Rethrow the error if it exists to avoid swallowing it
  if (err) throw err;
}
function isRequest(stream) {
  return stream.setHeader && typeof stream.abort === 'function';
}
function destroyer(stream, reading, writing, callback) {
  callback = once(callback);
  var closed = false;
  stream.on('close', function () {
    closed = true;
  });
  if (eos === undefined) eos = require('./end-of-stream');
  eos(stream, {
    readable: reading,
    writable: writing
  }, function (err) {
    if (err) return callback(err);
    closed = true;
    callback();
  });
  var destroyed = false;
  return function (err) {
    if (closed) return;
    if (destroyed) return;
    destroyed = true;

    // request.destroy just do .end - .abort is what we want
    if (isRequest(stream)) return stream.abort();
    if (typeof stream.destroy === 'function') return stream.destroy();
    callback(err || new ERR_STREAM_DESTROYED('pipe'));
  };
}
function call(fn) {
  fn();
}
function pipe(from, to) {
  return from.pipe(to);
}
function popCallback(streams) {
  if (!streams.length) return noop;
  if (typeof streams[streams.length - 1] !== 'function') return noop;
  return streams.pop();
}
function pipeline() {
  for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {
    streams[_key] = arguments[_key];
  }
  var callback = popCallback(streams);
  if (Array.isArray(streams[0])) streams = streams[0];
  if (streams.length < 2) {
    throw new ERR_MISSING_ARGS('streams');
  }
  var error;
  var destroys = streams.map(function (stream, i) {
    var reading = i < streams.length - 1;
    var writing = i > 0;
    return destroyer(stream, reading, writing, function (err) {
      if (!error) error = err;
      if (err) destroys.forEach(call);
      if (reading) return;
      destroys.forEach(call);
      callback(error);
    });
  });
  return streams.reduce(pipe);
}
module.exports = pipeline;
},{"../../../errors":524,"./end-of-stream":533}],536:[function(require,module,exports){
'use strict';

var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE;
function highWaterMarkFrom(options, isDuplex, duplexKey) {
  return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;
}
function getHighWaterMark(state, options, duplexKey, isDuplex) {
  var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);
  if (hwm != null) {
    if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {
      var name = isDuplex ? duplexKey : 'highWaterMark';
      throw new ERR_INVALID_OPT_VALUE(name, hwm);
    }
    return Math.floor(hwm);
  }

  // Default value
  return state.objectMode ? 16 : 16 * 1024;
}
module.exports = {
  getHighWaterMark: getHighWaterMark
};
},{"../../../errors":524}],537:[function(require,module,exports){
arguments[4][282][0].apply(exports,arguments)
},{"dup":282,"events":188}],538:[function(require,module,exports){
arguments[4][284][0].apply(exports,arguments)
},{"dup":284,"safe-buffer":513}],539:[function(require,module,exports){
(function (setImmediate,clearImmediate){(function (){
var nextTick = require('process/browser.js').nextTick;
var apply = Function.prototype.apply;
var slice = Array.prototype.slice;
var immediateIds = {};
var nextImmediateId = 0;

// DOM APIs, for completeness

exports.setTimeout = function() {
  return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
};
exports.setInterval = function() {
  return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
};
exports.clearTimeout =
exports.clearInterval = function(timeout) { timeout.close(); };

function Timeout(id, clearFn) {
  this._id = id;
  this._clearFn = clearFn;
}
Timeout.prototype.unref = Timeout.prototype.ref = function() {};
Timeout.prototype.close = function() {
  this._clearFn.call(window, this._id);
};

// Does not start the time, just sets up the members needed.
exports.enroll = function(item, msecs) {
  clearTimeout(item._idleTimeoutId);
  item._idleTimeout = msecs;
};

exports.unenroll = function(item) {
  clearTimeout(item._idleTimeoutId);
  item._idleTimeout = -1;
};

exports._unrefActive = exports.active = function(item) {
  clearTimeout(item._idleTimeoutId);

  var msecs = item._idleTimeout;
  if (msecs >= 0) {
    item._idleTimeoutId = setTimeout(function onTimeout() {
      if (item._onTimeout)
        item._onTimeout();
    }, msecs);
  }
};

// That's not how node.js implements it but the exposed api is the same.
exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) {
  var id = nextImmediateId++;
  var args = arguments.length < 2 ? false : slice.call(arguments, 1);

  immediateIds[id] = true;

  nextTick(function onNextTick() {
    if (immediateIds[id]) {
      // fn.call() is faster so we optimize for the common use-case
      // @see http://jsperf.com/call-apply-segu
      if (args) {
        fn.apply(null, args);
      } else {
        fn.call(null);
      }
      // Prevent ids from leaking
      exports.clearImmediate(id);
    }
  });

  return id;
};

exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) {
  delete immediateIds[id];
};
}).call(this)}).call(this,require("timers").setImmediate,require("timers").clearImmediate)
},{"process/browser.js":254,"timers":539}],540:[function(require,module,exports){
'use strict';

var Buffer = require('safe-buffer').Buffer;
var isArray = require('isarray');
var typedArrayBuffer = require('typed-array-buffer');

var isView = ArrayBuffer.isView || function isView(obj) {
	try {
		typedArrayBuffer(obj);
		return true;
	} catch (e) {
		return false;
	}
};

var useUint8Array = typeof Uint8Array !== 'undefined';
var useArrayBuffer = typeof ArrayBuffer !== 'undefined'
	&& typeof Uint8Array !== 'undefined';
var useFromArrayBuffer = useArrayBuffer && (Buffer.prototype instanceof Uint8Array || Buffer.TYPED_ARRAY_SUPPORT);

module.exports = function toBuffer(data, encoding) {
	/*
	 * No need to do anything for exact instance
	 * This is only valid when safe-buffer.Buffer === buffer.Buffer, i.e. when Buffer.from/Buffer.alloc existed
	 */
	if (data instanceof Buffer) {
		return data;
	}

	if (typeof data === 'string') {
		return Buffer.from(data, encoding);
	}

	/*
	 * Wrap any TypedArray instances and DataViews
	 * Makes sense only on engines with full TypedArray support -- let Buffer detect that
	 */
	if (useArrayBuffer && isView(data)) {
		// Bug in Node.js <6.3.1, which treats this as out-of-bounds
		if (data.byteLength === 0) {
			return Buffer.alloc(0);
		}

		// When Buffer is based on Uint8Array, we can just construct it from ArrayBuffer
		if (useFromArrayBuffer) {
			var res = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
			/*
			 * Recheck result size, as offset/length doesn't work on Node.js <5.10
			 * We just go to Uint8Array case if this fails
			 */
			if (res.byteLength === data.byteLength) {
				return res;
			}
		}

		// Convert to Uint8Array bytes and then to Buffer
		var uint8 = data instanceof Uint8Array ? data : new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
		var result = Buffer.from(uint8);

		/*
		 * Let's recheck that conversion succeeded
		 * We have .length but not .byteLength when useFromArrayBuffer is false
		 */
		if (result.length === data.byteLength) {
			return result;
		}
	}

	/*
	 * Uint8Array in engines where Buffer.from might not work with ArrayBuffer, just copy over
	 * Doesn't make sense with other TypedArray instances
	 */
	if (useUint8Array && data instanceof Uint8Array) {
		return Buffer.from(data);
	}

	var isArr = isArray(data);
	if (isArr) {
		for (var i = 0; i < data.length; i += 1) {
			var x = data[i];
			if (
				typeof x !== 'number'
				|| x < 0
				|| x > 255
				|| ~~x !== x // NaN and integer check
			) {
				throw new RangeError('Array items must be numbers in the range 0-255.');
			}
		}
	}

	/*
	 * Old Buffer polyfill on an engine that doesn't have TypedArray support
	 * Also, this is from a different Buffer polyfill implementation then we have, as instanceof check failed
	 * Convert to our current Buffer implementation
	 */
	if (
		isArr || (
			Buffer.isBuffer(data)
				&& data.constructor
				&& typeof data.constructor.isBuffer === 'function'
				&& data.constructor.isBuffer(data)
		)
	) {
		return Buffer.from(data);
	}

	throw new TypeError('The "data" argument must be a string, an Array, a Buffer, a Uint8Array, or a DataView.');
};

},{"isarray":541,"safe-buffer":513,"typed-array-buffer":542}],541:[function(require,module,exports){
arguments[4][223][0].apply(exports,arguments)
},{"dup":223}],542:[function(require,module,exports){
'use strict';

var $TypeError = require('es-errors/type');

var callBound = require('call-bound');

/** @type {undefined | ((thisArg: import('.').TypedArray) => Buffer<ArrayBufferLike>)} */
var $typedArrayBuffer = callBound('TypedArray.prototype.buffer', true);

var isTypedArray = require('is-typed-array');

/** @type {import('.')} */
// node <= 0.10, < 0.11.4 has a nonconfigurable own property instead of a prototype getter
module.exports = $typedArrayBuffer || function typedArrayBuffer(x) {
	if (!isTypedArray(x)) {
		throw new $TypeError('Not a Typed Array');
	}
	return x.buffer;
};

},{"call-bound":91,"es-errors/type":185,"is-typed-array":222}],543:[function(require,module,exports){
(function (global){(function (){

/**
 * Module exports.
 */

module.exports = deprecate;

/**
 * Mark that a method should not be used.
 * Returns a modified function which warns once by default.
 *
 * If `localStorage.noDeprecation = true` is set, then it is a no-op.
 *
 * If `localStorage.throwDeprecation = true` is set, then deprecated functions
 * will throw an Error when invoked.
 *
 * If `localStorage.traceDeprecation = true` is set, then deprecated functions
 * will invoke `console.trace()` instead of `console.error()`.
 *
 * @param {Function} fn - the function to deprecate
 * @param {String} msg - the string to print to the console when `fn` is invoked
 * @returns {Function} a new "deprecated" version of `fn`
 * @api public
 */

function deprecate (fn, msg) {
  if (config('noDeprecation')) {
    return fn;
  }

  var warned = false;
  function deprecated() {
    if (!warned) {
      if (config('throwDeprecation')) {
        throw new Error(msg);
      } else if (config('traceDeprecation')) {
        console.trace(msg);
      } else {
        console.warn(msg);
      }
      warned = true;
    }
    return fn.apply(this, arguments);
  }

  return deprecated;
}

/**
 * Checks `localStorage` for boolean values for the given `name`.
 *
 * @param {String} name
 * @returns {Boolean}
 * @api private
 */

function config (name) {
  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
  try {
    if (!global.localStorage) return false;
  } catch (_) {
    return false;
  }
  var val = global.localStorage[name];
  if (null == val) return false;
  return String(val).toLowerCase() === 'true';
}

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],544:[function(require,module,exports){
var indexOf = function (xs, item) {
    if (xs.indexOf) return xs.indexOf(item);
    else for (var i = 0; i < xs.length; i++) {
        if (xs[i] === item) return i;
    }
    return -1;
};
var Object_keys = function (obj) {
    if (Object.keys) return Object.keys(obj)
    else {
        var res = [];
        for (var key in obj) res.push(key)
        return res;
    }
};

var forEach = function (xs, fn) {
    if (xs.forEach) return xs.forEach(fn)
    else for (var i = 0; i < xs.length; i++) {
        fn(xs[i], i, xs);
    }
};

var defineProp = (function() {
    try {
        Object.defineProperty({}, '_', {});
        return function(obj, name, value) {
            Object.defineProperty(obj, name, {
                writable: true,
                enumerable: false,
                configurable: true,
                value: value
            })
        };
    } catch(e) {
        return function(obj, name, value) {
            obj[name] = value;
        };
    }
}());

var globals = ['Array', 'Boolean', 'Date', 'Error', 'EvalError', 'Function',
'Infinity', 'JSON', 'Math', 'NaN', 'Number', 'Object', 'RangeError',
'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError',
'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape',
'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'undefined', 'unescape'];

function Context() {}
Context.prototype = {};

var Script = exports.Script = function NodeScript (code) {
    if (!(this instanceof Script)) return new Script(code);
    this.code = code;
};

Script.prototype.runInContext = function (context) {
    if (!(context instanceof Context)) {
        throw new TypeError("needs a 'context' argument.");
    }
    
    var iframe = document.createElement('iframe');
    if (!iframe.style) iframe.style = {};
    iframe.style.display = 'none';
    
    document.body.appendChild(iframe);
    
    var win = iframe.contentWindow;
    var wEval = win.eval, wExecScript = win.execScript;

    if (!wEval && wExecScript) {
        // win.eval() magically appears when this is called in IE:
        wExecScript.call(win, 'null');
        wEval = win.eval;
    }
    
    forEach(Object_keys(context), function (key) {
        win[key] = context[key];
    });
    forEach(globals, function (key) {
        if (context[key]) {
            win[key] = context[key];
        }
    });
    
    var winKeys = Object_keys(win);

    var res = wEval.call(win, this.code);
    
    forEach(Object_keys(win), function (key) {
        // Avoid copying circular objects like `top` and `window` by only
        // updating existing context properties or new properties in the `win`
        // that was only introduced after the eval.
        if (key in context || indexOf(winKeys, key) === -1) {
            context[key] = win[key];
        }
    });

    forEach(globals, function (key) {
        if (!(key in context)) {
            defineProp(context, key, win[key]);
        }
    });
    
    document.body.removeChild(iframe);
    
    return res;
};

Script.prototype.runInThisContext = function () {
    return eval(this.code); // maybe...
};

Script.prototype.runInNewContext = function (context) {
    var ctx = Script.createContext(context);
    var res = this.runInContext(ctx);

    if (context) {
        forEach(Object_keys(ctx), function (key) {
            context[key] = ctx[key];
        });
    }

    return res;
};

forEach(Object_keys(Script.prototype), function (name) {
    exports[name] = Script[name] = function (code) {
        var s = Script(code);
        return s[name].apply(s, [].slice.call(arguments, 1));
    };
});

exports.isContext = function (context) {
    return context instanceof Context;
};

exports.createScript = function (code) {
    return exports.Script(code);
};

exports.createContext = Script.createContext = function (context) {
    var copy = new Context();
    if(typeof context === 'object') {
        forEach(Object_keys(context), function (key) {
            copy[key] = context[key];
        });
    }
    return copy;
};

},{}],545:[function(require,module,exports){
(function (global){(function (){
'use strict';

var forEach = require('for-each');
var availableTypedArrays = require('available-typed-arrays');
var callBind = require('call-bind');
var callBound = require('call-bound');
var gOPD = require('gopd');
var getProto = require('get-proto');

var $toString = callBound('Object.prototype.toString');
var hasToStringTag = require('has-tostringtag/shams')();

var g = typeof globalThis === 'undefined' ? global : globalThis;
var typedArrays = availableTypedArrays();

var $slice = callBound('String.prototype.slice');

/** @type {<T = unknown>(array: readonly T[], value: unknown) => number} */
var $indexOf = callBound('Array.prototype.indexOf', true) || function indexOf(array, value) {
	for (var i = 0; i < array.length; i += 1) {
		if (array[i] === value) {
			return i;
		}
	}
	return -1;
};

/** @typedef {import('./types').Getter} Getter */
/** @type {import('./types').Cache} */
var cache = { __proto__: null };
if (hasToStringTag && gOPD && getProto) {
	forEach(typedArrays, function (typedArray) {
		var arr = new g[typedArray]();
		if (Symbol.toStringTag in arr && getProto) {
			var proto = getProto(arr);
			// @ts-expect-error TS won't narrow inside a closure
			var descriptor = gOPD(proto, Symbol.toStringTag);
			if (!descriptor && proto) {
				var superProto = getProto(proto);
				// @ts-expect-error TS won't narrow inside a closure
				descriptor = gOPD(superProto, Symbol.toStringTag);
			}
			// @ts-expect-error TODO: fix
			cache['$' + typedArray] = callBind(descriptor.get);
		}
	});
} else {
	forEach(typedArrays, function (typedArray) {
		var arr = new g[typedArray]();
		var fn = arr.slice || arr.set;
		if (fn) {
			cache[
				/** @type {`$${import('.').TypedArrayName}`} */ ('$' + typedArray)
			] = /** @type {import('./types').BoundSlice | import('./types').BoundSet} */ (
				// @ts-expect-error TODO FIXME
				callBind(fn)
			);
		}
	});
}

/** @type {(value: object) => false | import('.').TypedArrayName} */
var tryTypedArrays = function tryAllTypedArrays(value) {
	/** @type {ReturnType<typeof tryAllTypedArrays>} */ var found = false;
	forEach(
		/** @type {Record<`\$${import('.').TypedArrayName}`, Getter>} */ (cache),
		/** @type {(getter: Getter, name: `\$${import('.').TypedArrayName}`) => void} */
		function (getter, typedArray) {
			if (!found) {
				try {
					// @ts-expect-error a throw is fine here
					if ('$' + getter(value) === typedArray) {
						found = /** @type {import('.').TypedArrayName} */ ($slice(typedArray, 1));
					}
				} catch (e) { /**/ }
			}
		}
	);
	return found;
};

/** @type {(value: object) => false | import('.').TypedArrayName} */
var trySlices = function tryAllSlices(value) {
	/** @type {ReturnType<typeof tryAllSlices>} */ var found = false;
	forEach(
		/** @type {Record<`\$${import('.').TypedArrayName}`, Getter>} */(cache),
		/** @type {(getter: Getter, name: `\$${import('.').TypedArrayName}`) => void} */ function (getter, name) {
			if (!found) {
				try {
					// @ts-expect-error a throw is fine here
					getter(value);
					found = /** @type {import('.').TypedArrayName} */ ($slice(name, 1));
				} catch (e) { /**/ }
			}
		}
	);
	return found;
};

/** @type {import('.')} */
module.exports = function whichTypedArray(value) {
	if (!value || typeof value !== 'object') { return false; }
	if (!hasToStringTag) {
		/** @type {string} */
		var tag = $slice($toString(value), 8, -1);
		if ($indexOf(typedArrays, tag) > -1) {
			return tag;
		}
		if (tag !== 'Object') {
			return false;
		}
		// node < 0.6 hits here on real Typed Arrays
		return trySlices(value);
	}
	if (!gOPD) { return null; } // unknown engine
	return tryTypedArrays(value);
};

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"available-typed-arrays":50,"call-bind":90,"call-bound":91,"for-each":190,"get-proto":196,"gopd":198,"has-tostringtag/shams":202}]},{},[20]);
