/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(null, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define("@angular/common/locales/extra/sv", ["require", "exports"], factory);
    }
})(function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    // THIS CODE IS GENERATED - DO NOT MODIFY
    // See angular/tools/gulp-tasks/cldr/extract.js
    var u = undefined;
    exports.default = [
        [
            ['midn.', 'på morg.', 'på förm.', 'på efterm.', 'på kvällen', 'på natten'],
            ['midnatt', 'på morg.', 'på förm.', 'på efterm.', 'på kvällen', 'på natten'],
            ['midnatt', 'på morgonen', 'på förmiddagen', 'på eftermiddagen', 'på kvällen', 'på natten']
        ],
        [
            ['midn.', 'morg.', 'förm.', 'efterm.', 'kväll', 'natt'],
            ['midnatt', 'morgon', 'förm.', 'efterm.', 'kväll', 'natt'],
            ['midnatt', 'morgon', 'förmiddag', 'eftermiddag', 'kväll', 'natt']
        ],
        [
            '00:00', ['05:00', '10:00'], ['10:00', '12:00'], ['12:00', '18:00'], ['18:00', '24:00'],
            ['00:00', '05:00']
        ]
    ];
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3YuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9leHRyYS9zdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLGtCQUFlO1FBQ2I7WUFDRSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDO1lBQzFFLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUM7WUFDNUUsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxXQUFXLENBQUM7U0FDNUY7UUFDRDtZQUNFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUM7WUFDdkQsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztZQUMxRCxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO1NBQ25FO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO1lBQ3ZGLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztTQUNuQjtLQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgW1xuICAgIFsnbWlkbi4nLCAncMOlIG1vcmcuJywgJ3DDpSBmw7ZybS4nLCAncMOlIGVmdGVybS4nLCAncMOlIGt2w6RsbGVuJywgJ3DDpSBuYXR0ZW4nXSxcbiAgICBbJ21pZG5hdHQnLCAncMOlIG1vcmcuJywgJ3DDpSBmw7ZybS4nLCAncMOlIGVmdGVybS4nLCAncMOlIGt2w6RsbGVuJywgJ3DDpSBuYXR0ZW4nXSxcbiAgICBbJ21pZG5hdHQnLCAncMOlIG1vcmdvbmVuJywgJ3DDpSBmw7ZybWlkZGFnZW4nLCAncMOlIGVmdGVybWlkZGFnZW4nLCAncMOlIGt2w6RsbGVuJywgJ3DDpSBuYXR0ZW4nXVxuICBdLFxuICBbXG4gICAgWydtaWRuLicsICdtb3JnLicsICdmw7ZybS4nLCAnZWZ0ZXJtLicsICdrdsOkbGwnLCAnbmF0dCddLFxuICAgIFsnbWlkbmF0dCcsICdtb3Jnb24nLCAnZsO2cm0uJywgJ2VmdGVybS4nLCAna3bDpGxsJywgJ25hdHQnXSxcbiAgICBbJ21pZG5hdHQnLCAnbW9yZ29uJywgJ2bDtnJtaWRkYWcnLCAnZWZ0ZXJtaWRkYWcnLCAna3bDpGxsJywgJ25hdHQnXVxuICBdLFxuICBbXG4gICAgJzAwOjAwJywgWycwNTowMCcsICcxMDowMCddLCBbJzEwOjAwJywgJzEyOjAwJ10sIFsnMTI6MDAnLCAnMTg6MDAnXSwgWycxODowMCcsICcyNDowMCddLFxuICAgIFsnMDA6MDAnLCAnMDU6MDAnXVxuICBdXG5dO1xuIl19