UNPKG

ngx-store

Version:

Angular decorators to automagically keep variables in HTML5 LocalStorage, SessionStorage, cookies; injectable services for managing and listening to data changes and a bit more.

150 lines 20.5 kB
import { Config, debug } from '../../config/config'; import { NgxStorage } from './storage'; import { WebStorageUtility } from '../webstorage.utility'; import { interval } from 'rxjs'; export class CookiesStorage extends NgxStorage { constructor() { super(); this.cachedCookieString = ''; this.cachedItemsMap = new Map(); this.getAllItems(); if (Config.cookiesCheckInterval) { interval(Config.cookiesCheckInterval) .subscribe(() => { var _a; if (!((_a = this.externalChanges) === null || _a === void 0 ? void 0 : _a.observers.length)) { return; // don't run if there are no set subscriptions } this.getAllItems(); }); } } get type() { return 'cookiesStorage'; } get length() { return this.getAllKeys().length; } key(index) { return this.getAllKeys()[index]; } getItem(key) { return this.getAllItems().get(key); } removeItem(key) { if (typeof document === 'undefined') { return; } let domain = this.resolveDomain(Config.cookiesScope); domain = (domain) ? 'domain=' + domain + ';' : ''; document.cookie = key + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/;' + domain; this.cachedItemsMap.delete(key); } /** * @param key * @param value * @param expirationDate passing null affects in lifetime cookie */ setItem(key, value, expirationDate) { if (typeof document === 'undefined') { return; } let domain = this.resolveDomain(Config.cookiesScope); debug.log('Cookies domain:', domain); domain = (domain) ? 'domain=' + domain + ';' : ''; let utcDate = ''; if (expirationDate instanceof Date) { utcDate = expirationDate.toUTCString(); } else if (expirationDate === null) { utcDate = 'Fri, 18 Dec 2099 12:00:00 GMT'; } const expires = utcDate ? '; expires=' + utcDate : ''; const cookie = key + '=' + value + expires + ';path=/;' + domain; debug.log('Cookie`s set instruction:', cookie); this.cachedItemsMap.set(key, value); document.cookie = cookie; } clear() { this.getAllKeys().forEach(key => this.removeItem(key)); } forEach(callbackFn) { return this.getAllItems().forEach((value, key) => callbackFn(value, key)); } getAllKeys() { return Array.from(this.getAllItems().keys()); } // TODO: consider getting cookies from all paths getAllItems() { if (this.cachedCookieString === document.cookie) { // No changes return this.cachedItemsMap; } const map = new Map(); if (typeof document === 'undefined') { return map; } const cookies = document.cookie.split(';'); // tslint:disable-next-line:prefer-for-of for (let i = 0; i < cookies.length; i++) { const cookie = cookies[i].trim(); const eqPos = cookie.indexOf('='); const key = eqPos > -1 ? cookie.substr(0, eqPos) : cookie; const value = eqPos > -1 ? cookie.substr(eqPos + 1, cookie.length) : cookie; map.set(key, value); } // detect changes and emit events if (this.cachedItemsMap) { map.forEach((value, key) => { let cachedValue = this.cachedItemsMap.get(key); cachedValue = (cachedValue !== undefined) ? cachedValue : null; if (value !== cachedValue) { this.emitEvent(key, WebStorageUtility.getGettable(value), WebStorageUtility.getGettable(cachedValue)); } }); this.cachedItemsMap.forEach((value, key) => { if (!map.has(key)) { this.emitEvent(key, null, WebStorageUtility.getGettable(value)); } }); } this.cachedCookieString = document.cookie; return this.cachedItemsMap = map; } /** * domain.com + path="." = .domain.com * domain.com + path=".sub." = .sub.domain.com * sub.domain.com + path="sub." = sub.domain.com * www.sub.domain.com + path="." = .sub.domain.com * localhost + path=".whatever." = localhost * @param path */ resolveDomain(path) { if (!path) { return ''; } const hostname = document.domain; if ((hostname.match(/\./g) || []).length < 1) { return ''; } const www = (path[0] !== '.' && hostname.indexOf('www.') === 0) ? 'www.' : ''; return www + path + this.getDomain(); } /** * This function determines base domain by setting cookie at the highest level possible * @url http://rossscrivener.co.uk/blog/javascript-get-domain-exclude-subdomain */ getDomain() { let i = 0; let domain = document.domain; const domainParts = domain.split('.'); const s = '_gd' + (new Date()).getTime(); while (i < (domainParts.length - 1) && document.cookie.indexOf(s + '=' + s) === -1) { domain = domainParts.slice(-1 - (++i)).join('.'); document.cookie = s + '=' + s + ';domain=' + domain + ';'; } document.cookie = s + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;domain=' + domain + ';'; return domain; } } export const cookiesStorage = new CookiesStorage(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llcy1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0b3JlL3NyYy9saWIvdXRpbGl0eS9zdG9yYWdlL2Nvb2tpZXMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkMsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU1oQyxNQUFNLE9BQU8sY0FBZSxTQUFRLFVBQVU7SUFJNUM7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUpBLHVCQUFrQixHQUFXLEVBQUUsQ0FBQztRQUNoQyxtQkFBYyxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBSXhELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRTtZQUMvQixRQUFRLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO2lCQUNsQyxTQUFTLENBQUMsR0FBRyxFQUFFOztnQkFDZCxJQUFJLFFBQUMsSUFBSSxDQUFDLGVBQWUsMENBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQSxFQUFFO29CQUMzQyxPQUFPLENBQUMsOENBQThDO2lCQUN2RDtnQkFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNILENBQUM7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVNLEdBQUcsQ0FBQyxL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fSBmcm9tICcuLi8uLi9jb25maWcvY29uZmlnJztcbmltcG9ydCB7IE5neFN0b3JhZ2UgfSBmcm9tICcuL3N0b3JhZ2UnO1xuaW1wb3J0IHsgU3RvcmFnZU5hbWUsIFdlYlN0b3JhZ2VVdGlsaXR5IH0gZnJvbSAnLi4vd2Vic3RvcmFnZS51dGlsaXR5JztcbmltcG9ydCB7IGludGVydmFsIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU3RvcmFnZSBleHRlbmRzIFN0b3JhZ2Uge1xuICBzZXRJdGVtKGtleTogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGV4cGlyYXRpb25EYXRlPzogRGF0ZSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBDb29raWVzU3RvcmFnZSBleHRlbmRzIE5neFN0b3JhZ2Uge1xuICBwcm90ZWN0ZWQgY2FjaGVkQ29va2llU3RyaW5nOiBzdHJpbmcgPSAnJztcbiAgcHJvdGVjdGVkIGNhY2hlZEl0ZW1zTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5nZXRBbGxJdGVtcygpO1xuICAgIGlmIChDb25maWcuY29va2llc0NoZWNrSW50ZXJ2YWwpIHtcbiAgICAgIGludGVydmFsKENvbmZpZy5jb29raWVzQ2hlY2tJbnRlcnZhbClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmV4dGVybmFsQ2hhbmdlcz8ub2JzZXJ2ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCBydW4gaWYgdGhlcmUgYXJlIG5vIHNldCBzdWJzY3JpcHRpb25zXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZ2V0QWxsSXRlbXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IFN0b3JhZ2VOYW1lIHtcbiAgICByZXR1cm4gJ2Nvb2tpZXNTdG9yYWdlJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsS2V5cygpLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBrZXkoaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsS2V5cygpW2luZGV4XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJdGVtKGtleTogc3RyaW5nKTogc3RyaW5nIHwgYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxJdGVtcygpLmdldChrZXkpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZG9tYWluID0gdGhpcy5yZXNvbHZlRG9tYWluKENvbmZpZy5jb29raWVzU2NvcGUpO1xuICAgIGRvbWFpbiA9IChkb21haW4pID8gJ2RvbWFpbj0nICsgZG9tYWluICsgJzsnIDogJyc7XG4gICAgZG9jdW1lbnQuY29va2llID0ga2V5ICsgJz07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQ7IHBhdGg9LzsnICsgZG9tYWluO1xuICAgIHRoaXMuY2FjaGVkSXRlbXNNYXAuZGVsZXRlKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogQHBhcmFtIGV4cGlyYXRpb25EYXRlIHBhc3NpbmcgbnVsbCBhZmZlY3RzIGluIGxpZmV0aW1lIGNvb2tpZVxuICAgKi9cbiAgcHVibGljIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGV4cGlyYXRpb25EYXRlPzogRGF0ZSk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBkb21haW4gPSB0aGlzLnJlc29sdmVEb21haW4oQ29uZmlnLmNvb2tpZXNTY29wZSk7XG4gICAgZGVidWcubG9nKCdDb29raWVzIGRvbWFpbjonLCBkb21haW4pO1xuICAgIGRvbWFpbiA9IChkb21haW4pID8gJ2RvbWFpbj0nICsgZG9tYWluICsgJzsnIDogJyc7XG4gICAgbGV0IHV0Y0RhdGUgPSAnJztcbiAgICBpZiAoZXhwaXJhdGlvbkRhdGUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICB1dGNEYXRlID0gZXhwaXJhdGlvbkRhdGUudG9VVENTdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKGV4cGlyYXRpb25EYXRlID09PSBudWxsKSB7XG4gICAgICB1dGNEYXRlID0gJ0ZyaSwgMTggRGVjIDIwOTkgMTI6MDA6MDAgR01UJztcbiAgICB9XG4gICAgY29uc3QgZXhwaXJlcyA9IHV0Y0RhdGUgPyAnOyBleHBpcmVzPScgKyB1dGNEYXRlIDogJyc7XG4gICAgY29uc3QgY29va2llID0ga2V5ICsgJz0nICsgdmFsdWUgKyBleHBpcmVzICsgJztwYXRoPS87JyArIGRvbWFpbjtcbiAgICBkZWJ1Zy5sb2coJ0Nvb2tpZWBzIHNldCBpbnN0cnVjdGlvbjonLCBjb29raWUpO1xuICAgIHRoaXMuY2FjaGVkSXRlbXNNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmdldEFsbEtleXMoKS5mb3JFYWNoKGtleSA9PiB0aGlzLnJlbW92ZUl0ZW0oa2V5KSk7XG4gIH1cblxuICBwdWJsaWMgZm9yRWFjaChjYWxsYmFja0ZuOiAodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IGFueSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldEFsbEl0ZW1zKCkuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4gY2FsbGJhY2tGbih2YWx1ZSwga2V5KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QWxsS2V5cygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmdldEFsbEl0ZW1zKCkua2V5cygpKTtcbiAgfVxuXG4gIC8vIFRPRE86IGNvbnNpZGVyIGdldHRpbmcgY29va2llcyBmcm9tIGFsbCBwYXRoc1xuICBwcm90ZWN0ZWQgZ2V0QWxsSXRlbXMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuY2FjaGVkQ29va2llU3RyaW5nID09PSBkb2N1bWVudC5jb29raWUpIHsgLy8gTm8gY2hhbmdlc1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkSXRlbXNNYXA7XG4gICAgfVxuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgY29uc3QgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpO1xuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci1mb3Itb2ZcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvb2tpZSA9IGNvb2tpZXNbaV0udHJpbSgpO1xuICAgICAgY29uc3QgZXFQb3MgPSBjb29raWUuaW5kZXhPZignPScpO1xuICAgICAgY29uc3Qga2V5ID0gZXFQb3MgPiAtMSA/IGNvb2tpZS5zdWJzdHIoMCwgZXFQb3MpIDogY29va2llO1xuICAgICAgY29uc3QgdmFsdWUgPSBlcVBvcyA+IC0xID8gY29va2llLnN1YnN0cihlcVBvcyArIDEsIGNvb2tpZS5sZW5ndGgpIDogY29va2llO1xuICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgLy8gZGV0ZWN0IGNoYW5nZXMgYW5kIGVtaXQgZXZlbnRzXG4gICAgaWYgKHRoaXMuY2FjaGVkSXRlbXNNYXApIHtcbiAgICAgIG1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGxldCBjYWNoZWRWYWx1ZTogYW55ID0gdGhpcy5jYWNoZWRJdGVtc01hcC5nZXQoa2V5KTtcbiAgICAgICAgY2FjaGVkVmFsdWUgPSAoY2FjaGVkVmFsdWUgIT09IHVuZGVmaW5lZCkgPyBjYWNoZWRWYWx1ZSA6IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gY2FjaGVkVmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmVtaXRFdmVudChcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIFdlYlN0b3JhZ2VVdGlsaXR5LmdldEdldHRhYmxlKHZhbHVlKSxcbiAgICAgICAgICAgIFdlYlN0b3JhZ2VVdGlsaXR5LmdldEdldHRhYmxlKGNhY2hlZFZhbHVlKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2FjaGVkSXRlbXNNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoIW1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgIHRoaXMuZW1pdEV2ZW50KGtleSwgbnVsbCwgV2ViU3RvcmFnZVV0aWxpdHkuZ2V0R2V0dGFibGUodmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY2FjaGVkQ29va2llU3RyaW5nID0gZG9jdW1lbnQuY29va2llO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZEl0ZW1zTWFwID0gbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIGRvbWFpbi5jb20gICAgICAgICArIHBhdGg9XCIuXCIgICAgICAgICAgPSAuZG9tYWluLmNvbVxuICAgKiBkb21haW4uY29tICAgICAgICAgKyBwYXRoPVwiLnN1Yi5cIiAgICAgID0gLnN1Yi5kb21haW4uY29tXG4gICAqIHN1Yi5kb21haW4uY29tICAgICArIHBhdGg9XCJzdWIuXCIgICAgICAgPSBzdWIuZG9tYWluLmNvbVxuICAgKiB3d3cuc3ViLmRvbWFpbi5jb20gKyBwYXRoPVwiLlwiICAgICAgICAgID0gLnN1Yi5kb21haW4uY29tXG4gICAqIGxvY2FsaG9zdCAgICAgICAgICArIHBhdGg9XCIud2hhdGV2ZXIuXCIgPSBsb2NhbGhvc3RcbiAgICogQHBhcmFtIHBhdGhcbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlRG9tYWluKHBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghcGF0aCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBob3N0bmFtZSA9IGRvY3VtZW50LmRvbWFpbjtcbiAgICBpZiAoKGhvc3RuYW1lLm1hdGNoKC9cXC4vZykgfHwgW10pLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3Qgd3d3ID0gKHBhdGhbMF0gIT09ICcuJyAmJiBob3N0bmFtZS5pbmRleE9mKCd3d3cuJykgPT09IDApID8gJ3d3dy4nIDogJyc7XG4gICAgcmV0dXJuIHd3dyArIHBhdGggKyB0aGlzLmdldERvbWFpbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBiYXNlIGRvbWFpbiBieSBzZXR0aW5nIGNvb2tpZSBhdCB0aGUgaGlnaGVzdCBsZXZlbCBwb3NzaWJsZVxuICAgKiBAdXJsIGh0dHA6Ly9yb3Nzc2NyaXZlbmVyLmNvLnVrL2Jsb2cvamF2YXNjcmlwdC1nZXQtZG9tYWluLWV4Y2x1ZGUtc3ViZG9tYWluXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RG9tYWluKCk6IHN0cmluZyB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBkb21haW4gPSBkb2N1bWVudC5kb21haW47XG4gICAgY29uc3QgZG9tYWluUGFydHMgPSBkb21haW4uc3BsaXQoJy4nKTtcbiAgICBjb25zdCBzID0gJ19nZCcgKyAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgIHdoaWxlIChpIDwgKGRvbWFpblBhcnRzLmxlbmd0aCAtIDEpICYmIGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKHMgKyAnPScgKyBzKSA9PT0gLTEpIHtcbiAgICAgIGRvbWFpbiA9IGRvbWFpblBhcnRzLnNsaWNlKC0xIC0gKCsraSkpLmpvaW4oJy4nKTtcbiAgICAgIGRvY3VtZW50LmNvb2tpZSA9IHMgKyAnPScgKyBzICsgJztkb21haW49JyArIGRvbWFpbiArICc7JztcbiAgICB9XG4gICAgZG9jdW1lbnQuY29va2llID0gcyArICc9O2V4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQ7ZG9tYWluPScgKyBkb21haW4gKyAnOyc7XG4gICAgcmV0dXJuIGRvbWFpbjtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY29va2llc1N0b3JhZ2UgPSBuZXcgQ29va2llc1N0b3JhZ2UoKTtcbiJdfQ==