UNPKG

@gorniv/ngx-universal

Version:
166 lines 18.7 kB
import { Injectable } from '@angular/core'; import { isBlank, isString, mergeOptions, safeDecodeURIComponent, safeJsonParse } from './utils'; import * as i0 from "@angular/core"; import * as i1 from "./cookie-options-provider"; export class CookieService { constructor(_optionsProvider) { this._optionsProvider = _optionsProvider; this.options = this._optionsProvider.options; } get cookieString() { return document.cookie || ''; } set cookieString(val) { document.cookie = val; } /** * @name CookieService#get * * @description * Returns the value of given cookie key. * * @param key Id to use for lookup. * @returns Raw cookie value. */ get(key) { return this._cookieReader()[key]; } /** * @name CookieService#getObject * * @description * Returns the deserialized value of given cookie key. * * @param key Id to use for lookup. * @returns Deserialized cookie value. */ getObject(key) { const value = this.get(key); return value ? safeJsonParse(value) : value; } /** * @name CookieService#getAll * * @description * Returns a key value object with all the cookies. * * @returns All cookies */ getAll() { return this._cookieReader(); } /** * @name CookieService#put * * @description * Sets a value for given cookie key. * * @param key Id for the `value`. * @param value Raw value to be stored. * @param options (Optional) Options object. */ put(key, value, options) { this._cookieWriter()(key, value, options); } /** * @name CookieService#putObject * * @description * Serializes and sets a value for given cookie key. * * @param key Id for the `value`. * @param value Value to be stored. * @param options (Optional) Options object. */ putObject(key, value, options) { this.put(key, JSON.stringify(value), options); } /** * @name CookieService#remove * * @description * Remove given cookie. * * @param key Id of the key-value pair to delete. * @param options (Optional) Options object. */ remove(key, options) { this._cookieWriter()(key, undefined, options); } /** * @name CookieService#removeAll * * @description * Remove all cookies. */ removeAll(options) { const cookies = this.getAll(); Object.keys(cookies).forEach(key => { this.remove(key, options); }); } _cookieReader() { let lastCookies = {}; let lastCookieString = ''; let cookieArray, cookie, i, index, name; const currentCookieString = this.cookieString; if (currentCookieString !== lastCookieString) { lastCookieString = currentCookieString; cookieArray = lastCookieString.split('; '); lastCookies = {}; for (i = 0; i < cookieArray.length; i++) { cookie = cookieArray[i]; index = cookie.indexOf('='); if (index > 0) { // ignore nameless cookies name = safeDecodeURIComponent(cookie.substring(0, index)); // the first value that is seen for a cookie is the most // specific one. values for the same cookie name that // follow are for less specific paths. if (isBlank(lastCookies[name])) { lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)); } } } } return lastCookies; } _cookieWriter() { const that = this; return function (name, value, options) { that.cookieString = that._buildCookieString(name, value, options); }; } _buildCookieString(name, value, options) { const opts = mergeOptions(this.options, options); let expires = opts.expires; if (isBlank(value)) { expires = 'Thu, 01 Jan 1970 00:00:00 GMT'; value = ''; } if (isString(expires)) { expires = new Date(expires); } const cookieValue = opts.storeUnencoded ? value : encodeURIComponent(value || ''); let str = encodeURIComponent(name) + '=' + cookieValue; str += opts.path ? ';path=' + opts.path : ''; str += opts.domain ? ';domain=' + opts.domain : ''; str += expires ? ';expires=' + expires.toUTCString() : ''; str += opts.secure ? ';secure' : ''; str += opts.httpOnly ? '; HttpOnly' : ''; // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum: // - 300 cookies // - 20 cookies per unique domain // - 4096 bytes per cookie const cookieLength = str.length + 1; if (cookieLength > 4096) { console.log(`Cookie \'${name}\' possibly not set or overflowed because it was too large (${cookieLength} > 4096 bytes)!`); } return str; } } CookieService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CookieService, deps: [{ token: i1.CookieOptionsProvider }], target: i0.ɵɵFactoryTarget.Injectable }); CookieService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CookieService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CookieService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.CookieOptionsProvider }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvc3JjL2Nvb2tpZS9jb29raWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7OztBQWtCakcsTUFBTSxPQUFPLGFBQWE7SUFZeEIsWUFBb0IsZ0JBQXVDO1FBQXZDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBdUI7UUFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO0lBQy9DLENBQUM7SUFWRCxJQUFjLFlBQVk7UUFDeEIsT0FBTyxRQUFRLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBYyxZQUFZLENBQUMsR0FBVztRQUNwQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBTUQ7Ozs7Ozs7O09BUUc7SUFDSCxHQUFHLENBQUMsR0FBVztRQUNiLE9BQWEsSUFBSSxDQUFDLGFBQWEsRUFBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFNBQVMsQ0FBQyxHQUFXO1FBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTTtRQUNKLE9BQVksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7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R0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNwQyxJQUFJLFlBQVksR0FBRyxJQUFJLEVBQUU7WUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksK0RBQStELFlBQVksaUJBQWlCLENBQUMsQ0FBQztTQUMzSDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7MEdBMUtVLGFBQWE7OEdBQWIsYUFBYTsyRkFBYixhQUFhO2tCQUR6QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb29raWVPcHRpb25zUHJvdmlkZXIgfSBmcm9tICcuL2Nvb2tpZS1vcHRpb25zLXByb3ZpZGVyJztcbmltcG9ydCB7IENvb2tpZU9wdGlvbnMgfSBmcm9tICcuL2Nvb2tpZS1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IGlzQmxhbmssIGlzU3RyaW5nLCBtZXJnZU9wdGlvbnMsIHNhZmVEZWNvZGVVUklDb21wb25lbnQsIHNhZmVKc29uUGFyc2UgfSBmcm9tICcuL3V0aWxzJztcblxuZGVjbGFyZSBpbnRlcmZhY2UgRG9jdW1lbnQge1xuICBjb29raWU6IHN0cmluZztcbn1cbmRlY2xhcmUgY29uc3QgZG9jdW1lbnQ6IERvY3VtZW50O1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb29raWVTZXJ2aWNlIHtcbiAgZ2V0KGtleTogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRPYmplY3Qoa2V5OiBzdHJpbmcpOiBPYmplY3Q7XG4gIGdldEFsbCgpOiBPYmplY3Q7XG4gIHB1dChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IENvb2tpZU9wdGlvbnMpOiB2b2lkO1xuICBwdXRPYmplY3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiBPYmplY3QsIG9wdGlvbnM/OiBDb29raWVPcHRpb25zKTogdm9pZDtcbiAgcmVtb3ZlKGtleTogc3RyaW5nLCBvcHRpb25zPzogQ29va2llT3B0aW9ucyk6IHZvaWQ7XG4gIHJlbW92ZUFsbChvcHRpb25zPzogQ29va2llT3B0aW9ucyk6IHZvaWQ7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb29raWVTZXJ2aWNlIGltcGxlbWVudHMgSUNvb2tpZVNlcnZpY2Uge1xuXG4gIHByb3RlY3RlZCBvcHRpb25zOiBDb29raWVPcHRpb25zO1xuXG4gIHByb3RlY3RlZCBnZXQgY29va2llU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNvb2tpZSB8fCAnJztcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXQgY29va2llU3RyaW5nKHZhbDogc3RyaW5nKSB7XG4gICAgZG9jdW1lbnQuY29va2llID0gdmFsO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfb3B0aW9uc1Byb3ZpZGVyOiBDb29raWVPcHRpb25zUHJvdmlkZXIpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLl9vcHRpb25zUHJvdmlkZXIub3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSBDb29raWVTZXJ2aWNlI2dldFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgZ2l2ZW4gY29va2llIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGtleSBJZCB0byB1c2UgZm9yIGxvb2t1cC5cbiAgICogQHJldHVybnMgUmF3IGNvb2tpZSB2YWx1ZS5cbiAgICovXG4gIGdldChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICg8YW55PnRoaXMuX2Nvb2tpZVJlYWRlcigpKVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIENvb2tpZVNlcnZpY2UjZ2V0T2JqZWN0XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm5zIHRoZSBkZXNlcmlhbGl6ZWQgdmFsdWUgb2YgZ2l2ZW4gY29va2llIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGtleSBJZCB0byB1c2UgZm9yIGxvb2t1cC5cbiAgICogQHJldHVybnMgRGVzZXJpYWxpemVkIGNvb2tpZSB2YWx1ZS5cbiAgICovXG4gIGdldE9iamVjdChrZXk6IHN0cmluZyk6IE9iamVjdCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChrZXkpO1xuICAgIHJldHVybiB2YWx1ZSA/IHNhZmVKc29uUGFyc2UodmFsdWUpIDogdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgQ29va2llU2VydmljZSNnZXRBbGxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybnMgYSBrZXkgdmFsdWUgb2JqZWN0IHdpdGggYWxsIHRoZSBjb29raWVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBbGwgY29va2llc1xuICAgKi9cbiAgZ2V0QWxsKCk6IE9iamVjdCB7XG4gICAgcmV0dXJuIDxhbnk+dGhpcy5fY29va2llUmVhZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgQ29va2llU2VydmljZSNwdXRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSB2YWx1ZSBmb3IgZ2l2ZW4gY29va2llIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGtleSBJZCBmb3IgdGhlIGB2YWx1ZWAuXG4gICAqIEBwYXJhbSB2YWx1ZSBSYXcgdmFsdWUgdG8gYmUgc3RvcmVkLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAoT3B0aW9uYWwpIE9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgcHV0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogQ29va2llT3B0aW9ucykge1xuICAgIHRoaXMuX2Nvb2tpZVdyaXRlcigpKGtleSwgdmFsdWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIENvb2tpZVNlcnZpY2UjcHV0T2JqZWN0XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXJpYWxpemVzIGFuZCBzZXRzIGEgdmFsdWUgZm9yIGdpdmVuIGNvb2tpZSBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgSWQgZm9yIHRoZSBgdmFsdWVgLlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYmUgc3RvcmVkLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAoT3B0aW9uYWwpIE9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgcHV0T2JqZWN0KGtleTogc3RyaW5nLCB2YWx1ZTogT2JqZWN0LCBvcHRpb25zPzogQ29va2llT3B0aW9ucykge1xuICAgIHRoaXMucHV0KGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSBDb29raWVTZXJ2aWNlI3JlbW92ZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVtb3ZlIGdpdmVuIGNvb2tpZS5cbiAgICpcbiAgICogQHBhcmFtIGtleSBJZCBvZiB0aGUga2V5LXZhbHVlIHBhaXIgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAoT3B0aW9uYWwpIE9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgcmVtb3ZlKGtleTogc3RyaW5nLCBvcHRpb25zPzogQ29va2llT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuX2Nvb2tpZVdyaXRlcigpKGtleSwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSBDb29raWVTZXJ2aWNlI3JlbW92ZUFsbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVtb3ZlIGFsbCBjb29raWVzLlxuICAgKi9cbiAgcmVtb3ZlQWxsKG9wdGlvbnM/OiBDb29raWVPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3QgY29va2llcyA9IHRoaXMuZ2V0QWxsKCk7XG4gICAgT2JqZWN0LmtleXMoY29va2llcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy5yZW1vdmUoa2V5LCBvcHRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2Nvb2tpZVJlYWRlcigpOiBPYmplY3Qge1xuICAgIGxldCBsYXN0Q29va2llcyA9IHt9O1xuICAgIGxldCBsYXN0Q29va2llU3RyaW5nID0gJyc7XG4gICAgbGV0IGNvb2tpZUFycmF5OiBzdHJpbmdbXSwgY29va2llOiBzdHJpbmcsIGk6IG51bWJlciwgaW5kZXg6IG51bWJlciwgbmFtZTogc3RyaW5nO1xuICAgIGNvbnN0IGN1cnJlbnRDb29raWVTdHJpbmcgPSB0aGlzLmNvb2tpZVN0cmluZztcbiAgICBpZiAoY3VycmVudENvb2tpZVN0cmluZyAhPT0gbGFzdENvb2tpZVN0cmluZykge1xuICAgICAgbGFzdENvb2tpZVN0cmluZyA9IGN1cnJlbnRDb29raWVTdHJpbmc7XG4gICAgICBjb29raWVBcnJheSA9IGxhc3RDb29raWVTdHJpbmcuc3BsaXQoJzsgJyk7XG4gICAgICBsYXN0Q29va2llcyA9IHt9O1xuICAgICAgZm9yIChpID0gMDsgaSA8IGNvb2tpZUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvb2tpZSA9IGNvb2tpZUFycmF5W2ldO1xuICAgICAgICBpbmRleCA9IGNvb2tpZS5pbmRleE9mKCc9Jyk7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHsgIC8vIGlnbm9yZSBuYW1lbGVzcyBjb29raWVzXG4gICAgICAgICAgbmFtZSA9IHNhZmVEZWNvZGVVUklDb21wb25lbnQoY29va2llLnN1YnN0cmluZygwLCBpbmRleCkpO1xuICAgICAgICAgIC8vIHRoZSBmaXJzdCB2YWx1ZSB0aGF0IGlzIHNlZW4gZm9yIGEgY29va2llIGlzIHRoZSBtb3N0XG4gICAgICAgICAgLy8gc3BlY2lmaWMgb25lLiAgdmFsdWVzIGZvciB0aGUgc2FtZSBjb29raWUgbmFtZSB0aGF0XG4gICAgICAgICAgLy8gZm9sbG93IGFyZSBmb3IgbGVzcyBzcGVjaWZpYyBwYXRocy5cbiAgICAgICAgICBpZiAoaXNCbGFuaygoPGFueT5sYXN0Q29va2llcylbbmFtZV0pKSB7XG4gICAgICAgICAgICAoPGFueT5sYXN0Q29va2llcylbbmFtZV0gPSBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsYXN0Q29va2llcztcbiAgfVxuXG4gIHByaXZhdGUgX2Nvb2tpZVdyaXRlcigpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcblxuICAgIHJldHVybiBmdW5jdGlvbiAobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcHRpb25zPzogQ29va2llT3B0aW9ucykge1xuICAgICAgdGhhdC5jb29raWVTdHJpbmcgPSB0aGF0Ll9idWlsZENvb2tpZVN0cmluZyhuYW1lLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkQ29va2llU3RyaW5nKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgb3B0aW9ucz86IENvb2tpZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IG9wdHM6IENvb2tpZU9wdGlvbnMgPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLCBvcHRpb25zKTtcbiAgICBsZXQgZXhwaXJlczogYW55ID0gb3B0cy5leHBpcmVzO1xuICAgIGlmIChpc0JsYW5rKHZhbHVlKSkge1xuICAgICAgZXhwaXJlcyA9ICdUaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIEdNVCc7XG4gICAgICB2YWx1ZSA9ICcnO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpbmcoZXhwaXJlcykpIHtcbiAgICAgIGV4cGlyZXMgPSBuZXcgRGF0ZShleHBpcmVzKTtcbiAgICB9XG4gICAgY29uc3QgY29va2llVmFsdWUgPSBvcHRzLnN0b3JlVW5lbmNvZGVkID8gdmFsdWUgOiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUgfHwgJycpO1xuICAgIGxldCBzdHIgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBjb29raWVWYWx1ZTtcbiAgICBzdHIgKz0gb3B0cy5wYXRoID8gJztwYXRoPScgKyBvcHRzLnBhdGggOiAnJztcbiAgICBzdHIgKz0gb3B0cy5kb21haW4gPyAnO2RvbWFpbj0nICsgb3B0cy5kb21haW4gOiAnJztcbiAgICBzdHIgKz0gZXhwaXJlcyA/ICc7ZXhwaXJlcz0nICsgZXhwaXJlcy50b1VUQ1N0cmluZygpIDogJyc7XG4gICAgc3RyICs9IG9wdHMuc2VjdXJlID8gJztzZWN1cmUnIDogJyc7XG4gICAgc3RyICs9IG9wdHMuaHR0cE9ubHkgPyAnOyBIdHRwT25seScgOiAnJztcblxuICAgIC8vIHBlciBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMTA5LnR4dCBicm93c2VyIG11c3QgYWxsb3cgYXQgbWluaW11bTpcbiAgICAvLyAtIDMwMCBjb29raWVzXG4gICAgLy8gLSAyMCBjb29raWVzIHBlciB1bmlxdWUgZG9tYWluXG4gICAgLy8gLSA0MDk2IGJ5dGVzIHBlciBjb29raWVcbiAgICBjb25zdCBjb29raWVMZW5ndGggPSBzdHIubGVuZ3RoICsgMTtcbiAgICBpZiAoY29va2llTGVuZ3RoID4gNDA5Nikge1xuICAgICAgY29uc29sZS5sb2coYENvb2tpZSBcXCcke25hbWV9XFwnIHBvc3NpYmx5IG5vdCBzZXQgb3Igb3ZlcmZsb3dlZCBiZWNhdXNlIGl0IHdhcyB0b28gbGFyZ2UgKCR7Y29va2llTGVuZ3RofSA+IDQwOTYgYnl0ZXMpIWApO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG4iXX0=