{{#models}}{{#model}}
    {{#emitJSDoc}}
        /**
        * The {{classname}} model module.
        * @module {{#invokerPackage}}{{invokerPackage}}/{{/invokerPackage}}{{#modelPackage}}{{modelPackage}}/{{/modelPackage}}{{classname}}
        * @version {{projectVersion}}
        */

        /**
        * Constructs a new <code>{{classname}}</code>.{{#description}}
            * {{{description}}}{{/description}}
        * @alias module:{{#invokerPackage}}{{invokerPackage}}/{{/invokerPackage}}{{#modelPackage}}{{modelPackage}}/{{/modelPackage}}{{classname}}
        * @class{{#useInheritance}}{{#parent}}
            * @extends {{#parentModel}}module:{{#invokerPackage}}{{invokerPackage}}/{{/invokerPackage}}{{#modelPackage}}{{modelPackage}}/{{/modelPackage}}{{classname}}{{/parentModel}}{{^parentModel}}{{#_isArray}}Array{{/_isArray}}{{#vendorExtensions.x-isMap}}Object{{/vendorExtensions.x-isMap}}{{/parentModel}}{{/parent}}{{#interfaces}}
            * @implements module:{{#invokerPackage}}{{invokerPackage}}/{{/invokerPackage}}{{#modelPackage}}{{modelPackage}}/{{/modelPackage}}{{.}}{{/interfaces}}{{/useInheritance}}{{#_allRequired}}
            * @param {{name}} {{=< >=}}{<&_jsDocType>}<={{ }}=> {{#description}}{{{description}}}{{/description}}{{/_allRequired}}
        */
    {{/emitJSDoc}}
export default class {{classname}} {
    constructor({{#_allRequired}}{{name}}{{^-last}}, {{/-last}}{{/_allRequired}}) {
    {{#parent}}{{^parentModel}}{{#_isArray}}
    {{/_isArray}}{{/parentModel}}{{/parent}}{{#useInheritance}}{{#parentModel}}
        super({{#_allRequired}}, {{name}}{{/_allRequired}});
    {{/parentModel}}
    {{#interfaceModels}}    {{classname}}.call(_this{{#_allRequired}}, {{name}}{{/_allRequired}});
    {{/interfaceModels}}{{/useInheritance}}{{#vars}}
        {{#required}}    this['{{baseName}}'] = {{name}};{{/required}}
    {{/vars}}{{#parent}}{{^parentModel}}
    {{/parentModel}}{{/parent}}
    };

    {{#emitJSDoc}}
        /**
        * Constructs a <code>{{classname}}</code> from a plain JavaScript object, optionally creating a new instance.
        * Copies all relevant properties from <code>data</code> to
        <code>obj</code> if supplied or a new instance if not.
        * @param {Object} data The plain JavaScript object bearing properties of interest.
        * @param {{=< >=}}{module:
        <#invokerPackage>
            <invokerPackage>/</invokerPackage>
        <#modelPackage>
            <modelPackage>/</modelPackage>
        <classname>}<={{ }}=> obj Optional instance to populate.
            * @return {{=< >=}}{module:
        <#invokerPackage>
            <invokerPackage>/</invokerPackage>
        <#modelPackage>
            <modelPackage>/</modelPackage>
        <classname>}<={{ }}=> The populated <code>{{classname}}</code> instance.
            */
    {{/emitJSDoc}}
        static constructFromObject(data, obj) {
        if (data){{! TODO: support polymorphism: discriminator property on data determines class to instantiate.}} {
        obj = obj || new {{classname}}();
    {{#parent}}{{^parentModel}}      ApiClient.constructFromObject(data, obj, {{_itemType}});
    {{/parentModel}}{{/parent}}{{#useInheritance}}{{#parentModel}}
            {{classname}}.constructFromObject(data, obj);{{/parentModel}}
    {{#interfaces}}      {{.}}.constructFromObject(data, obj);
    {{/interfaces}}{{/useInheritance}}{{#vars}}      if (data.hasOwnProperty('{{baseName}}')) {
                obj['{{baseName}}']{{{defaultValueWithParam}}}
            }
    {{/vars}}    }
            return obj;
        }
    {{#vars}}
        {{#defaultValue}}
        {{#emitJSDoc}}
                /**{{#description}}
                    * {{{description}}}{{/description}}
                * @member {{=< >=}}{<&_jsDocType>}<={{ }}=> {{baseName}}{{#defaultValue}}
                    * @default {{{defaultValue}}}{{/defaultValue}}
                */
        {{/emitJSDoc}}

                ['{{baseName}}'] = {{defaultValue}}
            {{/defaultValue}}
    {{/vars}}
        {{#useInheritance}}{{#interfaceModels}}
            // Implement {{classname}} interface:{{#allVars}}
            {{#emitJSDoc}}
                    /**{{#description}}
                        * {{{description}}}{{/description}}
                    * @member {{=< >=}}{<&_jsDocType>}<={{ }}=> {{baseName}}{{#defaultValue}}
                        * @default {{{defaultValue}}}{{/defaultValue}}
                    */
            {{/emitJSDoc}}
                ['{{baseName}}'] = {{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}undefined{{/defaultValue}};
        {{/allVars}}{{/interfaceModels}}{{/useInheritance}}
    {{#emitModelMethods}}{{#vars}}
        {{#emitJSDoc}}
                /**{{#description}}
                    * Returns {{{description}}}{{/description}}{{#minimum}}
                    * minimum: {{minimum}}{{/minimum}}{{#maximum}}
                    * maximum: {{maximum}}{{/maximum}}
                * @return {{=< >=}}{<&_jsDocType>}<={{ }}=>
                */
        {{/emitJSDoc}}
            {{getter}}(){
                return this['{{baseName}}'];
            }

        {{#emitJSDoc}}
                /**{{#description}}
                    * Sets {{{description}}}{{/description}}
                * @param {{=< >=}}{<&_jsDocType>}<={{ }}=> {{name}}{{#description}} {{{description}}}{{/description}}
                */
        {{/emitJSDoc}}
            {{setter}}({{name}}) {
            this['{{baseName}}'] = {{name}};
            }

    {{/vars}}{{/emitModelMethods}}
    {{#vars}}
        {{#isEnum}}
            {{^isContainer}}
                {{>partial_model_inner_enum}}
            {{/isContainer}}
        {{/isEnum}}
        {{#items.isEnum}}
            {{#items}}
                {{^isContainer}}
                    {{>partial_model_inner_enum}}
                {{/isContainer}}
            {{/items}}
        {{/items.isEnum}}
    {{/vars}}

{{/model}}{{/models}}
}
