@cute-dw/core
Version:
This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need
181 lines • 21 kB
JavaScript
/**
* Object that represents a _Unicode_ locale identifier and is inherited from the JavaScript's `Intl.Locale` class
*/
export class Locale extends Intl.Locale {
static get ENGLISH() { return Locale.of("en"); }
;
static get FRANCE() { return Locale.of("fr-FR"); }
;
static get FRENCH() { return Locale.of("fr"); }
;
static get CHINESE() { return Locale.of("zh"); }
;
static get SIMPLIFIED_CHINESE() { return Locale.of("zh-CN"); }
;
static get TRADITIONAL_CHINESE() { return Locale.of("zh-TW"); }
;
static get CHINA() { return Locale.SIMPLIFIED_CHINESE; }
;
static get TAIWAN() { return Locale.TRADITIONAL_CHINESE; }
;
static get GERMAN() { return Locale.of("de"); }
;
static get GERMANY() { return Locale.of("de-DE"); }
;
static get ITALIAN() { return Locale.of("it"); }
;
static get ITALY() { return Locale.of("it-IT"); }
;
static get JAPANESE() { return Locale.of("ja"); }
;
static get JAPAN() { return Locale.of("ja-JP"); }
;
static get KOREAN() { return Locale.of("ko"); }
;
static get KOREA() { return Locale.of("ko-KR"); }
;
static get CANADA() { return Locale.of("en-CA"); }
;
static get CANADA_FRENCH() { return Locale.of("fr-CA"); }
;
static get RPC() { return Locale.SIMPLIFIED_CHINESE; }
;
static get RU() { return Locale.of("ru-RU"); }
;
static get UK() { return Locale.of("en-GB"); }
;
static get US() { return Locale.of("en-US"); }
;
/**
* @constructor
* @param tag
* @param options
* @throws Error if incorrect locale information provided
*/
constructor(tag, options) {
super(tag ?? Locale.getDefaultLanguage(), options);
this._fullName = this.maximize().baseName;
}
/**
* Gets the browser navigator's language tag
* @returns Language tag
* @static
*/
static getDefaultLanguage() {
return (navigator.languages && navigator.languages.length ? navigator.languages[0] : navigator.language);
}
/**
* Factory method that returns singleton Locale object
* @param tag A language tag
* @param options An object with some or all of options of the locale
* @returns Locale object
* @throws Error if incorrect locale information provided
* @static
*/
static of(tag, options) {
return Locale.getLocale(tag, options);
}
/**
* Locale's factory method
* @param tag A language tag
* @param options An object with some or all of options of the locale
* @returns Locale object
* @throws Error if incorrect locale information provided
* @private
* @static
*/
static getLocale(tag, options) {
if (Locale.localeMap === undefined) {
Locale.localeMap = new Map();
}
const tempLocale = new Locale(tag, options);
const name = tempLocale.maximize().toString();
let locale = Locale.localeMap.get(name);
if (locale === undefined) {
locale = tempLocale;
Locale.localeMap.set(name, locale);
}
return locale;
}
/**
* Gets the character that is used as the decimal point designation
* @returns Delimiter character
*/
get decimalsDelimiter() {
const s = (new Intl.NumberFormat(this.toString())).format(0.1);
return s.charAt(1);
}
/**
* Gets the character that is used as the thousand groups delimiter
* @returns Delimiter character
*/
get thousandsDelimiter() {
const s = (new Intl.NumberFormat(this.toString())).format(1234);
const c = s.charAt(1);
return (c == '2' ? "" : c);
}
/**
* Gets an expanded locale name in the `language-script-region` format
* @returns Expanded locale name
* @since 0.5.0
*/
get fullName() {
return this._fullName;
}
/**
* Makes a clone of the current locale object
* @returns A cloned locale object
* @since 0.5.0
*/
clone() {
return new Locale(this.fullName);
}
/**
* Gets a string representing a Locale's extension information
* @returns Locale's extension string
* @since 0.5.0
*/
getExtension() {
const str = this.maximize().toString();
const uPos = str.indexOf(`-${Locale.UNICODE_LOCALE_EXTENSION}-`);
if (uPos >= 0) {
const xPos = str.indexOf(`-${Locale.PRIVATE_USE_EXTENSION}-`, uPos + 1);
if (xPos > 0) {
return str.substring(uPos + 3, xPos);
}
return str.substring(uPos + 3);
}
return "";
}
/**
* Gets a string representing a Locale's private use extension information
* @returns Locale's private use extension string
* @since 0.5.0
*/
getPrivateExtension() {
const str = this.maximize().toString();
const xPos = str.indexOf(`-${Locale.PRIVATE_USE_EXTENSION}-`);
if (xPos >= 0) {
const uPos = str.indexOf(`-${Locale.UNICODE_LOCALE_EXTENSION}-`, xPos + 1);
if (uPos > 0) {
return str.substring(xPos + 3, uPos);
}
return str.substring(xPos + 3);
}
return "";
}
/**
* Returns _true_ if this Locale has any extensions.
* @returns _true_ if this Locale has any extensions
* @since 0.5.0
*/
hasExtensions() {
const str = this.maximize().toString();
return str.indexOf(`-${Locale.PRIVATE_USE_EXTENSION}-`) >= 0 || str.indexOf(`-${Locale.UNICODE_LOCALE_EXTENSION}-`) >= 0;
}
}
/** The key for the private use extension ('...-x-...') */
Locale.PRIVATE_USE_EXTENSION = 'x';
/** The key for Unicode locale extension ('...-u-...') */
Locale.UNICODE_LOCALE_EXTENSION = 'u';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9jYWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3V0ZS1jb3JlL3NyYy9saWIvdXRpbC9pMThuL0xvY2FsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7R0FFRztBQUNILE1BQU0sT0FBTyxNQUFPLFNBQVEsSUFBSSxDQUFDLE1BQU07SUFHOUIsTUFBTSxLQUFLLE9BQU8sS0FBWSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQSxDQUFDO0lBQUEsQ0FBQztJQUN0RCxNQUFNLEtBQUssTUFBTSxLQUFZLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQSxDQUFBLENBQUM7SUFBQSxDQUFDO0lBQ3hELE1BQU0sS0FBSyxNQUFNLEtBQVksT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUEsQ0FBQztJQUFBLENBQUM7SUFDckQsTUFBTSxLQUFLLE9BQU8sS0FBWSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQSxDQUFDO0lBQUEsQ0FBQztJQUN0RCxNQUFNLEtBQUssa0JBQWtCLEtBQVksT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBLENBQUEsQ0FBQztJQUFBLENBQUM7SUFDcEUsTUFBTSxLQUFLLG1CQUFtQixLQUFZLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQSxDQUFBLENBQUM7SUFBQSxDQUFDO0lBQ3JFLE1BQU0sS0FBSyxLQUFLLEtBQVksT0FBTyxNQUFNLENBQUMsa0JBQWtCLENBQUEsQ0FBQSxDQUFDO0lBQUEsQ0FBQztJQUM5RCxNQUFNLEtBQUssTUFBTSxLQUFZLE9BQU8sTUFBTSxDQUFDLG1CQUFtQixDQUFBLENBQUEsQ0FBQztJQUFBLENBQUM7SUFDaEUsTUFBTSxLQUFLLE1BQU0sS0FBWSxPQUFPLE1B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QUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN0QztZQUNELE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDaEM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsYUFBYTtRQUNYLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLHdCQUF3QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0gsQ0FBQzs7QUFySUQsMERBQTBEO0FBQ25DLDRCQUFxQixHQUFHLEdBQUcsQ0FBQztBQUNuRCx5REFBeUQ7QUFDbEMsK0JBQXdCLEdBQUcsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2xvbmVhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZS9DbG9uZWFibGVcIjtcblxuLyoqXG4gKiBPYmplY3QgdGhhdCByZXByZXNlbnRzIGEgX1VuaWNvZGVfIGxvY2FsZSBpZGVudGlmaWVyIGFuZCBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgSmF2YVNjcmlwdCdzIGBJbnRsLkxvY2FsZWAgY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsZSBleHRlbmRzIEludGwuTG9jYWxlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbG9jYWxlTWFwOiBNYXA8c3RyaW5nLCBMb2NhbGU+IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEVOR0xJU0goKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwiZW5cIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBGUkFOQ0UoKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwiZnItRlJcIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBGUkVOQ0goKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwiZnJcIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBDSElORVNFKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcInpoXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgU0lNUExJRklFRF9DSElORVNFKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcInpoLUNOXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgVFJBRElUSU9OQUxfQ0hJTkVTRSgpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJ6aC1UV1wiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IENISU5BKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5TSU1QTElGSUVEX0NISU5FU0V9O1xuICBwdWJsaWMgc3RhdGljIGdldCBUQUlXQU4oKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLlRSQURJVElPTkFMX0NISU5FU0V9O1xuICBwdWJsaWMgc3RhdGljIGdldCBHRVJNQU4oKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwiZGVcIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBHRVJNQU5ZKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcImRlLURFXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgSVRBTElBTigpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJpdFwiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IElUQUxZKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcIml0LUlUXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgSkFQQU5FU0UoKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwiamFcIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBKQVBBTigpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJqYS1KUFwiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEtPUkVBTigpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJrb1wiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEtPUkVBKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcImtvLUtSXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgQ0FOQURBKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcImVuLUNBXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgQ0FOQURBX0ZSRU5DSCgpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJmci1DQVwiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IFJQQygpOiBMb2NhbGUge3JldHVybiBMb2NhbGUuU0lNUExJRklFRF9DSElORVNFfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgUlUoKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwicnUtUlVcIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBVSygpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJlbi1HQlwiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IFVTKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcImVuLVVTXCIpfTtcbiAgLyoqIFRoZSBrZXkgZm9yIHRoZSBwcml2YXRlIHVzZSBleHRlbnNpb24gKCcuLi4teC0uLi4nKSAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBSSVZBVEVfVVNFX0VYVEVOU0lPTiA9ICd4JztcbiAgLyoqIFRoZSBrZXkgZm9yIFVuaWNvZGUgbG9jYWxlIGV4dGVuc2lvbiAoJy4uLi11LS4uLicpICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVU5JQ09ERV9MT0NBTEVfRVhURU5TSU9OID0gJ3UnO1xuXG4gIHByaXZhdGUgX2Z1bGxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gdGFnXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgaW5jb3JyZWN0IGxvY2FsZSBpbmZvcm1hdGlvbiBwcm92aWRlZFxuICAgKi9cbiAgY29uc3RydWN0b3IodGFnPzogc3RyaW5nLCBvcHRpb25zPzogSW50bC5Mb2NhbGVPcHRpb25zICkge1xuICAgIHN1cGVyKHRhZyA/PyBMb2NhbGUuZ2V0RGVmYXVsdExhbmd1YWdlKCksIG9wdGlvbnMpO1xuICAgIHRoaXMuX2Z1bGxOYW1lID0gdGhpcy5tYXhpbWl6ZSgpLmJhc2VOYW1lITtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgYnJvd3NlciBuYXZpZ2F0b3IncyBsYW5ndWFnZSB0YWdcbiAgICogQHJldHVybnMgTGFuZ3VhZ2UgdGFnXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBnZXREZWZhdWx0TGFuZ3VhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcy5sZW5ndGggPyBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdIDogbmF2aWdhdG9yLmxhbmd1YWdlKTtcbiAgfVxuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QgdGhhdCByZXR1cm5zIHNpbmdsZXRvbiBMb2NhbGUgb2JqZWN0XG4gICAqIEBwYXJhbSB0YWcgQSBsYW5ndWFnZSB0YWdcbiAgICogQHBhcmFtIG9wdGlvbnMgQW4gb2JqZWN0IHdpdGggc29tZSBvciBhbGwgb2Ygb3B0aW9ucyBvZiB0aGUgbG9jYWxlXG4gICAqIEByZXR1cm5zIExvY2FsZSBvYmplY3RcbiAgICogQHRocm93cyBFcnJvciBpZiBpbmNvcnJlY3QgbG9jYWxlIGluZm9ybWF0aW9uIHByb3ZpZGVkXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBvZih0YWc6IHN0cmluZywgb3B0aW9ucz86IEludGwuTG9jYWxlT3B0aW9ucyk6IExvY2FsZSB7XG4gICAgcmV0dXJuIExvY2FsZS5nZXRMb2NhbGUodGFnLCBvcHRpb25zKTtcbiAgfVxuICAvKipcbiAgICogTG9jYWxlJ3MgZmFjdG9yeSBtZXRob2RcbiAgICogQHBhcmFtIHRhZyBBIGxhbmd1YWdlIHRhZ1xuICAgKiBAcGFyYW0gb3B0aW9ucyBBbiBvYmplY3Qgd2l0aCBzb21lIG9yIGFsbCBvZiBvcHRpb25zIG9mIHRoZSBsb2NhbGVcbiAgICogQHJldHVybnMgTG9jYWxlIG9iamVjdFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGluY29ycmVjdCBsb2NhbGUgaW5mb3JtYXRpb24gcHJvdmlkZWRcbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TG9jYWxlKHRhZzogc3RyaW5nLCBvcHRpb25zPzogSW50bC5Mb2NhbGVPcHRpb25zKTogTG9jYWxlIHtcbiAgICBpZiAoTG9jYWxlLmxvY2FsZU1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBMb2NhbGUubG9jYWxlTWFwID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wTG9jYWxlID0gbmV3IExvY2FsZSh0YWcsIG9wdGlvbnMpO1xuICAgIGNvbnN0IG5hbWUgPSB0ZW1wTG9jYWxlLm1heGltaXplKCkudG9TdHJpbmcoKTtcbiAgICBsZXQgbG9jYWxlOiBMb2NhbGUgfCB1bmRlZmluZWQgPSBMb2NhbGUubG9jYWxlTWFwLmdldChuYW1lKTtcbiAgICBpZiAobG9jYWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGxvY2FsZSA9IHRlbXBMb2NhbGU7XG4gICAgICBMb2NhbGUubG9jYWxlTWFwLnNldChuYW1lLCBsb2NhbGUpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxlO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjaGFyYWN0ZXIgdGhhdCBpcyB1c2VkIGFzIHRoZSBkZWNpbWFsIHBvaW50IGRlc2lnbmF0aW9uXG4gICAqIEByZXR1cm5zIERlbGltaXRlciBjaGFyYWN0ZXJcbiAgICovXG4gIGdldCBkZWNpbWFsc0RlbGltaXRlcigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHMgPSAobmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMudG9TdHJpbmcoKSkpLmZvcm1hdCgwLjEpO1xuICAgIHJldHVybiBzLmNoYXJBdCgxKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY2hhcmFjdGVyIHRoYXQgaXMgdXNlZCBhcyB0aGUgdGhvdXNhbmQgZ3JvdXBzIGRlbGltaXRlclxuICAgKiBAcmV0dXJucyBEZWxpbWl0ZXIgY2hhcmFjdGVyXG4gICAqL1xuICBnZXQgdGhvdXNhbmRzRGVsaW1pdGVyKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcyA9IChuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy50b1N0cmluZygpKSkuZm9ybWF0KDEyMzQpIDtcbiAgICBjb25zdCBjID0gcy5jaGFyQXQoMSk7XG4gICAgcmV0dXJuIChjPT0nMicgPyBcIlwiIDogYyk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgYW4gZXhwYW5kZWQgbG9jYWxlIG5hbWUgaW4gdGhlIGBsYW5ndWFnZS1zY3JpcHQtcmVnaW9uYCBmb3JtYXRcbiAgICogQHJldHVybnMgRXhwYW5kZWQgbG9jYWxlIG5hbWVcbiAgICogQHNpbmNlIDAuNS4wXG4gICAqL1xuICBnZXQgZnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZnVsbE5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIE1ha2VzIGEgY2xvbmUgb2YgdGhlIGN1cnJlbnQgbG9jYWxlIG9iamVjdFxuICAgKiBAcmV0dXJucyBBIGNsb25lZCBsb2NhbGUgb2JqZWN0XG4gICAqIEBzaW5jZSAwLjUuMFxuICAgKi9cbiAgY2xvbmUoKTogTG9jYWxlIHtcbiAgICByZXR1cm4gbmV3IExvY2FsZSggdGhpcy5mdWxsTmFtZSApO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIExvY2FsZSdzIGV4dGVuc2lvbiBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJucyBMb2NhbGUncyBleHRlbnNpb24gc3RyaW5nXG4gICAqIEBzaW5jZSAwLjUuMFxuICAgKi9cbiAgZ2V0RXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RyID0gdGhpcy5tYXhpbWl6ZSgpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgdVBvcyA9IHN0ci5pbmRleE9mKGAtJHtMb2NhbGUuVU5JQ09ERV9MT0NBTEVfRVhURU5TSU9OfS1gKTtcbiAgICBpZiAodVBvcyA+PSAwKSB7XG4gICAgICBjb25zdCB4UG9zID0gc3RyLmluZGV4T2YoYC0ke0xvY2FsZS5QUklWQVRFX1VTRV9FWFRFTlNJT059LWAsIHVQb3MgKyAxKTtcbiAgICAgIGlmICh4UG9zID4gMCkge1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cmluZyh1UG9zICsgMywgeFBvcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyLnN1YnN0cmluZyh1UG9zICsgMyk7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIExvY2FsZSdzIHByaXZhdGUgdXNlIGV4dGVuc2lvbiBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJucyBMb2NhbGUncyBwcml2YXRlIHVzZSBleHRlbnNpb24gc3RyaW5nXG4gICAqIEBzaW5jZSAwLjUuMFxuICAgKi9cbiAgZ2V0UHJpdmF0ZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0ciA9IHRoaXMubWF4aW1pemUoKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHhQb3MgPSBzdHIuaW5kZXhPZihgLSR7TG9jYWxlLlBSSVZBVEVfVVNFX0VYVEVOU0lPTn0tYCk7XG4gICAgaWYgKHhQb3MgPj0gMCkge1xuICAgICAgY29uc3QgdVBvcyA9IHN0ci5pbmRleE9mKGAtJHtMb2NhbGUuVU5JQ09ERV9MT0NBTEVfRVhURU5TSU9OfS1gLCB4UG9zICsgMSk7XG4gICAgICBpZiAodVBvcyA+IDApIHtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoeFBvcyArIDMsIHVQb3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoeFBvcyArIDMpO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBfdHJ1ZV8gaWYgdGhpcyBMb2NhbGUgaGFzIGFueSBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyBfdHJ1ZV8gaWYgdGhpcyBMb2NhbGUgaGFzIGFueSBleHRlbnNpb25zXG4gICAqIEBzaW5jZSAwLjUuMFxuICAgKi9cbiAgaGFzRXh0ZW5zaW9ucygpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdHIgPSB0aGlzLm1heGltaXplKCkudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gc3RyLmluZGV4T2YoYC0ke0xvY2FsZS5QUklWQVRFX1VTRV9FWFRFTlNJT059LWApID49IDAgfHwgc3RyLmluZGV4T2YoYC0ke0xvY2FsZS5VTklDT0RFX0xPQ0FMRV9FWFRFTlNJT059LWApID49IDA7XG4gIH1cblxufVxuXG4iXX0=