html2canvas.js

	/*!	
	 * html2canvas 1.0.0-rc.5 <https://html2canvas.hertzen.com>
	 * Copyright (c) 2019 Niklas von Hertzen <https://hertzen.com>
	 * Released under MIT License
	 */
	/* eslint-disable */
	(function (global, factory) {
	    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
	        typeof define === 'function' && define.amd ? define(factory) :
	            (global = global || self, global.html2canvas = factory());
	}(this, function () {
	    'use strict';
	
	    /*! *****************************************************************************
	    Copyright (c) Microsoft Corporation. All rights reserved.
	    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
	    this file except in compliance with the License. You may obtain a copy of the
	    License at http://www.apache.org/licenses/LICENSE-2.0
	
	    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
	    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
	    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
	    MERCHANTABLITY OR NON-INFRINGEMENT.
	
	    See the Apache Version 2.0 License for specific language governing permissions
	    and limitations under the License.
	    ***************************************************************************** */
	    /* global Reflect, Promise */
	
	    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 (b.hasOwnProperty(p)) d[p] = b[p]; };
	        return extendStatics(d, b);
	    };
	
	    function __extends(d, b) {
	        extendStatics(d, b);
	        function __() { this.constructor = d; }
	        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
	    }
	
	    var __assign = function () {
	        __assign = Object.assign || function __assign(t) {
	            for (var s, i = 1, n = arguments.length; i < n; i++) {
	                s = arguments[i];
	                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
	            }
	            return t;
	        };
	        return __assign.apply(this, arguments);
	    };
	
	    function __awaiter(thisArg, _arguments, P, generator) {
	        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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
	            step((generator = generator.apply(thisArg, _arguments || [])).next());
	        });
	    }
	
	    function __generator(thisArg, body) {
	        try {
	            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);
	        }
	        catch (err) {
	        }
	
	        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 Bounds = /** @class */ (function () {
	        function Bounds(x, y, w, h) {
	            this.left = x;
	            this.top = y;
	            this.width = w;
	            this.height = h;
	        }
	        Bounds.prototype.add = function (x, y, w, h) {
	            return new Bounds(this.left + x, this.top + y, this.width + w, this.height + h);
	        };
	        Bounds.fromClientRect = function (clientRect) {
	            return new Bounds(clientRect.left, clientRect.top, clientRect.width, clientRect.height);
	        };
	        return Bounds;
	    }());
	    var parseBounds = function (node) {
	        return Bounds.fromClientRect(node.getBoundingClientRect());
	    };
	    var parseDocumentSize = function (document) {
	        var body = document.body;
	        var documentElement = document.documentElement;
	        if (!body || !documentElement) {
	            throw new Error("Unable to get document size");
	        }
	        var width = Math.max(Math.max(body.scrollWidth, documentElement.scrollWidth), Math.max(body.offsetWidth, documentElement.offsetWidth), Math.max(body.clientWidth, documentElement.clientWidth));
	        var height = Math.max(Math.max(body.scrollHeight, documentElement.scrollHeight), Math.max(body.offsetHeight, documentElement.offsetHeight), Math.max(body.clientHeight, documentElement.clientHeight));
	        return new Bounds(0, 0, width, height);
	    };
	
	    /*
	     * css-line-break 1.1.1 <https://github.com/niklasvh/css-line-break#readme>
	     * Copyright (c) 2019 Niklas von Hertzen <https://hertzen.com>
	     * Released under MIT License
	     */
	    var toCodePoints = function (str) {
	        var codePoints = [];
	        var i = 0;
	        var length = str.length;
	        while (i < length) {
	            var value = str.charCodeAt(i++);
	            if (value >= 0xd800 && value <= 0xdbff && i < length) {
	                var extra = str.charCodeAt(i++);
	                if ((extra & 0xfc00) === 0xdc00) {
	                    codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);
	                }
	                else {
	                    codePoints.push(value);
	                    i--;
	                }
	            }
	            else {
	                codePoints.push(value);
	            }
	        }
	        return codePoints;
	    };
	    var fromCodePoint = function () {
	        var codePoints = [];
	        for (var _i = 0; _i < arguments.length; _i++) {
	            codePoints[_i] = arguments[_i];
	        }
	        if (String.fromCodePoint) {
	            return String.fromCodePoint.apply(String, codePoints);
	        }
	        var length = codePoints.length;
	        if (!length) {
	            return '';
	        }
	        var codeUnits = [];
	        var index = -1;
	        var result = '';
	        while (++index < length) {
	            var codePoint = codePoints[index];
	            if (codePoint <= 0xffff) {
	                codeUnits.push(codePoint);
	            }
	            else {
	                codePoint -= 0x10000;
	                codeUnits.push((codePoint >> 10) + 0xd800, codePoint % 0x400 + 0xdc00);
	            }
	            if (index + 1 === length || codeUnits.length > 0x4000) {
	                result += String.fromCharCode.apply(String, codeUnits);
	                codeUnits.length = 0;
	            }
	        }
	        return result;
	    };
	    var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
	    // Use a lookup table to find the index.
	    var lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);
	    for (var i = 0; i < chars.length; i++) {
	        lookup[chars.charCodeAt(i)] = i;
	    }
	    var decode = function (base64) {
	        var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;
	        if (base64[base64.length - 1] === '=') {
	            bufferLength--;
	            if (base64[base64.length - 2] === '=') {
	                bufferLength--;
	            }
	        }
	        var buffer = typeof ArrayBuffer !== 'undefined' &&
	            typeof Uint8Array !== 'undefined' &&
	            typeof Uint8Array.prototype.slice !== 'undefined'
	            ? new ArrayBuffer(bufferLength)
	            : new Array(bufferLength);
	        var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer);
	        for (i = 0; i < len; i += 4) {
	            encoded1 = lookup[base64.charCodeAt(i)];
	            encoded2 = lookup[base64.charCodeAt(i + 1)];
	            encoded3 = lookup[base64.charCodeAt(i + 2)];
	            encoded4 = lookup[base64.charCodeAt(i + 3)];
	            bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
	            bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
	            bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
	        }
	        return buffer;
	    };
	    var polyUint16Array = function (buffer) {
	        var length = buffer.length;
	        var bytes = [];
	        for (var i = 0; i < length; i += 2) {
	            bytes.push((buffer[i + 1] << 8) | buffer[i]);
	        }
	        return bytes;
	    };
	    var polyUint32Array = function (buffer) {
	        var length = buffer.length;
	        var bytes = [];
	        for (var i = 0; i < length; i += 4) {
	            bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]);
	        }
	        return bytes;
	    };
	
	    /** Shift size for getting the index-2 table offset. */
	    var UTRIE2_SHIFT_2 = 5;
	    /** Shift size for getting the index-1 table offset. */
	    var UTRIE2_SHIFT_1 = 6 + 5;
	    /**
	     * Shift size for shifting left the index array values.
	     * Increases possible data size with 16-bit index values at the cost
	     * of compactability.
	     * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY.
	     */
	    var UTRIE2_INDEX_SHIFT = 2;
	    /**
	     * Difference between the two shift sizes,
	     * for getting an index-1 offset from an index-2 offset. 6=11-5
	     */
	    var UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2;
	    /**
	     * The part of the index-2 table for U+D800..U+DBFF stores values for
	     * lead surrogate code _units_ not code _points_.
	     * Values for lead surrogate code _points_ are indexed with this portion of the table.
	     * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.)
	     */
	    var UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2;
	    /** Number of entries in a data block. 32=0x20 */
	    var UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2;
	    /** Mask for getting the lower bits for the in-data-block offset. */
	    var UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1;
	    var UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2;
	    /** Count the lengths of both BMP pieces. 2080=0x820 */
	    var UTRIE2_INDEX_2_BMP_LENGTH = UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH;
	    /**
	     * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.
	     * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2.
	     */
	    var UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH;
	    var UTRIE2_UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */
	    /**
	     * The index-1 table, only used for supplementary code points, at offset 2112=0x840.
	     * Variable length, for code points up to highStart, where the last single-value range starts.
	     * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1.
	     * (For 0x100000 supplementary code points U+10000..U+10ffff.)
	     *
	     * The part of the index-2 table for supplementary code points starts
	     * after this index-1 table.
	     *
	     * Both the index-1 table and the following part of the index-2 table
	     * are omitted completely if there is only BMP data.
	     */
	    var UTRIE2_INDEX_1_OFFSET = UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH;
	    /**
	     * Number of index-1 entries for the BMP. 32=0x20
	     * This part of the index-1 table is omitted from the serialized form.
	     */
	    var UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1;
	    /** Number of entries in an index-2 block. 64=0x40 */
	    var UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2;
	    /** Mask for getting the lower bits for the in-index-2-block offset. */
	    var UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1;
	    var slice16 = function (view, start, end) {
	        if (view.slice) {
	            return view.slice(start, end);
	        }
	        return new Uint16Array(Array.prototype.slice.call(view, start, end));
	    };
	    var slice32 = function (view, start, end) {
	        if (view.slice) {
	            return view.slice(start, end);
	        }
	        return new Uint32Array(Array.prototype.slice.call(view, start, end));
	    };
	    var createTrieFromBase64 = function (base64) {
	        var buffer = decode(base64);
	        var view32 = Array.isArray(buffer) ? polyUint32Array(buffer) : new Uint32Array(buffer);
	        var view16 = Array.isArray(buffer) ? polyUint16Array(buffer) : new Uint16Array(buffer);
	        var headerLength = 24;
	        var index = slice16(view16, headerLength / 2, view32[4] / 2);
	        var data = view32[5] === 2
	            ? slice16(view16, (headerLength + view32[4]) / 2)
	            : slice32(view32, Math.ceil((headerLength + view32[4]) / 4));
	        return new Trie(view32[0], view32[1], view32[2], view32[3], index, data);
	    };
	    var Trie = /** @class */ (function () {
	        function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) {
	            this.initialValue = initialValue;
	            this.errorValue = errorValue;
	            this.highStart = highStart;
	            this.highValueIndex = highValueIndex;
	            this.index = index;
	            this.data = data;
	        }
	        /**
	         * Get the value for a code point as stored in the Trie.
	         *
	         * @param codePoint the code point
	         * @return the value
	         */
	        Trie.prototype.get = function (codePoint) {
	            var ix;
	            if (codePoint >= 0) {
	                if (codePoint < 0x0d800 || (codePoint > 0x0dbff && codePoint <= 0x0ffff)) {
	                    // Ordinary BMP code point, excluding leading surrogates.
	                    // BMP uses a single level lookup.  BMP index starts at offset 0 in the Trie2 index.
	                    // 16 bit data is stored in the index array itself.
	                    ix = this.index[codePoint >> UTRIE2_SHIFT_2];
	                    ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);
	                    return this.data[ix];
	                }
	                if (codePoint <= 0xffff) {
	                    // Lead Surrogate Code Point.  A Separate index section is stored for
	                    // lead surrogate code units and code points.
	                    //   The main index has the code unit data.
	                    //   For this function, we need the code point data.
	                    // Note: this expression could be refactored for slightly improved efficiency, but
	                    //       surrogate code points will be so rare in practice that it's not worth it.
	                    ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2)];
	                    ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);
	                    return this.data[ix];
	                }
	                if (codePoint < this.highStart) {
	                    // Supplemental code point, use two-level lookup.
	                    ix = UTRIE2_INDEX_1_OFFSET - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UTRIE2_SHIFT_1);
	                    ix = this.index[ix];
	                    ix += (codePoint >> UTRIE2_SHIFT_2) & UTRIE2_INDEX_2_MASK;
	                    ix = this.index[ix];
	                    ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);
	                    return this.data[ix];
	                }
	                if (codePoint <= 0x10ffff) {
	                    return this.data[this.highValueIndex];
	                }
	            }
	            // Fall through.  The code point is outside of the legal range of 0..0x10ffff.
	            return this.errorValue;
	        };
	        return Trie;
	    }());
	
	    var base64 = 'KwAAAAAAAAAACA4AIDoAAPAfAAACAAAAAAAIABAAGABAAEgAUABYAF4AZgBeAGYAYABoAHAAeABeAGYAfACEAIAAiACQAJgAoACoAK0AtQC9AMUAXgBmAF4AZgBeAGYAzQDVAF4AZgDRANkA3gDmAOwA9AD8AAQBDAEUARoBIgGAAIgAJwEvATcBPwFFAU0BTAFUAVwBZAFsAXMBewGDATAAiwGTAZsBogGkAawBtAG8AcIBygHSAdoB4AHoAfAB+AH+AQYCDgIWAv4BHgImAi4CNgI+AkUCTQJTAlsCYwJrAnECeQKBAk0CiQKRApkCoQKoArACuALAAsQCzAIwANQC3ALkAjAA7AL0AvwCAQMJAxADGAMwACADJgMuAzYDPgOAAEYDSgNSA1IDUgNaA1oDYANiA2IDgACAAGoDgAByA3YDfgOAAIQDgACKA5IDmgOAAIAAogOqA4AAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAK8DtwOAAIAAvwPHA88D1wPfAyAD5wPsA/QD/AOAAIAABAQMBBIEgAAWBB4EJgQuBDMEIAM7BEEEXgBJBCADUQRZBGEEaQQwADAAcQQ+AXkEgQSJBJEEgACYBIAAoASoBK8EtwQwAL8ExQSAAIAAgACAAIAAgACgAM0EXgBeAF4AXgBeAF4AXgBeANUEXgDZBOEEXgDpBPEE+QQBBQkFEQUZBSEFKQUxBTUFPQVFBUwFVAVcBV4AYwVeAGsFcwV7BYMFiwWSBV4AmgWgBacFXgBeAF4AXgBeAKsFXgCyBbEFugW7BcIFwgXIBcIFwgXQBdQF3AXkBesF8wX7BQMGCwYTBhsGIwYrBjMGOwZeAD8GRwZNBl4AVAZbBl4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAGMGXgBqBnEGXgBeAF4AXgBeAF4AXgBeAF4AXgB5BoAG4wSGBo4GkwaAAIADHgR5AF4AXgBeAJsGgABGA4AAowarBrMGswagALsGwwbLBjAA0wbaBtoG3QbaBtoG2gbaBtoG2gblBusG8wb7BgMHCwcTBxsHCwcjBysHMAc1BzUHOgdCB9oGSgdSB1oHYAfaBloHaAfaBlIH2gbaBtoG2gbaBtoG2gbaBjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHbQdeAF4ANQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQd1B30HNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B4MH2gaKB68EgACAAIAAgACAAIAAgACAAI8HlwdeAJ8HpweAAIAArwe3B14AXgC/B8UHygcwANAH2AfgB4AA6AfwBz4B+AcACFwBCAgPCBcIogEYAR8IJwiAAC8INwg/CCADRwhPCFcIXwhnCEoDGgSAAIAAgABvCHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIhAiLCI4IMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAANQc1BzUHNQc1BzUHNQc1BzUHNQc1B54INQc1B6II2gaqCLIIugiAAIAAvgjGCIAAgACAAIAAgACAAIAAgACAAIAAywiHAYAA0wiAANkI3QjlCO0I9Aj8CIAAgACAAAIJCgkSCRoJIgknCTYHLwk3CZYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiAAIAAAAFAAXgBeAGAAcABeAHwAQACQAKAArQC9AJ4AXgBeAE0A3gBRAN4A7AD8AMwBGgEAAKcBNwEFAUwBXAF4QkhCmEKnArcCgAHHAsABz4LAAcABwAHAAd+C6ABoAG+C/4LAAcABwAHAAc+DF4MAAcAB54M3gweDV4Nng3eDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEeDqABVg6WDqABoQ6gAaABoAHXDvcONw/3DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DncPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB7cPPwlGCU4JMACAAIAAgABWCV4JYQmAAGkJcAl4CXwJgAkwADAAMAAwAIgJgACLCZMJgACZCZ8JowmrCYAAswkwAF4AXgB8AIAAuwkABMMJyQmAAM4JgADVCTAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAqwYWBNkIMAAwADAAMADdCeAJ6AnuCR4E9gkwAP4JBQoNCjAAMACAABUK0wiAAB0KJAosCjQKgAAwADwKQwqAAEsKvQmdCVMKWwowADAAgACAALcEMACAAGMKgABrCjAAMAAwADAAMAAwADAAMAAwADAAMAAeBDAAMAAwADAAMAAwADAAMAAwADAAMAAwAIkEPQFzCnoKiQSCCooKkAqJBJgKoAqkCokEGAGsCrQKvArBCjAAMADJCtEKFQHZCuEK/gHpCvEKMAAwADAAMACAAIwE+QowAIAAPwEBCzAAMAAwADAAMACAAAkLEQswAIAAPwEZCyELgAAOCCkLMAAxCzkLMAAwADAAMAAwADAAXgBeAEELMAAwADAAMAAwADAAMAAwAEkLTQtVC4AAXAtkC4AAiQkwADAAMAAwADAAMAAwADAAbAtxC3kLgAuFC4sLMAAwAJMLlwufCzAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAApwswADAAMACAAIAAgACvC4AAgACAAIAAgACAALcLMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAvwuAAMcLgACAAIAAgACAAIAAyguAAIAAgACAAIAA0QswADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAANkLgACAAIAA4AswADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACJCR4E6AswADAAhwHwC4AA+AsADAgMEAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMACAAIAAGAwdDCUMMAAwAC0MNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQw1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHPQwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADUHNQc1BzUHNQc1BzUHNQc2BzAAMAA5DDUHNQc1BzUHNQc1BzUHNQc1BzUHNQdFDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAATQxSDFoMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAF4AXgBeAF4AXgBeAF4AYgxeAGoMXgBxDHkMfwxeAIUMXgBeAI0MMAAwADAAMAAwAF4AXgCVDJ0MMAAwADAAMABeAF4ApQxeAKsMswy7DF4Awgy9DMoMXgBeAF4AXgBeAF4AXgBeAF4AXgDRDNkMeQBqCeAM3Ax8AOYM7Az0DPgMXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgCgAAANoAAHDQ4NFg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAeDSYNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAC4NMABeAF4ANg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAD4NRg1ODVYNXg1mDTAAbQ0wADAAMAAwADAAMAAwADAA2gbaBtoG2gbaBtoG2gbaBnUNeg3CBYANwgWFDdoGjA3aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gaUDZwNpA2oDdoG2gawDbcNvw3HDdoG2gbPDdYN3A3fDeYN2gbsDfMN2gbaBvoN/g3aBgYODg7aBl4AXgBeABYOXgBeACUG2gYeDl4AJA5eACwO2w3aBtoGMQ45DtoG2gbaBtoGQQ7aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B1EO2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQdZDjUHNQc1BzUHNQc1B2EONQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHaA41BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B3AO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B2EO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBkkOeA6gAKAAoAAwADAAMAAwAKAAoACgAKAAoACgAKAAgA4wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAD//wQABAAEAAQABAAEAAQABAAEAA0AAwABAAEAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAKABMAFwAeABsAGgAeABcAFgASAB4AGwAYAA8AGAAcAEsASwBLAEsASwBLAEsASwBLAEsAGAAYAB4AHgAeABMAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAFgAbABIAHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYADQARAB4ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkAFgAaABsAGwAbAB4AHQAdAB4ATwAXAB4ADQAeAB4AGgAbAE8ATwAOAFAAHQAdAB0ATwBPABcATwBPAE8AFgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwArAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAAQABAANAA0ASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAUAArACsAKwArACsAKwArACsABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAGgAaAFAAUABQAFAAUABMAB4AGwBQAB4AKwArACsABAAEAAQAKwBQAFAAUABQAFAAUAArACsAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUAArAFAAUAArACsABAArAAQABAAEAAQABAArACsAKwArAAQABAArACsABAAEAAQAKwArACsABAArACsAKwArACsAKwArAFAAUABQAFAAKwBQACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwAEAAQAUABQAFAABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQAKwArAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeABsAKwArACsAKwArACsAKwBQAAQABAAEAAQABAAEACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAKwArACsAKwArACsAKwArAAQABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwAEAFAAKwBQAFAAUABQAFAAUAArACsAKwBQAFAAUAArAFAAUABQAFAAKwArACsAUABQACsAUAArAFAAUAArACsAKwBQAFAAKwArACsAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQAKwArACsABAAEAAQAKwAEAAQABAAEACsAKwBQACsAKwArACsAKwArAAQAKwArACsAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAB4AHgAeAB4AHgAeABsAHgArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArAFAAUABQACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAB4AUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArACsAKwArACsAKwArAFAAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwArAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAKwBcAFwAKwBcACsAKwBcACsAKwArACsAKwArAFwAXABcAFwAKwBcAFwAXABcAFwAXABcACsAXABcAFwAKwBcACsAXAArACsAXABcACsAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgArACoAKgBcACsAKwBcAFwAXABcAFwAKwBcACsAKgAqACoAKgAqACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAFwAXABcAFwAUAAOAA4ADgAOAB4ADgAOAAkADgAOAA0ACQATABMAEwATABMACQAeABMAHgAeAB4ABAAEAB4AHgAeAB4AHgAeAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUAANAAQAHgAEAB4ABAAWABEAFgARAAQABABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAAQABAAEAAQABAANAAQABABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsADQANAB4AHgAeAB4AHgAeAAQAHgAeAB4AHgAeAB4AKwAeAB4ADgAOAA0ADgAeAB4AHgAeAB4ACQAJACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgAeAB4AHgBcAFwAXABcAFwAXAAqACoAKgAqAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAKgAqACoAKgAqACoAKgBcAFwAXAAqACoAKgAqAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAXAAqAEsASwBLAEsASwBLAEsASwBLAEsAKgAqACoAKgAqACoAUABQAFAAUABQAFAAKwBQACsAKwArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQACsAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwAEAAQABAAeAA0AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAEQArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAADQANAA0AUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAA0ADQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoADQANABUAXAANAB4ADQAbAFwAKgArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAB4AHgATABMADQANAA4AHgATABMAHgAEAAQABAAJACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAUABQAFAAUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwAeACsAKwArABMAEwBLAEsASwBLAEsASwBLAEsASwBLAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwBcAFwAXABcAFwAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcACsAKwArACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwAeAB4AXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsABABLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKgAqACoAKgAqACoAKgBcACoAKgAqACoAKgAqACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAUABQAFAAUABQAFAAUAArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4ADQANAA0ADQAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAHgAeAB4AHgBQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwANAA0ADQANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwBQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsABAAEAAQAHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAABABQAFAAUABQAAQABAAEAFAAUAAEAAQABAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAKwBQACsAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAKwArAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAKwAeAB4AHgAeAB4AHgAeAA4AHgArAA0ADQANAA0ADQANAA0ACQANAA0ADQAIAAQACwAEAAQADQAJAA0ADQAMAB0AHQAeABcAFwAWABcAFwAXABYAFwAdAB0AHgAeABQAFAAUAA0AAQABAAQABAAEAAQABAAJABoAGgAaABoAGgAaABoAGgAeABcAFwAdABUAFQAeAB4AHgAeAB4AHgAYABYAEQAVABUAFQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgANAB4ADQANAA0ADQAeAA0ADQANAAcAHgAeAB4AHgArAAQABAAEAAQABAAEAAQABAAEAAQAUABQACsAKwBPAFAAUABQAFAAUAAeAB4AHgAWABEATwBQAE8ATwBPAE8AUABQAFAAUABQAB4AHgAeABYAEQArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGgAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgBQABoAHgAdAB4AUAAeABoAHgAeAB4AHgAeAB4AHgAeAB4ATwAeAFAAGwAeAB4AUABQAFAAUABQAB4AHgAeAB0AHQAeAFAAHgBQAB4AUAAeAFAATwBQAFAAHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AUABQAFAAUABPAE8AUABQAFAAUABQAE8AUABQAE8AUABPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAE8ATwBPAE8ATwBPAE8ATwBPAE8AUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAATwAeAB4AKwArACsAKwAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB0AHQAeAB4AHgAdAB0AHgAeAB0AHgAeAB4AHQAeAB0AGwAbAB4AHQAeAB4AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB0AHgAdAB4AHQAdAB0AHQAdAB0AHgAdAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAdAB0AHQAdAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAlACUAHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB0AHQAeAB4AHgAeAB0AHQAdAB4AHgAdAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB0AHQAeAB4AHQAeAB4AHgAeAB0AHQAeAB4AHgAeACUAJQAdAB0AJQAeACUAJQAlACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHQAdAB0AHgAdACUAHQAdAB4AHQAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHQAdAB0AHQAlAB4AJQAlACUAHQAlACUAHQAdAB0AJQAlAB0AHQAlAB0AHQAlACUAJQAeAB0AHgAeAB4AHgAdAB0AJQAdAB0AHQAdAB0AHQAlACUAJQAlACUAHQAlACUAIAAlAB0AHQAlACUAJQAlACUAJQAlACUAHgAeAB4AJQAlACAAIAAgACAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeABcAFwAXABcAFwAXAB4AEwATACUAHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACUAJQBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwArACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAE8ATwBPAE8ATwBPAE8ATwAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeACsAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUAArACsAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQBQAFAAUABQACsAKwArACsAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAABAAEAAQAKwAEAAQAKwArACsAKwArAAQABAAEAAQAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsABAAEAAQAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsADQANAA0ADQANAA0ADQANAB4AKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAUABQAFAAUABQAA0ADQANAA0ADQANABQAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwANAA0ADQANAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAeAAQABAAEAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLACsADQArAB4AKwArAAQABAAEAAQAUABQAB4AUAArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwAEAAQABAAEAAQABAAEAAQABAAOAA0ADQATABMAHgAeAB4ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0AUABQAFAAUAAEAAQAKwArAAQADQANAB4AUAArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXABcAA0ADQANACoASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUAArACsAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANACsADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEcARwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwAeAAQABAANAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAEAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUAArACsAUAArACsAUABQACsAKwBQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAeAB4ADQANAA0ADQAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAArAAQABAArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAEAAQABAAEAAQABAAEACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAFgAWAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAKwBQACsAKwArACsAKwArAFAAKwArACsAKwBQACsAUAArAFAAKwBQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQACsAUAArAFAAKwBQACsAUABQACsAUAArACsAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAUABQAFAAUAArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUAArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAlACUAJQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeACUAJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeACUAJQAlACUAJQAeACUAJQAlACUAJQAgACAAIAAlACUAIAAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIQAhACEAIQAhACUAJQAgACAAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAIAAlACUAJQAlACAAJQAgACAAIAAgACAAIAAgACAAIAAlACUAJQAgACUAJQAlACUAIAAgACAAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeACUAHgAlAB4AJQAlACUAJQAlACAAJQAlACUAJQAeACUAHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAIAAgACAAIAAgAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFwAXABcAFQAVABUAHgAeAB4AHgAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAlACAAIAAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsA';
	
	    /* @flow */
	    var LETTER_NUMBER_MODIFIER = 50;
	    // Non-tailorable Line Breaking Classes
	    var BK = 1; //  Cause a line break (after)
	    var CR = 2; //  Cause a line break (after), except between CR and LF
	    var LF = 3; //  Cause a line break (after)
	    var CM = 4; //  Prohibit a line break between the character and the preceding character
	    var NL = 5; //  Cause a line break (after)
	    var WJ = 7; //  Prohibit line breaks before and after
	    var ZW = 8; //  Provide a break opportunity
	    var GL = 9; //  Prohibit line breaks before and after
	    var SP = 10; // Enable indirect line breaks
	    var ZWJ = 11; // Prohibit line breaks within joiner sequences
	    // Break Opportunities
	    var B2 = 12; //  Provide a line break opportunity before and after the character
	    var BA = 13; //  Generally provide a line break opportunity after the character
	    var BB = 14; //  Generally provide a line break opportunity before the character
	    var HY = 15; //  Provide a line break opportunity after the character, except in numeric context
	    var CB = 16; //   Provide a line break opportunity contingent on additional information
	    // Characters Prohibiting Certain Breaks
	    var CL = 17; //  Prohibit line breaks before
	    var CP = 18; //  Prohibit line breaks before
	    var EX = 19; //  Prohibit line breaks before
	    var IN = 20; //  Allow only indirect line breaks between pairs
	    var NS = 21; //  Allow only indirect line breaks before
	    var OP = 22; //  Prohibit line breaks after
	    var QU = 23; //  Act like they are both opening and closing
	    // Numeric Context
	    var IS = 24; //  Prevent breaks after any and before numeric
	    var NU = 25; //  Form numeric expressions for line breaking purposes
	    var PO = 26; //  Do not break following a numeric expression
	    var PR = 27; //  Do not break in front of a numeric expression
	    var SY = 28; //  Prevent a break before; and allow a break after
	    // Other Characters
	    var AI = 29; //  Act like AL when the resolvedEAW is N; otherwise; act as ID
	    var AL = 30; //  Are alphabetic characters or symbols that are used with alphabetic characters
	    var CJ = 31; //  Treat as NS or ID for strict or normal breaking.
	    var EB = 32; //  Do not break from following Emoji Modifier
	    var EM = 33; //  Do not break from preceding Emoji Base
	    var H2 = 34; //  Form Korean syllable blocks
	    var H3 = 35; //  Form Korean syllable blocks
	    var HL = 36; //  Do not break around a following hyphen; otherwise act as Alphabetic
	    var ID = 37; //  Break before or after; except in some numeric context
	    var JL = 38; //  Form Korean syllable blocks
	    var JV = 39; //  Form Korean syllable blocks
	    var JT = 40; //  Form Korean syllable blocks
	    var RI = 41; //  Keep pairs together. For pairs; break before and after other classes
	    var SA = 42; //  Provide a line break opportunity contingent on additional, language-specific context analysis
	    var XX = 43; //  Have as yet unknown line breaking behavior or unassigned code positions
	    var BREAK_MANDATORY = '!';
	    var BREAK_NOT_ALLOWED = '×';
	    var BREAK_ALLOWED = '÷';
	    var UnicodeTrie = createTrieFromBase64(base64);
	    var ALPHABETICS = [AL, HL];
	    var HARD_LINE_BREAKS = [BK, CR, LF, NL];
	    var SPACE = [SP, ZW];
	    var PREFIX_POSTFIX = [PR, PO];
	    var LINE_BREAKS = HARD_LINE_BREAKS.concat(SPACE);
	    var KOREAN_SYLLABLE_BLOCK = [JL, JV, JT, H2, H3];
	    var HYPHEN = [HY, BA];
	    var codePointsToCharacterClasses = function (codePoints, lineBreak) {
	        if (lineBreak === void 0) { lineBreak = 'strict'; }
	        var types = [];
	        var indicies = [];
	        var categories = [];
	        codePoints.forEach(function (codePoint, index) {
	            var classType = UnicodeTrie.get(codePoint);
	            if (classType > LETTER_NUMBER_MODIFIER) {
	                categories.push(true);
	                classType -= LETTER_NUMBER_MODIFIER;
	            }
	            else {
	                categories.push(false);
	            }
	            if (['normal', 'auto', 'loose'].indexOf(lineBreak) !== -1) {
	                // U+2010, – U+2013, 〜 U+301C, ゠ U+30A0
	                if ([0x2010, 0x2013, 0x301c, 0x30a0].indexOf(codePoint) !== -1) {
	                    indicies.push(index);
	                    return types.push(CB);
	                }
	            }
	            if (classType === CM || classType === ZWJ) {
	                // LB10 Treat any remaining combining mark or ZWJ as AL.
	                if (index === 0) {
	                    indicies.push(index);
	                    return types.push(AL);
	                }
	                // LB9 Do not break a combining character sequence; treat it as if it has the line breaking class of
	                // the base character in all of the following rules. Treat ZWJ as if it were CM.
	                var prev = types[index - 1];
	                if (LINE_BREAKS.indexOf(prev) === -1) {
	                    indicies.push(indicies[index - 1]);
	                    return types.push(prev);
	                }
	                indicies.push(index);
	                return types.push(AL);
	            }
	            indicies.push(index);
	            if (classType === CJ) {
	                return types.push(lineBreak === 'strict' ? NS : ID);
	            }
	            if (classType === SA) {
	                return types.push(AL);
	            }
	            if (classType === AI) {
	                return types.push(AL);
	            }
	            // For supplementary characters, a useful default is to treat characters in the range 10000..1FFFD as AL
	            // and characters in the ranges 20000..2FFFD and 30000..3FFFD as ID, until the implementation can be revised
	            // to take into account the actual line breaking properties for these characters.
	            if (classType === XX) {
	                if ((codePoint >= 0x20000 && codePoint <= 0x2fffd) || (codePoint >= 0x30000 && codePoint <= 0x3fffd)) {
	                    return types.push(ID);
	                }
	                else {
	                    return types.push(AL);
	                }
	            }
	            types.push(classType);
	        });
	        return [indicies, types, categories];
	    };
	    var isAdjacentWithSpaceIgnored = function (a, b, currentIndex, classTypes) {
	        var current = classTypes[currentIndex];
	        if (Array.isArray(a) ? a.indexOf(current) !== -1 : a === current) {
	            var i = currentIndex;
	            while (i <= classTypes.length) {
	                i++;
	                var next = classTypes[i];
	                if (next === b) {
	                    return true;
	                }
	                if (next !== SP) {
	                    break;
	                }
	            }
	        }
	        if (current === SP) {
	            var i = currentIndex;
	            while (i > 0) {
	                i--;
	                var prev = classTypes[i];
	                if (Array.isArray(a) ? a.indexOf(prev) !== -1 : a === prev) {
	                    var n = currentIndex;
	                    while (n <= classTypes.length) {
	                        n++;
	                        var next = classTypes[n];
	                        if (next === b) {
	                            return true;
	                        }
	                        if (next !== SP) {
	                            break;
	                        }
	                    }
	                }
	                if (prev !== SP) {
	                    break;
	                }
	            }
	        }
	        return false;
	    };
	    var previousNonSpaceClassType = function (currentIndex, classTypes) {
	        var i = currentIndex;
	        while (i >= 0) {
	            var type = classTypes[i];
	            if (type === SP) {
	                i--;
	            }
	            else {
	                return type;
	            }
	        }
	        return 0;
	    };
	    var _lineBreakAtIndex = function (codePoints, classTypes, indicies, index, forbiddenBreaks) {
	        if (indicies[index] === 0) {
	            return BREAK_NOT_ALLOWED;
	        }
	        var currentIndex = index - 1;
	        if (Array.isArray(forbiddenBreaks) && forbiddenBreaks[currentIndex] === true) {
	            return BREAK_NOT_ALLOWED;
	        }
	        var beforeIndex = currentIndex - 1;
	        var afterIndex = currentIndex + 1;
	        var current = classTypes[currentIndex];
	        // LB4 Always break after hard line breaks.
	        // LB5 Treat CR followed by LF, as well as CR, LF, and NL as hard line breaks.
	        var before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0;
	        var next = classTypes[afterIndex];
	        if (current === CR && next === LF) {
	            return BREAK_NOT_ALLOWED;
	        }
	        if (HARD_LINE_BREAKS.indexOf(current) !== -1) {
	            return BREAK_MANDATORY;
	        }
	        // LB6 Do not break before hard line breaks.
	        if (HARD_LINE_BREAKS.indexOf(next) !== -1) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB7 Do not break before spaces or zero width space.
	        if (SPACE.indexOf(next) !== -1) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB8 Break before any character following a zero-width space, even if one or more spaces intervene.
	        if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) {
	            return BREAK_ALLOWED;
	        }
	        // LB8a Do not break between a zero width joiner and an ideograph, emoji base or emoji modifier.
	        if (UnicodeTrie.get(codePoints[currentIndex]) === ZWJ && (next === ID || next === EB || next === EM)) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB11 Do not break before or after Word joiner and related characters.
	        if (current === WJ || next === WJ) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB12 Do not break after NBSP and related characters.
	        if (current === GL) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB12a Do not break before NBSP and related characters, except after spaces and hyphens.
	        if ([SP, BA, HY].indexOf(current) === -1 && next === GL) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces.
	        if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB14 Do not break after ‘[’, even after spaces.
	        if (previousNonSpaceClassType(currentIndex, classTypes) === OP) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB15 Do not break within ‘”[’, even with intervening spaces.
	        if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with intervening spaces.
	        if (isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes)) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB17 Do not break within ‘——’, even with intervening spaces.
	        if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB18 Break after spaces.
	        if (current === SP) {
	            return BREAK_ALLOWED;
	        }
	        // LB19 Do not break before or after quotation marks, such as ‘ ” ’.
	        if (current === QU || next === QU) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB20 Break before and after unresolved CB.
	        if (next === CB || current === CB) {
	            return BREAK_ALLOWED;
	        }
	        // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small kana, and other non-starters, or after acute accents.
	        if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB21a Don't break after Hebrew + Hyphen.
	        if (before === HL && HYPHEN.indexOf(current) !== -1) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB21b Don’t break between Solidus and Hebrew letters.
	        if (current === SY && next === HL) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB22 Do not break between two ellipses, or between letters, numbers or exclamations and ellipsis.
	        if (next === IN && ALPHABETICS.concat(IN, EX, NU, ID, EB, EM).indexOf(current) !== -1) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB23 Do not break between digits and letters.
	        if ((ALPHABETICS.indexOf(next) !== -1 && current === NU) || (ALPHABETICS.indexOf(current) !== -1 && next === NU)) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB23a Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes.
	        if ((current === PR && [ID, EB, EM].indexOf(next) !== -1) ||
	            ([ID, EB, EM].indexOf(current) !== -1 && next === PO)) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB24 Do not break between numeric prefix/postfix and letters, or between letters and prefix/postfix.
	        if ((ALPHABETICS.indexOf(current) !== -1 && PREFIX_POSTFIX.indexOf(next) !== -1) ||
	            (PREFIX_POSTFIX.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1)) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB25 Do not break between the following pairs of classes relevant to numbers:
	        if (
	            // (PR | PO) × ( OP | HY )? NU
	            ([PR, PO].indexOf(current) !== -1 &&
	                (next === NU || ([OP, HY].indexOf(next) !== -1 && classTypes[afterIndex + 1] === NU))) ||
	            // ( OP | HY ) × NU
	            ([OP, HY].indexOf(current) !== -1 && next === NU) ||
	            // NU ×	(NU | SY | IS)
	            (current === NU && [NU, SY, IS].indexOf(next) !== -1)) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // NU (NU | SY | IS)* × (NU | SY | IS | CL | CP)
	        if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) {
	            var prevIndex = currentIndex;
	            while (prevIndex >= 0) {
	                var type = classTypes[prevIndex];
	                if (type === NU) {
	                    return BREAK_NOT_ALLOWED;
	                }
	                else if ([SY, IS].indexOf(type) !== -1) {
	                    prevIndex--;
	                }
	                else {
	                    break;
	                }
	            }
	        }
	        // NU (NU | SY | IS)* (CL | CP)? × (PO | PR))
	        if ([PR, PO].indexOf(next) !== -1) {
	            var prevIndex = [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex;
	            while (prevIndex >= 0) {
	                var type = classTypes[prevIndex];
	                if (type === NU) {
	                    return BREAK_NOT_ALLOWED;
	                }
	                else if ([SY, IS].indexOf(type) !== -1) {
	                    prevIndex--;
	                }
	                else {
	                    break;
	                }
	            }
	        }
	        // LB26 Do not break a Korean syllable.
	        if ((JL === current && [JL, JV, H2, H3].indexOf(next) !== -1) ||
	            ([JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1) ||
	            ([JT, H3].indexOf(current) !== -1 && next === JT)) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB27 Treat a Korean Syllable Block the same as ID.
	        if ((KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && [IN, PO].indexOf(next) !== -1) ||
	            (KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR)) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB28 Do not break between alphabetics (“at”).
	        if (ALPHABETICS.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”).
	        if (current === IS && ALPHABETICS.indexOf(next) !== -1) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses.
	        if ((ALPHABETICS.concat(NU).indexOf(current) !== -1 && next === OP) ||
	            (ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP)) {
	            return BREAK_NOT_ALLOWED;
	        }
	        // LB30a Break between two regional indicator symbols if and only if there are an even number of regional
	        // indicators preceding the position of the break.
	        if (current === RI && next === RI) {
	            var i = indicies[currentIndex];
	            var count = 1;
	            while (i > 0) {
	                i--;
	                if (classTypes[i] === RI) {
	                    count++;
	                }
	                else {
	                    break;
	                }
	            }
	            if (count % 2 !== 0) {
	                return BREAK_NOT_ALLOWED;
	            }
	        }
	        // LB30b Do not break between an emoji base and an emoji modifier.
	        if (current === EB && next === EM) {
	            return BREAK_NOT_ALLOWED;
	        }
	        return BREAK_ALLOWED;
	    };
	    var cssFormattedClasses = function (codePoints, options) {
	        if (!options) {
	            options = { lineBreak: 'normal', wordBreak: 'normal' };
	        }
	        var _a = codePointsToCharacterClasses(codePoints, options.lineBreak), indicies = _a[0], classTypes = _a[1], isLetterNumber = _a[2];
	        if (options.wordBreak === 'break-all' || options.wordBreak === 'break-word') {
	            classTypes = classTypes.map(function (type) { return ([NU, AL, SA].indexOf(type) !== -1 ? ID : type); });
	        }
	        var forbiddenBreakpoints = options.wordBreak === 'keep-all'
	            ? isLetterNumber.map(function (letterNumber, i) {
	                return letterNumber && codePoints[i] >= 0x4e00 && codePoints[i] <= 0x9fff;
	            })
	            : undefined;
	        return [indicies, classTypes, forbiddenBreakpoints];
	    };
	    var Break = /** @class */ (function () {
	        function Break(codePoints, lineBreak, start, end) {
	            this.codePoints = codePoints;
	            this.required = lineBreak === BREAK_MANDATORY;
	            this.start = start;
	            this.end = end;
	        }
	        Break.prototype.slice = function () {
	            return fromCodePoint.apply(void 0, this.codePoints.slice(this.start, this.end));
	        };
	        return Break;
	    }());
	    var LineBreaker = function (str, options) {
	        var codePoints = toCodePoints(str);
	        var _a = cssFormattedClasses(codePoints, options), indicies = _a[0], classTypes = _a[1], forbiddenBreakpoints = _a[2];
	        var length = codePoints.length;
	        var lastEnd = 0;
	        var nextIndex = 0;
	        return {
	            next: function () {
	                if (nextIndex >= length) {
	                    return { done: true, value: null };
	                }
	                var lineBreak = BREAK_NOT_ALLOWED;
	                while (nextIndex < length &&
	                    (lineBreak = _lineBreakAtIndex(codePoints, classTypes, indicies, ++nextIndex, forbiddenBreakpoints)) ===
	                    BREAK_NOT_ALLOWED) { }
	                if (lineBreak !== BREAK_NOT_ALLOWED || nextIndex === length) {
	                    var value = new Break(codePoints, lineBreak, lastEnd, nextIndex);
	                    lastEnd = nextIndex;
	                    return { value: value, done: false };
	                }
	                return { done: true, value: null };
	            },
	        };
	    };
	
	    // https://www.w3.org/TR/css-syntax-3
	    var TokenType;
	    (function (TokenType) {
	        TokenType[TokenType["STRING_TOKEN"] = 0] = "STRING_TOKEN";
	        TokenType[TokenType["BAD_STRING_TOKEN"] = 1] = "BAD_STRING_TOKEN";
	        TokenType[TokenType["LEFT_PARENTHESIS_TOKEN"] = 2] = "LEFT_PARENTHESIS_TOKEN";
	        TokenType[TokenType["RIGHT_PARENTHESIS_TOKEN"] = 3] = "RIGHT_PARENTHESIS_TOKEN";
	        TokenType[TokenType["COMMA_TOKEN"] = 4] = "COMMA_TOKEN";
	        TokenType[TokenType["HASH_TOKEN"] = 5] = "HASH_TOKEN";
	        TokenType[TokenType["DELIM_TOKEN"] = 6] = "DELIM_TOKEN";
	        TokenType[TokenType["AT_KEYWORD_TOKEN"] = 7] = "AT_KEYWORD_TOKEN";
	        TokenType[TokenType["PREFIX_MATCH_TOKEN"] = 8] = "PREFIX_MATCH_TOKEN";
	        TokenType[TokenType["DASH_MATCH_TOKEN"] = 9] = "DASH_MATCH_TOKEN";
	        TokenType[TokenType["INCLUDE_MATCH_TOKEN"] = 10] = "INCLUDE_MATCH_TOKEN";
	        TokenType[TokenType["LEFT_CURLY_BRACKET_TOKEN"] = 11] = "LEFT_CURLY_BRACKET_TOKEN";
	        TokenType[TokenType["RIGHT_CURLY_BRACKET_TOKEN"] = 12] = "RIGHT_CURLY_BRACKET_TOKEN";
	        TokenType[TokenType["SUFFIX_MATCH_TOKEN"] = 13] = "SUFFIX_MATCH_TOKEN";
	        TokenType[TokenType["SUBSTRING_MATCH_TOKEN"] = 14] = "SUBSTRING_MATCH_TOKEN";
	        TokenType[TokenType["DIMENSION_TOKEN"] = 15] = "DIMENSION_TOKEN";
	        TokenType[TokenType["PERCENTAGE_TOKEN"] = 16] = "PERCENTAGE_TOKEN";
	        TokenType[TokenType["NUMBER_TOKEN"] = 17] = "NUMBER_TOKEN";
	        TokenType[TokenType["FUNCTION"] = 18] = "FUNCTION";
	        TokenType[TokenType["FUNCTION_TOKEN"] = 19] = "FUNCTION_TOKEN";
	        TokenType[TokenType["IDENT_TOKEN"] = 20] = "IDENT_TOKEN";
	        TokenType[TokenType["COLUMN_TOKEN"] = 21] = "COLUMN_TOKEN";
	        TokenType[TokenType["URL_TOKEN"] = 22] = "URL_TOKEN";
	        TokenType[TokenType["BAD_URL_TOKEN"] = 23] = "BAD_URL_TOKEN";
	        TokenType[TokenType["CDC_TOKEN"] = 24] = "CDC_TOKEN";
	        TokenType[TokenType["CDO_TOKEN"] = 25] = "CDO_TOKEN";
	        TokenType[TokenType["COLON_TOKEN"] = 26] = "COLON_TOKEN";
	        TokenType[TokenType["SEMICOLON_TOKEN"] = 27] = "SEMICOLON_TOKEN";
	        TokenType[TokenType["LEFT_SQUARE_BRACKET_TOKEN"] = 28] = "LEFT_SQUARE_BRACKET_TOKEN";
	        TokenType[TokenType["RIGHT_SQUARE_BRACKET_TOKEN"] = 29] = "RIGHT_SQUARE_BRACKET_TOKEN";
	        TokenType[TokenType["UNICODE_RANGE_TOKEN"] = 30] = "UNICODE_RANGE_TOKEN";
	        TokenType[TokenType["WHITESPACE_TOKEN"] = 31] = "WHITESPACE_TOKEN";
	        TokenType[TokenType["EOF_TOKEN"] = 32] = "EOF_TOKEN";
	    })(TokenType || (TokenType = {}));
	    var FLAG_UNRESTRICTED = 1 << 0;
	    var FLAG_ID = 1 << 1;
	    var FLAG_INTEGER = 1 << 2;
	    var FLAG_NUMBER = 1 << 3;
	    var LINE_FEED = 0x000a;
	    var SOLIDUS = 0x002f;
	    var REVERSE_SOLIDUS = 0x005c;
	    var CHARACTER_TABULATION = 0x0009;
	    var SPACE$1 = 0x0020;
	    var QUOTATION_MARK = 0x0022;
	    var EQUALS_SIGN = 0x003d;
	    var NUMBER_SIGN = 0x0023;
	    var DOLLAR_SIGN = 0x0024;
	    var PERCENTAGE_SIGN = 0x0025;
	    var APOSTROPHE = 0x0027;
	    var LEFT_PARENTHESIS = 0x0028;
	    var RIGHT_PARENTHESIS = 0x0029;
	    var LOW_LINE = 0x005f;
	    var HYPHEN_MINUS = 0x002d;
	    var EXCLAMATION_MARK = 0x0021;
	    var LESS_THAN_SIGN = 0x003c;
	    var GREATER_THAN_SIGN = 0x003e;
	    var COMMERCIAL_AT = 0x0040;
	    var LEFT_SQUARE_BRACKET = 0x005b;
	    var RIGHT_SQUARE_BRACKET = 0x005d;
	    var CIRCUMFLEX_ACCENT = 0x003d;
	    var LEFT_CURLY_BRACKET = 0x007b;
	    var QUESTION_MARK = 0x003f;
	    var RIGHT_CURLY_BRACKET = 0x007d;
	    var VERTICAL_LINE = 0x007c;
	    var TILDE = 0x007e;
	    var CONTROL = 0x0080;
	    var REPLACEMENT_CHARACTER = 0xfffd;
	    var ASTERISK = 0x002a;
	    var PLUS_SIGN = 0x002b;
	    var COMMA = 0x002c;
	    var COLON = 0x003a;
	    var SEMICOLON = 0x003b;
	    var FULL_STOP = 0x002e;
	    var NULL = 0x0000;
	    var BACKSPACE = 0x0008;
	    var LINE_TABULATION = 0x000b;
	    var SHIFT_OUT = 0x000e;
	    var INFORMATION_SEPARATOR_ONE = 0x001f;
	    var DELETE = 0x007f;
	    var EOF = -1;
	    var ZERO = 0x0030;
	    var a = 0x0061;
	    var e = 0x0065;
	    var f = 0x0066;
	    var u = 0x0075;
	    var z = 0x007a;
	    var A = 0x0041;
	    var E = 0x0045;
	    var F = 0x0046;
	    var U = 0x0055;
	    var Z = 0x005a;
	    var isDigit = function (codePoint) { return codePoint >= ZERO && codePoint <= 0x0039; };
	    var isSurrogateCodePoint = function (codePoint) { return codePoint >= 0xd800 && codePoint <= 0xdfff; };
	    var isHex = function (codePoint) {
	        return isDigit(codePoint) || (codePoint >= A && codePoint <= F) || (codePoint >= a && codePoint <= f);
	    };
	    var isLowerCaseLetter = function (codePoint) { return codePoint >= a && codePoint <= z; };
	    var isUpperCaseLetter = function (codePoint) { return codePoint >= A && codePoint <= Z; };
	    var isLetter = function (codePoint) { return isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint); };
	    var isNonASCIICodePoint = function (codePoint) { return codePoint >= CONTROL; };
	    var isWhiteSpace = function (codePoint) {
	        return codePoint === LINE_FEED || codePoint === CHARACTER_TABULATION || codePoint === SPACE$1;
	    };
	    var isNameStartCodePoint = function (codePoint) {
	        return isLetter(codePoint) || isNonASCIICodePoint(codePoint) || codePoint === LOW_LINE;
	    };
	    var isNameCodePoint = function (codePoint) {
	        return isNameStartCodePoint(codePoint) || isDigit(codePoint) || codePoint === HYPHEN_MINUS;
	    };
	    var isNonPrintableCodePoint = function (codePoint) {
	        return ((codePoint >= NULL && codePoint <= BACKSPACE) ||
	            codePoint === LINE_TABULATION ||
	            (codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE) ||
	            codePoint === DELETE);
	    };
	    var isValidEscape = function (c1, c2) {
	        if (c1 !== REVERSE_SOLIDUS) {
	            return false;
	        }
	        return c2 !== LINE_FEED;
	    };
	    var isIdentifierStart = function (c1, c2, c3) {
	        if (c1 === HYPHEN_MINUS) {
	            return isNameStartCodePoint(c2) || isValidEscape(c2, c3);
	        }
	        else if (isNameStartCodePoint(c1)) {
	            return true;
	        }
	        else if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) {
	            return true;
	        }
	        return false;
	    };
	    var isNumberStart = function (c1, c2, c3) {
	        if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {
	            if (isDigit(c2)) {
	                return true;
	            }
	            return c2 === FULL_STOP && isDigit(c3);
	        }
	        if (c1 === FULL_STOP) {
	            return isDigit(c2);
	        }
	        return isDigit(c1);
	    };
	    var stringToNumber = function (codePoints) {
	        var c = 0;
	        var sign = 1;
	        if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {
	            if (codePoints[c] === HYPHEN_MINUS) {
	                sign = -1;
	            }
	            c++;
	        }
	        var integers = [];
	        while (isDigit(codePoints[c])) {
	            integers.push(codePoints[c++]);
	        }
	        var int = integers.length ? parseInt(fromCodePoint.apply(void 0, integers), 10) : 0;
	        if (codePoints[c] === FULL_STOP) {
	            c++;
	        }
	        var fraction = [];
	        while (isDigit(codePoints[c])) {
	            fraction.push(codePoints[c++]);
	        }
	        var fracd = fraction.length;
	        var frac = fracd ? parseInt(fromCodePoint.apply(void 0, fraction), 10) : 0;
	        if (codePoints[c] === E || codePoints[c] === e) {
	            c++;
	        }
	        var expsign = 1;
	        if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {
	            if (codePoints[c] === HYPHEN_MINUS) {
	                expsign = -1;
	            }
	            c++;
	        }
	        var exponent = [];
	        while (isDigit(codePoints[c])) {
	            exponent.push(codePoints[c++]);
	        }
	        var exp = exponent.length ? parseInt(fromCodePoint.apply(void 0, exponent), 10) : 0;
	        return sign * (int + frac * Math.pow(10, -fracd)) * Math.pow(10, expsign * exp);
	    };
	    var LEFT_PARENTHESIS_TOKEN = {
	        type: TokenType.LEFT_PARENTHESIS_TOKEN
	    };
	    var RIGHT_PARENTHESIS_TOKEN = {
	        type: TokenType.RIGHT_PARENTHESIS_TOKEN
	    };
	    var COMMA_TOKEN = { type: TokenType.COMMA_TOKEN };
	    var SUFFIX_MATCH_TOKEN = { type: TokenType.SUFFIX_MATCH_TOKEN };
	    var PREFIX_MATCH_TOKEN = { type: TokenType.PREFIX_MATCH_TOKEN };
	    var COLUMN_TOKEN = { type: TokenType.COLUMN_TOKEN };
	    var DASH_MATCH_TOKEN = { type: TokenType.DASH_MATCH_TOKEN };
	    var INCLUDE_MATCH_TOKEN = { type: TokenType.INCLUDE_MATCH_TOKEN };
	    var LEFT_CURLY_BRACKET_TOKEN = {
	        type: TokenType.LEFT_CURLY_BRACKET_TOKEN
	    };
	    var RIGHT_CURLY_BRACKET_TOKEN = {
	        type: TokenType.RIGHT_CURLY_BRACKET_TOKEN
	    };
	    var SUBSTRING_MATCH_TOKEN = { type: TokenType.SUBSTRING_MATCH_TOKEN };
	    var BAD_URL_TOKEN = { type: TokenType.BAD_URL_TOKEN };
	    var BAD_STRING_TOKEN = { type: TokenType.BAD_STRING_TOKEN };
	    var CDO_TOKEN = { type: TokenType.CDO_TOKEN };
	    var CDC_TOKEN = { type: TokenType.CDC_TOKEN };
	    var COLON_TOKEN = { type: TokenType.COLON_TOKEN };
	    var SEMICOLON_TOKEN = { type: TokenType.SEMICOLON_TOKEN };
	    var LEFT_SQUARE_BRACKET_TOKEN = {
	        type: TokenType.LEFT_SQUARE_BRACKET_TOKEN
	    };
	    var RIGHT_SQUARE_BRACKET_TOKEN = {
	        type: TokenType.RIGHT_SQUARE_BRACKET_TOKEN
	    };
	    var WHITESPACE_TOKEN = { type: TokenType.WHITESPACE_TOKEN };
	    var EOF_TOKEN = { type: TokenType.EOF_TOKEN };
	    var Tokenizer = /** @class */ (function () {
	        function Tokenizer() {
	            this._value = [];
	        }
	        Tokenizer.prototype.write = function (chunk) {
	            this._value = this._value.concat(toCodePoints(chunk));
	        };
	        Tokenizer.prototype.read = function () {
	            var tokens = [];
	            var token = this.consumeToken();
	            while (token !== EOF_TOKEN) {
	                tokens.push(token);
	                token = this.consumeToken();
	            }
	            return tokens;
	        };
	        Tokenizer.prototype.consumeToken = function () {
	            var codePoint = this.consumeCodePoint();
	            switch (codePoint) {
	                case QUOTATION_MARK:
	                    return this.consumeStringToken(QUOTATION_MARK);
	                case NUMBER_SIGN:
	                    var c1 = this.peekCodePoint(0);
	                    var c2 = this.peekCodePoint(1);
	                    var c3 = this.peekCodePoint(2);
	                    if (isNameCodePoint(c1) || isValidEscape(c2, c3)) {
	                        var flags = isIdentifierStart(c1, c2, c3) ? FLAG_ID : FLAG_UNRESTRICTED;
	                        var value = this.consumeName();
	                        return { type: TokenType.HASH_TOKEN, value: value, flags: flags };
	                    }
	                    break;
	                case DOLLAR_SIGN:
	                    if (this.peekCodePoint(0) === EQUALS_SIGN) {
	                        this.consumeCodePoint();
	                        return SUFFIX_MATCH_TOKEN;
	                    }
	                    break;
	                case APOSTROPHE:
	                    return this.consumeStringToken(APOSTROPHE);
	                case LEFT_PARENTHESIS:
	                    return LEFT_PARENTHESIS_TOKEN;
	                case RIGHT_PARENTHESIS:
	                    return RIGHT_PARENTHESIS_TOKEN;
	                case ASTERISK:
	                    if (this.peekCodePoint(0) === EQUALS_SIGN) {
	                        this.consumeCodePoint();
	                        return SUBSTRING_MATCH_TOKEN;
	                    }
	                    break;
	                case PLUS_SIGN:
	                    if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {
	                        this.reconsumeCodePoint(codePoint);
	                        return this.consumeNumericToken();
	                    }
	                    break;
	                case COMMA:
	                    return COMMA_TOKEN;
	                case HYPHEN_MINUS:
	                    var e1 = codePoint;
	                    var e2 = this.peekCodePoint(0);
	                    var e3 = this.peekCodePoint(1);
	                    if (isNumberStart(e1, e2, e3)) {
	                        this.reconsumeCodePoint(codePoint);
	                        return this.consumeNumericToken();
	                    }
	                    if (isIdentifierStart(e1, e2, e3)) {
	                        this.reconsumeCodePoint(codePoint);
	                        return this.consumeIdentLikeToken();
	                    }
	                    if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) {
	                        this.consumeCodePoint();
	                        this.consumeCodePoint();
	                        return CDC_TOKEN;
	                    }
	                    break;
	                case FULL_STOP:
	                    if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {
	                        this.reconsumeCodePoint(codePoint);
	                        return this.consumeNumericToken();
	                    }
	                    break;
	                case SOLIDUS:
	                    if (this.peekCodePoint(0) === ASTERISK) {
	                        this.consumeCodePoint();
	                        while (true) {
	                            var c = this.consumeCodePoint();
	                            if (c === ASTERISK) {
	                                c = this.consumeCodePoint();
	                                if (c === SOLIDUS) {
	                                    return this.consumeToken();
	                                }
	                            }
	                            if (c === EOF) {
	                                return this.consumeToken();
	                            }
	                        }
	                    }
	                    break;
	                case COLON:
	                    return COLON_TOKEN;
	                case SEMICOLON:
	                    return SEMICOLON_TOKEN;
	                case LESS_THAN_SIGN:
	                    if (this.peekCodePoint(0) === EXCLAMATION_MARK &&
	                        this.peekCodePoint(1) === HYPHEN_MINUS &&
	                        this.peekCodePoint(2) === HYPHEN_MINUS) {
	                        this.consumeCodePoint();
	                        this.consumeCodePoint();
	                        return CDO_TOKEN;
	                    }
	                    break;
	                case COMMERCIAL_AT:
	                    var a1 = this.peekCodePoint(0);
	                    var a2 = this.peekCodePoint(1);
	                    var a3 = this.peekCodePoint(2);
	                    if (isIdentifierStart(a1, a2, a3)) {
	                        var value = this.consumeName();
	                        return { type: TokenType.AT_KEYWORD_TOKEN, value: value };
	                    }
	                    break;
	                case LEFT_SQUARE_BRACKET:
	                    return LEFT_SQUARE_BRACKET_TOKEN;
	                case REVERSE_SOLIDUS:
	                    if (isValidEscape(codePoint, this.peekCodePoint(0))) {
	                        this.reconsumeCodePoint(codePoint);
	                        return this.consumeIdentLikeToken();
	                    }
	                    break;
	                case RIGHT_SQUARE_BRACKET:
	                    return RIGHT_SQUARE_BRACKET_TOKEN;
	                case CIRCUMFLEX_ACCENT:
	                    if (this.peekCodePoint(0) === EQUALS_SIGN) {
	                        this.consumeCodePoint();
	                        return PREFIX_MATCH_TOKEN;
	                    }
	                    break;
	                case LEFT_CURLY_BRACKET:
	                    return LEFT_CURLY_BRACKET_TOKEN;
	                case RIGHT_CURLY_BRACKET:
	                    return RIGHT_CURLY_BRACKET_TOKEN;
	                case u:
	                case U:
	                    var u1 = this.peekCodePoint(0);
	                    var u2 = this.peekCodePoint(1);
	                    if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) {
	                        this.consumeCodePoint();
	                        this.consumeUnicodeRangeToken();
	                    }
	                    this.reconsumeCodePoint(codePoint);
	                    return this.consumeIdentLikeToken();
	                case VERTICAL_LINE:
	                    if (this.peekCodePoint(0) === EQUALS_SIGN) {
	                        this.consumeCodePoint();
	                        return DASH_MATCH_TOKEN;
	                    }
	                    if (this.peekCodePoint(0) === VERTICAL_LINE) {
	                        this.consumeCodePoint();
	                        return COLUMN_TOKEN;
	                    }
	                    break;
	                case TILDE:
	                    if (this.peekCodePoint(0) === EQUALS_SIGN) {
	                        this.consumeCodePoint();
	                        return INCLUDE_MATCH_TOKEN;
	                    }
	                    break;
	                case EOF:
	                    return EOF_TOKEN;
	            }
	            if (isWhiteSpace(codePoint)) {
	                this.consumeWhiteSpace();
	                return WHITESPACE_TOKEN;
	            }
	            if (isDigit(codePoint)) {
	                this.reconsumeCodePoint(codePoint);
	                return this.consumeNumericToken();
	            }
	            if (isNameStartCodePoint(codePoint)) {
	                this.reconsumeCodePoint(codePoint);
	                return this.consumeIdentLikeToken();
	            }
	            return { type: TokenType.DELIM_TOKEN, value: fromCodePoint(codePoint) };
	        };
	        Tokenizer.prototype.consumeCodePoint = function () {
	            var value = this._value.shift();
	            return typeof value === 'undefined' ? -1 : value;
	        };
	        Tokenizer.prototype.reconsumeCodePoint = function (codePoint) {
	            this._value.unshift(codePoint);
	        };
	        Tokenizer.prototype.peekCodePoint = function (delta) {
	            if (delta >= this._value.length) {
	                return -1;
	            }
	            return this._value[delta];
	        };
	        Tokenizer.prototype.consumeUnicodeRangeToken = function () {
	            var digits = [];
	            var codePoint = this.consumeCodePoint();
	            while (isHex(codePoint) && digits.length < 6) {
	                digits.push(codePoint);
	                codePoint = this.consumeCodePoint();
	            }
	            var questionMarks = false;
	            while (codePoint === QUESTION_MARK && digits.length < 6) {
	                digits.push(codePoint);
	                codePoint = this.consumeCodePoint();
	                questionMarks = true;
	            }
	            if (questionMarks) {
	                var start_1 = parseInt(fromCodePoint.apply(void 0, digits.map(function (digit) { return (digit === QUESTION_MARK ? ZERO : digit); })), 16);
	                var end = parseInt(fromCodePoint.apply(void 0, digits.map(function (digit) { return (digit === QUESTION_MARK ? F : digit); })), 16);
	                return { type: TokenType.UNICODE_RANGE_TOKEN, start: start_1, end: end };
	            }
	            var start = parseInt(fromCodePoint.apply(void 0, digits), 16);
	            if (this.peekCodePoint(0) === HYPHEN_MINUS && isHex(this.peekCodePoint(1))) {
	                this.consumeCodePoint();
	                codePoint = this.consumeCodePoint();
	                var endDigits = [];
	                while (isHex(codePoint) && endDigits.length < 6) {
	                    endDigits.push(codePoint);
	                    codePoint = this.consumeCodePoint();
	                }
	                var end = parseInt(fromCodePoint.apply(void 0, endDigits), 16);
	                return { type: TokenType.UNICODE_RANGE_TOKEN, start: start, end: end };
	            }
	            else {
	                return { type: TokenType.UNICODE_RANGE_TOKEN, start: start, end: start };
	            }
	        };
	        Tokenizer.prototype.consumeIdentLikeToken = function () {
	            var value = this.consumeName();
	            if (value.toLowerCase() === 'url' && this.peekCodePoint(0) === LEFT_PARENTHESIS) {
	                this.consumeCodePoint();
	                return this.consumeUrlToken();
	            }
	            else if (this.peekCodePoint(0) === LEFT_PARENTHESIS) {
	                this.consumeCodePoint();
	                return { type: TokenType.FUNCTION_TOKEN, value: value };
	            }
	            return { type: TokenType.IDENT_TOKEN, value: value };
	        };
	        Tokenizer.prototype.consumeUrlToken = function () {
	            var value = [];
	            this.consumeWhiteSpace();
	            if (this.peekCodePoint(0) === EOF) {
	                return { type: TokenType.URL_TOKEN, value: '' };
	            }
	            var next = this.peekCodePoint(0);
	            if (next === APOSTROPHE || next === QUOTATION_MARK) {
	                var stringToken = this.consumeStringToken(this.consumeCodePoint());
	                if (stringToken.type === TokenType.STRING_TOKEN) {
	                    this.consumeWhiteSpace();
	                    if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {
	                        this.consumeCodePoint();
	                        return { type: TokenType.URL_TOKEN, value: stringToken.value };
	                    }
	                }
	                this.consumeBadUrlRemnants();
	                return BAD_URL_TOKEN;
	            }
	            while (true) {
	                var codePoint = this.consumeCodePoint();
	                if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) {
	                    return { type: TokenType.URL_TOKEN, value: fromCodePoint.apply(void 0, value) };
	                }
	                else if (isWhiteSpace(codePoint)) {
	                    this.consumeWhiteSpace();
	                    if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {
	                        this.consumeCodePoint();
	                        return { type: TokenType.URL_TOKEN, value: fromCodePoint.apply(void 0, value) };
	                    }
	                    this.consumeBadUrlRemnants();
	                    return BAD_URL_TOKEN;
	                }
	                else if (codePoint === QUOTATION_MARK ||
	                    codePoint === APOSTROPHE ||
	                    codePoint === LEFT_PARENTHESIS ||
	                    isNonPrintableCodePoint(codePoint)) {
	                    this.consumeBadUrlRemnants();
	                    return BAD_URL_TOKEN;
	                }
	                else if (codePoint === REVERSE_SOLIDUS) {
	                    if (isValidEscape(codePoint, this.peekCodePoint(0))) {
	                        value.push(this.consumeEscapedCodePoint());
	                    }
	                    else {
	                        this.consumeBadUrlRemnants();
	                        return BAD_URL_TOKEN;
	                    }
	                }
	                else {
	                    value.push(codePoint);
	                }
	            }
	        };
	        Tokenizer.prototype.consumeWhiteSpace = function () {
	            while (isWhiteSpace(this.peekCodePoint(0))) {
	                this.consumeCodePoint();
	            }
	        };
	        Tokenizer.prototype.consumeBadUrlRemnants = function () {
	            while (true) {
	                var codePoint = this.consumeCodePoint();
	                if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) {
	                    return;
	                }
	                if (isValidEscape(codePoint, this.peekCodePoint(0))) {
	                    this.consumeEscapedCodePoint();
	                }
	            }
	        };
	        Tokenizer.prototype.consumeStringSlice = function (count) {
	            var SLICE_STACK_SIZE = 60000;
	            var value = '';
	            while (count > 0) {
	                var amount = Math.min(SLICE_STACK_SIZE, count);
	                value += fromCodePoint.apply(void 0, this._value.splice(0, amount));
	                count -= amount;
	            }
	            this._value.shift();
	            return value;
	        };
	        Tokenizer.prototype.consumeStringToken = function (endingCodePoint) {
	            var value = '';
	            var i = 0;
	            do {
	                var codePoint = this._value[i];
	                if (codePoint === EOF || codePoint === undefined || codePoint === endingCodePoint) {
	                    value += this.consumeStringSlice(i);
	                    return { type: TokenType.STRING_TOKEN, value: value };
	                }
	                if (codePoint === LINE_FEED) {
	                    this._value.splice(0, i);
	                    return BAD_STRING_TOKEN;
	                }
	                if (codePoint === REVERSE_SOLIDUS) {
	                    var next = this._value[i + 1];
	                    if (next !== EOF && next !== undefined) {
	                        if (next === LINE_FEED) {
	                            value += this.consumeStringSlice(i);
	                            i = -1;
	                            this._value.shift();
	                        }
	                        else if (isValidEscape(codePoint, next)) {
	                            value += this.consumeStringSlice(i);
	                            value += fromCodePoint(this.consumeEscapedCodePoint());
	                            i = -1;
	                        }
	                    }
	                }
	                i++;
	            } while (true);
	        };
	        Tokenizer.prototype.consumeNumber = function () {
	            var repr = [];
	            var type = FLAG_INTEGER;
	            var c1 = this.peekCodePoint(0);
	            if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {
	                repr.push(this.consumeCodePoint());
	            }
	            while (isDigit(this.peekCodePoint(0))) {
	                repr.push(this.consumeCodePoint());
	            }
	            c1 = this.peekCodePoint(0);
	            var c2 = this.peekCodePoint(1);
	            if (c1 === FULL_STOP && isDigit(c2)) {
	                repr.push(this.consumeCodePoint(), this.consumeCodePoint());
	                type = FLAG_NUMBER;
	                while (isDigit(this.peekCodePoint(0))) {
	                    repr.push(this.consumeCodePoint());
	                }
	            }
	            c1 = this.peekCodePoint(0);
	            c2 = this.peekCodePoint(1);
	            var c3 = this.peekCodePoint(2);
	            if ((c1 === E || c1 === e) && (((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3)) || isDigit(c2))) {
	                repr.push(this.consumeCodePoint(), this.consumeCodePoint());
	                type = FLAG_NUMBER;
	                while (isDigit(this.peekCodePoint(0))) {
	                    repr.push(this.consumeCodePoint());
	                }
	            }
	            return [stringToNumber(repr), type];
	        };
	        Tokenizer.prototype.consumeNumericToken = function () {
	            var _a = this.consumeNumber(), number = _a[0], flags = _a[1];
	            var c1 = this.peekCodePoint(0);
	            var c2 = this.peekCodePoint(1);
	            var c3 = this.peekCodePoint(2);
	            if (isIdentifierStart(c1, c2, c3)) {
	                var unit = this.consumeName();
	                return { type: TokenType.DIMENSION_TOKEN, number: number, flags: flags, unit: unit };
	            }
	            if (c1 === PERCENTAGE_SIGN) {
	                this.consumeCodePoint();
	                return { type: TokenType.PERCENTAGE_TOKEN, number: number, flags: flags };
	            }
	            return { type: TokenType.NUMBER_TOKEN, number: number, flags: flags };
	        };
	        Tokenizer.prototype.consumeEscapedCodePoint = function () {
	            var codePoint = this.consumeCodePoint();
	            if (isHex(codePoint)) {
	                var hex = fromCodePoint(codePoint);
	                while (isHex(this.peekCodePoint(0)) && hex.length < 6) {
	                    hex += fromCodePoint(this.consumeCodePoint());
	                }
	                if (isWhiteSpace(this.peekCodePoint(0))) {
	                    this.consumeCodePoint();
	                }
	                var hexCodePoint = parseInt(hex, 16);
	                if (hexCodePoint === 0 || isSurrogateCodePoint(hexCodePoint) || hexCodePoint > 0x10ffff) {
	                    return REPLACEMENT_CHARACTER;
	                }
	                return hexCodePoint;
	            }
	            if (codePoint === EOF) {
	                return REPLACEMENT_CHARACTER;
	            }
	            return codePoint;
	        };
	        Tokenizer.prototype.consumeName = function () {
	            var result = '';
	            while (true) {
	                var codePoint = this.consumeCodePoint();
	                if (isNameCodePoint(codePoint)) {
	                    result += fromCodePoint(codePoint);
	                }
	                else if (isValidEscape(codePoint, this.peekCodePoint(0))) {
	                    result += fromCodePoint(this.consumeEscapedCodePoint());
	                }
	                else {
	                    this.reconsumeCodePoint(codePoint);
	                    return result;
	                }
	            }
	        };
	        return Tokenizer;
	    }());
	
	    var Parser = /** @class */ (function () {
	        function Parser(tokens) {
	            this._tokens = tokens;
	        }
	        Parser.create = function (value) {
	            var tokenizer = new Tokenizer();
	            tokenizer.write(value);
	            return new Parser(tokenizer.read());
	        };
	        Parser.parseValue = function (value) {
	            return Parser.create(value).parseComponentValue();
	        };
	        Parser.parseValues = function (value) {
	            return Parser.create(value).parseComponentValues();
	        };
	        Parser.prototype.parseComponentValue = function () {
	            var token = this.consumeToken();
	            while (token.type === TokenType.WHITESPACE_TOKEN) {
	                token = this.consumeToken();
	            }
	            if (token.type === TokenType.EOF_TOKEN) {
	                throw new SyntaxError("Error parsing CSS component value, unexpected EOF");
	            }
	            this.reconsumeToken(token);
	            var value = this.consumeComponentValue();
	            do {
	                token = this.consumeToken();
	            } while (token.type === TokenType.WHITESPACE_TOKEN);
	            if (token.type === TokenType.EOF_TOKEN) {
	                return value;
	            }
	            throw new SyntaxError("Error parsing CSS component value, multiple values found when expecting only one");
	        };
	        Parser.prototype.parseComponentValues = function () {
	            var values = [];
	            while (true) {
	                var value = this.consumeComponentValue();
	                if (value.type === TokenType.EOF_TOKEN) {
	                    return values;
	                }
	                values.push(value);
	                values.push();
	            }
	        };
	        Parser.prototype.consumeComponentValue = function () {
	            var token = this.consumeToken();
	            switch (token.type) {
	                case TokenType.LEFT_CURLY_BRACKET_TOKEN:
	                case TokenType.LEFT_SQUARE_BRACKET_TOKEN:
	                case TokenType.LEFT_PARENTHESIS_TOKEN:
	                    return this.consumeSimpleBlock(token.type);
	                case TokenType.FUNCTION_TOKEN:
	                    return this.consumeFunction(token);
	            }
	            return token;
	        };
	        Parser.prototype.consumeSimpleBlock = function (type) {
	            var block = { type: type, values: [] };
	            var token = this.consumeToken();
	            while (true) {
	                if (token.type === TokenType.EOF_TOKEN || isEndingTokenFor(token, type)) {
	                    return block;
	                }
	                this.reconsumeToken(token);
	                block.values.push(this.consumeComponentValue());
	                token = this.consumeToken();
	            }
	        };
	        Parser.prototype.consumeFunction = function (functionToken) {
	            var cssFunction = {
	                name: functionToken.value,
	                values: [],
	                type: TokenType.FUNCTION
	            };
	            while (true) {
	                var token = this.consumeToken();
	                if (token.type === TokenType.EOF_TOKEN || token.type === TokenType.RIGHT_PARENTHESIS_TOKEN) {
	                    return cssFunction;
	                }
	                this.reconsumeToken(token);
	                cssFunction.values.push(this.consumeComponentValue());
	            }
	        };
	        Parser.prototype.consumeToken = function () {
	            var token = this._tokens.shift();
	            return typeof token === 'undefined' ? EOF_TOKEN : token;
	        };
	        Parser.prototype.reconsumeToken = function (token) {
	            this._tokens.unshift(token);
	        };
	        return Parser;
	    }());
	    var isDimensionToken = function (token) { return token.type === TokenType.DIMENSION_TOKEN; };
	    var isNumberToken = function (token) { return token.type === TokenType.NUMBER_TOKEN; };
	    var isIdentToken = function (token) { return token.type === TokenType.IDENT_TOKEN; };
	    var isStringToken = function (token) { return token.type === TokenType.STRING_TOKEN; };
	    var isIdentWithValue = function (token, value) {
	        return isIdentToken(token) && token.value === value;
	    };
	    var nonWhiteSpace = function (token) { return token.type !== TokenType.WHITESPACE_TOKEN; };
	    var nonFunctionArgSeparator = function (token) {
	        return token.type !== TokenType.WHITESPACE_TOKEN && token.type !== TokenType.COMMA_TOKEN;
	    };
	    var parseFunctionArgs = function (tokens) {
	        var args = [];
	        var arg = [];
	        tokens.forEach(function (token) {
	            if (token.type === TokenType.COMMA_TOKEN) {
	                if (arg.length === 0) {
	                    throw new Error("Error parsing function args, zero tokens for arg");
	                }
	                args.push(arg);
	                arg = [];
	                return;
	            }
	            if (token.type !== TokenType.WHITESPACE_TOKEN) {
	                arg.push(token);
	            }
	        });
	        if (arg.length) {
	            args.push(arg);
	        }
	        return args;
	    };
	    var isEndingTokenFor = function (token, type) {
	        if (type === TokenType.LEFT_CURLY_BRACKET_TOKEN && token.type === TokenType.RIGHT_CURLY_BRACKET_TOKEN) {
	            return true;
	        }
	        if (type === TokenType.LEFT_SQUARE_BRACKET_TOKEN && token.type === TokenType.RIGHT_SQUARE_BRACKET_TOKEN) {
	            return true;
	        }
	        return type === TokenType.LEFT_PARENTHESIS_TOKEN && token.type === TokenType.RIGHT_PARENTHESIS_TOKEN;
	    };
	
	    var isLength = function (token) {
	        return token.type === TokenType.NUMBER_TOKEN || token.type === TokenType.DIMENSION_TOKEN;
	    };
	
	    var isLengthPercentage = function (token) {
	        return token.type === TokenType.PERCENTAGE_TOKEN || isLength(token);
	    };
	    var parseLengthPercentageTuple = function (tokens) {
	        return tokens.length > 1 ? [tokens[0], tokens[1]] : [tokens[0]];
	    };
	    var ZERO_LENGTH = {
	        type: TokenType.NUMBER_TOKEN,
	        number: 0,
	        flags: FLAG_INTEGER
	    };
	    var FIFTY_PERCENT = {
	        type: TokenType.PERCENTAGE_TOKEN,
	        number: 50,
	        flags: FLAG_INTEGER
	    };
	    var HUNDRED_PERCENT = {
	        type: TokenType.PERCENTAGE_TOKEN,
	        number: 100,
	        flags: FLAG_INTEGER
	    };
	    var getAbsoluteValueForTuple = function (tuple, width, height) {
	        var x = tuple[0], y = tuple[1];
	        return [getAbsoluteValue(x, width), getAbsoluteValue(typeof y !== 'undefined' ? y : x, height)];
	    };
	    var getAbsoluteValue = function (token, parent) {
	        if (token.type === TokenType.PERCENTAGE_TOKEN) {
	            return (token.number / 100) * parent;
	        }
	        if (isDimensionToken(token)) {
	            switch (token.unit) {
	                case 'rem':
	                case 'em':
	                    return 16 * token.number; // TODO use correct font-size
	                case 'px':
	                default:
	                    return token.number;
	            }
	        }
	        return token.number;
	    };
	
	    var DEG = 'deg';
	    var GRAD = 'grad';
	    var RAD = 'rad';
	    var TURN = 'turn';
	    var angle = {
	        name: 'angle',
	        parse: function (value) {
	            if (value.type === TokenType.DIMENSION_TOKEN) {
	                switch (value.unit) {
	                    case DEG:
	                        return (Math.PI * value.number) / 180;
	                    case GRAD:
	                        return (Math.PI / 200) * value.number;
	                    case RAD:
	                        return value.number;
	                    case TURN:
	                        return Math.PI * 2 * value.number;
	                }
	            }
	            throw new Error("Unsupported angle type");
	        }
	    };
	    var isAngle = function (value) {
	        if (value.type === TokenType.DIMENSION_TOKEN) {
	            if (value.unit === DEG || value.unit === GRAD || value.unit === RAD || value.unit === TURN) {
	                return true;
	            }
	        }
	        return false;
	    };
	    var parseNamedSide = function (tokens) {
	        var sideOrCorner = tokens
	            .filter(isIdentToken)
	            .map(function (ident) { return ident.value; })
	            .join(' ');
	        switch (sideOrCorner) {
	            case 'to bottom right':
	            case 'to right bottom':
	            case 'left top':
	            case 'top left':
	                return [ZERO_LENGTH, ZERO_LENGTH];
	            case 'to top':
	            case 'bottom':
	                return deg(0);
	            case 'to bottom left':
	            case 'to left bottom':
	            case 'right top':
	            case 'top right':
	                return [ZERO_LENGTH, HUNDRED_PERCENT];
	            case 'to right':
	            case 'left':
	                return deg(90);
	            case 'to top left':
	            case 'to left top':
	            case 'right bottom':
	            case 'bottom right':
	                return [HUNDRED_PERCENT, HUNDRED_PERCENT];
	            case 'to bottom':
	            case 'top':
	                return deg(180);
	            case 'to top right':
	            case 'to right top':
	            case 'left bottom':
	            case 'bottom left':
	                return [HUNDRED_PERCENT, ZERO_LENGTH];
	            case 'to left':
	            case 'right':
	                return deg(270);
	        }
	        return 0;
	    };
	    var deg = function (deg) { return (Math.PI * deg) / 180; };
	
	    var color = {
	        name: 'color',
	        parse: function (value) {
	            if (value.type === TokenType.FUNCTION) {
	                var colorFunction = SUPPORTED_COLOR_FUNCTIONS[value.name];
	                if (typeof colorFunction === 'undefined') {
	                    throw new Error("Attempting to parse an unsupported color function \"" + value.name + "\"");
	                }
	                return colorFunction(value.values);
	            }
	            if (value.type === TokenType.HASH_TOKEN) {
	                if (value.value.length === 3) {
	                    var r = value.value.substring(0, 1);
	                    var g = value.value.substring(1, 2);
	                    var b = value.value.substring(2, 3);
	                    return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), 1);
	                }
	                if (value.value.length === 4) {
	                    var r = value.value.substring(0, 1);
	                    var g = value.value.substring(1, 2);
	                    var b = value.value.substring(2, 3);
	                    var a = value.value.substring(3, 4);
	                    return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), parseInt(a + a, 16) / 255);
	                }
	                if (value.value.length === 6) {
	                    var r = value.value.substring(0, 2);
	                    var g = value.value.substring(2, 4);
	                    var b = value.value.substring(4, 6);
	                    return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), 1);
	                }
	                if (value.value.length === 8) {
	                    var r = value.value.substring(0, 2);
	                    var g = value.value.substring(2, 4);
	                    var b = value.value.substring(4, 6);
	                    var a = value.value.substring(6, 8);
	                    return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), parseInt(a, 16) / 255);
	                }
	            }
	            if (value.type === TokenType.IDENT_TOKEN) {
	                var namedColor = COLORS[value.value.toUpperCase()];
	                if (typeof namedColor !== 'undefined') {
	                    return namedColor;
	                }
	            }
	            return COLORS.TRANSPARENT;
	        }
	    };
	    var isTransparent = function (color) { return (0xff & color) === 0; };
	    var asString = function (color) {
	        var alpha = 0xff & color;
	        var blue = 0xff & (color >> 8);
	        var green = 0xff & (color >> 16);
	        var red = 0xff & (color >> 24);
	        return alpha < 255 ? "rgba(" + red + "," + green + "," + blue + "," + alpha / 255 + ")" : "rgb(" + red + "," + green + "," + blue + ")";
	    };
	    var pack = function (r, g, b, a) {
	        return ((r << 24) | (g << 16) | (b << 8) | (Math.round(a * 255) << 0)) >>> 0;
	    };
	    var getTokenColorValue = function (token, i) {
	        if (token.type === TokenType.NUMBER_TOKEN) {
	            return token.number;
	        }
	        if (token.type === TokenType.PERCENTAGE_TOKEN) {
	            var max = i === 3 ? 1 : 255;
	            return i === 3 ? (token.number / 100) * max : Math.round((token.number / 100) * max);
	        }
	        return 0;
	    };
	    var rgb = function (args) {
	        var tokens = args.filter(nonFunctionArgSeparator);
	        if (tokens.length === 3) {
	            var _a = tokens.map(getTokenColorValue), r = _a[0], g = _a[1], b = _a[2];
	            return pack(r, g, b, 1);
	        }
	        if (tokens.length === 4) {
	            var _b = tokens.map(getTokenColorValue), r = _b[0], g = _b[1], b = _b[2], a = _b[3];
	            return pack(r, g, b, a);
	        }
	        return 0;
	    };
	    function hue2rgb(t1, t2, hue) {
	        if (hue < 0) {
	            hue += 1;
	        }
	        if (hue >= 1) {
	            hue -= 1;
	        }
	        if (hue < 1 / 6) {
	            return (t2 - t1) * hue * 6 + t1;
	        }
	        else if (hue < 1 / 2) {
	            return t2;
	        }
	        else if (hue < 2 / 3) {
	            return (t2 - t1) * 6 * (2 / 3 - hue) + t1;
	        }
	        else {
	            return t1;
	        }
	    }
	    var hsl = function (args) {
	        var tokens = args.filter(nonFunctionArgSeparator);
	        var hue = tokens[0], saturation = tokens[1], lightness = tokens[2], alpha = tokens[3];
	        var h = (hue.type === TokenType.NUMBER_TOKEN ? deg(hue.number) : angle.parse(hue)) / (Math.PI * 2);
	        var s = isLengthPercentage(saturation) ? saturation.number / 100 : 0;
	        var l = isLengthPercentage(lightness) ? lightness.number / 100 : 0;
	        var a = typeof alpha !== 'undefined' && isLengthPercentage(alpha) ? getAbsoluteValue(alpha, 1) : 1;
	        if (s === 0) {
	            return pack(l * 255, l * 255, l * 255, 1);
	        }
	        var t2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
	        var t1 = l * 2 - t2;
	        var r = hue2rgb(t1, t2, h + 1 / 3);
	        var g = hue2rgb(t1, t2, h);
	        var b = hue2rgb(t1, t2, h - 1 / 3);
	        return pack(r * 255, g * 255, b * 255, a);
	    };
	    var SUPPORTED_COLOR_FUNCTIONS = {
	        hsl: hsl,
	        hsla: hsl,
	        rgb: rgb,
	        rgba: rgb
	    };
	    var COLORS = {
	        ALICEBLUE: 0xf0f8ffff,
	        ANTIQUEWHITE: 0xfaebd7ff,
	        AQUA: 0x00ffffff,
	        AQUAMARINE: 0x7fffd4ff,
	        AZURE: 0xf0ffffff,
	        BEIGE: 0xf5f5dcff,
	        BISQUE: 0xffe4c4ff,
	        BLACK: 0x000000ff,
	        BLANCHEDALMOND: 0xffebcdff,
	        BLUE: 0x0000ffff,
	        BLUEVIOLET: 0x8a2be2ff,
	        BROWN: 0xa52a2aff,
	        BURLYWOOD: 0xdeb887ff,
	        CADETBLUE: 0x5f9ea0ff,
	        CHARTREUSE: 0x7fff00ff,
	        CHOCOLATE: 0xd2691eff,
	        CORAL: 0xff7f50ff,
	        CORNFLOWERBLUE: 0x6495edff,
	        CORNSILK: 0xfff8dcff,
	        CRIMSON: 0xdc143cff,
	        CYAN: 0x00ffffff,
	        DARKBLUE: 0x00008bff,
	        DARKCYAN: 0x008b8bff,
	        DARKGOLDENROD: 0xb886bbff,
	        DARKGRAY: 0xa9a9a9ff,
	        DARKGREEN: 0x006400ff,
	        DARKGREY: 0xa9a9a9ff,
	        DARKKHAKI: 0xbdb76bff,
	        DARKMAGENTA: 0x8b008bff,
	        DARKOLIVEGREEN: 0x556b2fff,
	        DARKORANGE: 0xff8c00ff,
	        DARKORCHID: 0x9932ccff,
	        DARKRED: 0x8b0000ff,
	        DARKSALMON: 0xe9967aff,
	        DARKSEAGREEN: 0x8fbc8fff,
	        DARKSLATEBLUE: 0x483d8bff,
	        DARKSLATEGRAY: 0x2f4f4fff,
	        DARKSLATEGREY: 0x2f4f4fff,
	        DARKTURQUOISE: 0x00ced1ff,
	        DARKVIOLET: 0x9400d3ff,
	        DEEPPINK: 0xff1493ff,
	        DEEPSKYBLUE: 0x00bfffff,
	        DIMGRAY: 0x696969ff,
	        DIMGREY: 0x696969ff,
	        DODGERBLUE: 0x1e90ffff,
	        FIREBRICK: 0xb22222ff,
	        FLORALWHITE: 0xfffaf0ff,
	        FORESTGREEN: 0x228b22ff,
	        FUCHSIA: 0xff00ffff,
	        GAINSBORO: 0xdcdcdcff,
	        GHOSTWHITE: 0xf8f8ffff,
	        GOLD: 0xffd700ff,
	        GOLDENROD: 0xdaa520ff,
	        GRAY: 0x808080ff,
	        GREEN: 0x008000ff,
	        GREENYELLOW: 0xadff2fff,
	        GREY: 0x808080ff,
	        HONEYDEW: 0xf0fff0ff,
	        HOTPINK: 0xff69b4ff,
	        INDIANRED: 0xcd5c5cff,
	        INDIGO: 0x4b0082ff,
	        IVORY: 0xfffff0ff,
	        KHAKI: 0xf0e68cff,
	        LAVENDER: 0xe6e6faff,
	        LAVENDERBLUSH: 0xfff0f5ff,
	        LAWNGREEN: 0x7cfc00ff,
	        LEMONCHIFFON: 0xfffacdff,
	        LIGHTBLUE: 0xadd8e6ff,
	        LIGHTCORAL: 0xf08080ff,
	        LIGHTCYAN: 0xe0ffffff,
	        LIGHTGOLDENRODYELLOW: 0xfafad2ff,
	        LIGHTGRAY: 0xd3d3d3ff,
	        LIGHTGREEN: 0x90ee90ff,
	        LIGHTGREY: 0xd3d3d3ff,
	        LIGHTPINK: 0xffb6c1ff,
	        LIGHTSALMON: 0xffa07aff,
	        LIGHTSEAGREEN: 0x20b2aaff,
	        LIGHTSKYBLUE: 0x87cefaff,
	        LIGHTSLATEGRAY: 0x778899ff,
	        LIGHTSLATEGREY: 0x778899ff,
	        LIGHTSTEELBLUE: 0xb0c4deff,
	        LIGHTYELLOW: 0xffffe0ff,
	        LIME: 0x00ff00ff,
	        LIMEGREEN: 0x32cd32ff,
	        LINEN: 0xfaf0e6ff,
	        MAGENTA: 0xff00ffff,
	        MAROON: 0x800000ff,
	        MEDIUMAQUAMARINE: 0x66cdaaff,
	        MEDIUMBLUE: 0x0000cdff,
	        MEDIUMORCHID: 0xba55d3ff,
	        MEDIUMPURPLE: 0x9370dbff,
	        MEDIUMSEAGREEN: 0x3cb371ff,
	        MEDIUMSLATEBLUE: 0x7b68eeff,
	        MEDIUMSPRINGGREEN: 0x00fa9aff,
	        MEDIUMTURQUOISE: 0x48d1ccff,
	        MEDIUMVIOLETRED: 0xc71585ff,
	        MIDNIGHTBLUE: 0x191970ff,
	        MINTCREAM: 0xf5fffaff,
	        MISTYROSE: 0xffe4e1ff,
	        MOCCASIN: 0xffe4b5ff,
	        NAVAJOWHITE: 0xffdeadff,
	        NAVY: 0x000080ff,
	        OLDLACE: 0xfdf5e6ff,
	        OLIVE: 0x808000ff,
	        OLIVEDRAB: 0x6b8e23ff,
	        ORANGE: 0xffa500ff,
	        ORANGERED: 0xff4500ff,
	        ORCHID: 0xda70d6ff,
	        PALEGOLDENROD: 0xeee8aaff,
	        PALEGREEN: 0x98fb98ff,
	        PALETURQUOISE: 0xafeeeeff,
	        PALEVIOLETRED: 0xdb7093ff,
	        PAPAYAWHIP: 0xffefd5ff,
	        PEACHPUFF: 0xffdab9ff,
	        PERU: 0xcd853fff,
	        PINK: 0xffc0cbff,
	        PLUM: 0xdda0ddff,
	        POWDERBLUE: 0xb0e0e6ff,
	        PURPLE: 0x800080ff,
	        REBECCAPURPLE: 0x663399ff,
	        RED: 0xff0000ff,
	        ROSYBROWN: 0xbc8f8fff,
	        ROYALBLUE: 0x4169e1ff,
	        SADDLEBROWN: 0x8b4513ff,
	        SALMON: 0xfa8072ff,
	        SANDYBROWN: 0xf4a460ff,
	        SEAGREEN: 0x2e8b57ff,
	        SEASHELL: 0xfff5eeff,
	        SIENNA: 0xa0522dff,
	        SILVER: 0xc0c0c0ff,
	        SKYBLUE: 0x87ceebff,
	        SLATEBLUE: 0x6a5acdff,
	        SLATEGRAY: 0x708090ff,
	        SLATEGREY: 0x708090ff,
	        SNOW: 0xfffafaff,
	        SPRINGGREEN: 0x00ff7fff,
	        STEELBLUE: 0x4682b4ff,
	        TAN: 0xd2b48cff,
	        TEAL: 0x008080ff,
	        THISTLE: 0xd8bfd8ff,
	        TOMATO: 0xff6347ff,
	        TRANSPARENT: 0x00000000,
	        TURQUOISE: 0x40e0d0ff,
	        VIOLET: 0xee82eeff,
	        WHEAT: 0xf5deb3ff,
	        WHITE: 0xffffffff,
	        WHITESMOKE: 0xf5f5f5ff,
	        YELLOW: 0xffff00ff,
	        YELLOWGREEN: 0x9acd32ff
	    };
	
	    var PropertyDescriptorParsingType;
	    (function (PropertyDescriptorParsingType) {
	        PropertyDescriptorParsingType[PropertyDescriptorParsingType["VALUE"] = 0] = "VALUE";
	        PropertyDescriptorParsingType[PropertyDescriptorParsingType["LIST"] = 1] = "LIST";
	        PropertyDescriptorParsingType[PropertyDescriptorParsingType["IDENT_VALUE"] = 2] = "IDENT_VALUE";
	        PropertyDescriptorParsingType[PropertyDescriptorParsingType["TYPE_VALUE"] = 3] = "TYPE_VALUE";
	        PropertyDescriptorParsingType[PropertyDescriptorParsingType["TOKEN_VALUE"] = 4] = "TOKEN_VALUE";
	    })(PropertyDescriptorParsingType || (PropertyDescriptorParsingType = {}));
	
	    var BACKGROUND_CLIP;
	    (function (BACKGROUND_CLIP) {
	        BACKGROUND_CLIP[BACKGROUND_CLIP["BORDER_BOX"] = 0] = "BORDER_BOX";
	        BACKGROUND_CLIP[BACKGROUND_CLIP["PADDING_BOX"] = 1] = "PADDING_BOX";
	        BACKGROUND_CLIP[BACKGROUND_CLIP["CONTENT_BOX"] = 2] = "CONTENT_BOX";
	    })(BACKGROUND_CLIP || (BACKGROUND_CLIP = {}));
	    var backgroundClip = {
	        name: 'background-clip',
	        initialValue: 'border-box',
	        prefix: false,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            return tokens.map(function (token) {
	                if (isIdentToken(token)) {
	                    switch (token.value) {
	                        case 'padding-box':
	                            return BACKGROUND_CLIP.PADDING_BOX;
	                        case 'content-box':
	                            return BACKGROUND_CLIP.CONTENT_BOX;
	                    }
	                }
	                return BACKGROUND_CLIP.BORDER_BOX;
	            });
	        }
	    };
	
	    var backgroundColor = {
	        name: "background-color",
	        initialValue: 'transparent',
	        prefix: false,
	        type: PropertyDescriptorParsingType.TYPE_VALUE,
	        format: 'color'
	    };
	
	    var parseColorStop = function (args) {
	        var color$1 = color.parse(args[0]);
	        var stop = args[1];
	        return stop && isLengthPercentage(stop) ? { color: color$1, stop: stop } : { color: color$1, stop: null };
	    };
	    var processColorStops = function (stops, lineLength) {
	        var first = stops[0];
	        var last = stops[stops.length - 1];
	        if (first.stop === null) {
	            first.stop = ZERO_LENGTH;
	        }
	        if (last.stop === null) {
	            last.stop = HUNDRED_PERCENT;
	        }
	        var processStops = [];
	        var previous = 0;
	        for (var i = 0; i < stops.length; i++) {
	            var stop_1 = stops[i].stop;
	            if (stop_1 !== null) {
	                var absoluteValue = getAbsoluteValue(stop_1, lineLength);
	                if (absoluteValue > previous) {
	                    processStops.push(absoluteValue);
	                }
	                else {
	                    processStops.push(previous);
	                }
	                previous = absoluteValue;
	            }
	            else {
	                processStops.push(null);
	            }
	        }
	        var gapBegin = null;
	        for (var i = 0; i < processStops.length; i++) {
	            var stop_2 = processStops[i];
	            if (stop_2 === null) {
	                if (gapBegin === null) {
	                    gapBegin = i;
	                }
	            }
	            else if (gapBegin !== null) {
	                var gapLength = i - gapBegin;
	                var beforeGap = processStops[gapBegin - 1];
	                var gapValue = (stop_2 - beforeGap) / (gapLength + 1);
	                for (var g = 1; g <= gapLength; g++) {
	                    processStops[gapBegin + g - 1] = gapValue * g;
	                }
	                gapBegin = null;
	            }
	        }
	        return stops.map(function (_a, i) {
	            var color = _a.color;
	            return { color: color, stop: Math.max(Math.min(1, processStops[i] / lineLength), 0) };
	        });
	    };
	    var getAngleFromCorner = function (corner, width, height) {
	        var centerX = width / 2;
	        var centerY = height / 2;
	        var x = getAbsoluteValue(corner[0], width) - centerX;
	        var y = centerY - getAbsoluteValue(corner[1], height);
	        return (Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2);
	    };
	    var calculateGradientDirection = function (angle, width, height) {
	        var radian = typeof angle === 'number' ? angle : getAngleFromCorner(angle, width, height);
	        var lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian));
	        var halfWidth = width / 2;
	        var halfHeight = height / 2;
	        var halfLineLength = lineLength / 2;
	        var yDiff = Math.sin(radian - Math.PI / 2) * halfLineLength;
	        var xDiff = Math.cos(radian - Math.PI / 2) * halfLineLength;
	        return [lineLength, halfWidth - xDiff, halfWidth + xDiff, halfHeight - yDiff, halfHeight + yDiff];
	    };
	    var distance = function (a, b) { return Math.sqrt(a * a + b * b); };
	    var findCorner = function (width, height, x, y, closest) {
	        var corners = [[0, 0], [0, height], [width, 0], [width, height]];
	        return corners.reduce(function (stat, corner) {
	            var cx = corner[0], cy = corner[1];
	            var d = distance(x - cx, y - cy);
	            if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) {
	                return {
	                    optimumCorner: corner,
	                    optimumDistance: d
	                };
	            }
	            return stat;
	        }, {
	            optimumDistance: closest ? Infinity : -Infinity,
	            optimumCorner: null
	        }).optimumCorner;
	    };
	    var calculateRadius = function (gradient, x, y, width, height) {
	        var rx = 0;
	        var ry = 0;
	        switch (gradient.size) {
	            case CSSRadialExtent.CLOSEST_SIDE:
	                // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center.
	                // If the shape is an ellipse, it exactly meets the closest side in each dimension.
	                if (gradient.shape === CSSRadialShape.CIRCLE) {
	                    rx = ry = Math.min(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));
	                }
	                else if (gradient.shape === CSSRadialShape.ELLIPSE) {
	                    rx = Math.min(Math.abs(x), Math.abs(x - width));
	                    ry = Math.min(Math.abs(y), Math.abs(y - height));
	                }
	                break;
	            case CSSRadialExtent.CLOSEST_CORNER:
	                // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center.
	                // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified.
	                if (gradient.shape === CSSRadialShape.CIRCLE) {
	                    rx = ry = Math.min(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height));
	                }
	                else if (gradient.shape === CSSRadialShape.ELLIPSE) {
	                    // Compute the ratio ry/rx (which is to be the same as for "closest-side")
	                    var c = Math.min(Math.abs(y), Math.abs(y - height)) / Math.min(Math.abs(x), Math.abs(x - width));
	                    var _a = findCorner(width, height, x, y, true), cx = _a[0], cy = _a[1];
	                    rx = distance(cx - x, (cy - y) / c);
	                    ry = c * rx;
	                }
	                break;
	            case CSSRadialExtent.FARTHEST_SIDE:
	                // Same as closest-side, except the ending shape is sized based on the farthest side(s)
	                if (gradient.shape === CSSRadialShape.CIRCLE) {
	                    rx = ry = Math.max(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));
	                }
	                else if (gradient.shape === CSSRadialShape.ELLIPSE) {
	                    rx = Math.max(Math.abs(x), Math.abs(x - width));
	                    ry = Math.max(Math.abs(y), Math.abs(y - height));
	                }
	                break;
	            case CSSRadialExtent.FARTHEST_CORNER:
	                // Same as closest-corner, except the ending shape is sized based on the farthest corner.
	                // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified.
	                if (gradient.shape === CSSRadialShape.CIRCLE) {
	                    rx = ry = Math.max(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height));
	                }
	                else if (gradient.shape === CSSRadialShape.ELLIPSE) {
	                    // Compute the ratio ry/rx (which is to be the same as for "farthest-side")
	                    var c = Math.max(Math.abs(y), Math.abs(y - height)) / Math.max(Math.abs(x), Math.abs(x - width));
	                    var _b = findCorner(width, height, x, y, false), cx = _b[0], cy = _b[1];
	                    rx = distance(cx - x, (cy - y) / c);
	                    ry = c * rx;
	                }
	                break;
	        }
	        if (Array.isArray(gradient.size)) {
	            rx = getAbsoluteValue(gradient.size[0], width);
	            ry = gradient.size.length === 2 ? getAbsoluteValue(gradient.size[1], height) : rx;
	        }
	        return [rx, ry];
	    };
	
	    var linearGradient = function (tokens) {
	        var angle$1 = deg(180);
	        var stops = [];
	        parseFunctionArgs(tokens).forEach(function (arg, i) {
	            if (i === 0) {
	                var firstToken = arg[0];
	                if (firstToken.type === TokenType.IDENT_TOKEN && firstToken.value === 'to') {
	                    angle$1 = parseNamedSide(arg);
	                    return;
	                }
	                else if (isAngle(firstToken)) {
	                    angle$1 = angle.parse(firstToken);
	                    return;
	                }
	            }
	            var colorStop = parseColorStop(arg);
	            stops.push(colorStop);
	        });
	        return { angle: angle$1, stops: stops, type: CSSImageType.LINEAR_GRADIENT };
	    };
	
	    var prefixLinearGradient = function (tokens) {
	        var angle$1 = deg(180);
	        var stops = [];
	        parseFunctionArgs(tokens).forEach(function (arg, i) {
	            if (i === 0) {
	                var firstToken = arg[0];
	                if (firstToken.type === TokenType.IDENT_TOKEN &&
	                    ['top', 'left', 'right', 'bottom'].indexOf(firstToken.value) !== -1) {
	                    angle$1 = parseNamedSide(arg);
	                    return;
	                }
	                else if (isAngle(firstToken)) {
	                    angle$1 = (angle.parse(firstToken) + deg(270)) % deg(360);
	                    return;
	                }
	            }
	            var colorStop = parseColorStop(arg);
	            stops.push(colorStop);
	        });
	        return {
	            angle: angle$1,
	            stops: stops,
	            type: CSSImageType.LINEAR_GRADIENT
	        };
	    };
	
	    var testRangeBounds = function (document) {
	        var TEST_HEIGHT = 123;
	        if (document.createRange) {
	            var range = document.createRange();
	            if (range.getBoundingClientRect) {
	                var testElement = document.createElement('boundtest');
	                testElement.style.height = TEST_HEIGHT + "px";
	                testElement.style.display = 'block';
	                document.body.appendChild(testElement);
	                range.selectNode(testElement);
	                var rangeBounds = range.getBoundingClientRect();
	                var rangeHeight = Math.round(rangeBounds.height);
	                document.body.removeChild(testElement);
	                if (rangeHeight === TEST_HEIGHT) {
	                    return true;
	                }
	            }
	        }
	        return false;
	    };
	    var testCORS = function () { return typeof new Image().crossOrigin !== 'undefined'; };
	    var testResponseType = function () { return typeof new XMLHttpRequest().responseType === 'string'; };
	    var testSVG = function (document) {
	        var img = new Image();
	        var canvas = document.createElement('canvas');
	        var ctx = canvas.getContext('2d');
	        if (!ctx) {
	            return false;
	        }
	        img.src = "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'></svg>";
	        try {
	            ctx.drawImage(img, 0, 0);
	            canvas.toDataURL();
	        }
	        catch (e) {
	            return false;
	        }
	        return true;
	    };
	    var isGreenPixel = function (data) {
	        return data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255;
	    };
	    var testForeignObject = function (document) {
	        var canvas = document.createElement('canvas');
	        var size = 100;
	        canvas.width = size;
	        canvas.height = size;
	        var ctx = canvas.getContext('2d');
	        if (!ctx) {
	            return Promise.reject(false);
	        }
	        ctx.fillStyle = 'rgb(0, 255, 0)';
	        ctx.fillRect(0, 0, size, size);
	        var img = new Image();
	        var greenImageSrc = canvas.toDataURL();
	        img.src = greenImageSrc;
	        var svg = createForeignObjectSVG(size, size, 0, 0, img);
	        ctx.fillStyle = 'red';
	        ctx.fillRect(0, 0, size, size);
	        return loadSerializedSVG(svg)
	            .then(function (img) {
	                ctx.drawImage(img, 0, 0);
	                var data = ctx.getImageData(0, 0, size, size).data;
	                ctx.fillStyle = 'red';
	                ctx.fillRect(0, 0, size, size);
	                var node = document.createElement('div');
	                node.style.backgroundImage = "url(" + greenImageSrc + ")";
	                node.style.height = size + "px";
	                // Firefox 55 does not render inline <img /> tags
	                return isGreenPixel(data)
	                    ? loadSerializedSVG(createForeignObjectSVG(size, size, 0, 0, node))
	                    : Promise.reject(false);
	            })
	            .then(function (img) {
	                ctx.drawImage(img, 0, 0);
	                // Edge does not render background-images
	                return isGreenPixel(ctx.getImageData(0, 0, size, size).data);
	            })
	            .catch(function () { return false; });
	    };
	    var createForeignObjectSVG = function (width, height, x, y, node) {
	        var xmlns = 'http://www.w3.org/2000/svg';
	        var svg = document.createElementNS(xmlns, 'svg');
	        var foreignObject = document.createElementNS(xmlns, 'foreignObject');
	        svg.setAttributeNS(null, 'width', width.toString());
	        svg.setAttributeNS(null, 'height', height.toString());
	        foreignObject.setAttributeNS(null, 'width', '100%');
	        foreignObject.setAttributeNS(null, 'height', '100%');
	        foreignObject.setAttributeNS(null, 'x', x.toString());
	        foreignObject.setAttributeNS(null, 'y', y.toString());
	        foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true');
	        svg.appendChild(foreignObject);
	        foreignObject.appendChild(node);
	        return svg;
	    };
	    var loadSerializedSVG = function (svg) {
	        return new Promise(function (resolve, reject) {
	            var img = new Image();
	            img.onload = function () { return resolve(img); };
	            img.onerror = reject;
	            img.src = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(new XMLSerializer().serializeToString(svg));
	        });
	    };
	    var FEATURES = {
	        get SUPPORT_RANGE_BOUNDS() {
	            var value = testRangeBounds(document);
	            Object.defineProperty(FEATURES, 'SUPPORT_RANGE_BOUNDS', { value: value });
	            return value;
	        },
	        get SUPPORT_SVG_DRAWING() {
	            var value = testSVG(document);
	            Object.defineProperty(FEATURES, 'SUPPORT_SVG_DRAWING', { value: value });
	            return value;
	        },
	        get SUPPORT_FOREIGNOBJECT_DRAWING() {
	            var value = typeof Array.from === 'function' && typeof window.fetch === 'function'
	                ? testForeignObject(document)
	                : Promise.resolve(false);
	            Object.defineProperty(FEATURES, 'SUPPORT_FOREIGNOBJECT_DRAWING', { value: value });
	            return value;
	        },
	        get SUPPORT_CORS_IMAGES() {
	            var value = testCORS();
	            Object.defineProperty(FEATURES, 'SUPPORT_CORS_IMAGES', { value: value });
	            return value;
	        },
	        get SUPPORT_RESPONSE_TYPE() {
	            var value = testResponseType();
	            Object.defineProperty(FEATURES, 'SUPPORT_RESPONSE_TYPE', { value: value });
	            return value;
	        },
	        get SUPPORT_CORS_XHR() {
	            var value = 'withCredentials' in new XMLHttpRequest();
	            Object.defineProperty(FEATURES, 'SUPPORT_CORS_XHR', { value: value });
	            return value;
	        }
	    };
	
	    var Logger = /** @class */ (function () {
	        function Logger(_a) {
	            var id = _a.id, enabled = _a.enabled;
	            this.id = id;
	            this.enabled = enabled;
	            this.start = Date.now();
	        }
	        // eslint-disable-next-line @typescript-eslint/no-explicit-any
	        Logger.prototype.debug = function () {
	            var args = [];
	            for (var _i = 0; _i < arguments.length; _i++) {
	                args[_i] = arguments[_i];
	            }
	            if (this.enabled) {
	                // eslint-disable-next-line no-console
	                if (typeof window !== 'undefined' && window.console && typeof console.debug === 'function') {
	                    // eslint-disable-next-line no-console
	                    console.debug.apply(console, [this.id, this.getTime() + "ms"].concat(args));
	                }
	                else {
	                    this.info.apply(this, args);
	                }
	            }
	        };
	        Logger.prototype.getTime = function () {
	            return Date.now() - this.start;
	        };
	        Logger.create = function (options) {
	            Logger.instances[options.id] = new Logger(options);
	        };
	        Logger.destroy = function (id) {
	            delete Logger.instances[id];
	        };
	        Logger.getInstance = function (id) {
	            var instance = Logger.instances[id];
	            if (typeof instance === 'undefined') {
	                throw new Error("No logger instance found with id " + id);
	            }
	            return instance;
	        };
	        // eslint-disable-next-line @typescript-eslint/no-explicit-any
	        Logger.prototype.info = function () {
	            var args = [];
	            for (var _i = 0; _i < arguments.length; _i++) {
	                args[_i] = arguments[_i];
	            }
	            if (this.enabled) {
	                // eslint-disable-next-line no-console
	                if (typeof window !== 'undefined' && window.console && typeof console.info === 'function') {
	                    // eslint-disable-next-line no-console
	                    console.info.apply(console, [this.id, this.getTime() + "ms"].concat(args));
	                }
	            }
	        };
	        // eslint-disable-next-line @typescript-eslint/no-explicit-any
	        Logger.prototype.error = function () {
	            var args = [];
	            for (var _i = 0; _i < arguments.length; _i++) {
	                args[_i] = arguments[_i];
	            }
	            if (this.enabled) {
	                // eslint-disable-next-line no-console
	                if (typeof window !== 'undefined' && window.console && typeof console.error === 'function') {
	                    // eslint-disable-next-line no-console
	                    console.error.apply(console, [this.id, this.getTime() + "ms"].concat(args));
	                }
	                else {
	                    this.info.apply(this, args);
	                }
	            }
	        };
	        Logger.instances = {};
	        return Logger;
	    }());
	
	    var CacheStorage = /** @class */ (function () {
	        function CacheStorage() {
	        }
	        CacheStorage.create = function (name, options) {
	            return (CacheStorage._caches[name] = new Cache(name, options));
	        };
	        CacheStorage.destroy = function (name) {
	            delete CacheStorage._caches[name];
	        };
	        CacheStorage.open = function (name) {
	            var cache = CacheStorage._caches[name];
	            if (typeof cache !== 'undefined') {
	                return cache;
	            }
	            throw new Error("Cache with key \"" + name + "\" not found");
	        };
	        CacheStorage.getOrigin = function (url) {
	            var link = CacheStorage._link;
	            if (!link) {
	                return 'about:blank';
	            }
	            link.href = url;
	            link.href = link.href; // IE9, LOL! - http://jsfiddle.net/niklasvh/2e48b/
	            return link.protocol + link.hostname + link.port;
	        };
	        CacheStorage.isSameOrigin = function (src) {
	            return CacheStorage.getOrigin(src) === CacheStorage._origin;
	        };
	        CacheStorage.setContext = function (window) {
	            CacheStorage._link = window.document.createElement('a');
	            CacheStorage._origin = CacheStorage.getOrigin(window.location.href);
	        };
	        CacheStorage.getInstance = function () {
	            var current = CacheStorage._current;
	            if (current === null) {
	                throw new Error("No cache instance attached");
	            }
	            return current;
	        };
	        CacheStorage.attachInstance = function (cache) {
	            CacheStorage._current = cache;
	        };
	        CacheStorage.detachInstance = function () {
	            CacheStorage._current = null;
	        };
	        CacheStorage._caches = {};
	        CacheStorage._origin = 'about:blank';
	        CacheStorage._current = null;
	        return CacheStorage;
	    }());
	    var Cache = /** @class */ (function () {
	        function Cache(id, options) {
	            this.id = id;
	            this._options = options;
	            this._cache = {};
	        }
	        Cache.prototype.addImage = function (src) {
	            var result = Promise.resolve();
	            if (this.has(src)) {
	                return result;
	            }
	            if (isBlobImage(src) || isRenderable(src)) {
	                this._cache[src] = this.loadImage(src);
	                return result;
	            }
	            return result;
	        };
	        // eslint-disable-next-line @typescript-eslint/no-explicit-any
	        Cache.prototype.match = function (src) {
	            return this._cache[src];
	        };
	        Cache.prototype.loadImage = function (key) {
	            return __awaiter(this, void 0, void 0, function () {
	                var isSameOrigin, useCORS, useProxy, src;
	                var _this = this;
	
	                return __generator(this, function (_a) {
	                    switch (_a.label) {
	                        case 0:
	                            isSameOrigin = CacheStorage.isSameOrigin(key);
	                            useCORS = !isInlineImage(key) && this._options.useCORS === true && FEATURES.SUPPORT_CORS_IMAGES && !isSameOrigin;
	                            useProxy = !isInlineImage(key) &&
	                                !isSameOrigin &&
	                                typeof this._options.proxy === 'string' &&
	                                FEATURES.SUPPORT_CORS_XHR &&
	                                !useCORS;
	                            if (!isSameOrigin && this._options.allowTaint === false && !isInlineImage(key) && !useProxy && !useCORS) {
	                                return [2 /*return*/];
	                            }
	                            src = key;
	                            if (!useProxy) return [3 /*break*/, 2];
	                            return [4 /*yield*/, this.proxy(src)];
	                        case 1:
	                            src = _a.sent();
	                            _a.label = 2;
	                        case 2:
	                            Logger.getInstance(this.id).debug("Added image " + key.substring(0, 256));
	                            return [4 /*yield*/, new Promise(function (resolve, reject) {
	                                var img = new Image();
	                                img.onload = function () { return resolve(img); };
	                                img.onerror = reject;
	                                //ios safari 10.3 taints canvas with data urls unless crossOrigin is set to anonymous
	                                if (isInlineBase64Image(src) || useCORS) {
	                                    img.crossOrigin = 'anonymous';
	                                }
	                                img.src = src;
	                                if (img.complete === true) {
	                                    // Inline XML images may fail to parse, throwing an Error later on
	                                    setTimeout(function () { return resolve(img); }, 500);
	                                }
	                                if (_this._options.imageTimeout > 0) {
	                                    setTimeout(function () { return reject("Timed out (" + _this._options.imageTimeout + "ms) loading image"); }, _this._options.imageTimeout);
	                                }
	                            })];
	                        case 3: return [2 /*return*/, _a.sent()];
	                    }
	                });
	            });
	        };
	        Cache.prototype.has = function (key) {
	            return typeof this._cache[key] !== 'undefined';
	        };
	        Cache.prototype.keys = function () {
	            return Promise.resolve(Object.keys(this._cache));
	        };
	        Cache.prototype.proxy = function (src) {
	            var _this = this;
	            var proxy = this._options.proxy;
	            if (!proxy) {
	                throw new Error('No proxy defined');
	            }
	            var key = src.substring(0, 256);
	            return new Promise(function (resolve, reject) {
	                var responseType = FEATURES.SUPPORT_RESPONSE_TYPE ? 'blob' : 'text';
	                var xhr = new XMLHttpRequest();
	                xhr.onload = function () {
	                    if (xhr.status === 200) {
	                        if (responseType === 'text') {
	                            resolve(xhr.response);
	                        }
	                        else {
	                            var reader_1 = new FileReader();
	                            reader_1.addEventListener('load', function () { return resolve(reader_1.result); }, false);
	                            reader_1.addEventListener('error', function (e) { return reject(e); }, false);
	                            reader_1.readAsDataURL(xhr.response);
	                        }
	                    }
	                    else {
	                        reject("Failed to proxy resource " + key + " with status code " + xhr.status);
	                    }
	                };
	                xhr.onerror = reject;
	                xhr.open('GET', proxy + "?url=" + encodeURIComponent(src) + "&responseType=" + responseType);
	                if (responseType !== 'text' && xhr instanceof XMLHttpRequest) {
	                    xhr.responseType = responseType;
	                }
	                if (_this._options.imageTimeout) {
	                    var timeout_1 = _this._options.imageTimeout;
	                    xhr.timeout = timeout_1;
	                    xhr.ontimeout = function () { return reject("Timed out (" + timeout_1 + "ms) proxying " + key); };
	                }
	                xhr.send();
	            });
	        };
	        return Cache;
	    }());
	    var INLINE_SVG = /^data:image\/svg\+xml/i;
	    var INLINE_BASE64 = /^data:image\/.*;base64,/i;
	    var INLINE_IMG = /^data:image\/.*/i;
	    var isRenderable = function (src) { return FEATURES.SUPPORT_SVG_DRAWING || !isSVG(src); };
	    var isInlineImage = function (src) { return INLINE_IMG.test(src); };
	    var isInlineBase64Image = function (src) { return INLINE_BASE64.test(src); };
	    var isBlobImage = function (src) { return src.substr(0, 4) === 'blob'; };
	    var isSVG = function (src) { return src.substr(-3).toLowerCase() === 'svg' || INLINE_SVG.test(src); };
	
	    var webkitGradient = function (tokens) {
	        var angle = deg(180);
	        var stops = [];
	        var type = CSSImageType.LINEAR_GRADIENT;
	        var shape = CSSRadialShape.CIRCLE;
	        var size = CSSRadialExtent.FARTHEST_CORNER;
	        var position = [];
	        parseFunctionArgs(tokens).forEach(function (arg, i) {
	            var firstToken = arg[0];
	            if (i === 0) {
	                if (isIdentToken(firstToken) && firstToken.value === 'linear') {
	                    type = CSSImageType.LINEAR_GRADIENT;
	                    return;
	                }
	                else if (isIdentToken(firstToken) && firstToken.value === 'radial') {
	                    type = CSSImageType.RADIAL_GRADIENT;
	                    return;
	                }
	            }
	            if (firstToken.type === TokenType.FUNCTION) {
	                if (firstToken.name === 'from') {
	                    var color$1 = color.parse(firstToken.values[0]);
	                    stops.push({ stop: ZERO_LENGTH, color: color$1 });
	                }
	                else if (firstToken.name === 'to') {
	                    var color$1 = color.parse(firstToken.values[0]);
	                    stops.push({ stop: HUNDRED_PERCENT, color: color$1 });
	                }
	                else if (firstToken.name === 'color-stop') {
	                    var values = firstToken.values.filter(nonFunctionArgSeparator);
	                    if (values.length === 2) {
	                        var color$1 = color.parse(values[1]);
	                        var stop_1 = values[0];
	                        if (isNumberToken(stop_1)) {
	                            stops.push({
	                                stop: { type: TokenType.PERCENTAGE_TOKEN, number: stop_1.number * 100, flags: stop_1.flags },
	                                color: color$1
	                            });
	                        }
	                    }
	                }
	            }
	        });
	        return type === CSSImageType.LINEAR_GRADIENT
	            ? {
	                angle: (angle + deg(180)) % deg(360),
	                stops: stops,
	                type: type
	            }
	            : { size: size, shape: shape, stops: stops, position: position, type: type };
	    };
	
	    var CLOSEST_SIDE = 'closest-side';
	    var FARTHEST_SIDE = 'farthest-side';
	    var CLOSEST_CORNER = 'closest-corner';
	    var FARTHEST_CORNER = 'farthest-corner';
	    var CIRCLE = 'circle';
	    var ELLIPSE = 'ellipse';
	    var COVER = 'cover';
	    var CONTAIN = 'contain';
	    var radialGradient = function (tokens) {
	        var shape = CSSRadialShape.CIRCLE;
	        var size = CSSRadialExtent.FARTHEST_CORNER;
	        var stops = [];
	        var position = [];
	        parseFunctionArgs(tokens).forEach(function (arg, i) {
	            var isColorStop = true;
	            if (i === 0) {
	                var isAtPosition_1 = false;
	                isColorStop = arg.reduce(function (acc, token) {
	                    if (isAtPosition_1) {
	                        if (isIdentToken(token)) {
	                            switch (token.value) {
	                                case 'center':
	                                    position.push(FIFTY_PERCENT);
	                                    return acc;
	                                case 'top':
	                                case 'left':
	                                    position.push(ZERO_LENGTH);
	                                    return acc;
	                                case 'right':
	                                case 'bottom':
	                                    position.push(HUNDRED_PERCENT);
	                                    return acc;
	                            }
	                        }
	                        else if (isLengthPercentage(token) || isLength(token)) {
	                            position.push(token);
	                        }
	                    }
	                    else if (isIdentToken(token)) {
	                        switch (token.value) {
	                            case CIRCLE:
	                                shape = CSSRadialShape.CIRCLE;
	                                return false;
	                            case ELLIPSE:
	                                shape = CSSRadialShape.ELLIPSE;
	                                return false;
	                            case 'at':
	                                isAtPosition_1 = true;
	                                return false;
	                            case CLOSEST_SIDE:
	                                size = CSSRadialExtent.CLOSEST_SIDE;
	                                return false;
	                            case COVER:
	                            case FARTHEST_SIDE:
	                                size = CSSRadialExtent.FARTHEST_SIDE;
	                                return false;
	                            case CONTAIN:
	                            case CLOSEST_CORNER:
	                                size = CSSRadialExtent.CLOSEST_CORNER;
	                                return false;
	                            case FARTHEST_CORNER:
	                                size = CSSRadialExtent.FARTHEST_CORNER;
	                                return false;
	                        }
	                    }
	                    else if (isLength(token) || isLengthPercentage(token)) {
	                        if (!Array.isArray(size)) {
	                            size = [];
	                        }
	                        size.push(token);
	                        return false;
	                    }
	                    return acc;
	                }, isColorStop);
	            }
	            if (isColorStop) {
	                var colorStop = parseColorStop(arg);
	                stops.push(colorStop);
	            }
	        });
	        return { size: size, shape: shape, stops: stops, position: position, type: CSSImageType.RADIAL_GRADIENT };
	    };
	
	    var prefixRadialGradient = function (tokens) {
	        var shape = CSSRadialShape.CIRCLE;
	        var size = CSSRadialExtent.FARTHEST_CORNER;
	        var stops = [];
	        var position = [];
	        parseFunctionArgs(tokens).forEach(function (arg, i) {
	            var isColorStop = true;
	            if (i === 0) {
	                isColorStop = arg.reduce(function (acc, token) {
	                    if (isIdentToken(token)) {
	                        switch (token.value) {
	                            case 'center':
	                                position.push(FIFTY_PERCENT);
	                                return false;
	                            case 'top':
	                            case 'left':
	                                position.push(ZERO_LENGTH);
	                                return false;
	                            case 'right':
	                            case 'bottom':
	                                position.push(HUNDRED_PERCENT);
	                                return false;
	                        }
	                    }
	                    else if (isLengthPercentage(token) || isLength(token)) {
	                        position.push(token);
	                        return false;
	                    }
	                    return acc;
	                }, isColorStop);
	            }
	            else if (i === 1) {
	                isColorStop = arg.reduce(function (acc, token) {
	                    if (isIdentToken(token)) {
	                        switch (token.value) {
	                            case CIRCLE:
	                                shape = CSSRadialShape.CIRCLE;
	                                return false;
	                            case ELLIPSE:
	                                shape = CSSRadialShape.ELLIPSE;
	                                return false;
	                            case CONTAIN:
	                            case CLOSEST_SIDE:
	                                size = CSSRadialExtent.CLOSEST_SIDE;
	                                return false;
	                            case FARTHEST_SIDE:
	                                size = CSSRadialExtent.FARTHEST_SIDE;
	                                return false;
	                            case CLOSEST_CORNER:
	                                size = CSSRadialExtent.CLOSEST_CORNER;
	                                return false;
	                            case COVER:
	                            case FARTHEST_CORNER:
	                                size = CSSRadialExtent.FARTHEST_CORNER;
	                                return false;
	                        }
	                    }
	                    else if (isLength(token) || isLengthPercentage(token)) {
	                        if (!Array.isArray(size)) {
	                            size = [];
	                        }
	                        size.push(token);
	                        return false;
	                    }
	                    return acc;
	                }, isColorStop);
	            }
	            if (isColorStop) {
	                var colorStop = parseColorStop(arg);
	                stops.push(colorStop);
	            }
	        });
	        return { size: size, shape: shape, stops: stops, position: position, type: CSSImageType.RADIAL_GRADIENT };
	    };
	
	    var CSSImageType;
	    (function (CSSImageType) {
	        CSSImageType[CSSImageType["URL"] = 0] = "URL";
	        CSSImageType[CSSImageType["LINEAR_GRADIENT"] = 1] = "LINEAR_GRADIENT";
	        CSSImageType[CSSImageType["RADIAL_GRADIENT"] = 2] = "RADIAL_GRADIENT";
	    })(CSSImageType || (CSSImageType = {}));
	    var isLinearGradient = function (background) {
	        return background.type === CSSImageType.LINEAR_GRADIENT;
	    };
	    var isRadialGradient = function (background) {
	        return background.type === CSSImageType.RADIAL_GRADIENT;
	    };
	    var CSSRadialShape;
	    (function (CSSRadialShape) {
	        CSSRadialShape[CSSRadialShape["CIRCLE"] = 0] = "CIRCLE";
	        CSSRadialShape[CSSRadialShape["ELLIPSE"] = 1] = "ELLIPSE";
	    })(CSSRadialShape || (CSSRadialShape = {}));
	    var CSSRadialExtent;
	    (function (CSSRadialExtent) {
	        CSSRadialExtent[CSSRadialExtent["CLOSEST_SIDE"] = 0] = "CLOSEST_SIDE";
	        CSSRadialExtent[CSSRadialExtent["FARTHEST_SIDE"] = 1] = "FARTHEST_SIDE";
	        CSSRadialExtent[CSSRadialExtent["CLOSEST_CORNER"] = 2] = "CLOSEST_CORNER";
	        CSSRadialExtent[CSSRadialExtent["FARTHEST_CORNER"] = 3] = "FARTHEST_CORNER";
	    })(CSSRadialExtent || (CSSRadialExtent = {}));
	    var image = {
	        name: 'image',
	        parse: function (value) {
	            if (value.type === TokenType.URL_TOKEN) {
	                var image_1 = { url: value.value, type: CSSImageType.URL };
	                CacheStorage.getInstance().addImage(value.value);
	                return image_1;
	            }
	            if (value.type === TokenType.FUNCTION) {
	                var imageFunction = SUPPORTED_IMAGE_FUNCTIONS[value.name];
	                if (typeof imageFunction === 'undefined') {
	                    throw new Error("Attempting to parse an unsupported image function \"" + value.name + "\"");
	                }
	                return imageFunction(value.values);
	            }
	            throw new Error("Unsupported image type");
	        }
	    };
	    function isSupportedImage(value) {
	        return value.type !== TokenType.FUNCTION || SUPPORTED_IMAGE_FUNCTIONS[value.name];
	    }
	    var SUPPORTED_IMAGE_FUNCTIONS = {
	        'linear-gradient': linearGradient,
	        '-moz-linear-gradient': prefixLinearGradient,
	        '-ms-linear-gradient': prefixLinearGradient,
	        '-o-linear-gradient': prefixLinearGradient,
	        '-webkit-linear-gradient': prefixLinearGradient,
	        'radial-gradient': radialGradient,
	        '-moz-radial-gradient': prefixRadialGradient,
	        '-ms-radial-gradient': prefixRadialGradient,
	        '-o-radial-gradient': prefixRadialGradient,
	        '-webkit-radial-gradient': prefixRadialGradient,
	        '-webkit-gradient': webkitGradient
	    };
	
	    var backgroundImage = {
	        name: 'background-image',
	        initialValue: 'none',
	        type: PropertyDescriptorParsingType.LIST,
	        prefix: false,
	        parse: function (tokens) {
	            if (tokens.length === 0) {
	                return [];
	            }
	            var first = tokens[0];
	            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
	                return [];
	            }
	            return tokens.filter(function (value) { return nonFunctionArgSeparator(value) && isSupportedImage(value); }).map(image.parse);
	        }
	    };
	
	    var backgroundOrigin = {
	        name: 'background-origin',
	        initialValue: 'border-box',
	        prefix: false,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            return tokens.map(function (token) {
	                if (isIdentToken(token)) {
	                    switch (token.value) {
	                        case 'padding-box':
	                            return 1 /* PADDING_BOX */;
	                        case 'content-box':
	                            return 2 /* CONTENT_BOX */;
	                    }
	                }
	                return 0 /* BORDER_BOX */;
	            });
	        }
	    };
	
	    var backgroundPosition = {
	        name: 'background-position',
	        initialValue: '0% 0%',
	        type: PropertyDescriptorParsingType.LIST,
	        prefix: false,
	        parse: function (tokens) {
	            return parseFunctionArgs(tokens)
	                .map(function (values) { return values.filter(isLengthPercentage); })
	                .map(parseLengthPercentageTuple);
	        }
	    };
	
	    var BACKGROUND_REPEAT;
	    (function (BACKGROUND_REPEAT) {
	        BACKGROUND_REPEAT[BACKGROUND_REPEAT["REPEAT"] = 0] = "REPEAT";
	        BACKGROUND_REPEAT[BACKGROUND_REPEAT["NO_REPEAT"] = 1] = "NO_REPEAT";
	        BACKGROUND_REPEAT[BACKGROUND_REPEAT["REPEAT_X"] = 2] = "REPEAT_X";
	        BACKGROUND_REPEAT[BACKGROUND_REPEAT["REPEAT_Y"] = 3] = "REPEAT_Y";
	    })(BACKGROUND_REPEAT || (BACKGROUND_REPEAT = {}));
	    var backgroundRepeat = {
	        name: 'background-repeat',
	        initialValue: 'repeat',
	        prefix: false,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            return parseFunctionArgs(tokens)
	                .map(function (values) {
	                    return values
	                        .filter(isIdentToken)
	                        .map(function (token) { return token.value; })
	                        .join(' ');
	                })
	                .map(parseBackgroundRepeat);
	        }
	    };
	    var parseBackgroundRepeat = function (value) {
	        switch (value) {
	            case 'no-repeat':
	                return BACKGROUND_REPEAT.NO_REPEAT;
	            case 'repeat-x':
	            case 'repeat no-repeat':
	                return BACKGROUND_REPEAT.REPEAT_X;
	            case 'repeat-y':
	            case 'no-repeat repeat':
	                return BACKGROUND_REPEAT.REPEAT_Y;
	            case 'repeat':
	            default:
	                return BACKGROUND_REPEAT.REPEAT;
	        }
	    };
	
	    var BACKGROUND_SIZE;
	    (function (BACKGROUND_SIZE) {
	        BACKGROUND_SIZE["AUTO"] = "auto";
	        BACKGROUND_SIZE["CONTAIN"] = "contain";
	        BACKGROUND_SIZE["COVER"] = "cover";
	    })(BACKGROUND_SIZE || (BACKGROUND_SIZE = {}));
	    var backgroundSize = {
	        name: 'background-size',
	        initialValue: '0',
	        prefix: false,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            return parseFunctionArgs(tokens).map(function (values) { return values.filter(isBackgroundSizeInfoToken); });
	        }
	    };
	    var isBackgroundSizeInfoToken = function (value) {
	        return isIdentToken(value) || isLengthPercentage(value);
	    };
	
	    var borderColorForSide = function (side) {
	        return ({
	            name: "border-" + side + "-color",
	            initialValue: 'transparent',
	            prefix: false,
	            type: PropertyDescriptorParsingType.TYPE_VALUE,
	            format: 'color'
	        });
	    };
	    var borderTopColor = borderColorForSide('top');
	    var borderRightColor = borderColorForSide('right');
	    var borderBottomColor = borderColorForSide('bottom');
	    var borderLeftColor = borderColorForSide('left');
	
	    var borderRadiusForSide = function (side) {
	        return ({
	            name: "border-radius-" + side,
	            initialValue: '0 0',
	            prefix: false,
	            type: PropertyDescriptorParsingType.LIST,
	            parse: function (tokens) { return parseLengthPercentageTuple(tokens.filter(isLengthPercentage)); }
	        });
	    };
	    var borderTopLeftRadius = borderRadiusForSide('top-left');
	    var borderTopRightRadius = borderRadiusForSide('top-right');
	    var borderBottomRightRadius = borderRadiusForSide('bottom-right');
	    var borderBottomLeftRadius = borderRadiusForSide('bottom-left');
	
	    var BORDER_STYLE;
	    (function (BORDER_STYLE) {
	        BORDER_STYLE[BORDER_STYLE["NONE"] = 0] = "NONE";
	        BORDER_STYLE[BORDER_STYLE["SOLID"] = 1] = "SOLID";
	    })(BORDER_STYLE || (BORDER_STYLE = {}));
	    var borderStyleForSide = function (side) {
	        return ({
	            name: "border-" + side + "-style",
	            initialValue: 'solid',
	            prefix: false,
	            type: PropertyDescriptorParsingType.IDENT_VALUE,
	            parse: function (style) {
	                switch (style) {
	                    case 'none':
	                        return BORDER_STYLE.NONE;
	                }
	                return BORDER_STYLE.SOLID;
	            }
	        });
	    };
	    var borderTopStyle = borderStyleForSide('top');
	    var borderRightStyle = borderStyleForSide('right');
	    var borderBottomStyle = borderStyleForSide('bottom');
	    var borderLeftStyle = borderStyleForSide('left');
	
	    var borderWidthForSide = function (side) {
	        return ({
	            name: "border-" + side + "-width",
	            initialValue: '0',
	            type: PropertyDescriptorParsingType.VALUE,
	            prefix: false,
	            parse: function (token) {
	                if (isDimensionToken(token)) {
	                    return token.number;
	                }
	                return 0;
	            }
	        });
	    };
	    var borderTopWidth = borderWidthForSide('top');
	    var borderRightWidth = borderWidthForSide('right');
	    var borderBottomWidth = borderWidthForSide('bottom');
	    var borderLeftWidth = borderWidthForSide('left');
	
	    var color$1 = {
	        name: "color",
	        initialValue: 'transparent',
	        prefix: false,
	        type: PropertyDescriptorParsingType.TYPE_VALUE,
	        format: 'color'
	    };
	
	    var display = {
	        name: 'display',
	        initialValue: 'inline-block',
	        prefix: false,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            return tokens.filter(isIdentToken).reduce(function (bit, token) {
	                return bit | parseDisplayValue(token.value);
	            }, 0 /* NONE */);
	        }
	    };
	    var parseDisplayValue = function (display) {
	        switch (display) {
	            case 'block':
	                return 2 /* BLOCK */;
	            case 'inline':
	                return 4 /* INLINE */;
	            case 'run-in':
	                return 8 /* RUN_IN */;
	            case 'flow':
	                return 16 /* FLOW */;
	            case 'flow-root':
	                return 32 /* FLOW_ROOT */;
	            case 'table':
	                return 64 /* TABLE */;
	            case 'flex':
	            case '-webkit-flex':
	                return 128 /* FLEX */;
	            case 'grid':
	            case '-ms-grid':
	                return 256 /* GRID */;
	            case 'ruby':
	                return 512 /* RUBY */;
	            case 'subgrid':
	                return 1024 /* SUBGRID */;
	            case 'list-item':
	                return 2048 /* LIST_ITEM */;
	            case 'table-row-group':
	                return 4096 /* TABLE_ROW_GROUP */;
	            case 'table-header-group':
	                return 8192 /* TABLE_HEADER_GROUP */;
	            case 'table-footer-group':
	                return 16384 /* TABLE_FOOTER_GROUP */;
	            case 'table-row':
	                return 32768 /* TABLE_ROW */;
	            case 'table-cell':
	                return 65536 /* TABLE_CELL */;
	            case 'table-column-group':
	                return 131072 /* TABLE_COLUMN_GROUP */;
	            case 'table-column':
	                return 262144 /* TABLE_COLUMN */;
	            case 'table-caption':
	                return 524288 /* TABLE_CAPTION */;
	            case 'ruby-base':
	                return 1048576 /* RUBY_BASE */;
	            case 'ruby-text':
	                return 2097152 /* RUBY_TEXT */;
	            case 'ruby-base-container':
	                return 4194304 /* RUBY_BASE_CONTAINER */;
	            case 'ruby-text-container':
	                return 8388608 /* RUBY_TEXT_CONTAINER */;
	            case 'contents':
	                return 16777216 /* CONTENTS */;
	            case 'inline-block':
	                return 33554432 /* INLINE_BLOCK */;
	            case 'inline-list-item':
	                return 67108864 /* INLINE_LIST_ITEM */;
	            case 'inline-table':
	                return 134217728 /* INLINE_TABLE */;
	            case 'inline-flex':
	                return 268435456 /* INLINE_FLEX */;
	            case 'inline-grid':
	                return 536870912 /* INLINE_GRID */;
	        }
	        return 0 /* NONE */;
	    };
	
	    var FLOAT;
	    (function (FLOAT) {
	        FLOAT[FLOAT["NONE"] = 0] = "NONE";
	        FLOAT[FLOAT["LEFT"] = 1] = "LEFT";
	        FLOAT[FLOAT["RIGHT"] = 2] = "RIGHT";
	        FLOAT[FLOAT["INLINE_START"] = 3] = "INLINE_START";
	        FLOAT[FLOAT["INLINE_END"] = 4] = "INLINE_END";
	    })(FLOAT || (FLOAT = {}));
	    var float = {
	        name: 'float',
	        initialValue: 'none',
	        prefix: false,
	        type: PropertyDescriptorParsingType.IDENT_VALUE,
	        parse: function (float) {
	            switch (float) {
	                case 'left':
	                    return FLOAT.LEFT;
	                case 'right':
	                    return FLOAT.RIGHT;
	                case 'inline-start':
	                    return FLOAT.INLINE_START;
	                case 'inline-end':
	                    return FLOAT.INLINE_END;
	            }
	            return FLOAT.NONE;
	        }
	    };
	
	    var letterSpacing = {
	        name: 'letter-spacing',
	        initialValue: '0',
	        prefix: false,
	        type: PropertyDescriptorParsingType.VALUE,
	        parse: function (token) {
	            if (token.type === TokenType.IDENT_TOKEN && token.value === 'normal') {
	                return 0;
	            }
	            if (token.type === TokenType.NUMBER_TOKEN) {
	                return token.number;
	            }
	            if (token.type === TokenType.DIMENSION_TOKEN) {
	                return token.number;
	            }
	            return 0;
	        }
	    };
	
	    var LINE_BREAK;
	    (function (LINE_BREAK) {
	        LINE_BREAK["NORMAL"] = "normal";
	        LINE_BREAK["STRICT"] = "strict";
	    })(LINE_BREAK || (LINE_BREAK = {}));
	    var lineBreak = {
	        name: 'line-break',
	        initialValue: 'normal',
	        prefix: false,
	        type: PropertyDescriptorParsingType.IDENT_VALUE,
	        parse: function (lineBreak) {
	            switch (lineBreak) {
	                case 'strict':
	                    return LINE_BREAK.STRICT;
	                case 'normal':
	                default:
	                    return LINE_BREAK.NORMAL;
	            }
	        }
	    };
	
	    var lineHeight = {
	        name: 'line-height',
	        initialValue: 'normal',
	        prefix: false,
	        type: PropertyDescriptorParsingType.TOKEN_VALUE
	    };
	    var computeLineHeight = function (token, fontSize) {
	        if (isIdentToken(token) && token.value === 'normal') {
	            return 1.2 * fontSize;
	        }
	        else if (token.type === TokenType.NUMBER_TOKEN) {
	            return fontSize * token.number;
	        }
	        else if (isLengthPercentage(token)) {
	            return getAbsoluteValue(token, fontSize);
	        }
	        return fontSize;
	    };
	
	    var listStyleImage = {
	        name: 'list-style-image',
	        initialValue: 'none',
	        type: PropertyDescriptorParsingType.VALUE,
	        prefix: false,
	        parse: function (token) {
	            if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {
	                return null;
	            }
	            return image.parse(token);
	        }
	    };
	
	    var LIST_STYLE_POSITION;
	    (function (LIST_STYLE_POSITION) {
	        LIST_STYLE_POSITION[LIST_STYLE_POSITION["INSIDE"] = 0] = "INSIDE";
	        LIST_STYLE_POSITION[LIST_STYLE_POSITION["OUTSIDE"] = 1] = "OUTSIDE";
	    })(LIST_STYLE_POSITION || (LIST_STYLE_POSITION = {}));
	    var listStylePosition = {
	        name: 'list-style-position',
	        initialValue: 'outside',
	        prefix: false,
	        type: PropertyDescriptorParsingType.IDENT_VALUE,
	        parse: function (position) {
	            switch (position) {
	                case 'inside':
	                    return LIST_STYLE_POSITION.INSIDE;
	                case 'outside':
	                default:
	                    return LIST_STYLE_POSITION.OUTSIDE;
	            }
	        }
	    };
	
	    var LIST_STYLE_TYPE;
	    (function (LIST_STYLE_TYPE) {
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["NONE"] = -1] = "NONE";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DISC"] = 0] = "DISC";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CIRCLE"] = 1] = "CIRCLE";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["SQUARE"] = 2] = "SQUARE";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DECIMAL"] = 3] = "DECIMAL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_DECIMAL"] = 4] = "CJK_DECIMAL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DECIMAL_LEADING_ZERO"] = 5] = "DECIMAL_LEADING_ZERO";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_ROMAN"] = 6] = "LOWER_ROMAN";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["UPPER_ROMAN"] = 7] = "UPPER_ROMAN";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_GREEK"] = 8] = "LOWER_GREEK";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_ALPHA"] = 9] = "LOWER_ALPHA";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["UPPER_ALPHA"] = 10] = "UPPER_ALPHA";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["ARABIC_INDIC"] = 11] = "ARABIC_INDIC";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["ARMENIAN"] = 12] = "ARMENIAN";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["BENGALI"] = 13] = "BENGALI";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CAMBODIAN"] = 14] = "CAMBODIAN";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_EARTHLY_BRANCH"] = 15] = "CJK_EARTHLY_BRANCH";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_HEAVENLY_STEM"] = 16] = "CJK_HEAVENLY_STEM";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_IDEOGRAPHIC"] = 17] = "CJK_IDEOGRAPHIC";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DEVANAGARI"] = 18] = "DEVANAGARI";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["ETHIOPIC_NUMERIC"] = 19] = "ETHIOPIC_NUMERIC";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["GEORGIAN"] = 20] = "GEORGIAN";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["GUJARATI"] = 21] = "GUJARATI";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["GURMUKHI"] = 22] = "GURMUKHI";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["HEBREW"] = 22] = "HEBREW";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["HIRAGANA"] = 23] = "HIRAGANA";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["HIRAGANA_IROHA"] = 24] = "HIRAGANA_IROHA";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["JAPANESE_FORMAL"] = 25] = "JAPANESE_FORMAL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["JAPANESE_INFORMAL"] = 26] = "JAPANESE_INFORMAL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KANNADA"] = 27] = "KANNADA";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KATAKANA"] = 28] = "KATAKANA";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KATAKANA_IROHA"] = 29] = "KATAKANA_IROHA";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KHMER"] = 30] = "KHMER";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KOREAN_HANGUL_FORMAL"] = 31] = "KOREAN_HANGUL_FORMAL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KOREAN_HANJA_FORMAL"] = 32] = "KOREAN_HANJA_FORMAL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KOREAN_HANJA_INFORMAL"] = 33] = "KOREAN_HANJA_INFORMAL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["LAO"] = 34] = "LAO";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_ARMENIAN"] = 35] = "LOWER_ARMENIAN";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["MALAYALAM"] = 36] = "MALAYALAM";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["MONGOLIAN"] = 37] = "MONGOLIAN";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["MYANMAR"] = 38] = "MYANMAR";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["ORIYA"] = 39] = "ORIYA";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["PERSIAN"] = 40] = "PERSIAN";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["SIMP_CHINESE_FORMAL"] = 41] = "SIMP_CHINESE_FORMAL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["SIMP_CHINESE_INFORMAL"] = 42] = "SIMP_CHINESE_INFORMAL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["TAMIL"] = 43] = "TAMIL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["TELUGU"] = 44] = "TELUGU";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["THAI"] = 45] = "THAI";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["TIBETAN"] = 46] = "TIBETAN";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["TRAD_CHINESE_FORMAL"] = 47] = "TRAD_CHINESE_FORMAL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["TRAD_CHINESE_INFORMAL"] = 48] = "TRAD_CHINESE_INFORMAL";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["UPPER_ARMENIAN"] = 49] = "UPPER_ARMENIAN";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DISCLOSURE_OPEN"] = 50] = "DISCLOSURE_OPEN";
	        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DISCLOSURE_CLOSED"] = 51] = "DISCLOSURE_CLOSED";
	    })(LIST_STYLE_TYPE || (LIST_STYLE_TYPE = {}));
	    var listStyleType = {
	        name: 'list-style-type',
	        initialValue: 'none',
	        prefix: false,
	        type: PropertyDescriptorParsingType.IDENT_VALUE,
	        parse: function (type) {
	            switch (type) {
	                case 'disc':
	                    return LIST_STYLE_TYPE.DISC;
	                case 'circle':
	                    return LIST_STYLE_TYPE.CIRCLE;
	                case 'square':
	                    return LIST_STYLE_TYPE.SQUARE;
	                case 'decimal':
	                    return LIST_STYLE_TYPE.DECIMAL;
	                case 'cjk-decimal':
	                    return LIST_STYLE_TYPE.CJK_DECIMAL;
	                case 'decimal-leading-zero':
	                    return LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO;
	                case 'lower-roman':
	                    return LIST_STYLE_TYPE.LOWER_ROMAN;
	                case 'upper-roman':
	                    return LIST_STYLE_TYPE.UPPER_ROMAN;
	                case 'lower-greek':
	                    return LIST_STYLE_TYPE.LOWER_GREEK;
	                case 'lower-alpha':
	                    return LIST_STYLE_TYPE.LOWER_ALPHA;
	                case 'upper-alpha':
	                    return LIST_STYLE_TYPE.UPPER_ALPHA;
	                case 'arabic-indic':
	                    return LIST_STYLE_TYPE.ARABIC_INDIC;
	                case 'armenian':
	                    return LIST_STYLE_TYPE.ARMENIAN;
	                case 'bengali':
	                    return LIST_STYLE_TYPE.BENGALI;
	                case 'cambodian':
	                    return LIST_STYLE_TYPE.CAMBODIAN;
	                case 'cjk-earthly-branch':
	                    return LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH;
	                case 'cjk-heavenly-stem':
	                    return LIST_STYLE_TYPE.CJK_HEAVENLY_STEM;
	                case 'cjk-ideographic':
	                    return LIST_STYLE_TYPE.CJK_IDEOGRAPHIC;
	                case 'devanagari':
	                    return LIST_STYLE_TYPE.DEVANAGARI;
	                case 'ethiopic-numeric':
	                    return LIST_STYLE_TYPE.ETHIOPIC_NUMERIC;
	                case 'georgian':
	                    return LIST_STYLE_TYPE.GEORGIAN;
	                case 'gujarati':
	                    return LIST_STYLE_TYPE.GUJARATI;
	                case 'gurmukhi':
	                    return LIST_STYLE_TYPE.GURMUKHI;
	                case 'hebrew':
	                    return LIST_STYLE_TYPE.HEBREW;
	                case 'hiragana':
	                    return LIST_STYLE_TYPE.HIRAGANA;
	                case 'hiragana-iroha':
	                    return LIST_STYLE_TYPE.HIRAGANA_IROHA;
	                case 'japanese-formal':
	                    return LIST_STYLE_TYPE.JAPANESE_FORMAL;
	                case 'japanese-informal':
	                    return LIST_STYLE_TYPE.JAPANESE_INFORMAL;
	                case 'kannada':
	                    return LIST_STYLE_TYPE.KANNADA;
	                case 'katakana':
	                    return LIST_STYLE_TYPE.KATAKANA;
	                case 'katakana-iroha':
	                    return LIST_STYLE_TYPE.KATAKANA_IROHA;
	                case 'khmer':
	                    return LIST_STYLE_TYPE.KHMER;
	                case 'korean-hangul-formal':
	                    return LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL;
	                case 'korean-hanja-formal':
	                    return LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL;
	                case 'korean-hanja-informal':
	                    return LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL;
	                case 'lao':
	                    return LIST_STYLE_TYPE.LAO;
	                case 'lower-armenian':
	                    return LIST_STYLE_TYPE.LOWER_ARMENIAN;
	                case 'malayalam':
	                    return LIST_STYLE_TYPE.MALAYALAM;
	                case 'mongolian':
	                    return LIST_STYLE_TYPE.MONGOLIAN;
	                case 'myanmar':
	                    return LIST_STYLE_TYPE.MYANMAR;
	                case 'oriya':
	                    return LIST_STYLE_TYPE.ORIYA;
	                case 'persian':
	                    return LIST_STYLE_TYPE.PERSIAN;
	                case 'simp-chinese-formal':
	                    return LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL;
	                case 'simp-chinese-informal':
	                    return LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL;
	                case 'tamil':
	                    return LIST_STYLE_TYPE.TAMIL;
	                case 'telugu':
	                    return LIST_STYLE_TYPE.TELUGU;
	                case 'thai':
	                    return LIST_STYLE_TYPE.THAI;
	                case 'tibetan':
	                    return LIST_STYLE_TYPE.TIBETAN;
	                case 'trad-chinese-formal':
	                    return LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL;
	                case 'trad-chinese-informal':
	                    return LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL;
	                case 'upper-armenian':
	                    return LIST_STYLE_TYPE.UPPER_ARMENIAN;
	                case 'disclosure-open':
	                    return LIST_STYLE_TYPE.DISCLOSURE_OPEN;
	                case 'disclosure-closed':
	                    return LIST_STYLE_TYPE.DISCLOSURE_CLOSED;
	                case 'none':
	                default:
	                    return LIST_STYLE_TYPE.NONE;
	            }
	        }
	    };
	
	    var marginForSide = function (side) {
	        return ({
	            name: "margin-" + side,
	            initialValue: '0',
	            prefix: false,
	            type: PropertyDescriptorParsingType.TOKEN_VALUE
	        });
	    };
	    var marginTop = marginForSide('top');
	    var marginRight = marginForSide('right');
	    var marginBottom = marginForSide('bottom');
	    var marginLeft = marginForSide('left');
	
	    var OVERFLOW;
	    (function (OVERFLOW) {
	        OVERFLOW[OVERFLOW["VISIBLE"] = 0] = "VISIBLE";
	        OVERFLOW[OVERFLOW["HIDDEN"] = 1] = "HIDDEN";
	        OVERFLOW[OVERFLOW["SCROLL"] = 2] = "SCROLL";
	        OVERFLOW[OVERFLOW["AUTO"] = 3] = "AUTO";
	    })(OVERFLOW || (OVERFLOW = {}));
	    var overflow = {
	        name: 'overflow',
	        initialValue: 'visible',
	        prefix: false,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            return tokens.filter(isIdentToken).map(function (overflow) {
	                switch (overflow.value) {
	                    case 'hidden':
	                        return OVERFLOW.HIDDEN;
	                    case 'scroll':
	                        return OVERFLOW.SCROLL;
	                    case 'auto':
	                        return OVERFLOW.AUTO;
	                    case 'visible':
	                    default:
	                        return OVERFLOW.VISIBLE;
	                }
	            });
	        }
	    };
	
	    var OVERFLOW_WRAP;
	    (function (OVERFLOW_WRAP) {
	        OVERFLOW_WRAP["NORMAL"] = "normal";
	        OVERFLOW_WRAP["BREAK_WORD"] = "break-word";
	    })(OVERFLOW_WRAP || (OVERFLOW_WRAP = {}));
	    var overflowWrap = {
	        name: 'overflow-wrap',
	        initialValue: 'normal',
	        prefix: false,
	        type: PropertyDescriptorParsingType.IDENT_VALUE,
	        parse: function (overflow) {
	            switch (overflow) {
	                case 'break-word':
	                    return OVERFLOW_WRAP.BREAK_WORD;
	                case 'normal':
	                default:
	                    return OVERFLOW_WRAP.NORMAL;
	            }
	        }
	    };
	
	    var paddingForSide = function (side) {
	        return ({
	            name: "padding-" + side,
	            initialValue: '0',
	            prefix: false,
	            type: PropertyDescriptorParsingType.TYPE_VALUE,
	            format: 'length-percentage'
	        });
	    };
	    var paddingTop = paddingForSide('top');
	    var paddingRight = paddingForSide('right');
	    var paddingBottom = paddingForSide('bottom');
	    var paddingLeft = paddingForSide('left');
	
	    var TEXT_ALIGN;
	    (function (TEXT_ALIGN) {
	        TEXT_ALIGN[TEXT_ALIGN["LEFT"] = 0] = "LEFT";
	        TEXT_ALIGN[TEXT_ALIGN["CENTER"] = 1] = "CENTER";
	        TEXT_ALIGN[TEXT_ALIGN["RIGHT"] = 2] = "RIGHT";
	    })(TEXT_ALIGN || (TEXT_ALIGN = {}));
	    var textAlign = {
	        name: 'text-align',
	        initialValue: 'left',
	        prefix: false,
	        type: PropertyDescriptorParsingType.IDENT_VALUE,
	        parse: function (textAlign) {
	            switch (textAlign) {
	                case 'right':
	                    return TEXT_ALIGN.RIGHT;
	                case 'center':
	                case 'justify':
	                    return TEXT_ALIGN.CENTER;
	                case 'left':
	                default:
	                    return TEXT_ALIGN.LEFT;
	            }
	        }
	    };
	
	    var POSITION;
	    (function (POSITION) {
	        POSITION[POSITION["STATIC"] = 0] = "STATIC";
	        POSITION[POSITION["RELATIVE"] = 1] = "RELATIVE";
	        POSITION[POSITION["ABSOLUTE"] = 2] = "ABSOLUTE";
	        POSITION[POSITION["FIXED"] = 3] = "FIXED";
	        POSITION[POSITION["STICKY"] = 4] = "STICKY";
	    })(POSITION || (POSITION = {}));
	    var position = {
	        name: 'position',
	        initialValue: 'static',
	        prefix: false,
	        type: PropertyDescriptorParsingType.IDENT_VALUE,
	        parse: function (position) {
	            switch (position) {
	                case 'relative':
	                    return POSITION.RELATIVE;
	                case 'absolute':
	                    return POSITION.ABSOLUTE;
	                case 'fixed':
	                    return POSITION.FIXED;
	                case 'sticky':
	                    return POSITION.STICKY;
	            }
	            return POSITION.STATIC;
	        }
	    };
	
	    var textShadow = {
	        name: 'text-shadow',
	        initialValue: 'none',
	        type: PropertyDescriptorParsingType.LIST,
	        prefix: false,
	        parse: function (tokens) {
	            if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {
	                return [];
	            }
	            return parseFunctionArgs(tokens).map(function (values) {
	                var shadow = {
	                    color: COLORS.TRANSPARENT,
	                    offsetX: ZERO_LENGTH,
	                    offsetY: ZERO_LENGTH,
	                    blur: ZERO_LENGTH
	                };
	                var c = 0;
	                for (var i = 0; i < values.length; i++) {
	                    var token = values[i];
	                    if (isLength(token)) {
	                        if (c === 0) {
	                            shadow.offsetX = token;
	                        }
	                        else if (c === 1) {
	                            shadow.offsetY = token;
	                        }
	                        else {
	                            shadow.blur = token;
	                        }
	                        c++;
	                    }
	                    else {
	                        shadow.color = color.parse(token);
	                    }
	                }
	                return shadow;
	            });
	        }
	    };
	
	    var TEXT_TRANSFORM;
	    (function (TEXT_TRANSFORM) {
	        TEXT_TRANSFORM[TEXT_TRANSFORM["NONE"] = 0] = "NONE";
	        TEXT_TRANSFORM[TEXT_TRANSFORM["LOWERCASE"] = 1] = "LOWERCASE";
	        TEXT_TRANSFORM[TEXT_TRANSFORM["UPPERCASE"] = 2] = "UPPERCASE";
	        TEXT_TRANSFORM[TEXT_TRANSFORM["CAPITALIZE"] = 3] = "CAPITALIZE";
	    })(TEXT_TRANSFORM || (TEXT_TRANSFORM = {}));
	    var textTransform = {
	        name: 'text-transform',
	        initialValue: 'none',
	        prefix: false,
	        type: PropertyDescriptorParsingType.IDENT_VALUE,
	        parse: function (textTransform) {
	            switch (textTransform) {
	                case 'uppercase':
	                    return TEXT_TRANSFORM.UPPERCASE;
	                case 'lowercase':
	                    return TEXT_TRANSFORM.LOWERCASE;
	                case 'capitalize':
	                    return TEXT_TRANSFORM.CAPITALIZE;
	            }
	            return TEXT_TRANSFORM.NONE;
	        }
	    };
	
	    var transform = {
	        name: 'transform',
	        initialValue: 'none',
	        prefix: true,
	        type: PropertyDescriptorParsingType.VALUE,
	        parse: function (token) {
	            if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {
	                return null;
	            }
	            if (token.type === TokenType.FUNCTION) {
	                var transformFunction = SUPPORTED_TRANSFORM_FUNCTIONS[token.name];
	                if (typeof transformFunction === 'undefined') {
	                    throw new Error("Attempting to parse an unsupported transform function \"" + token.name + "\"");
	                }
	                return transformFunction(token.values);
	            }
	            return null;
	        }
	    };
	    var matrix = function (args) {
	        var values = args.filter(function (arg) { return arg.type === TokenType.NUMBER_TOKEN; }).map(function (arg) { return arg.number; });
	        return values.length === 6 ? values : null;
	    };
	    // doesn't support 3D transforms at the moment
	    var matrix3d = function (args) {
	        var values = args.filter(function (arg) { return arg.type === TokenType.NUMBER_TOKEN; }).map(function (arg) { return arg.number; });
	        var a1 = values[0], b1 = values[1], _a = values[2], _b = values[3], a2 = values[4], b2 = values[5], _c = values[6], _d = values[7], _e = values[8], _f = values[9], _g = values[10], _h = values[11], a4 = values[12], b4 = values[13], _j = values[14], _k = values[15];
	        return values.length === 16 ? [a1, b1, a2, b2, a4, b4] : null;
	    };
	    var SUPPORTED_TRANSFORM_FUNCTIONS = {
	        matrix: matrix,
	        matrix3d: matrix3d
	    };
	
	    var DEFAULT_VALUE = {
	        type: TokenType.PERCENTAGE_TOKEN,
	        number: 50,
	        flags: FLAG_INTEGER
	    };
	    var DEFAULT = [DEFAULT_VALUE, DEFAULT_VALUE];
	    var transformOrigin = {
	        name: 'transform-origin',
	        initialValue: '50% 50%',
	        prefix: true,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            var origins = tokens.filter(isLengthPercentage);
	            if (origins.length !== 2) {
	                return DEFAULT;
	            }
	            return [origins[0], origins[1]];
	        }
	    };
	
	    var VISIBILITY;
	    (function (VISIBILITY) {
	        VISIBILITY[VISIBILITY["VISIBLE"] = 0] = "VISIBLE";
	        VISIBILITY[VISIBILITY["HIDDEN"] = 1] = "HIDDEN";
	        VISIBILITY[VISIBILITY["COLLAPSE"] = 2] = "COLLAPSE";
	    })(VISIBILITY || (VISIBILITY = {}));
	    var visibility = {
	        name: 'visible',
	        initialValue: 'none',
	        prefix: false,
	        type: PropertyDescriptorParsingType.IDENT_VALUE,
	        parse: function (visibility) {
	            switch (visibility) {
	                case 'hidden':
	                    return VISIBILITY.HIDDEN;
	                case 'collapse':
	                    return VISIBILITY.COLLAPSE;
	                case 'visible':
	                default:
	                    return VISIBILITY.VISIBLE;
	            }
	        }
	    };
	
	    var WORD_BREAK;
	    (function (WORD_BREAK) {
	        WORD_BREAK["NORMAL"] = "normal";
	        WORD_BREAK["BREAK_ALL"] = "break-all";
	        WORD_BREAK["KEEP_ALL"] = "keep-all";
	    })(WORD_BREAK || (WORD_BREAK = {}));
	    var wordBreak = {
	        name: 'word-break',
	        initialValue: 'normal',
	        prefix: false,
	        type: PropertyDescriptorParsingType.IDENT_VALUE,
	        parse: function (wordBreak) {
	            switch (wordBreak) {
	                case 'break-all':
	                    return WORD_BREAK.BREAK_ALL;
	                case 'keep-all':
	                    return WORD_BREAK.KEEP_ALL;
	                case 'normal':
	                default:
	                    return WORD_BREAK.NORMAL;
	            }
	        }
	    };
	
	    var zIndex = {
	        name: 'z-index',
	        initialValue: 'auto',
	        prefix: false,
	        type: PropertyDescriptorParsingType.VALUE,
	        parse: function (token) {
	            if (token.type === TokenType.IDENT_TOKEN) {
	                return { auto: true, order: 0 };
	            }
	            if (isNumberToken(token)) {
	                return { auto: false, order: token.number };
	            }
	            throw new Error("Invalid z-index number parsed");
	        }
	    };
	
	    var opacity = {
	        name: 'opacity',
	        initialValue: '1',
	        type: PropertyDescriptorParsingType.VALUE,
	        prefix: false,
	        parse: function (token) {
	            if (isNumberToken(token)) {
	                return token.number;
	            }
	            return 1;
	        }
	    };
	
	    var textDecorationColor = {
	        name: "text-decoration-color",
	        initialValue: 'transparent',
	        prefix: false,
	        type: PropertyDescriptorParsingType.TYPE_VALUE,
	        format: 'color'
	    };
	
	    var textDecorationLine = {
	        name: 'text-decoration-line',
	        initialValue: 'none',
	        prefix: false,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            return tokens
	                .filter(isIdentToken)
	                .map(function (token) {
	                    switch (token.value) {
	                        case 'underline':
	                            return 1 /* UNDERLINE */;
	                        case 'overline':
	                            return 2 /* OVERLINE */;
	                        case 'line-through':
	                            return 3 /* LINE_THROUGH */;
	                        case 'none':
	                            return 4 /* BLINK */;
	                    }
	                    return 0 /* NONE */;
	                })
	                .filter(function (line) { return line !== 0 /* NONE */; });
	        }
	    };
	
	    var fontFamily = {
	        name: "font-family",
	        initialValue: '',
	        prefix: false,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            return tokens.filter(isStringToken$1).map(function (token) { return token.value; });
	        }
	    };
	    var isStringToken$1 = function (token) {
	        return token.type === TokenType.STRING_TOKEN || token.type === TokenType.IDENT_TOKEN;
	    };
	
	    var fontSize = {
	        name: "font-size",
	        initialValue: '0',
	        prefix: false,
	        type: PropertyDescriptorParsingType.TYPE_VALUE,
	        format: 'length'
	    };
	
	    var fontWeight = {
	        name: 'font-weight',
	        initialValue: 'normal',
	        type: PropertyDescriptorParsingType.VALUE,
	        prefix: false,
	        parse: function (token) {
	            if (isNumberToken(token)) {
	                return token.number;
	            }
	            if (isIdentToken(token)) {
	                switch (token.value) {
	                    case 'bold':
	                        return 700;
	                    case 'normal':
	                    default:
	                        return 400;
	                }
	            }
	            return 400;
	        }
	    };
	
	    var fontVariant = {
	        name: 'font-variant',
	        initialValue: 'none',
	        type: PropertyDescriptorParsingType.LIST,
	        prefix: false,
	        parse: function (tokens) {
	            return tokens.filter(isIdentToken).map(function (token) { return token.value; });
	        }
	    };
	
	    var FONT_STYLE;
	    (function (FONT_STYLE) {
	        FONT_STYLE["NORMAL"] = "normal";
	        FONT_STYLE["ITALIC"] = "italic";
	        FONT_STYLE["OBLIQUE"] = "oblique";
	    })(FONT_STYLE || (FONT_STYLE = {}));
	    var fontStyle = {
	        name: 'font-style',
	        initialValue: 'normal',
	        prefix: false,
	        type: PropertyDescriptorParsingType.IDENT_VALUE,
	        parse: function (overflow) {
	            switch (overflow) {
	                case 'oblique':
	                    return FONT_STYLE.OBLIQUE;
	                case 'italic':
	                    return FONT_STYLE.ITALIC;
	                case 'normal':
	                default:
	                    return FONT_STYLE.NORMAL;
	            }
	        }
	    };
	
	    var contains = function (bit, value) { return (bit & value) !== 0; };
	
	    var content = {
	        name: 'content',
	        initialValue: 'none',
	        type: PropertyDescriptorParsingType.LIST,
	        prefix: false,
	        parse: function (tokens) {
	            if (tokens.length === 0) {
	                return [];
	            }
	            var first = tokens[0];
	            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
	                return [];
	            }
	            return tokens;
	        }
	    };
	
	    var counterIncrement = {
	        name: 'counter-increment',
	        initialValue: 'none',
	        prefix: true,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            if (tokens.length === 0) {
	                return null;
	            }
	            var first = tokens[0];
	            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
	                return null;
	            }
	            var increments = [];
	            var filtered = tokens.filter(nonWhiteSpace);
	            for (var i = 0; i < filtered.length; i++) {
	                var counter = filtered[i];
	                var next = filtered[i + 1];
	                if (counter.type === TokenType.IDENT_TOKEN) {
	                    var increment = next && isNumberToken(next) ? next.number : 1;
	                    increments.push({ counter: counter.value, increment: increment });
	                }
	            }
	            return increments;
	        }
	    };
	
	    var counterReset = {
	        name: 'counter-reset',
	        initialValue: 'none',
	        prefix: true,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            if (tokens.length === 0) {
	                return [];
	            }
	            var resets = [];
	            var filtered = tokens.filter(nonWhiteSpace);
	            for (var i = 0; i < filtered.length; i++) {
	                var counter = filtered[i];
	                var next = filtered[i + 1];
	                if (isIdentToken(counter) && counter.value !== 'none') {
	                    var reset = next && isNumberToken(next) ? next.number : 0;
	                    resets.push({ counter: counter.value, reset: reset });
	                }
	            }
	            return resets;
	        }
	    };
	
	    var quotes = {
	        name: 'quotes',
	        initialValue: 'none',
	        prefix: true,
	        type: PropertyDescriptorParsingType.LIST,
	        parse: function (tokens) {
	            if (tokens.length === 0) {
	                return null;
	            }
	            var first = tokens[0];
	            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
	                return null;
	            }
	            var quotes = [];
	            var filtered = tokens.filter(isStringToken);
	            if (filtered.length % 2 !== 0) {
	                return null;
	            }
	            for (var i = 0; i < filtered.length; i += 2) {
	                var open_1 = filtered[i].value;
	                var close_1 = filtered[i + 1].value;
	                quotes.push({ open: open_1, close: close_1 });
	            }
	            return quotes;
	        }
	    };
	    var getQuote = function (quotes, depth, open) {
	        if (!quotes) {
	            return '';
	        }
	        var quote = quotes[Math.min(depth, quotes.length - 1)];
	        if (!quote) {
	            return '';
	        }
	        return open ? quote.open : quote.close;
	    };
	
	    var boxShadow = {
	        name: 'box-shadow',
	        initialValue: 'none',
	        type: PropertyDescriptorParsingType.LIST,
	        prefix: false,
	        parse: function (tokens) {
	            if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {
	                return [];
	            }
	            return parseFunctionArgs(tokens).map(function (values) {
	                var shadow = {
	                    color: 0x000000ff,
	                    offsetX: ZERO_LENGTH,
	                    offsetY: ZERO_LENGTH,
	                    blur: ZERO_LENGTH,
	                    spread: ZERO_LENGTH,
	                    inset: false
	                };
	                var c = 0;
	                for (var i = 0; i < values.length; i++) {
	                    var token = values[i];
	                    if (isIdentWithValue(token, 'inset')) {
	                        shadow.inset = true;
	                    }
	                    else if (isLength(token)) {
	                        if (c === 0) {
	                            shadow.offsetX = token;
	                        }
	                        else if (c === 1) {
	                            shadow.offsetY = token;
	                        }
	                        else if (c === 2) {
	                            shadow.blur = token;
	                        }
	                        else {
	                            shadow.spread = token;
	                        }
	                        c++;
	                    }
	                    else {
	                        shadow.color = color.parse(token);
	                    }
	                }
	                return shadow;
	            });
	        }
	    };
	
	    var CSSParsedDeclaration = /** @class */ (function () {
	        function CSSParsedDeclaration(declaration) {
	            this.backgroundClip = parse(backgroundClip, declaration.backgroundClip);
	            this.backgroundColor = parse(backgroundColor, declaration.backgroundColor);
	            this.backgroundImage = parse(backgroundImage, declaration.backgroundImage);
	            this.backgroundOrigin = parse(backgroundOrigin, declaration.backgroundOrigin);
	            this.backgroundPosition = parse(backgroundPosition, declaration.backgroundPosition);
	            this.backgroundRepeat = parse(backgroundRepeat, declaration.backgroundRepeat);
	            this.backgroundSize = parse(backgroundSize, declaration.backgroundSize);
	            this.borderTopColor = parse(borderTopColor, declaration.borderTopColor);
	            this.borderRightColor = parse(borderRightColor, declaration.borderRightColor);
	            this.borderBottomColor = parse(borderBottomColor, declaration.borderBottomColor);
	            this.borderLeftColor = parse(borderLeftColor, declaration.borderLeftColor);
	            this.borderTopLeftRadius = parse(borderTopLeftRadius, declaration.borderTopLeftRadius);
	            this.borderTopRightRadius = parse(borderTopRightRadius, declaration.borderTopRightRadius);
	            this.borderBottomRightRadius = parse(borderBottomRightRadius, declaration.borderBottomRightRadius);
	            this.borderBottomLeftRadius = parse(borderBottomLeftRadius, declaration.borderBottomLeftRadius);
	            this.borderTopStyle = parse(borderTopStyle, declaration.borderTopStyle);
	            this.borderRightStyle = parse(borderRightStyle, declaration.borderRightStyle);
	            this.borderBottomStyle = parse(borderBottomStyle, declaration.borderBottomStyle);
	            this.borderLeftStyle = parse(borderLeftStyle, declaration.borderLeftStyle);
	            this.borderTopWidth = parse(borderTopWidth, declaration.borderTopWidth);
	            this.borderRightWidth = parse(borderRightWidth, declaration.borderRightWidth);
	            this.borderBottomWidth = parse(borderBottomWidth, declaration.borderBottomWidth);
	            this.borderLeftWidth = parse(borderLeftWidth, declaration.borderLeftWidth);
	            this.boxShadow = parse(boxShadow, declaration.boxShadow);
	            this.color = parse(color$1, declaration.color);
	            this.display = parse(display, declaration.display);
	            this.float = parse(float, declaration.cssFloat);
	            this.fontFamily = parse(fontFamily, declaration.fontFamily);
	            this.fontSize = parse(fontSize, declaration.fontSize);
	            this.fontStyle = parse(fontStyle, declaration.fontStyle);
	            this.fontVariant = parse(fontVariant, declaration.fontVariant);
	            this.fontWeight = parse(fontWeight, declaration.fontWeight);
	            this.letterSpacing = parse(letterSpacing, declaration.letterSpacing);
	            this.lineBreak = parse(lineBreak, declaration.lineBreak);
	            this.lineHeight = parse(lineHeight, declaration.lineHeight);
	            this.listStyleImage = parse(listStyleImage, declaration.listStyleImage);
	            this.listStylePosition = parse(listStylePosition, declaration.listStylePosition);
	            this.listStyleType = parse(listStyleType, declaration.listStyleType);
	            this.marginTop = parse(marginTop, declaration.marginTop);
	            this.marginRight = parse(marginRight, declaration.marginRight);
	            this.marginBottom = parse(marginBottom, declaration.marginBottom);
	            this.marginLeft = parse(marginLeft, declaration.marginLeft);
	            this.opacity = parse(opacity, declaration.opacity);
	            var overflowTuple = parse(overflow, declaration.overflow);
	            this.overflowX = overflowTuple[0];
	            this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0];
	            this.overflowWrap = parse(overflowWrap, declaration.overflowWrap);
	            this.paddingTop = parse(paddingTop, declaration.paddingTop);
	            this.paddingRight = parse(paddingRight, declaration.paddingRight);
	            this.paddingBottom = parse(paddingBottom, declaration.paddingBottom);
	            this.paddingLeft = parse(paddingLeft, declaration.paddingLeft);
	            this.position = parse(position, declaration.position);
	            this.textAlign = parse(textAlign, declaration.textAlign);
	            this.textDecorationColor = parse(textDecorationColor, declaration.textDecorationColor || declaration.color);
	            this.textDecorationLine = parse(textDecorationLine, declaration.textDecorationLine);
	            this.textShadow = parse(textShadow, declaration.textShadow);
	            this.textTransform = parse(textTransform, declaration.textTransform);
	            this.transform = parse(transform, declaration.transform);
	            this.transformOrigin = parse(transformOrigin, declaration.transformOrigin);
	            this.visibility = parse(visibility, declaration.visibility);
	            this.wordBreak = parse(wordBreak, declaration.wordBreak);
	            this.zIndex = parse(zIndex, declaration.zIndex);
	        }
	        CSSParsedDeclaration.prototype.isVisible = function () {
	            return this.display > 0 && this.opacity > 0 && this.visibility === VISIBILITY.VISIBLE;
	        };
	        CSSParsedDeclaration.prototype.isTransparent = function () {
	            return isTransparent(this.backgroundColor);
	        };
	        CSSParsedDeclaration.prototype.isTransformed = function () {
	            return this.transform !== null;
	        };
	        CSSParsedDeclaration.prototype.isPositioned = function () {
	            return this.position !== POSITION.STATIC;
	        };
	        CSSParsedDeclaration.prototype.isPositionedWithZIndex = function () {
	            return this.isPositioned() && !this.zIndex.auto;
	        };
	        CSSParsedDeclaration.prototype.isFloating = function () {
	            return this.float !== FLOAT.NONE;
	        };
	        CSSParsedDeclaration.prototype.isInlineLevel = function () {
	            return (contains(this.display, 4 /* INLINE */) ||
	                contains(this.display, 33554432 /* INLINE_BLOCK */) ||
	                contains(this.display, 268435456 /* INLINE_FLEX */) ||
	                contains(this.display, 536870912 /* INLINE_GRID */) ||
	                contains(this.display, 67108864 /* INLINE_LIST_ITEM */) ||
	                contains(this.display, 134217728 /* INLINE_TABLE */));
	        };
	        return CSSParsedDeclaration;
	    }());
	    var CSSParsedPseudoDeclaration = /** @class */ (function () {
	        function CSSParsedPseudoDeclaration(declaration) {
	            this.content = parse(content, declaration.content);
	            this.quotes = parse(quotes, declaration.quotes);
	        }
	        return CSSParsedPseudoDeclaration;
	    }());
	    var CSSParsedCounterDeclaration = /** @class */ (function () {
	        function CSSParsedCounterDeclaration(declaration) {
	            this.counterIncrement = parse(counterIncrement, declaration.counterIncrement);
	            this.counterReset = parse(counterReset, declaration.counterReset);
	        }
	        return CSSParsedCounterDeclaration;
	    }());
	    // eslint-disable-next-line @typescript-eslint/no-explicit-any
	    var parse = function (descriptor, style) {
	        var tokenizer = new Tokenizer();
	        var value = style !== null && typeof style !== 'undefined' ? style.toString() : descriptor.initialValue;
	        tokenizer.write(value);
	        var parser = new Parser(tokenizer.read());
	        switch (descriptor.type) {
	            case PropertyDescriptorParsingType.IDENT_VALUE:
	                var token = parser.parseComponentValue();
	                return descriptor.parse(isIdentToken(token) ? token.value : descriptor.initialValue);
	            case PropertyDescriptorParsingType.VALUE:
	                return descriptor.parse(parser.parseComponentValue());
	            case PropertyDescriptorParsingType.LIST:
	                return descriptor.parse(parser.parseComponentValues());
	            case PropertyDescriptorParsingType.TOKEN_VALUE:
	                return parser.parseComponentValue();
	            case PropertyDescriptorParsingType.TYPE_VALUE:
	                switch (descriptor.format) {
	                    case 'angle':
	                        return angle.parse(parser.parseComponentValue());
	                    case 'color':
	                        return color.parse(parser.parseComponentValue());
	                    case 'image':
	                        return image.parse(parser.parseComponentValue());
	                    case 'length':
	                        var length_1 = parser.parseComponentValue();
	                        return isLength(length_1) ? length_1 : ZERO_LENGTH;
	                    case 'length-percentage':
	                        var value_1 = parser.parseComponentValue();
	                        return isLengthPercentage(value_1) ? value_1 : ZERO_LENGTH;
	                }
	        }
	        throw new Error("Attempting to parse unsupported css format type " + descriptor.format);
	    };
	
	    var ElementContainer = /** @class */ (function () {
	        function ElementContainer(element) {
	            this.styles = new CSSParsedDeclaration(window.getComputedStyle(element, null));
	            this.textNodes = [];
	            this.elements = [];
	            if (this.styles.transform !== null && isHTMLElementNode(element)) {
	                // getBoundingClientRect takes transforms into account
	                element.style.transform = 'none';
	            }
	            this.bounds = parseBounds(element);
	            this.flags = 0;
	        }
	        return ElementContainer;
	    }());
	
	    var TextBounds = /** @class */ (function () {
	        function TextBounds(text, bounds) {
	            this.text = text;
	            this.bounds = bounds;
	        }
	        return TextBounds;
	    }());
	    var parseTextBounds = function (value, styles, node) {
	        var textList = breakText(value, styles);
	        var textBounds = [];
	        var offset = 0;
	        textList.forEach(function (text) {
	            if (styles.textDecorationLine.length || text.trim().length > 0) {
	                if (FEATURES.SUPPORT_RANGE_BOUNDS) {
	                    textBounds.push(new TextBounds(text, getRangeBounds(node, offset, text.length)));
	                }
	                else {
	                    var replacementNode = node.splitText(text.length);
	                    textBounds.push(new TextBounds(text, getWrapperBounds(node)));
	                    node = replacementNode;
	                }
	            }
	            else if (!FEATURES.SUPPORT_RANGE_BOUNDS) {
	                node = node.splitText(text.length);
	            }
	            offset += text.length;
	        });
	        return textBounds;
	    };
	    var getWrapperBounds = function (node) {
	        var ownerDocument = node.ownerDocument;
	        if (ownerDocument) {
	            var wrapper = ownerDocument.createElement('html2canvaswrapper');
	            wrapper.appendChild(node.cloneNode(true));
	            var parentNode = node.parentNode;
	            if (parentNode) {
	                parentNode.replaceChild(wrapper, node);
	                var bounds = parseBounds(wrapper);
	                if (wrapper.firstChild) {
	                    parentNode.replaceChild(wrapper.firstChild, wrapper);
	                }
	                return bounds;
	            }
	        }
	        return new Bounds(0, 0, 0, 0);
	    };
	    var getRangeBounds = function (node, offset, length) {
	        var ownerDocument = node.ownerDocument;
	        if (!ownerDocument) {
	            throw new Error('Node has no owner document');
	        }
	        var range = ownerDocument.createRange();
	        range.setStart(node, offset);
	        range.setEnd(node, offset + length);
	        return Bounds.fromClientRect(range.getBoundingClientRect());
	    };
	    var breakText = function (value, styles) {
	        return styles.letterSpacing !== 0 ? toCodePoints(value).map(function (i) { return fromCodePoint(i); }) : breakWords(value, styles);
	    };
	    var breakWords = function (str, styles) {
	        var breaker = LineBreaker(str, {
	            lineBreak: styles.lineBreak,
	            wordBreak: styles.overflowWrap === OVERFLOW_WRAP.BREAK_WORD ? 'break-word' : styles.wordBreak
	        });
	        var words = [];
	        var bk;
	        while (!(bk = breaker.next()).done) {
	            if (bk.value) {
	                words.push(bk.value.slice());
	            }
	        }
	        return words;
	    };
	
	    var TextContainer = /** @class */ (function () {
	        function TextContainer(node, styles) {
	            this.text = transform$1(node.data, styles.textTransform);
	            this.textBounds = parseTextBounds(this.text, styles, node);
	        }
	        return TextContainer;
	    }());
	    var transform$1 = function (text, transform) {
	        switch (transform) {
	            case TEXT_TRANSFORM.LOWERCASE:
	                return text.toLowerCase();
	            case TEXT_TRANSFORM.CAPITALIZE:
	                return text.replace(CAPITALIZE, capitalize);
	            case TEXT_TRANSFORM.UPPERCASE:
	                return text.toUpperCase();
	            default:
	                return text;
	        }
	    };
	    var CAPITALIZE = /(^|\s|:|-|\(|\))([a-z])/g;
	    var capitalize = function (m, p1, p2) {
	        if (m.length > 0) {
	            return p1 + p2.toUpperCase();
	        }
	        return m;
	    };
	
	    var ImageElementContainer = /** @class */ (function (_super) {
	        __extends(ImageElementContainer, _super);
	        function ImageElementContainer(img) {
	            var _this = _super.call(this, img) || this;
	            _this.src = img.currentSrc || img.src;
	            _this.intrinsicWidth = img.naturalWidth;
	            _this.intrinsicHeight = img.naturalHeight;
	            CacheStorage.getInstance().addImage(_this.src);
	            return _this;
	        }
	        return ImageElementContainer;
	    }(ElementContainer));
	
	    var CanvasElementContainer = /** @class */ (function (_super) {
	        __extends(CanvasElementContainer, _super);
	        function CanvasElementContainer(canvas) {
	            var _this = _super.call(this, canvas) || this;
	            _this.canvas = canvas;
	            _this.intrinsicWidth = canvas.width;
	            _this.intrinsicHeight = canvas.height;
	            return _this;
	        }
	        return CanvasElementContainer;
	    }(ElementContainer));
	
	    var SVGElementContainer = /** @class */ (function (_super) {
	        __extends(SVGElementContainer, _super);
	        function SVGElementContainer(img) {
	            var _this = _super.call(this, img) || this;
	            var s = new XMLSerializer();
	            _this.svg = "data:image/svg+xml," + encodeURIComponent(s.serializeToString(img));
	            _this.intrinsicWidth = img.width.baseVal.value;
	            _this.intrinsicHeight = img.height.baseVal.value;
	            CacheStorage.getInstance().addImage(_this.svg);
	            return _this;
	        }
	        return SVGElementContainer;
	    }(ElementContainer));
	
	    var LIElementContainer = /** @class */ (function (_super) {
	        __extends(LIElementContainer, _super);
	        function LIElementContainer(element) {
	            var _this = _super.call(this, element) || this;
	            _this.value = element.value;
	            return _this;
	        }
	        return LIElementContainer;
	    }(ElementContainer));
	
	    var OLElementContainer = /** @class */ (function (_super) {
	        __extends(OLElementContainer, _super);
	        function OLElementContainer(element) {
	            var _this = _super.call(this, element) || this;
	            _this.start = element.start;
	            _this.reversed = typeof element.reversed === 'boolean' && element.reversed === true;
	            return _this;
	        }
	        return OLElementContainer;
	    }(ElementContainer));
	
	    var CHECKBOX_BORDER_RADIUS = [
	        {
	            type: TokenType.DIMENSION_TOKEN,
	            flags: 0,
	            unit: 'px',
	            number: 3
	        }
	    ];
	    var RADIO_BORDER_RADIUS = [
	        {
	            type: TokenType.PERCENTAGE_TOKEN,
	            flags: 0,
	            number: 50
	        }
	    ];
	    var reformatInputBounds = function (bounds) {
	        if (bounds.width > bounds.height) {
	            return new Bounds(bounds.left + (bounds.width - bounds.height) / 2, bounds.top, bounds.height, bounds.height);
	        }
	        else if (bounds.width < bounds.height) {
	            return new Bounds(bounds.left, bounds.top + (bounds.height - bounds.width) / 2, bounds.width, bounds.width);
	        }
	        return bounds;
	    };
	    var getInputValue = function (node) {
	        var value = node.type === PASSWORD ? new Array(node.value.length + 1).join('\u2022') : node.value;
	        return value.length === 0 ? node.placeholder || '' : value;
	    };
	    var CHECKBOX = 'checkbox';
	    var RADIO = 'radio';
	    var PASSWORD = 'password';
	    var INPUT_COLOR = 0x2a2a2aff;
	    var InputElementContainer = /** @class */ (function (_super) {
	        __extends(InputElementContainer, _super);
	        function InputElementContainer(input) {
	            var _this = _super.call(this, input) || this;
	            _this.type = input.type.toLowerCase();
	            _this.checked = input.checked;
	            _this.value = getInputValue(input);
	            if (_this.type === CHECKBOX || _this.type === RADIO) {
	                _this.styles.backgroundColor = 0xdededeff;
	                _this.styles.borderTopColor = _this.styles.borderRightColor = _this.styles.borderBottomColor = _this.styles.borderLeftColor = 0xa5a5a5ff;
	                _this.styles.borderTopWidth = _this.styles.borderRightWidth = _this.styles.borderBottomWidth = _this.styles.borderLeftWidth = 1;
	                _this.styles.borderTopStyle = _this.styles.borderRightStyle = _this.styles.borderBottomStyle = _this.styles.borderLeftStyle =
	                    BORDER_STYLE.SOLID;
	                _this.styles.backgroundClip = [BACKGROUND_CLIP.BORDER_BOX];
	                _this.styles.backgroundOrigin = [0 /* BORDER_BOX */];
	                _this.bounds = reformatInputBounds(_this.bounds);
	            }
	            switch (_this.type) {
	                case CHECKBOX:
	                    _this.styles.borderTopRightRadius = _this.styles.borderTopLeftRadius = _this.styles.borderBottomRightRadius = _this.styles.borderBottomLeftRadius = CHECKBOX_BORDER_RADIUS;
	                    break;
	                case RADIO:
	                    _this.styles.borderTopRightRadius = _this.styles.borderTopLeftRadius = _this.styles.borderBottomRightRadius = _this.styles.borderBottomLeftRadius = RADIO_BORDER_RADIUS;
	                    break;
	            }
	            return _this;
	        }
	        return InputElementContainer;
	    }(ElementContainer));
	
	    var SelectElementContainer = /** @class */ (function (_super) {
	        __extends(SelectElementContainer, _super);
	        function SelectElementContainer(element) {
	            var _this = _super.call(this, element) || this;
	            var option = element.options[element.selectedIndex || 0];
	            _this.value = option ? option.text || '' : '';
	            return _this;
	        }
	        return SelectElementContainer;
	    }(ElementContainer));
	
	    var TextareaElementContainer = /** @class */ (function (_super) {
	        __extends(TextareaElementContainer, _super);
	        function TextareaElementContainer(element) {
	            var _this = _super.call(this, element) || this;
	            _this.value = element.value;
	            return _this;
	        }
	        return TextareaElementContainer;
	    }(ElementContainer));
	
	    var parseColor = function (value) { return color.parse(Parser.create(value).parseComponentValue()); };
	    var IFrameElementContainer = /** @class */ (function (_super) {
	        __extends(IFrameElementContainer, _super);
	        function IFrameElementContainer(iframe) {
	            var _this = _super.call(this, iframe) || this;
	            _this.src = iframe.src;
	            _this.width = parseInt(iframe.width, 10) || 0;
	            _this.height = parseInt(iframe.height, 10) || 0;
	            _this.backgroundColor = _this.styles.backgroundColor;
	            try {
	                if (iframe.contentWindow &&
	                    iframe.contentWindow.document &&
	                    iframe.contentWindow.document.documentElement) {
	                    _this.tree = parseTree(iframe.contentWindow.document.documentElement);
	                    // http://www.w3.org/TR/css3-background/#special-backgrounds
	                    var documentBackgroundColor = iframe.contentWindow.document.documentElement
	                        ? parseColor(getComputedStyle(iframe.contentWindow.document.documentElement)
	                            .backgroundColor)
	                        : COLORS.TRANSPARENT;
	                    var bodyBackgroundColor = iframe.contentWindow.document.body
	                        ? parseColor(getComputedStyle(iframe.contentWindow.document.body).backgroundColor)
	                        : COLORS.TRANSPARENT;
	                    _this.backgroundColor = isTransparent(documentBackgroundColor)
	                        ? isTransparent(bodyBackgroundColor)
	                            ? _this.styles.backgroundColor
	                            : bodyBackgroundColor
	                        : documentBackgroundColor;
	                }
	            }
	            catch (e) { }
	            return _this;
	        }
	        return IFrameElementContainer;
	    }(ElementContainer));
	
	    var LIST_OWNERS = ['OL', 'UL', 'MENU'];
	    var parseNodeTree = function (node, parent, root) {
	        for (var childNode = node.firstChild, nextNode = void 0; childNode; childNode = nextNode) {
	            nextNode = childNode.nextSibling;
	            if (isTextNode(childNode) && childNode.data.trim().length > 0) {
	                parent.textNodes.push(
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐