UNPKG

@dotglitch/ngx-common

Version:

Angular components and utilities that are commonly used.

205 lines โ€ข 27.2 kB
export const sleep = ms => new Promise(r => setTimeout(r, ms)); /** * Prompt the user to save a json file of the given object. */ export const saveObjectAsFile = (name, data) => { const a = document.createElement("a"); const file = new Blob([JSON.stringify(data)], { type: "application/json" }); a.href = URL.createObjectURL(file); a.download = name; a.click(); a.remove(); }; /** * Construct an emoticon with any unicode icon you specify */ export class Emoticon { constructor(icon) { this.icon = icon; } } /** * authorization ๐Ÿ” \ * navigation ๐Ÿงญ \ * user ๐Ÿชช \ * security ๐Ÿ›ก \ * system ๐Ÿ–ฅ \ * toolbox ๐Ÿงฐ \ * chore โš™ \ * config ๐Ÿ›  \ * renderer ๐Ÿ“ \ * package ๐Ÿ“ฆ \ * time โณ \ * download ๐Ÿ“ฅ \ * upload ๐Ÿ“ค \ * bug ๐Ÿฆ  \ * bomb ๐Ÿ’ฃ \ * tnt ๐Ÿงจ \ * warning โš ๏ธ \ * chart ๐Ÿ“Š \ * chart_up ๐Ÿ“ˆ \ * chart_down ๐Ÿ“‰ \ * circle_red ๐Ÿ”ด \ * circle_orange ๐ŸŸ  \ * circle_yellow ๐ŸŸก \ * circle_green ๐ŸŸข \ * circle_blue ๐Ÿ”ต \ * circle_violet ๐ŸŸฃ \ * circle_black โšซ๏ธ \ * circle_white โšช๏ธ \ * circle_brown ๐ŸŸค \ * square_red ๐ŸŸฅ \ * square_orange ๐ŸŸง \ * square_yellow ๐ŸŸจ \ * square_green ๐ŸŸฉ \ * square_blue ๐ŸŸฆ \ * square_violet ๐ŸŸช \ * square_black โฌ›๏ธ \ * square_white โฌœ๏ธ \ * square_brown ๐ŸŸซ */ export const LogIcon = { authorization: new Emoticon("๐Ÿ”"), navigation: new Emoticon("๐Ÿงญ"), user: new Emoticon("๐Ÿชช"), security: new Emoticon("๐Ÿ›ก"), system: new Emoticon("๐Ÿ–ฅ"), toolbox: new Emoticon("๐Ÿงฐ"), chore: new Emoticon("โš™"), config: new Emoticon("๐Ÿ› "), renderer: new Emoticon("๐Ÿ“"), package: new Emoticon("๐Ÿ“ฆ"), time: new Emoticon("โณ"), download: new Emoticon("๐Ÿ“ฅ"), upload: new Emoticon("๐Ÿ“ค"), bug: new Emoticon("๐Ÿฆ "), bomb: new Emoticon("๐Ÿ’ฃ"), tnt: new Emoticon("๐Ÿงจ"), stop: new Emoticon("๐Ÿ›‘"), police: new Emoticon("๐Ÿšจ"), rocket: new Emoticon("๐Ÿš€"), warning: new Emoticon("โš ๏ธ"), chart: new Emoticon("๐Ÿ“Š"), chart_up: new Emoticon("๐Ÿ“ˆ"), chart_down: new Emoticon("๐Ÿ“‰"), circle_red: new Emoticon("๐Ÿ”ด"), circle_orange: new Emoticon("๐ŸŸ "), circle_yellow: new Emoticon("๐ŸŸก"), circle_green: new Emoticon("๐ŸŸข"), circle_blue: new Emoticon("๐Ÿ”ต"), circle_violet: new Emoticon("๐ŸŸฃ"), circle_black: new Emoticon("โšซ๏ธ"), circle_white: new Emoticon("โšช๏ธ"), circle_brown: new Emoticon("๐ŸŸค"), square_red: new Emoticon("๐ŸŸฅ"), square_orange: new Emoticon("๐ŸŸง"), square_yellow: new Emoticon("๐ŸŸจ"), square_green: new Emoticon("๐ŸŸฉ"), square_blue: new Emoticon("๐ŸŸฆ"), square_violet: new Emoticon("๐ŸŸช"), square_black: new Emoticon("โฌ›๏ธ"), square_white: new Emoticon("โฌœ๏ธ"), square_brown: new Emoticon("๐ŸŸซ") }; class Log { constructor(context, contextColor, textColor) { this.context = context; this.contextColor = contextColor; this.textColor = textColor; // Force the bindings to stay intact with overloads. this.log = this.log.bind(this); this.warn = this.warn.bind(this); this.err = this.err.bind(this); this.error = this.error.bind(this); } log(iconOrMessage, messageText, ...args) { if (iconOrMessage instanceof Emoticon) { console.log(`${iconOrMessage.icon} %c[${this.context}] %c${messageText}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args); } else { console.log(`%c[${this.context}] %c${iconOrMessage}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args); } } warn(iconOrMessage, messageText, ...args) { if (iconOrMessage instanceof Emoticon) { console.warn(`${iconOrMessage.icon} %c[${this.context}] %c${messageText}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args); } else { console.warn(`%c[${this.context}] %c${iconOrMessage}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args); } } err(iconOrMessage, messageText, ...args) { if (iconOrMessage instanceof Emoticon) { console.error(`${iconOrMessage.icon} %c[${this.context}] %c${messageText}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args); } else { console.error(`%c[${this.context}] %c${iconOrMessage}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args); } } error(iconOrMessage, messageText, ...args) { // @ts-ignore this.err(iconOrMessage, messageText, ...args); } } /** * Formatted logger that will print a bit of context before the message. * @returns */ export const ConsoleLogger = (context, contextColor, textColor = "#03a9f4") => new Log(context, contextColor, textColor); /** * Convert a string `fooBAR baz_160054''"1]"` into a slug: `foobar-baz-1600541` */ export const stringToSlug = (text) => (text || '') .trim() .toLowerCase() .replace(/[\-_+ ]/g, '-') .replace(/[^a-z0-9\-\/]/g, ''); /** * Helper to update the page URL. * @param page component page ID to load. * @param data string or JSON data for query params. */ export const updateUrl = (page, data = {}, replaceState = false) => { const [oldHash, qstring] = location.hash.split('?'); if (!page) page = oldHash.split('/')[1]; const hash = `#/${page}`; // Convert the data object to JSON. if (data instanceof URLSearchParams) { data = [...data.entries()].map(([k, v]) => ({ [k]: v })).reduce((a, b) => ({ ...a, ...b }), {}); } const query = new URLSearchParams(data); const prevParams = new URLSearchParams(qstring); // If the hash is the same, retain params. if (hash == oldHash) { replaceState = true; for (const [key, value] of prevParams.entries()) if (!query.has(key)) query.set(key, prevParams.get(key)); } for (const [key, val] of query.entries()) { if (val == null || val == undefined || val == '' || val == 'null' || Number.isNaN(val) || val == 'NaN') query.delete(key); } if (!(hash.toLowerCase() == "#/frame") || data['id'] == -1) query.delete('id'); const strQuery = query.toString(); console.log(data, hash, strQuery); if (replaceState) { window.history.replaceState(data, '', hash + (strQuery ? ('?' + strQuery) : '')); } else { window.history.pushState(data, '', hash + (strQuery ? ('?' + strQuery) : '')); } }; export const getUrlData = (source = window.location.hash) => { const [hash, query] = source.split('?'); let data = new URLSearchParams(query); return [...data.entries()].map(([k, v]) => ({ [k]: v })).reduce((a, b) => ({ ...a, ...b }), {}); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRS9EOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7SUFDM0QsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDakIsWUFBb0IsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7SUFBRSxDQUFDO0NBQ3RDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRztJQUNuQixhQUFhLEVBQUUsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQ2pDLFVBQVUsRUFB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b25zdCBzbGVlcCA9IG1zID0+IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCBtcykpO1xuXG4vKipcbiAqIFByb21wdCB0aGUgdXNlciB0byBzYXZlIGEganNvbiBmaWxlIG9mIHRoZSBnaXZlbiBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBzYXZlT2JqZWN0QXNGaWxlID0gKG5hbWU6IHN0cmluZywgZGF0YTogT2JqZWN0KSA9PiB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgIGNvbnN0IGZpbGUgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGF0YSldLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pO1xuICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XG4gICAgYS5kb3dubG9hZCA9IG5hbWU7XG4gICAgYS5jbGljaygpO1xuICAgIGEucmVtb3ZlKCk7XG59O1xuXG4vKipcbiAqIENvbnN0cnVjdCBhbiBlbW90aWNvbiB3aXRoIGFueSB1bmljb2RlIGljb24geW91IHNwZWNpZnlcbiAqL1xuZXhwb3J0IGNsYXNzIEVtb3RpY29uIHtcbiAgICBjb25zdHJ1Y3RvciAocHVibGljIGljb246IHN0cmluZyl7fVxufVxuXG4vKipcbiAqIGF1dGhvcml6YXRpb24g8J+UkCBcXFxuICogbmF2aWdhdGlvbiDwn6etIFxcXG4gKiB1c2VyIPCfqqogXFxcbiAqIHNlY3VyaXR5IPCfm6EgXFxcbiAqIHN5c3RlbSDwn5alIFxcXG4gKiB0b29sYm94IPCfp7AgXFxcbiAqIGNob3JlIOKamSBcXFxuICogY29uZmlnIPCfm6AgXFxcbiAqIHJlbmRlcmVyIPCfk5AgXFxcbiAqIHBhY2thZ2Ug8J+TpiBcXFxuICogdGltZSDij7MgXFxcbiAqIGRvd25sb2FkIPCfk6UgXFxcbiAqIHVwbG9hZCDwn5OkIFxcXG4gKiBidWcg8J+moCBcXFxuICogYm9tYiDwn5KjIFxcXG4gKiB0bnQg8J+nqCBcXFxuICogd2FybmluZyDimqDvuI8gXFxcbiAqIGNoYXJ0IPCfk4ogXFxcbiAqIGNoYXJ0X3VwIPCfk4ggXFxcbiAqIGNoYXJ0X2Rvd24g8J+TiSBcXFxuICogY2lyY2xlX3JlZCDwn5S0IFxcXG4gKiBjaXJjbGVfb3JhbmdlIPCfn6AgXFxcbiAqIGNpcmNsZV95ZWxsb3cg8J+foSBcXFxuICogY2lyY2xlX2dyZWVuIPCfn6IgXFxcbiAqIGNpcmNsZV9ibHVlIPCflLUgXFxcbiAqIGNpcmNsZV92aW9sZXQg8J+foyBcXFxuICogY2lyY2xlX2JsYWNrIOKaq++4jyBcXFxuICogY2lyY2xlX3doaXRlIOKaqu+4jyBcXFxuICogY2lyY2xlX2Jyb3duIPCfn6QgXFxcbiAqIHNxdWFyZV9yZWQg8J+fpSBcXFxuICogc3F1YXJlX29yYW5nZSDwn5+nIFxcXG4gKiBzcXVhcmVfeWVsbG93IPCfn6ggXFxcbiAqIHNxdWFyZV9ncmVlbiDwn5+pIFxcXG4gKiBzcXVhcmVfYmx1ZSDwn5+mIFxcXG4gKiBzcXVhcmVfdmlvbGV0IPCfn6ogXFxcbiAqIHNxdWFyZV9ibGFjayDirJvvuI8gXFxcbiAqIHNxdWFyZV93aGl0ZSDirJzvuI8gXFxcbiAqIHNxdWFyZV9icm93biDwn5+rXG4gKi9cbmV4cG9ydCBjb25zdCBMb2dJY29uID0ge1xuICAgIGF1dGhvcml6YXRpb246IG5ldyBFbW90aWNvbihcIvCflJBcIiksXG4gICAgbmF2aWdhdGlvbjogbmV3IEVtb3RpY29uKFwi8J+nrVwiKSxcbiAgICB1c2VyOiBuZXcgRW1vdGljb24oXCLwn6qqXCIpLFxuICAgIHNlY3VyaXR5OiBuZXcgRW1vdGljb24oXCLwn5uhXCIpLFxuICAgIHN5c3RlbTogbmV3IEVtb3RpY29uKFwi8J+WpVwiKSxcbiAgICB0b29sYm94OiBuZXcgRW1vdGljb24oXCLwn6ewXCIpLFxuICAgIGNob3JlOiBuZXcgRW1vdGljb24oXCLimplcIiksXG4gICAgY29uZmlnOiBuZXcgRW1vdGljb24oXCLwn5ugXCIpLFxuICAgIHJlbmRlcmVyOiBuZXcgRW1vdGljb24oXCLwn5OQXCIpLFxuICAgIHBhY2thZ2U6IG5ldyBFbW90aWNvbihcIvCfk6ZcIiksXG4gICAgdGltZTogbmV3IEVtb3RpY29uKFwi4o+zXCIpLFxuICAgIGRvd25sb2FkOiBuZXcgRW1vdGljb24oXCLwn5OlXCIpLFxuICAgIHVwbG9hZDogbmV3IEVtb3RpY29uKFwi8J+TpFwiKSxcbiAgICBidWc6IG5ldyBFbW90aWNvbihcIvCfpqBcIiksXG4gICAgYm9tYjogbmV3IEVtb3RpY29uKFwi8J+So1wiKSxcbiAgICB0bnQ6IG5ldyBFbW90aWNvbihcIvCfp6hcIiksXG4gICAgc3RvcDogbmV3IEVtb3RpY29uKFwi8J+bkVwiKSxcbiAgICBwb2xpY2U6IG5ldyBFbW90aWNvbihcIvCfmqhcIiksXG4gICAgcm9ja2V0OiBuZXcgRW1vdGljb24oXCLwn5qAXCIpLFxuICAgIHdhcm5pbmc6IG5ldyBFbW90aWNvbihcIuKaoO+4j1wiKSxcbiAgICBjaGFydDogbmV3IEVtb3RpY29uKFwi8J+TilwiKSxcbiAgICBjaGFydF91cDogbmV3IEVtb3RpY29uKFwi8J+TiFwiKSxcbiAgICBjaGFydF9kb3duOiBuZXcgRW1vdGljb24oXCLwn5OJXCIpLFxuXG4gICAgY2lyY2xlX3JlZDogbmV3IEVtb3RpY29uKFwi8J+UtFwiKSxcbiAgICBjaXJjbGVfb3JhbmdlOiBuZXcgRW1vdGljb24oXCLwn5+gXCIpLFxuICAgIGNpcmNsZV95ZWxsb3c6IG5ldyBFbW90aWNvbihcIvCfn6FcIiksXG4gICAgY2lyY2xlX2dyZWVuOiBuZXcgRW1vdGljb24oXCLwn5+iXCIpLFxuICAgIGNpcmNsZV9ibHVlOiBuZXcgRW1vdGljb24oXCLwn5S1XCIpLFxuICAgIGNpcmNsZV92aW9sZXQ6IG5ldyBFbW90aWNvbihcIvCfn6NcIiksXG4gICAgY2lyY2xlX2JsYWNrOiBuZXcgRW1vdGljb24oXCLimqvvuI9cIiksXG4gICAgY2lyY2xlX3doaXRlOiBuZXcgRW1vdGljb24oXCLimqrvuI9cIiksXG4gICAgY2lyY2xlX2Jyb3duOiBuZXcgRW1vdGljb24oXCLwn5+kXCIpLFxuICAgIHNxdWFyZV9yZWQ6IG5ldyBFbW90aWNvbihcIvCfn6VcIiksXG4gICAgc3F1YXJlX29yYW5nZTogbmV3IEVtb3RpY29uKFwi8J+fp1wiKSxcbiAgICBzcXVhcmVfeWVsbG93OiBuZXcgRW1vdGljb24oXCLwn5+oXCIpLFxuICAgIHNxdWFyZV9ncmVlbjogbmV3IEVtb3RpY29uKFwi8J+fqVwiKSxcbiAgICBzcXVhcmVfYmx1ZTogbmV3IEVtb3RpY29uKFwi8J+fplwiKSxcbiAgICBzcXVhcmVfdmlvbGV0OiBuZXcgRW1vdGljb24oXCLwn5+qXCIpLFxuICAgIHNxdWFyZV9ibGFjazogbmV3IEVtb3RpY29uKFwi4qyb77iPXCIpLFxuICAgIHNxdWFyZV93aGl0ZTogbmV3IEVtb3RpY29uKFwi4qyc77iPXCIpLFxuICAgIHNxdWFyZV9icm93bjogbmV3IEVtb3RpY29uKFwi8J+fq1wiKVxufVxuXG5jbGFzcyBMb2cge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNvbnRleHQ6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSBjb250ZXh0Q29sb3I6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSB0ZXh0Q29sb3I6IHN0cmluZ1xuICAgICkge1xuICAgICAgICAvLyBGb3JjZSB0aGUgYmluZGluZ3MgdG8gc3RheSBpbnRhY3Qgd2l0aCBvdmVybG9hZHMuXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5sb2cuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy53YXJuID0gdGhpcy53YXJuLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZXJyID0gdGhpcy5lcnIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lcnJvciA9IHRoaXMuZXJyb3IuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBsb2coaWNvbjogRW1vdGljb24sIG1lc3NhZ2U6IHN0cmluZywgLi4uYXJncylcbiAgICBsb2cobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzKVxuICAgIGxvZyhpY29uT3JNZXNzYWdlOiBFbW90aWNvbiB8IHN0cmluZywgbWVzc2FnZVRleHQ6IHN0cmluZywgLi4uYXJncykge1xuICAgICAgICBpZiAoaWNvbk9yTWVzc2FnZSBpbnN0YW5jZW9mIEVtb3RpY29uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtpY29uT3JNZXNzYWdlLmljb259ICVjWyR7dGhpcy5jb250ZXh0fV0gJWMke21lc3NhZ2VUZXh0fWAsICdjb2xvcjogJyArIHRoaXMuY29udGV4dENvbG9yLCAnY29sb3I6ICcgKyB0aGlzLnRleHRDb2xvciwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJWNbJHt0aGlzLmNvbnRleHR9XSAlYyR7aWNvbk9yTWVzc2FnZX1gLCAnY29sb3I6ICcgKyB0aGlzLmNvbnRleHRDb2xvciwgJ2NvbG9yOiAnICsgdGhpcy50ZXh0Q29sb3IsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2FybihpY29uOiBFbW90aWNvbiwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzKVxuICAgIHdhcm4obWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzKVxuICAgIHdhcm4oaWNvbk9yTWVzc2FnZTogRW1vdGljb24gfCBzdHJpbmcsIG1lc3NhZ2VUZXh0OiBzdHJpbmcsIC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKGljb25Pck1lc3NhZ2UgaW5zdGFuY2VvZiBFbW90aWNvbikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGAke2ljb25Pck1lc3NhZ2UuaWNvbn0gJWNbJHt0aGlzLmNvbnRleHR9XSAlYyR7bWVzc2FnZVRleHR9YCwgJ2NvbG9yOiAnICsgdGhpcy5jb250ZXh0Q29sb3IsICdjb2xvcjogJyArIHRoaXMudGV4dENvbG9yLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJWNbJHt0aGlzLmNvbnRleHR9XSAlYyR7aWNvbk9yTWVzc2FnZX1gLCAnY29sb3I6ICcgKyB0aGlzLmNvbnRleHRDb2xvciwgJ2NvbG9yOiAnICsgdGhpcy50ZXh0Q29sb3IsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXJyKGljb246IEVtb3RpY29uLCBtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3MpXG4gICAgZXJyKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJncylcbiAgICBlcnIoaWNvbk9yTWVzc2FnZTogRW1vdGljb24gfCBzdHJpbmcsIG1lc3NhZ2VUZXh0OiBzdHJpbmcsIC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKGljb25Pck1lc3NhZ2UgaW5zdGFuY2VvZiBFbW90aWNvbikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtpY29uT3JNZXNzYWdlLmljb259ICVjWyR7dGhpcy5jb250ZXh0fV0gJWMke21lc3NhZ2VUZXh0fWAsICdjb2xvcjogJyArIHRoaXMuY29udGV4dENvbG9yLCAnY29sb3I6ICcgKyB0aGlzLnRleHRDb2xvciwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAlY1ske3RoaXMuY29udGV4dH1dICVjJHtpY29uT3JNZXNzYWdlfWAsICdjb2xvcjogJyArIHRoaXMuY29udGV4dENvbG9yLCAnY29sb3I6ICcgKyB0aGlzLnRleHRDb2xvciwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlcnJvcihpY29uOiBFbW90aWNvbiwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzKVxuICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJncylcbiAgICBlcnJvcihpY29uT3JNZXNzYWdlOiBFbW90aWNvbiB8IHN0cmluZywgbWVzc2FnZVRleHQ6IHN0cmluZywgLi4uYXJncykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZXJyKGljb25Pck1lc3NhZ2UsIG1lc3NhZ2VUZXh0LCAuLi5hcmdzKTtcbiAgICB9XG59XG5cbi8qKlxuICogRm9ybWF0dGVkIGxvZ2dlciB0aGF0IHdpbGwgcHJpbnQgYSBiaXQgb2YgY29udGV4dCBiZWZvcmUgdGhlIG1lc3NhZ2UuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgQ29uc29sZUxvZ2dlciA9IChjb250ZXh0OiBzdHJpbmcsIGNvbnRleHRDb2xvcjogc3RyaW5nLCB0ZXh0Q29sb3I6IHN0cmluZyA9IFwiIzAzYTlmNFwiKSA9PlxuICAgIG5ldyBMb2coY29udGV4dCwgY29udGV4dENvbG9yLCB0ZXh0Q29sb3IpO1xuXG4vKipcbiAqIENvbnZlcnQgYSBzdHJpbmcgYGZvb0JBUiBiYXpfMTYwMDU0JydcIjFdXCJgIGludG8gYSBzbHVnOiBgZm9vYmFyLWJhei0xNjAwNTQxYFxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9TbHVnID0gKHRleHQ6IHN0cmluZykgPT5cbiAgICAodGV4dCB8fCAnJylcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAucmVwbGFjZSgvW1xcLV8rIF0vZywgJy0nKVxuICAgICAgICAucmVwbGFjZSgvW15hLXowLTlcXC1cXC9dL2csICcnKTtcblxuXG4vKipcbiogSGVscGVyIHRvIHVwZGF0ZSB0aGUgcGFnZSBVUkwuXG4qIEBwYXJhbSBwYWdlIGNvbXBvbmVudCBwYWdlIElEIHRvIGxvYWQuXG4qIEBwYXJhbSBkYXRhIHN0cmluZyBvciBKU09OIGRhdGEgZm9yIHF1ZXJ5IHBhcmFtcy5cbiovXG5leHBvcnQgY29uc3QgdXBkYXRlVXJsID0gKHBhZ2U/OiBzdHJpbmcsIGRhdGE6IHN0cmluZyB8IHN0cmluZ1tdW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+IHwgVVJMU2VhcmNoUGFyYW1zID0ge30sIHJlcGxhY2VTdGF0ZSA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgW29sZEhhc2gsIHFzdHJpbmddID0gbG9jYXRpb24uaGFzaC5zcGxpdCgnPycpO1xuXG4gICAgaWYgKCFwYWdlKVxuICAgICAgICBwYWdlID0gb2xkSGFzaC5zcGxpdCgnLycpWzFdO1xuXG4gICAgY29uc3QgaGFzaCA9IGAjLyR7cGFnZX1gO1xuXG4gICAgLy8gQ29udmVydCB0aGUgZGF0YSBvYmplY3QgdG8gSlNPTi5cbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgICAgICBkYXRhID0gWy4uLihkYXRhIGFzIGFueSkuZW50cmllcygpXS5tYXAoKFtrLCB2XSkgPT4gKHsgW2tdOiB2IH0pKS5yZWR1Y2UoKGEsIGIpID0+ICh7IC4uLmEsIC4uLmIgfSksIHt9KTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoZGF0YSBhcyBhbnkpIGFzIGFueTtcbiAgICBjb25zdCBwcmV2UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxc3RyaW5nKSBhcyBhbnk7XG5cbiAgICAvLyBJZiB0aGUgaGFzaCBpcyB0aGUgc2FtZSwgcmV0YWluIHBhcmFtcy5cbiAgICBpZiAoaGFzaCA9PSBvbGRIYXNoKSB7XG4gICAgICAgIHJlcGxhY2VTdGF0ZSA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHByZXZQYXJhbXMuZW50cmllcygpKVxuICAgICAgICAgICAgaWYgKCFxdWVyeS5oYXMoa2V5KSlcbiAgICAgICAgICAgICAgICBxdWVyeS5zZXQoa2V5LCBwcmV2UGFyYW1zLmdldChrZXkpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgcXVlcnkuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHZhbCA9PSBudWxsIHx8XG4gICAgICAgICAgICB2YWwgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICB2YWwgPT0gJycgfHxcbiAgICAgICAgICAgIHZhbCA9PSAnbnVsbCcgfHxcbiAgICAgICAgICAgIE51bWJlci5pc05hTih2YWwpIHx8XG4gICAgICAgICAgICB2YWwgPT0gJ05hTidcbiAgICAgICAgKVxuICAgICAgICAgICAgcXVlcnkuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgaWYgKCEoaGFzaC50b0xvd2VyQ2FzZSgpID09IFwiIy9mcmFtZVwiKSB8fCBkYXRhWydpZCddID09IC0xKVxuICAgICAgICBxdWVyeS5kZWxldGUoJ2lkJyk7XG5cblxuICAgIGNvbnN0IHN0clF1ZXJ5ID0gcXVlcnkudG9TdHJpbmcoKTtcbiAgICBjb25zb2xlLmxvZyhkYXRhLCBoYXNoLCBzdHJRdWVyeSk7XG4gICAgaWYgKHJlcGxhY2VTdGF0ZSkge1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoZGF0YSwgJycsIGhhc2ggKyAoc3RyUXVlcnkgPyAoJz8nICsgc3RyUXVlcnkpIDogJycpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShkYXRhLCAnJywgaGFzaCArIChzdHJRdWVyeSA/ICgnPycgKyBzdHJRdWVyeSkgOiAnJykpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVcmxEYXRhID0gKHNvdXJjZSA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoKSA9PiB7XG4gICAgY29uc3QgW2hhc2gsIHF1ZXJ5XSA9IHNvdXJjZS5zcGxpdCgnPycpO1xuICAgIGxldCBkYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeSkgYXMgYW55O1xuICAgIHJldHVybiBbLi4uZGF0YS5lbnRyaWVzKCldLm1hcCgoW2ssIHZdKSA9PiAoeyBba106IHYgfSkpLnJlZHVjZSgoYSwgYikgPT4gKHsgLi4uYSwgLi4uYiB9KSwge30pO1xufTtcbiJdfQ==