|
|
/*
|
|
|
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
|
|
|
if you want to view the source visit the plugins github repository
|
|
|
*/
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
var obsidian = require('obsidian');
|
|
|
var state = require('@codemirror/state');
|
|
|
var view = require('@codemirror/view');
|
|
|
|
|
|
/*! *****************************************************************************
|
|
|
Copyright (c) Microsoft Corporation.
|
|
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
|
purpose with or without fee is hereby granted.
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
PERFORMANCE OF THIS SOFTWARE.
|
|
|
***************************************************************************** */
|
|
|
/* 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 (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
|
return extendStatics(d, b);
|
|
|
};
|
|
|
|
|
|
function __extends(d, b) {
|
|
|
if (typeof b !== "function" && b !== null)
|
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
|
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) {
|
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
|
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) : adopt(result.value).then(fulfilled, rejected); }
|
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/** @deprecated */
|
|
|
function __spreadArrays() {
|
|
|
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
|
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
|
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
|
r[k] = a[j];
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Represents TODO items in Markdown.
|
|
|
*
|
|
|
* This class shouldn't break original line.
|
|
|
*/
|
|
|
class Todo {
|
|
|
constructor(lineIndex, prefix, check, suffix, body) {
|
|
|
this.lineIndex = lineIndex;
|
|
|
this.prefix = prefix;
|
|
|
this.check = check;
|
|
|
this.suffix = suffix;
|
|
|
this.body = body;
|
|
|
}
|
|
|
static parse(lineIndex, line) {
|
|
|
const match = Todo.regexp.exec(line);
|
|
|
if (match) {
|
|
|
return new Todo(lineIndex, match.groups['prefix'], match.groups['check'], match.groups['suffix'], match.groups['body']);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
toMarkdown() {
|
|
|
return `${this.prefix}${this.check}${this.suffix}${this.body}`;
|
|
|
}
|
|
|
isChecked() {
|
|
|
return this.check === 'x';
|
|
|
}
|
|
|
setChecked(checked) {
|
|
|
this.check = checked ? 'x' : ' ';
|
|
|
}
|
|
|
clone() {
|
|
|
return Todo.parse(this.lineIndex, this.toMarkdown());
|
|
|
}
|
|
|
}
|
|
|
// e.g: ' - [x] hello'
|
|
|
// prefix: ' - [ '
|
|
|
// check: 'x'
|
|
|
// suffix: '] '
|
|
|
// body: hello
|
|
|
Todo.regexp = /^(?<prefix>((> ?)*)?\s*[\-\*] \[)(?<check>.)(?<suffix>\]\s+)(?<body>.*)$/;
|
|
|
class MarkdownDocument {
|
|
|
constructor(file, content) {
|
|
|
this.file = file;
|
|
|
this.lines = [];
|
|
|
this.todos = [];
|
|
|
this.parse(content);
|
|
|
}
|
|
|
parse(content) {
|
|
|
this.lines = content.split("\n");
|
|
|
this.todos = [];
|
|
|
this.lines.forEach((line, lineIndex) => {
|
|
|
const todo = Todo.parse(lineIndex, line);
|
|
|
if (todo) {
|
|
|
this.todos.push(todo);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
getTodos() {
|
|
|
return this.todos;
|
|
|
}
|
|
|
insertTodo(lineIndex, todo) {
|
|
|
todo.lineIndex = lineIndex;
|
|
|
this.lines.splice(lineIndex, 0, todo.toMarkdown());
|
|
|
let todoIndex = -1;
|
|
|
for (const i in this.todos) {
|
|
|
const todo = this.todos[i];
|
|
|
if (todo.lineIndex >= lineIndex) {
|
|
|
if (todoIndex < 0) {
|
|
|
todoIndex = parseInt(i);
|
|
|
}
|
|
|
todo.lineIndex++;
|
|
|
}
|
|
|
}
|
|
|
if (todoIndex <= 0) {
|
|
|
this.todos.splice(0, 0, todo);
|
|
|
}
|
|
|
else {
|
|
|
this.todos.splice(todoIndex, 0, todo);
|
|
|
}
|
|
|
}
|
|
|
getTodo(lineIndex) {
|
|
|
const found = this.todos.find(todo => todo.lineIndex === lineIndex);
|
|
|
if (found == null) {
|
|
|
return null;
|
|
|
}
|
|
|
return found;
|
|
|
}
|
|
|
applyChanges() {
|
|
|
// apply changes of TODO items to lines
|
|
|
this.todos.forEach(todo => {
|
|
|
this.lines[todo.lineIndex] = todo.toMarkdown();
|
|
|
});
|
|
|
}
|
|
|
toMarkdown() {
|
|
|
this.applyChanges();
|
|
|
return this.lines.join('\n');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class ConstantReference {
|
|
|
constructor(_value) {
|
|
|
this._value = _value;
|
|
|
}
|
|
|
get value() {
|
|
|
return this._value;
|
|
|
}
|
|
|
}
|
|
|
class Reference {
|
|
|
constructor(_value) {
|
|
|
this._value = _value;
|
|
|
this.onChangeFunctions = [];
|
|
|
}
|
|
|
onChanged(listener) {
|
|
|
this.onChangeFunctions.push(listener);
|
|
|
}
|
|
|
get value() {
|
|
|
return this._value;
|
|
|
}
|
|
|
set value(value) {
|
|
|
const oldValue = this._value;
|
|
|
this._value = value;
|
|
|
this.onChangeFunctions.forEach((f) => {
|
|
|
f(oldValue, value);
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
|
|
|
|
function createCommonjsModule(fn) {
|
|
|
var module = { exports: {} };
|
|
|
return fn(module, module.exports), module.exports;
|
|
|
}
|
|
|
|
|
|
function commonjsRequire (path) {
|
|
|
throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
|
|
|
}
|
|
|
|
|
|
var moment = createCommonjsModule(function (module, exports) {
|
|
|
(function (global, factory) {
|
|
|
module.exports = factory() ;
|
|
|
}(commonjsGlobal, (function () {
|
|
|
var hookCallback;
|
|
|
|
|
|
function hooks() {
|
|
|
return hookCallback.apply(null, arguments);
|
|
|
}
|
|
|
|
|
|
// This is done to register the method called with moment()
|
|
|
// without creating circular dependencies.
|
|
|
function setHookCallback(callback) {
|
|
|
hookCallback = callback;
|
|
|
}
|
|
|
|
|
|
function isArray(input) {
|
|
|
return (
|
|
|
input instanceof Array ||
|
|
|
Object.prototype.toString.call(input) === '[object Array]'
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function isObject(input) {
|
|
|
// IE8 will treat undefined and null as object if it wasn't for
|
|
|
// input != null
|
|
|
return (
|
|
|
input != null &&
|
|
|
Object.prototype.toString.call(input) === '[object Object]'
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function hasOwnProp(a, b) {
|
|
|
return Object.prototype.hasOwnProperty.call(a, b);
|
|
|
}
|
|
|
|
|
|
function isObjectEmpty(obj) {
|
|
|
if (Object.getOwnPropertyNames) {
|
|
|
return Object.getOwnPropertyNames(obj).length === 0;
|
|
|
} else {
|
|
|
var k;
|
|
|
for (k in obj) {
|
|
|
if (hasOwnProp(obj, k)) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function isUndefined(input) {
|
|
|
return input === void 0;
|
|
|
}
|
|
|
|
|
|
function isNumber(input) {
|
|
|
return (
|
|
|
typeof input === 'number' ||
|
|
|
Object.prototype.toString.call(input) === '[object Number]'
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function isDate(input) {
|
|
|
return (
|
|
|
input instanceof Date ||
|
|
|
Object.prototype.toString.call(input) === '[object Date]'
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function map(arr, fn) {
|
|
|
var res = [],
|
|
|
i;
|
|
|
for (i = 0; i < arr.length; ++i) {
|
|
|
res.push(fn(arr[i], i));
|
|
|
}
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
function extend(a, b) {
|
|
|
for (var i in b) {
|
|
|
if (hasOwnProp(b, i)) {
|
|
|
a[i] = b[i];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (hasOwnProp(b, 'toString')) {
|
|
|
a.toString = b.toString;
|
|
|
}
|
|
|
|
|
|
if (hasOwnProp(b, 'valueOf')) {
|
|
|
a.valueOf = b.valueOf;
|
|
|
}
|
|
|
|
|
|
return a;
|
|
|
}
|
|
|
|
|
|
function createUTC(input, format, locale, strict) {
|
|
|
return createLocalOrUTC(input, format, locale, strict, true).utc();
|
|
|
}
|
|
|
|
|
|
function defaultParsingFlags() {
|
|
|
// We need to deep clone this object.
|
|
|
return {
|
|
|
empty: false,
|
|
|
unusedTokens: [],
|
|
|
unusedInput: [],
|
|
|
overflow: -2,
|
|
|
charsLeftOver: 0,
|
|
|
nullInput: false,
|
|
|
invalidEra: null,
|
|
|
invalidMonth: null,
|
|
|
invalidFormat: false,
|
|
|
userInvalidated: false,
|
|
|
iso: false,
|
|
|
parsedDateParts: [],
|
|
|
era: null,
|
|
|
meridiem: null,
|
|
|
rfc2822: false,
|
|
|
weekdayMismatch: false,
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function getParsingFlags(m) {
|
|
|
if (m._pf == null) {
|
|
|
m._pf = defaultParsingFlags();
|
|
|
}
|
|
|
return m._pf;
|
|
|
}
|
|
|
|
|
|
var some;
|
|
|
if (Array.prototype.some) {
|
|
|
some = Array.prototype.some;
|
|
|
} else {
|
|
|
some = function (fun) {
|
|
|
var t = Object(this),
|
|
|
len = t.length >>> 0,
|
|
|
i;
|
|
|
|
|
|
for (i = 0; i < len; i++) {
|
|
|
if (i in t && fun.call(this, t[i], i, t)) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function isValid(m) {
|
|
|
if (m._isValid == null) {
|
|
|
var flags = getParsingFlags(m),
|
|
|
parsedParts = some.call(flags.parsedDateParts, function (i) {
|
|
|
return i != null;
|
|
|
}),
|
|
|
isNowValid =
|
|
|
!isNaN(m._d.getTime()) &&
|
|
|
flags.overflow < 0 &&
|
|
|
!flags.empty &&
|
|
|
!flags.invalidEra &&
|
|
|
!flags.invalidMonth &&
|
|
|
!flags.invalidWeekday &&
|
|
|
!flags.weekdayMismatch &&
|
|
|
!flags.nullInput &&
|
|
|
!flags.invalidFormat &&
|
|
|
!flags.userInvalidated &&
|
|
|
(!flags.meridiem || (flags.meridiem && parsedParts));
|
|
|
|
|
|
if (m._strict) {
|
|
|
isNowValid =
|
|
|
isNowValid &&
|
|
|
flags.charsLeftOver === 0 &&
|
|
|
flags.unusedTokens.length === 0 &&
|
|
|
flags.bigHour === undefined;
|
|
|
}
|
|
|
|
|
|
if (Object.isFrozen == null || !Object.isFrozen(m)) {
|
|
|
m._isValid = isNowValid;
|
|
|
} else {
|
|
|
return isNowValid;
|
|
|
}
|
|
|
}
|
|
|
return m._isValid;
|
|
|
}
|
|
|
|
|
|
function createInvalid(flags) {
|
|
|
var m = createUTC(NaN);
|
|
|
if (flags != null) {
|
|
|
extend(getParsingFlags(m), flags);
|
|
|
} else {
|
|
|
getParsingFlags(m).userInvalidated = true;
|
|
|
}
|
|
|
|
|
|
return m;
|
|
|
}
|
|
|
|
|
|
// Plugins that add properties should also add the key here (null value),
|
|
|
// so we can properly clone ourselves.
|
|
|
var momentProperties = (hooks.momentProperties = []),
|
|
|
updateInProgress = false;
|
|
|
|
|
|
function copyConfig(to, from) {
|
|
|
var i, prop, val;
|
|
|
|
|
|
if (!isUndefined(from._isAMomentObject)) {
|
|
|
to._isAMomentObject = from._isAMomentObject;
|
|
|
}
|
|
|
if (!isUndefined(from._i)) {
|
|
|
to._i = from._i;
|
|
|
}
|
|
|
if (!isUndefined(from._f)) {
|
|
|
to._f = from._f;
|
|
|
}
|
|
|
if (!isUndefined(from._l)) {
|
|
|
to._l = from._l;
|
|
|
}
|
|
|
if (!isUndefined(from._strict)) {
|
|
|
to._strict = from._strict;
|
|
|
}
|
|
|
if (!isUndefined(from._tzm)) {
|
|
|
to._tzm = from._tzm;
|
|
|
}
|
|
|
if (!isUndefined(from._isUTC)) {
|
|
|
to._isUTC = from._isUTC;
|
|
|
}
|
|
|
if (!isUndefined(from._offset)) {
|
|
|
to._offset = from._offset;
|
|
|
}
|
|
|
if (!isUndefined(from._pf)) {
|
|
|
to._pf = getParsingFlags(from);
|
|
|
}
|
|
|
if (!isUndefined(from._locale)) {
|
|
|
to._locale = from._locale;
|
|
|
}
|
|
|
|
|
|
if (momentProperties.length > 0) {
|
|
|
for (i = 0; i < momentProperties.length; i++) {
|
|
|
prop = momentProperties[i];
|
|
|
val = from[prop];
|
|
|
if (!isUndefined(val)) {
|
|
|
to[prop] = val;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return to;
|
|
|
}
|
|
|
|
|
|
// Moment prototype object
|
|
|
function Moment(config) {
|
|
|
copyConfig(this, config);
|
|
|
this._d = new Date(config._d != null ? config._d.getTime() : NaN);
|
|
|
if (!this.isValid()) {
|
|
|
this._d = new Date(NaN);
|
|
|
}
|
|
|
// Prevent infinite loop in case updateOffset creates new moment
|
|
|
// objects.
|
|
|
if (updateInProgress === false) {
|
|
|
updateInProgress = true;
|
|
|
hooks.updateOffset(this);
|
|
|
updateInProgress = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function isMoment(obj) {
|
|
|
return (
|
|
|
obj instanceof Moment || (obj != null && obj._isAMomentObject != null)
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function warn(msg) {
|
|
|
if (
|
|
|
hooks.suppressDeprecationWarnings === false &&
|
|
|
typeof console !== 'undefined' &&
|
|
|
console.warn
|
|
|
) {
|
|
|
console.warn('Deprecation warning: ' + msg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function deprecate(msg, fn) {
|
|
|
var firstTime = true;
|
|
|
|
|
|
return extend(function () {
|
|
|
if (hooks.deprecationHandler != null) {
|
|
|
hooks.deprecationHandler(null, msg);
|
|
|
}
|
|
|
if (firstTime) {
|
|
|
var args = [],
|
|
|
arg,
|
|
|
i,
|
|
|
key;
|
|
|
for (i = 0; i < arguments.length; i++) {
|
|
|
arg = '';
|
|
|
if (typeof arguments[i] === 'object') {
|
|
|
arg += '\n[' + i + '] ';
|
|
|
for (key in arguments[0]) {
|
|
|
if (hasOwnProp(arguments[0], key)) {
|
|
|
arg += key + ': ' + arguments[0][key] + ', ';
|
|
|
}
|
|
|
}
|
|
|
arg = arg.slice(0, -2); // Remove trailing comma and space
|
|
|
} else {
|
|
|
arg = arguments[i];
|
|
|
}
|
|
|
args.push(arg);
|
|
|
}
|
|
|
warn(
|
|
|
msg +
|
|
|
'\nArguments: ' +
|
|
|
Array.prototype.slice.call(args).join('') +
|
|
|
'\n' +
|
|
|
new Error().stack
|
|
|
);
|
|
|
firstTime = false;
|
|
|
}
|
|
|
return fn.apply(this, arguments);
|
|
|
}, fn);
|
|
|
}
|
|
|
|
|
|
var deprecations = {};
|
|
|
|
|
|
function deprecateSimple(name, msg) {
|
|
|
if (hooks.deprecationHandler != null) {
|
|
|
hooks.deprecationHandler(name, msg);
|
|
|
}
|
|
|
if (!deprecations[name]) {
|
|
|
warn(msg);
|
|
|
deprecations[name] = true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
hooks.suppressDeprecationWarnings = false;
|
|
|
hooks.deprecationHandler = null;
|
|
|
|
|
|
function isFunction(input) {
|
|
|
return (
|
|
|
(typeof Function !== 'undefined' && input instanceof Function) ||
|
|
|
Object.prototype.toString.call(input) === '[object Function]'
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function set(config) {
|
|
|
var prop, i;
|
|
|
for (i in config) {
|
|
|
if (hasOwnProp(config, i)) {
|
|
|
prop = config[i];
|
|
|
if (isFunction(prop)) {
|
|
|
this[i] = prop;
|
|
|
} else {
|
|
|
this['_' + i] = prop;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
this._config = config;
|
|
|
// Lenient ordinal parsing accepts just a number in addition to
|
|
|
// number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
|
|
|
// TODO: Remove "ordinalParse" fallback in next major release.
|
|
|
this._dayOfMonthOrdinalParseLenient = new RegExp(
|
|
|
(this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
|
|
|
'|' +
|
|
|
/\d{1,2}/.source
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function mergeConfigs(parentConfig, childConfig) {
|
|
|
var res = extend({}, parentConfig),
|
|
|
prop;
|
|
|
for (prop in childConfig) {
|
|
|
if (hasOwnProp(childConfig, prop)) {
|
|
|
if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
|
|
|
res[prop] = {};
|
|
|
extend(res[prop], parentConfig[prop]);
|
|
|
extend(res[prop], childConfig[prop]);
|
|
|
} else if (childConfig[prop] != null) {
|
|
|
res[prop] = childConfig[prop];
|
|
|
} else {
|
|
|
delete res[prop];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
for (prop in parentConfig) {
|
|
|
if (
|
|
|
hasOwnProp(parentConfig, prop) &&
|
|
|
!hasOwnProp(childConfig, prop) &&
|
|
|
isObject(parentConfig[prop])
|
|
|
) {
|
|
|
// make sure changes to properties don't modify parent config
|
|
|
res[prop] = extend({}, res[prop]);
|
|
|
}
|
|
|
}
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
function Locale(config) {
|
|
|
if (config != null) {
|
|
|
this.set(config);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var keys;
|
|
|
|
|
|
if (Object.keys) {
|
|
|
keys = Object.keys;
|
|
|
} else {
|
|
|
keys = function (obj) {
|
|
|
var i,
|
|
|
res = [];
|
|
|
for (i in obj) {
|
|
|
if (hasOwnProp(obj, i)) {
|
|
|
res.push(i);
|
|
|
}
|
|
|
}
|
|
|
return res;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
var defaultCalendar = {
|
|
|
sameDay: '[Today at] LT',
|
|
|
nextDay: '[Tomorrow at] LT',
|
|
|
nextWeek: 'dddd [at] LT',
|
|
|
lastDay: '[Yesterday at] LT',
|
|
|
lastWeek: '[Last] dddd [at] LT',
|
|
|
sameElse: 'L',
|
|
|
};
|
|
|
|
|
|
function calendar(key, mom, now) {
|
|
|
var output = this._calendar[key] || this._calendar['sameElse'];
|
|
|
return isFunction(output) ? output.call(mom, now) : output;
|
|
|
}
|
|
|
|
|
|
function zeroFill(number, targetLength, forceSign) {
|
|
|
var absNumber = '' + Math.abs(number),
|
|
|
zerosToFill = targetLength - absNumber.length,
|
|
|
sign = number >= 0;
|
|
|
return (
|
|
|
(sign ? (forceSign ? '+' : '') : '-') +
|
|
|
Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +
|
|
|
absNumber
|
|
|
);
|
|
|
}
|
|
|
|
|
|
var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
|
|
|
localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
|
|
|
formatFunctions = {},
|
|
|
formatTokenFunctions = {};
|
|
|
|
|
|
// token: 'M'
|
|
|
// padded: ['MM', 2]
|
|
|
// ordinal: 'Mo'
|
|
|
// callback: function () { this.month() + 1 }
|
|
|
function addFormatToken(token, padded, ordinal, callback) {
|
|
|
var func = callback;
|
|
|
if (typeof callback === 'string') {
|
|
|
func = function () {
|
|
|
return this[callback]();
|
|
|
};
|
|
|
}
|
|
|
if (token) {
|
|
|
formatTokenFunctions[token] = func;
|
|
|
}
|
|
|
if (padded) {
|
|
|
formatTokenFunctions[padded[0]] = function () {
|
|
|
return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
|
|
|
};
|
|
|
}
|
|
|
if (ordinal) {
|
|
|
formatTokenFunctions[ordinal] = function () {
|
|
|
return this.localeData().ordinal(
|
|
|
func.apply(this, arguments),
|
|
|
token
|
|
|
);
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function removeFormattingTokens(input) {
|
|
|
if (input.match(/\[[\s\S]/)) {
|
|
|
return input.replace(/^\[|\]$/g, '');
|
|
|
}
|
|
|
return input.replace(/\\/g, '');
|
|
|
}
|
|
|
|
|
|
function makeFormatFunction(format) {
|
|
|
var array = format.match(formattingTokens),
|
|
|
i,
|
|
|
length;
|
|
|
|
|
|
for (i = 0, length = array.length; i < length; i++) {
|
|
|
if (formatTokenFunctions[array[i]]) {
|
|
|
array[i] = formatTokenFunctions[array[i]];
|
|
|
} else {
|
|
|
array[i] = removeFormattingTokens(array[i]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return function (mom) {
|
|
|
var output = '',
|
|
|
i;
|
|
|
for (i = 0; i < length; i++) {
|
|
|
output += isFunction(array[i])
|
|
|
? array[i].call(mom, format)
|
|
|
: array[i];
|
|
|
}
|
|
|
return output;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
// format date using native date object
|
|
|
function formatMoment(m, format) {
|
|
|
if (!m.isValid()) {
|
|
|
return m.localeData().invalidDate();
|
|
|
}
|
|
|
|
|
|
format = expandFormat(format, m.localeData());
|
|
|
formatFunctions[format] =
|
|
|
formatFunctions[format] || makeFormatFunction(format);
|
|
|
|
|
|
return formatFunctions[format](m);
|
|
|
}
|
|
|
|
|
|
function expandFormat(format, locale) {
|
|
|
var i = 5;
|
|
|
|
|
|
function replaceLongDateFormatTokens(input) {
|
|
|
return locale.longDateFormat(input) || input;
|
|
|
}
|
|
|
|
|
|
localFormattingTokens.lastIndex = 0;
|
|
|
while (i >= 0 && localFormattingTokens.test(format)) {
|
|
|
format = format.replace(
|
|
|
localFormattingTokens,
|
|
|
replaceLongDateFormatTokens
|
|
|
);
|
|
|
localFormattingTokens.lastIndex = 0;
|
|
|
i -= 1;
|
|
|
}
|
|
|
|
|
|
return format;
|
|
|
}
|
|
|
|
|
|
var defaultLongDateFormat = {
|
|
|
LTS: 'h:mm:ss A',
|
|
|
LT: 'h:mm A',
|
|
|
L: 'MM/DD/YYYY',
|
|
|
LL: 'MMMM D, YYYY',
|
|
|
LLL: 'MMMM D, YYYY h:mm A',
|
|
|
LLLL: 'dddd, MMMM D, YYYY h:mm A',
|
|
|
};
|
|
|
|
|
|
function longDateFormat(key) {
|
|
|
var format = this._longDateFormat[key],
|
|
|
formatUpper = this._longDateFormat[key.toUpperCase()];
|
|
|
|
|
|
if (format || !formatUpper) {
|
|
|
return format;
|
|
|
}
|
|
|
|
|
|
this._longDateFormat[key] = formatUpper
|
|
|
.match(formattingTokens)
|
|
|
.map(function (tok) {
|
|
|
if (
|
|
|
tok === 'MMMM' ||
|
|
|
tok === 'MM' ||
|
|
|
tok === 'DD' ||
|
|
|
tok === 'dddd'
|
|
|
) {
|
|
|
return tok.slice(1);
|
|
|
}
|
|
|
return tok;
|
|
|
})
|
|
|
.join('');
|
|
|
|
|
|
return this._longDateFormat[key];
|
|
|
}
|
|
|
|
|
|
var defaultInvalidDate = 'Invalid date';
|
|
|
|
|
|
function invalidDate() {
|
|
|
return this._invalidDate;
|
|
|
}
|
|
|
|
|
|
var defaultOrdinal = '%d',
|
|
|
defaultDayOfMonthOrdinalParse = /\d{1,2}/;
|
|
|
|
|
|
function ordinal(number) {
|
|
|
return this._ordinal.replace('%d', number);
|
|
|
}
|
|
|
|
|
|
var defaultRelativeTime = {
|
|
|
future: 'in %s',
|
|
|
past: '%s ago',
|
|
|
s: 'a few seconds',
|
|
|
ss: '%d seconds',
|
|
|
m: 'a minute',
|
|
|
mm: '%d minutes',
|
|
|
h: 'an hour',
|
|
|
hh: '%d hours',
|
|
|
d: 'a day',
|
|
|
dd: '%d days',
|
|
|
w: 'a week',
|
|
|
ww: '%d weeks',
|
|
|
M: 'a month',
|
|
|
MM: '%d months',
|
|
|
y: 'a year',
|
|
|
yy: '%d years',
|
|
|
};
|
|
|
|
|
|
function relativeTime(number, withoutSuffix, string, isFuture) {
|
|
|
var output = this._relativeTime[string];
|
|
|
return isFunction(output)
|
|
|
? output(number, withoutSuffix, string, isFuture)
|
|
|
: output.replace(/%d/i, number);
|
|
|
}
|
|
|
|
|
|
function pastFuture(diff, output) {
|
|
|
var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
|
|
|
return isFunction(format) ? format(output) : format.replace(/%s/i, output);
|
|
|
}
|
|
|
|
|
|
var aliases = {};
|
|
|
|
|
|
function addUnitAlias(unit, shorthand) {
|
|
|
var lowerCase = unit.toLowerCase();
|
|
|
aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
|
|
|
}
|
|
|
|
|
|
function normalizeUnits(units) {
|
|
|
return typeof units === 'string'
|
|
|
? aliases[units] || aliases[units.toLowerCase()]
|
|
|
: undefined;
|
|
|
}
|
|
|
|
|
|
function normalizeObjectUnits(inputObject) {
|
|
|
var normalizedInput = {},
|
|
|
normalizedProp,
|
|
|
prop;
|
|
|
|
|
|
for (prop in inputObject) {
|
|
|
if (hasOwnProp(inputObject, prop)) {
|
|
|
normalizedProp = normalizeUnits(prop);
|
|
|
if (normalizedProp) {
|
|
|
normalizedInput[normalizedProp] = inputObject[prop];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return normalizedInput;
|
|
|
}
|
|
|
|
|
|
var priorities = {};
|
|
|
|
|
|
function addUnitPriority(unit, priority) {
|
|
|
priorities[unit] = priority;
|
|
|
}
|
|
|
|
|
|
function getPrioritizedUnits(unitsObj) {
|
|
|
var units = [],
|
|
|
u;
|
|
|
for (u in unitsObj) {
|
|
|
if (hasOwnProp(unitsObj, u)) {
|
|
|
units.push({ unit: u, priority: priorities[u] });
|
|
|
}
|
|
|
}
|
|
|
units.sort(function (a, b) {
|
|
|
return a.priority - b.priority;
|
|
|
});
|
|
|
return units;
|
|
|
}
|
|
|
|
|
|
function isLeapYear(year) {
|
|
|
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
|
}
|
|
|
|
|
|
function absFloor(number) {
|
|
|
if (number < 0) {
|
|
|
// -0 -> 0
|
|
|
return Math.ceil(number) || 0;
|
|
|
} else {
|
|
|
return Math.floor(number);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function toInt(argumentForCoercion) {
|
|
|
var coercedNumber = +argumentForCoercion,
|
|
|
value = 0;
|
|
|
|
|
|
if (coercedNumber !== 0 && isFinite(coercedNumber)) {
|
|
|
value = absFloor(coercedNumber);
|
|
|
}
|
|
|
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
function makeGetSet(unit, keepTime) {
|
|
|
return function (value) {
|
|
|
if (value != null) {
|
|
|
set$1(this, unit, value);
|
|
|
hooks.updateOffset(this, keepTime);
|
|
|
return this;
|
|
|
} else {
|
|
|
return get(this, unit);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function get(mom, unit) {
|
|
|
return mom.isValid()
|
|
|
? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]()
|
|
|
: NaN;
|
|
|
}
|
|
|
|
|
|
function set$1(mom, unit, value) {
|
|
|
if (mom.isValid() && !isNaN(value)) {
|
|
|
if (
|
|
|
unit === 'FullYear' &&
|
|
|
isLeapYear(mom.year()) &&
|
|
|
mom.month() === 1 &&
|
|
|
mom.date() === 29
|
|
|
) {
|
|
|
value = toInt(value);
|
|
|
mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](
|
|
|
value,
|
|
|
mom.month(),
|
|
|
daysInMonth(value, mom.month())
|
|
|
);
|
|
|
} else {
|
|
|
mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
function stringGet(units) {
|
|
|
units = normalizeUnits(units);
|
|
|
if (isFunction(this[units])) {
|
|
|
return this[units]();
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
function stringSet(units, value) {
|
|
|
if (typeof units === 'object') {
|
|
|
units = normalizeObjectUnits(units);
|
|
|
var prioritized = getPrioritizedUnits(units),
|
|
|
i;
|
|
|
for (i = 0; i < prioritized.length; i++) {
|
|
|
this[prioritized[i].unit](units[prioritized[i].unit]);
|
|
|
}
|
|
|
} else {
|
|
|
units = normalizeUnits(units);
|
|
|
if (isFunction(this[units])) {
|
|
|
return this[units](value);
|
|
|
}
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
var match1 = /\d/, // 0 - 9
|
|
|
match2 = /\d\d/, // 00 - 99
|
|
|
match3 = /\d{3}/, // 000 - 999
|
|
|
match4 = /\d{4}/, // 0000 - 9999
|
|
|
match6 = /[+-]?\d{6}/, // -999999 - 999999
|
|
|
match1to2 = /\d\d?/, // 0 - 99
|
|
|
match3to4 = /\d\d\d\d?/, // 999 - 9999
|
|
|
match5to6 = /\d\d\d\d\d\d?/, // 99999 - 999999
|
|
|
match1to3 = /\d{1,3}/, // 0 - 999
|
|
|
match1to4 = /\d{1,4}/, // 0 - 9999
|
|
|
match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999
|
|
|
matchUnsigned = /\d+/, // 0 - inf
|
|
|
matchSigned = /[+-]?\d+/, // -inf - inf
|
|
|
matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
|
|
|
matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z
|
|
|
matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
|
|
|
// any word (or two) characters or numbers including two/three word month in arabic.
|
|
|
// includes scottish gaelic two word and hyphenated months
|
|
|
matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
|
|
|
regexes;
|
|
|
|
|
|
regexes = {};
|
|
|
|
|
|
function addRegexToken(token, regex, strictRegex) {
|
|
|
regexes[token] = isFunction(regex)
|
|
|
? regex
|
|
|
: function (isStrict, localeData) {
|
|
|
return isStrict && strictRegex ? strictRegex : regex;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function getParseRegexForToken(token, config) {
|
|
|
if (!hasOwnProp(regexes, token)) {
|
|
|
return new RegExp(unescapeFormat(token));
|
|
|
}
|
|
|
|
|
|
return regexes[token](config._strict, config._locale);
|
|
|
}
|
|
|
|
|
|
// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
|
|
|
function unescapeFormat(s) {
|
|
|
return regexEscape(
|
|
|
s
|
|
|
.replace('\\', '')
|
|
|
.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (
|
|
|
matched,
|
|
|
p1,
|
|
|
p2,
|
|
|
p3,
|
|
|
p4
|
|
|
) {
|
|
|
return p1 || p2 || p3 || p4;
|
|
|
})
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function regexEscape(s) {
|
|
|
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
|
}
|
|
|
|
|
|
var tokens = {};
|
|
|
|
|
|
function addParseToken(token, callback) {
|
|
|
var i,
|
|
|
func = callback;
|
|
|
if (typeof token === 'string') {
|
|
|
token = [token];
|
|
|
}
|
|
|
if (isNumber(callback)) {
|
|
|
func = function (input, array) {
|
|
|
array[callback] = toInt(input);
|
|
|
};
|
|
|
}
|
|
|
for (i = 0; i < token.length; i++) {
|
|
|
tokens[token[i]] = func;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function addWeekParseToken(token, callback) {
|
|
|
addParseToken(token, function (input, array, config, token) {
|
|
|
config._w = config._w || {};
|
|
|
callback(input, config._w, config, token);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
function addTimeToArrayFromToken(token, input, config) {
|
|
|
if (input != null && hasOwnProp(tokens, token)) {
|
|
|
tokens[token](input, config._a, config, token);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var YEAR = 0,
|
|
|
MONTH = 1,
|
|
|
DATE = 2,
|
|
|
HOUR = 3,
|
|
|
MINUTE = 4,
|
|
|
SECOND = 5,
|
|
|
MILLISECOND = 6,
|
|
|
WEEK = 7,
|
|
|
WEEKDAY = 8;
|
|
|
|
|
|
function mod(n, x) {
|
|
|
return ((n % x) + x) % x;
|
|
|
}
|
|
|
|
|
|
var indexOf;
|
|
|
|
|
|
if (Array.prototype.indexOf) {
|
|
|
indexOf = Array.prototype.indexOf;
|
|
|
} else {
|
|
|
indexOf = function (o) {
|
|
|
// I know
|
|
|
var i;
|
|
|
for (i = 0; i < this.length; ++i) {
|
|
|
if (this[i] === o) {
|
|
|
return i;
|
|
|
}
|
|
|
}
|
|
|
return -1;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function daysInMonth(year, month) {
|
|
|
if (isNaN(year) || isNaN(month)) {
|
|
|
return NaN;
|
|
|
}
|
|
|
var modMonth = mod(month, 12);
|
|
|
year += (month - modMonth) / 12;
|
|
|
return modMonth === 1
|
|
|
? isLeapYear(year)
|
|
|
? 29
|
|
|
: 28
|
|
|
: 31 - ((modMonth % 7) % 2);
|
|
|
}
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('M', ['MM', 2], 'Mo', function () {
|
|
|
return this.month() + 1;
|
|
|
});
|
|
|
|
|
|
addFormatToken('MMM', 0, 0, function (format) {
|
|
|
return this.localeData().monthsShort(this, format);
|
|
|
});
|
|
|
|
|
|
addFormatToken('MMMM', 0, 0, function (format) {
|
|
|
return this.localeData().months(this, format);
|
|
|
});
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('month', 'M');
|
|
|
|
|
|
// PRIORITY
|
|
|
|
|
|
addUnitPriority('month', 8);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('M', match1to2);
|
|
|
addRegexToken('MM', match1to2, match2);
|
|
|
addRegexToken('MMM', function (isStrict, locale) {
|
|
|
return locale.monthsShortRegex(isStrict);
|
|
|
});
|
|
|
addRegexToken('MMMM', function (isStrict, locale) {
|
|
|
return locale.monthsRegex(isStrict);
|
|
|
});
|
|
|
|
|
|
addParseToken(['M', 'MM'], function (input, array) {
|
|
|
array[MONTH] = toInt(input) - 1;
|
|
|
});
|
|
|
|
|
|
addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
|
|
|
var month = config._locale.monthsParse(input, token, config._strict);
|
|
|
// if we didn't find a month name, mark the date as invalid.
|
|
|
if (month != null) {
|
|
|
array[MONTH] = month;
|
|
|
} else {
|
|
|
getParsingFlags(config).invalidMonth = input;
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// LOCALES
|
|
|
|
|
|
var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
|
|
|
'_'
|
|
|
),
|
|
|
defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split(
|
|
|
'_'
|
|
|
),
|
|
|
MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
|
|
|
defaultMonthsShortRegex = matchWord,
|
|
|
defaultMonthsRegex = matchWord;
|
|
|
|
|
|
function localeMonths(m, format) {
|
|
|
if (!m) {
|
|
|
return isArray(this._months)
|
|
|
? this._months
|
|
|
: this._months['standalone'];
|
|
|
}
|
|
|
return isArray(this._months)
|
|
|
? this._months[m.month()]
|
|
|
: this._months[
|
|
|
(this._months.isFormat || MONTHS_IN_FORMAT).test(format)
|
|
|
? 'format'
|
|
|
: 'standalone'
|
|
|
][m.month()];
|
|
|
}
|
|
|
|
|
|
function localeMonthsShort(m, format) {
|
|
|
if (!m) {
|
|
|
return isArray(this._monthsShort)
|
|
|
? this._monthsShort
|
|
|
: this._monthsShort['standalone'];
|
|
|
}
|
|
|
return isArray(this._monthsShort)
|
|
|
? this._monthsShort[m.month()]
|
|
|
: this._monthsShort[
|
|
|
MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'
|
|
|
][m.month()];
|
|
|
}
|
|
|
|
|
|
function handleStrictParse(monthName, format, strict) {
|
|
|
var i,
|
|
|
ii,
|
|
|
mom,
|
|
|
llc = monthName.toLocaleLowerCase();
|
|
|
if (!this._monthsParse) {
|
|
|
// this is not used
|
|
|
this._monthsParse = [];
|
|
|
this._longMonthsParse = [];
|
|
|
this._shortMonthsParse = [];
|
|
|
for (i = 0; i < 12; ++i) {
|
|
|
mom = createUTC([2000, i]);
|
|
|
this._shortMonthsParse[i] = this.monthsShort(
|
|
|
mom,
|
|
|
''
|
|
|
).toLocaleLowerCase();
|
|
|
this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (strict) {
|
|
|
if (format === 'MMM') {
|
|
|
ii = indexOf.call(this._shortMonthsParse, llc);
|
|
|
return ii !== -1 ? ii : null;
|
|
|
} else {
|
|
|
ii = indexOf.call(this._longMonthsParse, llc);
|
|
|
return ii !== -1 ? ii : null;
|
|
|
}
|
|
|
} else {
|
|
|
if (format === 'MMM') {
|
|
|
ii = indexOf.call(this._shortMonthsParse, llc);
|
|
|
if (ii !== -1) {
|
|
|
return ii;
|
|
|
}
|
|
|
ii = indexOf.call(this._longMonthsParse, llc);
|
|
|
return ii !== -1 ? ii : null;
|
|
|
} else {
|
|
|
ii = indexOf.call(this._longMonthsParse, llc);
|
|
|
if (ii !== -1) {
|
|
|
return ii;
|
|
|
}
|
|
|
ii = indexOf.call(this._shortMonthsParse, llc);
|
|
|
return ii !== -1 ? ii : null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function localeMonthsParse(monthName, format, strict) {
|
|
|
var i, mom, regex;
|
|
|
|
|
|
if (this._monthsParseExact) {
|
|
|
return handleStrictParse.call(this, monthName, format, strict);
|
|
|
}
|
|
|
|
|
|
if (!this._monthsParse) {
|
|
|
this._monthsParse = [];
|
|
|
this._longMonthsParse = [];
|
|
|
this._shortMonthsParse = [];
|
|
|
}
|
|
|
|
|
|
// TODO: add sorting
|
|
|
// Sorting makes sure if one month (or abbr) is a prefix of another
|
|
|
// see sorting in computeMonthsParse
|
|
|
for (i = 0; i < 12; i++) {
|
|
|
// make the regex if we don't have it already
|
|
|
mom = createUTC([2000, i]);
|
|
|
if (strict && !this._longMonthsParse[i]) {
|
|
|
this._longMonthsParse[i] = new RegExp(
|
|
|
'^' + this.months(mom, '').replace('.', '') + '$',
|
|
|
'i'
|
|
|
);
|
|
|
this._shortMonthsParse[i] = new RegExp(
|
|
|
'^' + this.monthsShort(mom, '').replace('.', '') + '$',
|
|
|
'i'
|
|
|
);
|
|
|
}
|
|
|
if (!strict && !this._monthsParse[i]) {
|
|
|
regex =
|
|
|
'^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
|
|
|
this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
|
|
|
}
|
|
|
// test the regex
|
|
|
if (
|
|
|
strict &&
|
|
|
format === 'MMMM' &&
|
|
|
this._longMonthsParse[i].test(monthName)
|
|
|
) {
|
|
|
return i;
|
|
|
} else if (
|
|
|
strict &&
|
|
|
format === 'MMM' &&
|
|
|
this._shortMonthsParse[i].test(monthName)
|
|
|
) {
|
|
|
return i;
|
|
|
} else if (!strict && this._monthsParse[i].test(monthName)) {
|
|
|
return i;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
function setMonth(mom, value) {
|
|
|
var dayOfMonth;
|
|
|
|
|
|
if (!mom.isValid()) {
|
|
|
// No op
|
|
|
return mom;
|
|
|
}
|
|
|
|
|
|
if (typeof value === 'string') {
|
|
|
if (/^\d+$/.test(value)) {
|
|
|
value = toInt(value);
|
|
|
} else {
|
|
|
value = mom.localeData().monthsParse(value);
|
|
|
// TODO: Another silent failure?
|
|
|
if (!isNumber(value)) {
|
|
|
return mom;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
|
|
|
mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
|
|
|
return mom;
|
|
|
}
|
|
|
|
|
|
function getSetMonth(value) {
|
|
|
if (value != null) {
|
|
|
setMonth(this, value);
|
|
|
hooks.updateOffset(this, true);
|
|
|
return this;
|
|
|
} else {
|
|
|
return get(this, 'Month');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function getDaysInMonth() {
|
|
|
return daysInMonth(this.year(), this.month());
|
|
|
}
|
|
|
|
|
|
function monthsShortRegex(isStrict) {
|
|
|
if (this._monthsParseExact) {
|
|
|
if (!hasOwnProp(this, '_monthsRegex')) {
|
|
|
computeMonthsParse.call(this);
|
|
|
}
|
|
|
if (isStrict) {
|
|
|
return this._monthsShortStrictRegex;
|
|
|
} else {
|
|
|
return this._monthsShortRegex;
|
|
|
}
|
|
|
} else {
|
|
|
if (!hasOwnProp(this, '_monthsShortRegex')) {
|
|
|
this._monthsShortRegex = defaultMonthsShortRegex;
|
|
|
}
|
|
|
return this._monthsShortStrictRegex && isStrict
|
|
|
? this._monthsShortStrictRegex
|
|
|
: this._monthsShortRegex;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function monthsRegex(isStrict) {
|
|
|
if (this._monthsParseExact) {
|
|
|
if (!hasOwnProp(this, '_monthsRegex')) {
|
|
|
computeMonthsParse.call(this);
|
|
|
}
|
|
|
if (isStrict) {
|
|
|
return this._monthsStrictRegex;
|
|
|
} else {
|
|
|
return this._monthsRegex;
|
|
|
}
|
|
|
} else {
|
|
|
if (!hasOwnProp(this, '_monthsRegex')) {
|
|
|
this._monthsRegex = defaultMonthsRegex;
|
|
|
}
|
|
|
return this._monthsStrictRegex && isStrict
|
|
|
? this._monthsStrictRegex
|
|
|
: this._monthsRegex;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function computeMonthsParse() {
|
|
|
function cmpLenRev(a, b) {
|
|
|
return b.length - a.length;
|
|
|
}
|
|
|
|
|
|
var shortPieces = [],
|
|
|
longPieces = [],
|
|
|
mixedPieces = [],
|
|
|
i,
|
|
|
mom;
|
|
|
for (i = 0; i < 12; i++) {
|
|
|
// make the regex if we don't have it already
|
|
|
mom = createUTC([2000, i]);
|
|
|
shortPieces.push(this.monthsShort(mom, ''));
|
|
|
longPieces.push(this.months(mom, ''));
|
|
|
mixedPieces.push(this.months(mom, ''));
|
|
|
mixedPieces.push(this.monthsShort(mom, ''));
|
|
|
}
|
|
|
// Sorting makes sure if one month (or abbr) is a prefix of another it
|
|
|
// will match the longer piece.
|
|
|
shortPieces.sort(cmpLenRev);
|
|
|
longPieces.sort(cmpLenRev);
|
|
|
mixedPieces.sort(cmpLenRev);
|
|
|
for (i = 0; i < 12; i++) {
|
|
|
shortPieces[i] = regexEscape(shortPieces[i]);
|
|
|
longPieces[i] = regexEscape(longPieces[i]);
|
|
|
}
|
|
|
for (i = 0; i < 24; i++) {
|
|
|
mixedPieces[i] = regexEscape(mixedPieces[i]);
|
|
|
}
|
|
|
|
|
|
this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
|
|
|
this._monthsShortRegex = this._monthsRegex;
|
|
|
this._monthsStrictRegex = new RegExp(
|
|
|
'^(' + longPieces.join('|') + ')',
|
|
|
'i'
|
|
|
);
|
|
|
this._monthsShortStrictRegex = new RegExp(
|
|
|
'^(' + shortPieces.join('|') + ')',
|
|
|
'i'
|
|
|
);
|
|
|
}
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('Y', 0, 0, function () {
|
|
|
var y = this.year();
|
|
|
return y <= 9999 ? zeroFill(y, 4) : '+' + y;
|
|
|
});
|
|
|
|
|
|
addFormatToken(0, ['YY', 2], 0, function () {
|
|
|
return this.year() % 100;
|
|
|
});
|
|
|
|
|
|
addFormatToken(0, ['YYYY', 4], 0, 'year');
|
|
|
addFormatToken(0, ['YYYYY', 5], 0, 'year');
|
|
|
addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('year', 'y');
|
|
|
|
|
|
// PRIORITIES
|
|
|
|
|
|
addUnitPriority('year', 1);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('Y', matchSigned);
|
|
|
addRegexToken('YY', match1to2, match2);
|
|
|
addRegexToken('YYYY', match1to4, match4);
|
|
|
addRegexToken('YYYYY', match1to6, match6);
|
|
|
addRegexToken('YYYYYY', match1to6, match6);
|
|
|
|
|
|
addParseToken(['YYYYY', 'YYYYYY'], YEAR);
|
|
|
addParseToken('YYYY', function (input, array) {
|
|
|
array[YEAR] =
|
|
|
input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
|
|
|
});
|
|
|
addParseToken('YY', function (input, array) {
|
|
|
array[YEAR] = hooks.parseTwoDigitYear(input);
|
|
|
});
|
|
|
addParseToken('Y', function (input, array) {
|
|
|
array[YEAR] = parseInt(input, 10);
|
|
|
});
|
|
|
|
|
|
// HELPERS
|
|
|
|
|
|
function daysInYear(year) {
|
|
|
return isLeapYear(year) ? 366 : 365;
|
|
|
}
|
|
|
|
|
|
// HOOKS
|
|
|
|
|
|
hooks.parseTwoDigitYear = function (input) {
|
|
|
return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
|
|
|
};
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
var getSetYear = makeGetSet('FullYear', true);
|
|
|
|
|
|
function getIsLeapYear() {
|
|
|
return isLeapYear(this.year());
|
|
|
}
|
|
|
|
|
|
function createDate(y, m, d, h, M, s, ms) {
|
|
|
// can't just apply() to create a date:
|
|
|
// https://stackoverflow.com/q/181348
|
|
|
var date;
|
|
|
// the date constructor remaps years 0-99 to 1900-1999
|
|
|
if (y < 100 && y >= 0) {
|
|
|
// preserve leap years using a full 400 year cycle, then reset
|
|
|
date = new Date(y + 400, m, d, h, M, s, ms);
|
|
|
if (isFinite(date.getFullYear())) {
|
|
|
date.setFullYear(y);
|
|
|
}
|
|
|
} else {
|
|
|
date = new Date(y, m, d, h, M, s, ms);
|
|
|
}
|
|
|
|
|
|
return date;
|
|
|
}
|
|
|
|
|
|
function createUTCDate(y) {
|
|
|
var date, args;
|
|
|
// the Date.UTC function remaps years 0-99 to 1900-1999
|
|
|
if (y < 100 && y >= 0) {
|
|
|
args = Array.prototype.slice.call(arguments);
|
|
|
// preserve leap years using a full 400 year cycle, then reset
|
|
|
args[0] = y + 400;
|
|
|
date = new Date(Date.UTC.apply(null, args));
|
|
|
if (isFinite(date.getUTCFullYear())) {
|
|
|
date.setUTCFullYear(y);
|
|
|
}
|
|
|
} else {
|
|
|
date = new Date(Date.UTC.apply(null, arguments));
|
|
|
}
|
|
|
|
|
|
return date;
|
|
|
}
|
|
|
|
|
|
// start-of-first-week - start-of-year
|
|
|
function firstWeekOffset(year, dow, doy) {
|
|
|
var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
|
|
|
fwd = 7 + dow - doy,
|
|
|
// first-week day local weekday -- which local weekday is fwd
|
|
|
fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
|
|
|
|
|
|
return -fwdlw + fwd - 1;
|
|
|
}
|
|
|
|
|
|
// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
|
|
|
function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
|
|
|
var localWeekday = (7 + weekday - dow) % 7,
|
|
|
weekOffset = firstWeekOffset(year, dow, doy),
|
|
|
dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
|
|
|
resYear,
|
|
|
resDayOfYear;
|
|
|
|
|
|
if (dayOfYear <= 0) {
|
|
|
resYear = year - 1;
|
|
|
resDayOfYear = daysInYear(resYear) + dayOfYear;
|
|
|
} else if (dayOfYear > daysInYear(year)) {
|
|
|
resYear = year + 1;
|
|
|
resDayOfYear = dayOfYear - daysInYear(year);
|
|
|
} else {
|
|
|
resYear = year;
|
|
|
resDayOfYear = dayOfYear;
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
year: resYear,
|
|
|
dayOfYear: resDayOfYear,
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function weekOfYear(mom, dow, doy) {
|
|
|
var weekOffset = firstWeekOffset(mom.year(), dow, doy),
|
|
|
week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
|
|
|
resWeek,
|
|
|
resYear;
|
|
|
|
|
|
if (week < 1) {
|
|
|
resYear = mom.year() - 1;
|
|
|
resWeek = week + weeksInYear(resYear, dow, doy);
|
|
|
} else if (week > weeksInYear(mom.year(), dow, doy)) {
|
|
|
resWeek = week - weeksInYear(mom.year(), dow, doy);
|
|
|
resYear = mom.year() + 1;
|
|
|
} else {
|
|
|
resYear = mom.year();
|
|
|
resWeek = week;
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
week: resWeek,
|
|
|
year: resYear,
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function weeksInYear(year, dow, doy) {
|
|
|
var weekOffset = firstWeekOffset(year, dow, doy),
|
|
|
weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
|
|
|
return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
|
|
|
}
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('w', ['ww', 2], 'wo', 'week');
|
|
|
addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('week', 'w');
|
|
|
addUnitAlias('isoWeek', 'W');
|
|
|
|
|
|
// PRIORITIES
|
|
|
|
|
|
addUnitPriority('week', 5);
|
|
|
addUnitPriority('isoWeek', 5);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('w', match1to2);
|
|
|
addRegexToken('ww', match1to2, match2);
|
|
|
addRegexToken('W', match1to2);
|
|
|
addRegexToken('WW', match1to2, match2);
|
|
|
|
|
|
addWeekParseToken(['w', 'ww', 'W', 'WW'], function (
|
|
|
input,
|
|
|
week,
|
|
|
config,
|
|
|
token
|
|
|
) {
|
|
|
week[token.substr(0, 1)] = toInt(input);
|
|
|
});
|
|
|
|
|
|
// HELPERS
|
|
|
|
|
|
// LOCALES
|
|
|
|
|
|
function localeWeek(mom) {
|
|
|
return weekOfYear(mom, this._week.dow, this._week.doy).week;
|
|
|
}
|
|
|
|
|
|
var defaultLocaleWeek = {
|
|
|
dow: 0, // Sunday is the first day of the week.
|
|
|
doy: 6, // The week that contains Jan 6th is the first week of the year.
|
|
|
};
|
|
|
|
|
|
function localeFirstDayOfWeek() {
|
|
|
return this._week.dow;
|
|
|
}
|
|
|
|
|
|
function localeFirstDayOfYear() {
|
|
|
return this._week.doy;
|
|
|
}
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
function getSetWeek(input) {
|
|
|
var week = this.localeData().week(this);
|
|
|
return input == null ? week : this.add((input - week) * 7, 'd');
|
|
|
}
|
|
|
|
|
|
function getSetISOWeek(input) {
|
|
|
var week = weekOfYear(this, 1, 4).week;
|
|
|
return input == null ? week : this.add((input - week) * 7, 'd');
|
|
|
}
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('d', 0, 'do', 'day');
|
|
|
|
|
|
addFormatToken('dd', 0, 0, function (format) {
|
|
|
return this.localeData().weekdaysMin(this, format);
|
|
|
});
|
|
|
|
|
|
addFormatToken('ddd', 0, 0, function (format) {
|
|
|
return this.localeData().weekdaysShort(this, format);
|
|
|
});
|
|
|
|
|
|
addFormatToken('dddd', 0, 0, function (format) {
|
|
|
return this.localeData().weekdays(this, format);
|
|
|
});
|
|
|
|
|
|
addFormatToken('e', 0, 0, 'weekday');
|
|
|
addFormatToken('E', 0, 0, 'isoWeekday');
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('day', 'd');
|
|
|
addUnitAlias('weekday', 'e');
|
|
|
addUnitAlias('isoWeekday', 'E');
|
|
|
|
|
|
// PRIORITY
|
|
|
addUnitPriority('day', 11);
|
|
|
addUnitPriority('weekday', 11);
|
|
|
addUnitPriority('isoWeekday', 11);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('d', match1to2);
|
|
|
addRegexToken('e', match1to2);
|
|
|
addRegexToken('E', match1to2);
|
|
|
addRegexToken('dd', function (isStrict, locale) {
|
|
|
return locale.weekdaysMinRegex(isStrict);
|
|
|
});
|
|
|
addRegexToken('ddd', function (isStrict, locale) {
|
|
|
return locale.weekdaysShortRegex(isStrict);
|
|
|
});
|
|
|
addRegexToken('dddd', function (isStrict, locale) {
|
|
|
return locale.weekdaysRegex(isStrict);
|
|
|
});
|
|
|
|
|
|
addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
|
|
|
var weekday = config._locale.weekdaysParse(input, token, config._strict);
|
|
|
// if we didn't get a weekday name, mark the date as invalid
|
|
|
if (weekday != null) {
|
|
|
week.d = weekday;
|
|
|
} else {
|
|
|
getParsingFlags(config).invalidWeekday = input;
|
|
|
}
|
|
|
});
|
|
|
|
|
|
addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
|
|
|
week[token] = toInt(input);
|
|
|
});
|
|
|
|
|
|
// HELPERS
|
|
|
|
|
|
function parseWeekday(input, locale) {
|
|
|
if (typeof input !== 'string') {
|
|
|
return input;
|
|
|
}
|
|
|
|
|
|
if (!isNaN(input)) {
|
|
|
return parseInt(input, 10);
|
|
|
}
|
|
|
|
|
|
input = locale.weekdaysParse(input);
|
|
|
if (typeof input === 'number') {
|
|
|
return input;
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
function parseIsoWeekday(input, locale) {
|
|
|
if (typeof input === 'string') {
|
|
|
return locale.weekdaysParse(input) % 7 || 7;
|
|
|
}
|
|
|
return isNaN(input) ? null : input;
|
|
|
}
|
|
|
|
|
|
// LOCALES
|
|
|
function shiftWeekdays(ws, n) {
|
|
|
return ws.slice(n, 7).concat(ws.slice(0, n));
|
|
|
}
|
|
|
|
|
|
var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
|
|
|
'_'
|
|
|
),
|
|
|
defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
|
|
|
defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
|
|
|
defaultWeekdaysRegex = matchWord,
|
|
|
defaultWeekdaysShortRegex = matchWord,
|
|
|
defaultWeekdaysMinRegex = matchWord;
|
|
|
|
|
|
function localeWeekdays(m, format) {
|
|
|
var weekdays = isArray(this._weekdays)
|
|
|
? this._weekdays
|
|
|
: this._weekdays[
|
|
|
m && m !== true && this._weekdays.isFormat.test(format)
|
|
|
? 'format'
|
|
|
: 'standalone'
|
|
|
];
|
|
|
return m === true
|
|
|
? shiftWeekdays(weekdays, this._week.dow)
|
|
|
: m
|
|
|
? weekdays[m.day()]
|
|
|
: weekdays;
|
|
|
}
|
|
|
|
|
|
function localeWeekdaysShort(m) {
|
|
|
return m === true
|
|
|
? shiftWeekdays(this._weekdaysShort, this._week.dow)
|
|
|
: m
|
|
|
? this._weekdaysShort[m.day()]
|
|
|
: this._weekdaysShort;
|
|
|
}
|
|
|
|
|
|
function localeWeekdaysMin(m) {
|
|
|
return m === true
|
|
|
? shiftWeekdays(this._weekdaysMin, this._week.dow)
|
|
|
: m
|
|
|
? this._weekdaysMin[m.day()]
|
|
|
: this._weekdaysMin;
|
|
|
}
|
|
|
|
|
|
function handleStrictParse$1(weekdayName, format, strict) {
|
|
|
var i,
|
|
|
ii,
|
|
|
mom,
|
|
|
llc = weekdayName.toLocaleLowerCase();
|
|
|
if (!this._weekdaysParse) {
|
|
|
this._weekdaysParse = [];
|
|
|
this._shortWeekdaysParse = [];
|
|
|
this._minWeekdaysParse = [];
|
|
|
|
|
|
for (i = 0; i < 7; ++i) {
|
|
|
mom = createUTC([2000, 1]).day(i);
|
|
|
this._minWeekdaysParse[i] = this.weekdaysMin(
|
|
|
mom,
|
|
|
''
|
|
|
).toLocaleLowerCase();
|
|
|
this._shortWeekdaysParse[i] = this.weekdaysShort(
|
|
|
mom,
|
|
|
''
|
|
|
).toLocaleLowerCase();
|
|
|
this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (strict) {
|
|
|
if (format === 'dddd') {
|
|
|
ii = indexOf.call(this._weekdaysParse, llc);
|
|
|
return ii !== -1 ? ii : null;
|
|
|
} else if (format === 'ddd') {
|
|
|
ii = indexOf.call(this._shortWeekdaysParse, llc);
|
|
|
return ii !== -1 ? ii : null;
|
|
|
} else {
|
|
|
ii = indexOf.call(this._minWeekdaysParse, llc);
|
|
|
return ii !== -1 ? ii : null;
|
|
|
}
|
|
|
} else {
|
|
|
if (format === 'dddd') {
|
|
|
ii = indexOf.call(this._weekdaysParse, llc);
|
|
|
if (ii !== -1) {
|
|
|
return ii;
|
|
|
}
|
|
|
ii = indexOf.call(this._shortWeekdaysParse, llc);
|
|
|
if (ii !== -1) {
|
|
|
return ii;
|
|
|
}
|
|
|
ii = indexOf.call(this._minWeekdaysParse, llc);
|
|
|
return ii !== -1 ? ii : null;
|
|
|
} else if (format === 'ddd') {
|
|
|
ii = indexOf.call(this._shortWeekdaysParse, llc);
|
|
|
if (ii !== -1) {
|
|
|
return ii;
|
|
|
}
|
|
|
ii = indexOf.call(this._weekdaysParse, llc);
|
|
|
if (ii !== -1) {
|
|
|
return ii;
|
|
|
}
|
|
|
ii = indexOf.call(this._minWeekdaysParse, llc);
|
|
|
return ii !== -1 ? ii : null;
|
|
|
} else {
|
|
|
ii = indexOf.call(this._minWeekdaysParse, llc);
|
|
|
if (ii !== -1) {
|
|
|
return ii;
|
|
|
}
|
|
|
ii = indexOf.call(this._weekdaysParse, llc);
|
|
|
if (ii !== -1) {
|
|
|
return ii;
|
|
|
}
|
|
|
ii = indexOf.call(this._shortWeekdaysParse, llc);
|
|
|
return ii !== -1 ? ii : null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function localeWeekdaysParse(weekdayName, format, strict) {
|
|
|
var i, mom, regex;
|
|
|
|
|
|
if (this._weekdaysParseExact) {
|
|
|
return handleStrictParse$1.call(this, weekdayName, format, strict);
|
|
|
}
|
|
|
|
|
|
if (!this._weekdaysParse) {
|
|
|
this._weekdaysParse = [];
|
|
|
this._minWeekdaysParse = [];
|
|
|
this._shortWeekdaysParse = [];
|
|
|
this._fullWeekdaysParse = [];
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < 7; i++) {
|
|
|
// make the regex if we don't have it already
|
|
|
|
|
|
mom = createUTC([2000, 1]).day(i);
|
|
|
if (strict && !this._fullWeekdaysParse[i]) {
|
|
|
this._fullWeekdaysParse[i] = new RegExp(
|
|
|
'^' + this.weekdays(mom, '').replace('.', '\\.?') + '$',
|
|
|
'i'
|
|
|
);
|
|
|
this._shortWeekdaysParse[i] = new RegExp(
|
|
|
'^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$',
|
|
|
'i'
|
|
|
);
|
|
|
this._minWeekdaysParse[i] = new RegExp(
|
|
|
'^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$',
|
|
|
'i'
|
|
|
);
|
|
|
}
|
|
|
if (!this._weekdaysParse[i]) {
|
|
|
regex =
|
|
|
'^' +
|
|
|
this.weekdays(mom, '') +
|
|
|
'|^' +
|
|
|
this.weekdaysShort(mom, '') +
|
|
|
'|^' +
|
|
|
this.weekdaysMin(mom, '');
|
|
|
this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
|
|
|
}
|
|
|
// test the regex
|
|
|
if (
|
|
|
strict &&
|
|
|
format === 'dddd' &&
|
|
|
this._fullWeekdaysParse[i].test(weekdayName)
|
|
|
) {
|
|
|
return i;
|
|
|
} else if (
|
|
|
strict &&
|
|
|
format === 'ddd' &&
|
|
|
this._shortWeekdaysParse[i].test(weekdayName)
|
|
|
) {
|
|
|
return i;
|
|
|
} else if (
|
|
|
strict &&
|
|
|
format === 'dd' &&
|
|
|
this._minWeekdaysParse[i].test(weekdayName)
|
|
|
) {
|
|
|
return i;
|
|
|
} else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
|
|
|
return i;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
function getSetDayOfWeek(input) {
|
|
|
if (!this.isValid()) {
|
|
|
return input != null ? this : NaN;
|
|
|
}
|
|
|
var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
|
|
|
if (input != null) {
|
|
|
input = parseWeekday(input, this.localeData());
|
|
|
return this.add(input - day, 'd');
|
|
|
} else {
|
|
|
return day;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function getSetLocaleDayOfWeek(input) {
|
|
|
if (!this.isValid()) {
|
|
|
return input != null ? this : NaN;
|
|
|
}
|
|
|
var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
|
|
|
return input == null ? weekday : this.add(input - weekday, 'd');
|
|
|
}
|
|
|
|
|
|
function getSetISODayOfWeek(input) {
|
|
|
if (!this.isValid()) {
|
|
|
return input != null ? this : NaN;
|
|
|
}
|
|
|
|
|
|
// behaves the same as moment#day except
|
|
|
// as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
|
|
|
// as a setter, sunday should belong to the previous week.
|
|
|
|
|
|
if (input != null) {
|
|
|
var weekday = parseIsoWeekday(input, this.localeData());
|
|
|
return this.day(this.day() % 7 ? weekday : weekday - 7);
|
|
|
} else {
|
|
|
return this.day() || 7;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function weekdaysRegex(isStrict) {
|
|
|
if (this._weekdaysParseExact) {
|
|
|
if (!hasOwnProp(this, '_weekdaysRegex')) {
|
|
|
computeWeekdaysParse.call(this);
|
|
|
}
|
|
|
if (isStrict) {
|
|
|
return this._weekdaysStrictRegex;
|
|
|
} else {
|
|
|
return this._weekdaysRegex;
|
|
|
}
|
|
|
} else {
|
|
|
if (!hasOwnProp(this, '_weekdaysRegex')) {
|
|
|
this._weekdaysRegex = defaultWeekdaysRegex;
|
|
|
}
|
|
|
return this._weekdaysStrictRegex && isStrict
|
|
|
? this._weekdaysStrictRegex
|
|
|
: this._weekdaysRegex;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function weekdaysShortRegex(isStrict) {
|
|
|
if (this._weekdaysParseExact) {
|
|
|
if (!hasOwnProp(this, '_weekdaysRegex')) {
|
|
|
computeWeekdaysParse.call(this);
|
|
|
}
|
|
|
if (isStrict) {
|
|
|
return this._weekdaysShortStrictRegex;
|
|
|
} else {
|
|
|
return this._weekdaysShortRegex;
|
|
|
}
|
|
|
} else {
|
|
|
if (!hasOwnProp(this, '_weekdaysShortRegex')) {
|
|
|
this._weekdaysShortRegex = defaultWeekdaysShortRegex;
|
|
|
}
|
|
|
return this._weekdaysShortStrictRegex && isStrict
|
|
|
? this._weekdaysShortStrictRegex
|
|
|
: this._weekdaysShortRegex;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function weekdaysMinRegex(isStrict) {
|
|
|
if (this._weekdaysParseExact) {
|
|
|
if (!hasOwnProp(this, '_weekdaysRegex')) {
|
|
|
computeWeekdaysParse.call(this);
|
|
|
}
|
|
|
if (isStrict) {
|
|
|
return this._weekdaysMinStrictRegex;
|
|
|
} else {
|
|
|
return this._weekdaysMinRegex;
|
|
|
}
|
|
|
} else {
|
|
|
if (!hasOwnProp(this, '_weekdaysMinRegex')) {
|
|
|
this._weekdaysMinRegex = defaultWeekdaysMinRegex;
|
|
|
}
|
|
|
return this._weekdaysMinStrictRegex && isStrict
|
|
|
? this._weekdaysMinStrictRegex
|
|
|
: this._weekdaysMinRegex;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function computeWeekdaysParse() {
|
|
|
function cmpLenRev(a, b) {
|
|
|
return b.length - a.length;
|
|
|
}
|
|
|
|
|
|
var minPieces = [],
|
|
|
shortPieces = [],
|
|
|
longPieces = [],
|
|
|
mixedPieces = [],
|
|
|
i,
|
|
|
mom,
|
|
|
minp,
|
|
|
shortp,
|
|
|
longp;
|
|
|
for (i = 0; i < 7; i++) {
|
|
|
// make the regex if we don't have it already
|
|
|
mom = createUTC([2000, 1]).day(i);
|
|
|
minp = regexEscape(this.weekdaysMin(mom, ''));
|
|
|
shortp = regexEscape(this.weekdaysShort(mom, ''));
|
|
|
longp = regexEscape(this.weekdays(mom, ''));
|
|
|
minPieces.push(minp);
|
|
|
shortPieces.push(shortp);
|
|
|
longPieces.push(longp);
|
|
|
mixedPieces.push(minp);
|
|
|
mixedPieces.push(shortp);
|
|
|
mixedPieces.push(longp);
|
|
|
}
|
|
|
// Sorting makes sure if one weekday (or abbr) is a prefix of another it
|
|
|
// will match the longer piece.
|
|
|
minPieces.sort(cmpLenRev);
|
|
|
shortPieces.sort(cmpLenRev);
|
|
|
longPieces.sort(cmpLenRev);
|
|
|
mixedPieces.sort(cmpLenRev);
|
|
|
|
|
|
this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
|
|
|
this._weekdaysShortRegex = this._weekdaysRegex;
|
|
|
this._weekdaysMinRegex = this._weekdaysRegex;
|
|
|
|
|
|
this._weekdaysStrictRegex = new RegExp(
|
|
|
'^(' + longPieces.join('|') + ')',
|
|
|
'i'
|
|
|
);
|
|
|
this._weekdaysShortStrictRegex = new RegExp(
|
|
|
'^(' + shortPieces.join('|') + ')',
|
|
|
'i'
|
|
|
);
|
|
|
this._weekdaysMinStrictRegex = new RegExp(
|
|
|
'^(' + minPieces.join('|') + ')',
|
|
|
'i'
|
|
|
);
|
|
|
}
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
function hFormat() {
|
|
|
return this.hours() % 12 || 12;
|
|
|
}
|
|
|
|
|
|
function kFormat() {
|
|
|
return this.hours() || 24;
|
|
|
}
|
|
|
|
|
|
addFormatToken('H', ['HH', 2], 0, 'hour');
|
|
|
addFormatToken('h', ['hh', 2], 0, hFormat);
|
|
|
addFormatToken('k', ['kk', 2], 0, kFormat);
|
|
|
|
|
|
addFormatToken('hmm', 0, 0, function () {
|
|
|
return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
|
|
|
});
|
|
|
|
|
|
addFormatToken('hmmss', 0, 0, function () {
|
|
|
return (
|
|
|
'' +
|
|
|
hFormat.apply(this) +
|
|
|
zeroFill(this.minutes(), 2) +
|
|
|
zeroFill(this.seconds(), 2)
|
|
|
);
|
|
|
});
|
|
|
|
|
|
addFormatToken('Hmm', 0, 0, function () {
|
|
|
return '' + this.hours() + zeroFill(this.minutes(), 2);
|
|
|
});
|
|
|
|
|
|
addFormatToken('Hmmss', 0, 0, function () {
|
|
|
return (
|
|
|
'' +
|
|
|
this.hours() +
|
|
|
zeroFill(this.minutes(), 2) +
|
|
|
zeroFill(this.seconds(), 2)
|
|
|
);
|
|
|
});
|
|
|
|
|
|
function meridiem(token, lowercase) {
|
|
|
addFormatToken(token, 0, 0, function () {
|
|
|
return this.localeData().meridiem(
|
|
|
this.hours(),
|
|
|
this.minutes(),
|
|
|
lowercase
|
|
|
);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
meridiem('a', true);
|
|
|
meridiem('A', false);
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('hour', 'h');
|
|
|
|
|
|
// PRIORITY
|
|
|
addUnitPriority('hour', 13);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
function matchMeridiem(isStrict, locale) {
|
|
|
return locale._meridiemParse;
|
|
|
}
|
|
|
|
|
|
addRegexToken('a', matchMeridiem);
|
|
|
addRegexToken('A', matchMeridiem);
|
|
|
addRegexToken('H', match1to2);
|
|
|
addRegexToken('h', match1to2);
|
|
|
addRegexToken('k', match1to2);
|
|
|
addRegexToken('HH', match1to2, match2);
|
|
|
addRegexToken('hh', match1to2, match2);
|
|
|
addRegexToken('kk', match1to2, match2);
|
|
|
|
|
|
addRegexToken('hmm', match3to4);
|
|
|
addRegexToken('hmmss', match5to6);
|
|
|
addRegexToken('Hmm', match3to4);
|
|
|
addRegexToken('Hmmss', match5to6);
|
|
|
|
|
|
addParseToken(['H', 'HH'], HOUR);
|
|
|
addParseToken(['k', 'kk'], function (input, array, config) {
|
|
|
var kInput = toInt(input);
|
|
|
array[HOUR] = kInput === 24 ? 0 : kInput;
|
|
|
});
|
|
|
addParseToken(['a', 'A'], function (input, array, config) {
|
|
|
config._isPm = config._locale.isPM(input);
|
|
|
config._meridiem = input;
|
|
|
});
|
|
|
addParseToken(['h', 'hh'], function (input, array, config) {
|
|
|
array[HOUR] = toInt(input);
|
|
|
getParsingFlags(config).bigHour = true;
|
|
|
});
|
|
|
addParseToken('hmm', function (input, array, config) {
|
|
|
var pos = input.length - 2;
|
|
|
array[HOUR] = toInt(input.substr(0, pos));
|
|
|
array[MINUTE] = toInt(input.substr(pos));
|
|
|
getParsingFlags(config).bigHour = true;
|
|
|
});
|
|
|
addParseToken('hmmss', function (input, array, config) {
|
|
|
var pos1 = input.length - 4,
|
|
|
pos2 = input.length - 2;
|
|
|
array[HOUR] = toInt(input.substr(0, pos1));
|
|
|
array[MINUTE] = toInt(input.substr(pos1, 2));
|
|
|
array[SECOND] = toInt(input.substr(pos2));
|
|
|
getParsingFlags(config).bigHour = true;
|
|
|
});
|
|
|
addParseToken('Hmm', function (input, array, config) {
|
|
|
var pos = input.length - 2;
|
|
|
array[HOUR] = toInt(input.substr(0, pos));
|
|
|
array[MINUTE] = toInt(input.substr(pos));
|
|
|
});
|
|
|
addParseToken('Hmmss', function (input, array, config) {
|
|
|
var pos1 = input.length - 4,
|
|
|
pos2 = input.length - 2;
|
|
|
array[HOUR] = toInt(input.substr(0, pos1));
|
|
|
array[MINUTE] = toInt(input.substr(pos1, 2));
|
|
|
array[SECOND] = toInt(input.substr(pos2));
|
|
|
});
|
|
|
|
|
|
// LOCALES
|
|
|
|
|
|
function localeIsPM(input) {
|
|
|
// IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
|
|
|
// Using charAt should be more compatible.
|
|
|
return (input + '').toLowerCase().charAt(0) === 'p';
|
|
|
}
|
|
|
|
|
|
var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i,
|
|
|
// Setting the hour should keep the time, because the user explicitly
|
|
|
// specified which hour they want. So trying to maintain the same hour (in
|
|
|
// a new timezone) makes sense. Adding/subtracting hours does not follow
|
|
|
// this rule.
|
|
|
getSetHour = makeGetSet('Hours', true);
|
|
|
|
|
|
function localeMeridiem(hours, minutes, isLower) {
|
|
|
if (hours > 11) {
|
|
|
return isLower ? 'pm' : 'PM';
|
|
|
} else {
|
|
|
return isLower ? 'am' : 'AM';
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var baseConfig = {
|
|
|
calendar: defaultCalendar,
|
|
|
longDateFormat: defaultLongDateFormat,
|
|
|
invalidDate: defaultInvalidDate,
|
|
|
ordinal: defaultOrdinal,
|
|
|
dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
|
|
|
relativeTime: defaultRelativeTime,
|
|
|
|
|
|
months: defaultLocaleMonths,
|
|
|
monthsShort: defaultLocaleMonthsShort,
|
|
|
|
|
|
week: defaultLocaleWeek,
|
|
|
|
|
|
weekdays: defaultLocaleWeekdays,
|
|
|
weekdaysMin: defaultLocaleWeekdaysMin,
|
|
|
weekdaysShort: defaultLocaleWeekdaysShort,
|
|
|
|
|
|
meridiemParse: defaultLocaleMeridiemParse,
|
|
|
};
|
|
|
|
|
|
// internal storage for locale config files
|
|
|
var locales = {},
|
|
|
localeFamilies = {},
|
|
|
globalLocale;
|
|
|
|
|
|
function commonPrefix(arr1, arr2) {
|
|
|
var i,
|
|
|
minl = Math.min(arr1.length, arr2.length);
|
|
|
for (i = 0; i < minl; i += 1) {
|
|
|
if (arr1[i] !== arr2[i]) {
|
|
|
return i;
|
|
|
}
|
|
|
}
|
|
|
return minl;
|
|
|
}
|
|
|
|
|
|
function normalizeLocale(key) {
|
|
|
return key ? key.toLowerCase().replace('_', '-') : key;
|
|
|
}
|
|
|
|
|
|
// pick the locale from the array
|
|
|
// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
|
|
|
// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
|
|
|
function chooseLocale(names) {
|
|
|
var i = 0,
|
|
|
j,
|
|
|
next,
|
|
|
locale,
|
|
|
split;
|
|
|
|
|
|
while (i < names.length) {
|
|
|
split = normalizeLocale(names[i]).split('-');
|
|
|
j = split.length;
|
|
|
next = normalizeLocale(names[i + 1]);
|
|
|
next = next ? next.split('-') : null;
|
|
|
while (j > 0) {
|
|
|
locale = loadLocale(split.slice(0, j).join('-'));
|
|
|
if (locale) {
|
|
|
return locale;
|
|
|
}
|
|
|
if (
|
|
|
next &&
|
|
|
next.length >= j &&
|
|
|
commonPrefix(split, next) >= j - 1
|
|
|
) {
|
|
|
//the next array item is better than a shallower substring of this one
|
|
|
break;
|
|
|
}
|
|
|
j--;
|
|
|
}
|
|
|
i++;
|
|
|
}
|
|
|
return globalLocale;
|
|
|
}
|
|
|
|
|
|
function loadLocale(name) {
|
|
|
var oldLocale = null,
|
|
|
aliasedRequire;
|
|
|
// TODO: Find a better way to register and load all the locales in Node
|
|
|
if (
|
|
|
locales[name] === undefined &&
|
|
|
'object' !== 'undefined' &&
|
|
|
module &&
|
|
|
module.exports
|
|
|
) {
|
|
|
try {
|
|
|
oldLocale = globalLocale._abbr;
|
|
|
aliasedRequire = commonjsRequire;
|
|
|
aliasedRequire('./locale/' + name);
|
|
|
getSetGlobalLocale(oldLocale);
|
|
|
} catch (e) {
|
|
|
// mark as not found to avoid repeating expensive file require call causing high CPU
|
|
|
// when trying to find en-US, en_US, en-us for every format call
|
|
|
locales[name] = null; // null means not found
|
|
|
}
|
|
|
}
|
|
|
return locales[name];
|
|
|
}
|
|
|
|
|
|
// This function will load locale and then set the global locale. If
|
|
|
// no arguments are passed in, it will simply return the current global
|
|
|
// locale key.
|
|
|
function getSetGlobalLocale(key, values) {
|
|
|
var data;
|
|
|
if (key) {
|
|
|
if (isUndefined(values)) {
|
|
|
data = getLocale(key);
|
|
|
} else {
|
|
|
data = defineLocale(key, values);
|
|
|
}
|
|
|
|
|
|
if (data) {
|
|
|
// moment.duration._locale = moment._locale = data;
|
|
|
globalLocale = data;
|
|
|
} else {
|
|
|
if (typeof console !== 'undefined' && console.warn) {
|
|
|
//warn user if arguments are passed but the locale could not be set
|
|
|
console.warn(
|
|
|
'Locale ' + key + ' not found. Did you forget to load it?'
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return globalLocale._abbr;
|
|
|
}
|
|
|
|
|
|
function defineLocale(name, config) {
|
|
|
if (config !== null) {
|
|
|
var locale,
|
|
|
parentConfig = baseConfig;
|
|
|
config.abbr = name;
|
|
|
if (locales[name] != null) {
|
|
|
deprecateSimple(
|
|
|
'defineLocaleOverride',
|
|
|
'use moment.updateLocale(localeName, config) to change ' +
|
|
|
'an existing locale. moment.defineLocale(localeName, ' +
|
|
|
'config) should only be used for creating a new locale ' +
|
|
|
'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'
|
|
|
);
|
|
|
parentConfig = locales[name]._config;
|
|
|
} else if (config.parentLocale != null) {
|
|
|
if (locales[config.parentLocale] != null) {
|
|
|
parentConfig = locales[config.parentLocale]._config;
|
|
|
} else {
|
|
|
locale = loadLocale(config.parentLocale);
|
|
|
if (locale != null) {
|
|
|
parentConfig = locale._config;
|
|
|
} else {
|
|
|
if (!localeFamilies[config.parentLocale]) {
|
|
|
localeFamilies[config.parentLocale] = [];
|
|
|
}
|
|
|
localeFamilies[config.parentLocale].push({
|
|
|
name: name,
|
|
|
config: config,
|
|
|
});
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
locales[name] = new Locale(mergeConfigs(parentConfig, config));
|
|
|
|
|
|
if (localeFamilies[name]) {
|
|
|
localeFamilies[name].forEach(function (x) {
|
|
|
defineLocale(x.name, x.config);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// backwards compat for now: also set the locale
|
|
|
// make sure we set the locale AFTER all child locales have been
|
|
|
// created, so we won't end up with the child locale set.
|
|
|
getSetGlobalLocale(name);
|
|
|
|
|
|
return locales[name];
|
|
|
} else {
|
|
|
// useful for testing
|
|
|
delete locales[name];
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function updateLocale(name, config) {
|
|
|
if (config != null) {
|
|
|
var locale,
|
|
|
tmpLocale,
|
|
|
parentConfig = baseConfig;
|
|
|
|
|
|
if (locales[name] != null && locales[name].parentLocale != null) {
|
|
|
// Update existing child locale in-place to avoid memory-leaks
|
|
|
locales[name].set(mergeConfigs(locales[name]._config, config));
|
|
|
} else {
|
|
|
// MERGE
|
|
|
tmpLocale = loadLocale(name);
|
|
|
if (tmpLocale != null) {
|
|
|
parentConfig = tmpLocale._config;
|
|
|
}
|
|
|
config = mergeConfigs(parentConfig, config);
|
|
|
if (tmpLocale == null) {
|
|
|
// updateLocale is called for creating a new locale
|
|
|
// Set abbr so it will have a name (getters return
|
|
|
// undefined otherwise).
|
|
|
config.abbr = name;
|
|
|
}
|
|
|
locale = new Locale(config);
|
|
|
locale.parentLocale = locales[name];
|
|
|
locales[name] = locale;
|
|
|
}
|
|
|
|
|
|
// backwards compat for now: also set the locale
|
|
|
getSetGlobalLocale(name);
|
|
|
} else {
|
|
|
// pass null for config to unupdate, useful for tests
|
|
|
if (locales[name] != null) {
|
|
|
if (locales[name].parentLocale != null) {
|
|
|
locales[name] = locales[name].parentLocale;
|
|
|
if (name === getSetGlobalLocale()) {
|
|
|
getSetGlobalLocale(name);
|
|
|
}
|
|
|
} else if (locales[name] != null) {
|
|
|
delete locales[name];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return locales[name];
|
|
|
}
|
|
|
|
|
|
// returns locale data
|
|
|
function getLocale(key) {
|
|
|
var locale;
|
|
|
|
|
|
if (key && key._locale && key._locale._abbr) {
|
|
|
key = key._locale._abbr;
|
|
|
}
|
|
|
|
|
|
if (!key) {
|
|
|
return globalLocale;
|
|
|
}
|
|
|
|
|
|
if (!isArray(key)) {
|
|
|
//short-circuit everything else
|
|
|
locale = loadLocale(key);
|
|
|
if (locale) {
|
|
|
return locale;
|
|
|
}
|
|
|
key = [key];
|
|
|
}
|
|
|
|
|
|
return chooseLocale(key);
|
|
|
}
|
|
|
|
|
|
function listLocales() {
|
|
|
return keys(locales);
|
|
|
}
|
|
|
|
|
|
function checkOverflow(m) {
|
|
|
var overflow,
|
|
|
a = m._a;
|
|
|
|
|
|
if (a && getParsingFlags(m).overflow === -2) {
|
|
|
overflow =
|
|
|
a[MONTH] < 0 || a[MONTH] > 11
|
|
|
? MONTH
|
|
|
: a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])
|
|
|
? DATE
|
|
|
: a[HOUR] < 0 ||
|
|
|
a[HOUR] > 24 ||
|
|
|
(a[HOUR] === 24 &&
|
|
|
(a[MINUTE] !== 0 ||
|
|
|
a[SECOND] !== 0 ||
|
|
|
a[MILLISECOND] !== 0))
|
|
|
? HOUR
|
|
|
: a[MINUTE] < 0 || a[MINUTE] > 59
|
|
|
? MINUTE
|
|
|
: a[SECOND] < 0 || a[SECOND] > 59
|
|
|
? SECOND
|
|
|
: a[MILLISECOND] < 0 || a[MILLISECOND] > 999
|
|
|
? MILLISECOND
|
|
|
: -1;
|
|
|
|
|
|
if (
|
|
|
getParsingFlags(m)._overflowDayOfYear &&
|
|
|
(overflow < YEAR || overflow > DATE)
|
|
|
) {
|
|
|
overflow = DATE;
|
|
|
}
|
|
|
if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
|
|
|
overflow = WEEK;
|
|
|
}
|
|
|
if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
|
|
|
overflow = WEEKDAY;
|
|
|
}
|
|
|
|
|
|
getParsingFlags(m).overflow = overflow;
|
|
|
}
|
|
|
|
|
|
return m;
|
|
|
}
|
|
|
|
|
|
// iso 8601 regex
|
|
|
// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
|
|
|
var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
|
|
|
basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
|
|
|
tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
|
|
|
isoDates = [
|
|
|
['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
|
|
|
['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
|
|
|
['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
|
|
|
['GGGG-[W]WW', /\d{4}-W\d\d/, false],
|
|
|
['YYYY-DDD', /\d{4}-\d{3}/],
|
|
|
['YYYY-MM', /\d{4}-\d\d/, false],
|
|
|
['YYYYYYMMDD', /[+-]\d{10}/],
|
|
|
['YYYYMMDD', /\d{8}/],
|
|
|
['GGGG[W]WWE', /\d{4}W\d{3}/],
|
|
|
['GGGG[W]WW', /\d{4}W\d{2}/, false],
|
|
|
['YYYYDDD', /\d{7}/],
|
|
|
['YYYYMM', /\d{6}/, false],
|
|
|
['YYYY', /\d{4}/, false],
|
|
|
],
|
|
|
// iso time formats and regexes
|
|
|
isoTimes = [
|
|
|
['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
|
|
|
['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
|
|
|
['HH:mm:ss', /\d\d:\d\d:\d\d/],
|
|
|
['HH:mm', /\d\d:\d\d/],
|
|
|
['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
|
|
|
['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
|
|
|
['HHmmss', /\d\d\d\d\d\d/],
|
|
|
['HHmm', /\d\d\d\d/],
|
|
|
['HH', /\d\d/],
|
|
|
],
|
|
|
aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
|
|
|
// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
|
|
|
rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
|
|
|
obsOffsets = {
|
|
|
UT: 0,
|
|
|
GMT: 0,
|
|
|
EDT: -4 * 60,
|
|
|
EST: -5 * 60,
|
|
|
CDT: -5 * 60,
|
|
|
CST: -6 * 60,
|
|
|
MDT: -6 * 60,
|
|
|
MST: -7 * 60,
|
|
|
PDT: -7 * 60,
|
|
|
PST: -8 * 60,
|
|
|
};
|
|
|
|
|
|
// date from iso format
|
|
|
function configFromISO(config) {
|
|
|
var i,
|
|
|
l,
|
|
|
string = config._i,
|
|
|
match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
|
|
|
allowTime,
|
|
|
dateFormat,
|
|
|
timeFormat,
|
|
|
tzFormat;
|
|
|
|
|
|
if (match) {
|
|
|
getParsingFlags(config).iso = true;
|
|
|
|
|
|
for (i = 0, l = isoDates.length; i < l; i++) {
|
|
|
if (isoDates[i][1].exec(match[1])) {
|
|
|
dateFormat = isoDates[i][0];
|
|
|
allowTime = isoDates[i][2] !== false;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (dateFormat == null) {
|
|
|
config._isValid = false;
|
|
|
return;
|
|
|
}
|
|
|
if (match[3]) {
|
|
|
for (i = 0, l = isoTimes.length; i < l; i++) {
|
|
|
if (isoTimes[i][1].exec(match[3])) {
|
|
|
// match[2] should be 'T' or space
|
|
|
timeFormat = (match[2] || ' ') + isoTimes[i][0];
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (timeFormat == null) {
|
|
|
config._isValid = false;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
if (!allowTime && timeFormat != null) {
|
|
|
config._isValid = false;
|
|
|
return;
|
|
|
}
|
|
|
if (match[4]) {
|
|
|
if (tzRegex.exec(match[4])) {
|
|
|
tzFormat = 'Z';
|
|
|
} else {
|
|
|
config._isValid = false;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
|
|
|
configFromStringAndFormat(config);
|
|
|
} else {
|
|
|
config._isValid = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function extractFromRFC2822Strings(
|
|
|
yearStr,
|
|
|
monthStr,
|
|
|
dayStr,
|
|
|
hourStr,
|
|
|
minuteStr,
|
|
|
secondStr
|
|
|
) {
|
|
|
var result = [
|
|
|
untruncateYear(yearStr),
|
|
|
defaultLocaleMonthsShort.indexOf(monthStr),
|
|
|
parseInt(dayStr, 10),
|
|
|
parseInt(hourStr, 10),
|
|
|
parseInt(minuteStr, 10),
|
|
|
];
|
|
|
|
|
|
if (secondStr) {
|
|
|
result.push(parseInt(secondStr, 10));
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
function untruncateYear(yearStr) {
|
|
|
var year = parseInt(yearStr, 10);
|
|
|
if (year <= 49) {
|
|
|
return 2000 + year;
|
|
|
} else if (year <= 999) {
|
|
|
return 1900 + year;
|
|
|
}
|
|
|
return year;
|
|
|
}
|
|
|
|
|
|
function preprocessRFC2822(s) {
|
|
|
// Remove comments and folding whitespace and replace multiple-spaces with a single space
|
|
|
return s
|
|
|
.replace(/\([^)]*\)|[\n\t]/g, ' ')
|
|
|
.replace(/(\s\s+)/g, ' ')
|
|
|
.replace(/^\s\s*/, '')
|
|
|
.replace(/\s\s*$/, '');
|
|
|
}
|
|
|
|
|
|
function checkWeekday(weekdayStr, parsedInput, config) {
|
|
|
if (weekdayStr) {
|
|
|
// TODO: Replace the vanilla JS Date object with an independent day-of-week check.
|
|
|
var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
|
|
|
weekdayActual = new Date(
|
|
|
parsedInput[0],
|
|
|
parsedInput[1],
|
|
|
parsedInput[2]
|
|
|
).getDay();
|
|
|
if (weekdayProvided !== weekdayActual) {
|
|
|
getParsingFlags(config).weekdayMismatch = true;
|
|
|
config._isValid = false;
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
function calculateOffset(obsOffset, militaryOffset, numOffset) {
|
|
|
if (obsOffset) {
|
|
|
return obsOffsets[obsOffset];
|
|
|
} else if (militaryOffset) {
|
|
|
// the only allowed military tz is Z
|
|
|
return 0;
|
|
|
} else {
|
|
|
var hm = parseInt(numOffset, 10),
|
|
|
m = hm % 100,
|
|
|
h = (hm - m) / 100;
|
|
|
return h * 60 + m;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// date and time from ref 2822 format
|
|
|
function configFromRFC2822(config) {
|
|
|
var match = rfc2822.exec(preprocessRFC2822(config._i)),
|
|
|
parsedArray;
|
|
|
if (match) {
|
|
|
parsedArray = extractFromRFC2822Strings(
|
|
|
match[4],
|
|
|
match[3],
|
|
|
match[2],
|
|
|
match[5],
|
|
|
match[6],
|
|
|
match[7]
|
|
|
);
|
|
|
if (!checkWeekday(match[1], parsedArray, config)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
config._a = parsedArray;
|
|
|
config._tzm = calculateOffset(match[8], match[9], match[10]);
|
|
|
|
|
|
config._d = createUTCDate.apply(null, config._a);
|
|
|
config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
|
|
|
|
|
|
getParsingFlags(config).rfc2822 = true;
|
|
|
} else {
|
|
|
config._isValid = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict
|
|
|
function configFromString(config) {
|
|
|
var matched = aspNetJsonRegex.exec(config._i);
|
|
|
if (matched !== null) {
|
|
|
config._d = new Date(+matched[1]);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
configFromISO(config);
|
|
|
if (config._isValid === false) {
|
|
|
delete config._isValid;
|
|
|
} else {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
configFromRFC2822(config);
|
|
|
if (config._isValid === false) {
|
|
|
delete config._isValid;
|
|
|
} else {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (config._strict) {
|
|
|
config._isValid = false;
|
|
|
} else {
|
|
|
// Final attempt, use Input Fallback
|
|
|
hooks.createFromInputFallback(config);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
hooks.createFromInputFallback = deprecate(
|
|
|
'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
|
|
|
'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
|
|
|
'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
|
|
|
function (config) {
|
|
|
config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
|
|
|
}
|
|
|
);
|
|
|
|
|
|
// Pick the first defined of two or three arguments.
|
|
|
function defaults(a, b, c) {
|
|
|
if (a != null) {
|
|
|
return a;
|
|
|
}
|
|
|
if (b != null) {
|
|
|
return b;
|
|
|
}
|
|
|
return c;
|
|
|
}
|
|
|
|
|
|
function currentDateArray(config) {
|
|
|
// hooks is actually the exported moment object
|
|
|
var nowValue = new Date(hooks.now());
|
|
|
if (config._useUTC) {
|
|
|
return [
|
|
|
nowValue.getUTCFullYear(),
|
|
|
nowValue.getUTCMonth(),
|
|
|
nowValue.getUTCDate(),
|
|
|
];
|
|
|
}
|
|
|
return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
|
|
|
}
|
|
|
|
|
|
// convert an array to a date.
|
|
|
// the array should mirror the parameters below
|
|
|
// note: all values past the year are optional and will default to the lowest possible value.
|
|
|
// [year, month, day , hour, minute, second, millisecond]
|
|
|
function configFromArray(config) {
|
|
|
var i,
|
|
|
date,
|
|
|
input = [],
|
|
|
currentDate,
|
|
|
expectedWeekday,
|
|
|
yearToUse;
|
|
|
|
|
|
if (config._d) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
currentDate = currentDateArray(config);
|
|
|
|
|
|
//compute day of the year from weeks and weekdays
|
|
|
if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
|
|
|
dayOfYearFromWeekInfo(config);
|
|
|
}
|
|
|
|
|
|
//if the day of the year is set, figure out what it is
|
|
|
if (config._dayOfYear != null) {
|
|
|
yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
|
|
|
|
|
|
if (
|
|
|
config._dayOfYear > daysInYear(yearToUse) ||
|
|
|
config._dayOfYear === 0
|
|
|
) {
|
|
|
getParsingFlags(config)._overflowDayOfYear = true;
|
|
|
}
|
|
|
|
|
|
date = createUTCDate(yearToUse, 0, config._dayOfYear);
|
|
|
config._a[MONTH] = date.getUTCMonth();
|
|
|
config._a[DATE] = date.getUTCDate();
|
|
|
}
|
|
|
|
|
|
// Default to current date.
|
|
|
// * if no year, month, day of month are given, default to today
|
|
|
// * if day of month is given, default month and year
|
|
|
// * if month is given, default only year
|
|
|
// * if year is given, don't default anything
|
|
|
for (i = 0; i < 3 && config._a[i] == null; ++i) {
|
|
|
config._a[i] = input[i] = currentDate[i];
|
|
|
}
|
|
|
|
|
|
// Zero out whatever was not defaulted, including time
|
|
|
for (; i < 7; i++) {
|
|
|
config._a[i] = input[i] =
|
|
|
config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];
|
|
|
}
|
|
|
|
|
|
// Check for 24:00:00.000
|
|
|
if (
|
|
|
config._a[HOUR] === 24 &&
|
|
|
config._a[MINUTE] === 0 &&
|
|
|
config._a[SECOND] === 0 &&
|
|
|
config._a[MILLISECOND] === 0
|
|
|
) {
|
|
|
config._nextDay = true;
|
|
|
config._a[HOUR] = 0;
|
|
|
}
|
|
|
|
|
|
config._d = (config._useUTC ? createUTCDate : createDate).apply(
|
|
|
null,
|
|
|
input
|
|
|
);
|
|
|
expectedWeekday = config._useUTC
|
|
|
? config._d.getUTCDay()
|
|
|
: config._d.getDay();
|
|
|
|
|
|
// Apply timezone offset from input. The actual utcOffset can be changed
|
|
|
// with parseZone.
|
|
|
if (config._tzm != null) {
|
|
|
config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
|
|
|
}
|
|
|
|
|
|
if (config._nextDay) {
|
|
|
config._a[HOUR] = 24;
|
|
|
}
|
|
|
|
|
|
// check for mismatching day of week
|
|
|
if (
|
|
|
config._w &&
|
|
|
typeof config._w.d !== 'undefined' &&
|
|
|
config._w.d !== expectedWeekday
|
|
|
) {
|
|
|
getParsingFlags(config).weekdayMismatch = true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function dayOfYearFromWeekInfo(config) {
|
|
|
var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;
|
|
|
|
|
|
w = config._w;
|
|
|
if (w.GG != null || w.W != null || w.E != null) {
|
|
|
dow = 1;
|
|
|
doy = 4;
|
|
|
|
|
|
// TODO: We need to take the current isoWeekYear, but that depends on
|
|
|
// how we interpret now (local, utc, fixed offset). So create
|
|
|
// a now version of current config (take local/utc/offset flags, and
|
|
|
// create now).
|
|
|
weekYear = defaults(
|
|
|
w.GG,
|
|
|
config._a[YEAR],
|
|
|
weekOfYear(createLocal(), 1, 4).year
|
|
|
);
|
|
|
week = defaults(w.W, 1);
|
|
|
weekday = defaults(w.E, 1);
|
|
|
if (weekday < 1 || weekday > 7) {
|
|
|
weekdayOverflow = true;
|
|
|
}
|
|
|
} else {
|
|
|
dow = config._locale._week.dow;
|
|
|
doy = config._locale._week.doy;
|
|
|
|
|
|
curWeek = weekOfYear(createLocal(), dow, doy);
|
|
|
|
|
|
weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
|
|
|
|
|
|
// Default to current week.
|
|
|
week = defaults(w.w, curWeek.week);
|
|
|
|
|
|
if (w.d != null) {
|
|
|
// weekday -- low day numbers are considered next week
|
|
|
weekday = w.d;
|
|
|
if (weekday < 0 || weekday > 6) {
|
|
|
weekdayOverflow = true;
|
|
|
}
|
|
|
} else if (w.e != null) {
|
|
|
// local weekday -- counting starts from beginning of week
|
|
|
weekday = w.e + dow;
|
|
|
if (w.e < 0 || w.e > 6) {
|
|
|
weekdayOverflow = true;
|
|
|
}
|
|
|
} else {
|
|
|
// default to beginning of week
|
|
|
weekday = dow;
|
|
|
}
|
|
|
}
|
|
|
if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
|
|
|
getParsingFlags(config)._overflowWeeks = true;
|
|
|
} else if (weekdayOverflow != null) {
|
|
|
getParsingFlags(config)._overflowWeekday = true;
|
|
|
} else {
|
|
|
temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
|
|
|
config._a[YEAR] = temp.year;
|
|
|
config._dayOfYear = temp.dayOfYear;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// constant that refers to the ISO standard
|
|
|
hooks.ISO_8601 = function () {};
|
|
|
|
|
|
// constant that refers to the RFC 2822 form
|
|
|
hooks.RFC_2822 = function () {};
|
|
|
|
|
|
// date from string and format string
|
|
|
function configFromStringAndFormat(config) {
|
|
|
// TODO: Move this to another part of the creation flow to prevent circular deps
|
|
|
if (config._f === hooks.ISO_8601) {
|
|
|
configFromISO(config);
|
|
|
return;
|
|
|
}
|
|
|
if (config._f === hooks.RFC_2822) {
|
|
|
configFromRFC2822(config);
|
|
|
return;
|
|
|
}
|
|
|
config._a = [];
|
|
|
getParsingFlags(config).empty = true;
|
|
|
|
|
|
// This array is used to make a Date, either with `new Date` or `Date.UTC`
|
|
|
var string = '' + config._i,
|
|
|
i,
|
|
|
parsedInput,
|
|
|
tokens,
|
|
|
token,
|
|
|
skipped,
|
|
|
stringLength = string.length,
|
|
|
totalParsedInputLength = 0,
|
|
|
era;
|
|
|
|
|
|
tokens =
|
|
|
expandFormat(config._f, config._locale).match(formattingTokens) || [];
|
|
|
|
|
|
for (i = 0; i < tokens.length; i++) {
|
|
|
token = tokens[i];
|
|
|
parsedInput = (string.match(getParseRegexForToken(token, config)) ||
|
|
|
[])[0];
|
|
|
if (parsedInput) {
|
|
|
skipped = string.substr(0, string.indexOf(parsedInput));
|
|
|
if (skipped.length > 0) {
|
|
|
getParsingFlags(config).unusedInput.push(skipped);
|
|
|
}
|
|
|
string = string.slice(
|
|
|
string.indexOf(parsedInput) + parsedInput.length
|
|
|
);
|
|
|
totalParsedInputLength += parsedInput.length;
|
|
|
}
|
|
|
// don't parse if it's not a known token
|
|
|
if (formatTokenFunctions[token]) {
|
|
|
if (parsedInput) {
|
|
|
getParsingFlags(config).empty = false;
|
|
|
} else {
|
|
|
getParsingFlags(config).unusedTokens.push(token);
|
|
|
}
|
|
|
addTimeToArrayFromToken(token, parsedInput, config);
|
|
|
} else if (config._strict && !parsedInput) {
|
|
|
getParsingFlags(config).unusedTokens.push(token);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// add remaining unparsed input length to the string
|
|
|
getParsingFlags(config).charsLeftOver =
|
|
|
stringLength - totalParsedInputLength;
|
|
|
if (string.length > 0) {
|
|
|
getParsingFlags(config).unusedInput.push(string);
|
|
|
}
|
|
|
|
|
|
// clear _12h flag if hour is <= 12
|
|
|
if (
|
|
|
config._a[HOUR] <= 12 &&
|
|
|
getParsingFlags(config).bigHour === true &&
|
|
|
config._a[HOUR] > 0
|
|
|
) {
|
|
|
getParsingFlags(config).bigHour = undefined;
|
|
|
}
|
|
|
|
|
|
getParsingFlags(config).parsedDateParts = config._a.slice(0);
|
|
|
getParsingFlags(config).meridiem = config._meridiem;
|
|
|
// handle meridiem
|
|
|
config._a[HOUR] = meridiemFixWrap(
|
|
|
config._locale,
|
|
|
config._a[HOUR],
|
|
|
config._meridiem
|
|
|
);
|
|
|
|
|
|
// handle era
|
|
|
era = getParsingFlags(config).era;
|
|
|
if (era !== null) {
|
|
|
config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
|
|
|
}
|
|
|
|
|
|
configFromArray(config);
|
|
|
checkOverflow(config);
|
|
|
}
|
|
|
|
|
|
function meridiemFixWrap(locale, hour, meridiem) {
|
|
|
var isPm;
|
|
|
|
|
|
if (meridiem == null) {
|
|
|
// nothing to do
|
|
|
return hour;
|
|
|
}
|
|
|
if (locale.meridiemHour != null) {
|
|
|
return locale.meridiemHour(hour, meridiem);
|
|
|
} else if (locale.isPM != null) {
|
|
|
// Fallback
|
|
|
isPm = locale.isPM(meridiem);
|
|
|
if (isPm && hour < 12) {
|
|
|
hour += 12;
|
|
|
}
|
|
|
if (!isPm && hour === 12) {
|
|
|
hour = 0;
|
|
|
}
|
|
|
return hour;
|
|
|
} else {
|
|
|
// this is not supposed to happen
|
|
|
return hour;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// date from string and array of format strings
|
|
|
function configFromStringAndArray(config) {
|
|
|
var tempConfig,
|
|
|
bestMoment,
|
|
|
scoreToBeat,
|
|
|
i,
|
|
|
currentScore,
|
|
|
validFormatFound,
|
|
|
bestFormatIsValid = false;
|
|
|
|
|
|
if (config._f.length === 0) {
|
|
|
getParsingFlags(config).invalidFormat = true;
|
|
|
config._d = new Date(NaN);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < config._f.length; i++) {
|
|
|
currentScore = 0;
|
|
|
validFormatFound = false;
|
|
|
tempConfig = copyConfig({}, config);
|
|
|
if (config._useUTC != null) {
|
|
|
tempConfig._useUTC = config._useUTC;
|
|
|
}
|
|
|
tempConfig._f = config._f[i];
|
|
|
configFromStringAndFormat(tempConfig);
|
|
|
|
|
|
if (isValid(tempConfig)) {
|
|
|
validFormatFound = true;
|
|
|
}
|
|
|
|
|
|
// if there is any input that was not parsed add a penalty for that format
|
|
|
currentScore += getParsingFlags(tempConfig).charsLeftOver;
|
|
|
|
|
|
//or tokens
|
|
|
currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
|
|
|
|
|
|
getParsingFlags(tempConfig).score = currentScore;
|
|
|
|
|
|
if (!bestFormatIsValid) {
|
|
|
if (
|
|
|
scoreToBeat == null ||
|
|
|
currentScore < scoreToBeat ||
|
|
|
validFormatFound
|
|
|
) {
|
|
|
scoreToBeat = currentScore;
|
|
|
bestMoment = tempConfig;
|
|
|
if (validFormatFound) {
|
|
|
bestFormatIsValid = true;
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
if (currentScore < scoreToBeat) {
|
|
|
scoreToBeat = currentScore;
|
|
|
bestMoment = tempConfig;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
extend(config, bestMoment || tempConfig);
|
|
|
}
|
|
|
|
|
|
function configFromObject(config) {
|
|
|
if (config._d) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var i = normalizeObjectUnits(config._i),
|
|
|
dayOrDate = i.day === undefined ? i.date : i.day;
|
|
|
config._a = map(
|
|
|
[i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],
|
|
|
function (obj) {
|
|
|
return obj && parseInt(obj, 10);
|
|
|
}
|
|
|
);
|
|
|
|
|
|
configFromArray(config);
|
|
|
}
|
|
|
|
|
|
function createFromConfig(config) {
|
|
|
var res = new Moment(checkOverflow(prepareConfig(config)));
|
|
|
if (res._nextDay) {
|
|
|
// Adding is smart enough around DST
|
|
|
res.add(1, 'd');
|
|
|
res._nextDay = undefined;
|
|
|
}
|
|
|
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
function prepareConfig(config) {
|
|
|
var input = config._i,
|
|
|
format = config._f;
|
|
|
|
|
|
config._locale = config._locale || getLocale(config._l);
|
|
|
|
|
|
if (input === null || (format === undefined && input === '')) {
|
|
|
return createInvalid({ nullInput: true });
|
|
|
}
|
|
|
|
|
|
if (typeof input === 'string') {
|
|
|
config._i = input = config._locale.preparse(input);
|
|
|
}
|
|
|
|
|
|
if (isMoment(input)) {
|
|
|
return new Moment(checkOverflow(input));
|
|
|
} else if (isDate(input)) {
|
|
|
config._d = input;
|
|
|
} else if (isArray(format)) {
|
|
|
configFromStringAndArray(config);
|
|
|
} else if (format) {
|
|
|
configFromStringAndFormat(config);
|
|
|
} else {
|
|
|
configFromInput(config);
|
|
|
}
|
|
|
|
|
|
if (!isValid(config)) {
|
|
|
config._d = null;
|
|
|
}
|
|
|
|
|
|
return config;
|
|
|
}
|
|
|
|
|
|
function configFromInput(config) {
|
|
|
var input = config._i;
|
|
|
if (isUndefined(input)) {
|
|
|
config._d = new Date(hooks.now());
|
|
|
} else if (isDate(input)) {
|
|
|
config._d = new Date(input.valueOf());
|
|
|
} else if (typeof input === 'string') {
|
|
|
configFromString(config);
|
|
|
} else if (isArray(input)) {
|
|
|
config._a = map(input.slice(0), function (obj) {
|
|
|
return parseInt(obj, 10);
|
|
|
});
|
|
|
configFromArray(config);
|
|
|
} else if (isObject(input)) {
|
|
|
configFromObject(config);
|
|
|
} else if (isNumber(input)) {
|
|
|
// from milliseconds
|
|
|
config._d = new Date(input);
|
|
|
} else {
|
|
|
hooks.createFromInputFallback(config);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function createLocalOrUTC(input, format, locale, strict, isUTC) {
|
|
|
var c = {};
|
|
|
|
|
|
if (format === true || format === false) {
|
|
|
strict = format;
|
|
|
format = undefined;
|
|
|
}
|
|
|
|
|
|
if (locale === true || locale === false) {
|
|
|
strict = locale;
|
|
|
locale = undefined;
|
|
|
}
|
|
|
|
|
|
if (
|
|
|
(isObject(input) && isObjectEmpty(input)) ||
|
|
|
(isArray(input) && input.length === 0)
|
|
|
) {
|
|
|
input = undefined;
|
|
|
}
|
|
|
// object construction must be done this way.
|
|
|
// https://github.com/moment/moment/issues/1423
|
|
|
c._isAMomentObject = true;
|
|
|
c._useUTC = c._isUTC = isUTC;
|
|
|
c._l = locale;
|
|
|
c._i = input;
|
|
|
c._f = format;
|
|
|
c._strict = strict;
|
|
|
|
|
|
return createFromConfig(c);
|
|
|
}
|
|
|
|
|
|
function createLocal(input, format, locale, strict) {
|
|
|
return createLocalOrUTC(input, format, locale, strict, false);
|
|
|
}
|
|
|
|
|
|
var prototypeMin = deprecate(
|
|
|
'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
|
|
|
function () {
|
|
|
var other = createLocal.apply(null, arguments);
|
|
|
if (this.isValid() && other.isValid()) {
|
|
|
return other < this ? this : other;
|
|
|
} else {
|
|
|
return createInvalid();
|
|
|
}
|
|
|
}
|
|
|
),
|
|
|
prototypeMax = deprecate(
|
|
|
'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
|
|
|
function () {
|
|
|
var other = createLocal.apply(null, arguments);
|
|
|
if (this.isValid() && other.isValid()) {
|
|
|
return other > this ? this : other;
|
|
|
} else {
|
|
|
return createInvalid();
|
|
|
}
|
|
|
}
|
|
|
);
|
|
|
|
|
|
// Pick a moment m from moments so that m[fn](other) is true for all
|
|
|
// other. This relies on the function fn to be transitive.
|
|
|
//
|
|
|
// moments should either be an array of moment objects or an array, whose
|
|
|
// first element is an array of moment objects.
|
|
|
function pickBy(fn, moments) {
|
|
|
var res, i;
|
|
|
if (moments.length === 1 && isArray(moments[0])) {
|
|
|
moments = moments[0];
|
|
|
}
|
|
|
if (!moments.length) {
|
|
|
return createLocal();
|
|
|
}
|
|
|
res = moments[0];
|
|
|
for (i = 1; i < moments.length; ++i) {
|
|
|
if (!moments[i].isValid() || moments[i][fn](res)) {
|
|
|
res = moments[i];
|
|
|
}
|
|
|
}
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
// TODO: Use [].sort instead?
|
|
|
function min() {
|
|
|
var args = [].slice.call(arguments, 0);
|
|
|
|
|
|
return pickBy('isBefore', args);
|
|
|
}
|
|
|
|
|
|
function max() {
|
|
|
var args = [].slice.call(arguments, 0);
|
|
|
|
|
|
return pickBy('isAfter', args);
|
|
|
}
|
|
|
|
|
|
var now = function () {
|
|
|
return Date.now ? Date.now() : +new Date();
|
|
|
};
|
|
|
|
|
|
var ordering = [
|
|
|
'year',
|
|
|
'quarter',
|
|
|
'month',
|
|
|
'week',
|
|
|
'day',
|
|
|
'hour',
|
|
|
'minute',
|
|
|
'second',
|
|
|
'millisecond',
|
|
|
];
|
|
|
|
|
|
function isDurationValid(m) {
|
|
|
var key,
|
|
|
unitHasDecimal = false,
|
|
|
i;
|
|
|
for (key in m) {
|
|
|
if (
|
|
|
hasOwnProp(m, key) &&
|
|
|
!(
|
|
|
indexOf.call(ordering, key) !== -1 &&
|
|
|
(m[key] == null || !isNaN(m[key]))
|
|
|
)
|
|
|
) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < ordering.length; ++i) {
|
|
|
if (m[ordering[i]]) {
|
|
|
if (unitHasDecimal) {
|
|
|
return false; // only allow non-integers for smallest unit
|
|
|
}
|
|
|
if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
|
|
|
unitHasDecimal = true;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
function isValid$1() {
|
|
|
return this._isValid;
|
|
|
}
|
|
|
|
|
|
function createInvalid$1() {
|
|
|
return createDuration(NaN);
|
|
|
}
|
|
|
|
|
|
function Duration(duration) {
|
|
|
var normalizedInput = normalizeObjectUnits(duration),
|
|
|
years = normalizedInput.year || 0,
|
|
|
quarters = normalizedInput.quarter || 0,
|
|
|
months = normalizedInput.month || 0,
|
|
|
weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
|
|
|
days = normalizedInput.day || 0,
|
|
|
hours = normalizedInput.hour || 0,
|
|
|
minutes = normalizedInput.minute || 0,
|
|
|
seconds = normalizedInput.second || 0,
|
|
|
milliseconds = normalizedInput.millisecond || 0;
|
|
|
|
|
|
this._isValid = isDurationValid(normalizedInput);
|
|
|
|
|
|
// representation for dateAddRemove
|
|
|
this._milliseconds =
|
|
|
+milliseconds +
|
|
|
seconds * 1e3 + // 1000
|
|
|
minutes * 6e4 + // 1000 * 60
|
|
|
hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
|
|
|
// Because of dateAddRemove treats 24 hours as different from a
|
|
|
// day when working around DST, we need to store them separately
|
|
|
this._days = +days + weeks * 7;
|
|
|
// It is impossible to translate months into days without knowing
|
|
|
// which months you are are talking about, so we have to store
|
|
|
// it separately.
|
|
|
this._months = +months + quarters * 3 + years * 12;
|
|
|
|
|
|
this._data = {};
|
|
|
|
|
|
this._locale = getLocale();
|
|
|
|
|
|
this._bubble();
|
|
|
}
|
|
|
|
|
|
function isDuration(obj) {
|
|
|
return obj instanceof Duration;
|
|
|
}
|
|
|
|
|
|
function absRound(number) {
|
|
|
if (number < 0) {
|
|
|
return Math.round(-1 * number) * -1;
|
|
|
} else {
|
|
|
return Math.round(number);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// compare two arrays, return the number of differences
|
|
|
function compareArrays(array1, array2, dontConvert) {
|
|
|
var len = Math.min(array1.length, array2.length),
|
|
|
lengthDiff = Math.abs(array1.length - array2.length),
|
|
|
diffs = 0,
|
|
|
i;
|
|
|
for (i = 0; i < len; i++) {
|
|
|
if (
|
|
|
(dontConvert && array1[i] !== array2[i]) ||
|
|
|
(!dontConvert && toInt(array1[i]) !== toInt(array2[i]))
|
|
|
) {
|
|
|
diffs++;
|
|
|
}
|
|
|
}
|
|
|
return diffs + lengthDiff;
|
|
|
}
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
function offset(token, separator) {
|
|
|
addFormatToken(token, 0, 0, function () {
|
|
|
var offset = this.utcOffset(),
|
|
|
sign = '+';
|
|
|
if (offset < 0) {
|
|
|
offset = -offset;
|
|
|
sign = '-';
|
|
|
}
|
|
|
return (
|
|
|
sign +
|
|
|
zeroFill(~~(offset / 60), 2) +
|
|
|
separator +
|
|
|
zeroFill(~~offset % 60, 2)
|
|
|
);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
offset('Z', ':');
|
|
|
offset('ZZ', '');
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('Z', matchShortOffset);
|
|
|
addRegexToken('ZZ', matchShortOffset);
|
|
|
addParseToken(['Z', 'ZZ'], function (input, array, config) {
|
|
|
config._useUTC = true;
|
|
|
config._tzm = offsetFromString(matchShortOffset, input);
|
|
|
});
|
|
|
|
|
|
// HELPERS
|
|
|
|
|
|
// timezone chunker
|
|
|
// '+10:00' > ['10', '00']
|
|
|
// '-1530' > ['-15', '30']
|
|
|
var chunkOffset = /([\+\-]|\d\d)/gi;
|
|
|
|
|
|
function offsetFromString(matcher, string) {
|
|
|
var matches = (string || '').match(matcher),
|
|
|
chunk,
|
|
|
parts,
|
|
|
minutes;
|
|
|
|
|
|
if (matches === null) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
chunk = matches[matches.length - 1] || [];
|
|
|
parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
|
|
|
minutes = +(parts[1] * 60) + toInt(parts[2]);
|
|
|
|
|
|
return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;
|
|
|
}
|
|
|
|
|
|
// Return a moment from input, that is local/utc/zone equivalent to model.
|
|
|
function cloneWithOffset(input, model) {
|
|
|
var res, diff;
|
|
|
if (model._isUTC) {
|
|
|
res = model.clone();
|
|
|
diff =
|
|
|
(isMoment(input) || isDate(input)
|
|
|
? input.valueOf()
|
|
|
: createLocal(input).valueOf()) - res.valueOf();
|
|
|
// Use low-level api, because this fn is low-level api.
|
|
|
res._d.setTime(res._d.valueOf() + diff);
|
|
|
hooks.updateOffset(res, false);
|
|
|
return res;
|
|
|
} else {
|
|
|
return createLocal(input).local();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function getDateOffset(m) {
|
|
|
// On Firefox.24 Date#getTimezoneOffset returns a floating point.
|
|
|
// https://github.com/moment/moment/pull/1871
|
|
|
return -Math.round(m._d.getTimezoneOffset());
|
|
|
}
|
|
|
|
|
|
// HOOKS
|
|
|
|
|
|
// This function will be called whenever a moment is mutated.
|
|
|
// It is intended to keep the offset in sync with the timezone.
|
|
|
hooks.updateOffset = function () {};
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
// keepLocalTime = true means only change the timezone, without
|
|
|
// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
|
|
|
// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
|
|
|
// +0200, so we adjust the time as needed, to be valid.
|
|
|
//
|
|
|
// Keeping the time actually adds/subtracts (one hour)
|
|
|
// from the actual represented time. That is why we call updateOffset
|
|
|
// a second time. In case it wants us to change the offset again
|
|
|
// _changeInProgress == true case, then we have to adjust, because
|
|
|
// there is no such time in the given timezone.
|
|
|
function getSetOffset(input, keepLocalTime, keepMinutes) {
|
|
|
var offset = this._offset || 0,
|
|
|
localAdjust;
|
|
|
if (!this.isValid()) {
|
|
|
return input != null ? this : NaN;
|
|
|
}
|
|
|
if (input != null) {
|
|
|
if (typeof input === 'string') {
|
|
|
input = offsetFromString(matchShortOffset, input);
|
|
|
if (input === null) {
|
|
|
return this;
|
|
|
}
|
|
|
} else if (Math.abs(input) < 16 && !keepMinutes) {
|
|
|
input = input * 60;
|
|
|
}
|
|
|
if (!this._isUTC && keepLocalTime) {
|
|
|
localAdjust = getDateOffset(this);
|
|
|
}
|
|
|
this._offset = input;
|
|
|
this._isUTC = true;
|
|
|
if (localAdjust != null) {
|
|
|
this.add(localAdjust, 'm');
|
|
|
}
|
|
|
if (offset !== input) {
|
|
|
if (!keepLocalTime || this._changeInProgress) {
|
|
|
addSubtract(
|
|
|
this,
|
|
|
createDuration(input - offset, 'm'),
|
|
|
1,
|
|
|
false
|
|
|
);
|
|
|
} else if (!this._changeInProgress) {
|
|
|
this._changeInProgress = true;
|
|
|
hooks.updateOffset(this, true);
|
|
|
this._changeInProgress = null;
|
|
|
}
|
|
|
}
|
|
|
return this;
|
|
|
} else {
|
|
|
return this._isUTC ? offset : getDateOffset(this);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function getSetZone(input, keepLocalTime) {
|
|
|
if (input != null) {
|
|
|
if (typeof input !== 'string') {
|
|
|
input = -input;
|
|
|
}
|
|
|
|
|
|
this.utcOffset(input, keepLocalTime);
|
|
|
|
|
|
return this;
|
|
|
} else {
|
|
|
return -this.utcOffset();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function setOffsetToUTC(keepLocalTime) {
|
|
|
return this.utcOffset(0, keepLocalTime);
|
|
|
}
|
|
|
|
|
|
function setOffsetToLocal(keepLocalTime) {
|
|
|
if (this._isUTC) {
|
|
|
this.utcOffset(0, keepLocalTime);
|
|
|
this._isUTC = false;
|
|
|
|
|
|
if (keepLocalTime) {
|
|
|
this.subtract(getDateOffset(this), 'm');
|
|
|
}
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
function setOffsetToParsedOffset() {
|
|
|
if (this._tzm != null) {
|
|
|
this.utcOffset(this._tzm, false, true);
|
|
|
} else if (typeof this._i === 'string') {
|
|
|
var tZone = offsetFromString(matchOffset, this._i);
|
|
|
if (tZone != null) {
|
|
|
this.utcOffset(tZone);
|
|
|
} else {
|
|
|
this.utcOffset(0, true);
|
|
|
}
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
function hasAlignedHourOffset(input) {
|
|
|
if (!this.isValid()) {
|
|
|
return false;
|
|
|
}
|
|
|
input = input ? createLocal(input).utcOffset() : 0;
|
|
|
|
|
|
return (this.utcOffset() - input) % 60 === 0;
|
|
|
}
|
|
|
|
|
|
function isDaylightSavingTime() {
|
|
|
return (
|
|
|
this.utcOffset() > this.clone().month(0).utcOffset() ||
|
|
|
this.utcOffset() > this.clone().month(5).utcOffset()
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function isDaylightSavingTimeShifted() {
|
|
|
if (!isUndefined(this._isDSTShifted)) {
|
|
|
return this._isDSTShifted;
|
|
|
}
|
|
|
|
|
|
var c = {},
|
|
|
other;
|
|
|
|
|
|
copyConfig(c, this);
|
|
|
c = prepareConfig(c);
|
|
|
|
|
|
if (c._a) {
|
|
|
other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
|
|
|
this._isDSTShifted =
|
|
|
this.isValid() && compareArrays(c._a, other.toArray()) > 0;
|
|
|
} else {
|
|
|
this._isDSTShifted = false;
|
|
|
}
|
|
|
|
|
|
return this._isDSTShifted;
|
|
|
}
|
|
|
|
|
|
function isLocal() {
|
|
|
return this.isValid() ? !this._isUTC : false;
|
|
|
}
|
|
|
|
|
|
function isUtcOffset() {
|
|
|
return this.isValid() ? this._isUTC : false;
|
|
|
}
|
|
|
|
|
|
function isUtc() {
|
|
|
return this.isValid() ? this._isUTC && this._offset === 0 : false;
|
|
|
}
|
|
|
|
|
|
// ASP.NET json date format regex
|
|
|
var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,
|
|
|
// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
|
|
|
// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
|
|
|
// and further modified to allow for strings containing both week and day
|
|
|
isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
|
|
|
|
|
|
function createDuration(input, key) {
|
|
|
var duration = input,
|
|
|
// matching against regexp is expensive, do it on demand
|
|
|
match = null,
|
|
|
sign,
|
|
|
ret,
|
|
|
diffRes;
|
|
|
|
|
|
if (isDuration(input)) {
|
|
|
duration = {
|
|
|
ms: input._milliseconds,
|
|
|
d: input._days,
|
|
|
M: input._months,
|
|
|
};
|
|
|
} else if (isNumber(input) || !isNaN(+input)) {
|
|
|
duration = {};
|
|
|
if (key) {
|
|
|
duration[key] = +input;
|
|
|
} else {
|
|
|
duration.milliseconds = +input;
|
|
|
}
|
|
|
} else if ((match = aspNetRegex.exec(input))) {
|
|
|
sign = match[1] === '-' ? -1 : 1;
|
|
|
duration = {
|
|
|
y: 0,
|
|
|
d: toInt(match[DATE]) * sign,
|
|
|
h: toInt(match[HOUR]) * sign,
|
|
|
m: toInt(match[MINUTE]) * sign,
|
|
|
s: toInt(match[SECOND]) * sign,
|
|
|
ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match
|
|
|
};
|
|
|
} else if ((match = isoRegex.exec(input))) {
|
|
|
sign = match[1] === '-' ? -1 : 1;
|
|
|
duration = {
|
|
|
y: parseIso(match[2], sign),
|
|
|
M: parseIso(match[3], sign),
|
|
|
w: parseIso(match[4], sign),
|
|
|
d: parseIso(match[5], sign),
|
|
|
h: parseIso(match[6], sign),
|
|
|
m: parseIso(match[7], sign),
|
|
|
s: parseIso(match[8], sign),
|
|
|
};
|
|
|
} else if (duration == null) {
|
|
|
// checks for null or undefined
|
|
|
duration = {};
|
|
|
} else if (
|
|
|
typeof duration === 'object' &&
|
|
|
('from' in duration || 'to' in duration)
|
|
|
) {
|
|
|
diffRes = momentsDifference(
|
|
|
createLocal(duration.from),
|
|
|
createLocal(duration.to)
|
|
|
);
|
|
|
|
|
|
duration = {};
|
|
|
duration.ms = diffRes.milliseconds;
|
|
|
duration.M = diffRes.months;
|
|
|
}
|
|
|
|
|
|
ret = new Duration(duration);
|
|
|
|
|
|
if (isDuration(input) && hasOwnProp(input, '_locale')) {
|
|
|
ret._locale = input._locale;
|
|
|
}
|
|
|
|
|
|
if (isDuration(input) && hasOwnProp(input, '_isValid')) {
|
|
|
ret._isValid = input._isValid;
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
createDuration.fn = Duration.prototype;
|
|
|
createDuration.invalid = createInvalid$1;
|
|
|
|
|
|
function parseIso(inp, sign) {
|
|
|
// We'd normally use ~~inp for this, but unfortunately it also
|
|
|
// converts floats to ints.
|
|
|
// inp may be undefined, so careful calling replace on it.
|
|
|
var res = inp && parseFloat(inp.replace(',', '.'));
|
|
|
// apply sign while we're at it
|
|
|
return (isNaN(res) ? 0 : res) * sign;
|
|
|
}
|
|
|
|
|
|
function positiveMomentsDifference(base, other) {
|
|
|
var res = {};
|
|
|
|
|
|
res.months =
|
|
|
other.month() - base.month() + (other.year() - base.year()) * 12;
|
|
|
if (base.clone().add(res.months, 'M').isAfter(other)) {
|
|
|
--res.months;
|
|
|
}
|
|
|
|
|
|
res.milliseconds = +other - +base.clone().add(res.months, 'M');
|
|
|
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
function momentsDifference(base, other) {
|
|
|
var res;
|
|
|
if (!(base.isValid() && other.isValid())) {
|
|
|
return { milliseconds: 0, months: 0 };
|
|
|
}
|
|
|
|
|
|
other = cloneWithOffset(other, base);
|
|
|
if (base.isBefore(other)) {
|
|
|
res = positiveMomentsDifference(base, other);
|
|
|
} else {
|
|
|
res = positiveMomentsDifference(other, base);
|
|
|
res.milliseconds = -res.milliseconds;
|
|
|
res.months = -res.months;
|
|
|
}
|
|
|
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
// TODO: remove 'name' arg after deprecation is removed
|
|
|
function createAdder(direction, name) {
|
|
|
return function (val, period) {
|
|
|
var dur, tmp;
|
|
|
//invert the arguments, but complain about it
|
|
|
if (period !== null && !isNaN(+period)) {
|
|
|
deprecateSimple(
|
|
|
name,
|
|
|
'moment().' +
|
|
|
name +
|
|
|
'(period, number) is deprecated. Please use moment().' +
|
|
|
name +
|
|
|
'(number, period). ' +
|
|
|
'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
|
|
|
);
|
|
|
tmp = val;
|
|
|
val = period;
|
|
|
period = tmp;
|
|
|
}
|
|
|
|
|
|
dur = createDuration(val, period);
|
|
|
addSubtract(this, dur, direction);
|
|
|
return this;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function addSubtract(mom, duration, isAdding, updateOffset) {
|
|
|
var milliseconds = duration._milliseconds,
|
|
|
days = absRound(duration._days),
|
|
|
months = absRound(duration._months);
|
|
|
|
|
|
if (!mom.isValid()) {
|
|
|
// No op
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
updateOffset = updateOffset == null ? true : updateOffset;
|
|
|
|
|
|
if (months) {
|
|
|
setMonth(mom, get(mom, 'Month') + months * isAdding);
|
|
|
}
|
|
|
if (days) {
|
|
|
set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
|
|
|
}
|
|
|
if (milliseconds) {
|
|
|
mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
|
|
|
}
|
|
|
if (updateOffset) {
|
|
|
hooks.updateOffset(mom, days || months);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var add = createAdder(1, 'add'),
|
|
|
subtract = createAdder(-1, 'subtract');
|
|
|
|
|
|
function isString(input) {
|
|
|
return typeof input === 'string' || input instanceof String;
|
|
|
}
|
|
|
|
|
|
// type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
|
|
|
function isMomentInput(input) {
|
|
|
return (
|
|
|
isMoment(input) ||
|
|
|
isDate(input) ||
|
|
|
isString(input) ||
|
|
|
isNumber(input) ||
|
|
|
isNumberOrStringArray(input) ||
|
|
|
isMomentInputObject(input) ||
|
|
|
input === null ||
|
|
|
input === undefined
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function isMomentInputObject(input) {
|
|
|
var objectTest = isObject(input) && !isObjectEmpty(input),
|
|
|
propertyTest = false,
|
|
|
properties = [
|
|
|
'years',
|
|
|
'year',
|
|
|
'y',
|
|
|
'months',
|
|
|
'month',
|
|
|
'M',
|
|
|
'days',
|
|
|
'day',
|
|
|
'd',
|
|
|
'dates',
|
|
|
'date',
|
|
|
'D',
|
|
|
'hours',
|
|
|
'hour',
|
|
|
'h',
|
|
|
'minutes',
|
|
|
'minute',
|
|
|
'm',
|
|
|
'seconds',
|
|
|
'second',
|
|
|
's',
|
|
|
'milliseconds',
|
|
|
'millisecond',
|
|
|
'ms',
|
|
|
],
|
|
|
i,
|
|
|
property;
|
|
|
|
|
|
for (i = 0; i < properties.length; i += 1) {
|
|
|
property = properties[i];
|
|
|
propertyTest = propertyTest || hasOwnProp(input, property);
|
|
|
}
|
|
|
|
|
|
return objectTest && propertyTest;
|
|
|
}
|
|
|
|
|
|
function isNumberOrStringArray(input) {
|
|
|
var arrayTest = isArray(input),
|
|
|
dataTypeTest = false;
|
|
|
if (arrayTest) {
|
|
|
dataTypeTest =
|
|
|
input.filter(function (item) {
|
|
|
return !isNumber(item) && isString(input);
|
|
|
}).length === 0;
|
|
|
}
|
|
|
return arrayTest && dataTypeTest;
|
|
|
}
|
|
|
|
|
|
function isCalendarSpec(input) {
|
|
|
var objectTest = isObject(input) && !isObjectEmpty(input),
|
|
|
propertyTest = false,
|
|
|
properties = [
|
|
|
'sameDay',
|
|
|
'nextDay',
|
|
|
'lastDay',
|
|
|
'nextWeek',
|
|
|
'lastWeek',
|
|
|
'sameElse',
|
|
|
],
|
|
|
i,
|
|
|
property;
|
|
|
|
|
|
for (i = 0; i < properties.length; i += 1) {
|
|
|
property = properties[i];
|
|
|
propertyTest = propertyTest || hasOwnProp(input, property);
|
|
|
}
|
|
|
|
|
|
return objectTest && propertyTest;
|
|
|
}
|
|
|
|
|
|
function getCalendarFormat(myMoment, now) {
|
|
|
var diff = myMoment.diff(now, 'days', true);
|
|
|
return diff < -6
|
|
|
? 'sameElse'
|
|
|
: diff < -1
|
|
|
? 'lastWeek'
|
|
|
: diff < 0
|
|
|
? 'lastDay'
|
|
|
: diff < 1
|
|
|
? 'sameDay'
|
|
|
: diff < 2
|
|
|
? 'nextDay'
|
|
|
: diff < 7
|
|
|
? 'nextWeek'
|
|
|
: 'sameElse';
|
|
|
}
|
|
|
|
|
|
function calendar$1(time, formats) {
|
|
|
// Support for single parameter, formats only overload to the calendar function
|
|
|
if (arguments.length === 1) {
|
|
|
if (!arguments[0]) {
|
|
|
time = undefined;
|
|
|
formats = undefined;
|
|
|
} else if (isMomentInput(arguments[0])) {
|
|
|
time = arguments[0];
|
|
|
formats = undefined;
|
|
|
} else if (isCalendarSpec(arguments[0])) {
|
|
|
formats = arguments[0];
|
|
|
time = undefined;
|
|
|
}
|
|
|
}
|
|
|
// We want to compare the start of today, vs this.
|
|
|
// Getting start-of-today depends on whether we're local/utc/offset or not.
|
|
|
var now = time || createLocal(),
|
|
|
sod = cloneWithOffset(now, this).startOf('day'),
|
|
|
format = hooks.calendarFormat(this, sod) || 'sameElse',
|
|
|
output =
|
|
|
formats &&
|
|
|
(isFunction(formats[format])
|
|
|
? formats[format].call(this, now)
|
|
|
: formats[format]);
|
|
|
|
|
|
return this.format(
|
|
|
output || this.localeData().calendar(format, this, createLocal(now))
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function clone() {
|
|
|
return new Moment(this);
|
|
|
}
|
|
|
|
|
|
function isAfter(input, units) {
|
|
|
var localInput = isMoment(input) ? input : createLocal(input);
|
|
|
if (!(this.isValid() && localInput.isValid())) {
|
|
|
return false;
|
|
|
}
|
|
|
units = normalizeUnits(units) || 'millisecond';
|
|
|
if (units === 'millisecond') {
|
|
|
return this.valueOf() > localInput.valueOf();
|
|
|
} else {
|
|
|
return localInput.valueOf() < this.clone().startOf(units).valueOf();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function isBefore(input, units) {
|
|
|
var localInput = isMoment(input) ? input : createLocal(input);
|
|
|
if (!(this.isValid() && localInput.isValid())) {
|
|
|
return false;
|
|
|
}
|
|
|
units = normalizeUnits(units) || 'millisecond';
|
|
|
if (units === 'millisecond') {
|
|
|
return this.valueOf() < localInput.valueOf();
|
|
|
} else {
|
|
|
return this.clone().endOf(units).valueOf() < localInput.valueOf();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function isBetween(from, to, units, inclusivity) {
|
|
|
var localFrom = isMoment(from) ? from : createLocal(from),
|
|
|
localTo = isMoment(to) ? to : createLocal(to);
|
|
|
if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
|
|
|
return false;
|
|
|
}
|
|
|
inclusivity = inclusivity || '()';
|
|
|
return (
|
|
|
(inclusivity[0] === '('
|
|
|
? this.isAfter(localFrom, units)
|
|
|
: !this.isBefore(localFrom, units)) &&
|
|
|
(inclusivity[1] === ')'
|
|
|
? this.isBefore(localTo, units)
|
|
|
: !this.isAfter(localTo, units))
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function isSame(input, units) {
|
|
|
var localInput = isMoment(input) ? input : createLocal(input),
|
|
|
inputMs;
|
|
|
if (!(this.isValid() && localInput.isValid())) {
|
|
|
return false;
|
|
|
}
|
|
|
units = normalizeUnits(units) || 'millisecond';
|
|
|
if (units === 'millisecond') {
|
|
|
return this.valueOf() === localInput.valueOf();
|
|
|
} else {
|
|
|
inputMs = localInput.valueOf();
|
|
|
return (
|
|
|
this.clone().startOf(units).valueOf() <= inputMs &&
|
|
|
inputMs <= this.clone().endOf(units).valueOf()
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function isSameOrAfter(input, units) {
|
|
|
return this.isSame(input, units) || this.isAfter(input, units);
|
|
|
}
|
|
|
|
|
|
function isSameOrBefore(input, units) {
|
|
|
return this.isSame(input, units) || this.isBefore(input, units);
|
|
|
}
|
|
|
|
|
|
function diff(input, units, asFloat) {
|
|
|
var that, zoneDelta, output;
|
|
|
|
|
|
if (!this.isValid()) {
|
|
|
return NaN;
|
|
|
}
|
|
|
|
|
|
that = cloneWithOffset(input, this);
|
|
|
|
|
|
if (!that.isValid()) {
|
|
|
return NaN;
|
|
|
}
|
|
|
|
|
|
zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
|
|
|
|
|
|
units = normalizeUnits(units);
|
|
|
|
|
|
switch (units) {
|
|
|
case 'year':
|
|
|
output = monthDiff(this, that) / 12;
|
|
|
break;
|
|
|
case 'month':
|
|
|
output = monthDiff(this, that);
|
|
|
break;
|
|
|
case 'quarter':
|
|
|
output = monthDiff(this, that) / 3;
|
|
|
break;
|
|
|
case 'second':
|
|
|
output = (this - that) / 1e3;
|
|
|
break; // 1000
|
|
|
case 'minute':
|
|
|
output = (this - that) / 6e4;
|
|
|
break; // 1000 * 60
|
|
|
case 'hour':
|
|
|
output = (this - that) / 36e5;
|
|
|
break; // 1000 * 60 * 60
|
|
|
case 'day':
|
|
|
output = (this - that - zoneDelta) / 864e5;
|
|
|
break; // 1000 * 60 * 60 * 24, negate dst
|
|
|
case 'week':
|
|
|
output = (this - that - zoneDelta) / 6048e5;
|
|
|
break; // 1000 * 60 * 60 * 24 * 7, negate dst
|
|
|
default:
|
|
|
output = this - that;
|
|
|
}
|
|
|
|
|
|
return asFloat ? output : absFloor(output);
|
|
|
}
|
|
|
|
|
|
function monthDiff(a, b) {
|
|
|
if (a.date() < b.date()) {
|
|
|
// end-of-month calculations work correct when the start month has more
|
|
|
// days than the end month.
|
|
|
return -monthDiff(b, a);
|
|
|
}
|
|
|
// difference in months
|
|
|
var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),
|
|
|
// b is in (anchor - 1 month, anchor + 1 month)
|
|
|
anchor = a.clone().add(wholeMonthDiff, 'months'),
|
|
|
anchor2,
|
|
|
adjust;
|
|
|
|
|
|
if (b - anchor < 0) {
|
|
|
anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
|
|
|
// linear across the month
|
|
|
adjust = (b - anchor) / (anchor - anchor2);
|
|
|
} else {
|
|
|
anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
|
|
|
// linear across the month
|
|
|
adjust = (b - anchor) / (anchor2 - anchor);
|
|
|
}
|
|
|
|
|
|
//check for negative zero, return zero if negative zero
|
|
|
return -(wholeMonthDiff + adjust) || 0;
|
|
|
}
|
|
|
|
|
|
hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
|
|
|
hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
|
|
|
|
|
|
function toString() {
|
|
|
return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
|
|
|
}
|
|
|
|
|
|
function toISOString(keepOffset) {
|
|
|
if (!this.isValid()) {
|
|
|
return null;
|
|
|
}
|
|
|
var utc = keepOffset !== true,
|
|
|
m = utc ? this.clone().utc() : this;
|
|
|
if (m.year() < 0 || m.year() > 9999) {
|
|
|
return formatMoment(
|
|
|
m,
|
|
|
utc
|
|
|
? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'
|
|
|
: 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'
|
|
|
);
|
|
|
}
|
|
|
if (isFunction(Date.prototype.toISOString)) {
|
|
|
// native implementation is ~50x faster, use it when we can
|
|
|
if (utc) {
|
|
|
return this.toDate().toISOString();
|
|
|
} else {
|
|
|
return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)
|
|
|
.toISOString()
|
|
|
.replace('Z', formatMoment(m, 'Z'));
|
|
|
}
|
|
|
}
|
|
|
return formatMoment(
|
|
|
m,
|
|
|
utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'
|
|
|
);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Return a human readable representation of a moment that can
|
|
|
* also be evaluated to get a new moment which is the same
|
|
|
*
|
|
|
* @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
|
|
|
*/
|
|
|
function inspect() {
|
|
|
if (!this.isValid()) {
|
|
|
return 'moment.invalid(/* ' + this._i + ' */)';
|
|
|
}
|
|
|
var func = 'moment',
|
|
|
zone = '',
|
|
|
prefix,
|
|
|
year,
|
|
|
datetime,
|
|
|
suffix;
|
|
|
if (!this.isLocal()) {
|
|
|
func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
|
|
|
zone = 'Z';
|
|
|
}
|
|
|
prefix = '[' + func + '("]';
|
|
|
year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
|
|
|
datetime = '-MM-DD[T]HH:mm:ss.SSS';
|
|
|
suffix = zone + '[")]';
|
|
|
|
|
|
return this.format(prefix + year + datetime + suffix);
|
|
|
}
|
|
|
|
|
|
function format(inputString) {
|
|
|
if (!inputString) {
|
|
|
inputString = this.isUtc()
|
|
|
? hooks.defaultFormatUtc
|
|
|
: hooks.defaultFormat;
|
|
|
}
|
|
|
var output = formatMoment(this, inputString);
|
|
|
return this.localeData().postformat(output);
|
|
|
}
|
|
|
|
|
|
function from(time, withoutSuffix) {
|
|
|
if (
|
|
|
this.isValid() &&
|
|
|
((isMoment(time) && time.isValid()) || createLocal(time).isValid())
|
|
|
) {
|
|
|
return createDuration({ to: this, from: time })
|
|
|
.locale(this.locale())
|
|
|
.humanize(!withoutSuffix);
|
|
|
} else {
|
|
|
return this.localeData().invalidDate();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function fromNow(withoutSuffix) {
|
|
|
return this.from(createLocal(), withoutSuffix);
|
|
|
}
|
|
|
|
|
|
function to(time, withoutSuffix) {
|
|
|
if (
|
|
|
this.isValid() &&
|
|
|
((isMoment(time) && time.isValid()) || createLocal(time).isValid())
|
|
|
) {
|
|
|
return createDuration({ from: this, to: time })
|
|
|
.locale(this.locale())
|
|
|
.humanize(!withoutSuffix);
|
|
|
} else {
|
|
|
return this.localeData().invalidDate();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function toNow(withoutSuffix) {
|
|
|
return this.to(createLocal(), withoutSuffix);
|
|
|
}
|
|
|
|
|
|
// If passed a locale key, it will set the locale for this
|
|
|
// instance. Otherwise, it will return the locale configuration
|
|
|
// variables for this instance.
|
|
|
function locale(key) {
|
|
|
var newLocaleData;
|
|
|
|
|
|
if (key === undefined) {
|
|
|
return this._locale._abbr;
|
|
|
} else {
|
|
|
newLocaleData = getLocale(key);
|
|
|
if (newLocaleData != null) {
|
|
|
this._locale = newLocaleData;
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var lang = deprecate(
|
|
|
'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
|
|
|
function (key) {
|
|
|
if (key === undefined) {
|
|
|
return this.localeData();
|
|
|
} else {
|
|
|
return this.locale(key);
|
|
|
}
|
|
|
}
|
|
|
);
|
|
|
|
|
|
function localeData() {
|
|
|
return this._locale;
|
|
|
}
|
|
|
|
|
|
var MS_PER_SECOND = 1000,
|
|
|
MS_PER_MINUTE = 60 * MS_PER_SECOND,
|
|
|
MS_PER_HOUR = 60 * MS_PER_MINUTE,
|
|
|
MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;
|
|
|
|
|
|
// actual modulo - handles negative numbers (for dates before 1970):
|
|
|
function mod$1(dividend, divisor) {
|
|
|
return ((dividend % divisor) + divisor) % divisor;
|
|
|
}
|
|
|
|
|
|
function localStartOfDate(y, m, d) {
|
|
|
// the date constructor remaps years 0-99 to 1900-1999
|
|
|
if (y < 100 && y >= 0) {
|
|
|
// preserve leap years using a full 400 year cycle, then reset
|
|
|
return new Date(y + 400, m, d) - MS_PER_400_YEARS;
|
|
|
} else {
|
|
|
return new Date(y, m, d).valueOf();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function utcStartOfDate(y, m, d) {
|
|
|
// Date.UTC remaps years 0-99 to 1900-1999
|
|
|
if (y < 100 && y >= 0) {
|
|
|
// preserve leap years using a full 400 year cycle, then reset
|
|
|
return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
|
|
|
} else {
|
|
|
return Date.UTC(y, m, d);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function startOf(units) {
|
|
|
var time, startOfDate;
|
|
|
units = normalizeUnits(units);
|
|
|
if (units === undefined || units === 'millisecond' || !this.isValid()) {
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
|
|
|
|
|
|
switch (units) {
|
|
|
case 'year':
|
|
|
time = startOfDate(this.year(), 0, 1);
|
|
|
break;
|
|
|
case 'quarter':
|
|
|
time = startOfDate(
|
|
|
this.year(),
|
|
|
this.month() - (this.month() % 3),
|
|
|
1
|
|
|
);
|
|
|
break;
|
|
|
case 'month':
|
|
|
time = startOfDate(this.year(), this.month(), 1);
|
|
|
break;
|
|
|
case 'week':
|
|
|
time = startOfDate(
|
|
|
this.year(),
|
|
|
this.month(),
|
|
|
this.date() - this.weekday()
|
|
|
);
|
|
|
break;
|
|
|
case 'isoWeek':
|
|
|
time = startOfDate(
|
|
|
this.year(),
|
|
|
this.month(),
|
|
|
this.date() - (this.isoWeekday() - 1)
|
|
|
);
|
|
|
break;
|
|
|
case 'day':
|
|
|
case 'date':
|
|
|
time = startOfDate(this.year(), this.month(), this.date());
|
|
|
break;
|
|
|
case 'hour':
|
|
|
time = this._d.valueOf();
|
|
|
time -= mod$1(
|
|
|
time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
|
|
|
MS_PER_HOUR
|
|
|
);
|
|
|
break;
|
|
|
case 'minute':
|
|
|
time = this._d.valueOf();
|
|
|
time -= mod$1(time, MS_PER_MINUTE);
|
|
|
break;
|
|
|
case 'second':
|
|
|
time = this._d.valueOf();
|
|
|
time -= mod$1(time, MS_PER_SECOND);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
this._d.setTime(time);
|
|
|
hooks.updateOffset(this, true);
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
function endOf(units) {
|
|
|
var time, startOfDate;
|
|
|
units = normalizeUnits(units);
|
|
|
if (units === undefined || units === 'millisecond' || !this.isValid()) {
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
|
|
|
|
|
|
switch (units) {
|
|
|
case 'year':
|
|
|
time = startOfDate(this.year() + 1, 0, 1) - 1;
|
|
|
break;
|
|
|
case 'quarter':
|
|
|
time =
|
|
|
startOfDate(
|
|
|
this.year(),
|
|
|
this.month() - (this.month() % 3) + 3,
|
|
|
1
|
|
|
) - 1;
|
|
|
break;
|
|
|
case 'month':
|
|
|
time = startOfDate(this.year(), this.month() + 1, 1) - 1;
|
|
|
break;
|
|
|
case 'week':
|
|
|
time =
|
|
|
startOfDate(
|
|
|
this.year(),
|
|
|
this.month(),
|
|
|
this.date() - this.weekday() + 7
|
|
|
) - 1;
|
|
|
break;
|
|
|
case 'isoWeek':
|
|
|
time =
|
|
|
startOfDate(
|
|
|
this.year(),
|
|
|
this.month(),
|
|
|
this.date() - (this.isoWeekday() - 1) + 7
|
|
|
) - 1;
|
|
|
break;
|
|
|
case 'day':
|
|
|
case 'date':
|
|
|
time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
|
|
|
break;
|
|
|
case 'hour':
|
|
|
time = this._d.valueOf();
|
|
|
time +=
|
|
|
MS_PER_HOUR -
|
|
|
mod$1(
|
|
|
time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
|
|
|
MS_PER_HOUR
|
|
|
) -
|
|
|
1;
|
|
|
break;
|
|
|
case 'minute':
|
|
|
time = this._d.valueOf();
|
|
|
time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;
|
|
|
break;
|
|
|
case 'second':
|
|
|
time = this._d.valueOf();
|
|
|
time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
this._d.setTime(time);
|
|
|
hooks.updateOffset(this, true);
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
function valueOf() {
|
|
|
return this._d.valueOf() - (this._offset || 0) * 60000;
|
|
|
}
|
|
|
|
|
|
function unix() {
|
|
|
return Math.floor(this.valueOf() / 1000);
|
|
|
}
|
|
|
|
|
|
function toDate() {
|
|
|
return new Date(this.valueOf());
|
|
|
}
|
|
|
|
|
|
function toArray() {
|
|
|
var m = this;
|
|
|
return [
|
|
|
m.year(),
|
|
|
m.month(),
|
|
|
m.date(),
|
|
|
m.hour(),
|
|
|
m.minute(),
|
|
|
m.second(),
|
|
|
m.millisecond(),
|
|
|
];
|
|
|
}
|
|
|
|
|
|
function toObject() {
|
|
|
var m = this;
|
|
|
return {
|
|
|
years: m.year(),
|
|
|
months: m.month(),
|
|
|
date: m.date(),
|
|
|
hours: m.hours(),
|
|
|
minutes: m.minutes(),
|
|
|
seconds: m.seconds(),
|
|
|
milliseconds: m.milliseconds(),
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function toJSON() {
|
|
|
// new Date(NaN).toJSON() === null
|
|
|
return this.isValid() ? this.toISOString() : null;
|
|
|
}
|
|
|
|
|
|
function isValid$2() {
|
|
|
return isValid(this);
|
|
|
}
|
|
|
|
|
|
function parsingFlags() {
|
|
|
return extend({}, getParsingFlags(this));
|
|
|
}
|
|
|
|
|
|
function invalidAt() {
|
|
|
return getParsingFlags(this).overflow;
|
|
|
}
|
|
|
|
|
|
function creationData() {
|
|
|
return {
|
|
|
input: this._i,
|
|
|
format: this._f,
|
|
|
locale: this._locale,
|
|
|
isUTC: this._isUTC,
|
|
|
strict: this._strict,
|
|
|
};
|
|
|
}
|
|
|
|
|
|
addFormatToken('N', 0, 0, 'eraAbbr');
|
|
|
addFormatToken('NN', 0, 0, 'eraAbbr');
|
|
|
addFormatToken('NNN', 0, 0, 'eraAbbr');
|
|
|
addFormatToken('NNNN', 0, 0, 'eraName');
|
|
|
addFormatToken('NNNNN', 0, 0, 'eraNarrow');
|
|
|
|
|
|
addFormatToken('y', ['y', 1], 'yo', 'eraYear');
|
|
|
addFormatToken('y', ['yy', 2], 0, 'eraYear');
|
|
|
addFormatToken('y', ['yyy', 3], 0, 'eraYear');
|
|
|
addFormatToken('y', ['yyyy', 4], 0, 'eraYear');
|
|
|
|
|
|
addRegexToken('N', matchEraAbbr);
|
|
|
addRegexToken('NN', matchEraAbbr);
|
|
|
addRegexToken('NNN', matchEraAbbr);
|
|
|
addRegexToken('NNNN', matchEraName);
|
|
|
addRegexToken('NNNNN', matchEraNarrow);
|
|
|
|
|
|
addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function (
|
|
|
input,
|
|
|
array,
|
|
|
config,
|
|
|
token
|
|
|
) {
|
|
|
var era = config._locale.erasParse(input, token, config._strict);
|
|
|
if (era) {
|
|
|
getParsingFlags(config).era = era;
|
|
|
} else {
|
|
|
getParsingFlags(config).invalidEra = input;
|
|
|
}
|
|
|
});
|
|
|
|
|
|
addRegexToken('y', matchUnsigned);
|
|
|
addRegexToken('yy', matchUnsigned);
|
|
|
addRegexToken('yyy', matchUnsigned);
|
|
|
addRegexToken('yyyy', matchUnsigned);
|
|
|
addRegexToken('yo', matchEraYearOrdinal);
|
|
|
|
|
|
addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
|
|
|
addParseToken(['yo'], function (input, array, config, token) {
|
|
|
var match;
|
|
|
if (config._locale._eraYearOrdinalRegex) {
|
|
|
match = input.match(config._locale._eraYearOrdinalRegex);
|
|
|
}
|
|
|
|
|
|
if (config._locale.eraYearOrdinalParse) {
|
|
|
array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
|
|
|
} else {
|
|
|
array[YEAR] = parseInt(input, 10);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
function localeEras(m, format) {
|
|
|
var i,
|
|
|
l,
|
|
|
date,
|
|
|
eras = this._eras || getLocale('en')._eras;
|
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
|
switch (typeof eras[i].since) {
|
|
|
case 'string':
|
|
|
// truncate time
|
|
|
date = hooks(eras[i].since).startOf('day');
|
|
|
eras[i].since = date.valueOf();
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
switch (typeof eras[i].until) {
|
|
|
case 'undefined':
|
|
|
eras[i].until = +Infinity;
|
|
|
break;
|
|
|
case 'string':
|
|
|
// truncate time
|
|
|
date = hooks(eras[i].until).startOf('day').valueOf();
|
|
|
eras[i].until = date.valueOf();
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
return eras;
|
|
|
}
|
|
|
|
|
|
function localeErasParse(eraName, format, strict) {
|
|
|
var i,
|
|
|
l,
|
|
|
eras = this.eras(),
|
|
|
name,
|
|
|
abbr,
|
|
|
narrow;
|
|
|
eraName = eraName.toUpperCase();
|
|
|
|
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
|
name = eras[i].name.toUpperCase();
|
|
|
abbr = eras[i].abbr.toUpperCase();
|
|
|
narrow = eras[i].narrow.toUpperCase();
|
|
|
|
|
|
if (strict) {
|
|
|
switch (format) {
|
|
|
case 'N':
|
|
|
case 'NN':
|
|
|
case 'NNN':
|
|
|
if (abbr === eraName) {
|
|
|
return eras[i];
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case 'NNNN':
|
|
|
if (name === eraName) {
|
|
|
return eras[i];
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case 'NNNNN':
|
|
|
if (narrow === eraName) {
|
|
|
return eras[i];
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
} else if ([name, abbr, narrow].indexOf(eraName) >= 0) {
|
|
|
return eras[i];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function localeErasConvertYear(era, year) {
|
|
|
var dir = era.since <= era.until ? +1 : -1;
|
|
|
if (year === undefined) {
|
|
|
return hooks(era.since).year();
|
|
|
} else {
|
|
|
return hooks(era.since).year() + (year - era.offset) * dir;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function getEraName() {
|
|
|
var i,
|
|
|
l,
|
|
|
val,
|
|
|
eras = this.localeData().eras();
|
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
|
// truncate time
|
|
|
val = this.clone().startOf('day').valueOf();
|
|
|
|
|
|
if (eras[i].since <= val && val <= eras[i].until) {
|
|
|
return eras[i].name;
|
|
|
}
|
|
|
if (eras[i].until <= val && val <= eras[i].since) {
|
|
|
return eras[i].name;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
function getEraNarrow() {
|
|
|
var i,
|
|
|
l,
|
|
|
val,
|
|
|
eras = this.localeData().eras();
|
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
|
// truncate time
|
|
|
val = this.clone().startOf('day').valueOf();
|
|
|
|
|
|
if (eras[i].since <= val && val <= eras[i].until) {
|
|
|
return eras[i].narrow;
|
|
|
}
|
|
|
if (eras[i].until <= val && val <= eras[i].since) {
|
|
|
return eras[i].narrow;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
function getEraAbbr() {
|
|
|
var i,
|
|
|
l,
|
|
|
val,
|
|
|
eras = this.localeData().eras();
|
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
|
// truncate time
|
|
|
val = this.clone().startOf('day').valueOf();
|
|
|
|
|
|
if (eras[i].since <= val && val <= eras[i].until) {
|
|
|
return eras[i].abbr;
|
|
|
}
|
|
|
if (eras[i].until <= val && val <= eras[i].since) {
|
|
|
return eras[i].abbr;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
function getEraYear() {
|
|
|
var i,
|
|
|
l,
|
|
|
dir,
|
|
|
val,
|
|
|
eras = this.localeData().eras();
|
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
|
dir = eras[i].since <= eras[i].until ? +1 : -1;
|
|
|
|
|
|
// truncate time
|
|
|
val = this.clone().startOf('day').valueOf();
|
|
|
|
|
|
if (
|
|
|
(eras[i].since <= val && val <= eras[i].until) ||
|
|
|
(eras[i].until <= val && val <= eras[i].since)
|
|
|
) {
|
|
|
return (
|
|
|
(this.year() - hooks(eras[i].since).year()) * dir +
|
|
|
eras[i].offset
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return this.year();
|
|
|
}
|
|
|
|
|
|
function erasNameRegex(isStrict) {
|
|
|
if (!hasOwnProp(this, '_erasNameRegex')) {
|
|
|
computeErasParse.call(this);
|
|
|
}
|
|
|
return isStrict ? this._erasNameRegex : this._erasRegex;
|
|
|
}
|
|
|
|
|
|
function erasAbbrRegex(isStrict) {
|
|
|
if (!hasOwnProp(this, '_erasAbbrRegex')) {
|
|
|
computeErasParse.call(this);
|
|
|
}
|
|
|
return isStrict ? this._erasAbbrRegex : this._erasRegex;
|
|
|
}
|
|
|
|
|
|
function erasNarrowRegex(isStrict) {
|
|
|
if (!hasOwnProp(this, '_erasNarrowRegex')) {
|
|
|
computeErasParse.call(this);
|
|
|
}
|
|
|
return isStrict ? this._erasNarrowRegex : this._erasRegex;
|
|
|
}
|
|
|
|
|
|
function matchEraAbbr(isStrict, locale) {
|
|
|
return locale.erasAbbrRegex(isStrict);
|
|
|
}
|
|
|
|
|
|
function matchEraName(isStrict, locale) {
|
|
|
return locale.erasNameRegex(isStrict);
|
|
|
}
|
|
|
|
|
|
function matchEraNarrow(isStrict, locale) {
|
|
|
return locale.erasNarrowRegex(isStrict);
|
|
|
}
|
|
|
|
|
|
function matchEraYearOrdinal(isStrict, locale) {
|
|
|
return locale._eraYearOrdinalRegex || matchUnsigned;
|
|
|
}
|
|
|
|
|
|
function computeErasParse() {
|
|
|
var abbrPieces = [],
|
|
|
namePieces = [],
|
|
|
narrowPieces = [],
|
|
|
mixedPieces = [],
|
|
|
i,
|
|
|
l,
|
|
|
eras = this.eras();
|
|
|
|
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
|
namePieces.push(regexEscape(eras[i].name));
|
|
|
abbrPieces.push(regexEscape(eras[i].abbr));
|
|
|
narrowPieces.push(regexEscape(eras[i].narrow));
|
|
|
|
|
|
mixedPieces.push(regexEscape(eras[i].name));
|
|
|
mixedPieces.push(regexEscape(eras[i].abbr));
|
|
|
mixedPieces.push(regexEscape(eras[i].narrow));
|
|
|
}
|
|
|
|
|
|
this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
|
|
|
this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');
|
|
|
this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');
|
|
|
this._erasNarrowRegex = new RegExp(
|
|
|
'^(' + narrowPieces.join('|') + ')',
|
|
|
'i'
|
|
|
);
|
|
|
}
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken(0, ['gg', 2], 0, function () {
|
|
|
return this.weekYear() % 100;
|
|
|
});
|
|
|
|
|
|
addFormatToken(0, ['GG', 2], 0, function () {
|
|
|
return this.isoWeekYear() % 100;
|
|
|
});
|
|
|
|
|
|
function addWeekYearFormatToken(token, getter) {
|
|
|
addFormatToken(0, [token, token.length], 0, getter);
|
|
|
}
|
|
|
|
|
|
addWeekYearFormatToken('gggg', 'weekYear');
|
|
|
addWeekYearFormatToken('ggggg', 'weekYear');
|
|
|
addWeekYearFormatToken('GGGG', 'isoWeekYear');
|
|
|
addWeekYearFormatToken('GGGGG', 'isoWeekYear');
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('weekYear', 'gg');
|
|
|
addUnitAlias('isoWeekYear', 'GG');
|
|
|
|
|
|
// PRIORITY
|
|
|
|
|
|
addUnitPriority('weekYear', 1);
|
|
|
addUnitPriority('isoWeekYear', 1);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('G', matchSigned);
|
|
|
addRegexToken('g', matchSigned);
|
|
|
addRegexToken('GG', match1to2, match2);
|
|
|
addRegexToken('gg', match1to2, match2);
|
|
|
addRegexToken('GGGG', match1to4, match4);
|
|
|
addRegexToken('gggg', match1to4, match4);
|
|
|
addRegexToken('GGGGG', match1to6, match6);
|
|
|
addRegexToken('ggggg', match1to6, match6);
|
|
|
|
|
|
addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (
|
|
|
input,
|
|
|
week,
|
|
|
config,
|
|
|
token
|
|
|
) {
|
|
|
week[token.substr(0, 2)] = toInt(input);
|
|
|
});
|
|
|
|
|
|
addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
|
|
|
week[token] = hooks.parseTwoDigitYear(input);
|
|
|
});
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
function getSetWeekYear(input) {
|
|
|
return getSetWeekYearHelper.call(
|
|
|
this,
|
|
|
input,
|
|
|
this.week(),
|
|
|
this.weekday(),
|
|
|
this.localeData()._week.dow,
|
|
|
this.localeData()._week.doy
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function getSetISOWeekYear(input) {
|
|
|
return getSetWeekYearHelper.call(
|
|
|
this,
|
|
|
input,
|
|
|
this.isoWeek(),
|
|
|
this.isoWeekday(),
|
|
|
1,
|
|
|
4
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function getISOWeeksInYear() {
|
|
|
return weeksInYear(this.year(), 1, 4);
|
|
|
}
|
|
|
|
|
|
function getISOWeeksInISOWeekYear() {
|
|
|
return weeksInYear(this.isoWeekYear(), 1, 4);
|
|
|
}
|
|
|
|
|
|
function getWeeksInYear() {
|
|
|
var weekInfo = this.localeData()._week;
|
|
|
return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
|
|
|
}
|
|
|
|
|
|
function getWeeksInWeekYear() {
|
|
|
var weekInfo = this.localeData()._week;
|
|
|
return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
|
|
|
}
|
|
|
|
|
|
function getSetWeekYearHelper(input, week, weekday, dow, doy) {
|
|
|
var weeksTarget;
|
|
|
if (input == null) {
|
|
|
return weekOfYear(this, dow, doy).year;
|
|
|
} else {
|
|
|
weeksTarget = weeksInYear(input, dow, doy);
|
|
|
if (week > weeksTarget) {
|
|
|
week = weeksTarget;
|
|
|
}
|
|
|
return setWeekAll.call(this, input, week, weekday, dow, doy);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function setWeekAll(weekYear, week, weekday, dow, doy) {
|
|
|
var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
|
|
|
date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
|
|
|
|
|
|
this.year(date.getUTCFullYear());
|
|
|
this.month(date.getUTCMonth());
|
|
|
this.date(date.getUTCDate());
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('Q', 0, 'Qo', 'quarter');
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('quarter', 'Q');
|
|
|
|
|
|
// PRIORITY
|
|
|
|
|
|
addUnitPriority('quarter', 7);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('Q', match1);
|
|
|
addParseToken('Q', function (input, array) {
|
|
|
array[MONTH] = (toInt(input) - 1) * 3;
|
|
|
});
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
function getSetQuarter(input) {
|
|
|
return input == null
|
|
|
? Math.ceil((this.month() + 1) / 3)
|
|
|
: this.month((input - 1) * 3 + (this.month() % 3));
|
|
|
}
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('D', ['DD', 2], 'Do', 'date');
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('date', 'D');
|
|
|
|
|
|
// PRIORITY
|
|
|
addUnitPriority('date', 9);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('D', match1to2);
|
|
|
addRegexToken('DD', match1to2, match2);
|
|
|
addRegexToken('Do', function (isStrict, locale) {
|
|
|
// TODO: Remove "ordinalParse" fallback in next major release.
|
|
|
return isStrict
|
|
|
? locale._dayOfMonthOrdinalParse || locale._ordinalParse
|
|
|
: locale._dayOfMonthOrdinalParseLenient;
|
|
|
});
|
|
|
|
|
|
addParseToken(['D', 'DD'], DATE);
|
|
|
addParseToken('Do', function (input, array) {
|
|
|
array[DATE] = toInt(input.match(match1to2)[0]);
|
|
|
});
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
var getSetDayOfMonth = makeGetSet('Date', true);
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('dayOfYear', 'DDD');
|
|
|
|
|
|
// PRIORITY
|
|
|
addUnitPriority('dayOfYear', 4);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('DDD', match1to3);
|
|
|
addRegexToken('DDDD', match3);
|
|
|
addParseToken(['DDD', 'DDDD'], function (input, array, config) {
|
|
|
config._dayOfYear = toInt(input);
|
|
|
});
|
|
|
|
|
|
// HELPERS
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
function getSetDayOfYear(input) {
|
|
|
var dayOfYear =
|
|
|
Math.round(
|
|
|
(this.clone().startOf('day') - this.clone().startOf('year')) / 864e5
|
|
|
) + 1;
|
|
|
return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');
|
|
|
}
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('m', ['mm', 2], 0, 'minute');
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('minute', 'm');
|
|
|
|
|
|
// PRIORITY
|
|
|
|
|
|
addUnitPriority('minute', 14);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('m', match1to2);
|
|
|
addRegexToken('mm', match1to2, match2);
|
|
|
addParseToken(['m', 'mm'], MINUTE);
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
var getSetMinute = makeGetSet('Minutes', false);
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('s', ['ss', 2], 0, 'second');
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('second', 's');
|
|
|
|
|
|
// PRIORITY
|
|
|
|
|
|
addUnitPriority('second', 15);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('s', match1to2);
|
|
|
addRegexToken('ss', match1to2, match2);
|
|
|
addParseToken(['s', 'ss'], SECOND);
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
var getSetSecond = makeGetSet('Seconds', false);
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('S', 0, 0, function () {
|
|
|
return ~~(this.millisecond() / 100);
|
|
|
});
|
|
|
|
|
|
addFormatToken(0, ['SS', 2], 0, function () {
|
|
|
return ~~(this.millisecond() / 10);
|
|
|
});
|
|
|
|
|
|
addFormatToken(0, ['SSS', 3], 0, 'millisecond');
|
|
|
addFormatToken(0, ['SSSS', 4], 0, function () {
|
|
|
return this.millisecond() * 10;
|
|
|
});
|
|
|
addFormatToken(0, ['SSSSS', 5], 0, function () {
|
|
|
return this.millisecond() * 100;
|
|
|
});
|
|
|
addFormatToken(0, ['SSSSSS', 6], 0, function () {
|
|
|
return this.millisecond() * 1000;
|
|
|
});
|
|
|
addFormatToken(0, ['SSSSSSS', 7], 0, function () {
|
|
|
return this.millisecond() * 10000;
|
|
|
});
|
|
|
addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
|
|
|
return this.millisecond() * 100000;
|
|
|
});
|
|
|
addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
|
|
|
return this.millisecond() * 1000000;
|
|
|
});
|
|
|
|
|
|
// ALIASES
|
|
|
|
|
|
addUnitAlias('millisecond', 'ms');
|
|
|
|
|
|
// PRIORITY
|
|
|
|
|
|
addUnitPriority('millisecond', 16);
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('S', match1to3, match1);
|
|
|
addRegexToken('SS', match1to3, match2);
|
|
|
addRegexToken('SSS', match1to3, match3);
|
|
|
|
|
|
var token, getSetMillisecond;
|
|
|
for (token = 'SSSS'; token.length <= 9; token += 'S') {
|
|
|
addRegexToken(token, matchUnsigned);
|
|
|
}
|
|
|
|
|
|
function parseMs(input, array) {
|
|
|
array[MILLISECOND] = toInt(('0.' + input) * 1000);
|
|
|
}
|
|
|
|
|
|
for (token = 'S'; token.length <= 9; token += 'S') {
|
|
|
addParseToken(token, parseMs);
|
|
|
}
|
|
|
|
|
|
getSetMillisecond = makeGetSet('Milliseconds', false);
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('z', 0, 0, 'zoneAbbr');
|
|
|
addFormatToken('zz', 0, 0, 'zoneName');
|
|
|
|
|
|
// MOMENTS
|
|
|
|
|
|
function getZoneAbbr() {
|
|
|
return this._isUTC ? 'UTC' : '';
|
|
|
}
|
|
|
|
|
|
function getZoneName() {
|
|
|
return this._isUTC ? 'Coordinated Universal Time' : '';
|
|
|
}
|
|
|
|
|
|
var proto = Moment.prototype;
|
|
|
|
|
|
proto.add = add;
|
|
|
proto.calendar = calendar$1;
|
|
|
proto.clone = clone;
|
|
|
proto.diff = diff;
|
|
|
proto.endOf = endOf;
|
|
|
proto.format = format;
|
|
|
proto.from = from;
|
|
|
proto.fromNow = fromNow;
|
|
|
proto.to = to;
|
|
|
proto.toNow = toNow;
|
|
|
proto.get = stringGet;
|
|
|
proto.invalidAt = invalidAt;
|
|
|
proto.isAfter = isAfter;
|
|
|
proto.isBefore = isBefore;
|
|
|
proto.isBetween = isBetween;
|
|
|
proto.isSame = isSame;
|
|
|
proto.isSameOrAfter = isSameOrAfter;
|
|
|
proto.isSameOrBefore = isSameOrBefore;
|
|
|
proto.isValid = isValid$2;
|
|
|
proto.lang = lang;
|
|
|
proto.locale = locale;
|
|
|
proto.localeData = localeData;
|
|
|
proto.max = prototypeMax;
|
|
|
proto.min = prototypeMin;
|
|
|
proto.parsingFlags = parsingFlags;
|
|
|
proto.set = stringSet;
|
|
|
proto.startOf = startOf;
|
|
|
proto.subtract = subtract;
|
|
|
proto.toArray = toArray;
|
|
|
proto.toObject = toObject;
|
|
|
proto.toDate = toDate;
|
|
|
proto.toISOString = toISOString;
|
|
|
proto.inspect = inspect;
|
|
|
if (typeof Symbol !== 'undefined' && Symbol.for != null) {
|
|
|
proto[Symbol.for('nodejs.util.inspect.custom')] = function () {
|
|
|
return 'Moment<' + this.format() + '>';
|
|
|
};
|
|
|
}
|
|
|
proto.toJSON = toJSON;
|
|
|
proto.toString = toString;
|
|
|
proto.unix = unix;
|
|
|
proto.valueOf = valueOf;
|
|
|
proto.creationData = creationData;
|
|
|
proto.eraName = getEraName;
|
|
|
proto.eraNarrow = getEraNarrow;
|
|
|
proto.eraAbbr = getEraAbbr;
|
|
|
proto.eraYear = getEraYear;
|
|
|
proto.year = getSetYear;
|
|
|
proto.isLeapYear = getIsLeapYear;
|
|
|
proto.weekYear = getSetWeekYear;
|
|
|
proto.isoWeekYear = getSetISOWeekYear;
|
|
|
proto.quarter = proto.quarters = getSetQuarter;
|
|
|
proto.month = getSetMonth;
|
|
|
proto.daysInMonth = getDaysInMonth;
|
|
|
proto.week = proto.weeks = getSetWeek;
|
|
|
proto.isoWeek = proto.isoWeeks = getSetISOWeek;
|
|
|
proto.weeksInYear = getWeeksInYear;
|
|
|
proto.weeksInWeekYear = getWeeksInWeekYear;
|
|
|
proto.isoWeeksInYear = getISOWeeksInYear;
|
|
|
proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;
|
|
|
proto.date = getSetDayOfMonth;
|
|
|
proto.day = proto.days = getSetDayOfWeek;
|
|
|
proto.weekday = getSetLocaleDayOfWeek;
|
|
|
proto.isoWeekday = getSetISODayOfWeek;
|
|
|
proto.dayOfYear = getSetDayOfYear;
|
|
|
proto.hour = proto.hours = getSetHour;
|
|
|
proto.minute = proto.minutes = getSetMinute;
|
|
|
proto.second = proto.seconds = getSetSecond;
|
|
|
proto.millisecond = proto.milliseconds = getSetMillisecond;
|
|
|
proto.utcOffset = getSetOffset;
|
|
|
proto.utc = setOffsetToUTC;
|
|
|
proto.local = setOffsetToLocal;
|
|
|
proto.parseZone = setOffsetToParsedOffset;
|
|
|
proto.hasAlignedHourOffset = hasAlignedHourOffset;
|
|
|
proto.isDST = isDaylightSavingTime;
|
|
|
proto.isLocal = isLocal;
|
|
|
proto.isUtcOffset = isUtcOffset;
|
|
|
proto.isUtc = isUtc;
|
|
|
proto.isUTC = isUtc;
|
|
|
proto.zoneAbbr = getZoneAbbr;
|
|
|
proto.zoneName = getZoneName;
|
|
|
proto.dates = deprecate(
|
|
|
'dates accessor is deprecated. Use date instead.',
|
|
|
getSetDayOfMonth
|
|
|
);
|
|
|
proto.months = deprecate(
|
|
|
'months accessor is deprecated. Use month instead',
|
|
|
getSetMonth
|
|
|
);
|
|
|
proto.years = deprecate(
|
|
|
'years accessor is deprecated. Use year instead',
|
|
|
getSetYear
|
|
|
);
|
|
|
proto.zone = deprecate(
|
|
|
'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',
|
|
|
getSetZone
|
|
|
);
|
|
|
proto.isDSTShifted = deprecate(
|
|
|
'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',
|
|
|
isDaylightSavingTimeShifted
|
|
|
);
|
|
|
|
|
|
function createUnix(input) {
|
|
|
return createLocal(input * 1000);
|
|
|
}
|
|
|
|
|
|
function createInZone() {
|
|
|
return createLocal.apply(null, arguments).parseZone();
|
|
|
}
|
|
|
|
|
|
function preParsePostFormat(string) {
|
|
|
return string;
|
|
|
}
|
|
|
|
|
|
var proto$1 = Locale.prototype;
|
|
|
|
|
|
proto$1.calendar = calendar;
|
|
|
proto$1.longDateFormat = longDateFormat;
|
|
|
proto$1.invalidDate = invalidDate;
|
|
|
proto$1.ordinal = ordinal;
|
|
|
proto$1.preparse = preParsePostFormat;
|
|
|
proto$1.postformat = preParsePostFormat;
|
|
|
proto$1.relativeTime = relativeTime;
|
|
|
proto$1.pastFuture = pastFuture;
|
|
|
proto$1.set = set;
|
|
|
proto$1.eras = localeEras;
|
|
|
proto$1.erasParse = localeErasParse;
|
|
|
proto$1.erasConvertYear = localeErasConvertYear;
|
|
|
proto$1.erasAbbrRegex = erasAbbrRegex;
|
|
|
proto$1.erasNameRegex = erasNameRegex;
|
|
|
proto$1.erasNarrowRegex = erasNarrowRegex;
|
|
|
|
|
|
proto$1.months = localeMonths;
|
|
|
proto$1.monthsShort = localeMonthsShort;
|
|
|
proto$1.monthsParse = localeMonthsParse;
|
|
|
proto$1.monthsRegex = monthsRegex;
|
|
|
proto$1.monthsShortRegex = monthsShortRegex;
|
|
|
proto$1.week = localeWeek;
|
|
|
proto$1.firstDayOfYear = localeFirstDayOfYear;
|
|
|
proto$1.firstDayOfWeek = localeFirstDayOfWeek;
|
|
|
|
|
|
proto$1.weekdays = localeWeekdays;
|
|
|
proto$1.weekdaysMin = localeWeekdaysMin;
|
|
|
proto$1.weekdaysShort = localeWeekdaysShort;
|
|
|
proto$1.weekdaysParse = localeWeekdaysParse;
|
|
|
|
|
|
proto$1.weekdaysRegex = weekdaysRegex;
|
|
|
proto$1.weekdaysShortRegex = weekdaysShortRegex;
|
|
|
proto$1.weekdaysMinRegex = weekdaysMinRegex;
|
|
|
|
|
|
proto$1.isPM = localeIsPM;
|
|
|
proto$1.meridiem = localeMeridiem;
|
|
|
|
|
|
function get$1(format, index, field, setter) {
|
|
|
var locale = getLocale(),
|
|
|
utc = createUTC().set(setter, index);
|
|
|
return locale[field](utc, format);
|
|
|
}
|
|
|
|
|
|
function listMonthsImpl(format, index, field) {
|
|
|
if (isNumber(format)) {
|
|
|
index = format;
|
|
|
format = undefined;
|
|
|
}
|
|
|
|
|
|
format = format || '';
|
|
|
|
|
|
if (index != null) {
|
|
|
return get$1(format, index, field, 'month');
|
|
|
}
|
|
|
|
|
|
var i,
|
|
|
out = [];
|
|
|
for (i = 0; i < 12; i++) {
|
|
|
out[i] = get$1(format, i, field, 'month');
|
|
|
}
|
|
|
return out;
|
|
|
}
|
|
|
|
|
|
// ()
|
|
|
// (5)
|
|
|
// (fmt, 5)
|
|
|
// (fmt)
|
|
|
// (true)
|
|
|
// (true, 5)
|
|
|
// (true, fmt, 5)
|
|
|
// (true, fmt)
|
|
|
function listWeekdaysImpl(localeSorted, format, index, field) {
|
|
|
if (typeof localeSorted === 'boolean') {
|
|
|
if (isNumber(format)) {
|
|
|
index = format;
|
|
|
format = undefined;
|
|
|
}
|
|
|
|
|
|
format = format || '';
|
|
|
} else {
|
|
|
format = localeSorted;
|
|
|
index = format;
|
|
|
localeSorted = false;
|
|
|
|
|
|
if (isNumber(format)) {
|
|
|
index = format;
|
|
|
format = undefined;
|
|
|
}
|
|
|
|
|
|
format = format || '';
|
|
|
}
|
|
|
|
|
|
var locale = getLocale(),
|
|
|
shift = localeSorted ? locale._week.dow : 0,
|
|
|
i,
|
|
|
out = [];
|
|
|
|
|
|
if (index != null) {
|
|
|
return get$1(format, (index + shift) % 7, field, 'day');
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < 7; i++) {
|
|
|
out[i] = get$1(format, (i + shift) % 7, field, 'day');
|
|
|
}
|
|
|
return out;
|
|
|
}
|
|
|
|
|
|
function listMonths(format, index) {
|
|
|
return listMonthsImpl(format, index, 'months');
|
|
|
}
|
|
|
|
|
|
function listMonthsShort(format, index) {
|
|
|
return listMonthsImpl(format, index, 'monthsShort');
|
|
|
}
|
|
|
|
|
|
function listWeekdays(localeSorted, format, index) {
|
|
|
return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
|
|
|
}
|
|
|
|
|
|
function listWeekdaysShort(localeSorted, format, index) {
|
|
|
return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
|
|
|
}
|
|
|
|
|
|
function listWeekdaysMin(localeSorted, format, index) {
|
|
|
return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
|
|
|
}
|
|
|
|
|
|
getSetGlobalLocale('en', {
|
|
|
eras: [
|
|
|
{
|
|
|
since: '0001-01-01',
|
|
|
until: +Infinity,
|
|
|
offset: 1,
|
|
|
name: 'Anno Domini',
|
|
|
narrow: 'AD',
|
|
|
abbr: 'AD',
|
|
|
},
|
|
|
{
|
|
|
since: '0000-12-31',
|
|
|
until: -Infinity,
|
|
|
offset: 1,
|
|
|
name: 'Before Christ',
|
|
|
narrow: 'BC',
|
|
|
abbr: 'BC',
|
|
|
},
|
|
|
],
|
|
|
dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
|
|
|
ordinal: function (number) {
|
|
|
var b = number % 10,
|
|
|
output =
|
|
|
toInt((number % 100) / 10) === 1
|
|
|
? 'th'
|
|
|
: b === 1
|
|
|
? 'st'
|
|
|
: b === 2
|
|
|
? 'nd'
|
|
|
: b === 3
|
|
|
? 'rd'
|
|
|
: 'th';
|
|
|
return number + output;
|
|
|
},
|
|
|
});
|
|
|
|
|
|
// Side effect imports
|
|
|
|
|
|
hooks.lang = deprecate(
|
|
|
'moment.lang is deprecated. Use moment.locale instead.',
|
|
|
getSetGlobalLocale
|
|
|
);
|
|
|
hooks.langData = deprecate(
|
|
|
'moment.langData is deprecated. Use moment.localeData instead.',
|
|
|
getLocale
|
|
|
);
|
|
|
|
|
|
var mathAbs = Math.abs;
|
|
|
|
|
|
function abs() {
|
|
|
var data = this._data;
|
|
|
|
|
|
this._milliseconds = mathAbs(this._milliseconds);
|
|
|
this._days = mathAbs(this._days);
|
|
|
this._months = mathAbs(this._months);
|
|
|
|
|
|
data.milliseconds = mathAbs(data.milliseconds);
|
|
|
data.seconds = mathAbs(data.seconds);
|
|
|
data.minutes = mathAbs(data.minutes);
|
|
|
data.hours = mathAbs(data.hours);
|
|
|
data.months = mathAbs(data.months);
|
|
|
data.years = mathAbs(data.years);
|
|
|
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
function addSubtract$1(duration, input, value, direction) {
|
|
|
var other = createDuration(input, value);
|
|
|
|
|
|
duration._milliseconds += direction * other._milliseconds;
|
|
|
duration._days += direction * other._days;
|
|
|
duration._months += direction * other._months;
|
|
|
|
|
|
return duration._bubble();
|
|
|
}
|
|
|
|
|
|
// supports only 2.0-style add(1, 's') or add(duration)
|
|
|
function add$1(input, value) {
|
|
|
return addSubtract$1(this, input, value, 1);
|
|
|
}
|
|
|
|
|
|
// supports only 2.0-style subtract(1, 's') or subtract(duration)
|
|
|
function subtract$1(input, value) {
|
|
|
return addSubtract$1(this, input, value, -1);
|
|
|
}
|
|
|
|
|
|
function absCeil(number) {
|
|
|
if (number < 0) {
|
|
|
return Math.floor(number);
|
|
|
} else {
|
|
|
return Math.ceil(number);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function bubble() {
|
|
|
var milliseconds = this._milliseconds,
|
|
|
days = this._days,
|
|
|
months = this._months,
|
|
|
data = this._data,
|
|
|
seconds,
|
|
|
minutes,
|
|
|
hours,
|
|
|
years,
|
|
|
monthsFromDays;
|
|
|
|
|
|
// if we have a mix of positive and negative values, bubble down first
|
|
|
// check: https://github.com/moment/moment/issues/2166
|
|
|
if (
|
|
|
!(
|
|
|
(milliseconds >= 0 && days >= 0 && months >= 0) ||
|
|
|
(milliseconds <= 0 && days <= 0 && months <= 0)
|
|
|
)
|
|
|
) {
|
|
|
milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
|
|
|
days = 0;
|
|
|
months = 0;
|
|
|
}
|
|
|
|
|
|
// The following code bubbles up values, see the tests for
|
|
|
// examples of what that means.
|
|
|
data.milliseconds = milliseconds % 1000;
|
|
|
|
|
|
seconds = absFloor(milliseconds / 1000);
|
|
|
data.seconds = seconds % 60;
|
|
|
|
|
|
minutes = absFloor(seconds / 60);
|
|
|
data.minutes = minutes % 60;
|
|
|
|
|
|
hours = absFloor(minutes / 60);
|
|
|
data.hours = hours % 24;
|
|
|
|
|
|
days += absFloor(hours / 24);
|
|
|
|
|
|
// convert days to months
|
|
|
monthsFromDays = absFloor(daysToMonths(days));
|
|
|
months += monthsFromDays;
|
|
|
days -= absCeil(monthsToDays(monthsFromDays));
|
|
|
|
|
|
// 12 months -> 1 year
|
|
|
years = absFloor(months / 12);
|
|
|
months %= 12;
|
|
|
|
|
|
data.days = days;
|
|
|
data.months = months;
|
|
|
data.years = years;
|
|
|
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
function daysToMonths(days) {
|
|
|
// 400 years have 146097 days (taking into account leap year rules)
|
|
|
// 400 years have 12 months === 4800
|
|
|
return (days * 4800) / 146097;
|
|
|
}
|
|
|
|
|
|
function monthsToDays(months) {
|
|
|
// the reverse of daysToMonths
|
|
|
return (months * 146097) / 4800;
|
|
|
}
|
|
|
|
|
|
function as(units) {
|
|
|
if (!this.isValid()) {
|
|
|
return NaN;
|
|
|
}
|
|
|
var days,
|
|
|
months,
|
|
|
milliseconds = this._milliseconds;
|
|
|
|
|
|
units = normalizeUnits(units);
|
|
|
|
|
|
if (units === 'month' || units === 'quarter' || units === 'year') {
|
|
|
days = this._days + milliseconds / 864e5;
|
|
|
months = this._months + daysToMonths(days);
|
|
|
switch (units) {
|
|
|
case 'month':
|
|
|
return months;
|
|
|
case 'quarter':
|
|
|
return months / 3;
|
|
|
case 'year':
|
|
|
return months / 12;
|
|
|
}
|
|
|
} else {
|
|
|
// handle milliseconds separately because of floating point math errors (issue #1867)
|
|
|
days = this._days + Math.round(monthsToDays(this._months));
|
|
|
switch (units) {
|
|
|
case 'week':
|
|
|
return days / 7 + milliseconds / 6048e5;
|
|
|
case 'day':
|
|
|
return days + milliseconds / 864e5;
|
|
|
case 'hour':
|
|
|
return days * 24 + milliseconds / 36e5;
|
|
|
case 'minute':
|
|
|
return days * 1440 + milliseconds / 6e4;
|
|
|
case 'second':
|
|
|
return days * 86400 + milliseconds / 1000;
|
|
|
// Math.floor prevents floating point math errors here
|
|
|
case 'millisecond':
|
|
|
return Math.floor(days * 864e5) + milliseconds;
|
|
|
default:
|
|
|
throw new Error('Unknown unit ' + units);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// TODO: Use this.as('ms')?
|
|
|
function valueOf$1() {
|
|
|
if (!this.isValid()) {
|
|
|
return NaN;
|
|
|
}
|
|
|
return (
|
|
|
this._milliseconds +
|
|
|
this._days * 864e5 +
|
|
|
(this._months % 12) * 2592e6 +
|
|
|
toInt(this._months / 12) * 31536e6
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function makeAs(alias) {
|
|
|
return function () {
|
|
|
return this.as(alias);
|
|
|
};
|
|
|
}
|
|
|
|
|
|
var asMilliseconds = makeAs('ms'),
|
|
|
asSeconds = makeAs('s'),
|
|
|
asMinutes = makeAs('m'),
|
|
|
asHours = makeAs('h'),
|
|
|
asDays = makeAs('d'),
|
|
|
asWeeks = makeAs('w'),
|
|
|
asMonths = makeAs('M'),
|
|
|
asQuarters = makeAs('Q'),
|
|
|
asYears = makeAs('y');
|
|
|
|
|
|
function clone$1() {
|
|
|
return createDuration(this);
|
|
|
}
|
|
|
|
|
|
function get$2(units) {
|
|
|
units = normalizeUnits(units);
|
|
|
return this.isValid() ? this[units + 's']() : NaN;
|
|
|
}
|
|
|
|
|
|
function makeGetter(name) {
|
|
|
return function () {
|
|
|
return this.isValid() ? this._data[name] : NaN;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
var milliseconds = makeGetter('milliseconds'),
|
|
|
seconds = makeGetter('seconds'),
|
|
|
minutes = makeGetter('minutes'),
|
|
|
hours = makeGetter('hours'),
|
|
|
days = makeGetter('days'),
|
|
|
months = makeGetter('months'),
|
|
|
years = makeGetter('years');
|
|
|
|
|
|
function weeks() {
|
|
|
return absFloor(this.days() / 7);
|
|
|
}
|
|
|
|
|
|
var round = Math.round,
|
|
|
thresholds = {
|
|
|
ss: 44, // a few seconds to seconds
|
|
|
s: 45, // seconds to minute
|
|
|
m: 45, // minutes to hour
|
|
|
h: 22, // hours to day
|
|
|
d: 26, // days to month/week
|
|
|
w: null, // weeks to month
|
|
|
M: 11, // months to year
|
|
|
};
|
|
|
|
|
|
// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
|
|
|
function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
|
|
|
return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
|
|
|
}
|
|
|
|
|
|
function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {
|
|
|
var duration = createDuration(posNegDuration).abs(),
|
|
|
seconds = round(duration.as('s')),
|
|
|
minutes = round(duration.as('m')),
|
|
|
hours = round(duration.as('h')),
|
|
|
days = round(duration.as('d')),
|
|
|
months = round(duration.as('M')),
|
|
|
weeks = round(duration.as('w')),
|
|
|
years = round(duration.as('y')),
|
|
|
a =
|
|
|
(seconds <= thresholds.ss && ['s', seconds]) ||
|
|
|
(seconds < thresholds.s && ['ss', seconds]) ||
|
|
|
(minutes <= 1 && ['m']) ||
|
|
|
(minutes < thresholds.m && ['mm', minutes]) ||
|
|
|
(hours <= 1 && ['h']) ||
|
|
|
(hours < thresholds.h && ['hh', hours]) ||
|
|
|
(days <= 1 && ['d']) ||
|
|
|
(days < thresholds.d && ['dd', days]);
|
|
|
|
|
|
if (thresholds.w != null) {
|
|
|
a =
|
|
|
a ||
|
|
|
(weeks <= 1 && ['w']) ||
|
|
|
(weeks < thresholds.w && ['ww', weeks]);
|
|
|
}
|
|
|
a = a ||
|
|
|
(months <= 1 && ['M']) ||
|
|
|
(months < thresholds.M && ['MM', months]) ||
|
|
|
(years <= 1 && ['y']) || ['yy', years];
|
|
|
|
|
|
a[2] = withoutSuffix;
|
|
|
a[3] = +posNegDuration > 0;
|
|
|
a[4] = locale;
|
|
|
return substituteTimeAgo.apply(null, a);
|
|
|
}
|
|
|
|
|
|
// This function allows you to set the rounding function for relative time strings
|
|
|
function getSetRelativeTimeRounding(roundingFunction) {
|
|
|
if (roundingFunction === undefined) {
|
|
|
return round;
|
|
|
}
|
|
|
if (typeof roundingFunction === 'function') {
|
|
|
round = roundingFunction;
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// This function allows you to set a threshold for relative time strings
|
|
|
function getSetRelativeTimeThreshold(threshold, limit) {
|
|
|
if (thresholds[threshold] === undefined) {
|
|
|
return false;
|
|
|
}
|
|
|
if (limit === undefined) {
|
|
|
return thresholds[threshold];
|
|
|
}
|
|
|
thresholds[threshold] = limit;
|
|
|
if (threshold === 's') {
|
|
|
thresholds.ss = limit - 1;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
function humanize(argWithSuffix, argThresholds) {
|
|
|
if (!this.isValid()) {
|
|
|
return this.localeData().invalidDate();
|
|
|
}
|
|
|
|
|
|
var withSuffix = false,
|
|
|
th = thresholds,
|
|
|
locale,
|
|
|
output;
|
|
|
|
|
|
if (typeof argWithSuffix === 'object') {
|
|
|
argThresholds = argWithSuffix;
|
|
|
argWithSuffix = false;
|
|
|
}
|
|
|
if (typeof argWithSuffix === 'boolean') {
|
|
|
withSuffix = argWithSuffix;
|
|
|
}
|
|
|
if (typeof argThresholds === 'object') {
|
|
|
th = Object.assign({}, thresholds, argThresholds);
|
|
|
if (argThresholds.s != null && argThresholds.ss == null) {
|
|
|
th.ss = argThresholds.s - 1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
locale = this.localeData();
|
|
|
output = relativeTime$1(this, !withSuffix, th, locale);
|
|
|
|
|
|
if (withSuffix) {
|
|
|
output = locale.pastFuture(+this, output);
|
|
|
}
|
|
|
|
|
|
return locale.postformat(output);
|
|
|
}
|
|
|
|
|
|
var abs$1 = Math.abs;
|
|
|
|
|
|
function sign(x) {
|
|
|
return (x > 0) - (x < 0) || +x;
|
|
|
}
|
|
|
|
|
|
function toISOString$1() {
|
|
|
// for ISO strings we do not use the normal bubbling rules:
|
|
|
// * milliseconds bubble up until they become hours
|
|
|
// * days do not bubble at all
|
|
|
// * months bubble up until they become years
|
|
|
// This is because there is no context-free conversion between hours and days
|
|
|
// (think of clock changes)
|
|
|
// and also not between days and months (28-31 days per month)
|
|
|
if (!this.isValid()) {
|
|
|
return this.localeData().invalidDate();
|
|
|
}
|
|
|
|
|
|
var seconds = abs$1(this._milliseconds) / 1000,
|
|
|
days = abs$1(this._days),
|
|
|
months = abs$1(this._months),
|
|
|
minutes,
|
|
|
hours,
|
|
|
years,
|
|
|
s,
|
|
|
total = this.asSeconds(),
|
|
|
totalSign,
|
|
|
ymSign,
|
|
|
daysSign,
|
|
|
hmsSign;
|
|
|
|
|
|
if (!total) {
|
|
|
// this is the same as C#'s (Noda) and python (isodate)...
|
|
|
// but not other JS (goog.date)
|
|
|
return 'P0D';
|
|
|
}
|
|
|
|
|
|
// 3600 seconds -> 60 minutes -> 1 hour
|
|
|
minutes = absFloor(seconds / 60);
|
|
|
hours = absFloor(minutes / 60);
|
|
|
seconds %= 60;
|
|
|
minutes %= 60;
|
|
|
|
|
|
// 12 months -> 1 year
|
|
|
years = absFloor(months / 12);
|
|
|
months %= 12;
|
|
|
|
|
|
// inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
|
|
|
s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
|
|
|
|
|
|
totalSign = total < 0 ? '-' : '';
|
|
|
ymSign = sign(this._months) !== sign(total) ? '-' : '';
|
|
|
daysSign = sign(this._days) !== sign(total) ? '-' : '';
|
|
|
hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';
|
|
|
|
|
|
return (
|
|
|
totalSign +
|
|
|
'P' +
|
|
|
(years ? ymSign + years + 'Y' : '') +
|
|
|
(months ? ymSign + months + 'M' : '') +
|
|
|
(days ? daysSign + days + 'D' : '') +
|
|
|
(hours || minutes || seconds ? 'T' : '') +
|
|
|
(hours ? hmsSign + hours + 'H' : '') +
|
|
|
(minutes ? hmsSign + minutes + 'M' : '') +
|
|
|
(seconds ? hmsSign + s + 'S' : '')
|
|
|
);
|
|
|
}
|
|
|
|
|
|
var proto$2 = Duration.prototype;
|
|
|
|
|
|
proto$2.isValid = isValid$1;
|
|
|
proto$2.abs = abs;
|
|
|
proto$2.add = add$1;
|
|
|
proto$2.subtract = subtract$1;
|
|
|
proto$2.as = as;
|
|
|
proto$2.asMilliseconds = asMilliseconds;
|
|
|
proto$2.asSeconds = asSeconds;
|
|
|
proto$2.asMinutes = asMinutes;
|
|
|
proto$2.asHours = asHours;
|
|
|
proto$2.asDays = asDays;
|
|
|
proto$2.asWeeks = asWeeks;
|
|
|
proto$2.asMonths = asMonths;
|
|
|
proto$2.asQuarters = asQuarters;
|
|
|
proto$2.asYears = asYears;
|
|
|
proto$2.valueOf = valueOf$1;
|
|
|
proto$2._bubble = bubble;
|
|
|
proto$2.clone = clone$1;
|
|
|
proto$2.get = get$2;
|
|
|
proto$2.milliseconds = milliseconds;
|
|
|
proto$2.seconds = seconds;
|
|
|
proto$2.minutes = minutes;
|
|
|
proto$2.hours = hours;
|
|
|
proto$2.days = days;
|
|
|
proto$2.weeks = weeks;
|
|
|
proto$2.months = months;
|
|
|
proto$2.years = years;
|
|
|
proto$2.humanize = humanize;
|
|
|
proto$2.toISOString = toISOString$1;
|
|
|
proto$2.toString = toISOString$1;
|
|
|
proto$2.toJSON = toISOString$1;
|
|
|
proto$2.locale = locale;
|
|
|
proto$2.localeData = localeData;
|
|
|
|
|
|
proto$2.toIsoString = deprecate(
|
|
|
'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',
|
|
|
toISOString$1
|
|
|
);
|
|
|
proto$2.lang = lang;
|
|
|
|
|
|
// FORMATTING
|
|
|
|
|
|
addFormatToken('X', 0, 0, 'unix');
|
|
|
addFormatToken('x', 0, 0, 'valueOf');
|
|
|
|
|
|
// PARSING
|
|
|
|
|
|
addRegexToken('x', matchSigned);
|
|
|
addRegexToken('X', matchTimestamp);
|
|
|
addParseToken('X', function (input, array, config) {
|
|
|
config._d = new Date(parseFloat(input) * 1000);
|
|
|
});
|
|
|
addParseToken('x', function (input, array, config) {
|
|
|
config._d = new Date(toInt(input));
|
|
|
});
|
|
|
|
|
|
//! moment.js
|
|
|
|
|
|
hooks.version = '2.29.1';
|
|
|
|
|
|
setHookCallback(createLocal);
|
|
|
|
|
|
hooks.fn = proto;
|
|
|
hooks.min = min;
|
|
|
hooks.max = max;
|
|
|
hooks.now = now;
|
|
|
hooks.utc = createUTC;
|
|
|
hooks.unix = createUnix;
|
|
|
hooks.months = listMonths;
|
|
|
hooks.isDate = isDate;
|
|
|
hooks.locale = getSetGlobalLocale;
|
|
|
hooks.invalid = createInvalid;
|
|
|
hooks.duration = createDuration;
|
|
|
hooks.isMoment = isMoment;
|
|
|
hooks.weekdays = listWeekdays;
|
|
|
hooks.parseZone = createInZone;
|
|
|
hooks.localeData = getLocale;
|
|
|
hooks.isDuration = isDuration;
|
|
|
hooks.monthsShort = listMonthsShort;
|
|
|
hooks.weekdaysMin = listWeekdaysMin;
|
|
|
hooks.defineLocale = defineLocale;
|
|
|
hooks.updateLocale = updateLocale;
|
|
|
hooks.locales = listLocales;
|
|
|
hooks.weekdaysShort = listWeekdaysShort;
|
|
|
hooks.normalizeUnits = normalizeUnits;
|
|
|
hooks.relativeTimeRounding = getSetRelativeTimeRounding;
|
|
|
hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
|
|
|
hooks.calendarFormat = getCalendarFormat;
|
|
|
hooks.prototype = proto;
|
|
|
|
|
|
// currently HTML5 input type only supports 24-hour formats
|
|
|
hooks.HTML5_FMT = {
|
|
|
DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
|
|
|
DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
|
|
|
DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
|
|
|
DATE: 'YYYY-MM-DD', // <input type="date" />
|
|
|
TIME: 'HH:mm', // <input type="time" />
|
|
|
TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
|
|
|
TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
|
|
|
WEEK: 'GGGG-[W]WW', // <input type="week" />
|
|
|
MONTH: 'YYYY-MM', // <input type="month" />
|
|
|
};
|
|
|
|
|
|
return hooks;
|
|
|
|
|
|
})));
|
|
|
});
|
|
|
|
|
|
class DateTime$2 {
|
|
|
constructor(time, _hasTimePart) {
|
|
|
this.time = time;
|
|
|
this._hasTimePart = _hasTimePart;
|
|
|
}
|
|
|
static now() {
|
|
|
return new DateTime$2(moment(), true);
|
|
|
}
|
|
|
static parse(time) {
|
|
|
if (time.length > 10) {
|
|
|
return new DateTime$2(moment(time, "YYYY-MM-DD HH:mm"), true);
|
|
|
}
|
|
|
else {
|
|
|
return new DateTime$2(moment(time, "YYYY-MM-DD"), false);
|
|
|
}
|
|
|
}
|
|
|
static duration(from, to, unit, defaultTime) {
|
|
|
return to.fixedTime(defaultTime).diff(from.fixedTime(defaultTime), unit);
|
|
|
}
|
|
|
getTimeInMillis(defaultTime) {
|
|
|
return this.fixedTime(defaultTime).valueOf();
|
|
|
}
|
|
|
format(format, defaultTime) {
|
|
|
return this.fixedTime(defaultTime).format(format);
|
|
|
}
|
|
|
toYYYYMMMM(defaultTime) {
|
|
|
return this.fixedTime(defaultTime).format("YYYY, MMMM");
|
|
|
}
|
|
|
toYYYYMMDD(defaultTime) {
|
|
|
return this.fixedTime(defaultTime).format("YYYY-MM-DD");
|
|
|
}
|
|
|
add(amount, unit, defaultTime) {
|
|
|
return new DateTime$2(this.fixedTime(defaultTime).clone().add(amount, unit), this._hasTimePart);
|
|
|
}
|
|
|
fixedTime(defaultTime) {
|
|
|
if (this._hasTimePart) {
|
|
|
return this.time;
|
|
|
}
|
|
|
if (defaultTime === undefined) {
|
|
|
return this.time;
|
|
|
}
|
|
|
return this.time.clone().add(defaultTime.minutes, "minutes");
|
|
|
}
|
|
|
get hasTimePart() {
|
|
|
return this._hasTimePart;
|
|
|
}
|
|
|
moment() {
|
|
|
return this.time;
|
|
|
}
|
|
|
isValid() {
|
|
|
return this.time.isValid();
|
|
|
}
|
|
|
clone(hasTimePart) {
|
|
|
const withTimePart = hasTimePart == null ? this._hasTimePart : hasTimePart;
|
|
|
const clone = this.time.clone();
|
|
|
return new DateTime$2(clone, withTimePart);
|
|
|
}
|
|
|
toString() {
|
|
|
if (this._hasTimePart) {
|
|
|
return this.format("YYYY-MM-DD HH:mm");
|
|
|
}
|
|
|
else {
|
|
|
return this.format("YYYY-MM-DD");
|
|
|
}
|
|
|
}
|
|
|
equals(time) {
|
|
|
return this._hasTimePart === time._hasTimePart
|
|
|
&& this.time.isSame(time.time);
|
|
|
}
|
|
|
}
|
|
|
class Time$1 {
|
|
|
constructor(hour, minute) {
|
|
|
this.hour = hour;
|
|
|
this.minute = minute;
|
|
|
}
|
|
|
static parse(text) {
|
|
|
if (!text.match(/^\d{1,2}:\d{1,2}$/)) {
|
|
|
throw `Unexpected format time(${text}). Time must be HH:mm.`;
|
|
|
}
|
|
|
const s = text.split(":");
|
|
|
if (s.length !== 2) {
|
|
|
throw `Unexpected format time(${text}). time must be HH:mm.`;
|
|
|
}
|
|
|
const hour = parseInt(s[0]);
|
|
|
const minute = parseInt(s[1]);
|
|
|
if (hour > 23 || hour < 0) {
|
|
|
throw `hour must be 0~23`;
|
|
|
}
|
|
|
if (minute > 59 || minute < 0) {
|
|
|
throw `minute must be 0~59`;
|
|
|
}
|
|
|
return new Time$1(hour, minute);
|
|
|
}
|
|
|
get minutes() {
|
|
|
return this.hour * 60 + this.minute;
|
|
|
}
|
|
|
toString() {
|
|
|
const pad = (n) => {
|
|
|
if (n < 10) {
|
|
|
return "0" + n;
|
|
|
}
|
|
|
return "" + n;
|
|
|
};
|
|
|
return `${pad(this.hour)}:${pad(this.minute)}`;
|
|
|
}
|
|
|
}
|
|
|
function add(amount, unit) {
|
|
|
return () => {
|
|
|
return new DateTime$2(moment(), true).add(amount, unit);
|
|
|
};
|
|
|
}
|
|
|
function inMinutes(minutes) {
|
|
|
return add(minutes, "minutes");
|
|
|
}
|
|
|
function inHours(hours) {
|
|
|
return add(hours, "hours");
|
|
|
}
|
|
|
function inDays(days) {
|
|
|
return add(days, "days");
|
|
|
}
|
|
|
function inWeeks(weeks) {
|
|
|
return add(weeks, "weeks");
|
|
|
}
|
|
|
function inMonths(months) {
|
|
|
return add(months, "months");
|
|
|
}
|
|
|
function inYears(years) {
|
|
|
return add(years, "years");
|
|
|
}
|
|
|
function nextWeekday(weekday) {
|
|
|
return () => {
|
|
|
const today = moment();
|
|
|
if (today.isoWeekday() <= weekday) {
|
|
|
return new DateTime$2(today.isoWeekday(weekday), false);
|
|
|
}
|
|
|
else {
|
|
|
return new DateTime$2(today.add(1, "weeks").isoWeekday(weekday), false);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
function tomorrow() {
|
|
|
return () => {
|
|
|
return new DateTime$2(moment().add(1, "days"), false);
|
|
|
};
|
|
|
}
|
|
|
function nextWeek() {
|
|
|
return () => {
|
|
|
return new DateTime$2(moment().add(1, "weeks"), false);
|
|
|
};
|
|
|
}
|
|
|
function nextMonth() {
|
|
|
return () => {
|
|
|
return new DateTime$2(moment().add(1, "months"), false);
|
|
|
};
|
|
|
}
|
|
|
function nextYear() {
|
|
|
return () => {
|
|
|
return new DateTime$2(moment().add(1, "years"), false);
|
|
|
};
|
|
|
}
|
|
|
class Later {
|
|
|
constructor(label, later) {
|
|
|
this.label = label;
|
|
|
this.later = later;
|
|
|
}
|
|
|
}
|
|
|
function parseLaters(laters) {
|
|
|
return laters.split("\n").map(l => parseLater(l.trim()));
|
|
|
}
|
|
|
function parseLater(later) {
|
|
|
later = later.toLowerCase();
|
|
|
if (later.startsWith("in")) {
|
|
|
const tokens = later.split(" ");
|
|
|
if (tokens.length !== 3) {
|
|
|
throw `Unsupported format. Should be 'In N (minutes|hours)'`;
|
|
|
}
|
|
|
const n = tokens[1] === "a" || tokens[1] === "an" ? 1 : parseInt(tokens[1]);
|
|
|
switch (tokens[2]) {
|
|
|
case "minute":
|
|
|
case "minutes":
|
|
|
{
|
|
|
const unit = n == 1 ? "minute" : "minutes";
|
|
|
return new Later(`In ${n} ${unit}`, inMinutes(n));
|
|
|
}
|
|
|
case "hour":
|
|
|
case "hours":
|
|
|
{
|
|
|
const unit = n == 1 ? "hour" : "hours";
|
|
|
return new Later(`In ${n} ${unit}`, inHours(n));
|
|
|
}
|
|
|
case "day":
|
|
|
case "days":
|
|
|
{
|
|
|
const unit = n == 1 ? "day" : "days";
|
|
|
return new Later(`In ${n} ${unit}`, inDays(n));
|
|
|
}
|
|
|
case "week":
|
|
|
case "weeks":
|
|
|
{
|
|
|
const unit = n == 1 ? "week" : "weeks";
|
|
|
return new Later(`In ${n} ${unit}`, inWeeks(n));
|
|
|
}
|
|
|
case "month":
|
|
|
case "months":
|
|
|
{
|
|
|
const unit = n == 1 ? "month" : "months";
|
|
|
return new Later(`In ${n} ${unit}`, inMonths(n));
|
|
|
}
|
|
|
case "year":
|
|
|
case "years":
|
|
|
{
|
|
|
const unit = n == 1 ? "year" : "years";
|
|
|
return new Later(`In ${n} ${unit}`, inYears(n));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else if (later.startsWith("next")) {
|
|
|
const weekday = later.substring(5);
|
|
|
switch (weekday) {
|
|
|
case "sunday":
|
|
|
return new Later("Next Sunday", nextWeekday(0));
|
|
|
case "monday":
|
|
|
return new Later("Next Monday", nextWeekday(1));
|
|
|
case "tuesday":
|
|
|
return new Later("Next Tuesday", nextWeekday(2));
|
|
|
case "wednesday":
|
|
|
return new Later("Next Wednesday", nextWeekday(3));
|
|
|
case "thursday":
|
|
|
return new Later("Next Thursday", nextWeekday(4));
|
|
|
case "friday":
|
|
|
return new Later("Next Friday", nextWeekday(5));
|
|
|
case "saturday":
|
|
|
return new Later("Next Saturday", nextWeekday(6));
|
|
|
case "day":
|
|
|
return new Later("Tomorrow", tomorrow());
|
|
|
case "week":
|
|
|
return new Later("Next week", nextWeek());
|
|
|
case "month":
|
|
|
return new Later("Next month", nextMonth());
|
|
|
case "year":
|
|
|
return new Later("Next year", nextYear());
|
|
|
default:
|
|
|
throw `Unsupported weekday: ${weekday}`;
|
|
|
}
|
|
|
}
|
|
|
else if (later === "tomorrow") {
|
|
|
return new Later("Tomorrow", tomorrow());
|
|
|
}
|
|
|
throw `Unsupported format: ${later}`;
|
|
|
}
|
|
|
[
|
|
|
new Later("In 30 minutes", inMinutes(30)),
|
|
|
new Later("In 1 hours", inHours(1)),
|
|
|
new Later("In 3 hours", inHours(3)),
|
|
|
new Later("Tomorrow", tomorrow()),
|
|
|
new Later("Next week", nextWeek()),
|
|
|
];
|
|
|
class DateTimeFormatter {
|
|
|
constructor() {
|
|
|
this.dateFormat = new ConstantReference("YYYY-MM-DD");
|
|
|
this.dateTimeFormat = new ConstantReference("YYYY-MM-DD HH:mm");
|
|
|
this.strict = new ConstantReference(false);
|
|
|
}
|
|
|
setTimeFormat(dateFormat, dateTimeFormat, strict) {
|
|
|
this.dateFormat = dateFormat;
|
|
|
this.dateTimeFormat = dateTimeFormat;
|
|
|
this.strict = strict;
|
|
|
}
|
|
|
parse(text) {
|
|
|
const parsed = this.doParse(text, true);
|
|
|
if (parsed != null) {
|
|
|
return parsed;
|
|
|
}
|
|
|
if (this.strict.value) {
|
|
|
return null;
|
|
|
}
|
|
|
return this.doParse(text, false);
|
|
|
}
|
|
|
doParse(text, strict) {
|
|
|
const dateTime = moment(text, this.dateTimeFormat.value, strict);
|
|
|
if (dateTime.isValid()) {
|
|
|
return new DateTime$2(dateTime, true);
|
|
|
}
|
|
|
const date = moment(text, this.dateFormat.value, strict);
|
|
|
if (date.isValid()) {
|
|
|
return new DateTime$2(date, false);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
toString(time) {
|
|
|
if (time.hasTimePart) {
|
|
|
return time.format(this.dateTimeFormat.value);
|
|
|
}
|
|
|
else {
|
|
|
return time.format(this.dateFormat.value);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const DATE_TIME_FORMATTER = new DateTimeFormatter();
|
|
|
|
|
|
class Reminder$1 {
|
|
|
constructor(file, title, time, rowNumber, done) {
|
|
|
this.file = file;
|
|
|
this.title = title;
|
|
|
this.time = time;
|
|
|
this.rowNumber = rowNumber;
|
|
|
this.done = done;
|
|
|
// To avoid duplicate notification, set this flag true before notification and set false on notification done.
|
|
|
this.muteNotification = false;
|
|
|
/* Given that `muteNotification` above is playing double duty, we need a flag
|
|
|
* that lets us serialize reminder display to prevent overload problems on
|
|
|
* mobile.
|
|
|
*
|
|
|
* It should be set to `true` before the reminder is displayed, and then set
|
|
|
* to false once the reminder is dealt with.
|
|
|
*/
|
|
|
this.beingDisplayed = false;
|
|
|
}
|
|
|
key() {
|
|
|
return this.file + this.title + this.time.toString();
|
|
|
}
|
|
|
equals(reminder) {
|
|
|
return this.rowNumber === reminder.rowNumber
|
|
|
&& this.title === reminder.title
|
|
|
&& this.time.equals(reminder.time)
|
|
|
&& this.file === reminder.file;
|
|
|
}
|
|
|
getFileName() {
|
|
|
const p = this.file.split(/[\/\\]/);
|
|
|
return p[p.length - 1].replace(/^(.*?)(\..+)?$/, "$1");
|
|
|
}
|
|
|
static extractFileName(path) {
|
|
|
const p = path.split(/[\/\\]/);
|
|
|
return p[p.length - 1].replace(/^(.*?)(\..+)?$/, "$1");
|
|
|
}
|
|
|
}
|
|
|
class Reminders {
|
|
|
constructor(onChange) {
|
|
|
this.onChange = onChange;
|
|
|
this.fileToReminders = new Map();
|
|
|
this.reminders = [];
|
|
|
}
|
|
|
getExpiredReminders(defaultTime) {
|
|
|
const now = new Date().getTime();
|
|
|
const result = [];
|
|
|
for (let i = 0; i < this.reminders.length; i++) {
|
|
|
const reminder = this.reminders[i];
|
|
|
if (reminder.time.getTimeInMillis(defaultTime) <= now) {
|
|
|
result.push(reminder);
|
|
|
}
|
|
|
else {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
byDate(date) {
|
|
|
return this.reminders.filter(reminder => reminder.time.toYYYYMMDD() === date.toYYYYMMDD());
|
|
|
}
|
|
|
removeReminder(reminder) {
|
|
|
console.debug("Remove reminder: %o", reminder);
|
|
|
this.reminders.remove(reminder);
|
|
|
const file = this.fileToReminders.get(reminder.file);
|
|
|
if (file) {
|
|
|
file.remove(reminder);
|
|
|
if (file.length === 0) {
|
|
|
this.fileToReminders.delete(reminder.file);
|
|
|
}
|
|
|
}
|
|
|
this.onChange();
|
|
|
}
|
|
|
clear() {
|
|
|
this.fileToReminders.clear();
|
|
|
this.reminders = [];
|
|
|
this.onChange();
|
|
|
}
|
|
|
removeFile(filePath) {
|
|
|
if (this.fileToReminders.delete(filePath)) {
|
|
|
this.sortReminders();
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
replaceFile(filePath, reminders) {
|
|
|
// migrate notificationVisible property
|
|
|
const oldReminders = this.fileToReminders.get(filePath);
|
|
|
if (oldReminders) {
|
|
|
if (this.equals(oldReminders, reminders)) {
|
|
|
return false;
|
|
|
}
|
|
|
const reminderToNotificationVisible = new Map();
|
|
|
for (const reminder of oldReminders) {
|
|
|
reminderToNotificationVisible.set(reminder.key(), reminder.muteNotification);
|
|
|
}
|
|
|
for (const reminder of reminders) {
|
|
|
const visible = reminderToNotificationVisible.get(reminder.key());
|
|
|
reminderToNotificationVisible.set(reminder.key(), reminder.muteNotification);
|
|
|
if (visible !== undefined) {
|
|
|
reminder.muteNotification = visible;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
// update
|
|
|
this.fileToReminders.set(filePath, reminders);
|
|
|
this.sortReminders();
|
|
|
return true;
|
|
|
}
|
|
|
equals(r1, r2) {
|
|
|
if (r1.length !== r2.length) {
|
|
|
return false;
|
|
|
}
|
|
|
this.sort(r1);
|
|
|
this.sort(r2);
|
|
|
for (const i in r1) {
|
|
|
const reminder1 = r1[i];
|
|
|
const reminder2 = r2[i];
|
|
|
if (reminder1 == null && reminder2 != null) {
|
|
|
return false;
|
|
|
}
|
|
|
if (reminder2 == null && reminder1 != null) {
|
|
|
return false;
|
|
|
}
|
|
|
if (reminder1 == null && reminder2 == null) {
|
|
|
continue;
|
|
|
}
|
|
|
if (!reminder1.equals(reminder2)) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
sortReminders() {
|
|
|
const reminders = [];
|
|
|
for (const r of this.fileToReminders.values()) {
|
|
|
reminders.push(...r);
|
|
|
}
|
|
|
this.sort(reminders);
|
|
|
this.reminders = reminders;
|
|
|
this.onChange();
|
|
|
}
|
|
|
sort(reminders) {
|
|
|
reminders.sort((a, b) => {
|
|
|
var _a, _b;
|
|
|
const d = a.time.getTimeInMillis((_a = this.reminderTime) === null || _a === void 0 ? void 0 : _a.value) -
|
|
|
b.time.getTimeInMillis((_b = this.reminderTime) === null || _b === void 0 ? void 0 : _b.value);
|
|
|
return d > 0 ? 1 : d < 0 ? -1 : 0;
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
function generateGroup(time, now, reminderTime) {
|
|
|
const days = DateTime$2.duration(now, time, "days", reminderTime);
|
|
|
if (days > 30) {
|
|
|
return new Group(time.toYYYYMMMM(reminderTime), (time) => time.format("MM/DD", reminderTime));
|
|
|
}
|
|
|
if (days >= 7) {
|
|
|
return new Group("Over 1 week", (time) => time.format("MM/DD", reminderTime));
|
|
|
}
|
|
|
if (time.toYYYYMMDD(reminderTime) === now.toYYYYMMDD(reminderTime)) {
|
|
|
const todaysGroup = new Group("Today", (time) => time.format("HH:mm", reminderTime));
|
|
|
todaysGroup.isToday = true;
|
|
|
return todaysGroup;
|
|
|
}
|
|
|
if (time.toYYYYMMDD(reminderTime) ===
|
|
|
now.add(1, "days", reminderTime).toYYYYMMDD()) {
|
|
|
return new Group("Tomorrow", (time) => time.format("HH:mm", reminderTime));
|
|
|
}
|
|
|
return new Group(time.format("M/DD (ddd)", reminderTime), (time) => time.format("HH:mm", reminderTime));
|
|
|
}
|
|
|
class Group {
|
|
|
constructor(name, timeToStringFunc) {
|
|
|
this.name = name;
|
|
|
this.timeToStringFunc = timeToStringFunc;
|
|
|
this.isToday = false;
|
|
|
this.isOverdue = false;
|
|
|
}
|
|
|
timeToString(time) {
|
|
|
return this.timeToStringFunc(time);
|
|
|
}
|
|
|
}
|
|
|
function groupReminders(sortedReminders, reminderTime) {
|
|
|
const now = DateTime$2.now();
|
|
|
const result = [];
|
|
|
let currentReminders = [];
|
|
|
const overdueReminders = [];
|
|
|
// Always shows today's group
|
|
|
let previousGroup = generateGroup(now, now, reminderTime);
|
|
|
for (let i = 0; i < sortedReminders.length; i++) {
|
|
|
const r = sortedReminders[i];
|
|
|
if (r.muteNotification) {
|
|
|
overdueReminders.push(r);
|
|
|
continue;
|
|
|
}
|
|
|
const group = generateGroup(r.time, now, reminderTime);
|
|
|
if (group.name !== previousGroup.name) {
|
|
|
if (currentReminders.length > 0 || previousGroup.isToday) {
|
|
|
result.push(new GroupedReminder(previousGroup, currentReminders));
|
|
|
}
|
|
|
currentReminders = [];
|
|
|
}
|
|
|
currentReminders.push(r);
|
|
|
previousGroup = group;
|
|
|
}
|
|
|
if (currentReminders.length > 0) {
|
|
|
result.push(new GroupedReminder(previousGroup, currentReminders));
|
|
|
}
|
|
|
if (overdueReminders.length > 0) {
|
|
|
const overdueGroup = new Group("Overdue", (time) => time.format("HH:mm", reminderTime));
|
|
|
overdueGroup.isOverdue = true;
|
|
|
result.splice(0, 0, new GroupedReminder(overdueGroup, overdueReminders));
|
|
|
console.log(overdueGroup);
|
|
|
console.log(result);
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
class GroupedReminder {
|
|
|
constructor(group, reminders) {
|
|
|
this.group = group;
|
|
|
this.reminders = reminders;
|
|
|
}
|
|
|
get name() {
|
|
|
return this.group.name;
|
|
|
}
|
|
|
get isOverdue() {
|
|
|
return this.group.isOverdue;
|
|
|
}
|
|
|
timeToString(time) {
|
|
|
return this.group.timeToString(time);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class ReminderFormatParameterKey {
|
|
|
constructor(key, defaultValue) {
|
|
|
this.key = key;
|
|
|
this.defaultValue = defaultValue;
|
|
|
}
|
|
|
}
|
|
|
ReminderFormatParameterKey.now = new ReminderFormatParameterKey("now", DateTime$2.now());
|
|
|
ReminderFormatParameterKey.useCustomEmojiForTasksPlugin = new ReminderFormatParameterKey("useCustomEmojiForTasksPlugin", false);
|
|
|
ReminderFormatParameterKey.removeTagsForTasksPlugin = new ReminderFormatParameterKey("removeTagsForTasksPlugin", false);
|
|
|
ReminderFormatParameterKey.linkDatesToDailyNotes = new ReminderFormatParameterKey("linkDatesToDailyNotes", false);
|
|
|
ReminderFormatParameterKey.strictDateFormat = new ReminderFormatParameterKey("strictDateFormat", false);
|
|
|
class ReminderFormatConfig {
|
|
|
constructor() {
|
|
|
this.parameters = new Map();
|
|
|
}
|
|
|
/**
|
|
|
* Set parameter for this format.
|
|
|
*
|
|
|
* @param key parameter key
|
|
|
*/
|
|
|
setParameter(key, value) {
|
|
|
this.parameters.set(key.key, () => value.value);
|
|
|
}
|
|
|
/**
|
|
|
* Set parameter for this format.
|
|
|
*
|
|
|
* @param key parameter key
|
|
|
*/
|
|
|
setParameterFunc(key, f) {
|
|
|
this.parameters.set(key.key, f);
|
|
|
}
|
|
|
setParameterValue(key, value) {
|
|
|
this.parameters.set(key.key, () => value);
|
|
|
}
|
|
|
getParameter(key) {
|
|
|
const value = this.parameters.get(key.key);
|
|
|
if (value == null) {
|
|
|
return key.defaultValue;
|
|
|
}
|
|
|
return value();
|
|
|
}
|
|
|
}
|
|
|
class TodoBasedReminderFormat {
|
|
|
constructor() {
|
|
|
this.config = new ReminderFormatConfig();
|
|
|
}
|
|
|
setConfig(config) {
|
|
|
this.config = config;
|
|
|
}
|
|
|
parse(doc) {
|
|
|
return doc.getTodos()
|
|
|
.map(todo => {
|
|
|
const parsed = this.parseValidReminder(todo);
|
|
|
if (parsed == null) {
|
|
|
return null;
|
|
|
}
|
|
|
const title = parsed.getTitle();
|
|
|
if (title == null) {
|
|
|
return null;
|
|
|
}
|
|
|
const time = parsed.getTime();
|
|
|
if (time == null) {
|
|
|
return null;
|
|
|
}
|
|
|
return new Reminder$1(doc.file, title, time, todo.lineIndex, todo.isChecked());
|
|
|
})
|
|
|
.filter((reminder) => reminder != null);
|
|
|
}
|
|
|
modify(doc, reminder, edit) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
const todo = doc.getTodo(reminder.rowNumber);
|
|
|
if (todo === null) {
|
|
|
console.warn("Not a todo: reminder=%o", reminder);
|
|
|
return false;
|
|
|
}
|
|
|
const parsed = this.parseValidReminder(todo);
|
|
|
if (parsed === null) {
|
|
|
return false;
|
|
|
}
|
|
|
if (!this.modifyReminder(doc, todo, parsed, edit)) {
|
|
|
return false;
|
|
|
}
|
|
|
todo.body = parsed.toMarkdown();
|
|
|
return true;
|
|
|
});
|
|
|
}
|
|
|
parseValidReminder(todo) {
|
|
|
const parsed = this.parseReminder(todo);
|
|
|
if (parsed === null) {
|
|
|
return null;
|
|
|
}
|
|
|
if (!this.isValidReminder(parsed)) {
|
|
|
return null;
|
|
|
}
|
|
|
return parsed;
|
|
|
}
|
|
|
isValidReminder(reminder) {
|
|
|
return reminder.getTime() !== null;
|
|
|
}
|
|
|
modifyReminder(doc, todo, parsed, edit) {
|
|
|
if (edit.rawTime !== undefined) {
|
|
|
if (!parsed.setRawTime(edit.rawTime)) {
|
|
|
console.warn("The reminder doesn't support raw time: parsed=%o", parsed);
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
else if (edit.time !== undefined) {
|
|
|
parsed.setTime(edit.time);
|
|
|
}
|
|
|
if (edit.checked !== undefined) {
|
|
|
todo.setChecked(edit.checked);
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
appendReminder(line, time) {
|
|
|
const todo = Todo.parse(0, line);
|
|
|
if (todo == null) {
|
|
|
return null;
|
|
|
}
|
|
|
let parsed = this.parseReminder(todo);
|
|
|
if (parsed != null) {
|
|
|
parsed.setTime(time);
|
|
|
}
|
|
|
else {
|
|
|
parsed = this.newReminder(todo.body, time);
|
|
|
parsed.setTime(time);
|
|
|
}
|
|
|
todo.body = parsed.toMarkdown();
|
|
|
return todo.toMarkdown();
|
|
|
}
|
|
|
isStrictDateFormat() {
|
|
|
return this.config.getParameter(ReminderFormatParameterKey.strictDateFormat);
|
|
|
}
|
|
|
}
|
|
|
class CompositeReminderFormat {
|
|
|
constructor() {
|
|
|
this.formats = [];
|
|
|
}
|
|
|
setConfig(config) {
|
|
|
this.config = config;
|
|
|
this.syncConfig();
|
|
|
}
|
|
|
parse(doc) {
|
|
|
const reminders = [];
|
|
|
for (const format of this.formats) {
|
|
|
const parsed = format.parse(doc);
|
|
|
if (parsed == null) {
|
|
|
continue;
|
|
|
}
|
|
|
reminders.push(...parsed);
|
|
|
}
|
|
|
return reminders;
|
|
|
}
|
|
|
modify(doc, reminder, edit) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
for (const format of this.formats) {
|
|
|
const modified = yield format.modify(doc, reminder, edit);
|
|
|
if (modified) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
});
|
|
|
}
|
|
|
resetFormat(formats) {
|
|
|
this.formats = formats;
|
|
|
this.syncConfig();
|
|
|
}
|
|
|
syncConfig() {
|
|
|
if (this.config == null) {
|
|
|
return;
|
|
|
}
|
|
|
this.formats.forEach(f => f.setConfig(this.config));
|
|
|
}
|
|
|
appendReminder(line, time) {
|
|
|
if (this.formats[0] == null) {
|
|
|
return null;
|
|
|
}
|
|
|
return this.formats[0].appendReminder(line, time);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class DefaultReminderModel {
|
|
|
constructor(linkDatesToDailyNotes, title1, time, title2) {
|
|
|
this.linkDatesToDailyNotes = linkDatesToDailyNotes;
|
|
|
this.title1 = title1;
|
|
|
this.time = time;
|
|
|
this.title2 = title2;
|
|
|
}
|
|
|
static parse(line, linkDatesToDailyNotes) {
|
|
|
if (linkDatesToDailyNotes == null) {
|
|
|
linkDatesToDailyNotes = false;
|
|
|
}
|
|
|
const result = DefaultReminderModel.regexp.exec(line);
|
|
|
if (result == null) {
|
|
|
return null;
|
|
|
}
|
|
|
const title1 = result.groups['title1'];
|
|
|
let time = result.groups['time'];
|
|
|
if (time == null) {
|
|
|
return null;
|
|
|
}
|
|
|
const title2 = result.groups['title2'];
|
|
|
if (linkDatesToDailyNotes) {
|
|
|
time = time.replace("[[", "");
|
|
|
time = time.replace("]]", "");
|
|
|
}
|
|
|
return new DefaultReminderModel(linkDatesToDailyNotes, title1, time, title2);
|
|
|
}
|
|
|
getTitle() {
|
|
|
return `${this.title1.trim()} ${this.title2.trim()}`.trim();
|
|
|
}
|
|
|
getTime() {
|
|
|
return DATE_TIME_FORMATTER.parse(this.time);
|
|
|
}
|
|
|
setTime(time) {
|
|
|
this.time = DATE_TIME_FORMATTER.toString(time);
|
|
|
}
|
|
|
setRawTime(rawTime) {
|
|
|
this.time = rawTime;
|
|
|
return true;
|
|
|
}
|
|
|
toMarkdown() {
|
|
|
let result = `${this.title1}(@${this.time})${this.title2}`;
|
|
|
if (!this.linkDatesToDailyNotes) {
|
|
|
return result;
|
|
|
}
|
|
|
let time = DATE_TIME_FORMATTER.parse(this.time);
|
|
|
if (!time) {
|
|
|
return result;
|
|
|
}
|
|
|
const date = DATE_TIME_FORMATTER.toString(time.clone(false));
|
|
|
return result.replace(date, `[[${date}]]`);
|
|
|
}
|
|
|
}
|
|
|
DefaultReminderModel.regexp = /^(?<title1>.*?)\(@(?<time>.+?)\)(?<title2>.*)$/;
|
|
|
class DefaultReminderFormat extends TodoBasedReminderFormat {
|
|
|
parseReminder(todo) {
|
|
|
return DefaultReminderModel.parse(todo.body, this.linkDatesToDailyNotes());
|
|
|
}
|
|
|
newReminder(title, time) {
|
|
|
return new DefaultReminderModel(this.linkDatesToDailyNotes(), title, time.toString(), "");
|
|
|
}
|
|
|
linkDatesToDailyNotes() {
|
|
|
return this.config.getParameter(ReminderFormatParameterKey.linkDatesToDailyNotes);
|
|
|
}
|
|
|
}
|
|
|
DefaultReminderFormat.instance = new DefaultReminderFormat();
|
|
|
|
|
|
function escapeRegExpChars(text) {
|
|
|
return text.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&');
|
|
|
}
|
|
|
|
|
|
const kanbanSetting = new (class KanbanSetting {
|
|
|
get dateTrigger() {
|
|
|
return this.get("date-trigger", "@");
|
|
|
}
|
|
|
get dateFormat() {
|
|
|
return this.get("date-format", "YYYY-MM-DD");
|
|
|
}
|
|
|
get timeTrigger() {
|
|
|
return this.get("time-trigger", "@@");
|
|
|
}
|
|
|
get timeFormat() {
|
|
|
return this.get("time-format", "HH:mm");
|
|
|
}
|
|
|
get linkDateToDailyNote() {
|
|
|
return this.get("link-date-to-daily-note", false);
|
|
|
}
|
|
|
get(key, defaultValue) {
|
|
|
var _a, _b, _c;
|
|
|
if (!window) {
|
|
|
return defaultValue;
|
|
|
}
|
|
|
const plugins = (_c = (_b = (_a = window) === null || _a === void 0 ? void 0 : _a.app) === null || _b === void 0 ? void 0 : _b.plugins) === null || _c === void 0 ? void 0 : _c.plugins;
|
|
|
if (!plugins) {
|
|
|
return defaultValue;
|
|
|
}
|
|
|
const plugin = plugins["obsidian-kanban"];
|
|
|
if (!plugin) {
|
|
|
return defaultValue;
|
|
|
}
|
|
|
const settings = plugin.settings;
|
|
|
if (!settings) {
|
|
|
return defaultValue;
|
|
|
}
|
|
|
const value = plugin.settings[key];
|
|
|
if (value === null || value === undefined) {
|
|
|
return defaultValue;
|
|
|
}
|
|
|
return value;
|
|
|
}
|
|
|
});
|
|
|
class KanbanDateTimeFormat {
|
|
|
constructor(setting) {
|
|
|
this.setting = setting;
|
|
|
let dateRegExpStr;
|
|
|
if (setting.linkDateToDailyNote) {
|
|
|
dateRegExpStr = `${escapeRegExpChars(this.setting.dateTrigger)}\\[\\[(?<date>.+?)\\]\\]`;
|
|
|
}
|
|
|
else {
|
|
|
dateRegExpStr = `${escapeRegExpChars(this.setting.dateTrigger)}\\{(?<date>.+?)\\}`;
|
|
|
}
|
|
|
const timeRegExpStr = `${escapeRegExpChars(this.setting.timeTrigger)}\\{(?<time>.+?)\\}`;
|
|
|
this.dateRegExp = new RegExp(dateRegExpStr);
|
|
|
this.timeRegExp = new RegExp(timeRegExpStr);
|
|
|
}
|
|
|
format(time) {
|
|
|
let datePart;
|
|
|
if (this.setting.linkDateToDailyNote) {
|
|
|
datePart = `${this.setting.dateTrigger}[[${time.format(this.setting.dateFormat)}]]`;
|
|
|
}
|
|
|
else {
|
|
|
datePart = `${this.setting.dateTrigger}{${time.format(this.setting.dateFormat)}}`;
|
|
|
}
|
|
|
if (!time.hasTimePart) {
|
|
|
return datePart;
|
|
|
}
|
|
|
return `${datePart} ${this.setting.timeTrigger}{${time.format(this.setting.timeFormat)}}`;
|
|
|
}
|
|
|
split(text, strictDateFormat) {
|
|
|
const originalText = text;
|
|
|
let title;
|
|
|
let date;
|
|
|
let time;
|
|
|
const dateMatch = this.dateRegExp.exec(text);
|
|
|
if (dateMatch) {
|
|
|
date = dateMatch.groups["date"];
|
|
|
text = text.replace(this.dateRegExp, "");
|
|
|
}
|
|
|
else {
|
|
|
return { title: originalText };
|
|
|
}
|
|
|
const timeMatch = this.timeRegExp.exec(text);
|
|
|
if (timeMatch) {
|
|
|
time = timeMatch.groups["time"];
|
|
|
text = text.replace(this.timeRegExp, "");
|
|
|
}
|
|
|
title = text.trim();
|
|
|
let parsedTime;
|
|
|
const strict = strictDateFormat !== null && strictDateFormat !== void 0 ? strictDateFormat : true;
|
|
|
if (time) {
|
|
|
parsedTime = new DateTime$2(moment(`${date} ${time}`, `${this.setting.dateFormat} ${this.setting.timeFormat}`, strict), true);
|
|
|
}
|
|
|
else {
|
|
|
parsedTime = new DateTime$2(moment(date, this.setting.dateFormat, strict), false);
|
|
|
}
|
|
|
if (parsedTime.isValid()) {
|
|
|
return { title, time: parsedTime };
|
|
|
}
|
|
|
return { title: originalText };
|
|
|
}
|
|
|
}
|
|
|
KanbanDateTimeFormat.instance = new KanbanDateTimeFormat(kanbanSetting);
|
|
|
class KanbanReminderModel {
|
|
|
constructor(title, time) {
|
|
|
this.title = title;
|
|
|
this.time = time;
|
|
|
}
|
|
|
static parse(line, strictDateFormat) {
|
|
|
const splitted = KanbanDateTimeFormat.instance.split(line, strictDateFormat);
|
|
|
if (splitted.time == null) {
|
|
|
return null;
|
|
|
}
|
|
|
return new KanbanReminderModel(splitted.title, splitted.time);
|
|
|
}
|
|
|
getTitle() {
|
|
|
return this.title.trim();
|
|
|
}
|
|
|
getTime() {
|
|
|
if (this.time) {
|
|
|
return this.time;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
setTime(time) {
|
|
|
this.time = time;
|
|
|
}
|
|
|
setRawTime() {
|
|
|
return false;
|
|
|
}
|
|
|
toMarkdown() {
|
|
|
return `${this.title.trim()} ${KanbanDateTimeFormat.instance.format(this.time)}`;
|
|
|
}
|
|
|
}
|
|
|
class KanbanReminderFormat extends TodoBasedReminderFormat {
|
|
|
parseReminder(todo) {
|
|
|
return KanbanReminderModel.parse(todo.body, this.isStrictDateFormat());
|
|
|
}
|
|
|
newReminder(title, time) {
|
|
|
const parsed = new KanbanReminderModel(title, time);
|
|
|
parsed.setTime(time);
|
|
|
return parsed;
|
|
|
}
|
|
|
}
|
|
|
KanbanReminderFormat.instance = new KanbanReminderFormat();
|
|
|
|
|
|
// =============================================================================
|
|
|
// Weekday
|
|
|
// =============================================================================
|
|
|
var ALL_WEEKDAYS = ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU'];
|
|
|
var Weekday = /** @class */ (function () {
|
|
|
function Weekday(weekday, n) {
|
|
|
if (n === 0)
|
|
|
throw new Error("Can't create weekday with n == 0");
|
|
|
this.weekday = weekday;
|
|
|
this.n = n;
|
|
|
}
|
|
|
Weekday.fromStr = function (str) {
|
|
|
return new Weekday(ALL_WEEKDAYS.indexOf(str));
|
|
|
};
|
|
|
// __call__ - Cannot call the object directly, do it through
|
|
|
// e.g. RRule.TH.nth(-1) instead,
|
|
|
Weekday.prototype.nth = function (n) {
|
|
|
return this.n === n ? this : new Weekday(this.weekday, n);
|
|
|
};
|
|
|
// __eq__
|
|
|
Weekday.prototype.equals = function (other) {
|
|
|
return this.weekday === other.weekday && this.n === other.n;
|
|
|
};
|
|
|
// __repr__
|
|
|
Weekday.prototype.toString = function () {
|
|
|
var s = ALL_WEEKDAYS[this.weekday];
|
|
|
if (this.n)
|
|
|
s = (this.n > 0 ? '+' : '') + String(this.n) + s;
|
|
|
return s;
|
|
|
};
|
|
|
Weekday.prototype.getJsWeekday = function () {
|
|
|
return this.weekday === 6 ? 0 : this.weekday + 1;
|
|
|
};
|
|
|
return Weekday;
|
|
|
}());
|
|
|
|
|
|
// =============================================================================
|
|
|
var isPresent = function (value) {
|
|
|
return value !== null && value !== undefined;
|
|
|
};
|
|
|
var isNumber$1 = function (value) {
|
|
|
return typeof value === 'number';
|
|
|
};
|
|
|
var isWeekdayStr = function (value) {
|
|
|
return ALL_WEEKDAYS.indexOf(value) >= 0;
|
|
|
};
|
|
|
var isArray = Array.isArray;
|
|
|
/**
|
|
|
* Simplified version of python's range()
|
|
|
*/
|
|
|
var range = function (start, end) {
|
|
|
if (end === void 0) { end = start; }
|
|
|
if (arguments.length === 1) {
|
|
|
end = start;
|
|
|
start = 0;
|
|
|
}
|
|
|
var rang = [];
|
|
|
for (var i = start; i < end; i++)
|
|
|
rang.push(i);
|
|
|
return rang;
|
|
|
};
|
|
|
var repeat = function (value, times) {
|
|
|
var i = 0;
|
|
|
var array = [];
|
|
|
if (isArray(value)) {
|
|
|
for (; i < times; i++)
|
|
|
array[i] = [].concat(value);
|
|
|
}
|
|
|
else {
|
|
|
for (; i < times; i++)
|
|
|
array[i] = value;
|
|
|
}
|
|
|
return array;
|
|
|
};
|
|
|
var toArray = function (item) {
|
|
|
if (isArray(item)) {
|
|
|
return item;
|
|
|
}
|
|
|
return [item];
|
|
|
};
|
|
|
function padStart$1(item, targetLength, padString) {
|
|
|
if (padString === void 0) { padString = ' '; }
|
|
|
var str = String(item);
|
|
|
targetLength = targetLength >> 0;
|
|
|
if (str.length > targetLength) {
|
|
|
return String(str);
|
|
|
}
|
|
|
targetLength = targetLength - str.length;
|
|
|
if (targetLength > padString.length) {
|
|
|
padString += repeat(padString, targetLength / padString.length);
|
|
|
}
|
|
|
return padString.slice(0, targetLength) + String(str);
|
|
|
}
|
|
|
/**
|
|
|
* Python like split
|
|
|
*/
|
|
|
var split = function (str, sep, num) {
|
|
|
var splits = str.split(sep);
|
|
|
return num
|
|
|
? splits.slice(0, num).concat([splits.slice(num).join(sep)])
|
|
|
: splits;
|
|
|
};
|
|
|
/**
|
|
|
* closure/goog/math/math.js:modulo
|
|
|
* Copyright 2006 The Closure Library Authors.
|
|
|
* The % operator in JavaScript returns the remainder of a / b, but differs from
|
|
|
* some other languages in that the result will have the same sign as the
|
|
|
* dividend. For example, -1 % 8 == -1, whereas in some other languages
|
|
|
* (such as Python) the result would be 7. This function emulates the more
|
|
|
* correct modulo behavior, which is useful for certain applications such as
|
|
|
* calculating an offset index in a circular list.
|
|
|
*
|
|
|
* @param {number} a The dividend.
|
|
|
* @param {number} b The divisor.
|
|
|
* @return {number} a % b where the result is between 0 and b (either 0 <= x < b
|
|
|
* or b < x <= 0, depending on the sign of b).
|
|
|
*/
|
|
|
var pymod = function (a, b) {
|
|
|
var r = a % b;
|
|
|
// If r and b differ in sign, add b to wrap the result to the correct sign.
|
|
|
return r * b < 0 ? r + b : r;
|
|
|
};
|
|
|
/**
|
|
|
* @see: <http://docs.python.org/library/functions.html#divmod>
|
|
|
*/
|
|
|
var divmod = function (a, b) {
|
|
|
return { div: Math.floor(a / b), mod: pymod(a, b) };
|
|
|
};
|
|
|
var empty = function (obj) {
|
|
|
return !isPresent(obj) || obj.length === 0;
|
|
|
};
|
|
|
/**
|
|
|
* Python-like boolean
|
|
|
* @return {Boolean} value of an object/primitive, taking into account
|
|
|
* the fact that in Python an empty list's/tuple's
|
|
|
* boolean value is False, whereas in JS it's true
|
|
|
*/
|
|
|
var notEmpty = function (obj) {
|
|
|
return !empty(obj);
|
|
|
};
|
|
|
/**
|
|
|
* Return true if a value is in an array
|
|
|
*/
|
|
|
var includes = function (arr, val) {
|
|
|
return notEmpty(arr) && arr.indexOf(val) !== -1;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* General date-related utilities.
|
|
|
* Also handles several incompatibilities between JavaScript and Python
|
|
|
*
|
|
|
*/
|
|
|
var dateutil;
|
|
|
(function (dateutil) {
|
|
|
dateutil.MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
|
/**
|
|
|
* Number of milliseconds of one day
|
|
|
*/
|
|
|
dateutil.ONE_DAY = 1000 * 60 * 60 * 24;
|
|
|
/**
|
|
|
* @see: <http://docs.python.org/library/datetime.html#datetime.MAXYEAR>
|
|
|
*/
|
|
|
dateutil.MAXYEAR = 9999;
|
|
|
/**
|
|
|
* Python uses 1-Jan-1 as the base for calculating ordinals but we don't
|
|
|
* want to confuse the JS engine with milliseconds > Number.MAX_NUMBER,
|
|
|
* therefore we use 1-Jan-1970 instead
|
|
|
*/
|
|
|
dateutil.ORDINAL_BASE = new Date(Date.UTC(1970, 0, 1));
|
|
|
/**
|
|
|
* Python: MO-SU: 0 - 6
|
|
|
* JS: SU-SAT 0 - 6
|
|
|
*/
|
|
|
dateutil.PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5];
|
|
|
/**
|
|
|
* py_date.timetuple()[7]
|
|
|
*/
|
|
|
dateutil.getYearDay = function (date) {
|
|
|
var dateNoTime = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
|
|
|
return (Math.ceil((dateNoTime.valueOf() -
|
|
|
new Date(date.getUTCFullYear(), 0, 1).valueOf()) /
|
|
|
dateutil.ONE_DAY) + 1);
|
|
|
};
|
|
|
dateutil.isLeapYear = function (year) {
|
|
|
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
|
};
|
|
|
dateutil.isDate = function (value) {
|
|
|
return value instanceof Date;
|
|
|
};
|
|
|
dateutil.isValidDate = function (value) {
|
|
|
return dateutil.isDate(value) && !isNaN(value.getTime());
|
|
|
};
|
|
|
/**
|
|
|
* @return {Number} the date's timezone offset in ms
|
|
|
*/
|
|
|
dateutil.tzOffset = function (date) {
|
|
|
return date.getTimezoneOffset() * 60 * 1000;
|
|
|
};
|
|
|
/**
|
|
|
* @see: <http://www.mcfedries.com/JavaScript/DaysBetween.asp>
|
|
|
*/
|
|
|
dateutil.daysBetween = function (date1, date2) {
|
|
|
// The number of milliseconds in one day
|
|
|
// Convert both dates to milliseconds
|
|
|
var date1ms = date1.getTime() - dateutil.tzOffset(date1);
|
|
|
var date2ms = date2.getTime() - dateutil.tzOffset(date2);
|
|
|
// Calculate the difference in milliseconds
|
|
|
var differencems = date1ms - date2ms;
|
|
|
// Convert back to days and return
|
|
|
return Math.round(differencems / dateutil.ONE_DAY);
|
|
|
};
|
|
|
/**
|
|
|
* @see: <http://docs.python.org/library/datetime.html#datetime.date.toordinal>
|
|
|
*/
|
|
|
dateutil.toOrdinal = function (date) {
|
|
|
return dateutil.daysBetween(date, dateutil.ORDINAL_BASE);
|
|
|
};
|
|
|
/**
|
|
|
* @see - <http://docs.python.org/library/datetime.html#datetime.date.fromordinal>
|
|
|
*/
|
|
|
dateutil.fromOrdinal = function (ordinal) {
|
|
|
return new Date(dateutil.ORDINAL_BASE.getTime() + ordinal * dateutil.ONE_DAY);
|
|
|
};
|
|
|
dateutil.getMonthDays = function (date) {
|
|
|
var month = date.getUTCMonth();
|
|
|
return month === 1 && dateutil.isLeapYear(date.getUTCFullYear())
|
|
|
? 29
|
|
|
: dateutil.MONTH_DAYS[month];
|
|
|
};
|
|
|
/**
|
|
|
* @return {Number} python-like weekday
|
|
|
*/
|
|
|
dateutil.getWeekday = function (date) {
|
|
|
return dateutil.PY_WEEKDAYS[date.getUTCDay()];
|
|
|
};
|
|
|
/**
|
|
|
* @see: <http://docs.python.org/library/calendar.html#calendar.monthrange>
|
|
|
*/
|
|
|
dateutil.monthRange = function (year, month) {
|
|
|
var date = new Date(Date.UTC(year, month, 1));
|
|
|
return [dateutil.getWeekday(date), dateutil.getMonthDays(date)];
|
|
|
};
|
|
|
/**
|
|
|
* @see: <http://docs.python.org/library/datetime.html#datetime.datetime.combine>
|
|
|
*/
|
|
|
dateutil.combine = function (date, time) {
|
|
|
time = time || date;
|
|
|
return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds()));
|
|
|
};
|
|
|
dateutil.clone = function (date) {
|
|
|
var dolly = new Date(date.getTime());
|
|
|
return dolly;
|
|
|
};
|
|
|
dateutil.cloneDates = function (dates) {
|
|
|
var clones = [];
|
|
|
for (var i = 0; i < dates.length; i++) {
|
|
|
clones.push(dateutil.clone(dates[i]));
|
|
|
}
|
|
|
return clones;
|
|
|
};
|
|
|
/**
|
|
|
* Sorts an array of Date or dateutil.Time objects
|
|
|
*/
|
|
|
dateutil.sort = function (dates) {
|
|
|
dates.sort(function (a, b) {
|
|
|
return a.getTime() - b.getTime();
|
|
|
});
|
|
|
};
|
|
|
dateutil.timeToUntilString = function (time, utc) {
|
|
|
if (utc === void 0) { utc = true; }
|
|
|
var date = new Date(time);
|
|
|
return [
|
|
|
padStart$1(date.getUTCFullYear().toString(), 4, '0'),
|
|
|
padStart$1(date.getUTCMonth() + 1, 2, '0'),
|
|
|
padStart$1(date.getUTCDate(), 2, '0'),
|
|
|
'T',
|
|
|
padStart$1(date.getUTCHours(), 2, '0'),
|
|
|
padStart$1(date.getUTCMinutes(), 2, '0'),
|
|
|
padStart$1(date.getUTCSeconds(), 2, '0'),
|
|
|
utc ? 'Z' : ''
|
|
|
].join('');
|
|
|
};
|
|
|
dateutil.untilStringToDate = function (until) {
|
|
|
var re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z?)?$/;
|
|
|
var bits = re.exec(until);
|
|
|
if (!bits)
|
|
|
throw new Error("Invalid UNTIL value: " + until);
|
|
|
return new Date(Date.UTC(parseInt(bits[1], 10), parseInt(bits[2], 10) - 1, parseInt(bits[3], 10), parseInt(bits[5], 10) || 0, parseInt(bits[6], 10) || 0, parseInt(bits[7], 10) || 0));
|
|
|
};
|
|
|
})(dateutil || (dateutil = {}));
|
|
|
var dateutil$1 = dateutil;
|
|
|
|
|
|
/**
|
|
|
* This class helps us to emulate python's generators, sorta.
|
|
|
*/
|
|
|
var IterResult = /** @class */ (function () {
|
|
|
function IterResult(method, args) {
|
|
|
this.minDate = null;
|
|
|
this.maxDate = null;
|
|
|
this._result = [];
|
|
|
this.total = 0;
|
|
|
this.method = method;
|
|
|
this.args = args;
|
|
|
if (method === 'between') {
|
|
|
this.maxDate = args.inc
|
|
|
? args.before
|
|
|
: new Date(args.before.getTime() - 1);
|
|
|
this.minDate = args.inc ? args.after : new Date(args.after.getTime() + 1);
|
|
|
}
|
|
|
else if (method === 'before') {
|
|
|
this.maxDate = args.inc ? args.dt : new Date(args.dt.getTime() - 1);
|
|
|
}
|
|
|
else if (method === 'after') {
|
|
|
this.minDate = args.inc ? args.dt : new Date(args.dt.getTime() + 1);
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Possibly adds a date into the result.
|
|
|
*
|
|
|
* @param {Date} date - the date isn't necessarly added to the result
|
|
|
* list (if it is too late/too early)
|
|
|
* @return {Boolean} true if it makes sense to continue the iteration
|
|
|
* false if we're done.
|
|
|
*/
|
|
|
IterResult.prototype.accept = function (date) {
|
|
|
++this.total;
|
|
|
var tooEarly = this.minDate && date < this.minDate;
|
|
|
var tooLate = this.maxDate && date > this.maxDate;
|
|
|
if (this.method === 'between') {
|
|
|
if (tooEarly)
|
|
|
return true;
|
|
|
if (tooLate)
|
|
|
return false;
|
|
|
}
|
|
|
else if (this.method === 'before') {
|
|
|
if (tooLate)
|
|
|
return false;
|
|
|
}
|
|
|
else if (this.method === 'after') {
|
|
|
if (tooEarly)
|
|
|
return true;
|
|
|
this.add(date);
|
|
|
return false;
|
|
|
}
|
|
|
return this.add(date);
|
|
|
};
|
|
|
/**
|
|
|
*
|
|
|
* @param {Date} date that is part of the result.
|
|
|
* @return {Boolean} whether we are interested in more values.
|
|
|
*/
|
|
|
IterResult.prototype.add = function (date) {
|
|
|
this._result.push(date);
|
|
|
return true;
|
|
|
};
|
|
|
/**
|
|
|
* 'before' and 'after' return only one date, whereas 'all'
|
|
|
* and 'between' an array.
|
|
|
* @return {Date,Array?}
|
|
|
*/
|
|
|
IterResult.prototype.getValue = function () {
|
|
|
var res = this._result;
|
|
|
switch (this.method) {
|
|
|
case 'all':
|
|
|
case 'between':
|
|
|
return res;
|
|
|
case 'before':
|
|
|
case 'after':
|
|
|
default:
|
|
|
return (res.length ? res[res.length - 1] : null);
|
|
|
}
|
|
|
};
|
|
|
IterResult.prototype.clone = function () {
|
|
|
return new IterResult(this.method, this.args);
|
|
|
};
|
|
|
return IterResult;
|
|
|
}());
|
|
|
|
|
|
/**
|
|
|
* IterResult subclass that calls a callback function on each add,
|
|
|
* and stops iterating when the callback returns false.
|
|
|
*/
|
|
|
var CallbackIterResult = /** @class */ (function (_super) {
|
|
|
__extends(CallbackIterResult, _super);
|
|
|
function CallbackIterResult(method, args, iterator) {
|
|
|
var _this = _super.call(this, method, args) || this;
|
|
|
_this.iterator = iterator;
|
|
|
return _this;
|
|
|
}
|
|
|
CallbackIterResult.prototype.add = function (date) {
|
|
|
if (this.iterator(date, this._result.length)) {
|
|
|
this._result.push(date);
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
};
|
|
|
return CallbackIterResult;
|
|
|
}(IterResult));
|
|
|
|
|
|
// =============================================================================
|
|
|
// i18n
|
|
|
// =============================================================================
|
|
|
var ENGLISH = {
|
|
|
dayNames: [
|
|
|
'Sunday', 'Monday', 'Tuesday', 'Wednesday',
|
|
|
'Thursday', 'Friday', 'Saturday'
|
|
|
],
|
|
|
monthNames: [
|
|
|
'January', 'February', 'March', 'April', 'May',
|
|
|
'June', 'July', 'August', 'September', 'October',
|
|
|
'November', 'December'
|
|
|
],
|
|
|
tokens: {
|
|
|
'SKIP': /^[ \r\n\t]+|^\.$/,
|
|
|
'number': /^[1-9][0-9]*/,
|
|
|
'numberAsText': /^(one|two|three)/i,
|
|
|
'every': /^every/i,
|
|
|
'day(s)': /^days?/i,
|
|
|
'weekday(s)': /^weekdays?/i,
|
|
|
'week(s)': /^weeks?/i,
|
|
|
'hour(s)': /^hours?/i,
|
|
|
'minute(s)': /^minutes?/i,
|
|
|
'month(s)': /^months?/i,
|
|
|
'year(s)': /^years?/i,
|
|
|
'on': /^(on|in)/i,
|
|
|
'at': /^(at)/i,
|
|
|
'the': /^the/i,
|
|
|
'first': /^first/i,
|
|
|
'second': /^second/i,
|
|
|
'third': /^third/i,
|
|
|
'nth': /^([1-9][0-9]*)(\.|th|nd|rd|st)/i,
|
|
|
'last': /^last/i,
|
|
|
'for': /^for/i,
|
|
|
'time(s)': /^times?/i,
|
|
|
'until': /^(un)?til/i,
|
|
|
'monday': /^mo(n(day)?)?/i,
|
|
|
'tuesday': /^tu(e(s(day)?)?)?/i,
|
|
|
'wednesday': /^we(d(n(esday)?)?)?/i,
|
|
|
'thursday': /^th(u(r(sday)?)?)?/i,
|
|
|
'friday': /^fr(i(day)?)?/i,
|
|
|
'saturday': /^sa(t(urday)?)?/i,
|
|
|
'sunday': /^su(n(day)?)?/i,
|
|
|
'january': /^jan(uary)?/i,
|
|
|
'february': /^feb(ruary)?/i,
|
|
|
'march': /^mar(ch)?/i,
|
|
|
'april': /^apr(il)?/i,
|
|
|
'may': /^may/i,
|
|
|
'june': /^june?/i,
|
|
|
'july': /^july?/i,
|
|
|
'august': /^aug(ust)?/i,
|
|
|
'september': /^sep(t(ember)?)?/i,
|
|
|
'october': /^oct(ober)?/i,
|
|
|
'november': /^nov(ember)?/i,
|
|
|
'december': /^dec(ember)?/i,
|
|
|
'comma': /^(,\s*|(and|or)\s*)+/i
|
|
|
}
|
|
|
};
|
|
|
|
|
|
// =============================================================================
|
|
|
// Helper functions
|
|
|
// =============================================================================
|
|
|
/**
|
|
|
* Return true if a value is in an array
|
|
|
*/
|
|
|
var contains = function (arr, val) {
|
|
|
return arr.indexOf(val) !== -1;
|
|
|
};
|
|
|
var defaultGetText = function (id) { return id.toString(); };
|
|
|
var defaultDateFormatter = function (year, month, day) { return month + " " + day + ", " + year; };
|
|
|
/**
|
|
|
*
|
|
|
* @param {RRule} rrule
|
|
|
* Optional:
|
|
|
* @param {Function} gettext function
|
|
|
* @param {Object} language definition
|
|
|
* @constructor
|
|
|
*/
|
|
|
var ToText = /** @class */ (function () {
|
|
|
function ToText(rrule, gettext, language, dateFormatter) {
|
|
|
if (gettext === void 0) { gettext = defaultGetText; }
|
|
|
if (language === void 0) { language = ENGLISH; }
|
|
|
if (dateFormatter === void 0) { dateFormatter = defaultDateFormatter; }
|
|
|
this.text = [];
|
|
|
this.language = language || ENGLISH;
|
|
|
this.gettext = gettext;
|
|
|
this.dateFormatter = dateFormatter;
|
|
|
this.rrule = rrule;
|
|
|
this.options = rrule.options;
|
|
|
this.origOptions = rrule.origOptions;
|
|
|
if (this.origOptions.bymonthday) {
|
|
|
var bymonthday = [].concat(this.options.bymonthday);
|
|
|
var bynmonthday = [].concat(this.options.bynmonthday);
|
|
|
bymonthday.sort(function (a, b) { return a - b; });
|
|
|
bynmonthday.sort(function (a, b) { return b - a; });
|
|
|
// 1, 2, 3, .., -5, -4, -3, ..
|
|
|
this.bymonthday = bymonthday.concat(bynmonthday);
|
|
|
if (!this.bymonthday.length)
|
|
|
this.bymonthday = null;
|
|
|
}
|
|
|
if (isPresent(this.origOptions.byweekday)) {
|
|
|
var byweekday = !isArray(this.origOptions.byweekday)
|
|
|
? [this.origOptions.byweekday]
|
|
|
: this.origOptions.byweekday;
|
|
|
var days = String(byweekday);
|
|
|
this.byweekday = {
|
|
|
allWeeks: byweekday.filter(function (weekday) {
|
|
|
return !weekday.n;
|
|
|
}),
|
|
|
someWeeks: byweekday.filter(function (weekday) {
|
|
|
return Boolean(weekday.n);
|
|
|
}),
|
|
|
isWeekdays: days.indexOf('MO') !== -1 &&
|
|
|
days.indexOf('TU') !== -1 &&
|
|
|
days.indexOf('WE') !== -1 &&
|
|
|
days.indexOf('TH') !== -1 &&
|
|
|
days.indexOf('FR') !== -1 &&
|
|
|
days.indexOf('SA') === -1 &&
|
|
|
days.indexOf('SU') === -1,
|
|
|
isEveryDay: days.indexOf('MO') !== -1 &&
|
|
|
days.indexOf('TU') !== -1 &&
|
|
|
days.indexOf('WE') !== -1 &&
|
|
|
days.indexOf('TH') !== -1 &&
|
|
|
days.indexOf('FR') !== -1 &&
|
|
|
days.indexOf('SA') !== -1 &&
|
|
|
days.indexOf('SU') !== -1
|
|
|
};
|
|
|
var sortWeekDays = function (a, b) {
|
|
|
return a.weekday - b.weekday;
|
|
|
};
|
|
|
this.byweekday.allWeeks.sort(sortWeekDays);
|
|
|
this.byweekday.someWeeks.sort(sortWeekDays);
|
|
|
if (!this.byweekday.allWeeks.length)
|
|
|
this.byweekday.allWeeks = null;
|
|
|
if (!this.byweekday.someWeeks.length)
|
|
|
this.byweekday.someWeeks = null;
|
|
|
}
|
|
|
else {
|
|
|
this.byweekday = null;
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Test whether the rrule can be fully converted to text.
|
|
|
* @param {RRule} rrule
|
|
|
* @return {Boolean}
|
|
|
*/
|
|
|
ToText.isFullyConvertible = function (rrule) {
|
|
|
var canConvert = true;
|
|
|
if (!(rrule.options.freq in ToText.IMPLEMENTED))
|
|
|
return false;
|
|
|
if (rrule.origOptions.until && rrule.origOptions.count)
|
|
|
return false;
|
|
|
for (var key in rrule.origOptions) {
|
|
|
if (contains(['dtstart', 'wkst', 'freq'], key))
|
|
|
return true;
|
|
|
if (!contains(ToText.IMPLEMENTED[rrule.options.freq], key))
|
|
|
return false;
|
|
|
}
|
|
|
return canConvert;
|
|
|
};
|
|
|
ToText.prototype.isFullyConvertible = function () {
|
|
|
return ToText.isFullyConvertible(this.rrule);
|
|
|
};
|
|
|
/**
|
|
|
* Perform the conversion. Only some of the frequencies are supported.
|
|
|
* If some of the rrule's options aren't supported, they'll
|
|
|
* be omitted from the output an "(~ approximate)" will be appended.
|
|
|
* @return {*}
|
|
|
*/
|
|
|
ToText.prototype.toString = function () {
|
|
|
var gettext = this.gettext;
|
|
|
if (!(this.options.freq in ToText.IMPLEMENTED)) {
|
|
|
return gettext('RRule error: Unable to fully convert this rrule to text');
|
|
|
}
|
|
|
this.text = [gettext('every')];
|
|
|
// @ts-ignore
|
|
|
this[RRule.FREQUENCIES[this.options.freq]]();
|
|
|
if (this.options.until) {
|
|
|
this.add(gettext('until'));
|
|
|
var until = this.options.until;
|
|
|
this.add(this.dateFormatter(until.getUTCFullYear(), this.language.monthNames[until.getUTCMonth()], until.getUTCDate()));
|
|
|
}
|
|
|
else if (this.options.count) {
|
|
|
this.add(gettext('for'))
|
|
|
.add(this.options.count.toString())
|
|
|
.add(this.plural(this.options.count) ? gettext('times') : gettext('time'));
|
|
|
}
|
|
|
if (!this.isFullyConvertible())
|
|
|
this.add(gettext('(~ approximate)'));
|
|
|
return this.text.join('');
|
|
|
};
|
|
|
ToText.prototype.HOURLY = function () {
|
|
|
var gettext = this.gettext;
|
|
|
if (this.options.interval !== 1)
|
|
|
this.add(this.options.interval.toString());
|
|
|
this.add(this.plural(this.options.interval) ? gettext('hours') : gettext('hour'));
|
|
|
};
|
|
|
ToText.prototype.MINUTELY = function () {
|
|
|
var gettext = this.gettext;
|
|
|
if (this.options.interval !== 1)
|
|
|
this.add(this.options.interval.toString());
|
|
|
this.add(this.plural(this.options.interval)
|
|
|
? gettext('minutes')
|
|
|
: gettext('minute'));
|
|
|
};
|
|
|
ToText.prototype.DAILY = function () {
|
|
|
var gettext = this.gettext;
|
|
|
if (this.options.interval !== 1)
|
|
|
this.add(this.options.interval.toString());
|
|
|
if (this.byweekday && this.byweekday.isWeekdays) {
|
|
|
this.add(this.plural(this.options.interval)
|
|
|
? gettext('weekdays')
|
|
|
: gettext('weekday'));
|
|
|
}
|
|
|
else {
|
|
|
this.add(this.plural(this.options.interval) ? gettext('days') : gettext('day'));
|
|
|
}
|
|
|
if (this.origOptions.bymonth) {
|
|
|
this.add(gettext('in'));
|
|
|
this._bymonth();
|
|
|
}
|
|
|
if (this.bymonthday) {
|
|
|
this._bymonthday();
|
|
|
}
|
|
|
else if (this.byweekday) {
|
|
|
this._byweekday();
|
|
|
}
|
|
|
else if (this.origOptions.byhour) {
|
|
|
this._byhour();
|
|
|
}
|
|
|
};
|
|
|
ToText.prototype.WEEKLY = function () {
|
|
|
var gettext = this.gettext;
|
|
|
if (this.options.interval !== 1) {
|
|
|
this.add(this.options.interval.toString()).add(this.plural(this.options.interval) ? gettext('weeks') : gettext('week'));
|
|
|
}
|
|
|
if (this.byweekday && this.byweekday.isWeekdays) {
|
|
|
if (this.options.interval === 1) {
|
|
|
this.add(this.plural(this.options.interval)
|
|
|
? gettext('weekdays')
|
|
|
: gettext('weekday'));
|
|
|
}
|
|
|
else {
|
|
|
this.add(gettext('on')).add(gettext('weekdays'));
|
|
|
}
|
|
|
}
|
|
|
else if (this.byweekday && this.byweekday.isEveryDay) {
|
|
|
this.add(this.plural(this.options.interval) ? gettext('days') : gettext('day'));
|
|
|
}
|
|
|
else {
|
|
|
if (this.options.interval === 1)
|
|
|
this.add(gettext('week'));
|
|
|
if (this.origOptions.bymonth) {
|
|
|
this.add(gettext('in'));
|
|
|
this._bymonth();
|
|
|
}
|
|
|
if (this.bymonthday) {
|
|
|
this._bymonthday();
|
|
|
}
|
|
|
else if (this.byweekday) {
|
|
|
this._byweekday();
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
ToText.prototype.MONTHLY = function () {
|
|
|
var gettext = this.gettext;
|
|
|
if (this.origOptions.bymonth) {
|
|
|
if (this.options.interval !== 1) {
|
|
|
this.add(this.options.interval.toString()).add(gettext('months'));
|
|
|
if (this.plural(this.options.interval))
|
|
|
this.add(gettext('in'));
|
|
|
}
|
|
|
this._bymonth();
|
|
|
}
|
|
|
else {
|
|
|
if (this.options.interval !== 1)
|
|
|
this.add(this.options.interval.toString());
|
|
|
this.add(this.plural(this.options.interval)
|
|
|
? gettext('months')
|
|
|
: gettext('month'));
|
|
|
}
|
|
|
if (this.bymonthday) {
|
|
|
this._bymonthday();
|
|
|
}
|
|
|
else if (this.byweekday && this.byweekday.isWeekdays) {
|
|
|
this.add(gettext('on')).add(gettext('weekdays'));
|
|
|
}
|
|
|
else if (this.byweekday) {
|
|
|
this._byweekday();
|
|
|
}
|
|
|
};
|
|
|
ToText.prototype.YEARLY = function () {
|
|
|
var gettext = this.gettext;
|
|
|
if (this.origOptions.bymonth) {
|
|
|
if (this.options.interval !== 1) {
|
|
|
this.add(this.options.interval.toString());
|
|
|
this.add(gettext('years'));
|
|
|
}
|
|
|
this._bymonth();
|
|
|
}
|
|
|
else {
|
|
|
if (this.options.interval !== 1)
|
|
|
this.add(this.options.interval.toString());
|
|
|
this.add(this.plural(this.options.interval) ? gettext('years') : gettext('year'));
|
|
|
}
|
|
|
if (this.bymonthday) {
|
|
|
this._bymonthday();
|
|
|
}
|
|
|
else if (this.byweekday) {
|
|
|
this._byweekday();
|
|
|
}
|
|
|
if (this.options.byyearday) {
|
|
|
this.add(gettext('on the'))
|
|
|
.add(this.list(this.options.byyearday, this.nth, gettext('and')))
|
|
|
.add(gettext('day'));
|
|
|
}
|
|
|
if (this.options.byweekno) {
|
|
|
this.add(gettext('in'))
|
|
|
.add(this.plural(this.options.byweekno.length)
|
|
|
? gettext('weeks')
|
|
|
: gettext('week'))
|
|
|
.add(this.list(this.options.byweekno, undefined, gettext('and')));
|
|
|
}
|
|
|
};
|
|
|
ToText.prototype._bymonthday = function () {
|
|
|
var gettext = this.gettext;
|
|
|
if (this.byweekday && this.byweekday.allWeeks) {
|
|
|
this.add(gettext('on'))
|
|
|
.add(this.list(this.byweekday.allWeeks, this.weekdaytext, gettext('or')))
|
|
|
.add(gettext('the'))
|
|
|
.add(this.list(this.bymonthday, this.nth, gettext('or')));
|
|
|
}
|
|
|
else {
|
|
|
this.add(gettext('on the')).add(this.list(this.bymonthday, this.nth, gettext('and')));
|
|
|
}
|
|
|
// this.add(gettext('DAY'))
|
|
|
};
|
|
|
ToText.prototype._byweekday = function () {
|
|
|
var gettext = this.gettext;
|
|
|
if (this.byweekday.allWeeks && !this.byweekday.isWeekdays) {
|
|
|
this.add(gettext('on')).add(this.list(this.byweekday.allWeeks, this.weekdaytext));
|
|
|
}
|
|
|
if (this.byweekday.someWeeks) {
|
|
|
if (this.byweekday.allWeeks)
|
|
|
this.add(gettext('and'));
|
|
|
this.add(gettext('on the')).add(this.list(this.byweekday.someWeeks, this.weekdaytext, gettext('and')));
|
|
|
}
|
|
|
};
|
|
|
ToText.prototype._byhour = function () {
|
|
|
var gettext = this.gettext;
|
|
|
this.add(gettext('at')).add(this.list(this.origOptions.byhour, undefined, gettext('and')));
|
|
|
};
|
|
|
ToText.prototype._bymonth = function () {
|
|
|
this.add(this.list(this.options.bymonth, this.monthtext, this.gettext('and')));
|
|
|
};
|
|
|
ToText.prototype.nth = function (n) {
|
|
|
n = parseInt(n.toString(), 10);
|
|
|
var nth;
|
|
|
var npos;
|
|
|
var gettext = this.gettext;
|
|
|
if (n === -1)
|
|
|
return gettext('last');
|
|
|
npos = Math.abs(n);
|
|
|
switch (npos) {
|
|
|
case 1:
|
|
|
case 21:
|
|
|
case 31:
|
|
|
nth = npos + gettext('st');
|
|
|
break;
|
|
|
case 2:
|
|
|
case 22:
|
|
|
nth = npos + gettext('nd');
|
|
|
break;
|
|
|
case 3:
|
|
|
case 23:
|
|
|
nth = npos + gettext('rd');
|
|
|
break;
|
|
|
default:
|
|
|
nth = npos + gettext('th');
|
|
|
}
|
|
|
return n < 0 ? nth + ' ' + gettext('last') : nth;
|
|
|
};
|
|
|
ToText.prototype.monthtext = function (m) {
|
|
|
return this.language.monthNames[m - 1];
|
|
|
};
|
|
|
ToText.prototype.weekdaytext = function (wday) {
|
|
|
var weekday = isNumber$1(wday) ? (wday + 1) % 7 : wday.getJsWeekday();
|
|
|
return ((wday.n ? this.nth(wday.n) + ' ' : '') + this.language.dayNames[weekday]);
|
|
|
};
|
|
|
ToText.prototype.plural = function (n) {
|
|
|
return n % 100 !== 1;
|
|
|
};
|
|
|
ToText.prototype.add = function (s) {
|
|
|
this.text.push(' ');
|
|
|
this.text.push(s);
|
|
|
return this;
|
|
|
};
|
|
|
ToText.prototype.list = function (arr, callback, finalDelim, delim) {
|
|
|
if (delim === void 0) { delim = ','; }
|
|
|
if (!isArray(arr)) {
|
|
|
arr = [arr];
|
|
|
}
|
|
|
var delimJoin = function (array, delimiter, finalDelimiter) {
|
|
|
var list = '';
|
|
|
for (var i = 0; i < array.length; i++) {
|
|
|
if (i !== 0) {
|
|
|
if (i === array.length - 1) {
|
|
|
list += ' ' + finalDelimiter + ' ';
|
|
|
}
|
|
|
else {
|
|
|
list += delimiter + ' ';
|
|
|
}
|
|
|
}
|
|
|
list += array[i];
|
|
|
}
|
|
|
return list;
|
|
|
};
|
|
|
callback =
|
|
|
callback ||
|
|
|
function (o) {
|
|
|
return o.toString();
|
|
|
};
|
|
|
var self = this;
|
|
|
var realCallback = function (arg) {
|
|
|
return callback && callback.call(self, arg);
|
|
|
};
|
|
|
if (finalDelim) {
|
|
|
return delimJoin(arr.map(realCallback), delim, finalDelim);
|
|
|
}
|
|
|
else {
|
|
|
return arr.map(realCallback).join(delim + ' ');
|
|
|
}
|
|
|
};
|
|
|
return ToText;
|
|
|
}());
|
|
|
|
|
|
// =============================================================================
|
|
|
// Parser
|
|
|
// =============================================================================
|
|
|
var Parser = /** @class */ (function () {
|
|
|
function Parser(rules) {
|
|
|
this.done = true;
|
|
|
this.rules = rules;
|
|
|
}
|
|
|
Parser.prototype.start = function (text) {
|
|
|
this.text = text;
|
|
|
this.done = false;
|
|
|
return this.nextSymbol();
|
|
|
};
|
|
|
Parser.prototype.isDone = function () {
|
|
|
return this.done && this.symbol === null;
|
|
|
};
|
|
|
Parser.prototype.nextSymbol = function () {
|
|
|
var best;
|
|
|
var bestSymbol;
|
|
|
var p = this;
|
|
|
this.symbol = null;
|
|
|
this.value = null;
|
|
|
do {
|
|
|
if (this.done)
|
|
|
return false;
|
|
|
var rule = void 0;
|
|
|
best = null;
|
|
|
for (var name_1 in this.rules) {
|
|
|
rule = this.rules[name_1];
|
|
|
var match = rule.exec(p.text);
|
|
|
if (match) {
|
|
|
if (best === null || match[0].length > best[0].length) {
|
|
|
best = match;
|
|
|
bestSymbol = name_1;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (best != null) {
|
|
|
this.text = this.text.substr(best[0].length);
|
|
|
if (this.text === '')
|
|
|
this.done = true;
|
|
|
}
|
|
|
if (best == null) {
|
|
|
this.done = true;
|
|
|
this.symbol = null;
|
|
|
this.value = null;
|
|
|
return;
|
|
|
}
|
|
|
// @ts-ignore
|
|
|
} while (bestSymbol === 'SKIP');
|
|
|
// @ts-ignore
|
|
|
this.symbol = bestSymbol;
|
|
|
this.value = best;
|
|
|
return true;
|
|
|
};
|
|
|
Parser.prototype.accept = function (name) {
|
|
|
if (this.symbol === name) {
|
|
|
if (this.value) {
|
|
|
var v = this.value;
|
|
|
this.nextSymbol();
|
|
|
return v;
|
|
|
}
|
|
|
this.nextSymbol();
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
};
|
|
|
Parser.prototype.acceptNumber = function () {
|
|
|
return this.accept('number');
|
|
|
};
|
|
|
Parser.prototype.expect = function (name) {
|
|
|
if (this.accept(name))
|
|
|
return true;
|
|
|
throw new Error('expected ' + name + ' but found ' + this.symbol);
|
|
|
};
|
|
|
return Parser;
|
|
|
}());
|
|
|
function parseText(text, language) {
|
|
|
if (language === void 0) { language = ENGLISH; }
|
|
|
var options = {};
|
|
|
var ttr = new Parser(language.tokens);
|
|
|
if (!ttr.start(text))
|
|
|
return null;
|
|
|
S();
|
|
|
return options;
|
|
|
function S() {
|
|
|
// every [n]
|
|
|
ttr.expect('every');
|
|
|
var n = ttr.acceptNumber();
|
|
|
if (n)
|
|
|
options.interval = parseInt(n[0], 10);
|
|
|
if (ttr.isDone())
|
|
|
throw new Error('Unexpected end');
|
|
|
switch (ttr.symbol) {
|
|
|
case 'day(s)':
|
|
|
options.freq = RRule.DAILY;
|
|
|
if (ttr.nextSymbol()) {
|
|
|
AT();
|
|
|
F();
|
|
|
}
|
|
|
break;
|
|
|
// FIXME Note: every 2 weekdays != every two weeks on weekdays.
|
|
|
// DAILY on weekdays is not a valid rule
|
|
|
case 'weekday(s)':
|
|
|
options.freq = RRule.WEEKLY;
|
|
|
options.byweekday = [
|
|
|
RRule.MO,
|
|
|
RRule.TU,
|
|
|
RRule.WE,
|
|
|
RRule.TH,
|
|
|
RRule.FR
|
|
|
];
|
|
|
ttr.nextSymbol();
|
|
|
F();
|
|
|
break;
|
|
|
case 'week(s)':
|
|
|
options.freq = RRule.WEEKLY;
|
|
|
if (ttr.nextSymbol()) {
|
|
|
ON();
|
|
|
F();
|
|
|
}
|
|
|
break;
|
|
|
case 'hour(s)':
|
|
|
options.freq = RRule.HOURLY;
|
|
|
if (ttr.nextSymbol()) {
|
|
|
ON();
|
|
|
F();
|
|
|
}
|
|
|
break;
|
|
|
case 'minute(s)':
|
|
|
options.freq = RRule.MINUTELY;
|
|
|
if (ttr.nextSymbol()) {
|
|
|
ON();
|
|
|
F();
|
|
|
}
|
|
|
break;
|
|
|
case 'month(s)':
|
|
|
options.freq = RRule.MONTHLY;
|
|
|
if (ttr.nextSymbol()) {
|
|
|
ON();
|
|
|
F();
|
|
|
}
|
|
|
break;
|
|
|
case 'year(s)':
|
|
|
options.freq = RRule.YEARLY;
|
|
|
if (ttr.nextSymbol()) {
|
|
|
ON();
|
|
|
F();
|
|
|
}
|
|
|
break;
|
|
|
case 'monday':
|
|
|
case 'tuesday':
|
|
|
case 'wednesday':
|
|
|
case 'thursday':
|
|
|
case 'friday':
|
|
|
case 'saturday':
|
|
|
case 'sunday':
|
|
|
options.freq = RRule.WEEKLY;
|
|
|
var key = ttr.symbol.substr(0, 2).toUpperCase();
|
|
|
options.byweekday = [RRule[key]];
|
|
|
if (!ttr.nextSymbol())
|
|
|
return;
|
|
|
// TODO check for duplicates
|
|
|
while (ttr.accept('comma')) {
|
|
|
if (ttr.isDone())
|
|
|
throw new Error('Unexpected end');
|
|
|
var wkd = decodeWKD();
|
|
|
if (!wkd) {
|
|
|
throw new Error('Unexpected symbol ' + ttr.symbol + ', expected weekday');
|
|
|
}
|
|
|
// @ts-ignore
|
|
|
options.byweekday.push(RRule[wkd]);
|
|
|
ttr.nextSymbol();
|
|
|
}
|
|
|
MDAYs();
|
|
|
F();
|
|
|
break;
|
|
|
case 'january':
|
|
|
case 'february':
|
|
|
case 'march':
|
|
|
case 'april':
|
|
|
case 'may':
|
|
|
case 'june':
|
|
|
case 'july':
|
|
|
case 'august':
|
|
|
case 'september':
|
|
|
case 'october':
|
|
|
case 'november':
|
|
|
case 'december':
|
|
|
options.freq = RRule.YEARLY;
|
|
|
options.bymonth = [decodeM()];
|
|
|
if (!ttr.nextSymbol())
|
|
|
return;
|
|
|
// TODO check for duplicates
|
|
|
while (ttr.accept('comma')) {
|
|
|
if (ttr.isDone())
|
|
|
throw new Error('Unexpected end');
|
|
|
var m = decodeM();
|
|
|
if (!m) {
|
|
|
throw new Error('Unexpected symbol ' + ttr.symbol + ', expected month');
|
|
|
}
|
|
|
options.bymonth.push(m);
|
|
|
ttr.nextSymbol();
|
|
|
}
|
|
|
ON();
|
|
|
F();
|
|
|
break;
|
|
|
default:
|
|
|
throw new Error('Unknown symbol');
|
|
|
}
|
|
|
}
|
|
|
function ON() {
|
|
|
var on = ttr.accept('on');
|
|
|
var the = ttr.accept('the');
|
|
|
if (!(on || the))
|
|
|
return;
|
|
|
do {
|
|
|
var nth = decodeNTH();
|
|
|
var wkd = decodeWKD();
|
|
|
var m = decodeM();
|
|
|
// nth <weekday> | <weekday>
|
|
|
if (nth) {
|
|
|
// ttr.nextSymbol()
|
|
|
if (wkd) {
|
|
|
ttr.nextSymbol();
|
|
|
if (!options.byweekday)
|
|
|
options.byweekday = [];
|
|
|
// @ts-ignore
|
|
|
options.byweekday.push(RRule[wkd].nth(nth));
|
|
|
}
|
|
|
else {
|
|
|
if (!options.bymonthday)
|
|
|
options.bymonthday = [];
|
|
|
// @ts-ignore
|
|
|
options.bymonthday.push(nth);
|
|
|
ttr.accept('day(s)');
|
|
|
}
|
|
|
// <weekday>
|
|
|
}
|
|
|
else if (wkd) {
|
|
|
ttr.nextSymbol();
|
|
|
if (!options.byweekday)
|
|
|
options.byweekday = [];
|
|
|
// @ts-ignore
|
|
|
options.byweekday.push(RRule[wkd]);
|
|
|
}
|
|
|
else if (ttr.symbol === 'weekday(s)') {
|
|
|
ttr.nextSymbol();
|
|
|
if (!options.byweekday) {
|
|
|
options.byweekday = [
|
|
|
RRule.MO,
|
|
|
RRule.TU,
|
|
|
RRule.WE,
|
|
|
RRule.TH,
|
|
|
RRule.FR
|
|
|
];
|
|
|
}
|
|
|
}
|
|
|
else if (ttr.symbol === 'week(s)') {
|
|
|
ttr.nextSymbol();
|
|
|
var n = ttr.acceptNumber();
|
|
|
if (!n) {
|
|
|
throw new Error('Unexpected symbol ' + ttr.symbol + ', expected week number');
|
|
|
}
|
|
|
options.byweekno = [parseInt(n[0], 10)];
|
|
|
while (ttr.accept('comma')) {
|
|
|
n = ttr.acceptNumber();
|
|
|
if (!n) {
|
|
|
throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday');
|
|
|
}
|
|
|
options.byweekno.push(parseInt(n[0], 10));
|
|
|
}
|
|
|
}
|
|
|
else if (m) {
|
|
|
ttr.nextSymbol();
|
|
|
if (!options.bymonth)
|
|
|
options.bymonth = [];
|
|
|
// @ts-ignore
|
|
|
options.bymonth.push(m);
|
|
|
}
|
|
|
else {
|
|
|
return;
|
|
|
}
|
|
|
} while (ttr.accept('comma') || ttr.accept('the') || ttr.accept('on'));
|
|
|
}
|
|
|
function AT() {
|
|
|
var at = ttr.accept('at');
|
|
|
if (!at)
|
|
|
return;
|
|
|
do {
|
|
|
var n = ttr.acceptNumber();
|
|
|
if (!n) {
|
|
|
throw new Error('Unexpected symbol ' + ttr.symbol + ', expected hour');
|
|
|
}
|
|
|
options.byhour = [parseInt(n[0], 10)];
|
|
|
while (ttr.accept('comma')) {
|
|
|
n = ttr.acceptNumber();
|
|
|
if (!n) {
|
|
|
throw new Error('Unexpected symbol ' + ttr.symbol + '; expected hour');
|
|
|
}
|
|
|
options.byhour.push(parseInt(n[0], 10));
|
|
|
}
|
|
|
} while (ttr.accept('comma') || ttr.accept('at'));
|
|
|
}
|
|
|
function decodeM() {
|
|
|
switch (ttr.symbol) {
|
|
|
case 'january':
|
|
|
return 1;
|
|
|
case 'february':
|
|
|
return 2;
|
|
|
case 'march':
|
|
|
return 3;
|
|
|
case 'april':
|
|
|
return 4;
|
|
|
case 'may':
|
|
|
return 5;
|
|
|
case 'june':
|
|
|
return 6;
|
|
|
case 'july':
|
|
|
return 7;
|
|
|
case 'august':
|
|
|
return 8;
|
|
|
case 'september':
|
|
|
return 9;
|
|
|
case 'october':
|
|
|
return 10;
|
|
|
case 'november':
|
|
|
return 11;
|
|
|
case 'december':
|
|
|
return 12;
|
|
|
default:
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function decodeWKD() {
|
|
|
switch (ttr.symbol) {
|
|
|
case 'monday':
|
|
|
case 'tuesday':
|
|
|
case 'wednesday':
|
|
|
case 'thursday':
|
|
|
case 'friday':
|
|
|
case 'saturday':
|
|
|
case 'sunday':
|
|
|
return ttr.symbol.substr(0, 2).toUpperCase();
|
|
|
default:
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function decodeNTH() {
|
|
|
switch (ttr.symbol) {
|
|
|
case 'last':
|
|
|
ttr.nextSymbol();
|
|
|
return -1;
|
|
|
case 'first':
|
|
|
ttr.nextSymbol();
|
|
|
return 1;
|
|
|
case 'second':
|
|
|
ttr.nextSymbol();
|
|
|
return ttr.accept('last') ? -2 : 2;
|
|
|
case 'third':
|
|
|
ttr.nextSymbol();
|
|
|
return ttr.accept('last') ? -3 : 3;
|
|
|
case 'nth':
|
|
|
var v = parseInt(ttr.value[1], 10);
|
|
|
if (v < -366 || v > 366)
|
|
|
throw new Error('Nth out of range: ' + v);
|
|
|
ttr.nextSymbol();
|
|
|
return ttr.accept('last') ? -v : v;
|
|
|
default:
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function MDAYs() {
|
|
|
ttr.accept('on');
|
|
|
ttr.accept('the');
|
|
|
var nth = decodeNTH();
|
|
|
if (!nth)
|
|
|
return;
|
|
|
options.bymonthday = [nth];
|
|
|
ttr.nextSymbol();
|
|
|
while (ttr.accept('comma')) {
|
|
|
nth = decodeNTH();
|
|
|
if (!nth) {
|
|
|
throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday');
|
|
|
}
|
|
|
options.bymonthday.push(nth);
|
|
|
ttr.nextSymbol();
|
|
|
}
|
|
|
}
|
|
|
function F() {
|
|
|
if (ttr.symbol === 'until') {
|
|
|
var date = Date.parse(ttr.text);
|
|
|
if (!date)
|
|
|
throw new Error('Cannot parse until date:' + ttr.text);
|
|
|
options.until = new Date(date);
|
|
|
}
|
|
|
else if (ttr.accept('for')) {
|
|
|
options.count = parseInt(ttr.value[0], 10);
|
|
|
ttr.expect('number');
|
|
|
// ttr.expect('times')
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var Frequency;
|
|
|
(function (Frequency) {
|
|
|
Frequency[Frequency["YEARLY"] = 0] = "YEARLY";
|
|
|
Frequency[Frequency["MONTHLY"] = 1] = "MONTHLY";
|
|
|
Frequency[Frequency["WEEKLY"] = 2] = "WEEKLY";
|
|
|
Frequency[Frequency["DAILY"] = 3] = "DAILY";
|
|
|
Frequency[Frequency["HOURLY"] = 4] = "HOURLY";
|
|
|
Frequency[Frequency["MINUTELY"] = 5] = "MINUTELY";
|
|
|
Frequency[Frequency["SECONDLY"] = 6] = "SECONDLY";
|
|
|
})(Frequency || (Frequency = {}));
|
|
|
function freqIsDailyOrGreater(freq) {
|
|
|
return freq < Frequency.HOURLY;
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
* rrule.js - Library for working with recurrence rules for calendar dates.
|
|
|
* https://github.com/jakubroztocil/rrule
|
|
|
*
|
|
|
* Copyright 2010, Jakub Roztocil and Lars Schoning
|
|
|
* Licenced under the BSD licence.
|
|
|
* https://github.com/jakubroztocil/rrule/blob/master/LICENCE
|
|
|
*
|
|
|
*/
|
|
|
/**
|
|
|
*
|
|
|
* Implementation of RRule.fromText() and RRule::toText().
|
|
|
*
|
|
|
*
|
|
|
* On the client side, this file needs to be included
|
|
|
* when those functions are used.
|
|
|
*
|
|
|
*/
|
|
|
// =============================================================================
|
|
|
// fromText
|
|
|
// =============================================================================
|
|
|
/**
|
|
|
* Will be able to convert some of the below described rules from
|
|
|
* text format to a rule object.
|
|
|
*
|
|
|
*
|
|
|
* RULES
|
|
|
*
|
|
|
* Every ([n])
|
|
|
* day(s)
|
|
|
* | [weekday], ..., (and) [weekday]
|
|
|
* | weekday(s)
|
|
|
* | week(s)
|
|
|
* | month(s)
|
|
|
* | [month], ..., (and) [month]
|
|
|
* | year(s)
|
|
|
*
|
|
|
*
|
|
|
* Plus 0, 1, or multiple of these:
|
|
|
*
|
|
|
* on [weekday], ..., (or) [weekday] the [monthday], [monthday], ... (or) [monthday]
|
|
|
*
|
|
|
* on [weekday], ..., (and) [weekday]
|
|
|
*
|
|
|
* on the [monthday], [monthday], ... (and) [monthday] (day of the month)
|
|
|
*
|
|
|
* on the [nth-weekday], ..., (and) [nth-weekday] (of the month/year)
|
|
|
*
|
|
|
*
|
|
|
* Plus 0 or 1 of these:
|
|
|
*
|
|
|
* for [n] time(s)
|
|
|
*
|
|
|
* until [date]
|
|
|
*
|
|
|
* Plus (.)
|
|
|
*
|
|
|
*
|
|
|
* Definitely no supported for parsing:
|
|
|
*
|
|
|
* (for year):
|
|
|
* in week(s) [n], ..., (and) [n]
|
|
|
*
|
|
|
* on the [yearday], ..., (and) [n] day of the year
|
|
|
* on day [yearday], ..., (and) [n]
|
|
|
*
|
|
|
*
|
|
|
* NON-TERMINALS
|
|
|
*
|
|
|
* [n]: 1, 2 ..., one, two, three ..
|
|
|
* [month]: January, February, March, April, May, ... December
|
|
|
* [weekday]: Monday, ... Sunday
|
|
|
* [nth-weekday]: first [weekday], 2nd [weekday], ... last [weekday], ...
|
|
|
* [monthday]: first, 1., 2., 1st, 2nd, second, ... 31st, last day, 2nd last day, ..
|
|
|
* [date]:
|
|
|
* [month] (0-31(,) ([year])),
|
|
|
* (the) 0-31.(1-12.([year])),
|
|
|
* (the) 0-31/(1-12/([year])),
|
|
|
* [weekday]
|
|
|
*
|
|
|
* [year]: 0000, 0001, ... 01, 02, ..
|
|
|
*
|
|
|
* Definitely not supported for parsing:
|
|
|
*
|
|
|
* [yearday]: first, 1., 2., 1st, 2nd, second, ... 366th, last day, 2nd last day, ..
|
|
|
*
|
|
|
* @param {String} text
|
|
|
* @return {Object, Boolean} the rule, or null.
|
|
|
*/
|
|
|
var fromText = function (text, language) {
|
|
|
if (language === void 0) { language = ENGLISH; }
|
|
|
return new RRule(parseText(text, language) || undefined);
|
|
|
};
|
|
|
var common = [
|
|
|
'count',
|
|
|
'until',
|
|
|
'interval',
|
|
|
'byweekday',
|
|
|
'bymonthday',
|
|
|
'bymonth'
|
|
|
];
|
|
|
ToText.IMPLEMENTED = [];
|
|
|
ToText.IMPLEMENTED[Frequency.HOURLY] = common;
|
|
|
ToText.IMPLEMENTED[Frequency.MINUTELY] = common;
|
|
|
ToText.IMPLEMENTED[Frequency.DAILY] = ['byhour'].concat(common);
|
|
|
ToText.IMPLEMENTED[Frequency.WEEKLY] = common;
|
|
|
ToText.IMPLEMENTED[Frequency.MONTHLY] = common;
|
|
|
ToText.IMPLEMENTED[Frequency.YEARLY] = ['byweekno', 'byyearday'].concat(common);
|
|
|
// =============================================================================
|
|
|
// Export
|
|
|
// =============================================================================
|
|
|
var toText = function (rrule, gettext, language, dateFormatter) {
|
|
|
return new ToText(rrule, gettext, language, dateFormatter).toString();
|
|
|
};
|
|
|
var isFullyConvertible = ToText.isFullyConvertible;
|
|
|
|
|
|
var Time = /** @class */ (function () {
|
|
|
function Time(hour, minute, second, millisecond) {
|
|
|
this.hour = hour;
|
|
|
this.minute = minute;
|
|
|
this.second = second;
|
|
|
this.millisecond = millisecond || 0;
|
|
|
}
|
|
|
Time.prototype.getHours = function () {
|
|
|
return this.hour;
|
|
|
};
|
|
|
Time.prototype.getMinutes = function () {
|
|
|
return this.minute;
|
|
|
};
|
|
|
Time.prototype.getSeconds = function () {
|
|
|
return this.second;
|
|
|
};
|
|
|
Time.prototype.getMilliseconds = function () {
|
|
|
return this.millisecond;
|
|
|
};
|
|
|
Time.prototype.getTime = function () {
|
|
|
return ((this.hour * 60 * 60 + this.minute * 60 + this.second) * 1000 +
|
|
|
this.millisecond);
|
|
|
};
|
|
|
return Time;
|
|
|
}());
|
|
|
var DateTime$1 = /** @class */ (function (_super) {
|
|
|
__extends(DateTime, _super);
|
|
|
function DateTime(year, month, day, hour, minute, second, millisecond) {
|
|
|
var _this = _super.call(this, hour, minute, second, millisecond) || this;
|
|
|
_this.year = year;
|
|
|
_this.month = month;
|
|
|
_this.day = day;
|
|
|
return _this;
|
|
|
}
|
|
|
DateTime.fromDate = function (date) {
|
|
|
return new this(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.valueOf() % 1000);
|
|
|
};
|
|
|
DateTime.prototype.getWeekday = function () {
|
|
|
return dateutil.getWeekday(new Date(this.getTime()));
|
|
|
};
|
|
|
DateTime.prototype.getTime = function () {
|
|
|
return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond)).getTime();
|
|
|
};
|
|
|
DateTime.prototype.getDay = function () {
|
|
|
return this.day;
|
|
|
};
|
|
|
DateTime.prototype.getMonth = function () {
|
|
|
return this.month;
|
|
|
};
|
|
|
DateTime.prototype.getYear = function () {
|
|
|
return this.year;
|
|
|
};
|
|
|
DateTime.prototype.addYears = function (years) {
|
|
|
this.year += years;
|
|
|
};
|
|
|
DateTime.prototype.addMonths = function (months) {
|
|
|
this.month += months;
|
|
|
if (this.month > 12) {
|
|
|
var yearDiv = Math.floor(this.month / 12);
|
|
|
var monthMod = pymod(this.month, 12);
|
|
|
this.month = monthMod;
|
|
|
this.year += yearDiv;
|
|
|
if (this.month === 0) {
|
|
|
this.month = 12;
|
|
|
--this.year;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
DateTime.prototype.addWeekly = function (days, wkst) {
|
|
|
if (wkst > this.getWeekday()) {
|
|
|
this.day += -(this.getWeekday() + 1 + (6 - wkst)) + days * 7;
|
|
|
}
|
|
|
else {
|
|
|
this.day += -(this.getWeekday() - wkst) + days * 7;
|
|
|
}
|
|
|
this.fixDay();
|
|
|
};
|
|
|
DateTime.prototype.addDaily = function (days) {
|
|
|
this.day += days;
|
|
|
this.fixDay();
|
|
|
};
|
|
|
DateTime.prototype.addHours = function (hours, filtered, byhour) {
|
|
|
if (filtered) {
|
|
|
// Jump to one iteration before next day
|
|
|
this.hour += Math.floor((23 - this.hour) / hours) * hours;
|
|
|
}
|
|
|
while (true) {
|
|
|
this.hour += hours;
|
|
|
var _a = divmod(this.hour, 24), dayDiv = _a.div, hourMod = _a.mod;
|
|
|
if (dayDiv) {
|
|
|
this.hour = hourMod;
|
|
|
this.addDaily(dayDiv);
|
|
|
}
|
|
|
if (empty(byhour) || includes(byhour, this.hour))
|
|
|
break;
|
|
|
}
|
|
|
};
|
|
|
DateTime.prototype.addMinutes = function (minutes, filtered, byhour, byminute) {
|
|
|
if (filtered) {
|
|
|
// Jump to one iteration before next day
|
|
|
this.minute +=
|
|
|
Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes;
|
|
|
}
|
|
|
while (true) {
|
|
|
this.minute += minutes;
|
|
|
var _a = divmod(this.minute, 60), hourDiv = _a.div, minuteMod = _a.mod;
|
|
|
if (hourDiv) {
|
|
|
this.minute = minuteMod;
|
|
|
this.addHours(hourDiv, false, byhour);
|
|
|
}
|
|
|
if ((empty(byhour) || includes(byhour, this.hour)) &&
|
|
|
(empty(byminute) || includes(byminute, this.minute))) {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
DateTime.prototype.addSeconds = function (seconds, filtered, byhour, byminute, bysecond) {
|
|
|
if (filtered) {
|
|
|
// Jump to one iteration before next day
|
|
|
this.second +=
|
|
|
Math.floor((86399 - (this.hour * 3600 + this.minute * 60 + this.second)) / seconds) * seconds;
|
|
|
}
|
|
|
while (true) {
|
|
|
this.second += seconds;
|
|
|
var _a = divmod(this.second, 60), minuteDiv = _a.div, secondMod = _a.mod;
|
|
|
if (minuteDiv) {
|
|
|
this.second = secondMod;
|
|
|
this.addMinutes(minuteDiv, false, byhour, byminute);
|
|
|
}
|
|
|
if ((empty(byhour) || includes(byhour, this.hour)) &&
|
|
|
(empty(byminute) || includes(byminute, this.minute)) &&
|
|
|
(empty(bysecond) || includes(bysecond, this.second))) {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
DateTime.prototype.fixDay = function () {
|
|
|
if (this.day <= 28) {
|
|
|
return;
|
|
|
}
|
|
|
var daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1];
|
|
|
if (this.day <= daysinmonth) {
|
|
|
return;
|
|
|
}
|
|
|
while (this.day > daysinmonth) {
|
|
|
this.day -= daysinmonth;
|
|
|
++this.month;
|
|
|
if (this.month === 13) {
|
|
|
this.month = 1;
|
|
|
++this.year;
|
|
|
if (this.year > dateutil.MAXYEAR) {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1];
|
|
|
}
|
|
|
};
|
|
|
DateTime.prototype.add = function (options, filtered) {
|
|
|
var freq = options.freq, interval = options.interval, wkst = options.wkst, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond;
|
|
|
switch (freq) {
|
|
|
case Frequency.YEARLY: return this.addYears(interval);
|
|
|
case Frequency.MONTHLY: return this.addMonths(interval);
|
|
|
case Frequency.WEEKLY: return this.addWeekly(interval, wkst);
|
|
|
case Frequency.DAILY: return this.addDaily(interval);
|
|
|
case Frequency.HOURLY: return this.addHours(interval, filtered, byhour);
|
|
|
case Frequency.MINUTELY: return this.addMinutes(interval, filtered, byhour, byminute);
|
|
|
case Frequency.SECONDLY: return this.addSeconds(interval, filtered, byhour, byminute, bysecond);
|
|
|
}
|
|
|
};
|
|
|
return DateTime;
|
|
|
}(Time));
|
|
|
|
|
|
function initializeOptions$1(options) {
|
|
|
var invalid = [];
|
|
|
var keys = Object.keys(options);
|
|
|
// Shallow copy for options and origOptions and check for invalid
|
|
|
for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
|
|
|
var key = keys_1[_i];
|
|
|
if (!includes(defaultKeys, key))
|
|
|
invalid.push(key);
|
|
|
if (dateutil$1.isDate(options[key]) && !dateutil$1.isValidDate(options[key]))
|
|
|
invalid.push(key);
|
|
|
}
|
|
|
if (invalid.length) {
|
|
|
throw new Error('Invalid options: ' + invalid.join(', '));
|
|
|
}
|
|
|
return __assign({}, options);
|
|
|
}
|
|
|
function parseOptions(options) {
|
|
|
var opts = __assign(__assign({}, DEFAULT_OPTIONS$1), initializeOptions$1(options));
|
|
|
if (isPresent(opts.byeaster))
|
|
|
opts.freq = RRule.YEARLY;
|
|
|
if (!(isPresent(opts.freq) && RRule.FREQUENCIES[opts.freq])) {
|
|
|
throw new Error("Invalid frequency: " + opts.freq + " " + options.freq);
|
|
|
}
|
|
|
if (!opts.dtstart)
|
|
|
opts.dtstart = new Date(new Date().setMilliseconds(0));
|
|
|
if (!isPresent(opts.wkst)) {
|
|
|
opts.wkst = RRule.MO.weekday;
|
|
|
}
|
|
|
else if (isNumber$1(opts.wkst)) ;
|
|
|
else {
|
|
|
opts.wkst = opts.wkst.weekday;
|
|
|
}
|
|
|
if (isPresent(opts.bysetpos)) {
|
|
|
if (isNumber$1(opts.bysetpos))
|
|
|
opts.bysetpos = [opts.bysetpos];
|
|
|
for (var i = 0; i < opts.bysetpos.length; i++) {
|
|
|
var v = opts.bysetpos[i];
|
|
|
if (v === 0 || !(v >= -366 && v <= 366)) {
|
|
|
throw new Error('bysetpos must be between 1 and 366,' + ' or between -366 and -1');
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (!(Boolean(opts.byweekno) ||
|
|
|
notEmpty(opts.byweekno) ||
|
|
|
notEmpty(opts.byyearday) ||
|
|
|
Boolean(opts.bymonthday) ||
|
|
|
notEmpty(opts.bymonthday) ||
|
|
|
isPresent(opts.byweekday) ||
|
|
|
isPresent(opts.byeaster))) {
|
|
|
switch (opts.freq) {
|
|
|
case RRule.YEARLY:
|
|
|
if (!opts.bymonth)
|
|
|
opts.bymonth = opts.dtstart.getUTCMonth() + 1;
|
|
|
opts.bymonthday = opts.dtstart.getUTCDate();
|
|
|
break;
|
|
|
case RRule.MONTHLY:
|
|
|
opts.bymonthday = opts.dtstart.getUTCDate();
|
|
|
break;
|
|
|
case RRule.WEEKLY:
|
|
|
opts.byweekday = [dateutil$1.getWeekday(opts.dtstart)];
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
// bymonth
|
|
|
if (isPresent(opts.bymonth) && !isArray(opts.bymonth)) {
|
|
|
opts.bymonth = [opts.bymonth];
|
|
|
}
|
|
|
// byyearday
|
|
|
if (isPresent(opts.byyearday) &&
|
|
|
!isArray(opts.byyearday) &&
|
|
|
isNumber$1(opts.byyearday)) {
|
|
|
opts.byyearday = [opts.byyearday];
|
|
|
}
|
|
|
// bymonthday
|
|
|
if (!isPresent(opts.bymonthday)) {
|
|
|
opts.bymonthday = [];
|
|
|
opts.bynmonthday = [];
|
|
|
}
|
|
|
else if (isArray(opts.bymonthday)) {
|
|
|
var bymonthday = [];
|
|
|
var bynmonthday = [];
|
|
|
for (var i = 0; i < opts.bymonthday.length; i++) {
|
|
|
var v = opts.bymonthday[i];
|
|
|
if (v > 0) {
|
|
|
bymonthday.push(v);
|
|
|
}
|
|
|
else if (v < 0) {
|
|
|
bynmonthday.push(v);
|
|
|
}
|
|
|
}
|
|
|
opts.bymonthday = bymonthday;
|
|
|
opts.bynmonthday = bynmonthday;
|
|
|
}
|
|
|
else if (opts.bymonthday < 0) {
|
|
|
opts.bynmonthday = [opts.bymonthday];
|
|
|
opts.bymonthday = [];
|
|
|
}
|
|
|
else {
|
|
|
opts.bynmonthday = [];
|
|
|
opts.bymonthday = [opts.bymonthday];
|
|
|
}
|
|
|
// byweekno
|
|
|
if (isPresent(opts.byweekno) && !isArray(opts.byweekno)) {
|
|
|
opts.byweekno = [opts.byweekno];
|
|
|
}
|
|
|
// byweekday / bynweekday
|
|
|
if (!isPresent(opts.byweekday)) {
|
|
|
opts.bynweekday = null;
|
|
|
}
|
|
|
else if (isNumber$1(opts.byweekday)) {
|
|
|
opts.byweekday = [opts.byweekday];
|
|
|
opts.bynweekday = null;
|
|
|
}
|
|
|
else if (isWeekdayStr(opts.byweekday)) {
|
|
|
opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday];
|
|
|
opts.bynweekday = null;
|
|
|
}
|
|
|
else if (opts.byweekday instanceof Weekday) {
|
|
|
if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) {
|
|
|
opts.byweekday = [opts.byweekday.weekday];
|
|
|
opts.bynweekday = null;
|
|
|
}
|
|
|
else {
|
|
|
opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]];
|
|
|
opts.byweekday = null;
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
var byweekday = [];
|
|
|
var bynweekday = [];
|
|
|
for (var i = 0; i < opts.byweekday.length; i++) {
|
|
|
var wday = opts.byweekday[i];
|
|
|
if (isNumber$1(wday)) {
|
|
|
byweekday.push(wday);
|
|
|
continue;
|
|
|
}
|
|
|
else if (isWeekdayStr(wday)) {
|
|
|
byweekday.push(Weekday.fromStr(wday).weekday);
|
|
|
continue;
|
|
|
}
|
|
|
if (!wday.n || opts.freq > RRule.MONTHLY) {
|
|
|
byweekday.push(wday.weekday);
|
|
|
}
|
|
|
else {
|
|
|
bynweekday.push([wday.weekday, wday.n]);
|
|
|
}
|
|
|
}
|
|
|
opts.byweekday = notEmpty(byweekday) ? byweekday : null;
|
|
|
opts.bynweekday = notEmpty(bynweekday) ? bynweekday : null;
|
|
|
}
|
|
|
// byhour
|
|
|
if (!isPresent(opts.byhour)) {
|
|
|
opts.byhour =
|
|
|
opts.freq < RRule.HOURLY ? [opts.dtstart.getUTCHours()] : null;
|
|
|
}
|
|
|
else if (isNumber$1(opts.byhour)) {
|
|
|
opts.byhour = [opts.byhour];
|
|
|
}
|
|
|
// byminute
|
|
|
if (!isPresent(opts.byminute)) {
|
|
|
opts.byminute =
|
|
|
opts.freq < RRule.MINUTELY ? [opts.dtstart.getUTCMinutes()] : null;
|
|
|
}
|
|
|
else if (isNumber$1(opts.byminute)) {
|
|
|
opts.byminute = [opts.byminute];
|
|
|
}
|
|
|
// bysecond
|
|
|
if (!isPresent(opts.bysecond)) {
|
|
|
opts.bysecond =
|
|
|
opts.freq < RRule.SECONDLY ? [opts.dtstart.getUTCSeconds()] : null;
|
|
|
}
|
|
|
else if (isNumber$1(opts.bysecond)) {
|
|
|
opts.bysecond = [opts.bysecond];
|
|
|
}
|
|
|
return { parsedOptions: opts };
|
|
|
}
|
|
|
function buildTimeset(opts) {
|
|
|
var millisecondModulo = opts.dtstart.getTime() % 1000;
|
|
|
if (!freqIsDailyOrGreater(opts.freq)) {
|
|
|
return [];
|
|
|
}
|
|
|
var timeset = [];
|
|
|
opts.byhour.forEach(function (hour) {
|
|
|
opts.byminute.forEach(function (minute) {
|
|
|
opts.bysecond.forEach(function (second) {
|
|
|
timeset.push(new Time(hour, minute, second, millisecondModulo));
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
return timeset;
|
|
|
}
|
|
|
|
|
|
function parseString(rfcString) {
|
|
|
var options = rfcString.split('\n').map(parseLine).filter(function (x) { return x !== null; });
|
|
|
return __assign(__assign({}, options[0]), options[1]);
|
|
|
}
|
|
|
function parseDtstart(line) {
|
|
|
var options = {};
|
|
|
var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec(line);
|
|
|
if (!dtstartWithZone) {
|
|
|
return options;
|
|
|
}
|
|
|
dtstartWithZone[0]; var tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2];
|
|
|
if (tzid) {
|
|
|
options.tzid = tzid;
|
|
|
}
|
|
|
options.dtstart = dateutil$1.untilStringToDate(dtstart);
|
|
|
return options;
|
|
|
}
|
|
|
function parseLine(rfcString) {
|
|
|
rfcString = rfcString.replace(/^\s+|\s+$/, '');
|
|
|
if (!rfcString.length)
|
|
|
return null;
|
|
|
var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase());
|
|
|
if (!header) {
|
|
|
return parseRrule(rfcString);
|
|
|
}
|
|
|
header[0]; var key = header[1];
|
|
|
switch (key.toUpperCase()) {
|
|
|
case 'RRULE':
|
|
|
case 'EXRULE':
|
|
|
return parseRrule(rfcString);
|
|
|
case 'DTSTART':
|
|
|
return parseDtstart(rfcString);
|
|
|
default:
|
|
|
throw new Error("Unsupported RFC prop " + key + " in " + rfcString);
|
|
|
}
|
|
|
}
|
|
|
function parseRrule(line) {
|
|
|
var strippedLine = line.replace(/^RRULE:/i, '');
|
|
|
var options = parseDtstart(strippedLine);
|
|
|
var attrs = line.replace(/^(?:RRULE|EXRULE):/i, '').split(';');
|
|
|
attrs.forEach(function (attr) {
|
|
|
var _a = attr.split('='), key = _a[0], value = _a[1];
|
|
|
switch (key.toUpperCase()) {
|
|
|
case 'FREQ':
|
|
|
options.freq = Frequency[value.toUpperCase()];
|
|
|
break;
|
|
|
case 'WKST':
|
|
|
options.wkst = Days[value.toUpperCase()];
|
|
|
break;
|
|
|
case 'COUNT':
|
|
|
case 'INTERVAL':
|
|
|
case 'BYSETPOS':
|
|
|
case 'BYMONTH':
|
|
|
case 'BYMONTHDAY':
|
|
|
case 'BYYEARDAY':
|
|
|
case 'BYWEEKNO':
|
|
|
case 'BYHOUR':
|
|
|
case 'BYMINUTE':
|
|
|
case 'BYSECOND':
|
|
|
var num = parseNumber(value);
|
|
|
var optionKey = key.toLowerCase();
|
|
|
// @ts-ignore
|
|
|
options[optionKey] = num;
|
|
|
break;
|
|
|
case 'BYWEEKDAY':
|
|
|
case 'BYDAY':
|
|
|
options.byweekday = parseWeekday(value);
|
|
|
break;
|
|
|
case 'DTSTART':
|
|
|
case 'TZID':
|
|
|
// for backwards compatibility
|
|
|
var dtstart = parseDtstart(line);
|
|
|
options.tzid = dtstart.tzid;
|
|
|
options.dtstart = dtstart.dtstart;
|
|
|
break;
|
|
|
case 'UNTIL':
|
|
|
options.until = dateutil$1.untilStringToDate(value);
|
|
|
break;
|
|
|
case 'BYEASTER':
|
|
|
options.byeaster = Number(value);
|
|
|
break;
|
|
|
default:
|
|
|
throw new Error("Unknown RRULE property '" + key + "'");
|
|
|
}
|
|
|
});
|
|
|
return options;
|
|
|
}
|
|
|
function parseNumber(value) {
|
|
|
if (value.indexOf(',') !== -1) {
|
|
|
var values = value.split(',');
|
|
|
return values.map(parseIndividualNumber);
|
|
|
}
|
|
|
return parseIndividualNumber(value);
|
|
|
}
|
|
|
function parseIndividualNumber(value) {
|
|
|
if (/^[+-]?\d+$/.test(value)) {
|
|
|
return Number(value);
|
|
|
}
|
|
|
return value;
|
|
|
}
|
|
|
function parseWeekday(value) {
|
|
|
var days = value.split(',');
|
|
|
return days.map(function (day) {
|
|
|
if (day.length === 2) {
|
|
|
// MO, TU, ...
|
|
|
return Days[day]; // wday instanceof Weekday
|
|
|
}
|
|
|
// -1MO, +3FR, 1SO, 13TU ...
|
|
|
var parts = day.match(/^([+-]?\d{1,2})([A-Z]{2})$/);
|
|
|
var n = Number(parts[1]);
|
|
|
var wdaypart = parts[2];
|
|
|
var wday = Days[wdaypart].weekday;
|
|
|
return new Weekday(wday, n);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// these aren't really private, but nor are they really useful to document
|
|
|
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
class LuxonError extends Error {}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
|
|
|
class InvalidDateTimeError extends LuxonError {
|
|
|
constructor(reason) {
|
|
|
super(`Invalid DateTime: ${reason.toMessage()}`);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
class InvalidIntervalError extends LuxonError {
|
|
|
constructor(reason) {
|
|
|
super(`Invalid Interval: ${reason.toMessage()}`);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
class InvalidDurationError extends LuxonError {
|
|
|
constructor(reason) {
|
|
|
super(`Invalid Duration: ${reason.toMessage()}`);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
class ConflictingSpecificationError extends LuxonError {}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
class InvalidUnitError extends LuxonError {
|
|
|
constructor(unit) {
|
|
|
super(`Invalid unit ${unit}`);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
class InvalidArgumentError extends LuxonError {}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
class ZoneIsAbstractError extends LuxonError {
|
|
|
constructor() {
|
|
|
super("Zone is an abstract class");
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
const n = "numeric",
|
|
|
s = "short",
|
|
|
l = "long";
|
|
|
const DATE_SHORT = {
|
|
|
year: n,
|
|
|
month: n,
|
|
|
day: n
|
|
|
};
|
|
|
const DATE_MED = {
|
|
|
year: n,
|
|
|
month: s,
|
|
|
day: n
|
|
|
};
|
|
|
const DATE_MED_WITH_WEEKDAY = {
|
|
|
year: n,
|
|
|
month: s,
|
|
|
day: n,
|
|
|
weekday: s
|
|
|
};
|
|
|
const DATE_FULL = {
|
|
|
year: n,
|
|
|
month: l,
|
|
|
day: n
|
|
|
};
|
|
|
const DATE_HUGE = {
|
|
|
year: n,
|
|
|
month: l,
|
|
|
day: n,
|
|
|
weekday: l
|
|
|
};
|
|
|
const TIME_SIMPLE = {
|
|
|
hour: n,
|
|
|
minute: n
|
|
|
};
|
|
|
const TIME_WITH_SECONDS = {
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
second: n
|
|
|
};
|
|
|
const TIME_WITH_SHORT_OFFSET = {
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
second: n,
|
|
|
timeZoneName: s
|
|
|
};
|
|
|
const TIME_WITH_LONG_OFFSET = {
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
second: n,
|
|
|
timeZoneName: l
|
|
|
};
|
|
|
const TIME_24_SIMPLE = {
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
hour12: false
|
|
|
};
|
|
|
/**
|
|
|
* {@link toLocaleString}; format like '09:30:23', always 24-hour.
|
|
|
*/
|
|
|
|
|
|
const TIME_24_WITH_SECONDS = {
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
second: n,
|
|
|
hour12: false
|
|
|
};
|
|
|
/**
|
|
|
* {@link toLocaleString}; format like '09:30:23 EDT', always 24-hour.
|
|
|
*/
|
|
|
|
|
|
const TIME_24_WITH_SHORT_OFFSET = {
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
second: n,
|
|
|
hour12: false,
|
|
|
timeZoneName: s
|
|
|
};
|
|
|
/**
|
|
|
* {@link toLocaleString}; format like '09:30:23 Eastern Daylight Time', always 24-hour.
|
|
|
*/
|
|
|
|
|
|
const TIME_24_WITH_LONG_OFFSET = {
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
second: n,
|
|
|
hour12: false,
|
|
|
timeZoneName: l
|
|
|
};
|
|
|
/**
|
|
|
* {@link toLocaleString}; format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.
|
|
|
*/
|
|
|
|
|
|
const DATETIME_SHORT = {
|
|
|
year: n,
|
|
|
month: n,
|
|
|
day: n,
|
|
|
hour: n,
|
|
|
minute: n
|
|
|
};
|
|
|
/**
|
|
|
* {@link toLocaleString}; format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.
|
|
|
*/
|
|
|
|
|
|
const DATETIME_SHORT_WITH_SECONDS = {
|
|
|
year: n,
|
|
|
month: n,
|
|
|
day: n,
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
second: n
|
|
|
};
|
|
|
const DATETIME_MED = {
|
|
|
year: n,
|
|
|
month: s,
|
|
|
day: n,
|
|
|
hour: n,
|
|
|
minute: n
|
|
|
};
|
|
|
const DATETIME_MED_WITH_SECONDS = {
|
|
|
year: n,
|
|
|
month: s,
|
|
|
day: n,
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
second: n
|
|
|
};
|
|
|
const DATETIME_MED_WITH_WEEKDAY = {
|
|
|
year: n,
|
|
|
month: s,
|
|
|
day: n,
|
|
|
weekday: s,
|
|
|
hour: n,
|
|
|
minute: n
|
|
|
};
|
|
|
const DATETIME_FULL = {
|
|
|
year: n,
|
|
|
month: l,
|
|
|
day: n,
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
timeZoneName: s
|
|
|
};
|
|
|
const DATETIME_FULL_WITH_SECONDS = {
|
|
|
year: n,
|
|
|
month: l,
|
|
|
day: n,
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
second: n,
|
|
|
timeZoneName: s
|
|
|
};
|
|
|
const DATETIME_HUGE = {
|
|
|
year: n,
|
|
|
month: l,
|
|
|
day: n,
|
|
|
weekday: l,
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
timeZoneName: l
|
|
|
};
|
|
|
const DATETIME_HUGE_WITH_SECONDS = {
|
|
|
year: n,
|
|
|
month: l,
|
|
|
day: n,
|
|
|
weekday: l,
|
|
|
hour: n,
|
|
|
minute: n,
|
|
|
second: n,
|
|
|
timeZoneName: l
|
|
|
};
|
|
|
|
|
|
/*
|
|
|
This is just a junk drawer, containing anything used across multiple classes.
|
|
|
Because Luxon is small(ish), this should stay small and we won't worry about splitting
|
|
|
it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.
|
|
|
*/
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
// TYPES
|
|
|
|
|
|
function isUndefined(o) {
|
|
|
return typeof o === "undefined";
|
|
|
}
|
|
|
function isNumber(o) {
|
|
|
return typeof o === "number";
|
|
|
}
|
|
|
function isInteger(o) {
|
|
|
return typeof o === "number" && o % 1 === 0;
|
|
|
}
|
|
|
function isString(o) {
|
|
|
return typeof o === "string";
|
|
|
}
|
|
|
function isDate(o) {
|
|
|
return Object.prototype.toString.call(o) === "[object Date]";
|
|
|
} // CAPABILITIES
|
|
|
|
|
|
function hasIntl() {
|
|
|
try {
|
|
|
return typeof Intl !== "undefined" && Intl.DateTimeFormat;
|
|
|
} catch (e) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function hasFormatToParts() {
|
|
|
return !isUndefined(Intl.DateTimeFormat.prototype.formatToParts);
|
|
|
}
|
|
|
function hasRelative() {
|
|
|
try {
|
|
|
return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat;
|
|
|
} catch (e) {
|
|
|
return false;
|
|
|
}
|
|
|
} // OBJECTS AND ARRAYS
|
|
|
|
|
|
function maybeArray(thing) {
|
|
|
return Array.isArray(thing) ? thing : [thing];
|
|
|
}
|
|
|
function bestBy(arr, by, compare) {
|
|
|
if (arr.length === 0) {
|
|
|
return undefined;
|
|
|
}
|
|
|
|
|
|
return arr.reduce((best, next) => {
|
|
|
const pair = [by(next), next];
|
|
|
|
|
|
if (!best) {
|
|
|
return pair;
|
|
|
} else if (compare(best[0], pair[0]) === best[0]) {
|
|
|
return best;
|
|
|
} else {
|
|
|
return pair;
|
|
|
}
|
|
|
}, null)[1];
|
|
|
}
|
|
|
function pick(obj, keys) {
|
|
|
return keys.reduce((a, k) => {
|
|
|
a[k] = obj[k];
|
|
|
return a;
|
|
|
}, {});
|
|
|
}
|
|
|
function hasOwnProperty(obj, prop) {
|
|
|
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
|
} // NUMBERS AND STRINGS
|
|
|
|
|
|
function integerBetween(thing, bottom, top) {
|
|
|
return isInteger(thing) && thing >= bottom && thing <= top;
|
|
|
} // x % n but takes the sign of n instead of x
|
|
|
|
|
|
function floorMod(x, n) {
|
|
|
return x - n * Math.floor(x / n);
|
|
|
}
|
|
|
function padStart(input, n = 2) {
|
|
|
const minus = input < 0 ? "-" : "";
|
|
|
const target = minus ? input * -1 : input;
|
|
|
let result;
|
|
|
|
|
|
if (target.toString().length < n) {
|
|
|
result = ("0".repeat(n) + target).slice(-n);
|
|
|
} else {
|
|
|
result = target.toString();
|
|
|
}
|
|
|
|
|
|
return `${minus}${result}`;
|
|
|
}
|
|
|
function parseInteger(string) {
|
|
|
if (isUndefined(string) || string === null || string === "") {
|
|
|
return undefined;
|
|
|
} else {
|
|
|
return parseInt(string, 10);
|
|
|
}
|
|
|
}
|
|
|
function parseMillis(fraction) {
|
|
|
// Return undefined (instead of 0) in these cases, where fraction is not set
|
|
|
if (isUndefined(fraction) || fraction === null || fraction === "") {
|
|
|
return undefined;
|
|
|
} else {
|
|
|
const f = parseFloat("0." + fraction) * 1000;
|
|
|
return Math.floor(f);
|
|
|
}
|
|
|
}
|
|
|
function roundTo(number, digits, towardZero = false) {
|
|
|
const factor = Math.pow(10, digits),
|
|
|
rounder = towardZero ? Math.trunc : Math.round;
|
|
|
return rounder(number * factor) / factor;
|
|
|
} // DATE BASICS
|
|
|
|
|
|
function isLeapYear(year) {
|
|
|
return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
|
|
|
}
|
|
|
function daysInYear(year) {
|
|
|
return isLeapYear(year) ? 366 : 365;
|
|
|
}
|
|
|
function daysInMonth(year, month) {
|
|
|
const modMonth = floorMod(month - 1, 12) + 1,
|
|
|
modYear = year + (month - modMonth) / 12;
|
|
|
|
|
|
if (modMonth === 2) {
|
|
|
return isLeapYear(modYear) ? 29 : 28;
|
|
|
} else {
|
|
|
return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];
|
|
|
}
|
|
|
} // covert a calendar object to a local timestamp (epoch, but with the offset baked in)
|
|
|
|
|
|
function objToLocalTS(obj) {
|
|
|
let d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that
|
|
|
|
|
|
if (obj.year < 100 && obj.year >= 0) {
|
|
|
d = new Date(d);
|
|
|
d.setUTCFullYear(d.getUTCFullYear() - 1900);
|
|
|
}
|
|
|
|
|
|
return +d;
|
|
|
}
|
|
|
function weeksInWeekYear(weekYear) {
|
|
|
const p1 = (weekYear + Math.floor(weekYear / 4) - Math.floor(weekYear / 100) + Math.floor(weekYear / 400)) % 7,
|
|
|
last = weekYear - 1,
|
|
|
p2 = (last + Math.floor(last / 4) - Math.floor(last / 100) + Math.floor(last / 400)) % 7;
|
|
|
return p1 === 4 || p2 === 3 ? 53 : 52;
|
|
|
}
|
|
|
function untruncateYear(year) {
|
|
|
if (year > 99) {
|
|
|
return year;
|
|
|
} else return year > 60 ? 1900 + year : 2000 + year;
|
|
|
} // PARSING
|
|
|
|
|
|
function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {
|
|
|
const date = new Date(ts),
|
|
|
intlOpts = {
|
|
|
hour12: false,
|
|
|
year: "numeric",
|
|
|
month: "2-digit",
|
|
|
day: "2-digit",
|
|
|
hour: "2-digit",
|
|
|
minute: "2-digit"
|
|
|
};
|
|
|
|
|
|
if (timeZone) {
|
|
|
intlOpts.timeZone = timeZone;
|
|
|
}
|
|
|
|
|
|
const modified = Object.assign({
|
|
|
timeZoneName: offsetFormat
|
|
|
}, intlOpts),
|
|
|
intl = hasIntl();
|
|
|
|
|
|
if (intl && hasFormatToParts()) {
|
|
|
const parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(m => m.type.toLowerCase() === "timezonename");
|
|
|
return parsed ? parsed.value : null;
|
|
|
} else if (intl) {
|
|
|
// this probably doesn't work for all locales
|
|
|
const without = new Intl.DateTimeFormat(locale, intlOpts).format(date),
|
|
|
included = new Intl.DateTimeFormat(locale, modified).format(date),
|
|
|
diffed = included.substring(without.length),
|
|
|
trimmed = diffed.replace(/^[, \u200e]+/, "");
|
|
|
return trimmed;
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
} // signedOffset('-5', '30') -> -330
|
|
|
|
|
|
function signedOffset(offHourStr, offMinuteStr) {
|
|
|
let offHour = parseInt(offHourStr, 10); // don't || this because we want to preserve -0
|
|
|
|
|
|
if (Number.isNaN(offHour)) {
|
|
|
offHour = 0;
|
|
|
}
|
|
|
|
|
|
const offMin = parseInt(offMinuteStr, 10) || 0,
|
|
|
offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;
|
|
|
return offHour * 60 + offMinSigned;
|
|
|
} // COERCION
|
|
|
|
|
|
function asNumber(value) {
|
|
|
const numericValue = Number(value);
|
|
|
if (typeof value === "boolean" || value === "" || Number.isNaN(numericValue)) throw new InvalidArgumentError(`Invalid unit value ${value}`);
|
|
|
return numericValue;
|
|
|
}
|
|
|
function normalizeObject(obj, normalizer, nonUnitKeys) {
|
|
|
const normalized = {};
|
|
|
|
|
|
for (const u in obj) {
|
|
|
if (hasOwnProperty(obj, u)) {
|
|
|
if (nonUnitKeys.indexOf(u) >= 0) continue;
|
|
|
const v = obj[u];
|
|
|
if (v === undefined || v === null) continue;
|
|
|
normalized[normalizer(u)] = asNumber(v);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return normalized;
|
|
|
}
|
|
|
function formatOffset(offset, format) {
|
|
|
const hours = Math.trunc(Math.abs(offset / 60)),
|
|
|
minutes = Math.trunc(Math.abs(offset % 60)),
|
|
|
sign = offset >= 0 ? "+" : "-";
|
|
|
|
|
|
switch (format) {
|
|
|
case "short":
|
|
|
return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;
|
|
|
|
|
|
case "narrow":
|
|
|
return `${sign}${hours}${minutes > 0 ? `:${minutes}` : ""}`;
|
|
|
|
|
|
case "techie":
|
|
|
return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;
|
|
|
|
|
|
default:
|
|
|
throw new RangeError(`Value format ${format} is out of range for property format`);
|
|
|
}
|
|
|
}
|
|
|
function timeObject(obj) {
|
|
|
return pick(obj, ["hour", "minute", "second", "millisecond"]);
|
|
|
}
|
|
|
const ianaRegex = /[A-Za-z_+-]{1,256}(:?\/[A-Za-z_+-]{1,256}(\/[A-Za-z_+-]{1,256})?)?/;
|
|
|
|
|
|
function stringify(obj) {
|
|
|
return JSON.stringify(obj, Object.keys(obj).sort());
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
|
|
|
const monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
|
const monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
|
const monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"];
|
|
|
function months(length) {
|
|
|
switch (length) {
|
|
|
case "narrow":
|
|
|
return [...monthsNarrow];
|
|
|
|
|
|
case "short":
|
|
|
return [...monthsShort];
|
|
|
|
|
|
case "long":
|
|
|
return [...monthsLong];
|
|
|
|
|
|
case "numeric":
|
|
|
return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"];
|
|
|
|
|
|
case "2-digit":
|
|
|
return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"];
|
|
|
|
|
|
default:
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
const weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
|
|
|
const weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
|
|
|
const weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"];
|
|
|
function weekdays(length) {
|
|
|
switch (length) {
|
|
|
case "narrow":
|
|
|
return [...weekdaysNarrow];
|
|
|
|
|
|
case "short":
|
|
|
return [...weekdaysShort];
|
|
|
|
|
|
case "long":
|
|
|
return [...weekdaysLong];
|
|
|
|
|
|
case "numeric":
|
|
|
return ["1", "2", "3", "4", "5", "6", "7"];
|
|
|
|
|
|
default:
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
const meridiems = ["AM", "PM"];
|
|
|
const erasLong = ["Before Christ", "Anno Domini"];
|
|
|
const erasShort = ["BC", "AD"];
|
|
|
const erasNarrow = ["B", "A"];
|
|
|
function eras(length) {
|
|
|
switch (length) {
|
|
|
case "narrow":
|
|
|
return [...erasNarrow];
|
|
|
|
|
|
case "short":
|
|
|
return [...erasShort];
|
|
|
|
|
|
case "long":
|
|
|
return [...erasLong];
|
|
|
|
|
|
default:
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
function meridiemForDateTime(dt) {
|
|
|
return meridiems[dt.hour < 12 ? 0 : 1];
|
|
|
}
|
|
|
function weekdayForDateTime(dt, length) {
|
|
|
return weekdays(length)[dt.weekday - 1];
|
|
|
}
|
|
|
function monthForDateTime(dt, length) {
|
|
|
return months(length)[dt.month - 1];
|
|
|
}
|
|
|
function eraForDateTime(dt, length) {
|
|
|
return eras(length)[dt.year < 0 ? 0 : 1];
|
|
|
}
|
|
|
function formatRelativeTime(unit, count, numeric = "always", narrow = false) {
|
|
|
const units = {
|
|
|
years: ["year", "yr."],
|
|
|
quarters: ["quarter", "qtr."],
|
|
|
months: ["month", "mo."],
|
|
|
weeks: ["week", "wk."],
|
|
|
days: ["day", "day", "days"],
|
|
|
hours: ["hour", "hr."],
|
|
|
minutes: ["minute", "min."],
|
|
|
seconds: ["second", "sec."]
|
|
|
};
|
|
|
const lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1;
|
|
|
|
|
|
if (numeric === "auto" && lastable) {
|
|
|
const isDay = unit === "days";
|
|
|
|
|
|
switch (count) {
|
|
|
case 1:
|
|
|
return isDay ? "tomorrow" : `next ${units[unit][0]}`;
|
|
|
|
|
|
case -1:
|
|
|
return isDay ? "yesterday" : `last ${units[unit][0]}`;
|
|
|
|
|
|
case 0:
|
|
|
return isDay ? "today" : `this ${units[unit][0]}`;
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const isInPast = Object.is(count, -0) || count < 0,
|
|
|
fmtValue = Math.abs(count),
|
|
|
singular = fmtValue === 1,
|
|
|
lilUnits = units[unit],
|
|
|
fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit;
|
|
|
return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;
|
|
|
}
|
|
|
function formatString(knownFormat) {
|
|
|
// these all have the offsets removed because we don't have access to them
|
|
|
// without all the intl stuff this is backfilling
|
|
|
const filtered = pick(knownFormat, ["weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName", "hour12"]),
|
|
|
key = stringify(filtered),
|
|
|
dateTimeHuge = "EEEE, LLLL d, yyyy, h:mm a";
|
|
|
|
|
|
switch (key) {
|
|
|
case stringify(DATE_SHORT):
|
|
|
return "M/d/yyyy";
|
|
|
|
|
|
case stringify(DATE_MED):
|
|
|
return "LLL d, yyyy";
|
|
|
|
|
|
case stringify(DATE_MED_WITH_WEEKDAY):
|
|
|
return "EEE, LLL d, yyyy";
|
|
|
|
|
|
case stringify(DATE_FULL):
|
|
|
return "LLLL d, yyyy";
|
|
|
|
|
|
case stringify(DATE_HUGE):
|
|
|
return "EEEE, LLLL d, yyyy";
|
|
|
|
|
|
case stringify(TIME_SIMPLE):
|
|
|
return "h:mm a";
|
|
|
|
|
|
case stringify(TIME_WITH_SECONDS):
|
|
|
return "h:mm:ss a";
|
|
|
|
|
|
case stringify(TIME_WITH_SHORT_OFFSET):
|
|
|
return "h:mm a";
|
|
|
|
|
|
case stringify(TIME_WITH_LONG_OFFSET):
|
|
|
return "h:mm a";
|
|
|
|
|
|
case stringify(TIME_24_SIMPLE):
|
|
|
return "HH:mm";
|
|
|
|
|
|
case stringify(TIME_24_WITH_SECONDS):
|
|
|
return "HH:mm:ss";
|
|
|
|
|
|
case stringify(TIME_24_WITH_SHORT_OFFSET):
|
|
|
return "HH:mm";
|
|
|
|
|
|
case stringify(TIME_24_WITH_LONG_OFFSET):
|
|
|
return "HH:mm";
|
|
|
|
|
|
case stringify(DATETIME_SHORT):
|
|
|
return "M/d/yyyy, h:mm a";
|
|
|
|
|
|
case stringify(DATETIME_MED):
|
|
|
return "LLL d, yyyy, h:mm a";
|
|
|
|
|
|
case stringify(DATETIME_FULL):
|
|
|
return "LLLL d, yyyy, h:mm a";
|
|
|
|
|
|
case stringify(DATETIME_HUGE):
|
|
|
return dateTimeHuge;
|
|
|
|
|
|
case stringify(DATETIME_SHORT_WITH_SECONDS):
|
|
|
return "M/d/yyyy, h:mm:ss a";
|
|
|
|
|
|
case stringify(DATETIME_MED_WITH_SECONDS):
|
|
|
return "LLL d, yyyy, h:mm:ss a";
|
|
|
|
|
|
case stringify(DATETIME_MED_WITH_WEEKDAY):
|
|
|
return "EEE, d LLL yyyy, h:mm a";
|
|
|
|
|
|
case stringify(DATETIME_FULL_WITH_SECONDS):
|
|
|
return "LLLL d, yyyy, h:mm:ss a";
|
|
|
|
|
|
case stringify(DATETIME_HUGE_WITH_SECONDS):
|
|
|
return "EEEE, LLLL d, yyyy, h:mm:ss a";
|
|
|
|
|
|
default:
|
|
|
return dateTimeHuge;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function stringifyTokens(splits, tokenToString) {
|
|
|
let s = "";
|
|
|
|
|
|
for (const token of splits) {
|
|
|
if (token.literal) {
|
|
|
s += token.val;
|
|
|
} else {
|
|
|
s += tokenToString(token.val);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return s;
|
|
|
}
|
|
|
|
|
|
const macroTokenToFormatOpts = {
|
|
|
D: DATE_SHORT,
|
|
|
DD: DATE_MED,
|
|
|
DDD: DATE_FULL,
|
|
|
DDDD: DATE_HUGE,
|
|
|
t: TIME_SIMPLE,
|
|
|
tt: TIME_WITH_SECONDS,
|
|
|
ttt: TIME_WITH_SHORT_OFFSET,
|
|
|
tttt: TIME_WITH_LONG_OFFSET,
|
|
|
T: TIME_24_SIMPLE,
|
|
|
TT: TIME_24_WITH_SECONDS,
|
|
|
TTT: TIME_24_WITH_SHORT_OFFSET,
|
|
|
TTTT: TIME_24_WITH_LONG_OFFSET,
|
|
|
f: DATETIME_SHORT,
|
|
|
ff: DATETIME_MED,
|
|
|
fff: DATETIME_FULL,
|
|
|
ffff: DATETIME_HUGE,
|
|
|
F: DATETIME_SHORT_WITH_SECONDS,
|
|
|
FF: DATETIME_MED_WITH_SECONDS,
|
|
|
FFF: DATETIME_FULL_WITH_SECONDS,
|
|
|
FFFF: DATETIME_HUGE_WITH_SECONDS
|
|
|
};
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
class Formatter {
|
|
|
static create(locale, opts = {}) {
|
|
|
return new Formatter(locale, opts);
|
|
|
}
|
|
|
|
|
|
static parseFormat(fmt) {
|
|
|
let current = null,
|
|
|
currentFull = "",
|
|
|
bracketed = false;
|
|
|
const splits = [];
|
|
|
|
|
|
for (let i = 0; i < fmt.length; i++) {
|
|
|
const c = fmt.charAt(i);
|
|
|
|
|
|
if (c === "'") {
|
|
|
if (currentFull.length > 0) {
|
|
|
splits.push({
|
|
|
literal: bracketed,
|
|
|
val: currentFull
|
|
|
});
|
|
|
}
|
|
|
|
|
|
current = null;
|
|
|
currentFull = "";
|
|
|
bracketed = !bracketed;
|
|
|
} else if (bracketed) {
|
|
|
currentFull += c;
|
|
|
} else if (c === current) {
|
|
|
currentFull += c;
|
|
|
} else {
|
|
|
if (currentFull.length > 0) {
|
|
|
splits.push({
|
|
|
literal: false,
|
|
|
val: currentFull
|
|
|
});
|
|
|
}
|
|
|
|
|
|
currentFull = c;
|
|
|
current = c;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (currentFull.length > 0) {
|
|
|
splits.push({
|
|
|
literal: bracketed,
|
|
|
val: currentFull
|
|
|
});
|
|
|
}
|
|
|
|
|
|
return splits;
|
|
|
}
|
|
|
|
|
|
static macroTokenToFormatOpts(token) {
|
|
|
return macroTokenToFormatOpts[token];
|
|
|
}
|
|
|
|
|
|
constructor(locale, formatOpts) {
|
|
|
this.opts = formatOpts;
|
|
|
this.loc = locale;
|
|
|
this.systemLoc = null;
|
|
|
}
|
|
|
|
|
|
formatWithSystemDefault(dt, opts) {
|
|
|
if (this.systemLoc === null) {
|
|
|
this.systemLoc = this.loc.redefaultToSystem();
|
|
|
}
|
|
|
|
|
|
const df = this.systemLoc.dtFormatter(dt, Object.assign({}, this.opts, opts));
|
|
|
return df.format();
|
|
|
}
|
|
|
|
|
|
formatDateTime(dt, opts = {}) {
|
|
|
const df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts));
|
|
|
return df.format();
|
|
|
}
|
|
|
|
|
|
formatDateTimeParts(dt, opts = {}) {
|
|
|
const df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts));
|
|
|
return df.formatToParts();
|
|
|
}
|
|
|
|
|
|
resolvedOptions(dt, opts = {}) {
|
|
|
const df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts));
|
|
|
return df.resolvedOptions();
|
|
|
}
|
|
|
|
|
|
num(n, p = 0) {
|
|
|
// we get some perf out of doing this here, annoyingly
|
|
|
if (this.opts.forceSimple) {
|
|
|
return padStart(n, p);
|
|
|
}
|
|
|
|
|
|
const opts = Object.assign({}, this.opts);
|
|
|
|
|
|
if (p > 0) {
|
|
|
opts.padTo = p;
|
|
|
}
|
|
|
|
|
|
return this.loc.numberFormatter(opts).format(n);
|
|
|
}
|
|
|
|
|
|
formatDateTimeFromString(dt, fmt) {
|
|
|
const knownEnglish = this.loc.listingMode() === "en",
|
|
|
useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory" && hasFormatToParts(),
|
|
|
string = (opts, extract) => this.loc.extract(dt, opts, extract),
|
|
|
formatOffset = opts => {
|
|
|
if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {
|
|
|
return "Z";
|
|
|
}
|
|
|
|
|
|
return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : "";
|
|
|
},
|
|
|
meridiem = () => knownEnglish ? meridiemForDateTime(dt) : string({
|
|
|
hour: "numeric",
|
|
|
hour12: true
|
|
|
}, "dayperiod"),
|
|
|
month = (length, standalone) => knownEnglish ? monthForDateTime(dt, length) : string(standalone ? {
|
|
|
month: length
|
|
|
} : {
|
|
|
month: length,
|
|
|
day: "numeric"
|
|
|
}, "month"),
|
|
|
weekday = (length, standalone) => knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? {
|
|
|
weekday: length
|
|
|
} : {
|
|
|
weekday: length,
|
|
|
month: "long",
|
|
|
day: "numeric"
|
|
|
}, "weekday"),
|
|
|
maybeMacro = token => {
|
|
|
const formatOpts = Formatter.macroTokenToFormatOpts(token);
|
|
|
|
|
|
if (formatOpts) {
|
|
|
return this.formatWithSystemDefault(dt, formatOpts);
|
|
|
} else {
|
|
|
return token;
|
|
|
}
|
|
|
},
|
|
|
era = length => knownEnglish ? eraForDateTime(dt, length) : string({
|
|
|
era: length
|
|
|
}, "era"),
|
|
|
tokenToString = token => {
|
|
|
// Where possible: http://cldr.unicode.org/translation/date-time-1/date-time#TOC-Standalone-vs.-Format-Styles
|
|
|
switch (token) {
|
|
|
// ms
|
|
|
case "S":
|
|
|
return this.num(dt.millisecond);
|
|
|
|
|
|
case "u": // falls through
|
|
|
|
|
|
case "SSS":
|
|
|
return this.num(dt.millisecond, 3);
|
|
|
// seconds
|
|
|
|
|
|
case "s":
|
|
|
return this.num(dt.second);
|
|
|
|
|
|
case "ss":
|
|
|
return this.num(dt.second, 2);
|
|
|
// minutes
|
|
|
|
|
|
case "m":
|
|
|
return this.num(dt.minute);
|
|
|
|
|
|
case "mm":
|
|
|
return this.num(dt.minute, 2);
|
|
|
// hours
|
|
|
|
|
|
case "h":
|
|
|
return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);
|
|
|
|
|
|
case "hh":
|
|
|
return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);
|
|
|
|
|
|
case "H":
|
|
|
return this.num(dt.hour);
|
|
|
|
|
|
case "HH":
|
|
|
return this.num(dt.hour, 2);
|
|
|
// offset
|
|
|
|
|
|
case "Z":
|
|
|
// like +6
|
|
|
return formatOffset({
|
|
|
format: "narrow",
|
|
|
allowZ: this.opts.allowZ
|
|
|
});
|
|
|
|
|
|
case "ZZ":
|
|
|
// like +06:00
|
|
|
return formatOffset({
|
|
|
format: "short",
|
|
|
allowZ: this.opts.allowZ
|
|
|
});
|
|
|
|
|
|
case "ZZZ":
|
|
|
// like +0600
|
|
|
return formatOffset({
|
|
|
format: "techie",
|
|
|
allowZ: this.opts.allowZ
|
|
|
});
|
|
|
|
|
|
case "ZZZZ":
|
|
|
// like EST
|
|
|
return dt.zone.offsetName(dt.ts, {
|
|
|
format: "short",
|
|
|
locale: this.loc.locale
|
|
|
});
|
|
|
|
|
|
case "ZZZZZ":
|
|
|
// like Eastern Standard Time
|
|
|
return dt.zone.offsetName(dt.ts, {
|
|
|
format: "long",
|
|
|
locale: this.loc.locale
|
|
|
});
|
|
|
// zone
|
|
|
|
|
|
case "z":
|
|
|
// like America/New_York
|
|
|
return dt.zoneName;
|
|
|
// meridiems
|
|
|
|
|
|
case "a":
|
|
|
return meridiem();
|
|
|
// dates
|
|
|
|
|
|
case "d":
|
|
|
return useDateTimeFormatter ? string({
|
|
|
day: "numeric"
|
|
|
}, "day") : this.num(dt.day);
|
|
|
|
|
|
case "dd":
|
|
|
return useDateTimeFormatter ? string({
|
|
|
day: "2-digit"
|
|
|
}, "day") : this.num(dt.day, 2);
|
|
|
// weekdays - standalone
|
|
|
|
|
|
case "c":
|
|
|
// like 1
|
|
|
return this.num(dt.weekday);
|
|
|
|
|
|
case "ccc":
|
|
|
// like 'Tues'
|
|
|
return weekday("short", true);
|
|
|
|
|
|
case "cccc":
|
|
|
// like 'Tuesday'
|
|
|
return weekday("long", true);
|
|
|
|
|
|
case "ccccc":
|
|
|
// like 'T'
|
|
|
return weekday("narrow", true);
|
|
|
// weekdays - format
|
|
|
|
|
|
case "E":
|
|
|
// like 1
|
|
|
return this.num(dt.weekday);
|
|
|
|
|
|
case "EEE":
|
|
|
// like 'Tues'
|
|
|
return weekday("short", false);
|
|
|
|
|
|
case "EEEE":
|
|
|
// like 'Tuesday'
|
|
|
return weekday("long", false);
|
|
|
|
|
|
case "EEEEE":
|
|
|
// like 'T'
|
|
|
return weekday("narrow", false);
|
|
|
// months - standalone
|
|
|
|
|
|
case "L":
|
|
|
// like 1
|
|
|
return useDateTimeFormatter ? string({
|
|
|
month: "numeric",
|
|
|
day: "numeric"
|
|
|
}, "month") : this.num(dt.month);
|
|
|
|
|
|
case "LL":
|
|
|
// like 01, doesn't seem to work
|
|
|
return useDateTimeFormatter ? string({
|
|
|
month: "2-digit",
|
|
|
day: "numeric"
|
|
|
}, "month") : this.num(dt.month, 2);
|
|
|
|
|
|
case "LLL":
|
|
|
// like Jan
|
|
|
return month("short", true);
|
|
|
|
|
|
case "LLLL":
|
|
|
// like January
|
|
|
return month("long", true);
|
|
|
|
|
|
case "LLLLL":
|
|
|
// like J
|
|
|
return month("narrow", true);
|
|
|
// months - format
|
|
|
|
|
|
case "M":
|
|
|
// like 1
|
|
|
return useDateTimeFormatter ? string({
|
|
|
month: "numeric"
|
|
|
}, "month") : this.num(dt.month);
|
|
|
|
|
|
case "MM":
|
|
|
// like 01
|
|
|
return useDateTimeFormatter ? string({
|
|
|
month: "2-digit"
|
|
|
}, "month") : this.num(dt.month, 2);
|
|
|
|
|
|
case "MMM":
|
|
|
// like Jan
|
|
|
return month("short", false);
|
|
|
|
|
|
case "MMMM":
|
|
|
// like January
|
|
|
return month("long", false);
|
|
|
|
|
|
case "MMMMM":
|
|
|
// like J
|
|
|
return month("narrow", false);
|
|
|
// years
|
|
|
|
|
|
case "y":
|
|
|
// like 2014
|
|
|
return useDateTimeFormatter ? string({
|
|
|
year: "numeric"
|
|
|
}, "year") : this.num(dt.year);
|
|
|
|
|
|
case "yy":
|
|
|
// like 14
|
|
|
return useDateTimeFormatter ? string({
|
|
|
year: "2-digit"
|
|
|
}, "year") : this.num(dt.year.toString().slice(-2), 2);
|
|
|
|
|
|
case "yyyy":
|
|
|
// like 0012
|
|
|
return useDateTimeFormatter ? string({
|
|
|
year: "numeric"
|
|
|
}, "year") : this.num(dt.year, 4);
|
|
|
|
|
|
case "yyyyyy":
|
|
|
// like 000012
|
|
|
return useDateTimeFormatter ? string({
|
|
|
year: "numeric"
|
|
|
}, "year") : this.num(dt.year, 6);
|
|
|
// eras
|
|
|
|
|
|
case "G":
|
|
|
// like AD
|
|
|
return era("short");
|
|
|
|
|
|
case "GG":
|
|
|
// like Anno Domini
|
|
|
return era("long");
|
|
|
|
|
|
case "GGGGG":
|
|
|
return era("narrow");
|
|
|
|
|
|
case "kk":
|
|
|
return this.num(dt.weekYear.toString().slice(-2), 2);
|
|
|
|
|
|
case "kkkk":
|
|
|
return this.num(dt.weekYear, 4);
|
|
|
|
|
|
case "W":
|
|
|
return this.num(dt.weekNumber);
|
|
|
|
|
|
case "WW":
|
|
|
return this.num(dt.weekNumber, 2);
|
|
|
|
|
|
case "o":
|
|
|
return this.num(dt.ordinal);
|
|
|
|
|
|
case "ooo":
|
|
|
return this.num(dt.ordinal, 3);
|
|
|
|
|
|
case "q":
|
|
|
// like 1
|
|
|
return this.num(dt.quarter);
|
|
|
|
|
|
case "qq":
|
|
|
// like 01
|
|
|
return this.num(dt.quarter, 2);
|
|
|
|
|
|
case "X":
|
|
|
return this.num(Math.floor(dt.ts / 1000));
|
|
|
|
|
|
case "x":
|
|
|
return this.num(dt.ts);
|
|
|
|
|
|
default:
|
|
|
return maybeMacro(token);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);
|
|
|
}
|
|
|
|
|
|
formatDurationFromString(dur, fmt) {
|
|
|
const tokenToField = token => {
|
|
|
switch (token[0]) {
|
|
|
case "S":
|
|
|
return "millisecond";
|
|
|
|
|
|
case "s":
|
|
|
return "second";
|
|
|
|
|
|
case "m":
|
|
|
return "minute";
|
|
|
|
|
|
case "h":
|
|
|
return "hour";
|
|
|
|
|
|
case "d":
|
|
|
return "day";
|
|
|
|
|
|
case "M":
|
|
|
return "month";
|
|
|
|
|
|
case "y":
|
|
|
return "year";
|
|
|
|
|
|
default:
|
|
|
return null;
|
|
|
}
|
|
|
},
|
|
|
tokenToString = lildur => token => {
|
|
|
const mapped = tokenToField(token);
|
|
|
|
|
|
if (mapped) {
|
|
|
return this.num(lildur.get(mapped), token.length);
|
|
|
} else {
|
|
|
return token;
|
|
|
}
|
|
|
},
|
|
|
tokens = Formatter.parseFormat(fmt),
|
|
|
realTokens = tokens.reduce((found, {
|
|
|
literal,
|
|
|
val
|
|
|
}) => literal ? found : found.concat(val), []),
|
|
|
collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter(t => t));
|
|
|
|
|
|
return stringifyTokens(tokens, tokenToString(collapsed));
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
class Invalid {
|
|
|
constructor(reason, explanation) {
|
|
|
this.reason = reason;
|
|
|
this.explanation = explanation;
|
|
|
}
|
|
|
|
|
|
toMessage() {
|
|
|
if (this.explanation) {
|
|
|
return `${this.reason}: ${this.explanation}`;
|
|
|
} else {
|
|
|
return this.reason;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
|
if (source == null) return {};
|
|
|
var target = {};
|
|
|
var sourceKeys = Object.keys(source);
|
|
|
var key, i;
|
|
|
|
|
|
for (i = 0; i < sourceKeys.length; i++) {
|
|
|
key = sourceKeys[i];
|
|
|
if (excluded.indexOf(key) >= 0) continue;
|
|
|
target[key] = source[key];
|
|
|
}
|
|
|
|
|
|
return target;
|
|
|
}
|
|
|
|
|
|
/* eslint no-unused-vars: "off" */
|
|
|
/**
|
|
|
* @interface
|
|
|
*/
|
|
|
|
|
|
class Zone {
|
|
|
/**
|
|
|
* The type of zone
|
|
|
* @abstract
|
|
|
* @type {string}
|
|
|
*/
|
|
|
get type() {
|
|
|
throw new ZoneIsAbstractError();
|
|
|
}
|
|
|
/**
|
|
|
* The name of this zone.
|
|
|
* @abstract
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get name() {
|
|
|
throw new ZoneIsAbstractError();
|
|
|
}
|
|
|
/**
|
|
|
* Returns whether the offset is known to be fixed for the whole year.
|
|
|
* @abstract
|
|
|
* @type {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get universal() {
|
|
|
throw new ZoneIsAbstractError();
|
|
|
}
|
|
|
/**
|
|
|
* Returns the offset's common name (such as EST) at the specified timestamp
|
|
|
* @abstract
|
|
|
* @param {number} ts - Epoch milliseconds for which to get the name
|
|
|
* @param {Object} opts - Options to affect the format
|
|
|
* @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.
|
|
|
* @param {string} opts.locale - What locale to return the offset name in.
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
offsetName(ts, opts) {
|
|
|
throw new ZoneIsAbstractError();
|
|
|
}
|
|
|
/**
|
|
|
* Returns the offset's value as a string
|
|
|
* @abstract
|
|
|
* @param {number} ts - Epoch milliseconds for which to get the offset
|
|
|
* @param {string} format - What style of offset to return.
|
|
|
* Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
formatOffset(ts, format) {
|
|
|
throw new ZoneIsAbstractError();
|
|
|
}
|
|
|
/**
|
|
|
* Return the offset in minutes for this zone at the specified timestamp.
|
|
|
* @abstract
|
|
|
* @param {number} ts - Epoch milliseconds for which to compute the offset
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
offset(ts) {
|
|
|
throw new ZoneIsAbstractError();
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this Zone is equal to another zone
|
|
|
* @abstract
|
|
|
* @param {Zone} otherZone - the zone to compare
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
equals(otherZone) {
|
|
|
throw new ZoneIsAbstractError();
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this Zone is valid.
|
|
|
* @abstract
|
|
|
* @type {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get isValid() {
|
|
|
throw new ZoneIsAbstractError();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
let singleton = null;
|
|
|
/**
|
|
|
* Represents the local zone for this JavaScript environment.
|
|
|
* @implements {Zone}
|
|
|
*/
|
|
|
|
|
|
class LocalZone extends Zone {
|
|
|
/**
|
|
|
* Get a singleton instance of the local zone
|
|
|
* @return {LocalZone}
|
|
|
*/
|
|
|
static get instance() {
|
|
|
if (singleton === null) {
|
|
|
singleton = new LocalZone();
|
|
|
}
|
|
|
|
|
|
return singleton;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get type() {
|
|
|
return "local";
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get name() {
|
|
|
if (hasIntl()) {
|
|
|
return new Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
|
} else return "local";
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get universal() {
|
|
|
return false;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
offsetName(ts, {
|
|
|
format,
|
|
|
locale
|
|
|
}) {
|
|
|
return parseZoneInfo(ts, format, locale);
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
formatOffset(ts, format) {
|
|
|
return formatOffset(this.offset(ts), format);
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
offset(ts) {
|
|
|
return -new Date(ts).getTimezoneOffset();
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
equals(otherZone) {
|
|
|
return otherZone.type === "local";
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get isValid() {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
const matchingRegex = RegExp(`^${ianaRegex.source}$`);
|
|
|
let dtfCache = {};
|
|
|
|
|
|
function makeDTF(zone) {
|
|
|
if (!dtfCache[zone]) {
|
|
|
dtfCache[zone] = new Intl.DateTimeFormat("en-US", {
|
|
|
hour12: false,
|
|
|
timeZone: zone,
|
|
|
year: "numeric",
|
|
|
month: "2-digit",
|
|
|
day: "2-digit",
|
|
|
hour: "2-digit",
|
|
|
minute: "2-digit",
|
|
|
second: "2-digit"
|
|
|
});
|
|
|
}
|
|
|
|
|
|
return dtfCache[zone];
|
|
|
}
|
|
|
|
|
|
const typeToPos = {
|
|
|
year: 0,
|
|
|
month: 1,
|
|
|
day: 2,
|
|
|
hour: 3,
|
|
|
minute: 4,
|
|
|
second: 5
|
|
|
};
|
|
|
|
|
|
function hackyOffset(dtf, date) {
|
|
|
const formatted = dtf.format(date).replace(/\u200E/g, ""),
|
|
|
parsed = /(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(formatted),
|
|
|
[, fMonth, fDay, fYear, fHour, fMinute, fSecond] = parsed;
|
|
|
return [fYear, fMonth, fDay, fHour, fMinute, fSecond];
|
|
|
}
|
|
|
|
|
|
function partsOffset(dtf, date) {
|
|
|
const formatted = dtf.formatToParts(date),
|
|
|
filled = [];
|
|
|
|
|
|
for (let i = 0; i < formatted.length; i++) {
|
|
|
const {
|
|
|
type,
|
|
|
value
|
|
|
} = formatted[i],
|
|
|
pos = typeToPos[type];
|
|
|
|
|
|
if (!isUndefined(pos)) {
|
|
|
filled[pos] = parseInt(value, 10);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return filled;
|
|
|
}
|
|
|
|
|
|
let ianaZoneCache = {};
|
|
|
/**
|
|
|
* A zone identified by an IANA identifier, like America/New_York
|
|
|
* @implements {Zone}
|
|
|
*/
|
|
|
|
|
|
class IANAZone extends Zone {
|
|
|
/**
|
|
|
* @param {string} name - Zone name
|
|
|
* @return {IANAZone}
|
|
|
*/
|
|
|
static create(name) {
|
|
|
if (!ianaZoneCache[name]) {
|
|
|
ianaZoneCache[name] = new IANAZone(name);
|
|
|
}
|
|
|
|
|
|
return ianaZoneCache[name];
|
|
|
}
|
|
|
/**
|
|
|
* Reset local caches. Should only be necessary in testing scenarios.
|
|
|
* @return {void}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static resetCache() {
|
|
|
ianaZoneCache = {};
|
|
|
dtfCache = {};
|
|
|
}
|
|
|
/**
|
|
|
* Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.
|
|
|
* @param {string} s - The string to check validity on
|
|
|
* @example IANAZone.isValidSpecifier("America/New_York") //=> true
|
|
|
* @example IANAZone.isValidSpecifier("Fantasia/Castle") //=> true
|
|
|
* @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static isValidSpecifier(s) {
|
|
|
return !!(s && s.match(matchingRegex));
|
|
|
}
|
|
|
/**
|
|
|
* Returns whether the provided string identifies a real zone
|
|
|
* @param {string} zone - The string to check
|
|
|
* @example IANAZone.isValidZone("America/New_York") //=> true
|
|
|
* @example IANAZone.isValidZone("Fantasia/Castle") //=> false
|
|
|
* @example IANAZone.isValidZone("Sport~~blorp") //=> false
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static isValidZone(zone) {
|
|
|
try {
|
|
|
new Intl.DateTimeFormat("en-US", {
|
|
|
timeZone: zone
|
|
|
}).format();
|
|
|
return true;
|
|
|
} catch (e) {
|
|
|
return false;
|
|
|
}
|
|
|
} // Etc/GMT+8 -> -480
|
|
|
|
|
|
/** @ignore */
|
|
|
|
|
|
|
|
|
static parseGMTOffset(specifier) {
|
|
|
if (specifier) {
|
|
|
const match = specifier.match(/^Etc\/GMT(0|[+-]\d{1,2})$/i);
|
|
|
|
|
|
if (match) {
|
|
|
return -60 * parseInt(match[1]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
constructor(name) {
|
|
|
super();
|
|
|
/** @private **/
|
|
|
|
|
|
this.zoneName = name;
|
|
|
/** @private **/
|
|
|
|
|
|
this.valid = IANAZone.isValidZone(name);
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get type() {
|
|
|
return "iana";
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get name() {
|
|
|
return this.zoneName;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get universal() {
|
|
|
return false;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
offsetName(ts, {
|
|
|
format,
|
|
|
locale
|
|
|
}) {
|
|
|
return parseZoneInfo(ts, format, locale, this.name);
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
formatOffset(ts, format) {
|
|
|
return formatOffset(this.offset(ts), format);
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
offset(ts) {
|
|
|
const date = new Date(ts);
|
|
|
if (isNaN(date)) return NaN;
|
|
|
const dtf = makeDTF(this.name),
|
|
|
[year, month, day, hour, minute, second] = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date),
|
|
|
// work around https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat
|
|
|
adjustedHour = hour === 24 ? 0 : hour;
|
|
|
const asUTC = objToLocalTS({
|
|
|
year,
|
|
|
month,
|
|
|
day,
|
|
|
hour: adjustedHour,
|
|
|
minute,
|
|
|
second,
|
|
|
millisecond: 0
|
|
|
});
|
|
|
let asTS = +date;
|
|
|
const over = asTS % 1000;
|
|
|
asTS -= over >= 0 ? over : 1000 + over;
|
|
|
return (asUTC - asTS) / (60 * 1000);
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
equals(otherZone) {
|
|
|
return otherZone.type === "iana" && otherZone.name === this.name;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get isValid() {
|
|
|
return this.valid;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
let singleton$1 = null;
|
|
|
/**
|
|
|
* A zone with a fixed offset (meaning no DST)
|
|
|
* @implements {Zone}
|
|
|
*/
|
|
|
|
|
|
class FixedOffsetZone extends Zone {
|
|
|
/**
|
|
|
* Get a singleton instance of UTC
|
|
|
* @return {FixedOffsetZone}
|
|
|
*/
|
|
|
static get utcInstance() {
|
|
|
if (singleton$1 === null) {
|
|
|
singleton$1 = new FixedOffsetZone(0);
|
|
|
}
|
|
|
|
|
|
return singleton$1;
|
|
|
}
|
|
|
/**
|
|
|
* Get an instance with a specified offset
|
|
|
* @param {number} offset - The offset in minutes
|
|
|
* @return {FixedOffsetZone}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static instance(offset) {
|
|
|
return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);
|
|
|
}
|
|
|
/**
|
|
|
* Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6"
|
|
|
* @param {string} s - The offset string to parse
|
|
|
* @example FixedOffsetZone.parseSpecifier("UTC+6")
|
|
|
* @example FixedOffsetZone.parseSpecifier("UTC+06")
|
|
|
* @example FixedOffsetZone.parseSpecifier("UTC-6:00")
|
|
|
* @return {FixedOffsetZone}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static parseSpecifier(s) {
|
|
|
if (s) {
|
|
|
const r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);
|
|
|
|
|
|
if (r) {
|
|
|
return new FixedOffsetZone(signedOffset(r[1], r[2]));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
constructor(offset) {
|
|
|
super();
|
|
|
/** @private **/
|
|
|
|
|
|
this.fixed = offset;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get type() {
|
|
|
return "fixed";
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get name() {
|
|
|
return this.fixed === 0 ? "UTC" : `UTC${formatOffset(this.fixed, "narrow")}`;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
offsetName() {
|
|
|
return this.name;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
formatOffset(ts, format) {
|
|
|
return formatOffset(this.fixed, format);
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get universal() {
|
|
|
return true;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
offset() {
|
|
|
return this.fixed;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
equals(otherZone) {
|
|
|
return otherZone.type === "fixed" && otherZone.fixed === this.fixed;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get isValid() {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* A zone that failed to parse. You should never need to instantiate this.
|
|
|
* @implements {Zone}
|
|
|
*/
|
|
|
|
|
|
class InvalidZone extends Zone {
|
|
|
constructor(zoneName) {
|
|
|
super();
|
|
|
/** @private */
|
|
|
|
|
|
this.zoneName = zoneName;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get type() {
|
|
|
return "invalid";
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get name() {
|
|
|
return this.zoneName;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get universal() {
|
|
|
return false;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
offsetName() {
|
|
|
return null;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
formatOffset() {
|
|
|
return "";
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
offset() {
|
|
|
return NaN;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
equals() {
|
|
|
return false;
|
|
|
}
|
|
|
/** @override **/
|
|
|
|
|
|
|
|
|
get isValid() {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
function normalizeZone(input, defaultZone) {
|
|
|
let offset;
|
|
|
|
|
|
if (isUndefined(input) || input === null) {
|
|
|
return defaultZone;
|
|
|
} else if (input instanceof Zone) {
|
|
|
return input;
|
|
|
} else if (isString(input)) {
|
|
|
const lowered = input.toLowerCase();
|
|
|
if (lowered === "local") return defaultZone;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else if ((offset = IANAZone.parseGMTOffset(input)) != null) {
|
|
|
// handle Etc/GMT-4, which V8 chokes on
|
|
|
return FixedOffsetZone.instance(offset);
|
|
|
} else if (IANAZone.isValidSpecifier(lowered)) return IANAZone.create(input);else return FixedOffsetZone.parseSpecifier(lowered) || new InvalidZone(input);
|
|
|
} else if (isNumber(input)) {
|
|
|
return FixedOffsetZone.instance(input);
|
|
|
} else if (typeof input === "object" && input.offset && typeof input.offset === "number") {
|
|
|
// This is dumb, but the instanceof check above doesn't seem to really work
|
|
|
// so we're duck checking it
|
|
|
return input;
|
|
|
} else {
|
|
|
return new InvalidZone(input);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
let now = () => Date.now(),
|
|
|
defaultZone = null,
|
|
|
// not setting this directly to LocalZone.instance bc loading order issues
|
|
|
defaultLocale = null,
|
|
|
defaultNumberingSystem = null,
|
|
|
defaultOutputCalendar = null,
|
|
|
throwOnInvalid = false;
|
|
|
/**
|
|
|
* Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.
|
|
|
*/
|
|
|
|
|
|
|
|
|
class Settings$1 {
|
|
|
/**
|
|
|
* Get the callback for returning the current timestamp.
|
|
|
* @type {function}
|
|
|
*/
|
|
|
static get now() {
|
|
|
return now;
|
|
|
}
|
|
|
/**
|
|
|
* Set the callback for returning the current timestamp.
|
|
|
* The function should return a number, which will be interpreted as an Epoch millisecond count
|
|
|
* @type {function}
|
|
|
* @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future
|
|
|
* @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time
|
|
|
*/
|
|
|
|
|
|
|
|
|
static set now(n) {
|
|
|
now = n;
|
|
|
}
|
|
|
/**
|
|
|
* Get the default time zone to create DateTimes in.
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get defaultZoneName() {
|
|
|
return Settings$1.defaultZone.name;
|
|
|
}
|
|
|
/**
|
|
|
* Set the default time zone to create DateTimes in. Does not affect existing instances.
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static set defaultZoneName(z) {
|
|
|
if (!z) {
|
|
|
defaultZone = null;
|
|
|
} else {
|
|
|
defaultZone = normalizeZone(z);
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Get the default time zone object to create DateTimes in. Does not affect existing instances.
|
|
|
* @type {Zone}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get defaultZone() {
|
|
|
return defaultZone || LocalZone.instance;
|
|
|
}
|
|
|
/**
|
|
|
* Get the default locale to create DateTimes with. Does not affect existing instances.
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get defaultLocale() {
|
|
|
return defaultLocale;
|
|
|
}
|
|
|
/**
|
|
|
* Set the default locale to create DateTimes with. Does not affect existing instances.
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static set defaultLocale(locale) {
|
|
|
defaultLocale = locale;
|
|
|
}
|
|
|
/**
|
|
|
* Get the default numbering system to create DateTimes with. Does not affect existing instances.
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get defaultNumberingSystem() {
|
|
|
return defaultNumberingSystem;
|
|
|
}
|
|
|
/**
|
|
|
* Set the default numbering system to create DateTimes with. Does not affect existing instances.
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static set defaultNumberingSystem(numberingSystem) {
|
|
|
defaultNumberingSystem = numberingSystem;
|
|
|
}
|
|
|
/**
|
|
|
* Get the default output calendar to create DateTimes with. Does not affect existing instances.
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get defaultOutputCalendar() {
|
|
|
return defaultOutputCalendar;
|
|
|
}
|
|
|
/**
|
|
|
* Set the default output calendar to create DateTimes with. Does not affect existing instances.
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static set defaultOutputCalendar(outputCalendar) {
|
|
|
defaultOutputCalendar = outputCalendar;
|
|
|
}
|
|
|
/**
|
|
|
* Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals
|
|
|
* @type {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get throwOnInvalid() {
|
|
|
return throwOnInvalid;
|
|
|
}
|
|
|
/**
|
|
|
* Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals
|
|
|
* @type {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static set throwOnInvalid(t) {
|
|
|
throwOnInvalid = t;
|
|
|
}
|
|
|
/**
|
|
|
* Reset Luxon's global caches. Should only be necessary in testing scenarios.
|
|
|
* @return {void}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static resetCaches() {
|
|
|
Locale.resetCache();
|
|
|
IANAZone.resetCache();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
let intlDTCache = {};
|
|
|
|
|
|
function getCachedDTF(locString, opts = {}) {
|
|
|
const key = JSON.stringify([locString, opts]);
|
|
|
let dtf = intlDTCache[key];
|
|
|
|
|
|
if (!dtf) {
|
|
|
dtf = new Intl.DateTimeFormat(locString, opts);
|
|
|
intlDTCache[key] = dtf;
|
|
|
}
|
|
|
|
|
|
return dtf;
|
|
|
}
|
|
|
|
|
|
let intlNumCache = {};
|
|
|
|
|
|
function getCachedINF(locString, opts = {}) {
|
|
|
const key = JSON.stringify([locString, opts]);
|
|
|
let inf = intlNumCache[key];
|
|
|
|
|
|
if (!inf) {
|
|
|
inf = new Intl.NumberFormat(locString, opts);
|
|
|
intlNumCache[key] = inf;
|
|
|
}
|
|
|
|
|
|
return inf;
|
|
|
}
|
|
|
|
|
|
let intlRelCache = {};
|
|
|
|
|
|
function getCachedRTF(locString, opts = {}) {
|
|
|
const cacheKeyOpts = _objectWithoutPropertiesLoose(opts, ["base"]); // exclude `base` from the options
|
|
|
|
|
|
|
|
|
const key = JSON.stringify([locString, cacheKeyOpts]);
|
|
|
let inf = intlRelCache[key];
|
|
|
|
|
|
if (!inf) {
|
|
|
inf = new Intl.RelativeTimeFormat(locString, opts);
|
|
|
intlRelCache[key] = inf;
|
|
|
}
|
|
|
|
|
|
return inf;
|
|
|
}
|
|
|
|
|
|
let sysLocaleCache = null;
|
|
|
|
|
|
function systemLocale() {
|
|
|
if (sysLocaleCache) {
|
|
|
return sysLocaleCache;
|
|
|
} else if (hasIntl()) {
|
|
|
const computedSys = new Intl.DateTimeFormat().resolvedOptions().locale; // node sometimes defaults to "und". Override that because that is dumb
|
|
|
|
|
|
sysLocaleCache = !computedSys || computedSys === "und" ? "en-US" : computedSys;
|
|
|
return sysLocaleCache;
|
|
|
} else {
|
|
|
sysLocaleCache = "en-US";
|
|
|
return sysLocaleCache;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function parseLocaleString(localeStr) {
|
|
|
// I really want to avoid writing a BCP 47 parser
|
|
|
// see, e.g. https://github.com/wooorm/bcp-47
|
|
|
// Instead, we'll do this:
|
|
|
// a) if the string has no -u extensions, just leave it alone
|
|
|
// b) if it does, use Intl to resolve everything
|
|
|
// c) if Intl fails, try again without the -u
|
|
|
const uIndex = localeStr.indexOf("-u-");
|
|
|
|
|
|
if (uIndex === -1) {
|
|
|
return [localeStr];
|
|
|
} else {
|
|
|
let options;
|
|
|
const smaller = localeStr.substring(0, uIndex);
|
|
|
|
|
|
try {
|
|
|
options = getCachedDTF(localeStr).resolvedOptions();
|
|
|
} catch (e) {
|
|
|
options = getCachedDTF(smaller).resolvedOptions();
|
|
|
}
|
|
|
|
|
|
const {
|
|
|
numberingSystem,
|
|
|
calendar
|
|
|
} = options; // return the smaller one so that we can append the calendar and numbering overrides to it
|
|
|
|
|
|
return [smaller, numberingSystem, calendar];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function intlConfigString(localeStr, numberingSystem, outputCalendar) {
|
|
|
if (hasIntl()) {
|
|
|
if (outputCalendar || numberingSystem) {
|
|
|
localeStr += "-u";
|
|
|
|
|
|
if (outputCalendar) {
|
|
|
localeStr += `-ca-${outputCalendar}`;
|
|
|
}
|
|
|
|
|
|
if (numberingSystem) {
|
|
|
localeStr += `-nu-${numberingSystem}`;
|
|
|
}
|
|
|
|
|
|
return localeStr;
|
|
|
} else {
|
|
|
return localeStr;
|
|
|
}
|
|
|
} else {
|
|
|
return [];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function mapMonths(f) {
|
|
|
const ms = [];
|
|
|
|
|
|
for (let i = 1; i <= 12; i++) {
|
|
|
const dt = DateTime.utc(2016, i, 1);
|
|
|
ms.push(f(dt));
|
|
|
}
|
|
|
|
|
|
return ms;
|
|
|
}
|
|
|
|
|
|
function mapWeekdays(f) {
|
|
|
const ms = [];
|
|
|
|
|
|
for (let i = 1; i <= 7; i++) {
|
|
|
const dt = DateTime.utc(2016, 11, 13 + i);
|
|
|
ms.push(f(dt));
|
|
|
}
|
|
|
|
|
|
return ms;
|
|
|
}
|
|
|
|
|
|
function listStuff(loc, length, defaultOK, englishFn, intlFn) {
|
|
|
const mode = loc.listingMode(defaultOK);
|
|
|
|
|
|
if (mode === "error") {
|
|
|
return null;
|
|
|
} else if (mode === "en") {
|
|
|
return englishFn(length);
|
|
|
} else {
|
|
|
return intlFn(length);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function supportsFastNumbers(loc) {
|
|
|
if (loc.numberingSystem && loc.numberingSystem !== "latn") {
|
|
|
return false;
|
|
|
} else {
|
|
|
return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || hasIntl() && new Intl.DateTimeFormat(loc.intl).resolvedOptions().numberingSystem === "latn";
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
|
|
|
class PolyNumberFormatter {
|
|
|
constructor(intl, forceSimple, opts) {
|
|
|
this.padTo = opts.padTo || 0;
|
|
|
this.floor = opts.floor || false;
|
|
|
|
|
|
if (!forceSimple && hasIntl()) {
|
|
|
const intlOpts = {
|
|
|
useGrouping: false
|
|
|
};
|
|
|
if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;
|
|
|
this.inf = getCachedINF(intl, intlOpts);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
format(i) {
|
|
|
if (this.inf) {
|
|
|
const fixed = this.floor ? Math.floor(i) : i;
|
|
|
return this.inf.format(fixed);
|
|
|
} else {
|
|
|
// to match the browser's numberformatter defaults
|
|
|
const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);
|
|
|
return padStart(fixed, this.padTo);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
|
|
|
class PolyDateFormatter {
|
|
|
constructor(dt, intl, opts) {
|
|
|
this.opts = opts;
|
|
|
this.hasIntl = hasIntl();
|
|
|
let z;
|
|
|
|
|
|
if (dt.zone.universal && this.hasIntl) {
|
|
|
// UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.
|
|
|
// That is why fixed-offset TZ is set to that unless it is:
|
|
|
// 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.
|
|
|
// 2. Unsupported by the browser:
|
|
|
// - some do not support Etc/
|
|
|
// - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata
|
|
|
const gmtOffset = -1 * (dt.offset / 60);
|
|
|
const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;
|
|
|
const isOffsetZoneSupported = IANAZone.isValidZone(offsetZ);
|
|
|
|
|
|
if (dt.offset !== 0 && isOffsetZoneSupported) {
|
|
|
z = offsetZ;
|
|
|
this.dt = dt;
|
|
|
} else {
|
|
|
// Not all fixed-offset zones like Etc/+4:30 are present in tzdata.
|
|
|
// So we have to make do. Two cases:
|
|
|
// 1. The format options tell us to show the zone. We can't do that, so the best
|
|
|
// we can do is format the date in UTC.
|
|
|
// 2. The format options don't tell us to show the zone. Then we can adjust them
|
|
|
// the time and tell the formatter to show it to us in UTC, so that the time is right
|
|
|
// and the bad zone doesn't show up.
|
|
|
z = "UTC";
|
|
|
|
|
|
if (opts.timeZoneName) {
|
|
|
this.dt = dt;
|
|
|
} else {
|
|
|
this.dt = dt.offset === 0 ? dt : DateTime.fromMillis(dt.ts + dt.offset * 60 * 1000);
|
|
|
}
|
|
|
}
|
|
|
} else if (dt.zone.type === "local") {
|
|
|
this.dt = dt;
|
|
|
} else {
|
|
|
this.dt = dt;
|
|
|
z = dt.zone.name;
|
|
|
}
|
|
|
|
|
|
if (this.hasIntl) {
|
|
|
const intlOpts = Object.assign({}, this.opts);
|
|
|
|
|
|
if (z) {
|
|
|
intlOpts.timeZone = z;
|
|
|
}
|
|
|
|
|
|
this.dtf = getCachedDTF(intl, intlOpts);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
format() {
|
|
|
if (this.hasIntl) {
|
|
|
return this.dtf.format(this.dt.toJSDate());
|
|
|
} else {
|
|
|
const tokenFormat = formatString(this.opts),
|
|
|
loc = Locale.create("en-US");
|
|
|
return Formatter.create(loc).formatDateTimeFromString(this.dt, tokenFormat);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
formatToParts() {
|
|
|
if (this.hasIntl && hasFormatToParts()) {
|
|
|
return this.dtf.formatToParts(this.dt.toJSDate());
|
|
|
} else {
|
|
|
// This is kind of a cop out. We actually could do this for English. However, we couldn't do it for intl strings
|
|
|
// and IMO it's too weird to have an uncanny valley like that
|
|
|
return [];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
resolvedOptions() {
|
|
|
if (this.hasIntl) {
|
|
|
return this.dtf.resolvedOptions();
|
|
|
} else {
|
|
|
return {
|
|
|
locale: "en-US",
|
|
|
numberingSystem: "latn",
|
|
|
outputCalendar: "gregory"
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
|
|
|
class PolyRelFormatter {
|
|
|
constructor(intl, isEnglish, opts) {
|
|
|
this.opts = Object.assign({
|
|
|
style: "long"
|
|
|
}, opts);
|
|
|
|
|
|
if (!isEnglish && hasRelative()) {
|
|
|
this.rtf = getCachedRTF(intl, opts);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
format(count, unit) {
|
|
|
if (this.rtf) {
|
|
|
return this.rtf.format(count, unit);
|
|
|
} else {
|
|
|
return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
formatToParts(count, unit) {
|
|
|
if (this.rtf) {
|
|
|
return this.rtf.formatToParts(count, unit);
|
|
|
} else {
|
|
|
return [];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
|
|
|
class Locale {
|
|
|
static fromOpts(opts) {
|
|
|
return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.defaultToEN);
|
|
|
}
|
|
|
|
|
|
static create(locale, numberingSystem, outputCalendar, defaultToEN = false) {
|
|
|
const specifiedLocale = locale || Settings$1.defaultLocale,
|
|
|
// the system locale is useful for human readable strings but annoying for parsing/formatting known formats
|
|
|
localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()),
|
|
|
numberingSystemR = numberingSystem || Settings$1.defaultNumberingSystem,
|
|
|
outputCalendarR = outputCalendar || Settings$1.defaultOutputCalendar;
|
|
|
return new Locale(localeR, numberingSystemR, outputCalendarR, specifiedLocale);
|
|
|
}
|
|
|
|
|
|
static resetCache() {
|
|
|
sysLocaleCache = null;
|
|
|
intlDTCache = {};
|
|
|
intlNumCache = {};
|
|
|
intlRelCache = {};
|
|
|
}
|
|
|
|
|
|
static fromObject({
|
|
|
locale,
|
|
|
numberingSystem,
|
|
|
outputCalendar
|
|
|
} = {}) {
|
|
|
return Locale.create(locale, numberingSystem, outputCalendar);
|
|
|
}
|
|
|
|
|
|
constructor(locale, numbering, outputCalendar, specifiedLocale) {
|
|
|
const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);
|
|
|
this.locale = parsedLocale;
|
|
|
this.numberingSystem = numbering || parsedNumberingSystem || null;
|
|
|
this.outputCalendar = outputCalendar || parsedOutputCalendar || null;
|
|
|
this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);
|
|
|
this.weekdaysCache = {
|
|
|
format: {},
|
|
|
standalone: {}
|
|
|
};
|
|
|
this.monthsCache = {
|
|
|
format: {},
|
|
|
standalone: {}
|
|
|
};
|
|
|
this.meridiemCache = null;
|
|
|
this.eraCache = {};
|
|
|
this.specifiedLocale = specifiedLocale;
|
|
|
this.fastNumbersCached = null;
|
|
|
}
|
|
|
|
|
|
get fastNumbers() {
|
|
|
if (this.fastNumbersCached == null) {
|
|
|
this.fastNumbersCached = supportsFastNumbers(this);
|
|
|
}
|
|
|
|
|
|
return this.fastNumbersCached;
|
|
|
}
|
|
|
|
|
|
listingMode(defaultOK = true) {
|
|
|
const intl = hasIntl(),
|
|
|
hasFTP = intl && hasFormatToParts(),
|
|
|
isActuallyEn = this.isEnglish(),
|
|
|
hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory");
|
|
|
|
|
|
if (!hasFTP && !(isActuallyEn && hasNoWeirdness) && !defaultOK) {
|
|
|
return "error";
|
|
|
} else if (!hasFTP || isActuallyEn && hasNoWeirdness) {
|
|
|
return "en";
|
|
|
} else {
|
|
|
return "intl";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
clone(alts) {
|
|
|
if (!alts || Object.getOwnPropertyNames(alts).length === 0) {
|
|
|
return this;
|
|
|
} else {
|
|
|
return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, alts.defaultToEN || false);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
redefaultToEN(alts = {}) {
|
|
|
return this.clone(Object.assign({}, alts, {
|
|
|
defaultToEN: true
|
|
|
}));
|
|
|
}
|
|
|
|
|
|
redefaultToSystem(alts = {}) {
|
|
|
return this.clone(Object.assign({}, alts, {
|
|
|
defaultToEN: false
|
|
|
}));
|
|
|
}
|
|
|
|
|
|
months(length, format = false, defaultOK = true) {
|
|
|
return listStuff(this, length, defaultOK, months, () => {
|
|
|
const intl = format ? {
|
|
|
month: length,
|
|
|
day: "numeric"
|
|
|
} : {
|
|
|
month: length
|
|
|
},
|
|
|
formatStr = format ? "format" : "standalone";
|
|
|
|
|
|
if (!this.monthsCache[formatStr][length]) {
|
|
|
this.monthsCache[formatStr][length] = mapMonths(dt => this.extract(dt, intl, "month"));
|
|
|
}
|
|
|
|
|
|
return this.monthsCache[formatStr][length];
|
|
|
});
|
|
|
}
|
|
|
|
|
|
weekdays(length, format = false, defaultOK = true) {
|
|
|
return listStuff(this, length, defaultOK, weekdays, () => {
|
|
|
const intl = format ? {
|
|
|
weekday: length,
|
|
|
year: "numeric",
|
|
|
month: "long",
|
|
|
day: "numeric"
|
|
|
} : {
|
|
|
weekday: length
|
|
|
},
|
|
|
formatStr = format ? "format" : "standalone";
|
|
|
|
|
|
if (!this.weekdaysCache[formatStr][length]) {
|
|
|
this.weekdaysCache[formatStr][length] = mapWeekdays(dt => this.extract(dt, intl, "weekday"));
|
|
|
}
|
|
|
|
|
|
return this.weekdaysCache[formatStr][length];
|
|
|
});
|
|
|
}
|
|
|
|
|
|
meridiems(defaultOK = true) {
|
|
|
return listStuff(this, undefined, defaultOK, () => meridiems, () => {
|
|
|
// In theory there could be aribitrary day periods. We're gonna assume there are exactly two
|
|
|
// for AM and PM. This is probably wrong, but it's makes parsing way easier.
|
|
|
if (!this.meridiemCache) {
|
|
|
const intl = {
|
|
|
hour: "numeric",
|
|
|
hour12: true
|
|
|
};
|
|
|
this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(dt => this.extract(dt, intl, "dayperiod"));
|
|
|
}
|
|
|
|
|
|
return this.meridiemCache;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
eras(length, defaultOK = true) {
|
|
|
return listStuff(this, length, defaultOK, eras, () => {
|
|
|
const intl = {
|
|
|
era: length
|
|
|
}; // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates
|
|
|
// to definitely enumerate them.
|
|
|
|
|
|
if (!this.eraCache[length]) {
|
|
|
this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map(dt => this.extract(dt, intl, "era"));
|
|
|
}
|
|
|
|
|
|
return this.eraCache[length];
|
|
|
});
|
|
|
}
|
|
|
|
|
|
extract(dt, intlOpts, field) {
|
|
|
const df = this.dtFormatter(dt, intlOpts),
|
|
|
results = df.formatToParts(),
|
|
|
matching = results.find(m => m.type.toLowerCase() === field);
|
|
|
return matching ? matching.value : null;
|
|
|
}
|
|
|
|
|
|
numberFormatter(opts = {}) {
|
|
|
// this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)
|
|
|
// (in contrast, the rest of the condition is used heavily)
|
|
|
return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);
|
|
|
}
|
|
|
|
|
|
dtFormatter(dt, intlOpts = {}) {
|
|
|
return new PolyDateFormatter(dt, this.intl, intlOpts);
|
|
|
}
|
|
|
|
|
|
relFormatter(opts = {}) {
|
|
|
return new PolyRelFormatter(this.intl, this.isEnglish(), opts);
|
|
|
}
|
|
|
|
|
|
isEnglish() {
|
|
|
return this.locale === "en" || this.locale.toLowerCase() === "en-us" || hasIntl() && new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us");
|
|
|
}
|
|
|
|
|
|
equals(other) {
|
|
|
return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* This file handles parsing for well-specified formats. Here's how it works:
|
|
|
* Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.
|
|
|
* An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object
|
|
|
* parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.
|
|
|
* Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors.
|
|
|
* combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.
|
|
|
* Some extractions are super dumb and simpleParse and fromStrings help DRY them.
|
|
|
*/
|
|
|
|
|
|
function combineRegexes(...regexes) {
|
|
|
const full = regexes.reduce((f, r) => f + r.source, "");
|
|
|
return RegExp(`^${full}$`);
|
|
|
}
|
|
|
|
|
|
function combineExtractors(...extractors) {
|
|
|
return m => extractors.reduce(([mergedVals, mergedZone, cursor], ex) => {
|
|
|
const [val, zone, next] = ex(m, cursor);
|
|
|
return [Object.assign(mergedVals, val), mergedZone || zone, next];
|
|
|
}, [{}, null, 1]).slice(0, 2);
|
|
|
}
|
|
|
|
|
|
function parse(s, ...patterns) {
|
|
|
if (s == null) {
|
|
|
return [null, null];
|
|
|
}
|
|
|
|
|
|
for (const [regex, extractor] of patterns) {
|
|
|
const m = regex.exec(s);
|
|
|
|
|
|
if (m) {
|
|
|
return extractor(m);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return [null, null];
|
|
|
}
|
|
|
|
|
|
function simpleParse(...keys) {
|
|
|
return (match, cursor) => {
|
|
|
const ret = {};
|
|
|
let i;
|
|
|
|
|
|
for (i = 0; i < keys.length; i++) {
|
|
|
ret[keys[i]] = parseInteger(match[cursor + i]);
|
|
|
}
|
|
|
|
|
|
return [ret, null, cursor + i];
|
|
|
};
|
|
|
} // ISO and SQL parsing
|
|
|
|
|
|
|
|
|
const offsetRegex = /(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/,
|
|
|
isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/,
|
|
|
isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${offsetRegex.source}?`),
|
|
|
isoTimeExtensionRegex = RegExp(`(?:T${isoTimeRegex.source})?`),
|
|
|
isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/,
|
|
|
isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/,
|
|
|
isoOrdinalRegex = /(\d{4})-?(\d{3})/,
|
|
|
extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"),
|
|
|
extractISOOrdinalData = simpleParse("year", "ordinal"),
|
|
|
sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/,
|
|
|
// dumbed-down version of the ISO one
|
|
|
sqlTimeRegex = RegExp(`${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`),
|
|
|
sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);
|
|
|
|
|
|
function int(match, pos, fallback) {
|
|
|
const m = match[pos];
|
|
|
return isUndefined(m) ? fallback : parseInteger(m);
|
|
|
}
|
|
|
|
|
|
function extractISOYmd(match, cursor) {
|
|
|
const item = {
|
|
|
year: int(match, cursor),
|
|
|
month: int(match, cursor + 1, 1),
|
|
|
day: int(match, cursor + 2, 1)
|
|
|
};
|
|
|
return [item, null, cursor + 3];
|
|
|
}
|
|
|
|
|
|
function extractISOTime(match, cursor) {
|
|
|
const item = {
|
|
|
hours: int(match, cursor, 0),
|
|
|
minutes: int(match, cursor + 1, 0),
|
|
|
seconds: int(match, cursor + 2, 0),
|
|
|
milliseconds: parseMillis(match[cursor + 3])
|
|
|
};
|
|
|
return [item, null, cursor + 4];
|
|
|
}
|
|
|
|
|
|
function extractISOOffset(match, cursor) {
|
|
|
const local = !match[cursor] && !match[cursor + 1],
|
|
|
fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),
|
|
|
zone = local ? null : FixedOffsetZone.instance(fullOffset);
|
|
|
return [{}, zone, cursor + 3];
|
|
|
}
|
|
|
|
|
|
function extractIANAZone(match, cursor) {
|
|
|
const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;
|
|
|
return [{}, zone, cursor + 1];
|
|
|
} // ISO time parsing
|
|
|
|
|
|
|
|
|
const isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`); // ISO duration parsing
|
|
|
|
|
|
const isoDuration = /^-?P(?:(?:(-?\d{1,9})Y)?(?:(-?\d{1,9})M)?(?:(-?\d{1,9})W)?(?:(-?\d{1,9})D)?(?:T(?:(-?\d{1,9})H)?(?:(-?\d{1,9})M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,9}))?S)?)?)$/;
|
|
|
|
|
|
function extractISODuration(match) {
|
|
|
const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] = match;
|
|
|
const hasNegativePrefix = s[0] === "-";
|
|
|
const negativeSeconds = secondStr && secondStr[0] === "-";
|
|
|
|
|
|
const maybeNegate = (num, force = false) => num !== undefined && (force || num && hasNegativePrefix) ? -num : num;
|
|
|
|
|
|
return [{
|
|
|
years: maybeNegate(parseInteger(yearStr)),
|
|
|
months: maybeNegate(parseInteger(monthStr)),
|
|
|
weeks: maybeNegate(parseInteger(weekStr)),
|
|
|
days: maybeNegate(parseInteger(dayStr)),
|
|
|
hours: maybeNegate(parseInteger(hourStr)),
|
|
|
minutes: maybeNegate(parseInteger(minuteStr)),
|
|
|
seconds: maybeNegate(parseInteger(secondStr), secondStr === "-0"),
|
|
|
milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds)
|
|
|
}];
|
|
|
} // These are a little braindead. EDT *should* tell us that we're in, say, America/New_York
|
|
|
// and not just that we're in -240 *right now*. But since I don't think these are used that often
|
|
|
// I'm just going to ignore that
|
|
|
|
|
|
|
|
|
const obsOffsets = {
|
|
|
GMT: 0,
|
|
|
EDT: -4 * 60,
|
|
|
EST: -5 * 60,
|
|
|
CDT: -5 * 60,
|
|
|
CST: -6 * 60,
|
|
|
MDT: -6 * 60,
|
|
|
MST: -7 * 60,
|
|
|
PDT: -7 * 60,
|
|
|
PST: -8 * 60
|
|
|
};
|
|
|
|
|
|
function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {
|
|
|
const result = {
|
|
|
year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),
|
|
|
month: monthsShort.indexOf(monthStr) + 1,
|
|
|
day: parseInteger(dayStr),
|
|
|
hour: parseInteger(hourStr),
|
|
|
minute: parseInteger(minuteStr)
|
|
|
};
|
|
|
if (secondStr) result.second = parseInteger(secondStr);
|
|
|
|
|
|
if (weekdayStr) {
|
|
|
result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1;
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
} // RFC 2822/5322
|
|
|
|
|
|
|
|
|
const rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;
|
|
|
|
|
|
function extractRFC2822(match) {
|
|
|
const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr, obsOffset, milOffset, offHourStr, offMinuteStr] = match,
|
|
|
result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);
|
|
|
let offset;
|
|
|
|
|
|
if (obsOffset) {
|
|
|
offset = obsOffsets[obsOffset];
|
|
|
} else if (milOffset) {
|
|
|
offset = 0;
|
|
|
} else {
|
|
|
offset = signedOffset(offHourStr, offMinuteStr);
|
|
|
}
|
|
|
|
|
|
return [result, new FixedOffsetZone(offset)];
|
|
|
}
|
|
|
|
|
|
function preprocessRFC2822(s) {
|
|
|
// Remove comments and folding whitespace and replace multiple-spaces with a single space
|
|
|
return s.replace(/\([^)]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim();
|
|
|
} // http date
|
|
|
|
|
|
|
|
|
const rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,
|
|
|
rfc850 = /^(Monday|Tuesday|Wedsday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,
|
|
|
ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;
|
|
|
|
|
|
function extractRFC1123Or850(match) {
|
|
|
const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,
|
|
|
result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);
|
|
|
return [result, FixedOffsetZone.utcInstance];
|
|
|
}
|
|
|
|
|
|
function extractASCII(match) {
|
|
|
const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,
|
|
|
result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);
|
|
|
return [result, FixedOffsetZone.utcInstance];
|
|
|
}
|
|
|
|
|
|
const isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);
|
|
|
const isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);
|
|
|
const isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);
|
|
|
const isoTimeCombinedRegex = combineRegexes(isoTimeRegex);
|
|
|
const extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset);
|
|
|
const extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset);
|
|
|
const extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset);
|
|
|
const extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset);
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
function parseISODate(s) {
|
|
|
return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]);
|
|
|
}
|
|
|
function parseRFC2822Date(s) {
|
|
|
return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);
|
|
|
}
|
|
|
function parseHTTPDate(s) {
|
|
|
return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]);
|
|
|
}
|
|
|
function parseISODuration(s) {
|
|
|
return parse(s, [isoDuration, extractISODuration]);
|
|
|
}
|
|
|
const extractISOTimeOnly = combineExtractors(extractISOTime);
|
|
|
function parseISOTimeOnly(s) {
|
|
|
return parse(s, [isoTimeOnly, extractISOTimeOnly]);
|
|
|
}
|
|
|
const sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);
|
|
|
const sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);
|
|
|
const extractISOYmdTimeOffsetAndIANAZone = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone);
|
|
|
const extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone);
|
|
|
function parseSQL(s) {
|
|
|
return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeOffsetAndIANAZone], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]);
|
|
|
}
|
|
|
|
|
|
const INVALID = "Invalid Duration"; // unit conversion constants
|
|
|
|
|
|
const lowOrderMatrix = {
|
|
|
weeks: {
|
|
|
days: 7,
|
|
|
hours: 7 * 24,
|
|
|
minutes: 7 * 24 * 60,
|
|
|
seconds: 7 * 24 * 60 * 60,
|
|
|
milliseconds: 7 * 24 * 60 * 60 * 1000
|
|
|
},
|
|
|
days: {
|
|
|
hours: 24,
|
|
|
minutes: 24 * 60,
|
|
|
seconds: 24 * 60 * 60,
|
|
|
milliseconds: 24 * 60 * 60 * 1000
|
|
|
},
|
|
|
hours: {
|
|
|
minutes: 60,
|
|
|
seconds: 60 * 60,
|
|
|
milliseconds: 60 * 60 * 1000
|
|
|
},
|
|
|
minutes: {
|
|
|
seconds: 60,
|
|
|
milliseconds: 60 * 1000
|
|
|
},
|
|
|
seconds: {
|
|
|
milliseconds: 1000
|
|
|
}
|
|
|
},
|
|
|
casualMatrix = Object.assign({
|
|
|
years: {
|
|
|
quarters: 4,
|
|
|
months: 12,
|
|
|
weeks: 52,
|
|
|
days: 365,
|
|
|
hours: 365 * 24,
|
|
|
minutes: 365 * 24 * 60,
|
|
|
seconds: 365 * 24 * 60 * 60,
|
|
|
milliseconds: 365 * 24 * 60 * 60 * 1000
|
|
|
},
|
|
|
quarters: {
|
|
|
months: 3,
|
|
|
weeks: 13,
|
|
|
days: 91,
|
|
|
hours: 91 * 24,
|
|
|
minutes: 91 * 24 * 60,
|
|
|
seconds: 91 * 24 * 60 * 60,
|
|
|
milliseconds: 91 * 24 * 60 * 60 * 1000
|
|
|
},
|
|
|
months: {
|
|
|
weeks: 4,
|
|
|
days: 30,
|
|
|
hours: 30 * 24,
|
|
|
minutes: 30 * 24 * 60,
|
|
|
seconds: 30 * 24 * 60 * 60,
|
|
|
milliseconds: 30 * 24 * 60 * 60 * 1000
|
|
|
}
|
|
|
}, lowOrderMatrix),
|
|
|
daysInYearAccurate = 146097.0 / 400,
|
|
|
daysInMonthAccurate = 146097.0 / 4800,
|
|
|
accurateMatrix = Object.assign({
|
|
|
years: {
|
|
|
quarters: 4,
|
|
|
months: 12,
|
|
|
weeks: daysInYearAccurate / 7,
|
|
|
days: daysInYearAccurate,
|
|
|
hours: daysInYearAccurate * 24,
|
|
|
minutes: daysInYearAccurate * 24 * 60,
|
|
|
seconds: daysInYearAccurate * 24 * 60 * 60,
|
|
|
milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000
|
|
|
},
|
|
|
quarters: {
|
|
|
months: 3,
|
|
|
weeks: daysInYearAccurate / 28,
|
|
|
days: daysInYearAccurate / 4,
|
|
|
hours: daysInYearAccurate * 24 / 4,
|
|
|
minutes: daysInYearAccurate * 24 * 60 / 4,
|
|
|
seconds: daysInYearAccurate * 24 * 60 * 60 / 4,
|
|
|
milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4
|
|
|
},
|
|
|
months: {
|
|
|
weeks: daysInMonthAccurate / 7,
|
|
|
days: daysInMonthAccurate,
|
|
|
hours: daysInMonthAccurate * 24,
|
|
|
minutes: daysInMonthAccurate * 24 * 60,
|
|
|
seconds: daysInMonthAccurate * 24 * 60 * 60,
|
|
|
milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000
|
|
|
}
|
|
|
}, lowOrderMatrix); // units ordered by size
|
|
|
|
|
|
const orderedUnits = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"];
|
|
|
const reverseUnits = orderedUnits.slice(0).reverse(); // clone really means "create another instance just like this one, but with these changes"
|
|
|
|
|
|
function clone(dur, alts, clear = false) {
|
|
|
// deep merge for vals
|
|
|
const conf = {
|
|
|
values: clear ? alts.values : Object.assign({}, dur.values, alts.values || {}),
|
|
|
loc: dur.loc.clone(alts.loc),
|
|
|
conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy
|
|
|
};
|
|
|
return new Duration(conf);
|
|
|
}
|
|
|
|
|
|
function antiTrunc(n) {
|
|
|
return n < 0 ? Math.floor(n) : Math.ceil(n);
|
|
|
} // NB: mutates parameters
|
|
|
|
|
|
|
|
|
function convert(matrix, fromMap, fromUnit, toMap, toUnit) {
|
|
|
const conv = matrix[toUnit][fromUnit],
|
|
|
raw = fromMap[fromUnit] / conv,
|
|
|
sameSign = Math.sign(raw) === Math.sign(toMap[toUnit]),
|
|
|
// ok, so this is wild, but see the matrix in the tests
|
|
|
added = !sameSign && toMap[toUnit] !== 0 && Math.abs(raw) <= 1 ? antiTrunc(raw) : Math.trunc(raw);
|
|
|
toMap[toUnit] += added;
|
|
|
fromMap[fromUnit] -= added * conv;
|
|
|
} // NB: mutates parameters
|
|
|
|
|
|
|
|
|
function normalizeValues(matrix, vals) {
|
|
|
reverseUnits.reduce((previous, current) => {
|
|
|
if (!isUndefined(vals[current])) {
|
|
|
if (previous) {
|
|
|
convert(matrix, vals, previous, vals, current);
|
|
|
}
|
|
|
|
|
|
return current;
|
|
|
} else {
|
|
|
return previous;
|
|
|
}
|
|
|
}, null);
|
|
|
}
|
|
|
/**
|
|
|
* A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime.plus} to add a Duration object to a DateTime, producing another DateTime.
|
|
|
*
|
|
|
* Here is a brief overview of commonly used methods and getters in Duration:
|
|
|
*
|
|
|
* * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.
|
|
|
* * **Unit values** See the {@link Duration.years}, {@link Duration.months}, {@link Duration.weeks}, {@link Duration.days}, {@link Duration.hours}, {@link Duration.minutes}, {@link Duration.seconds}, {@link Duration.milliseconds} accessors.
|
|
|
* * **Configuration** See {@link Duration.locale} and {@link Duration.numberingSystem} accessors.
|
|
|
* * **Transformation** To create new Durations out of old ones use {@link Duration.plus}, {@link Duration.minus}, {@link Duration.normalize}, {@link Duration.set}, {@link Duration.reconfigure}, {@link Duration.shiftTo}, and {@link Duration.negate}.
|
|
|
* * **Output** To convert the Duration into other representations, see {@link Duration.as}, {@link Duration.toISO}, {@link Duration.toFormat}, and {@link Duration.toJSON}
|
|
|
*
|
|
|
* There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.
|
|
|
*/
|
|
|
|
|
|
|
|
|
class Duration {
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
constructor(config) {
|
|
|
const accurate = config.conversionAccuracy === "longterm" || false;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.values = config.values;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.loc = config.loc || Locale.create();
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.conversionAccuracy = accurate ? "longterm" : "casual";
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.invalid = config.invalid || null;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.matrix = accurate ? accurateMatrix : casualMatrix;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.isLuxonDuration = true;
|
|
|
}
|
|
|
/**
|
|
|
* Create Duration from a number of milliseconds.
|
|
|
* @param {number} count of milliseconds
|
|
|
* @param {Object} opts - options for parsing
|
|
|
* @param {string} [opts.locale='en-US'] - the locale to use
|
|
|
* @param {string} opts.numberingSystem - the numbering system to use
|
|
|
* @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromMillis(count, opts) {
|
|
|
return Duration.fromObject(Object.assign({
|
|
|
milliseconds: count
|
|
|
}, opts));
|
|
|
}
|
|
|
/**
|
|
|
* Create a Duration from a JavaScript object with keys like 'years' and 'hours'.
|
|
|
* If this object is empty then a zero milliseconds duration is returned.
|
|
|
* @param {Object} obj - the object to create the DateTime from
|
|
|
* @param {number} obj.years
|
|
|
* @param {number} obj.quarters
|
|
|
* @param {number} obj.months
|
|
|
* @param {number} obj.weeks
|
|
|
* @param {number} obj.days
|
|
|
* @param {number} obj.hours
|
|
|
* @param {number} obj.minutes
|
|
|
* @param {number} obj.seconds
|
|
|
* @param {number} obj.milliseconds
|
|
|
* @param {string} [obj.locale='en-US'] - the locale to use
|
|
|
* @param {string} obj.numberingSystem - the numbering system to use
|
|
|
* @param {string} [obj.conversionAccuracy='casual'] - the conversion system to use
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromObject(obj) {
|
|
|
if (obj == null || typeof obj !== "object") {
|
|
|
throw new InvalidArgumentError(`Duration.fromObject: argument expected to be an object, got ${obj === null ? "null" : typeof obj}`);
|
|
|
}
|
|
|
|
|
|
return new Duration({
|
|
|
values: normalizeObject(obj, Duration.normalizeUnit, ["locale", "numberingSystem", "conversionAccuracy", "zone" // a bit of debt; it's super inconvenient internally not to be able to blindly pass this
|
|
|
]),
|
|
|
loc: Locale.fromObject(obj),
|
|
|
conversionAccuracy: obj.conversionAccuracy
|
|
|
});
|
|
|
}
|
|
|
/**
|
|
|
* Create a Duration from an ISO 8601 duration string.
|
|
|
* @param {string} text - text to parse
|
|
|
* @param {Object} opts - options for parsing
|
|
|
* @param {string} [opts.locale='en-US'] - the locale to use
|
|
|
* @param {string} opts.numberingSystem - the numbering system to use
|
|
|
* @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_8601#Durations
|
|
|
* @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }
|
|
|
* @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }
|
|
|
* @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromISO(text, opts) {
|
|
|
const [parsed] = parseISODuration(text);
|
|
|
|
|
|
if (parsed) {
|
|
|
const obj = Object.assign(parsed, opts);
|
|
|
return Duration.fromObject(obj);
|
|
|
} else {
|
|
|
return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`);
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Create a Duration from an ISO 8601 time string.
|
|
|
* @param {string} text - text to parse
|
|
|
* @param {Object} opts - options for parsing
|
|
|
* @param {string} [opts.locale='en-US'] - the locale to use
|
|
|
* @param {string} opts.numberingSystem - the numbering system to use
|
|
|
* @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_8601#Times
|
|
|
* @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }
|
|
|
* @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }
|
|
|
* @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }
|
|
|
* @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }
|
|
|
* @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromISOTime(text, opts) {
|
|
|
const [parsed] = parseISOTimeOnly(text);
|
|
|
|
|
|
if (parsed) {
|
|
|
const obj = Object.assign(parsed, opts);
|
|
|
return Duration.fromObject(obj);
|
|
|
} else {
|
|
|
return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`);
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Create an invalid Duration.
|
|
|
* @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent
|
|
|
* @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static invalid(reason, explanation = null) {
|
|
|
if (!reason) {
|
|
|
throw new InvalidArgumentError("need to specify a reason the Duration is invalid");
|
|
|
}
|
|
|
|
|
|
const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);
|
|
|
|
|
|
if (Settings$1.throwOnInvalid) {
|
|
|
throw new InvalidDurationError(invalid);
|
|
|
} else {
|
|
|
return new Duration({
|
|
|
invalid
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
|
|
|
static normalizeUnit(unit) {
|
|
|
const normalized = {
|
|
|
year: "years",
|
|
|
years: "years",
|
|
|
quarter: "quarters",
|
|
|
quarters: "quarters",
|
|
|
month: "months",
|
|
|
months: "months",
|
|
|
week: "weeks",
|
|
|
weeks: "weeks",
|
|
|
day: "days",
|
|
|
days: "days",
|
|
|
hour: "hours",
|
|
|
hours: "hours",
|
|
|
minute: "minutes",
|
|
|
minutes: "minutes",
|
|
|
second: "seconds",
|
|
|
seconds: "seconds",
|
|
|
millisecond: "milliseconds",
|
|
|
milliseconds: "milliseconds"
|
|
|
}[unit ? unit.toLowerCase() : unit];
|
|
|
if (!normalized) throw new InvalidUnitError(unit);
|
|
|
return normalized;
|
|
|
}
|
|
|
/**
|
|
|
* Check if an object is a Duration. Works across context boundaries
|
|
|
* @param {object} o
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static isDuration(o) {
|
|
|
return o && o.isLuxonDuration || false;
|
|
|
}
|
|
|
/**
|
|
|
* Get the locale of a Duration, such 'en-GB'
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get locale() {
|
|
|
return this.isValid ? this.loc.locale : null;
|
|
|
}
|
|
|
/**
|
|
|
* Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration
|
|
|
*
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get numberingSystem() {
|
|
|
return this.isValid ? this.loc.numberingSystem : null;
|
|
|
}
|
|
|
/**
|
|
|
* Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:
|
|
|
* * `S` for milliseconds
|
|
|
* * `s` for seconds
|
|
|
* * `m` for minutes
|
|
|
* * `h` for hours
|
|
|
* * `d` for days
|
|
|
* * `M` for months
|
|
|
* * `y` for years
|
|
|
* Notes:
|
|
|
* * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits
|
|
|
* * The duration will be converted to the set of units in the format string using {@link Duration.shiftTo} and the Durations's conversion accuracy setting.
|
|
|
* @param {string} fmt - the format string
|
|
|
* @param {Object} opts - options
|
|
|
* @param {boolean} [opts.floor=true] - floor numerical values
|
|
|
* @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2"
|
|
|
* @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002"
|
|
|
* @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000"
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toFormat(fmt, opts = {}) {
|
|
|
// reverse-compat since 1.2; we always round down now, never up, and we do it by default
|
|
|
const fmtOpts = Object.assign({}, opts, {
|
|
|
floor: opts.round !== false && opts.floor !== false
|
|
|
});
|
|
|
return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID;
|
|
|
}
|
|
|
/**
|
|
|
* Returns a JavaScript object with this Duration's values.
|
|
|
* @param opts - options for generating the object
|
|
|
* @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output
|
|
|
* @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }
|
|
|
* @return {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toObject(opts = {}) {
|
|
|
if (!this.isValid) return {};
|
|
|
const base = Object.assign({}, this.values);
|
|
|
|
|
|
if (opts.includeConfig) {
|
|
|
base.conversionAccuracy = this.conversionAccuracy;
|
|
|
base.numberingSystem = this.loc.numberingSystem;
|
|
|
base.locale = this.loc.locale;
|
|
|
}
|
|
|
|
|
|
return base;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601-compliant string representation of this Duration.
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_8601#Durations
|
|
|
* @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'
|
|
|
* @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'
|
|
|
* @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'
|
|
|
* @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'
|
|
|
* @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toISO() {
|
|
|
// we could use the formatter, but this is an easier way to get the minimum string
|
|
|
if (!this.isValid) return null;
|
|
|
let s = "P";
|
|
|
if (this.years !== 0) s += this.years + "Y";
|
|
|
if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M";
|
|
|
if (this.weeks !== 0) s += this.weeks + "W";
|
|
|
if (this.days !== 0) s += this.days + "D";
|
|
|
if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T";
|
|
|
if (this.hours !== 0) s += this.hours + "H";
|
|
|
if (this.minutes !== 0) s += this.minutes + "M";
|
|
|
if (this.seconds !== 0 || this.milliseconds !== 0) // this will handle "floating point madness" by removing extra decimal places
|
|
|
// https://stackoverflow.com/questions/588004/is-floating-point-math-broken
|
|
|
s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S";
|
|
|
if (s === "P") s += "T0S";
|
|
|
return s;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.
|
|
|
* Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_8601#Times
|
|
|
* @param {Object} opts - options
|
|
|
* @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0
|
|
|
* @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0
|
|
|
* @param {boolean} [opts.includePrefix=false] - include the `T` prefix
|
|
|
* @param {string} [opts.format='extended'] - choose between the basic and extended format
|
|
|
* @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'
|
|
|
* @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'
|
|
|
* @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'
|
|
|
* @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'
|
|
|
* @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toISOTime(opts = {}) {
|
|
|
if (!this.isValid) return null;
|
|
|
const millis = this.toMillis();
|
|
|
if (millis < 0 || millis >= 86400000) return null;
|
|
|
opts = Object.assign({
|
|
|
suppressMilliseconds: false,
|
|
|
suppressSeconds: false,
|
|
|
includePrefix: false,
|
|
|
format: "extended"
|
|
|
}, opts);
|
|
|
const value = this.shiftTo("hours", "minutes", "seconds", "milliseconds");
|
|
|
let fmt = opts.format === "basic" ? "hhmm" : "hh:mm";
|
|
|
|
|
|
if (!opts.suppressSeconds || value.seconds !== 0 || value.milliseconds !== 0) {
|
|
|
fmt += opts.format === "basic" ? "ss" : ":ss";
|
|
|
|
|
|
if (!opts.suppressMilliseconds || value.milliseconds !== 0) {
|
|
|
fmt += ".SSS";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
let str = value.toFormat(fmt);
|
|
|
|
|
|
if (opts.includePrefix) {
|
|
|
str = "T" + str;
|
|
|
}
|
|
|
|
|
|
return str;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601 representation of this Duration appropriate for use in JSON.
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toJSON() {
|
|
|
return this.toISO();
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601 representation of this Duration appropriate for use in debugging.
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toString() {
|
|
|
return this.toISO();
|
|
|
}
|
|
|
/**
|
|
|
* Returns an milliseconds value of this Duration.
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toMillis() {
|
|
|
return this.as("milliseconds");
|
|
|
}
|
|
|
/**
|
|
|
* Returns an milliseconds value of this Duration. Alias of {@link toMillis}
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
valueOf() {
|
|
|
return this.toMillis();
|
|
|
}
|
|
|
/**
|
|
|
* Make this Duration longer by the specified amount. Return a newly-constructed Duration.
|
|
|
* @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
plus(duration) {
|
|
|
if (!this.isValid) return this;
|
|
|
const dur = friendlyDuration(duration),
|
|
|
result = {};
|
|
|
|
|
|
for (const k of orderedUnits) {
|
|
|
if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {
|
|
|
result[k] = dur.get(k) + this.get(k);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return clone(this, {
|
|
|
values: result
|
|
|
}, true);
|
|
|
}
|
|
|
/**
|
|
|
* Make this Duration shorter by the specified amount. Return a newly-constructed Duration.
|
|
|
* @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
minus(duration) {
|
|
|
if (!this.isValid) return this;
|
|
|
const dur = friendlyDuration(duration);
|
|
|
return this.plus(dur.negate());
|
|
|
}
|
|
|
/**
|
|
|
* Scale this Duration by the specified amount. Return a newly-constructed Duration.
|
|
|
* @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.
|
|
|
* @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnit(x => x * 2) //=> { hours: 2, minutes: 60 }
|
|
|
* @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnit((x, u) => u === "hour" ? x * 2 : x) //=> { hours: 2, minutes: 30 }
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
mapUnits(fn) {
|
|
|
if (!this.isValid) return this;
|
|
|
const result = {};
|
|
|
|
|
|
for (const k of Object.keys(this.values)) {
|
|
|
result[k] = asNumber(fn(this.values[k], k));
|
|
|
}
|
|
|
|
|
|
return clone(this, {
|
|
|
values: result
|
|
|
}, true);
|
|
|
}
|
|
|
/**
|
|
|
* Get the value of unit.
|
|
|
* @param {string} unit - a unit such as 'minute' or 'day'
|
|
|
* @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2
|
|
|
* @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0
|
|
|
* @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get(unit) {
|
|
|
return this[Duration.normalizeUnit(unit)];
|
|
|
}
|
|
|
/**
|
|
|
* "Set" the values of specified units. Return a newly-constructed Duration.
|
|
|
* @param {Object} values - a mapping of units to numbers
|
|
|
* @example dur.set({ years: 2017 })
|
|
|
* @example dur.set({ hours: 8, minutes: 30 })
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
set(values) {
|
|
|
if (!this.isValid) return this;
|
|
|
const mixed = Object.assign(this.values, normalizeObject(values, Duration.normalizeUnit, []));
|
|
|
return clone(this, {
|
|
|
values: mixed
|
|
|
});
|
|
|
}
|
|
|
/**
|
|
|
* "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration.
|
|
|
* @example dur.reconfigure({ locale: 'en-GB' })
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
reconfigure({
|
|
|
locale,
|
|
|
numberingSystem,
|
|
|
conversionAccuracy
|
|
|
} = {}) {
|
|
|
const loc = this.loc.clone({
|
|
|
locale,
|
|
|
numberingSystem
|
|
|
}),
|
|
|
opts = {
|
|
|
loc
|
|
|
};
|
|
|
|
|
|
if (conversionAccuracy) {
|
|
|
opts.conversionAccuracy = conversionAccuracy;
|
|
|
}
|
|
|
|
|
|
return clone(this, opts);
|
|
|
}
|
|
|
/**
|
|
|
* Return the length of the duration in the specified unit.
|
|
|
* @param {string} unit - a unit such as 'minutes' or 'days'
|
|
|
* @example Duration.fromObject({years: 1}).as('days') //=> 365
|
|
|
* @example Duration.fromObject({years: 1}).as('months') //=> 12
|
|
|
* @example Duration.fromObject({hours: 60}).as('days') //=> 2.5
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
as(unit) {
|
|
|
return this.isValid ? this.shiftTo(unit).get(unit) : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Reduce this Duration to its canonical representation in its current units.
|
|
|
* @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }
|
|
|
* @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
normalize() {
|
|
|
if (!this.isValid) return this;
|
|
|
const vals = this.toObject();
|
|
|
normalizeValues(this.matrix, vals);
|
|
|
return clone(this, {
|
|
|
values: vals
|
|
|
}, true);
|
|
|
}
|
|
|
/**
|
|
|
* Convert this Duration into its representation in a different set of units.
|
|
|
* @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
shiftTo(...units) {
|
|
|
if (!this.isValid) return this;
|
|
|
|
|
|
if (units.length === 0) {
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
units = units.map(u => Duration.normalizeUnit(u));
|
|
|
const built = {},
|
|
|
accumulated = {},
|
|
|
vals = this.toObject();
|
|
|
let lastUnit;
|
|
|
|
|
|
for (const k of orderedUnits) {
|
|
|
if (units.indexOf(k) >= 0) {
|
|
|
lastUnit = k;
|
|
|
let own = 0; // anything we haven't boiled down yet should get boiled to this unit
|
|
|
|
|
|
for (const ak in accumulated) {
|
|
|
own += this.matrix[ak][k] * accumulated[ak];
|
|
|
accumulated[ak] = 0;
|
|
|
} // plus anything that's already in this unit
|
|
|
|
|
|
|
|
|
if (isNumber(vals[k])) {
|
|
|
own += vals[k];
|
|
|
}
|
|
|
|
|
|
const i = Math.trunc(own);
|
|
|
built[k] = i;
|
|
|
accumulated[k] = own - i; // we'd like to absorb these fractions in another unit
|
|
|
// plus anything further down the chain that should be rolled up in to this
|
|
|
|
|
|
for (const down in vals) {
|
|
|
if (orderedUnits.indexOf(down) > orderedUnits.indexOf(k)) {
|
|
|
convert(this.matrix, vals, down, built, k);
|
|
|
}
|
|
|
} // otherwise, keep it in the wings to boil it later
|
|
|
|
|
|
} else if (isNumber(vals[k])) {
|
|
|
accumulated[k] = vals[k];
|
|
|
}
|
|
|
} // anything leftover becomes the decimal for the last unit
|
|
|
// lastUnit must be defined since units is not empty
|
|
|
|
|
|
|
|
|
for (const key in accumulated) {
|
|
|
if (accumulated[key] !== 0) {
|
|
|
built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return clone(this, {
|
|
|
values: built
|
|
|
}, true).normalize();
|
|
|
}
|
|
|
/**
|
|
|
* Return the negative of this Duration.
|
|
|
* @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
negate() {
|
|
|
if (!this.isValid) return this;
|
|
|
const negated = {};
|
|
|
|
|
|
for (const k of Object.keys(this.values)) {
|
|
|
negated[k] = -this.values[k];
|
|
|
}
|
|
|
|
|
|
return clone(this, {
|
|
|
values: negated
|
|
|
}, true);
|
|
|
}
|
|
|
/**
|
|
|
* Get the years.
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get years() {
|
|
|
return this.isValid ? this.values.years || 0 : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the quarters.
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get quarters() {
|
|
|
return this.isValid ? this.values.quarters || 0 : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the months.
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get months() {
|
|
|
return this.isValid ? this.values.months || 0 : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the weeks
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get weeks() {
|
|
|
return this.isValid ? this.values.weeks || 0 : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the days.
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get days() {
|
|
|
return this.isValid ? this.values.days || 0 : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the hours.
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get hours() {
|
|
|
return this.isValid ? this.values.hours || 0 : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the minutes.
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get minutes() {
|
|
|
return this.isValid ? this.values.minutes || 0 : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the seconds.
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get seconds() {
|
|
|
return this.isValid ? this.values.seconds || 0 : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the milliseconds.
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get milliseconds() {
|
|
|
return this.isValid ? this.values.milliseconds || 0 : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Returns whether the Duration is invalid. Invalid durations are returned by diff operations
|
|
|
* on invalid DateTimes or Intervals.
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get isValid() {
|
|
|
return this.invalid === null;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an error code if this Duration became invalid, or null if the Duration is valid
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get invalidReason() {
|
|
|
return this.invalid ? this.invalid.reason : null;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an explanation of why this Duration became invalid, or null if the Duration is valid
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get invalidExplanation() {
|
|
|
return this.invalid ? this.invalid.explanation : null;
|
|
|
}
|
|
|
/**
|
|
|
* Equality check
|
|
|
* Two Durations are equal iff they have the same units and the same values for each unit.
|
|
|
* @param {Duration} other
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
equals(other) {
|
|
|
if (!this.isValid || !other.isValid) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (!this.loc.equals(other.loc)) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
function eq(v1, v2) {
|
|
|
// Consider 0 and undefined as equal
|
|
|
if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;
|
|
|
return v1 === v2;
|
|
|
}
|
|
|
|
|
|
for (const u of orderedUnits) {
|
|
|
if (!eq(this.values[u], other.values[u])) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
function friendlyDuration(durationish) {
|
|
|
if (isNumber(durationish)) {
|
|
|
return Duration.fromMillis(durationish);
|
|
|
} else if (Duration.isDuration(durationish)) {
|
|
|
return durationish;
|
|
|
} else if (typeof durationish === "object") {
|
|
|
return Duration.fromObject(durationish);
|
|
|
} else {
|
|
|
throw new InvalidArgumentError(`Unknown duration argument ${durationish} of type ${typeof durationish}`);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const INVALID$1 = "Invalid Interval"; // checks if the start is equal to or before the end
|
|
|
|
|
|
function validateStartEnd(start, end) {
|
|
|
if (!start || !start.isValid) {
|
|
|
return Interval.invalid("missing or invalid start");
|
|
|
} else if (!end || !end.isValid) {
|
|
|
return Interval.invalid("missing or invalid end");
|
|
|
} else if (end < start) {
|
|
|
return Interval.invalid("end before start", `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`);
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.
|
|
|
*
|
|
|
* Here is a brief overview of the most commonly used methods and getters in Interval:
|
|
|
*
|
|
|
* * **Creation** To create an Interval, use {@link fromDateTimes}, {@link after}, {@link before}, or {@link fromISO}.
|
|
|
* * **Accessors** Use {@link start} and {@link end} to get the start and end.
|
|
|
* * **Interrogation** To analyze the Interval, use {@link count}, {@link length}, {@link hasSame}, {@link contains}, {@link isAfter}, or {@link isBefore}.
|
|
|
* * **Transformation** To create other Intervals out of this one, use {@link set}, {@link splitAt}, {@link splitBy}, {@link divideEqually}, {@link merge}, {@link xor}, {@link union}, {@link intersection}, or {@link difference}.
|
|
|
* * **Comparison** To compare this Interval to another one, use {@link equals}, {@link overlaps}, {@link abutsStart}, {@link abutsEnd}, {@link engulfs}.
|
|
|
* * **Output** To convert the Interval into other representations, see {@link toString}, {@link toISO}, {@link toISODate}, {@link toISOTime}, {@link toFormat}, and {@link toDuration}.
|
|
|
*/
|
|
|
|
|
|
|
|
|
class Interval {
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
constructor(config) {
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
this.s = config.start;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.e = config.end;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.invalid = config.invalid || null;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.isLuxonInterval = true;
|
|
|
}
|
|
|
/**
|
|
|
* Create an invalid Interval.
|
|
|
* @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent
|
|
|
* @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information
|
|
|
* @return {Interval}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static invalid(reason, explanation = null) {
|
|
|
if (!reason) {
|
|
|
throw new InvalidArgumentError("need to specify a reason the Interval is invalid");
|
|
|
}
|
|
|
|
|
|
const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);
|
|
|
|
|
|
if (Settings$1.throwOnInvalid) {
|
|
|
throw new InvalidIntervalError(invalid);
|
|
|
} else {
|
|
|
return new Interval({
|
|
|
invalid
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.
|
|
|
* @param {DateTime|Date|Object} start
|
|
|
* @param {DateTime|Date|Object} end
|
|
|
* @return {Interval}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromDateTimes(start, end) {
|
|
|
const builtStart = friendlyDateTime(start),
|
|
|
builtEnd = friendlyDateTime(end);
|
|
|
const validateError = validateStartEnd(builtStart, builtEnd);
|
|
|
|
|
|
if (validateError == null) {
|
|
|
return new Interval({
|
|
|
start: builtStart,
|
|
|
end: builtEnd
|
|
|
});
|
|
|
} else {
|
|
|
return validateError;
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Create an Interval from a start DateTime and a Duration to extend to.
|
|
|
* @param {DateTime|Date|Object} start
|
|
|
* @param {Duration|Object|number} duration - the length of the Interval.
|
|
|
* @return {Interval}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static after(start, duration) {
|
|
|
const dur = friendlyDuration(duration),
|
|
|
dt = friendlyDateTime(start);
|
|
|
return Interval.fromDateTimes(dt, dt.plus(dur));
|
|
|
}
|
|
|
/**
|
|
|
* Create an Interval from an end DateTime and a Duration to extend backwards to.
|
|
|
* @param {DateTime|Date|Object} end
|
|
|
* @param {Duration|Object|number} duration - the length of the Interval.
|
|
|
* @return {Interval}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static before(end, duration) {
|
|
|
const dur = friendlyDuration(duration),
|
|
|
dt = friendlyDateTime(end);
|
|
|
return Interval.fromDateTimes(dt.minus(dur), dt);
|
|
|
}
|
|
|
/**
|
|
|
* Create an Interval from an ISO 8601 string.
|
|
|
* Accepts `<start>/<end>`, `<start>/<duration>`, and `<duration>/<end>` formats.
|
|
|
* @param {string} text - the ISO string to parse
|
|
|
* @param {Object} [opts] - options to pass {@link DateTime.fromISO} and optionally {@link Duration.fromISO}
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals
|
|
|
* @return {Interval}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromISO(text, opts) {
|
|
|
const [s, e] = (text || "").split("/", 2);
|
|
|
|
|
|
if (s && e) {
|
|
|
let start, startIsValid;
|
|
|
|
|
|
try {
|
|
|
start = DateTime.fromISO(s, opts);
|
|
|
startIsValid = start.isValid;
|
|
|
} catch (e) {
|
|
|
startIsValid = false;
|
|
|
}
|
|
|
|
|
|
let end, endIsValid;
|
|
|
|
|
|
try {
|
|
|
end = DateTime.fromISO(e, opts);
|
|
|
endIsValid = end.isValid;
|
|
|
} catch (e) {
|
|
|
endIsValid = false;
|
|
|
}
|
|
|
|
|
|
if (startIsValid && endIsValid) {
|
|
|
return Interval.fromDateTimes(start, end);
|
|
|
}
|
|
|
|
|
|
if (startIsValid) {
|
|
|
const dur = Duration.fromISO(e, opts);
|
|
|
|
|
|
if (dur.isValid) {
|
|
|
return Interval.after(start, dur);
|
|
|
}
|
|
|
} else if (endIsValid) {
|
|
|
const dur = Duration.fromISO(s, opts);
|
|
|
|
|
|
if (dur.isValid) {
|
|
|
return Interval.before(end, dur);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return Interval.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`);
|
|
|
}
|
|
|
/**
|
|
|
* Check if an object is an Interval. Works across context boundaries
|
|
|
* @param {object} o
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static isInterval(o) {
|
|
|
return o && o.isLuxonInterval || false;
|
|
|
}
|
|
|
/**
|
|
|
* Returns the start of the Interval
|
|
|
* @type {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get start() {
|
|
|
return this.isValid ? this.s : null;
|
|
|
}
|
|
|
/**
|
|
|
* Returns the end of the Interval
|
|
|
* @type {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get end() {
|
|
|
return this.isValid ? this.e : null;
|
|
|
}
|
|
|
/**
|
|
|
* Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.
|
|
|
* @type {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get isValid() {
|
|
|
return this.invalidReason === null;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an error code if this Interval is invalid, or null if the Interval is valid
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get invalidReason() {
|
|
|
return this.invalid ? this.invalid.reason : null;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an explanation of why this Interval became invalid, or null if the Interval is valid
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get invalidExplanation() {
|
|
|
return this.invalid ? this.invalid.explanation : null;
|
|
|
}
|
|
|
/**
|
|
|
* Returns the length of the Interval in the specified unit.
|
|
|
* @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
length(unit = "milliseconds") {
|
|
|
return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.
|
|
|
* Unlike {@link length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'
|
|
|
* asks 'what dates are included in this interval?', not 'how many days long is this interval?'
|
|
|
* @param {string} [unit='milliseconds'] - the unit of time to count.
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
count(unit = "milliseconds") {
|
|
|
if (!this.isValid) return NaN;
|
|
|
const start = this.start.startOf(unit),
|
|
|
end = this.end.startOf(unit);
|
|
|
return Math.floor(end.diff(start, unit).get(unit)) + 1;
|
|
|
}
|
|
|
/**
|
|
|
* Returns whether this Interval's start and end are both in the same unit of time
|
|
|
* @param {string} unit - the unit of time to check sameness on
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
hasSame(unit) {
|
|
|
return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this Interval has the same start and end DateTimes.
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
isEmpty() {
|
|
|
return this.s.valueOf() === this.e.valueOf();
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this Interval's start is after the specified DateTime.
|
|
|
* @param {DateTime} dateTime
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
isAfter(dateTime) {
|
|
|
if (!this.isValid) return false;
|
|
|
return this.s > dateTime;
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this Interval's end is before the specified DateTime.
|
|
|
* @param {DateTime} dateTime
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
isBefore(dateTime) {
|
|
|
if (!this.isValid) return false;
|
|
|
return this.e <= dateTime;
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this Interval contains the specified DateTime.
|
|
|
* @param {DateTime} dateTime
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
contains(dateTime) {
|
|
|
if (!this.isValid) return false;
|
|
|
return this.s <= dateTime && this.e > dateTime;
|
|
|
}
|
|
|
/**
|
|
|
* "Sets" the start and/or end dates. Returns a newly-constructed Interval.
|
|
|
* @param {Object} values - the values to set
|
|
|
* @param {DateTime} values.start - the starting DateTime
|
|
|
* @param {DateTime} values.end - the ending DateTime
|
|
|
* @return {Interval}
|
|
|
*/
|
|
|
|
|
|
|
|
|
set({
|
|
|
start,
|
|
|
end
|
|
|
} = {}) {
|
|
|
if (!this.isValid) return this;
|
|
|
return Interval.fromDateTimes(start || this.s, end || this.e);
|
|
|
}
|
|
|
/**
|
|
|
* Split this Interval at each of the specified DateTimes
|
|
|
* @param {...[DateTime]} dateTimes - the unit of time to count.
|
|
|
* @return {[Interval]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
splitAt(...dateTimes) {
|
|
|
if (!this.isValid) return [];
|
|
|
const sorted = dateTimes.map(friendlyDateTime).filter(d => this.contains(d)).sort(),
|
|
|
results = [];
|
|
|
let {
|
|
|
s
|
|
|
} = this,
|
|
|
i = 0;
|
|
|
|
|
|
while (s < this.e) {
|
|
|
const added = sorted[i] || this.e,
|
|
|
next = +added > +this.e ? this.e : added;
|
|
|
results.push(Interval.fromDateTimes(s, next));
|
|
|
s = next;
|
|
|
i += 1;
|
|
|
}
|
|
|
|
|
|
return results;
|
|
|
}
|
|
|
/**
|
|
|
* Split this Interval into smaller Intervals, each of the specified length.
|
|
|
* Left over time is grouped into a smaller interval
|
|
|
* @param {Duration|Object|number} duration - The length of each resulting interval.
|
|
|
* @return {[Interval]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
splitBy(duration) {
|
|
|
const dur = friendlyDuration(duration);
|
|
|
|
|
|
if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) {
|
|
|
return [];
|
|
|
}
|
|
|
|
|
|
let {
|
|
|
s
|
|
|
} = this,
|
|
|
idx = 1,
|
|
|
next;
|
|
|
const results = [];
|
|
|
|
|
|
while (s < this.e) {
|
|
|
const added = this.start.plus(dur.mapUnits(x => x * idx));
|
|
|
next = +added > +this.e ? this.e : added;
|
|
|
results.push(Interval.fromDateTimes(s, next));
|
|
|
s = next;
|
|
|
idx += 1;
|
|
|
}
|
|
|
|
|
|
return results;
|
|
|
}
|
|
|
/**
|
|
|
* Split this Interval into the specified number of smaller intervals.
|
|
|
* @param {number} numberOfParts - The number of Intervals to divide the Interval into.
|
|
|
* @return {[Interval]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
divideEqually(numberOfParts) {
|
|
|
if (!this.isValid) return [];
|
|
|
return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this Interval overlaps with the specified Interval
|
|
|
* @param {Interval} other
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
overlaps(other) {
|
|
|
return this.e > other.s && this.s < other.e;
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this Interval's end is adjacent to the specified Interval's start.
|
|
|
* @param {Interval} other
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
abutsStart(other) {
|
|
|
if (!this.isValid) return false;
|
|
|
return +this.e === +other.s;
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this Interval's start is adjacent to the specified Interval's end.
|
|
|
* @param {Interval} other
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
abutsEnd(other) {
|
|
|
if (!this.isValid) return false;
|
|
|
return +other.e === +this.s;
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this Interval engulfs the start and end of the specified Interval.
|
|
|
* @param {Interval} other
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
engulfs(other) {
|
|
|
if (!this.isValid) return false;
|
|
|
return this.s <= other.s && this.e >= other.e;
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this Interval has the same start and end as the specified Interval.
|
|
|
* @param {Interval} other
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
equals(other) {
|
|
|
if (!this.isValid || !other.isValid) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
return this.s.equals(other.s) && this.e.equals(other.e);
|
|
|
}
|
|
|
/**
|
|
|
* Return an Interval representing the intersection of this Interval and the specified Interval.
|
|
|
* Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.
|
|
|
* Returns null if the intersection is empty, meaning, the intervals don't intersect.
|
|
|
* @param {Interval} other
|
|
|
* @return {Interval}
|
|
|
*/
|
|
|
|
|
|
|
|
|
intersection(other) {
|
|
|
if (!this.isValid) return this;
|
|
|
const s = this.s > other.s ? this.s : other.s,
|
|
|
e = this.e < other.e ? this.e : other.e;
|
|
|
|
|
|
if (s >= e) {
|
|
|
return null;
|
|
|
} else {
|
|
|
return Interval.fromDateTimes(s, e);
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Return an Interval representing the union of this Interval and the specified Interval.
|
|
|
* Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.
|
|
|
* @param {Interval} other
|
|
|
* @return {Interval}
|
|
|
*/
|
|
|
|
|
|
|
|
|
union(other) {
|
|
|
if (!this.isValid) return this;
|
|
|
const s = this.s < other.s ? this.s : other.s,
|
|
|
e = this.e > other.e ? this.e : other.e;
|
|
|
return Interval.fromDateTimes(s, e);
|
|
|
}
|
|
|
/**
|
|
|
* Merge an array of Intervals into a equivalent minimal set of Intervals.
|
|
|
* Combines overlapping and adjacent Intervals.
|
|
|
* @param {[Interval]} intervals
|
|
|
* @return {[Interval]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static merge(intervals) {
|
|
|
const [found, final] = intervals.sort((a, b) => a.s - b.s).reduce(([sofar, current], item) => {
|
|
|
if (!current) {
|
|
|
return [sofar, item];
|
|
|
} else if (current.overlaps(item) || current.abutsStart(item)) {
|
|
|
return [sofar, current.union(item)];
|
|
|
} else {
|
|
|
return [sofar.concat([current]), item];
|
|
|
}
|
|
|
}, [[], null]);
|
|
|
|
|
|
if (final) {
|
|
|
found.push(final);
|
|
|
}
|
|
|
|
|
|
return found;
|
|
|
}
|
|
|
/**
|
|
|
* Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.
|
|
|
* @param {[Interval]} intervals
|
|
|
* @return {[Interval]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static xor(intervals) {
|
|
|
let start = null,
|
|
|
currentCount = 0;
|
|
|
const results = [],
|
|
|
ends = intervals.map(i => [{
|
|
|
time: i.s,
|
|
|
type: "s"
|
|
|
}, {
|
|
|
time: i.e,
|
|
|
type: "e"
|
|
|
}]),
|
|
|
flattened = Array.prototype.concat(...ends),
|
|
|
arr = flattened.sort((a, b) => a.time - b.time);
|
|
|
|
|
|
for (const i of arr) {
|
|
|
currentCount += i.type === "s" ? 1 : -1;
|
|
|
|
|
|
if (currentCount === 1) {
|
|
|
start = i.time;
|
|
|
} else {
|
|
|
if (start && +start !== +i.time) {
|
|
|
results.push(Interval.fromDateTimes(start, i.time));
|
|
|
}
|
|
|
|
|
|
start = null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return Interval.merge(results);
|
|
|
}
|
|
|
/**
|
|
|
* Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.
|
|
|
* @param {...Interval} intervals
|
|
|
* @return {[Interval]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
difference(...intervals) {
|
|
|
return Interval.xor([this].concat(intervals)).map(i => this.intersection(i)).filter(i => i && !i.isEmpty());
|
|
|
}
|
|
|
/**
|
|
|
* Returns a string representation of this Interval appropriate for debugging.
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toString() {
|
|
|
if (!this.isValid) return INVALID$1;
|
|
|
return `[${this.s.toISO()} – ${this.e.toISO()})`;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601-compliant string representation of this Interval.
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals
|
|
|
* @param {Object} opts - The same options as {@link DateTime.toISO}
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toISO(opts) {
|
|
|
if (!this.isValid) return INVALID$1;
|
|
|
return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601-compliant string representation of date of this Interval.
|
|
|
* The time components are ignored.
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toISODate() {
|
|
|
if (!this.isValid) return INVALID$1;
|
|
|
return `${this.s.toISODate()}/${this.e.toISODate()}`;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601-compliant string representation of time of this Interval.
|
|
|
* The date components are ignored.
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals
|
|
|
* @param {Object} opts - The same options as {@link DateTime.toISO}
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toISOTime(opts) {
|
|
|
if (!this.isValid) return INVALID$1;
|
|
|
return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;
|
|
|
}
|
|
|
/**
|
|
|
* Returns a string representation of this Interval formatted according to the specified format string.
|
|
|
* @param {string} dateFormat - the format string. This string formats the start and end time. See {@link DateTime.toFormat} for details.
|
|
|
* @param {Object} opts - options
|
|
|
* @param {string} [opts.separator = ' – '] - a separator to place between the start and end representations
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toFormat(dateFormat, {
|
|
|
separator = " – "
|
|
|
} = {}) {
|
|
|
if (!this.isValid) return INVALID$1;
|
|
|
return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;
|
|
|
}
|
|
|
/**
|
|
|
* Return a Duration representing the time spanned by this interval.
|
|
|
* @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.
|
|
|
* @param {Object} opts - options that affect the creation of the Duration
|
|
|
* @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use
|
|
|
* @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }
|
|
|
* @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }
|
|
|
* @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }
|
|
|
* @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }
|
|
|
* @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toDuration(unit, opts) {
|
|
|
if (!this.isValid) {
|
|
|
return Duration.invalid(this.invalidReason);
|
|
|
}
|
|
|
|
|
|
return this.e.diff(this.s, unit, opts);
|
|
|
}
|
|
|
/**
|
|
|
* Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes
|
|
|
* @param {function} mapFn
|
|
|
* @return {Interval}
|
|
|
* @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())
|
|
|
* @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))
|
|
|
*/
|
|
|
|
|
|
|
|
|
mapEndpoints(mapFn) {
|
|
|
return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.
|
|
|
*/
|
|
|
|
|
|
class Info {
|
|
|
/**
|
|
|
* Return whether the specified zone contains a DST.
|
|
|
* @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
static hasDST(zone = Settings$1.defaultZone) {
|
|
|
const proto = DateTime.now().setZone(zone).set({
|
|
|
month: 12
|
|
|
});
|
|
|
return !zone.universal && proto.offset !== proto.set({
|
|
|
month: 6
|
|
|
}).offset;
|
|
|
}
|
|
|
/**
|
|
|
* Return whether the specified zone is a valid IANA specifier.
|
|
|
* @param {string} zone - Zone to check
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static isValidIANAZone(zone) {
|
|
|
return IANAZone.isValidSpecifier(zone) && IANAZone.isValidZone(zone);
|
|
|
}
|
|
|
/**
|
|
|
* Converts the input into a {@link Zone} instance.
|
|
|
*
|
|
|
* * If `input` is already a Zone instance, it is returned unchanged.
|
|
|
* * If `input` is a string containing a valid time zone name, a Zone instance
|
|
|
* with that name is returned.
|
|
|
* * If `input` is a string that doesn't refer to a known time zone, a Zone
|
|
|
* instance with {@link Zone.isValid} == false is returned.
|
|
|
* * If `input is a number, a Zone instance with the specified fixed offset
|
|
|
* in minutes is returned.
|
|
|
* * If `input` is `null` or `undefined`, the default zone is returned.
|
|
|
* @param {string|Zone|number} [input] - the value to be converted
|
|
|
* @return {Zone}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static normalizeZone(input) {
|
|
|
return normalizeZone(input, Settings$1.defaultZone);
|
|
|
}
|
|
|
/**
|
|
|
* Return an array of standalone month names.
|
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat
|
|
|
* @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long"
|
|
|
* @param {Object} opts - options
|
|
|
* @param {string} [opts.locale] - the locale code
|
|
|
* @param {string} [opts.numberingSystem=null] - the numbering system
|
|
|
* @param {string} [opts.locObj=null] - an existing locale object to use
|
|
|
* @param {string} [opts.outputCalendar='gregory'] - the calendar
|
|
|
* @example Info.months()[0] //=> 'January'
|
|
|
* @example Info.months('short')[0] //=> 'Jan'
|
|
|
* @example Info.months('numeric')[0] //=> '1'
|
|
|
* @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'
|
|
|
* @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'
|
|
|
* @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'
|
|
|
* @return {[string]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static months(length = "long", {
|
|
|
locale = null,
|
|
|
numberingSystem = null,
|
|
|
locObj = null,
|
|
|
outputCalendar = "gregory"
|
|
|
} = {}) {
|
|
|
return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);
|
|
|
}
|
|
|
/**
|
|
|
* Return an array of format month names.
|
|
|
* Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that
|
|
|
* changes the string.
|
|
|
* See {@link months}
|
|
|
* @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long"
|
|
|
* @param {Object} opts - options
|
|
|
* @param {string} [opts.locale] - the locale code
|
|
|
* @param {string} [opts.numberingSystem=null] - the numbering system
|
|
|
* @param {string} [opts.locObj=null] - an existing locale object to use
|
|
|
* @param {string} [opts.outputCalendar='gregory'] - the calendar
|
|
|
* @return {[string]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static monthsFormat(length = "long", {
|
|
|
locale = null,
|
|
|
numberingSystem = null,
|
|
|
locObj = null,
|
|
|
outputCalendar = "gregory"
|
|
|
} = {}) {
|
|
|
return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);
|
|
|
}
|
|
|
/**
|
|
|
* Return an array of standalone week names.
|
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat
|
|
|
* @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long".
|
|
|
* @param {Object} opts - options
|
|
|
* @param {string} [opts.locale] - the locale code
|
|
|
* @param {string} [opts.numberingSystem=null] - the numbering system
|
|
|
* @param {string} [opts.locObj=null] - an existing locale object to use
|
|
|
* @example Info.weekdays()[0] //=> 'Monday'
|
|
|
* @example Info.weekdays('short')[0] //=> 'Mon'
|
|
|
* @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'
|
|
|
* @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'
|
|
|
* @return {[string]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static weekdays(length = "long", {
|
|
|
locale = null,
|
|
|
numberingSystem = null,
|
|
|
locObj = null
|
|
|
} = {}) {
|
|
|
return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);
|
|
|
}
|
|
|
/**
|
|
|
* Return an array of format week names.
|
|
|
* Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that
|
|
|
* changes the string.
|
|
|
* See {@link weekdays}
|
|
|
* @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long".
|
|
|
* @param {Object} opts - options
|
|
|
* @param {string} [opts.locale=null] - the locale code
|
|
|
* @param {string} [opts.numberingSystem=null] - the numbering system
|
|
|
* @param {string} [opts.locObj=null] - an existing locale object to use
|
|
|
* @return {[string]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static weekdaysFormat(length = "long", {
|
|
|
locale = null,
|
|
|
numberingSystem = null,
|
|
|
locObj = null
|
|
|
} = {}) {
|
|
|
return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);
|
|
|
}
|
|
|
/**
|
|
|
* Return an array of meridiems.
|
|
|
* @param {Object} opts - options
|
|
|
* @param {string} [opts.locale] - the locale code
|
|
|
* @example Info.meridiems() //=> [ 'AM', 'PM' ]
|
|
|
* @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]
|
|
|
* @return {[string]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static meridiems({
|
|
|
locale = null
|
|
|
} = {}) {
|
|
|
return Locale.create(locale).meridiems();
|
|
|
}
|
|
|
/**
|
|
|
* Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.
|
|
|
* @param {string} [length='short'] - the length of the era representation, such as "short" or "long".
|
|
|
* @param {Object} opts - options
|
|
|
* @param {string} [opts.locale] - the locale code
|
|
|
* @example Info.eras() //=> [ 'BC', 'AD' ]
|
|
|
* @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]
|
|
|
* @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]
|
|
|
* @return {[string]}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static eras(length = "short", {
|
|
|
locale = null
|
|
|
} = {}) {
|
|
|
return Locale.create(locale, null, "gregory").eras(length);
|
|
|
}
|
|
|
/**
|
|
|
* Return the set of available features in this environment.
|
|
|
* Some features of Luxon are not available in all environments. For example, on older browsers, timezone support is not available. Use this function to figure out if that's the case.
|
|
|
* Keys:
|
|
|
* * `zones`: whether this environment supports IANA timezones
|
|
|
* * `intlTokens`: whether this environment supports internationalized token-based formatting/parsing
|
|
|
* * `intl`: whether this environment supports general internationalization
|
|
|
* * `relative`: whether this environment supports relative time formatting
|
|
|
* @example Info.features() //=> { intl: true, intlTokens: false, zones: true, relative: false }
|
|
|
* @return {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static features() {
|
|
|
let intl = false,
|
|
|
intlTokens = false,
|
|
|
zones = false,
|
|
|
relative = false;
|
|
|
|
|
|
if (hasIntl()) {
|
|
|
intl = true;
|
|
|
intlTokens = hasFormatToParts();
|
|
|
relative = hasRelative();
|
|
|
|
|
|
try {
|
|
|
zones = new Intl.DateTimeFormat("en", {
|
|
|
timeZone: "America/New_York"
|
|
|
}).resolvedOptions().timeZone === "America/New_York";
|
|
|
} catch (e) {
|
|
|
zones = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
intl,
|
|
|
intlTokens,
|
|
|
zones,
|
|
|
relative
|
|
|
};
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function dayDiff(earlier, later) {
|
|
|
const utcDayStart = dt => dt.toUTC(0, {
|
|
|
keepLocalTime: true
|
|
|
}).startOf("day").valueOf(),
|
|
|
ms = utcDayStart(later) - utcDayStart(earlier);
|
|
|
|
|
|
return Math.floor(Duration.fromMillis(ms).as("days"));
|
|
|
}
|
|
|
|
|
|
function highOrderDiffs(cursor, later, units) {
|
|
|
const differs = [["years", (a, b) => b.year - a.year], ["quarters", (a, b) => b.quarter - a.quarter], ["months", (a, b) => b.month - a.month + (b.year - a.year) * 12], ["weeks", (a, b) => {
|
|
|
const days = dayDiff(a, b);
|
|
|
return (days - days % 7) / 7;
|
|
|
}], ["days", dayDiff]];
|
|
|
const results = {};
|
|
|
let lowestOrder, highWater;
|
|
|
|
|
|
for (const [unit, differ] of differs) {
|
|
|
if (units.indexOf(unit) >= 0) {
|
|
|
lowestOrder = unit;
|
|
|
let delta = differ(cursor, later);
|
|
|
highWater = cursor.plus({
|
|
|
[unit]: delta
|
|
|
});
|
|
|
|
|
|
if (highWater > later) {
|
|
|
cursor = cursor.plus({
|
|
|
[unit]: delta - 1
|
|
|
});
|
|
|
delta -= 1;
|
|
|
} else {
|
|
|
cursor = highWater;
|
|
|
}
|
|
|
|
|
|
results[unit] = delta;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return [cursor, results, highWater, lowestOrder];
|
|
|
}
|
|
|
|
|
|
function diff (earlier, later, units, opts) {
|
|
|
let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);
|
|
|
const remainingMillis = later - cursor;
|
|
|
const lowerOrderUnits = units.filter(u => ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0);
|
|
|
|
|
|
if (lowerOrderUnits.length === 0) {
|
|
|
if (highWater < later) {
|
|
|
highWater = cursor.plus({
|
|
|
[lowestOrder]: 1
|
|
|
});
|
|
|
}
|
|
|
|
|
|
if (highWater !== cursor) {
|
|
|
results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const duration = Duration.fromObject(Object.assign(results, opts));
|
|
|
|
|
|
if (lowerOrderUnits.length > 0) {
|
|
|
return Duration.fromMillis(remainingMillis, opts).shiftTo(...lowerOrderUnits).plus(duration);
|
|
|
} else {
|
|
|
return duration;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const numberingSystems = {
|
|
|
arab: "[\u0660-\u0669]",
|
|
|
arabext: "[\u06F0-\u06F9]",
|
|
|
bali: "[\u1B50-\u1B59]",
|
|
|
beng: "[\u09E6-\u09EF]",
|
|
|
deva: "[\u0966-\u096F]",
|
|
|
fullwide: "[\uFF10-\uFF19]",
|
|
|
gujr: "[\u0AE6-\u0AEF]",
|
|
|
hanidec: "[〇|一|二|三|四|五|六|七|八|九]",
|
|
|
khmr: "[\u17E0-\u17E9]",
|
|
|
knda: "[\u0CE6-\u0CEF]",
|
|
|
laoo: "[\u0ED0-\u0ED9]",
|
|
|
limb: "[\u1946-\u194F]",
|
|
|
mlym: "[\u0D66-\u0D6F]",
|
|
|
mong: "[\u1810-\u1819]",
|
|
|
mymr: "[\u1040-\u1049]",
|
|
|
orya: "[\u0B66-\u0B6F]",
|
|
|
tamldec: "[\u0BE6-\u0BEF]",
|
|
|
telu: "[\u0C66-\u0C6F]",
|
|
|
thai: "[\u0E50-\u0E59]",
|
|
|
tibt: "[\u0F20-\u0F29]",
|
|
|
latn: "\\d"
|
|
|
};
|
|
|
const numberingSystemsUTF16 = {
|
|
|
arab: [1632, 1641],
|
|
|
arabext: [1776, 1785],
|
|
|
bali: [6992, 7001],
|
|
|
beng: [2534, 2543],
|
|
|
deva: [2406, 2415],
|
|
|
fullwide: [65296, 65303],
|
|
|
gujr: [2790, 2799],
|
|
|
khmr: [6112, 6121],
|
|
|
knda: [3302, 3311],
|
|
|
laoo: [3792, 3801],
|
|
|
limb: [6470, 6479],
|
|
|
mlym: [3430, 3439],
|
|
|
mong: [6160, 6169],
|
|
|
mymr: [4160, 4169],
|
|
|
orya: [2918, 2927],
|
|
|
tamldec: [3046, 3055],
|
|
|
telu: [3174, 3183],
|
|
|
thai: [3664, 3673],
|
|
|
tibt: [3872, 3881]
|
|
|
}; // eslint-disable-next-line
|
|
|
|
|
|
const hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split("");
|
|
|
function parseDigits(str) {
|
|
|
let value = parseInt(str, 10);
|
|
|
|
|
|
if (isNaN(value)) {
|
|
|
value = "";
|
|
|
|
|
|
for (let i = 0; i < str.length; i++) {
|
|
|
const code = str.charCodeAt(i);
|
|
|
|
|
|
if (str[i].search(numberingSystems.hanidec) !== -1) {
|
|
|
value += hanidecChars.indexOf(str[i]);
|
|
|
} else {
|
|
|
for (const key in numberingSystemsUTF16) {
|
|
|
const [min, max] = numberingSystemsUTF16[key];
|
|
|
|
|
|
if (code >= min && code <= max) {
|
|
|
value += code - min;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return parseInt(value, 10);
|
|
|
} else {
|
|
|
return value;
|
|
|
}
|
|
|
}
|
|
|
function digitRegex({
|
|
|
numberingSystem
|
|
|
}, append = "") {
|
|
|
return new RegExp(`${numberingSystems[numberingSystem || "latn"]}${append}`);
|
|
|
}
|
|
|
|
|
|
const MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support";
|
|
|
|
|
|
function intUnit(regex, post = i => i) {
|
|
|
return {
|
|
|
regex,
|
|
|
deser: ([s]) => post(parseDigits(s))
|
|
|
};
|
|
|
}
|
|
|
|
|
|
const NBSP = String.fromCharCode(160);
|
|
|
const spaceOrNBSP = `( |${NBSP})`;
|
|
|
const spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g");
|
|
|
|
|
|
function fixListRegex(s) {
|
|
|
// make dots optional and also make them literal
|
|
|
// make space and non breakable space characters interchangeable
|
|
|
return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP);
|
|
|
}
|
|
|
|
|
|
function stripInsensitivities(s) {
|
|
|
return s.replace(/\./g, "") // ignore dots that were made optional
|
|
|
.replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp
|
|
|
.toLowerCase();
|
|
|
}
|
|
|
|
|
|
function oneOf(strings, startIndex) {
|
|
|
if (strings === null) {
|
|
|
return null;
|
|
|
} else {
|
|
|
return {
|
|
|
regex: RegExp(strings.map(fixListRegex).join("|")),
|
|
|
deser: ([s]) => strings.findIndex(i => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function offset(regex, groups) {
|
|
|
return {
|
|
|
regex,
|
|
|
deser: ([, h, m]) => signedOffset(h, m),
|
|
|
groups
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function simple(regex) {
|
|
|
return {
|
|
|
regex,
|
|
|
deser: ([s]) => s
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function escapeToken(value) {
|
|
|
// eslint-disable-next-line no-useless-escape
|
|
|
return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
|
|
|
}
|
|
|
|
|
|
function unitForToken(token, loc) {
|
|
|
const one = digitRegex(loc),
|
|
|
two = digitRegex(loc, "{2}"),
|
|
|
three = digitRegex(loc, "{3}"),
|
|
|
four = digitRegex(loc, "{4}"),
|
|
|
six = digitRegex(loc, "{6}"),
|
|
|
oneOrTwo = digitRegex(loc, "{1,2}"),
|
|
|
oneToThree = digitRegex(loc, "{1,3}"),
|
|
|
oneToSix = digitRegex(loc, "{1,6}"),
|
|
|
oneToNine = digitRegex(loc, "{1,9}"),
|
|
|
twoToFour = digitRegex(loc, "{2,4}"),
|
|
|
fourToSix = digitRegex(loc, "{4,6}"),
|
|
|
literal = t => ({
|
|
|
regex: RegExp(escapeToken(t.val)),
|
|
|
deser: ([s]) => s,
|
|
|
literal: true
|
|
|
}),
|
|
|
unitate = t => {
|
|
|
if (token.literal) {
|
|
|
return literal(t);
|
|
|
}
|
|
|
|
|
|
switch (t.val) {
|
|
|
// era
|
|
|
case "G":
|
|
|
return oneOf(loc.eras("short", false), 0);
|
|
|
|
|
|
case "GG":
|
|
|
return oneOf(loc.eras("long", false), 0);
|
|
|
// years
|
|
|
|
|
|
case "y":
|
|
|
return intUnit(oneToSix);
|
|
|
|
|
|
case "yy":
|
|
|
return intUnit(twoToFour, untruncateYear);
|
|
|
|
|
|
case "yyyy":
|
|
|
return intUnit(four);
|
|
|
|
|
|
case "yyyyy":
|
|
|
return intUnit(fourToSix);
|
|
|
|
|
|
case "yyyyyy":
|
|
|
return intUnit(six);
|
|
|
// months
|
|
|
|
|
|
case "M":
|
|
|
return intUnit(oneOrTwo);
|
|
|
|
|
|
case "MM":
|
|
|
return intUnit(two);
|
|
|
|
|
|
case "MMM":
|
|
|
return oneOf(loc.months("short", true, false), 1);
|
|
|
|
|
|
case "MMMM":
|
|
|
return oneOf(loc.months("long", true, false), 1);
|
|
|
|
|
|
case "L":
|
|
|
return intUnit(oneOrTwo);
|
|
|
|
|
|
case "LL":
|
|
|
return intUnit(two);
|
|
|
|
|
|
case "LLL":
|
|
|
return oneOf(loc.months("short", false, false), 1);
|
|
|
|
|
|
case "LLLL":
|
|
|
return oneOf(loc.months("long", false, false), 1);
|
|
|
// dates
|
|
|
|
|
|
case "d":
|
|
|
return intUnit(oneOrTwo);
|
|
|
|
|
|
case "dd":
|
|
|
return intUnit(two);
|
|
|
// ordinals
|
|
|
|
|
|
case "o":
|
|
|
return intUnit(oneToThree);
|
|
|
|
|
|
case "ooo":
|
|
|
return intUnit(three);
|
|
|
// time
|
|
|
|
|
|
case "HH":
|
|
|
return intUnit(two);
|
|
|
|
|
|
case "H":
|
|
|
return intUnit(oneOrTwo);
|
|
|
|
|
|
case "hh":
|
|
|
return intUnit(two);
|
|
|
|
|
|
case "h":
|
|
|
return intUnit(oneOrTwo);
|
|
|
|
|
|
case "mm":
|
|
|
return intUnit(two);
|
|
|
|
|
|
case "m":
|
|
|
return intUnit(oneOrTwo);
|
|
|
|
|
|
case "q":
|
|
|
return intUnit(oneOrTwo);
|
|
|
|
|
|
case "qq":
|
|
|
return intUnit(two);
|
|
|
|
|
|
case "s":
|
|
|
return intUnit(oneOrTwo);
|
|
|
|
|
|
case "ss":
|
|
|
return intUnit(two);
|
|
|
|
|
|
case "S":
|
|
|
return intUnit(oneToThree);
|
|
|
|
|
|
case "SSS":
|
|
|
return intUnit(three);
|
|
|
|
|
|
case "u":
|
|
|
return simple(oneToNine);
|
|
|
// meridiem
|
|
|
|
|
|
case "a":
|
|
|
return oneOf(loc.meridiems(), 0);
|
|
|
// weekYear (k)
|
|
|
|
|
|
case "kkkk":
|
|
|
return intUnit(four);
|
|
|
|
|
|
case "kk":
|
|
|
return intUnit(twoToFour, untruncateYear);
|
|
|
// weekNumber (W)
|
|
|
|
|
|
case "W":
|
|
|
return intUnit(oneOrTwo);
|
|
|
|
|
|
case "WW":
|
|
|
return intUnit(two);
|
|
|
// weekdays
|
|
|
|
|
|
case "E":
|
|
|
case "c":
|
|
|
return intUnit(one);
|
|
|
|
|
|
case "EEE":
|
|
|
return oneOf(loc.weekdays("short", false, false), 1);
|
|
|
|
|
|
case "EEEE":
|
|
|
return oneOf(loc.weekdays("long", false, false), 1);
|
|
|
|
|
|
case "ccc":
|
|
|
return oneOf(loc.weekdays("short", true, false), 1);
|
|
|
|
|
|
case "cccc":
|
|
|
return oneOf(loc.weekdays("long", true, false), 1);
|
|
|
// offset/zone
|
|
|
|
|
|
case "Z":
|
|
|
case "ZZ":
|
|
|
return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);
|
|
|
|
|
|
case "ZZZ":
|
|
|
return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);
|
|
|
// we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing
|
|
|
// because we don't have any way to figure out what they are
|
|
|
|
|
|
case "z":
|
|
|
return simple(/[a-z_+-/]{1,256}?/i);
|
|
|
|
|
|
default:
|
|
|
return literal(t);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
const unit = unitate(token) || {
|
|
|
invalidReason: MISSING_FTP
|
|
|
};
|
|
|
unit.token = token;
|
|
|
return unit;
|
|
|
}
|
|
|
|
|
|
const partTypeStyleToTokenVal = {
|
|
|
year: {
|
|
|
"2-digit": "yy",
|
|
|
numeric: "yyyyy"
|
|
|
},
|
|
|
month: {
|
|
|
numeric: "M",
|
|
|
"2-digit": "MM",
|
|
|
short: "MMM",
|
|
|
long: "MMMM"
|
|
|
},
|
|
|
day: {
|
|
|
numeric: "d",
|
|
|
"2-digit": "dd"
|
|
|
},
|
|
|
weekday: {
|
|
|
short: "EEE",
|
|
|
long: "EEEE"
|
|
|
},
|
|
|
dayperiod: "a",
|
|
|
dayPeriod: "a",
|
|
|
hour: {
|
|
|
numeric: "h",
|
|
|
"2-digit": "hh"
|
|
|
},
|
|
|
minute: {
|
|
|
numeric: "m",
|
|
|
"2-digit": "mm"
|
|
|
},
|
|
|
second: {
|
|
|
numeric: "s",
|
|
|
"2-digit": "ss"
|
|
|
}
|
|
|
};
|
|
|
|
|
|
function tokenForPart(part, locale, formatOpts) {
|
|
|
const {
|
|
|
type,
|
|
|
value
|
|
|
} = part;
|
|
|
|
|
|
if (type === "literal") {
|
|
|
return {
|
|
|
literal: true,
|
|
|
val: value
|
|
|
};
|
|
|
}
|
|
|
|
|
|
const style = formatOpts[type];
|
|
|
let val = partTypeStyleToTokenVal[type];
|
|
|
|
|
|
if (typeof val === "object") {
|
|
|
val = val[style];
|
|
|
}
|
|
|
|
|
|
if (val) {
|
|
|
return {
|
|
|
literal: false,
|
|
|
val
|
|
|
};
|
|
|
}
|
|
|
|
|
|
return undefined;
|
|
|
}
|
|
|
|
|
|
function buildRegex(units) {
|
|
|
const re = units.map(u => u.regex).reduce((f, r) => `${f}(${r.source})`, "");
|
|
|
return [`^${re}$`, units];
|
|
|
}
|
|
|
|
|
|
function match(input, regex, handlers) {
|
|
|
const matches = input.match(regex);
|
|
|
|
|
|
if (matches) {
|
|
|
const all = {};
|
|
|
let matchIndex = 1;
|
|
|
|
|
|
for (const i in handlers) {
|
|
|
if (hasOwnProperty(handlers, i)) {
|
|
|
const h = handlers[i],
|
|
|
groups = h.groups ? h.groups + 1 : 1;
|
|
|
|
|
|
if (!h.literal && h.token) {
|
|
|
all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));
|
|
|
}
|
|
|
|
|
|
matchIndex += groups;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return [matches, all];
|
|
|
} else {
|
|
|
return [matches, {}];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function dateTimeFromMatches(matches) {
|
|
|
const toField = token => {
|
|
|
switch (token) {
|
|
|
case "S":
|
|
|
return "millisecond";
|
|
|
|
|
|
case "s":
|
|
|
return "second";
|
|
|
|
|
|
case "m":
|
|
|
return "minute";
|
|
|
|
|
|
case "h":
|
|
|
case "H":
|
|
|
return "hour";
|
|
|
|
|
|
case "d":
|
|
|
return "day";
|
|
|
|
|
|
case "o":
|
|
|
return "ordinal";
|
|
|
|
|
|
case "L":
|
|
|
case "M":
|
|
|
return "month";
|
|
|
|
|
|
case "y":
|
|
|
return "year";
|
|
|
|
|
|
case "E":
|
|
|
case "c":
|
|
|
return "weekday";
|
|
|
|
|
|
case "W":
|
|
|
return "weekNumber";
|
|
|
|
|
|
case "k":
|
|
|
return "weekYear";
|
|
|
|
|
|
case "q":
|
|
|
return "quarter";
|
|
|
|
|
|
default:
|
|
|
return null;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
let zone;
|
|
|
|
|
|
if (!isUndefined(matches.Z)) {
|
|
|
zone = new FixedOffsetZone(matches.Z);
|
|
|
} else if (!isUndefined(matches.z)) {
|
|
|
zone = IANAZone.create(matches.z);
|
|
|
} else {
|
|
|
zone = null;
|
|
|
}
|
|
|
|
|
|
if (!isUndefined(matches.q)) {
|
|
|
matches.M = (matches.q - 1) * 3 + 1;
|
|
|
}
|
|
|
|
|
|
if (!isUndefined(matches.h)) {
|
|
|
if (matches.h < 12 && matches.a === 1) {
|
|
|
matches.h += 12;
|
|
|
} else if (matches.h === 12 && matches.a === 0) {
|
|
|
matches.h = 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (matches.G === 0 && matches.y) {
|
|
|
matches.y = -matches.y;
|
|
|
}
|
|
|
|
|
|
if (!isUndefined(matches.u)) {
|
|
|
matches.S = parseMillis(matches.u);
|
|
|
}
|
|
|
|
|
|
const vals = Object.keys(matches).reduce((r, k) => {
|
|
|
const f = toField(k);
|
|
|
|
|
|
if (f) {
|
|
|
r[f] = matches[k];
|
|
|
}
|
|
|
|
|
|
return r;
|
|
|
}, {});
|
|
|
return [vals, zone];
|
|
|
}
|
|
|
|
|
|
let dummyDateTimeCache = null;
|
|
|
|
|
|
function getDummyDateTime() {
|
|
|
if (!dummyDateTimeCache) {
|
|
|
dummyDateTimeCache = DateTime.fromMillis(1555555555555);
|
|
|
}
|
|
|
|
|
|
return dummyDateTimeCache;
|
|
|
}
|
|
|
|
|
|
function maybeExpandMacroToken(token, locale) {
|
|
|
if (token.literal) {
|
|
|
return token;
|
|
|
}
|
|
|
|
|
|
const formatOpts = Formatter.macroTokenToFormatOpts(token.val);
|
|
|
|
|
|
if (!formatOpts) {
|
|
|
return token;
|
|
|
}
|
|
|
|
|
|
const formatter = Formatter.create(locale, formatOpts);
|
|
|
const parts = formatter.formatDateTimeParts(getDummyDateTime());
|
|
|
const tokens = parts.map(p => tokenForPart(p, locale, formatOpts));
|
|
|
|
|
|
if (tokens.includes(undefined)) {
|
|
|
return token;
|
|
|
}
|
|
|
|
|
|
return tokens;
|
|
|
}
|
|
|
|
|
|
function expandMacroTokens(tokens, locale) {
|
|
|
return Array.prototype.concat(...tokens.map(t => maybeExpandMacroToken(t, locale)));
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
|
|
|
function explainFromTokens(locale, input, format) {
|
|
|
const tokens = expandMacroTokens(Formatter.parseFormat(format), locale),
|
|
|
units = tokens.map(t => unitForToken(t, locale)),
|
|
|
disqualifyingUnit = units.find(t => t.invalidReason);
|
|
|
|
|
|
if (disqualifyingUnit) {
|
|
|
return {
|
|
|
input,
|
|
|
tokens,
|
|
|
invalidReason: disqualifyingUnit.invalidReason
|
|
|
};
|
|
|
} else {
|
|
|
const [regexString, handlers] = buildRegex(units),
|
|
|
regex = RegExp(regexString, "i"),
|
|
|
[rawMatches, matches] = match(input, regex, handlers),
|
|
|
[result, zone] = matches ? dateTimeFromMatches(matches) : [null, null];
|
|
|
|
|
|
if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) {
|
|
|
throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format");
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
input,
|
|
|
tokens,
|
|
|
regex,
|
|
|
rawMatches,
|
|
|
matches,
|
|
|
result,
|
|
|
zone
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
function parseFromTokens(locale, input, format) {
|
|
|
const {
|
|
|
result,
|
|
|
zone,
|
|
|
invalidReason
|
|
|
} = explainFromTokens(locale, input, format);
|
|
|
return [result, zone, invalidReason];
|
|
|
}
|
|
|
|
|
|
const nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
|
|
|
leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];
|
|
|
|
|
|
function unitOutOfRange(unit, value) {
|
|
|
return new Invalid("unit out of range", `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`);
|
|
|
}
|
|
|
|
|
|
function dayOfWeek(year, month, day) {
|
|
|
const js = new Date(Date.UTC(year, month - 1, day)).getUTCDay();
|
|
|
return js === 0 ? 7 : js;
|
|
|
}
|
|
|
|
|
|
function computeOrdinal(year, month, day) {
|
|
|
return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];
|
|
|
}
|
|
|
|
|
|
function uncomputeOrdinal(year, ordinal) {
|
|
|
const table = isLeapYear(year) ? leapLadder : nonLeapLadder,
|
|
|
month0 = table.findIndex(i => i < ordinal),
|
|
|
day = ordinal - table[month0];
|
|
|
return {
|
|
|
month: month0 + 1,
|
|
|
day
|
|
|
};
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
|
|
|
function gregorianToWeek(gregObj) {
|
|
|
const {
|
|
|
year,
|
|
|
month,
|
|
|
day
|
|
|
} = gregObj,
|
|
|
ordinal = computeOrdinal(year, month, day),
|
|
|
weekday = dayOfWeek(year, month, day);
|
|
|
let weekNumber = Math.floor((ordinal - weekday + 10) / 7),
|
|
|
weekYear;
|
|
|
|
|
|
if (weekNumber < 1) {
|
|
|
weekYear = year - 1;
|
|
|
weekNumber = weeksInWeekYear(weekYear);
|
|
|
} else if (weekNumber > weeksInWeekYear(year)) {
|
|
|
weekYear = year + 1;
|
|
|
weekNumber = 1;
|
|
|
} else {
|
|
|
weekYear = year;
|
|
|
}
|
|
|
|
|
|
return Object.assign({
|
|
|
weekYear,
|
|
|
weekNumber,
|
|
|
weekday
|
|
|
}, timeObject(gregObj));
|
|
|
}
|
|
|
function weekToGregorian(weekData) {
|
|
|
const {
|
|
|
weekYear,
|
|
|
weekNumber,
|
|
|
weekday
|
|
|
} = weekData,
|
|
|
weekdayOfJan4 = dayOfWeek(weekYear, 1, 4),
|
|
|
yearInDays = daysInYear(weekYear);
|
|
|
let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 3,
|
|
|
year;
|
|
|
|
|
|
if (ordinal < 1) {
|
|
|
year = weekYear - 1;
|
|
|
ordinal += daysInYear(year);
|
|
|
} else if (ordinal > yearInDays) {
|
|
|
year = weekYear + 1;
|
|
|
ordinal -= daysInYear(weekYear);
|
|
|
} else {
|
|
|
year = weekYear;
|
|
|
}
|
|
|
|
|
|
const {
|
|
|
month,
|
|
|
day
|
|
|
} = uncomputeOrdinal(year, ordinal);
|
|
|
return Object.assign({
|
|
|
year,
|
|
|
month,
|
|
|
day
|
|
|
}, timeObject(weekData));
|
|
|
}
|
|
|
function gregorianToOrdinal(gregData) {
|
|
|
const {
|
|
|
year,
|
|
|
month,
|
|
|
day
|
|
|
} = gregData,
|
|
|
ordinal = computeOrdinal(year, month, day);
|
|
|
return Object.assign({
|
|
|
year,
|
|
|
ordinal
|
|
|
}, timeObject(gregData));
|
|
|
}
|
|
|
function ordinalToGregorian(ordinalData) {
|
|
|
const {
|
|
|
year,
|
|
|
ordinal
|
|
|
} = ordinalData,
|
|
|
{
|
|
|
month,
|
|
|
day
|
|
|
} = uncomputeOrdinal(year, ordinal);
|
|
|
return Object.assign({
|
|
|
year,
|
|
|
month,
|
|
|
day
|
|
|
}, timeObject(ordinalData));
|
|
|
}
|
|
|
function hasInvalidWeekData(obj) {
|
|
|
const validYear = isInteger(obj.weekYear),
|
|
|
validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear)),
|
|
|
validWeekday = integerBetween(obj.weekday, 1, 7);
|
|
|
|
|
|
if (!validYear) {
|
|
|
return unitOutOfRange("weekYear", obj.weekYear);
|
|
|
} else if (!validWeek) {
|
|
|
return unitOutOfRange("week", obj.week);
|
|
|
} else if (!validWeekday) {
|
|
|
return unitOutOfRange("weekday", obj.weekday);
|
|
|
} else return false;
|
|
|
}
|
|
|
function hasInvalidOrdinalData(obj) {
|
|
|
const validYear = isInteger(obj.year),
|
|
|
validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));
|
|
|
|
|
|
if (!validYear) {
|
|
|
return unitOutOfRange("year", obj.year);
|
|
|
} else if (!validOrdinal) {
|
|
|
return unitOutOfRange("ordinal", obj.ordinal);
|
|
|
} else return false;
|
|
|
}
|
|
|
function hasInvalidGregorianData(obj) {
|
|
|
const validYear = isInteger(obj.year),
|
|
|
validMonth = integerBetween(obj.month, 1, 12),
|
|
|
validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));
|
|
|
|
|
|
if (!validYear) {
|
|
|
return unitOutOfRange("year", obj.year);
|
|
|
} else if (!validMonth) {
|
|
|
return unitOutOfRange("month", obj.month);
|
|
|
} else if (!validDay) {
|
|
|
return unitOutOfRange("day", obj.day);
|
|
|
} else return false;
|
|
|
}
|
|
|
function hasInvalidTimeData(obj) {
|
|
|
const {
|
|
|
hour,
|
|
|
minute,
|
|
|
second,
|
|
|
millisecond
|
|
|
} = obj;
|
|
|
const validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0,
|
|
|
validMinute = integerBetween(minute, 0, 59),
|
|
|
validSecond = integerBetween(second, 0, 59),
|
|
|
validMillisecond = integerBetween(millisecond, 0, 999);
|
|
|
|
|
|
if (!validHour) {
|
|
|
return unitOutOfRange("hour", hour);
|
|
|
} else if (!validMinute) {
|
|
|
return unitOutOfRange("minute", minute);
|
|
|
} else if (!validSecond) {
|
|
|
return unitOutOfRange("second", second);
|
|
|
} else if (!validMillisecond) {
|
|
|
return unitOutOfRange("millisecond", millisecond);
|
|
|
} else return false;
|
|
|
}
|
|
|
|
|
|
const INVALID$2 = "Invalid DateTime";
|
|
|
const MAX_DATE = 8.64e15;
|
|
|
|
|
|
function unsupportedZone(zone) {
|
|
|
return new Invalid("unsupported zone", `the zone "${zone.name}" is not supported`);
|
|
|
} // we cache week data on the DT object and this intermediates the cache
|
|
|
|
|
|
|
|
|
function possiblyCachedWeekData(dt) {
|
|
|
if (dt.weekData === null) {
|
|
|
dt.weekData = gregorianToWeek(dt.c);
|
|
|
}
|
|
|
|
|
|
return dt.weekData;
|
|
|
} // clone really means, "make a new object with these modifications". all "setters" really use this
|
|
|
// to create a new object while only changing some of the properties
|
|
|
|
|
|
|
|
|
function clone$1(inst, alts) {
|
|
|
const current = {
|
|
|
ts: inst.ts,
|
|
|
zone: inst.zone,
|
|
|
c: inst.c,
|
|
|
o: inst.o,
|
|
|
loc: inst.loc,
|
|
|
invalid: inst.invalid
|
|
|
};
|
|
|
return new DateTime(Object.assign({}, current, alts, {
|
|
|
old: current
|
|
|
}));
|
|
|
} // find the right offset a given local time. The o input is our guess, which determines which
|
|
|
// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)
|
|
|
|
|
|
|
|
|
function fixOffset(localTS, o, tz) {
|
|
|
// Our UTC time is just a guess because our offset is just a guess
|
|
|
let utcGuess = localTS - o * 60 * 1000; // Test whether the zone matches the offset for this ts
|
|
|
|
|
|
const o2 = tz.offset(utcGuess); // If so, offset didn't change and we're done
|
|
|
|
|
|
if (o === o2) {
|
|
|
return [utcGuess, o];
|
|
|
} // If not, change the ts by the difference in the offset
|
|
|
|
|
|
|
|
|
utcGuess -= (o2 - o) * 60 * 1000; // If that gives us the local time we want, we're done
|
|
|
|
|
|
const o3 = tz.offset(utcGuess);
|
|
|
|
|
|
if (o2 === o3) {
|
|
|
return [utcGuess, o2];
|
|
|
} // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time
|
|
|
|
|
|
|
|
|
return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];
|
|
|
} // convert an epoch timestamp into a calendar object with the given offset
|
|
|
|
|
|
|
|
|
function tsToObj(ts, offset) {
|
|
|
ts += offset * 60 * 1000;
|
|
|
const d = new Date(ts);
|
|
|
return {
|
|
|
year: d.getUTCFullYear(),
|
|
|
month: d.getUTCMonth() + 1,
|
|
|
day: d.getUTCDate(),
|
|
|
hour: d.getUTCHours(),
|
|
|
minute: d.getUTCMinutes(),
|
|
|
second: d.getUTCSeconds(),
|
|
|
millisecond: d.getUTCMilliseconds()
|
|
|
};
|
|
|
} // convert a calendar object to a epoch timestamp
|
|
|
|
|
|
|
|
|
function objToTS(obj, offset, zone) {
|
|
|
return fixOffset(objToLocalTS(obj), offset, zone);
|
|
|
} // create a new DT instance by adding a duration, adjusting for DSTs
|
|
|
|
|
|
|
|
|
function adjustTime(inst, dur) {
|
|
|
const oPre = inst.o,
|
|
|
year = inst.c.year + Math.trunc(dur.years),
|
|
|
month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,
|
|
|
c = Object.assign({}, inst.c, {
|
|
|
year,
|
|
|
month,
|
|
|
day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7
|
|
|
}),
|
|
|
millisToAdd = Duration.fromObject({
|
|
|
years: dur.years - Math.trunc(dur.years),
|
|
|
quarters: dur.quarters - Math.trunc(dur.quarters),
|
|
|
months: dur.months - Math.trunc(dur.months),
|
|
|
weeks: dur.weeks - Math.trunc(dur.weeks),
|
|
|
days: dur.days - Math.trunc(dur.days),
|
|
|
hours: dur.hours,
|
|
|
minutes: dur.minutes,
|
|
|
seconds: dur.seconds,
|
|
|
milliseconds: dur.milliseconds
|
|
|
}).as("milliseconds"),
|
|
|
localTS = objToLocalTS(c);
|
|
|
let [ts, o] = fixOffset(localTS, oPre, inst.zone);
|
|
|
|
|
|
if (millisToAdd !== 0) {
|
|
|
ts += millisToAdd; // that could have changed the offset by going over a DST, but we want to keep the ts the same
|
|
|
|
|
|
o = inst.zone.offset(ts);
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
ts,
|
|
|
o
|
|
|
};
|
|
|
} // helper useful in turning the results of parsing into real dates
|
|
|
// by handling the zone options
|
|
|
|
|
|
|
|
|
function parseDataToDateTime(parsed, parsedZone, opts, format, text) {
|
|
|
const {
|
|
|
setZone,
|
|
|
zone
|
|
|
} = opts;
|
|
|
|
|
|
if (parsed && Object.keys(parsed).length !== 0) {
|
|
|
const interpretationZone = parsedZone || zone,
|
|
|
inst = DateTime.fromObject(Object.assign(parsed, opts, {
|
|
|
zone: interpretationZone,
|
|
|
// setZone is a valid option in the calling methods, but not in fromObject
|
|
|
setZone: undefined
|
|
|
}));
|
|
|
return setZone ? inst : inst.setZone(zone);
|
|
|
} else {
|
|
|
return DateTime.invalid(new Invalid("unparsable", `the input "${text}" can't be parsed as ${format}`));
|
|
|
}
|
|
|
} // if you want to output a technical format (e.g. RFC 2822), this helper
|
|
|
// helps handle the details
|
|
|
|
|
|
|
|
|
function toTechFormat(dt, format, allowZ = true) {
|
|
|
return dt.isValid ? Formatter.create(Locale.create("en-US"), {
|
|
|
allowZ,
|
|
|
forceSimple: true
|
|
|
}).formatDateTimeFromString(dt, format) : null;
|
|
|
} // technical time formats (e.g. the time part of ISO 8601), take some options
|
|
|
// and this commonizes their handling
|
|
|
|
|
|
|
|
|
function toTechTimeFormat(dt, {
|
|
|
suppressSeconds = false,
|
|
|
suppressMilliseconds = false,
|
|
|
includeOffset,
|
|
|
includePrefix = false,
|
|
|
includeZone = false,
|
|
|
spaceZone = false,
|
|
|
format = "extended"
|
|
|
}) {
|
|
|
let fmt = format === "basic" ? "HHmm" : "HH:mm";
|
|
|
|
|
|
if (!suppressSeconds || dt.second !== 0 || dt.millisecond !== 0) {
|
|
|
fmt += format === "basic" ? "ss" : ":ss";
|
|
|
|
|
|
if (!suppressMilliseconds || dt.millisecond !== 0) {
|
|
|
fmt += ".SSS";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if ((includeZone || includeOffset) && spaceZone) {
|
|
|
fmt += " ";
|
|
|
}
|
|
|
|
|
|
if (includeZone) {
|
|
|
fmt += "z";
|
|
|
} else if (includeOffset) {
|
|
|
fmt += format === "basic" ? "ZZZ" : "ZZ";
|
|
|
}
|
|
|
|
|
|
let str = toTechFormat(dt, fmt);
|
|
|
|
|
|
if (includePrefix) {
|
|
|
str = "T" + str;
|
|
|
}
|
|
|
|
|
|
return str;
|
|
|
} // defaults for unspecified units in the supported calendars
|
|
|
|
|
|
|
|
|
const defaultUnitValues = {
|
|
|
month: 1,
|
|
|
day: 1,
|
|
|
hour: 0,
|
|
|
minute: 0,
|
|
|
second: 0,
|
|
|
millisecond: 0
|
|
|
},
|
|
|
defaultWeekUnitValues = {
|
|
|
weekNumber: 1,
|
|
|
weekday: 1,
|
|
|
hour: 0,
|
|
|
minute: 0,
|
|
|
second: 0,
|
|
|
millisecond: 0
|
|
|
},
|
|
|
defaultOrdinalUnitValues = {
|
|
|
ordinal: 1,
|
|
|
hour: 0,
|
|
|
minute: 0,
|
|
|
second: 0,
|
|
|
millisecond: 0
|
|
|
}; // Units in the supported calendars, sorted by bigness
|
|
|
|
|
|
const orderedUnits$1 = ["year", "month", "day", "hour", "minute", "second", "millisecond"],
|
|
|
orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"],
|
|
|
orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; // standardize case and plurality in units
|
|
|
|
|
|
function normalizeUnit(unit) {
|
|
|
const normalized = {
|
|
|
year: "year",
|
|
|
years: "year",
|
|
|
month: "month",
|
|
|
months: "month",
|
|
|
day: "day",
|
|
|
days: "day",
|
|
|
hour: "hour",
|
|
|
hours: "hour",
|
|
|
minute: "minute",
|
|
|
minutes: "minute",
|
|
|
quarter: "quarter",
|
|
|
quarters: "quarter",
|
|
|
second: "second",
|
|
|
seconds: "second",
|
|
|
millisecond: "millisecond",
|
|
|
milliseconds: "millisecond",
|
|
|
weekday: "weekday",
|
|
|
weekdays: "weekday",
|
|
|
weeknumber: "weekNumber",
|
|
|
weeksnumber: "weekNumber",
|
|
|
weeknumbers: "weekNumber",
|
|
|
weekyear: "weekYear",
|
|
|
weekyears: "weekYear",
|
|
|
ordinal: "ordinal"
|
|
|
}[unit.toLowerCase()];
|
|
|
if (!normalized) throw new InvalidUnitError(unit);
|
|
|
return normalized;
|
|
|
} // this is a dumbed down version of fromObject() that runs about 60% faster
|
|
|
// but doesn't do any validation, makes a bunch of assumptions about what units
|
|
|
// are present, and so on.
|
|
|
|
|
|
|
|
|
function quickDT(obj, zone) {
|
|
|
// assume we have the higher-order units
|
|
|
for (const u of orderedUnits$1) {
|
|
|
if (isUndefined(obj[u])) {
|
|
|
obj[u] = defaultUnitValues[u];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);
|
|
|
|
|
|
if (invalid) {
|
|
|
return DateTime.invalid(invalid);
|
|
|
}
|
|
|
|
|
|
const tsNow = Settings$1.now(),
|
|
|
offsetProvis = zone.offset(tsNow),
|
|
|
[ts, o] = objToTS(obj, offsetProvis, zone);
|
|
|
return new DateTime({
|
|
|
ts,
|
|
|
zone,
|
|
|
o
|
|
|
});
|
|
|
}
|
|
|
|
|
|
function diffRelative(start, end, opts) {
|
|
|
const round = isUndefined(opts.round) ? true : opts.round,
|
|
|
format = (c, unit) => {
|
|
|
c = roundTo(c, round || opts.calendary ? 0 : 2, true);
|
|
|
const formatter = end.loc.clone(opts).relFormatter(opts);
|
|
|
return formatter.format(c, unit);
|
|
|
},
|
|
|
differ = unit => {
|
|
|
if (opts.calendary) {
|
|
|
if (!end.hasSame(start, unit)) {
|
|
|
return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);
|
|
|
} else return 0;
|
|
|
} else {
|
|
|
return end.diff(start, unit).get(unit);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
if (opts.unit) {
|
|
|
return format(differ(opts.unit), opts.unit);
|
|
|
}
|
|
|
|
|
|
for (const unit of opts.units) {
|
|
|
const count = differ(unit);
|
|
|
|
|
|
if (Math.abs(count) >= 1) {
|
|
|
return format(count, unit);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);
|
|
|
}
|
|
|
/**
|
|
|
* A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.
|
|
|
*
|
|
|
* A DateTime comprises of:
|
|
|
* * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.
|
|
|
* * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).
|
|
|
* * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.
|
|
|
*
|
|
|
* Here is a brief overview of the most commonly used functionality it provides:
|
|
|
*
|
|
|
* * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link local}, {@link utc}, and (most flexibly) {@link fromObject}. To create one from a standard string format, use {@link fromISO}, {@link fromHTTP}, and {@link fromRFC2822}. To create one from a custom string format, use {@link fromFormat}. To create one from a native JS date, use {@link fromJSDate}.
|
|
|
* * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link toObject}), use the {@link year}, {@link month},
|
|
|
* {@link day}, {@link hour}, {@link minute}, {@link second}, {@link millisecond} accessors.
|
|
|
* * **Week calendar**: For ISO week calendar attributes, see the {@link weekYear}, {@link weekNumber}, and {@link weekday} accessors.
|
|
|
* * **Configuration** See the {@link locale} and {@link numberingSystem} accessors.
|
|
|
* * **Transformation**: To transform the DateTime into other DateTimes, use {@link set}, {@link reconfigure}, {@link setZone}, {@link setLocale}, {@link plus}, {@link minus}, {@link endOf}, {@link startOf}, {@link toUTC}, and {@link toLocal}.
|
|
|
* * **Output**: To convert the DateTime to other representations, use the {@link toRelative}, {@link toRelativeCalendar}, {@link toJSON}, {@link toISO}, {@link toHTTP}, {@link toObject}, {@link toRFC2822}, {@link toString}, {@link toLocaleString}, {@link toFormat}, {@link toMillis} and {@link toJSDate}.
|
|
|
*
|
|
|
* There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.
|
|
|
*/
|
|
|
|
|
|
|
|
|
class DateTime {
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
constructor(config) {
|
|
|
const zone = config.zone || Settings$1.defaultZone;
|
|
|
let invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null);
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.ts = isUndefined(config.ts) ? Settings$1.now() : config.ts;
|
|
|
let c = null,
|
|
|
o = null;
|
|
|
|
|
|
if (!invalid) {
|
|
|
const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);
|
|
|
|
|
|
if (unchanged) {
|
|
|
[c, o] = [config.old.c, config.old.o];
|
|
|
} else {
|
|
|
const ot = zone.offset(this.ts);
|
|
|
c = tsToObj(this.ts, ot);
|
|
|
invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null;
|
|
|
c = invalid ? null : c;
|
|
|
o = invalid ? null : ot;
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
|
|
|
this._zone = zone;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.loc = config.loc || Locale.create();
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.invalid = invalid;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.weekData = null;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.c = c;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.o = o;
|
|
|
/**
|
|
|
* @access private
|
|
|
*/
|
|
|
|
|
|
this.isLuxonDateTime = true;
|
|
|
} // CONSTRUCT
|
|
|
|
|
|
/**
|
|
|
* Create a DateTime for the current instant, in the system's time zone.
|
|
|
*
|
|
|
* Use Settings to override these default values if needed.
|
|
|
* @example DateTime.now().toISO() //~> now in the ISO format
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static now() {
|
|
|
return new DateTime({});
|
|
|
}
|
|
|
/**
|
|
|
* Create a local DateTime
|
|
|
* @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used
|
|
|
* @param {number} [month=1] - The month, 1-indexed
|
|
|
* @param {number} [day=1] - The day of the month, 1-indexed
|
|
|
* @param {number} [hour=0] - The hour of the day, in 24-hour time
|
|
|
* @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59
|
|
|
* @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59
|
|
|
* @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999
|
|
|
* @example DateTime.local() //~> now
|
|
|
* @example DateTime.local(2017) //~> 2017-01-01T00:00:00
|
|
|
* @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00
|
|
|
* @example DateTime.local(2017, 3, 12) //~> 2017-03-12T00:00:00
|
|
|
* @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00
|
|
|
* @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00
|
|
|
* @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10
|
|
|
* @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static local(year, month, day, hour, minute, second, millisecond) {
|
|
|
if (isUndefined(year)) {
|
|
|
return DateTime.now();
|
|
|
} else {
|
|
|
return quickDT({
|
|
|
year,
|
|
|
month,
|
|
|
day,
|
|
|
hour,
|
|
|
minute,
|
|
|
second,
|
|
|
millisecond
|
|
|
}, Settings$1.defaultZone);
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Create a DateTime in UTC
|
|
|
* @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used
|
|
|
* @param {number} [month=1] - The month, 1-indexed
|
|
|
* @param {number} [day=1] - The day of the month
|
|
|
* @param {number} [hour=0] - The hour of the day, in 24-hour time
|
|
|
* @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59
|
|
|
* @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59
|
|
|
* @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999
|
|
|
* @example DateTime.utc() //~> now
|
|
|
* @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z
|
|
|
* @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z
|
|
|
* @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z
|
|
|
* @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z
|
|
|
* @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z
|
|
|
* @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z
|
|
|
* @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765Z
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static utc(year, month, day, hour, minute, second, millisecond) {
|
|
|
if (isUndefined(year)) {
|
|
|
return new DateTime({
|
|
|
ts: Settings$1.now(),
|
|
|
zone: FixedOffsetZone.utcInstance
|
|
|
});
|
|
|
} else {
|
|
|
return quickDT({
|
|
|
year,
|
|
|
month,
|
|
|
day,
|
|
|
hour,
|
|
|
minute,
|
|
|
second,
|
|
|
millisecond
|
|
|
}, FixedOffsetZone.utcInstance);
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Create a DateTime from a JavaScript Date object. Uses the default zone.
|
|
|
* @param {Date} date - a JavaScript Date object
|
|
|
* @param {Object} options - configuration options for the DateTime
|
|
|
* @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromJSDate(date, options = {}) {
|
|
|
const ts = isDate(date) ? date.valueOf() : NaN;
|
|
|
|
|
|
if (Number.isNaN(ts)) {
|
|
|
return DateTime.invalid("invalid input");
|
|
|
}
|
|
|
|
|
|
const zoneToUse = normalizeZone(options.zone, Settings$1.defaultZone);
|
|
|
|
|
|
if (!zoneToUse.isValid) {
|
|
|
return DateTime.invalid(unsupportedZone(zoneToUse));
|
|
|
}
|
|
|
|
|
|
return new DateTime({
|
|
|
ts: ts,
|
|
|
zone: zoneToUse,
|
|
|
loc: Locale.fromObject(options)
|
|
|
});
|
|
|
}
|
|
|
/**
|
|
|
* Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.
|
|
|
* @param {number} milliseconds - a number of milliseconds since 1970 UTC
|
|
|
* @param {Object} options - configuration options for the DateTime
|
|
|
* @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into
|
|
|
* @param {string} [options.locale] - a locale to set on the resulting DateTime instance
|
|
|
* @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance
|
|
|
* @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromMillis(milliseconds, options = {}) {
|
|
|
if (!isNumber(milliseconds)) {
|
|
|
throw new InvalidArgumentError(`fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`);
|
|
|
} else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {
|
|
|
// this isn't perfect because because we can still end up out of range because of additional shifting, but it's a start
|
|
|
return DateTime.invalid("Timestamp out of range");
|
|
|
} else {
|
|
|
return new DateTime({
|
|
|
ts: milliseconds,
|
|
|
zone: normalizeZone(options.zone, Settings$1.defaultZone),
|
|
|
loc: Locale.fromObject(options)
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.
|
|
|
* @param {number} seconds - a number of seconds since 1970 UTC
|
|
|
* @param {Object} options - configuration options for the DateTime
|
|
|
* @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into
|
|
|
* @param {string} [options.locale] - a locale to set on the resulting DateTime instance
|
|
|
* @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance
|
|
|
* @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromSeconds(seconds, options = {}) {
|
|
|
if (!isNumber(seconds)) {
|
|
|
throw new InvalidArgumentError("fromSeconds requires a numerical input");
|
|
|
} else {
|
|
|
return new DateTime({
|
|
|
ts: seconds * 1000,
|
|
|
zone: normalizeZone(options.zone, Settings$1.defaultZone),
|
|
|
loc: Locale.fromObject(options)
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.
|
|
|
* @param {Object} obj - the object to create the DateTime from
|
|
|
* @param {number} obj.year - a year, such as 1987
|
|
|
* @param {number} obj.month - a month, 1-12
|
|
|
* @param {number} obj.day - a day of the month, 1-31, depending on the month
|
|
|
* @param {number} obj.ordinal - day of the year, 1-365 or 366
|
|
|
* @param {number} obj.weekYear - an ISO week year
|
|
|
* @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year
|
|
|
* @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday
|
|
|
* @param {number} obj.hour - hour of the day, 0-23
|
|
|
* @param {number} obj.minute - minute of the hour, 0-59
|
|
|
* @param {number} obj.second - second of the minute, 0-59
|
|
|
* @param {number} obj.millisecond - millisecond of the second, 0-999
|
|
|
* @param {string|Zone} [obj.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()
|
|
|
* @param {string} [obj.locale='system's locale'] - a locale to set on the resulting DateTime instance
|
|
|
* @param {string} obj.outputCalendar - the output calendar to set on the resulting DateTime instance
|
|
|
* @param {string} obj.numberingSystem - the numbering system to set on the resulting DateTime instance
|
|
|
* @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'
|
|
|
* @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'
|
|
|
* @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06
|
|
|
* @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'utc' }),
|
|
|
* @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'local' })
|
|
|
* @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'America/New_York' })
|
|
|
* @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromObject(obj) {
|
|
|
const zoneToUse = normalizeZone(obj.zone, Settings$1.defaultZone);
|
|
|
|
|
|
if (!zoneToUse.isValid) {
|
|
|
return DateTime.invalid(unsupportedZone(zoneToUse));
|
|
|
}
|
|
|
|
|
|
const tsNow = Settings$1.now(),
|
|
|
offsetProvis = zoneToUse.offset(tsNow),
|
|
|
normalized = normalizeObject(obj, normalizeUnit, ["zone", "locale", "outputCalendar", "numberingSystem"]),
|
|
|
containsOrdinal = !isUndefined(normalized.ordinal),
|
|
|
containsGregorYear = !isUndefined(normalized.year),
|
|
|
containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),
|
|
|
containsGregor = containsGregorYear || containsGregorMD,
|
|
|
definiteWeekDef = normalized.weekYear || normalized.weekNumber,
|
|
|
loc = Locale.fromObject(obj); // cases:
|
|
|
// just a weekday -> this week's instance of that weekday, no worries
|
|
|
// (gregorian data or ordinal) + (weekYear or weekNumber) -> error
|
|
|
// (gregorian month or day) + ordinal -> error
|
|
|
// otherwise just use weeks or ordinals or gregorian, depending on what's specified
|
|
|
|
|
|
if ((containsGregor || containsOrdinal) && definiteWeekDef) {
|
|
|
throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals");
|
|
|
}
|
|
|
|
|
|
if (containsGregorMD && containsOrdinal) {
|
|
|
throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day");
|
|
|
}
|
|
|
|
|
|
const useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; // configure ourselves to deal with gregorian dates or week stuff
|
|
|
|
|
|
let units,
|
|
|
defaultValues,
|
|
|
objNow = tsToObj(tsNow, offsetProvis);
|
|
|
|
|
|
if (useWeekData) {
|
|
|
units = orderedWeekUnits;
|
|
|
defaultValues = defaultWeekUnitValues;
|
|
|
objNow = gregorianToWeek(objNow);
|
|
|
} else if (containsOrdinal) {
|
|
|
units = orderedOrdinalUnits;
|
|
|
defaultValues = defaultOrdinalUnitValues;
|
|
|
objNow = gregorianToOrdinal(objNow);
|
|
|
} else {
|
|
|
units = orderedUnits$1;
|
|
|
defaultValues = defaultUnitValues;
|
|
|
} // set default values for missing stuff
|
|
|
|
|
|
|
|
|
let foundFirst = false;
|
|
|
|
|
|
for (const u of units) {
|
|
|
const v = normalized[u];
|
|
|
|
|
|
if (!isUndefined(v)) {
|
|
|
foundFirst = true;
|
|
|
} else if (foundFirst) {
|
|
|
normalized[u] = defaultValues[u];
|
|
|
} else {
|
|
|
normalized[u] = objNow[u];
|
|
|
}
|
|
|
} // make sure the values we have are in range
|
|
|
|
|
|
|
|
|
const higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized),
|
|
|
invalid = higherOrderInvalid || hasInvalidTimeData(normalized);
|
|
|
|
|
|
if (invalid) {
|
|
|
return DateTime.invalid(invalid);
|
|
|
} // compute the actual time
|
|
|
|
|
|
|
|
|
const gregorian = useWeekData ? weekToGregorian(normalized) : containsOrdinal ? ordinalToGregorian(normalized) : normalized,
|
|
|
[tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),
|
|
|
inst = new DateTime({
|
|
|
ts: tsFinal,
|
|
|
zone: zoneToUse,
|
|
|
o: offsetFinal,
|
|
|
loc
|
|
|
}); // gregorian data + weekday serves only to validate
|
|
|
|
|
|
if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {
|
|
|
return DateTime.invalid("mismatched weekday", `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`);
|
|
|
}
|
|
|
|
|
|
return inst;
|
|
|
}
|
|
|
/**
|
|
|
* Create a DateTime from an ISO 8601 string
|
|
|
* @param {string} text - the ISO string
|
|
|
* @param {Object} opts - options to affect the creation
|
|
|
* @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone
|
|
|
* @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one
|
|
|
* @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance
|
|
|
* @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance
|
|
|
* @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance
|
|
|
* @example DateTime.fromISO('2016-05-25T09:08:34.123')
|
|
|
* @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')
|
|
|
* @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})
|
|
|
* @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})
|
|
|
* @example DateTime.fromISO('2016-W05-4')
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromISO(text, opts = {}) {
|
|
|
const [vals, parsedZone] = parseISODate(text);
|
|
|
return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text);
|
|
|
}
|
|
|
/**
|
|
|
* Create a DateTime from an RFC 2822 string
|
|
|
* @param {string} text - the RFC 2822 string
|
|
|
* @param {Object} opts - options to affect the creation
|
|
|
* @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.
|
|
|
* @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one
|
|
|
* @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance
|
|
|
* @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance
|
|
|
* @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance
|
|
|
* @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')
|
|
|
* @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')
|
|
|
* @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromRFC2822(text, opts = {}) {
|
|
|
const [vals, parsedZone] = parseRFC2822Date(text);
|
|
|
return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text);
|
|
|
}
|
|
|
/**
|
|
|
* Create a DateTime from an HTTP header date
|
|
|
* @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
|
|
|
* @param {string} text - the HTTP header date
|
|
|
* @param {Object} opts - options to affect the creation
|
|
|
* @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.
|
|
|
* @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.
|
|
|
* @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance
|
|
|
* @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance
|
|
|
* @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance
|
|
|
* @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')
|
|
|
* @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')
|
|
|
* @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromHTTP(text, opts = {}) {
|
|
|
const [vals, parsedZone] = parseHTTPDate(text);
|
|
|
return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts);
|
|
|
}
|
|
|
/**
|
|
|
* Create a DateTime from an input string and format string.
|
|
|
* Defaults to en-US if no locale has been specified, regardless of the system's locale.
|
|
|
* @see https://moment.github.io/luxon/docs/manual/parsing.html#table-of-tokens
|
|
|
* @param {string} text - the string to parse
|
|
|
* @param {string} fmt - the format the string is expected to be in (see the link below for the formats)
|
|
|
* @param {Object} opts - options to affect the creation
|
|
|
* @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone
|
|
|
* @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one
|
|
|
* @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale
|
|
|
* @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system
|
|
|
* @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromFormat(text, fmt, opts = {}) {
|
|
|
if (isUndefined(text) || isUndefined(fmt)) {
|
|
|
throw new InvalidArgumentError("fromFormat requires an input string and a format");
|
|
|
}
|
|
|
|
|
|
const {
|
|
|
locale = null,
|
|
|
numberingSystem = null
|
|
|
} = opts,
|
|
|
localeToUse = Locale.fromOpts({
|
|
|
locale,
|
|
|
numberingSystem,
|
|
|
defaultToEN: true
|
|
|
}),
|
|
|
[vals, parsedZone, invalid] = parseFromTokens(localeToUse, text, fmt);
|
|
|
|
|
|
if (invalid) {
|
|
|
return DateTime.invalid(invalid);
|
|
|
} else {
|
|
|
return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text);
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* @deprecated use fromFormat instead
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromString(text, fmt, opts = {}) {
|
|
|
return DateTime.fromFormat(text, fmt, opts);
|
|
|
}
|
|
|
/**
|
|
|
* Create a DateTime from a SQL date, time, or datetime
|
|
|
* Defaults to en-US if no locale has been specified, regardless of the system's locale
|
|
|
* @param {string} text - the string to parse
|
|
|
* @param {Object} opts - options to affect the creation
|
|
|
* @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone
|
|
|
* @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one
|
|
|
* @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale
|
|
|
* @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system
|
|
|
* @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance
|
|
|
* @example DateTime.fromSQL('2017-05-15')
|
|
|
* @example DateTime.fromSQL('2017-05-15 09:12:34')
|
|
|
* @example DateTime.fromSQL('2017-05-15 09:12:34.342')
|
|
|
* @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')
|
|
|
* @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')
|
|
|
* @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })
|
|
|
* @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })
|
|
|
* @example DateTime.fromSQL('09:12:34.342')
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromSQL(text, opts = {}) {
|
|
|
const [vals, parsedZone] = parseSQL(text);
|
|
|
return parseDataToDateTime(vals, parsedZone, opts, "SQL", text);
|
|
|
}
|
|
|
/**
|
|
|
* Create an invalid DateTime.
|
|
|
* @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent
|
|
|
* @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static invalid(reason, explanation = null) {
|
|
|
if (!reason) {
|
|
|
throw new InvalidArgumentError("need to specify a reason the DateTime is invalid");
|
|
|
}
|
|
|
|
|
|
const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);
|
|
|
|
|
|
if (Settings$1.throwOnInvalid) {
|
|
|
throw new InvalidDateTimeError(invalid);
|
|
|
} else {
|
|
|
return new DateTime({
|
|
|
invalid
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Check if an object is a DateTime. Works across context boundaries
|
|
|
* @param {object} o
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static isDateTime(o) {
|
|
|
return o && o.isLuxonDateTime || false;
|
|
|
} // INFO
|
|
|
|
|
|
/**
|
|
|
* Get the value of unit.
|
|
|
* @param {string} unit - a unit such as 'minute' or 'day'
|
|
|
* @example DateTime.local(2017, 7, 4).get('month'); //=> 7
|
|
|
* @example DateTime.local(2017, 7, 4).get('day'); //=> 4
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get(unit) {
|
|
|
return this[unit];
|
|
|
}
|
|
|
/**
|
|
|
* Returns whether the DateTime is valid. Invalid DateTimes occur when:
|
|
|
* * The DateTime was created from invalid calendar information, such as the 13th month or February 30
|
|
|
* * The DateTime was created by an operation on another invalid date
|
|
|
* @type {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get isValid() {
|
|
|
return this.invalid === null;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an error code if this DateTime is invalid, or null if the DateTime is valid
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get invalidReason() {
|
|
|
return this.invalid ? this.invalid.reason : null;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get invalidExplanation() {
|
|
|
return this.invalid ? this.invalid.explanation : null;
|
|
|
}
|
|
|
/**
|
|
|
* Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime
|
|
|
*
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get locale() {
|
|
|
return this.isValid ? this.loc.locale : null;
|
|
|
}
|
|
|
/**
|
|
|
* Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime
|
|
|
*
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get numberingSystem() {
|
|
|
return this.isValid ? this.loc.numberingSystem : null;
|
|
|
}
|
|
|
/**
|
|
|
* Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime
|
|
|
*
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get outputCalendar() {
|
|
|
return this.isValid ? this.loc.outputCalendar : null;
|
|
|
}
|
|
|
/**
|
|
|
* Get the time zone associated with this DateTime.
|
|
|
* @type {Zone}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get zone() {
|
|
|
return this._zone;
|
|
|
}
|
|
|
/**
|
|
|
* Get the name of the time zone.
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get zoneName() {
|
|
|
return this.isValid ? this.zone.name : null;
|
|
|
}
|
|
|
/**
|
|
|
* Get the year
|
|
|
* @example DateTime.local(2017, 5, 25).year //=> 2017
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get year() {
|
|
|
return this.isValid ? this.c.year : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the quarter
|
|
|
* @example DateTime.local(2017, 5, 25).quarter //=> 2
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get quarter() {
|
|
|
return this.isValid ? Math.ceil(this.c.month / 3) : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the month (1-12).
|
|
|
* @example DateTime.local(2017, 5, 25).month //=> 5
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get month() {
|
|
|
return this.isValid ? this.c.month : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the day of the month (1-30ish).
|
|
|
* @example DateTime.local(2017, 5, 25).day //=> 25
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get day() {
|
|
|
return this.isValid ? this.c.day : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the hour of the day (0-23).
|
|
|
* @example DateTime.local(2017, 5, 25, 9).hour //=> 9
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get hour() {
|
|
|
return this.isValid ? this.c.hour : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the minute of the hour (0-59).
|
|
|
* @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get minute() {
|
|
|
return this.isValid ? this.c.minute : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the second of the minute (0-59).
|
|
|
* @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get second() {
|
|
|
return this.isValid ? this.c.second : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the millisecond of the second (0-999).
|
|
|
* @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get millisecond() {
|
|
|
return this.isValid ? this.c.millisecond : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the week year
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_week_date
|
|
|
* @example DateTime.local(2014, 12, 31).weekYear //=> 2015
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get weekYear() {
|
|
|
return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the week number of the week year (1-52ish).
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_week_date
|
|
|
* @example DateTime.local(2017, 5, 25).weekNumber //=> 21
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get weekNumber() {
|
|
|
return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the day of the week.
|
|
|
* 1 is Monday and 7 is Sunday
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_week_date
|
|
|
* @example DateTime.local(2014, 11, 31).weekday //=> 4
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get weekday() {
|
|
|
return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the ordinal (meaning the day of the year)
|
|
|
* @example DateTime.local(2017, 5, 25).ordinal //=> 145
|
|
|
* @type {number|DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get ordinal() {
|
|
|
return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the human readable short month name, such as 'Oct'.
|
|
|
* Defaults to the system's locale if no locale has been specified
|
|
|
* @example DateTime.local(2017, 10, 30).monthShort //=> Oct
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get monthShort() {
|
|
|
return this.isValid ? Info.months("short", {
|
|
|
locObj: this.loc
|
|
|
})[this.month - 1] : null;
|
|
|
}
|
|
|
/**
|
|
|
* Get the human readable long month name, such as 'October'.
|
|
|
* Defaults to the system's locale if no locale has been specified
|
|
|
* @example DateTime.local(2017, 10, 30).monthLong //=> October
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get monthLong() {
|
|
|
return this.isValid ? Info.months("long", {
|
|
|
locObj: this.loc
|
|
|
})[this.month - 1] : null;
|
|
|
}
|
|
|
/**
|
|
|
* Get the human readable short weekday, such as 'Mon'.
|
|
|
* Defaults to the system's locale if no locale has been specified
|
|
|
* @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get weekdayShort() {
|
|
|
return this.isValid ? Info.weekdays("short", {
|
|
|
locObj: this.loc
|
|
|
})[this.weekday - 1] : null;
|
|
|
}
|
|
|
/**
|
|
|
* Get the human readable long weekday, such as 'Monday'.
|
|
|
* Defaults to the system's locale if no locale has been specified
|
|
|
* @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get weekdayLong() {
|
|
|
return this.isValid ? Info.weekdays("long", {
|
|
|
locObj: this.loc
|
|
|
})[this.weekday - 1] : null;
|
|
|
}
|
|
|
/**
|
|
|
* Get the UTC offset of this DateTime in minutes
|
|
|
* @example DateTime.now().offset //=> -240
|
|
|
* @example DateTime.utc().offset //=> 0
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get offset() {
|
|
|
return this.isValid ? +this.o : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Get the short human name for the zone's current offset, for example "EST" or "EDT".
|
|
|
* Defaults to the system's locale if no locale has been specified
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get offsetNameShort() {
|
|
|
if (this.isValid) {
|
|
|
return this.zone.offsetName(this.ts, {
|
|
|
format: "short",
|
|
|
locale: this.locale
|
|
|
});
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time".
|
|
|
* Defaults to the system's locale if no locale has been specified
|
|
|
* @type {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get offsetNameLong() {
|
|
|
if (this.isValid) {
|
|
|
return this.zone.offsetName(this.ts, {
|
|
|
format: "long",
|
|
|
locale: this.locale
|
|
|
});
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Get whether this zone's offset ever changes, as in a DST.
|
|
|
* @type {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get isOffsetFixed() {
|
|
|
return this.isValid ? this.zone.universal : null;
|
|
|
}
|
|
|
/**
|
|
|
* Get whether the DateTime is in a DST.
|
|
|
* @type {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get isInDST() {
|
|
|
if (this.isOffsetFixed) {
|
|
|
return false;
|
|
|
} else {
|
|
|
return this.offset > this.set({
|
|
|
month: 1
|
|
|
}).offset || this.offset > this.set({
|
|
|
month: 5
|
|
|
}).offset;
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Returns true if this DateTime is in a leap year, false otherwise
|
|
|
* @example DateTime.local(2016).isInLeapYear //=> true
|
|
|
* @example DateTime.local(2013).isInLeapYear //=> false
|
|
|
* @type {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get isInLeapYear() {
|
|
|
return isLeapYear(this.year);
|
|
|
}
|
|
|
/**
|
|
|
* Returns the number of days in this DateTime's month
|
|
|
* @example DateTime.local(2016, 2).daysInMonth //=> 29
|
|
|
* @example DateTime.local(2016, 3).daysInMonth //=> 31
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get daysInMonth() {
|
|
|
return daysInMonth(this.year, this.month);
|
|
|
}
|
|
|
/**
|
|
|
* Returns the number of days in this DateTime's year
|
|
|
* @example DateTime.local(2016).daysInYear //=> 366
|
|
|
* @example DateTime.local(2013).daysInYear //=> 365
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get daysInYear() {
|
|
|
return this.isValid ? daysInYear(this.year) : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Returns the number of weeks in this DateTime's year
|
|
|
* @see https://en.wikipedia.org/wiki/ISO_week_date
|
|
|
* @example DateTime.local(2004).weeksInWeekYear //=> 53
|
|
|
* @example DateTime.local(2013).weeksInWeekYear //=> 52
|
|
|
* @type {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
get weeksInWeekYear() {
|
|
|
return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Returns the resolved Intl options for this DateTime.
|
|
|
* This is useful in understanding the behavior of formatting methods
|
|
|
* @param {Object} opts - the same options as toLocaleString
|
|
|
* @return {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
resolvedLocaleOpts(opts = {}) {
|
|
|
const {
|
|
|
locale,
|
|
|
numberingSystem,
|
|
|
calendar
|
|
|
} = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this);
|
|
|
return {
|
|
|
locale,
|
|
|
numberingSystem,
|
|
|
outputCalendar: calendar
|
|
|
};
|
|
|
} // TRANSFORM
|
|
|
|
|
|
/**
|
|
|
* "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime.
|
|
|
*
|
|
|
* Equivalent to {@link setZone}('utc')
|
|
|
* @param {number} [offset=0] - optionally, an offset from UTC in minutes
|
|
|
* @param {Object} [opts={}] - options to pass to `setZone()`
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toUTC(offset = 0, opts = {}) {
|
|
|
return this.setZone(FixedOffsetZone.instance(offset), opts);
|
|
|
}
|
|
|
/**
|
|
|
* "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.
|
|
|
*
|
|
|
* Equivalent to `setZone('local')`
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toLocal() {
|
|
|
return this.setZone(Settings$1.defaultZone);
|
|
|
}
|
|
|
/**
|
|
|
* "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.
|
|
|
*
|
|
|
* By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link plus}. You may wish to use {@link toLocal} and {@link toUTC} which provide simple convenience wrappers for commonly used zones.
|
|
|
* @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link Zone} class.
|
|
|
* @param {Object} opts - options
|
|
|
* @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
setZone(zone, {
|
|
|
keepLocalTime = false,
|
|
|
keepCalendarTime = false
|
|
|
} = {}) {
|
|
|
zone = normalizeZone(zone, Settings$1.defaultZone);
|
|
|
|
|
|
if (zone.equals(this.zone)) {
|
|
|
return this;
|
|
|
} else if (!zone.isValid) {
|
|
|
return DateTime.invalid(unsupportedZone(zone));
|
|
|
} else {
|
|
|
let newTS = this.ts;
|
|
|
|
|
|
if (keepLocalTime || keepCalendarTime) {
|
|
|
const offsetGuess = zone.offset(this.ts);
|
|
|
const asObj = this.toObject();
|
|
|
[newTS] = objToTS(asObj, offsetGuess, zone);
|
|
|
}
|
|
|
|
|
|
return clone$1(this, {
|
|
|
ts: newTS,
|
|
|
zone
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.
|
|
|
* @param {Object} properties - the properties to set
|
|
|
* @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
reconfigure({
|
|
|
locale,
|
|
|
numberingSystem,
|
|
|
outputCalendar
|
|
|
} = {}) {
|
|
|
const loc = this.loc.clone({
|
|
|
locale,
|
|
|
numberingSystem,
|
|
|
outputCalendar
|
|
|
});
|
|
|
return clone$1(this, {
|
|
|
loc
|
|
|
});
|
|
|
}
|
|
|
/**
|
|
|
* "Set" the locale. Returns a newly-constructed DateTime.
|
|
|
* Just a convenient alias for reconfigure({ locale })
|
|
|
* @example DateTime.local(2017, 5, 25).setLocale('en-GB')
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
setLocale(locale) {
|
|
|
return this.reconfigure({
|
|
|
locale
|
|
|
});
|
|
|
}
|
|
|
/**
|
|
|
* "Set" the values of specified units. Returns a newly-constructed DateTime.
|
|
|
* You can only set units with this method; for "setting" metadata, see {@link reconfigure} and {@link setZone}.
|
|
|
* @param {Object} values - a mapping of units to numbers
|
|
|
* @example dt.set({ year: 2017 })
|
|
|
* @example dt.set({ hour: 8, minute: 30 })
|
|
|
* @example dt.set({ weekday: 5 })
|
|
|
* @example dt.set({ year: 2005, ordinal: 234 })
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
set(values) {
|
|
|
if (!this.isValid) return this;
|
|
|
const normalized = normalizeObject(values, normalizeUnit, []),
|
|
|
settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday),
|
|
|
containsOrdinal = !isUndefined(normalized.ordinal),
|
|
|
containsGregorYear = !isUndefined(normalized.year),
|
|
|
containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),
|
|
|
containsGregor = containsGregorYear || containsGregorMD,
|
|
|
definiteWeekDef = normalized.weekYear || normalized.weekNumber;
|
|
|
|
|
|
if ((containsGregor || containsOrdinal) && definiteWeekDef) {
|
|
|
throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals");
|
|
|
}
|
|
|
|
|
|
if (containsGregorMD && containsOrdinal) {
|
|
|
throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day");
|
|
|
}
|
|
|
|
|
|
let mixed;
|
|
|
|
|
|
if (settingWeekStuff) {
|
|
|
mixed = weekToGregorian(Object.assign(gregorianToWeek(this.c), normalized));
|
|
|
} else if (!isUndefined(normalized.ordinal)) {
|
|
|
mixed = ordinalToGregorian(Object.assign(gregorianToOrdinal(this.c), normalized));
|
|
|
} else {
|
|
|
mixed = Object.assign(this.toObject(), normalized); // if we didn't set the day but we ended up on an overflow date,
|
|
|
// use the last day of the right month
|
|
|
|
|
|
if (isUndefined(normalized.day)) {
|
|
|
mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const [ts, o] = objToTS(mixed, this.o, this.zone);
|
|
|
return clone$1(this, {
|
|
|
ts,
|
|
|
o
|
|
|
});
|
|
|
}
|
|
|
/**
|
|
|
* Add a period of time to this DateTime and return the resulting DateTime
|
|
|
*
|
|
|
* Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.
|
|
|
* @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()
|
|
|
* @example DateTime.now().plus(123) //~> in 123 milliseconds
|
|
|
* @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes
|
|
|
* @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow
|
|
|
* @example DateTime.now().plus({ days: -1 }) //~> this time yesterday
|
|
|
* @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min
|
|
|
* @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
plus(duration) {
|
|
|
if (!this.isValid) return this;
|
|
|
const dur = friendlyDuration(duration);
|
|
|
return clone$1(this, adjustTime(this, dur));
|
|
|
}
|
|
|
/**
|
|
|
* Subtract a period of time to this DateTime and return the resulting DateTime
|
|
|
* See {@link plus}
|
|
|
* @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()
|
|
|
@return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
minus(duration) {
|
|
|
if (!this.isValid) return this;
|
|
|
const dur = friendlyDuration(duration).negate();
|
|
|
return clone$1(this, adjustTime(this, dur));
|
|
|
}
|
|
|
/**
|
|
|
* "Set" this DateTime to the beginning of a unit of time.
|
|
|
* @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.
|
|
|
* @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'
|
|
|
* @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'
|
|
|
* @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays
|
|
|
* @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'
|
|
|
* @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
startOf(unit) {
|
|
|
if (!this.isValid) return this;
|
|
|
const o = {},
|
|
|
normalizedUnit = Duration.normalizeUnit(unit);
|
|
|
|
|
|
switch (normalizedUnit) {
|
|
|
case "years":
|
|
|
o.month = 1;
|
|
|
// falls through
|
|
|
|
|
|
case "quarters":
|
|
|
case "months":
|
|
|
o.day = 1;
|
|
|
// falls through
|
|
|
|
|
|
case "weeks":
|
|
|
case "days":
|
|
|
o.hour = 0;
|
|
|
// falls through
|
|
|
|
|
|
case "hours":
|
|
|
o.minute = 0;
|
|
|
// falls through
|
|
|
|
|
|
case "minutes":
|
|
|
o.second = 0;
|
|
|
// falls through
|
|
|
|
|
|
case "seconds":
|
|
|
o.millisecond = 0;
|
|
|
break;
|
|
|
// no default, invalid units throw in normalizeUnit()
|
|
|
}
|
|
|
|
|
|
if (normalizedUnit === "weeks") {
|
|
|
o.weekday = 1;
|
|
|
}
|
|
|
|
|
|
if (normalizedUnit === "quarters") {
|
|
|
const q = Math.ceil(this.month / 3);
|
|
|
o.month = (q - 1) * 3 + 1;
|
|
|
}
|
|
|
|
|
|
return this.set(o);
|
|
|
}
|
|
|
/**
|
|
|
* "Set" this DateTime to the end (meaning the last millisecond) of a unit of time
|
|
|
* @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.
|
|
|
* @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'
|
|
|
* @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'
|
|
|
* @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays
|
|
|
* @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'
|
|
|
* @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'
|
|
|
* @return {DateTime}
|
|
|
*/
|
|
|
|
|
|
|
|
|
endOf(unit) {
|
|
|
return this.isValid ? this.plus({
|
|
|
[unit]: 1
|
|
|
}).startOf(unit).minus(1) : this;
|
|
|
} // OUTPUT
|
|
|
|
|
|
/**
|
|
|
* Returns a string representation of this DateTime formatted according to the specified format string.
|
|
|
* **You may not want this.** See {@link toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens).
|
|
|
* Defaults to en-US if no locale has been specified, regardless of the system's locale.
|
|
|
* @see https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens
|
|
|
* @param {string} fmt - the format string
|
|
|
* @param {Object} opts - opts to override the configuration options
|
|
|
* @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'
|
|
|
* @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'
|
|
|
* @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22'
|
|
|
* @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toFormat(fmt, opts = {}) {
|
|
|
return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID$2;
|
|
|
}
|
|
|
/**
|
|
|
* Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.
|
|
|
* The exact behavior of this method is browser-specific, but in general it will return an appropriate representation
|
|
|
* of the DateTime in the assigned locale.
|
|
|
* Defaults to the system's locale if no locale has been specified
|
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat
|
|
|
* @param opts {Object} - Intl.DateTimeFormat constructor options and configuration options
|
|
|
* @example DateTime.now().toLocaleString(); //=> 4/20/2017
|
|
|
* @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'
|
|
|
* @example DateTime.now().toLocaleString({ locale: 'en-gb' }); //=> '20/04/2017'
|
|
|
* @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'
|
|
|
* @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'
|
|
|
* @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'
|
|
|
* @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'
|
|
|
* @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'
|
|
|
* @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hour12: false }); //=> '11:32'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toLocaleString(opts = DATE_SHORT) {
|
|
|
return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTime(this) : INVALID$2;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.
|
|
|
* Defaults to the system's locale if no locale has been specified
|
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts
|
|
|
* @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.
|
|
|
* @example DateTime.now().toLocaleParts(); //=> [
|
|
|
* //=> { type: 'day', value: '25' },
|
|
|
* //=> { type: 'literal', value: '/' },
|
|
|
* //=> { type: 'month', value: '05' },
|
|
|
* //=> { type: 'literal', value: '/' },
|
|
|
* //=> { type: 'year', value: '1982' }
|
|
|
* //=> ]
|
|
|
*/
|
|
|
|
|
|
|
|
|
toLocaleParts(opts = {}) {
|
|
|
return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : [];
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601-compliant string representation of this DateTime
|
|
|
* @param {Object} opts - options
|
|
|
* @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0
|
|
|
* @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0
|
|
|
* @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'
|
|
|
* @param {string} [opts.format='extended'] - choose between the basic and extended format
|
|
|
* @example DateTime.utc(1982, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'
|
|
|
* @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'
|
|
|
* @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'
|
|
|
* @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toISO(opts = {}) {
|
|
|
if (!this.isValid) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
return `${this.toISODate(opts)}T${this.toISOTime(opts)}`;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601-compliant string representation of this DateTime's date component
|
|
|
* @param {Object} opts - options
|
|
|
* @param {string} [opts.format='extended'] - choose between the basic and extended format
|
|
|
* @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'
|
|
|
* @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toISODate({
|
|
|
format = "extended"
|
|
|
} = {}) {
|
|
|
let fmt = format === "basic" ? "yyyyMMdd" : "yyyy-MM-dd";
|
|
|
|
|
|
if (this.year > 9999) {
|
|
|
fmt = "+" + fmt;
|
|
|
}
|
|
|
|
|
|
return toTechFormat(this, fmt);
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601-compliant string representation of this DateTime's week date
|
|
|
* @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toISOWeekDate() {
|
|
|
return toTechFormat(this, "kkkk-'W'WW-c");
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601-compliant string representation of this DateTime's time component
|
|
|
* @param {Object} opts - options
|
|
|
* @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0
|
|
|
* @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0
|
|
|
* @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'
|
|
|
* @param {boolean} [opts.includePrefix=false] - include the `T` prefix
|
|
|
* @param {string} [opts.format='extended'] - choose between the basic and extended format
|
|
|
* @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'
|
|
|
* @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'
|
|
|
* @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'
|
|
|
* @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toISOTime({
|
|
|
suppressMilliseconds = false,
|
|
|
suppressSeconds = false,
|
|
|
includeOffset = true,
|
|
|
includePrefix = false,
|
|
|
format = "extended"
|
|
|
} = {}) {
|
|
|
return toTechTimeFormat(this, {
|
|
|
suppressSeconds,
|
|
|
suppressMilliseconds,
|
|
|
includeOffset,
|
|
|
includePrefix,
|
|
|
format
|
|
|
});
|
|
|
}
|
|
|
/**
|
|
|
* Returns an RFC 2822-compatible string representation of this DateTime, always in UTC
|
|
|
* @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'
|
|
|
* @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toRFC2822() {
|
|
|
return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false);
|
|
|
}
|
|
|
/**
|
|
|
* Returns a string representation of this DateTime appropriate for use in HTTP headers.
|
|
|
* Specifically, the string conforms to RFC 1123.
|
|
|
* @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
|
|
|
* @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'
|
|
|
* @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toHTTP() {
|
|
|
return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'");
|
|
|
}
|
|
|
/**
|
|
|
* Returns a string representation of this DateTime appropriate for use in SQL Date
|
|
|
* @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toSQLDate() {
|
|
|
return toTechFormat(this, "yyyy-MM-dd");
|
|
|
}
|
|
|
/**
|
|
|
* Returns a string representation of this DateTime appropriate for use in SQL Time
|
|
|
* @param {Object} opts - options
|
|
|
* @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.
|
|
|
* @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'
|
|
|
* @example DateTime.utc().toSQL() //=> '05:15:16.345'
|
|
|
* @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'
|
|
|
* @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'
|
|
|
* @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toSQLTime({
|
|
|
includeOffset = true,
|
|
|
includeZone = false
|
|
|
} = {}) {
|
|
|
return toTechTimeFormat(this, {
|
|
|
includeOffset,
|
|
|
includeZone,
|
|
|
spaceZone: true
|
|
|
});
|
|
|
}
|
|
|
/**
|
|
|
* Returns a string representation of this DateTime appropriate for use in SQL DateTime
|
|
|
* @param {Object} opts - options
|
|
|
* @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.
|
|
|
* @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'
|
|
|
* @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'
|
|
|
* @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'
|
|
|
* @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'
|
|
|
* @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toSQL(opts = {}) {
|
|
|
if (!this.isValid) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;
|
|
|
}
|
|
|
/**
|
|
|
* Returns a string representation of this DateTime appropriate for debugging
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toString() {
|
|
|
return this.isValid ? this.toISO() : INVALID$2;
|
|
|
}
|
|
|
/**
|
|
|
* Returns the epoch milliseconds of this DateTime. Alias of {@link toMillis}
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
valueOf() {
|
|
|
return this.toMillis();
|
|
|
}
|
|
|
/**
|
|
|
* Returns the epoch milliseconds of this DateTime.
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toMillis() {
|
|
|
return this.isValid ? this.ts : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Returns the epoch seconds of this DateTime.
|
|
|
* @return {number}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toSeconds() {
|
|
|
return this.isValid ? this.ts / 1000 : NaN;
|
|
|
}
|
|
|
/**
|
|
|
* Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.
|
|
|
* @return {string}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toJSON() {
|
|
|
return this.toISO();
|
|
|
}
|
|
|
/**
|
|
|
* Returns a BSON serializable equivalent to this DateTime.
|
|
|
* @return {Date}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toBSON() {
|
|
|
return this.toJSDate();
|
|
|
}
|
|
|
/**
|
|
|
* Returns a JavaScript object with this DateTime's year, month, day, and so on.
|
|
|
* @param opts - options for generating the object
|
|
|
* @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output
|
|
|
* @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }
|
|
|
* @return {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toObject(opts = {}) {
|
|
|
if (!this.isValid) return {};
|
|
|
const base = Object.assign({}, this.c);
|
|
|
|
|
|
if (opts.includeConfig) {
|
|
|
base.outputCalendar = this.outputCalendar;
|
|
|
base.numberingSystem = this.loc.numberingSystem;
|
|
|
base.locale = this.loc.locale;
|
|
|
}
|
|
|
|
|
|
return base;
|
|
|
}
|
|
|
/**
|
|
|
* Returns a JavaScript Date equivalent to this DateTime.
|
|
|
* @return {Date}
|
|
|
*/
|
|
|
|
|
|
|
|
|
toJSDate() {
|
|
|
return new Date(this.isValid ? this.ts : NaN);
|
|
|
} // COMPARE
|
|
|
|
|
|
/**
|
|
|
* Return the difference between two DateTimes as a Duration.
|
|
|
* @param {DateTime} otherDateTime - the DateTime to compare this one to
|
|
|
* @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.
|
|
|
* @param {Object} opts - options that affect the creation of the Duration
|
|
|
* @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use
|
|
|
* @example
|
|
|
* var i1 = DateTime.fromISO('1982-05-25T09:45'),
|
|
|
* i2 = DateTime.fromISO('1983-10-14T10:30');
|
|
|
* i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }
|
|
|
* i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }
|
|
|
* i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }
|
|
|
* i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
diff(otherDateTime, unit = "milliseconds", opts = {}) {
|
|
|
if (!this.isValid || !otherDateTime.isValid) {
|
|
|
return Duration.invalid(this.invalid || otherDateTime.invalid, "created by diffing an invalid DateTime");
|
|
|
}
|
|
|
|
|
|
const durOpts = Object.assign({
|
|
|
locale: this.locale,
|
|
|
numberingSystem: this.numberingSystem
|
|
|
}, opts);
|
|
|
const units = maybeArray(unit).map(Duration.normalizeUnit),
|
|
|
otherIsLater = otherDateTime.valueOf() > this.valueOf(),
|
|
|
earlier = otherIsLater ? this : otherDateTime,
|
|
|
later = otherIsLater ? otherDateTime : this,
|
|
|
diffed = diff(earlier, later, units, durOpts);
|
|
|
return otherIsLater ? diffed.negate() : diffed;
|
|
|
}
|
|
|
/**
|
|
|
* Return the difference between this DateTime and right now.
|
|
|
* See {@link diff}
|
|
|
* @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration
|
|
|
* @param {Object} opts - options that affect the creation of the Duration
|
|
|
* @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use
|
|
|
* @return {Duration}
|
|
|
*/
|
|
|
|
|
|
|
|
|
diffNow(unit = "milliseconds", opts = {}) {
|
|
|
return this.diff(DateTime.now(), unit, opts);
|
|
|
}
|
|
|
/**
|
|
|
* Return an Interval spanning between this DateTime and another DateTime
|
|
|
* @param {DateTime} otherDateTime - the other end point of the Interval
|
|
|
* @return {Interval}
|
|
|
*/
|
|
|
|
|
|
|
|
|
until(otherDateTime) {
|
|
|
return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;
|
|
|
}
|
|
|
/**
|
|
|
* Return whether this DateTime is in the same unit of time as another DateTime.
|
|
|
* Higher-order units must also be identical for this function to return `true`.
|
|
|
* Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link setZone} to convert one of the dates if needed.
|
|
|
* @param {DateTime} otherDateTime - the other DateTime
|
|
|
* @param {string} unit - the unit of time to check sameness on
|
|
|
* @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
hasSame(otherDateTime, unit) {
|
|
|
if (!this.isValid) return false;
|
|
|
const inputMs = otherDateTime.valueOf();
|
|
|
const otherZoneDateTime = this.setZone(otherDateTime.zone, {
|
|
|
keepLocalTime: true
|
|
|
});
|
|
|
return otherZoneDateTime.startOf(unit) <= inputMs && inputMs <= otherZoneDateTime.endOf(unit);
|
|
|
}
|
|
|
/**
|
|
|
* Equality check
|
|
|
* Two DateTimes are equal iff they represent the same millisecond, have the same zone and location, and are both valid.
|
|
|
* To compare just the millisecond values, use `+dt1 === +dt2`.
|
|
|
* @param {DateTime} other - the other DateTime
|
|
|
* @return {boolean}
|
|
|
*/
|
|
|
|
|
|
|
|
|
equals(other) {
|
|
|
return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc);
|
|
|
}
|
|
|
/**
|
|
|
* Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your
|
|
|
* platform supports Intl.RelativeTimeFormat. Rounds down by default.
|
|
|
* @param {Object} options - options that affect the output
|
|
|
* @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.
|
|
|
* @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow"
|
|
|
* @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds"
|
|
|
* @param {boolean} [options.round=true] - whether to round the numbers in the output.
|
|
|
* @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.
|
|
|
* @param {string} options.locale - override the locale of this DateTime
|
|
|
* @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this
|
|
|
* @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day"
|
|
|
* @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día"
|
|
|
* @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures"
|
|
|
* @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago"
|
|
|
* @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago"
|
|
|
* @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago"
|
|
|
*/
|
|
|
|
|
|
|
|
|
toRelative(options = {}) {
|
|
|
if (!this.isValid) return null;
|
|
|
const base = options.base || DateTime.fromObject({
|
|
|
zone: this.zone
|
|
|
}),
|
|
|
padding = options.padding ? this < base ? -options.padding : options.padding : 0;
|
|
|
let units = ["years", "months", "days", "hours", "minutes", "seconds"];
|
|
|
let unit = options.unit;
|
|
|
|
|
|
if (Array.isArray(options.unit)) {
|
|
|
units = options.unit;
|
|
|
unit = undefined;
|
|
|
}
|
|
|
|
|
|
return diffRelative(base, this.plus(padding), Object.assign(options, {
|
|
|
numeric: "always",
|
|
|
units,
|
|
|
unit
|
|
|
}));
|
|
|
}
|
|
|
/**
|
|
|
* Returns a string representation of this date relative to today, such as "yesterday" or "next month".
|
|
|
* Only internationalizes on platforms that supports Intl.RelativeTimeFormat.
|
|
|
* @param {Object} options - options that affect the output
|
|
|
* @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.
|
|
|
* @param {string} options.locale - override the locale of this DateTime
|
|
|
* @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days"
|
|
|
* @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this
|
|
|
* @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow"
|
|
|
* @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana"
|
|
|
* @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain"
|
|
|
* @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago"
|
|
|
*/
|
|
|
|
|
|
|
|
|
toRelativeCalendar(options = {}) {
|
|
|
if (!this.isValid) return null;
|
|
|
return diffRelative(options.base || DateTime.fromObject({
|
|
|
zone: this.zone
|
|
|
}), this, Object.assign(options, {
|
|
|
numeric: "auto",
|
|
|
units: ["years", "months", "days"],
|
|
|
calendary: true
|
|
|
}));
|
|
|
}
|
|
|
/**
|
|
|
* Return the min of several date times
|
|
|
* @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum
|
|
|
* @return {DateTime} the min DateTime, or undefined if called with no argument
|
|
|
*/
|
|
|
|
|
|
|
|
|
static min(...dateTimes) {
|
|
|
if (!dateTimes.every(DateTime.isDateTime)) {
|
|
|
throw new InvalidArgumentError("min requires all arguments be DateTimes");
|
|
|
}
|
|
|
|
|
|
return bestBy(dateTimes, i => i.valueOf(), Math.min);
|
|
|
}
|
|
|
/**
|
|
|
* Return the max of several date times
|
|
|
* @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum
|
|
|
* @return {DateTime} the max DateTime, or undefined if called with no argument
|
|
|
*/
|
|
|
|
|
|
|
|
|
static max(...dateTimes) {
|
|
|
if (!dateTimes.every(DateTime.isDateTime)) {
|
|
|
throw new InvalidArgumentError("max requires all arguments be DateTimes");
|
|
|
}
|
|
|
|
|
|
return bestBy(dateTimes, i => i.valueOf(), Math.max);
|
|
|
} // MISC
|
|
|
|
|
|
/**
|
|
|
* Explain how a string would be parsed by fromFormat()
|
|
|
* @param {string} text - the string to parse
|
|
|
* @param {string} fmt - the format the string is expected to be in (see description)
|
|
|
* @param {Object} options - options taken by fromFormat()
|
|
|
* @return {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromFormatExplain(text, fmt, options = {}) {
|
|
|
const {
|
|
|
locale = null,
|
|
|
numberingSystem = null
|
|
|
} = options,
|
|
|
localeToUse = Locale.fromOpts({
|
|
|
locale,
|
|
|
numberingSystem,
|
|
|
defaultToEN: true
|
|
|
});
|
|
|
return explainFromTokens(localeToUse, text, fmt);
|
|
|
}
|
|
|
/**
|
|
|
* @deprecated use fromFormatExplain instead
|
|
|
*/
|
|
|
|
|
|
|
|
|
static fromStringExplain(text, fmt, options = {}) {
|
|
|
return DateTime.fromFormatExplain(text, fmt, options);
|
|
|
} // FORMAT PRESETS
|
|
|
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 10/14/1983
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATE_SHORT() {
|
|
|
return DATE_SHORT;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 'Oct 14, 1983'
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATE_MED() {
|
|
|
return DATE_MED;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 'Fri, Oct 14, 1983'
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATE_MED_WITH_WEEKDAY() {
|
|
|
return DATE_MED_WITH_WEEKDAY;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 'October 14, 1983'
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATE_FULL() {
|
|
|
return DATE_FULL;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 'Tuesday, October 14, 1983'
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATE_HUGE() {
|
|
|
return DATE_HUGE;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get TIME_SIMPLE() {
|
|
|
return TIME_SIMPLE;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get TIME_WITH_SECONDS() {
|
|
|
return TIME_WITH_SECONDS;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get TIME_WITH_SHORT_OFFSET() {
|
|
|
return TIME_WITH_SHORT_OFFSET;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get TIME_WITH_LONG_OFFSET() {
|
|
|
return TIME_WITH_LONG_OFFSET;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like '09:30', always 24-hour.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get TIME_24_SIMPLE() {
|
|
|
return TIME_24_SIMPLE;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like '09:30:23', always 24-hour.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get TIME_24_WITH_SECONDS() {
|
|
|
return TIME_24_WITH_SECONDS;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like '09:30:23 EDT', always 24-hour.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get TIME_24_WITH_SHORT_OFFSET() {
|
|
|
return TIME_24_WITH_SHORT_OFFSET;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get TIME_24_WITH_LONG_OFFSET() {
|
|
|
return TIME_24_WITH_LONG_OFFSET;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATETIME_SHORT() {
|
|
|
return DATETIME_SHORT;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATETIME_SHORT_WITH_SECONDS() {
|
|
|
return DATETIME_SHORT_WITH_SECONDS;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATETIME_MED() {
|
|
|
return DATETIME_MED;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATETIME_MED_WITH_SECONDS() {
|
|
|
return DATETIME_MED_WITH_SECONDS;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATETIME_MED_WITH_WEEKDAY() {
|
|
|
return DATETIME_MED_WITH_WEEKDAY;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATETIME_FULL() {
|
|
|
return DATETIME_FULL;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATETIME_FULL_WITH_SECONDS() {
|
|
|
return DATETIME_FULL_WITH_SECONDS;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATETIME_HUGE() {
|
|
|
return DATETIME_HUGE;
|
|
|
}
|
|
|
/**
|
|
|
* {@link toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.
|
|
|
* @type {Object}
|
|
|
*/
|
|
|
|
|
|
|
|
|
static get DATETIME_HUGE_WITH_SECONDS() {
|
|
|
return DATETIME_HUGE_WITH_SECONDS;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
/**
|
|
|
* @private
|
|
|
*/
|
|
|
|
|
|
function friendlyDateTime(dateTimeish) {
|
|
|
if (DateTime.isDateTime(dateTimeish)) {
|
|
|
return dateTimeish;
|
|
|
} else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {
|
|
|
return DateTime.fromJSDate(dateTimeish);
|
|
|
} else if (dateTimeish && typeof dateTimeish === "object") {
|
|
|
return DateTime.fromObject(dateTimeish);
|
|
|
} else {
|
|
|
throw new InvalidArgumentError(`Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var DateTime_1 = DateTime;
|
|
|
|
|
|
var DateWithZone = /** @class */ (function () {
|
|
|
function DateWithZone(date, tzid) {
|
|
|
this.date = date;
|
|
|
this.tzid = tzid;
|
|
|
}
|
|
|
Object.defineProperty(DateWithZone.prototype, "isUTC", {
|
|
|
get: function () {
|
|
|
return !this.tzid || this.tzid.toUpperCase() === 'UTC';
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
DateWithZone.prototype.toString = function () {
|
|
|
var datestr = dateutil$1.timeToUntilString(this.date.getTime(), this.isUTC);
|
|
|
if (!this.isUTC) {
|
|
|
return ";TZID=" + this.tzid + ":" + datestr;
|
|
|
}
|
|
|
return ":" + datestr;
|
|
|
};
|
|
|
DateWithZone.prototype.getTime = function () {
|
|
|
return this.date.getTime();
|
|
|
};
|
|
|
DateWithZone.prototype.rezonedDate = function () {
|
|
|
if (this.isUTC) {
|
|
|
return this.date;
|
|
|
}
|
|
|
try {
|
|
|
var datetime = DateTime_1
|
|
|
.fromJSDate(this.date);
|
|
|
var rezoned = datetime.setZone(this.tzid, { keepLocalTime: true });
|
|
|
return rezoned.toJSDate();
|
|
|
}
|
|
|
catch (e) {
|
|
|
if (e instanceof TypeError) {
|
|
|
console.error('Using TZID without Luxon available is unsupported. Returned times are in UTC, not the requested time zone');
|
|
|
}
|
|
|
return this.date;
|
|
|
}
|
|
|
};
|
|
|
return DateWithZone;
|
|
|
}());
|
|
|
|
|
|
function optionsToString(options) {
|
|
|
var rrule = [];
|
|
|
var dtstart = '';
|
|
|
var keys = Object.keys(options);
|
|
|
var defaultKeys = Object.keys(DEFAULT_OPTIONS$1);
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
|
if (keys[i] === 'tzid')
|
|
|
continue;
|
|
|
if (!includes(defaultKeys, keys[i]))
|
|
|
continue;
|
|
|
var key = keys[i].toUpperCase();
|
|
|
var value = options[keys[i]];
|
|
|
var outValue = '';
|
|
|
if (!isPresent(value) || (isArray(value) && !value.length))
|
|
|
continue;
|
|
|
switch (key) {
|
|
|
case 'FREQ':
|
|
|
outValue = RRule.FREQUENCIES[options.freq];
|
|
|
break;
|
|
|
case 'WKST':
|
|
|
if (isNumber$1(value)) {
|
|
|
outValue = new Weekday(value).toString();
|
|
|
}
|
|
|
else {
|
|
|
outValue = value.toString();
|
|
|
}
|
|
|
break;
|
|
|
case 'BYWEEKDAY':
|
|
|
/*
|
|
|
NOTE: BYWEEKDAY is a special case.
|
|
|
RRule() deconstructs the rule.options.byweekday array
|
|
|
into an array of Weekday arguments.
|
|
|
On the other hand, rule.origOptions is an array of Weekdays.
|
|
|
We need to handle both cases here.
|
|
|
It might be worth change RRule to keep the Weekdays.
|
|
|
|
|
|
Also, BYWEEKDAY (used by RRule) vs. BYDAY (RFC)
|
|
|
|
|
|
*/
|
|
|
key = 'BYDAY';
|
|
|
outValue = toArray(value).map(function (wday) {
|
|
|
if (wday instanceof Weekday) {
|
|
|
return wday;
|
|
|
}
|
|
|
if (isArray(wday)) {
|
|
|
return new Weekday(wday[0], wday[1]);
|
|
|
}
|
|
|
return new Weekday(wday);
|
|
|
}).toString();
|
|
|
break;
|
|
|
case 'DTSTART':
|
|
|
dtstart = buildDtstart(value, options.tzid);
|
|
|
break;
|
|
|
case 'UNTIL':
|
|
|
outValue = dateutil$1.timeToUntilString(value, !options.tzid);
|
|
|
break;
|
|
|
default:
|
|
|
if (isArray(value)) {
|
|
|
var strValues = [];
|
|
|
for (var j = 0; j < value.length; j++) {
|
|
|
strValues[j] = String(value[j]);
|
|
|
}
|
|
|
outValue = strValues.toString();
|
|
|
}
|
|
|
else {
|
|
|
outValue = String(value);
|
|
|
}
|
|
|
}
|
|
|
if (outValue) {
|
|
|
rrule.push([key, outValue]);
|
|
|
}
|
|
|
}
|
|
|
var rules = rrule.map(function (_a) {
|
|
|
var key = _a[0], value = _a[1];
|
|
|
return key + "=" + value.toString();
|
|
|
}).join(';');
|
|
|
var ruleString = '';
|
|
|
if (rules !== '') {
|
|
|
ruleString = "RRULE:" + rules;
|
|
|
}
|
|
|
return [dtstart, ruleString].filter(function (x) { return !!x; }).join('\n');
|
|
|
}
|
|
|
function buildDtstart(dtstart, tzid) {
|
|
|
if (!dtstart) {
|
|
|
return '';
|
|
|
}
|
|
|
return 'DTSTART' + new DateWithZone(new Date(dtstart), tzid).toString();
|
|
|
}
|
|
|
|
|
|
var Cache = /** @class */ (function () {
|
|
|
function Cache() {
|
|
|
this.all = false;
|
|
|
this.before = [];
|
|
|
this.after = [];
|
|
|
this.between = [];
|
|
|
}
|
|
|
/**
|
|
|
* @param {String} what - all/before/after/between
|
|
|
* @param {Array,Date} value - an array of dates, one date, or null
|
|
|
* @param {Object?} args - _iter arguments
|
|
|
*/
|
|
|
Cache.prototype._cacheAdd = function (what, value, args) {
|
|
|
if (value) {
|
|
|
value =
|
|
|
value instanceof Date
|
|
|
? dateutil$1.clone(value)
|
|
|
: dateutil$1.cloneDates(value);
|
|
|
}
|
|
|
if (what === 'all') {
|
|
|
this.all = value;
|
|
|
}
|
|
|
else {
|
|
|
args._value = value;
|
|
|
this[what].push(args);
|
|
|
}
|
|
|
};
|
|
|
/**
|
|
|
* @return false - not in the cache
|
|
|
* null - cached, but zero occurrences (before/after)
|
|
|
* Date - cached (before/after)
|
|
|
* [] - cached, but zero occurrences (all/between)
|
|
|
* [Date1, DateN] - cached (all/between)
|
|
|
*/
|
|
|
Cache.prototype._cacheGet = function (what, args) {
|
|
|
var cached = false;
|
|
|
var argsKeys = args ? Object.keys(args) : [];
|
|
|
var findCacheDiff = function (item) {
|
|
|
for (var i = 0; i < argsKeys.length; i++) {
|
|
|
var key = argsKeys[i];
|
|
|
if (String(args[key]) !== String(item[key])) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
};
|
|
|
var cachedObject = this[what];
|
|
|
if (what === 'all') {
|
|
|
cached = this.all;
|
|
|
}
|
|
|
else if (isArray(cachedObject)) {
|
|
|
// Let's see whether we've already called the
|
|
|
// 'what' method with the same 'args'
|
|
|
for (var i = 0; i < cachedObject.length; i++) {
|
|
|
var item = cachedObject[i];
|
|
|
if (argsKeys.length && findCacheDiff(item))
|
|
|
continue;
|
|
|
cached = item._value;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (!cached && this.all) {
|
|
|
// Not in the cache, but we already know all the occurrences,
|
|
|
// so we can find the correct dates from the cached ones.
|
|
|
var iterResult = new IterResult(what, args);
|
|
|
for (var i = 0; i < this.all.length; i++) {
|
|
|
if (!iterResult.accept(this.all[i]))
|
|
|
break;
|
|
|
}
|
|
|
cached = iterResult.getValue();
|
|
|
this._cacheAdd(what, cached, args);
|
|
|
}
|
|
|
return isArray(cached)
|
|
|
? dateutil$1.cloneDates(cached)
|
|
|
: cached instanceof Date
|
|
|
? dateutil$1.clone(cached)
|
|
|
: cached;
|
|
|
};
|
|
|
return Cache;
|
|
|
}());
|
|
|
|
|
|
// =============================================================================
|
|
|
// Date masks
|
|
|
// =============================================================================
|
|
|
// Every mask is 7 days longer to handle cross-year weekly periods.
|
|
|
var M365MASK = __spreadArrays(repeat(1, 31), repeat(2, 28), repeat(3, 31), repeat(4, 30), repeat(5, 31), repeat(6, 30), repeat(7, 31), repeat(8, 31), repeat(9, 30), repeat(10, 31), repeat(11, 30), repeat(12, 31), repeat(1, 7));
|
|
|
var M366MASK = __spreadArrays(repeat(1, 31), repeat(2, 29), repeat(3, 31), repeat(4, 30), repeat(5, 31), repeat(6, 30), repeat(7, 31), repeat(8, 31), repeat(9, 30), repeat(10, 31), repeat(11, 30), repeat(12, 31), repeat(1, 7));
|
|
|
var M28 = range(1, 29);
|
|
|
var M29 = range(1, 30);
|
|
|
var M30 = range(1, 31);
|
|
|
var M31 = range(1, 32);
|
|
|
var MDAY366MASK = __spreadArrays(M31, M29, M31, M30, M31, M30, M31, M31, M30, M31, M30, M31, M31.slice(0, 7));
|
|
|
var MDAY365MASK = __spreadArrays(M31, M28, M31, M30, M31, M30, M31, M31, M30, M31, M30, M31, M31.slice(0, 7));
|
|
|
var NM28 = range(-28, 0);
|
|
|
var NM29 = range(-29, 0);
|
|
|
var NM30 = range(-30, 0);
|
|
|
var NM31 = range(-31, 0);
|
|
|
var NMDAY366MASK = __spreadArrays(NM31, NM29, NM31, NM30, NM31, NM30, NM31, NM31, NM30, NM31, NM30, NM31, NM31.slice(0, 7));
|
|
|
var NMDAY365MASK = __spreadArrays(NM31, NM28, NM31, NM30, NM31, NM30, NM31, NM31, NM30, NM31, NM30, NM31, NM31.slice(0, 7));
|
|
|
var M366RANGE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366];
|
|
|
var M365RANGE = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];
|
|
|
var WDAYMASK = (function () {
|
|
|
var wdaymask = [];
|
|
|
for (var i = 0; i < 55; i++)
|
|
|
wdaymask = wdaymask.concat(range(7));
|
|
|
return wdaymask;
|
|
|
})();
|
|
|
|
|
|
function rebuildYear(year, options) {
|
|
|
var firstyday = new Date(Date.UTC(year, 0, 1));
|
|
|
var yearlen = dateutil$1.isLeapYear(year) ? 366 : 365;
|
|
|
var nextyearlen = dateutil$1.isLeapYear(year + 1) ? 366 : 365;
|
|
|
var yearordinal = dateutil$1.toOrdinal(firstyday);
|
|
|
var yearweekday = dateutil$1.getWeekday(firstyday);
|
|
|
var result = __assign(__assign({ yearlen: yearlen,
|
|
|
nextyearlen: nextyearlen,
|
|
|
yearordinal: yearordinal,
|
|
|
yearweekday: yearweekday }, baseYearMasks(year)), { wnomask: null });
|
|
|
if (empty(options.byweekno)) {
|
|
|
return result;
|
|
|
}
|
|
|
result.wnomask = repeat(0, yearlen + 7);
|
|
|
var firstwkst;
|
|
|
var wyearlen;
|
|
|
var no1wkst = firstwkst = pymod(7 - yearweekday + options.wkst, 7);
|
|
|
if (no1wkst >= 4) {
|
|
|
no1wkst = 0;
|
|
|
// Number of days in the year, plus the days we got
|
|
|
// from last year.
|
|
|
wyearlen =
|
|
|
result.yearlen + pymod(yearweekday - options.wkst, 7);
|
|
|
}
|
|
|
else {
|
|
|
// Number of days in the year, minus the days we
|
|
|
// left in last year.
|
|
|
wyearlen = yearlen - no1wkst;
|
|
|
}
|
|
|
var div = Math.floor(wyearlen / 7);
|
|
|
var mod = pymod(wyearlen, 7);
|
|
|
var numweeks = Math.floor(div + mod / 4);
|
|
|
for (var j = 0; j < options.byweekno.length; j++) {
|
|
|
var n = options.byweekno[j];
|
|
|
if (n < 0) {
|
|
|
n += numweeks + 1;
|
|
|
}
|
|
|
if (!(n > 0 && n <= numweeks)) {
|
|
|
continue;
|
|
|
}
|
|
|
var i = void 0;
|
|
|
if (n > 1) {
|
|
|
i = no1wkst + (n - 1) * 7;
|
|
|
if (no1wkst !== firstwkst) {
|
|
|
i -= 7 - firstwkst;
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
i = no1wkst;
|
|
|
}
|
|
|
for (var k = 0; k < 7; k++) {
|
|
|
result.wnomask[i] = 1;
|
|
|
i++;
|
|
|
if (result.wdaymask[i] === options.wkst)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (includes(options.byweekno, 1)) {
|
|
|
// Check week number 1 of next year as well
|
|
|
// orig-TODO : Check -numweeks for next year.
|
|
|
var i = no1wkst + numweeks * 7;
|
|
|
if (no1wkst !== firstwkst)
|
|
|
i -= 7 - firstwkst;
|
|
|
if (i < yearlen) {
|
|
|
// If week starts in next year, we
|
|
|
// don't care about it.
|
|
|
for (var j = 0; j < 7; j++) {
|
|
|
result.wnomask[i] = 1;
|
|
|
i += 1;
|
|
|
if (result.wdaymask[i] === options.wkst)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (no1wkst) {
|
|
|
// Check last week number of last year as
|
|
|
// well. If no1wkst is 0, either the year
|
|
|
// started on week start, or week number 1
|
|
|
// got days from last year, so there are no
|
|
|
// days from last year's last week number in
|
|
|
// this year.
|
|
|
var lnumweeks = void 0;
|
|
|
if (!includes(options.byweekno, -1)) {
|
|
|
var lyearweekday = dateutil$1.getWeekday(new Date(Date.UTC(year - 1, 0, 1)));
|
|
|
var lno1wkst = pymod(7 - lyearweekday.valueOf() + options.wkst, 7);
|
|
|
var lyearlen = dateutil$1.isLeapYear(year - 1) ? 366 : 365;
|
|
|
var weekst = void 0;
|
|
|
if (lno1wkst >= 4) {
|
|
|
lno1wkst = 0;
|
|
|
weekst = lyearlen + pymod(lyearweekday - options.wkst, 7);
|
|
|
}
|
|
|
else {
|
|
|
weekst = yearlen - no1wkst;
|
|
|
}
|
|
|
lnumweeks = Math.floor(52 + pymod(weekst, 7) / 4);
|
|
|
}
|
|
|
else {
|
|
|
lnumweeks = -1;
|
|
|
}
|
|
|
if (includes(options.byweekno, lnumweeks)) {
|
|
|
for (var i = 0; i < no1wkst; i++)
|
|
|
result.wnomask[i] = 1;
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
function baseYearMasks(year) {
|
|
|
var yearlen = dateutil$1.isLeapYear(year) ? 366 : 365;
|
|
|
var firstyday = new Date(Date.UTC(year, 0, 1));
|
|
|
var wday = dateutil$1.getWeekday(firstyday);
|
|
|
if (yearlen === 365) {
|
|
|
return {
|
|
|
mmask: M365MASK,
|
|
|
mdaymask: MDAY365MASK,
|
|
|
nmdaymask: NMDAY365MASK,
|
|
|
wdaymask: WDAYMASK.slice(wday),
|
|
|
mrange: M365RANGE
|
|
|
};
|
|
|
}
|
|
|
return {
|
|
|
mmask: M366MASK,
|
|
|
mdaymask: MDAY366MASK,
|
|
|
nmdaymask: NMDAY366MASK,
|
|
|
wdaymask: WDAYMASK.slice(wday),
|
|
|
mrange: M366RANGE
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function rebuildMonth(year, month, yearlen, mrange, wdaymask, options) {
|
|
|
var result = {
|
|
|
lastyear: year,
|
|
|
lastmonth: month,
|
|
|
nwdaymask: []
|
|
|
};
|
|
|
var ranges = [];
|
|
|
if (options.freq === RRule.YEARLY) {
|
|
|
if (empty(options.bymonth)) {
|
|
|
ranges = [[0, yearlen]];
|
|
|
}
|
|
|
else {
|
|
|
for (var j = 0; j < options.bymonth.length; j++) {
|
|
|
month = options.bymonth[j];
|
|
|
ranges.push(mrange.slice(month - 1, month + 1));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else if (options.freq === RRule.MONTHLY) {
|
|
|
ranges = [mrange.slice(month - 1, month + 1)];
|
|
|
}
|
|
|
if (empty(ranges)) {
|
|
|
return result;
|
|
|
}
|
|
|
// Weekly frequency won't get here, so we may not
|
|
|
// care about cross-year weekly periods.
|
|
|
result.nwdaymask = repeat(0, yearlen);
|
|
|
for (var j = 0; j < ranges.length; j++) {
|
|
|
var rang = ranges[j];
|
|
|
var first = rang[0];
|
|
|
var last = rang[1] - 1;
|
|
|
for (var k = 0; k < options.bynweekday.length; k++) {
|
|
|
var i = void 0;
|
|
|
var _a = options.bynweekday[k], wday = _a[0], n = _a[1];
|
|
|
if (n < 0) {
|
|
|
i = last + (n + 1) * 7;
|
|
|
i -= pymod(wdaymask[i] - wday, 7);
|
|
|
}
|
|
|
else {
|
|
|
i = first + (n - 1) * 7;
|
|
|
i += pymod(7 - wdaymask[i] + wday, 7);
|
|
|
}
|
|
|
if (first <= i && i <= last)
|
|
|
result.nwdaymask[i] = 1;
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
function easter(y, offset) {
|
|
|
if (offset === void 0) { offset = 0; }
|
|
|
var a = y % 19;
|
|
|
var b = Math.floor(y / 100);
|
|
|
var c = y % 100;
|
|
|
var d = Math.floor(b / 4);
|
|
|
var e = b % 4;
|
|
|
var f = Math.floor((b + 8) / 25);
|
|
|
var g = Math.floor((b - f + 1) / 3);
|
|
|
var h = Math.floor(19 * a + b - d - g + 15) % 30;
|
|
|
var i = Math.floor(c / 4);
|
|
|
var k = c % 4;
|
|
|
var l = Math.floor(32 + 2 * e + 2 * i - h - k) % 7;
|
|
|
var m = Math.floor((a + 11 * h + 22 * l) / 451);
|
|
|
var month = Math.floor((h + l - 7 * m + 114) / 31);
|
|
|
var day = ((h + l - 7 * m + 114) % 31) + 1;
|
|
|
var date = Date.UTC(y, month - 1, day + offset);
|
|
|
var yearStart = Date.UTC(y, 0, 1);
|
|
|
return [Math.ceil((date - yearStart) / (1000 * 60 * 60 * 24))];
|
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
|
// Iterinfo
|
|
|
// =============================================================================
|
|
|
var Iterinfo = /** @class */ (function () {
|
|
|
function Iterinfo(options) {
|
|
|
this.options = options;
|
|
|
}
|
|
|
Iterinfo.prototype.rebuild = function (year, month) {
|
|
|
var options = this.options;
|
|
|
if (year !== this.lastyear) {
|
|
|
this.yearinfo = rebuildYear(year, options);
|
|
|
}
|
|
|
if (notEmpty(options.bynweekday) &&
|
|
|
(month !== this.lastmonth || year !== this.lastyear)) {
|
|
|
var _a = this.yearinfo, yearlen = _a.yearlen, mrange = _a.mrange, wdaymask = _a.wdaymask;
|
|
|
this.monthinfo = rebuildMonth(year, month, yearlen, mrange, wdaymask, options);
|
|
|
}
|
|
|
if (isPresent(options.byeaster)) {
|
|
|
this.eastermask = easter(year, options.byeaster);
|
|
|
}
|
|
|
};
|
|
|
Object.defineProperty(Iterinfo.prototype, "lastyear", {
|
|
|
get: function () {
|
|
|
return this.monthinfo ? this.monthinfo.lastyear : null;
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Object.defineProperty(Iterinfo.prototype, "lastmonth", {
|
|
|
get: function () {
|
|
|
return this.monthinfo ? this.monthinfo.lastmonth : null;
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Object.defineProperty(Iterinfo.prototype, "yearlen", {
|
|
|
get: function () {
|
|
|
return this.yearinfo.yearlen;
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Object.defineProperty(Iterinfo.prototype, "yearordinal", {
|
|
|
get: function () {
|
|
|
return this.yearinfo.yearordinal;
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Object.defineProperty(Iterinfo.prototype, "mrange", {
|
|
|
get: function () {
|
|
|
return this.yearinfo.mrange;
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Object.defineProperty(Iterinfo.prototype, "wdaymask", {
|
|
|
get: function () {
|
|
|
return this.yearinfo.wdaymask;
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Object.defineProperty(Iterinfo.prototype, "mmask", {
|
|
|
get: function () {
|
|
|
return this.yearinfo.mmask;
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Object.defineProperty(Iterinfo.prototype, "wnomask", {
|
|
|
get: function () {
|
|
|
return this.yearinfo.wnomask;
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Object.defineProperty(Iterinfo.prototype, "nwdaymask", {
|
|
|
get: function () {
|
|
|
return this.monthinfo ? this.monthinfo.nwdaymask : [];
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Object.defineProperty(Iterinfo.prototype, "nextyearlen", {
|
|
|
get: function () {
|
|
|
return this.yearinfo.nextyearlen;
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Object.defineProperty(Iterinfo.prototype, "mdaymask", {
|
|
|
get: function () {
|
|
|
return this.yearinfo.mdaymask;
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Object.defineProperty(Iterinfo.prototype, "nmdaymask", {
|
|
|
get: function () {
|
|
|
return this.yearinfo.nmdaymask;
|
|
|
},
|
|
|
enumerable: true,
|
|
|
configurable: true
|
|
|
});
|
|
|
Iterinfo.prototype.ydayset = function () {
|
|
|
return [range(this.yearlen), 0, this.yearlen];
|
|
|
};
|
|
|
Iterinfo.prototype.mdayset = function (_, month, __) {
|
|
|
var start = this.mrange[month - 1];
|
|
|
var end = this.mrange[month];
|
|
|
var set = repeat(null, this.yearlen);
|
|
|
for (var i = start; i < end; i++)
|
|
|
set[i] = i;
|
|
|
return [set, start, end];
|
|
|
};
|
|
|
Iterinfo.prototype.wdayset = function (year, month, day) {
|
|
|
// We need to handle cross-year weeks here.
|
|
|
var set = repeat(null, this.yearlen + 7);
|
|
|
var i = dateutil$1.toOrdinal(new Date(Date.UTC(year, month - 1, day))) -
|
|
|
this.yearordinal;
|
|
|
var start = i;
|
|
|
for (var j = 0; j < 7; j++) {
|
|
|
set[i] = i;
|
|
|
++i;
|
|
|
if (this.wdaymask[i] === this.options.wkst)
|
|
|
break;
|
|
|
}
|
|
|
return [set, start, i];
|
|
|
};
|
|
|
Iterinfo.prototype.ddayset = function (year, month, day) {
|
|
|
var set = repeat(null, this.yearlen);
|
|
|
var i = dateutil$1.toOrdinal(new Date(Date.UTC(year, month - 1, day))) -
|
|
|
this.yearordinal;
|
|
|
set[i] = i;
|
|
|
return [set, i, i + 1];
|
|
|
};
|
|
|
Iterinfo.prototype.htimeset = function (hour, _, second, millisecond) {
|
|
|
var _this = this;
|
|
|
var set = [];
|
|
|
this.options.byminute.forEach(function (minute) {
|
|
|
set = set.concat(_this.mtimeset(hour, minute, second, millisecond));
|
|
|
});
|
|
|
dateutil$1.sort(set);
|
|
|
return set;
|
|
|
};
|
|
|
Iterinfo.prototype.mtimeset = function (hour, minute, _, millisecond) {
|
|
|
var set = this.options.bysecond.map(function (second) {
|
|
|
return new Time(hour, minute, second, millisecond);
|
|
|
});
|
|
|
dateutil$1.sort(set);
|
|
|
return set;
|
|
|
};
|
|
|
Iterinfo.prototype.stimeset = function (hour, minute, second, millisecond) {
|
|
|
return [new Time(hour, minute, second, millisecond)];
|
|
|
};
|
|
|
Iterinfo.prototype.getdayset = function (freq) {
|
|
|
switch (freq) {
|
|
|
case Frequency.YEARLY: return this.ydayset.bind(this);
|
|
|
case Frequency.MONTHLY: return this.mdayset.bind(this);
|
|
|
case Frequency.WEEKLY: return this.wdayset.bind(this);
|
|
|
case Frequency.DAILY: return this.ddayset.bind(this);
|
|
|
default: return this.ddayset.bind(this);
|
|
|
}
|
|
|
};
|
|
|
Iterinfo.prototype.gettimeset = function (freq) {
|
|
|
switch (freq) {
|
|
|
case Frequency.HOURLY: return this.htimeset.bind(this);
|
|
|
case Frequency.MINUTELY: return this.mtimeset.bind(this);
|
|
|
case Frequency.SECONDLY: return this.stimeset.bind(this);
|
|
|
}
|
|
|
};
|
|
|
return Iterinfo;
|
|
|
}());
|
|
|
|
|
|
function buildPoslist(bysetpos, timeset, start, end, ii, dayset) {
|
|
|
var poslist = [];
|
|
|
for (var j = 0; j < bysetpos.length; j++) {
|
|
|
var daypos = void 0;
|
|
|
var timepos = void 0;
|
|
|
var pos = bysetpos[j];
|
|
|
if (pos < 0) {
|
|
|
daypos = Math.floor(pos / timeset.length);
|
|
|
timepos = pymod(pos, timeset.length);
|
|
|
}
|
|
|
else {
|
|
|
daypos = Math.floor((pos - 1) / timeset.length);
|
|
|
timepos = pymod(pos - 1, timeset.length);
|
|
|
}
|
|
|
var tmp = [];
|
|
|
for (var k = start; k < end; k++) {
|
|
|
var val = dayset[k];
|
|
|
if (!isPresent(val))
|
|
|
continue;
|
|
|
tmp.push(val);
|
|
|
}
|
|
|
var i = void 0;
|
|
|
if (daypos < 0) {
|
|
|
i = tmp.slice(daypos)[0];
|
|
|
}
|
|
|
else {
|
|
|
i = tmp[daypos];
|
|
|
}
|
|
|
var time = timeset[timepos];
|
|
|
var date = dateutil$1.fromOrdinal(ii.yearordinal + i);
|
|
|
var res = dateutil$1.combine(date, time);
|
|
|
// XXX: can this ever be in the array?
|
|
|
// - compare the actual date instead?
|
|
|
if (!includes(poslist, res))
|
|
|
poslist.push(res);
|
|
|
}
|
|
|
dateutil$1.sort(poslist);
|
|
|
return poslist;
|
|
|
}
|
|
|
|
|
|
function iter(iterResult, options) {
|
|
|
var dtstart = options.dtstart, freq = options.freq, interval = options.interval, until = options.until, bysetpos = options.bysetpos;
|
|
|
var count = options.count;
|
|
|
if (count === 0 || interval === 0) {
|
|
|
return emitResult(iterResult);
|
|
|
}
|
|
|
var counterDate = DateTime$1.fromDate(dtstart);
|
|
|
var ii = new Iterinfo(options);
|
|
|
ii.rebuild(counterDate.year, counterDate.month);
|
|
|
var timeset = makeTimeset(ii, counterDate, options);
|
|
|
while (true) {
|
|
|
var _a = ii.getdayset(freq)(counterDate.year, counterDate.month, counterDate.day), dayset = _a[0], start = _a[1], end = _a[2];
|
|
|
var filtered = removeFilteredDays(dayset, start, end, ii, options);
|
|
|
if (notEmpty(bysetpos)) {
|
|
|
var poslist = buildPoslist(bysetpos, timeset, start, end, ii, dayset);
|
|
|
for (var j = 0; j < poslist.length; j++) {
|
|
|
var res = poslist[j];
|
|
|
if (until && res > until) {
|
|
|
return emitResult(iterResult);
|
|
|
}
|
|
|
if (res >= dtstart) {
|
|
|
var rezonedDate = rezoneIfNeeded(res, options);
|
|
|
if (!iterResult.accept(rezonedDate)) {
|
|
|
return emitResult(iterResult);
|
|
|
}
|
|
|
if (count) {
|
|
|
--count;
|
|
|
if (!count) {
|
|
|
return emitResult(iterResult);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
for (var j = start; j < end; j++) {
|
|
|
var currentDay = dayset[j];
|
|
|
if (!isPresent(currentDay)) {
|
|
|
continue;
|
|
|
}
|
|
|
var date = dateutil$1.fromOrdinal(ii.yearordinal + currentDay);
|
|
|
for (var k = 0; k < timeset.length; k++) {
|
|
|
var time = timeset[k];
|
|
|
var res = dateutil$1.combine(date, time);
|
|
|
if (until && res > until) {
|
|
|
return emitResult(iterResult);
|
|
|
}
|
|
|
if (res >= dtstart) {
|
|
|
var rezonedDate = rezoneIfNeeded(res, options);
|
|
|
if (!iterResult.accept(rezonedDate)) {
|
|
|
return emitResult(iterResult);
|
|
|
}
|
|
|
if (count) {
|
|
|
--count;
|
|
|
if (!count) {
|
|
|
return emitResult(iterResult);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (options.interval === 0) {
|
|
|
return emitResult(iterResult);
|
|
|
}
|
|
|
// Handle frequency and interval
|
|
|
counterDate.add(options, filtered);
|
|
|
if (counterDate.year > dateutil$1.MAXYEAR) {
|
|
|
return emitResult(iterResult);
|
|
|
}
|
|
|
if (!freqIsDailyOrGreater(freq)) {
|
|
|
timeset = ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, 0);
|
|
|
}
|
|
|
ii.rebuild(counterDate.year, counterDate.month);
|
|
|
}
|
|
|
}
|
|
|
function isFiltered(ii, currentDay, options) {
|
|
|
var bymonth = options.bymonth, byweekno = options.byweekno, byweekday = options.byweekday, byeaster = options.byeaster, bymonthday = options.bymonthday, bynmonthday = options.bynmonthday, byyearday = options.byyearday;
|
|
|
return ((notEmpty(bymonth) && !includes(bymonth, ii.mmask[currentDay])) ||
|
|
|
(notEmpty(byweekno) && !ii.wnomask[currentDay]) ||
|
|
|
(notEmpty(byweekday) && !includes(byweekday, ii.wdaymask[currentDay])) ||
|
|
|
(notEmpty(ii.nwdaymask) && !ii.nwdaymask[currentDay]) ||
|
|
|
(byeaster !== null && !includes(ii.eastermask, currentDay)) ||
|
|
|
((notEmpty(bymonthday) || notEmpty(bynmonthday)) &&
|
|
|
!includes(bymonthday, ii.mdaymask[currentDay]) &&
|
|
|
!includes(bynmonthday, ii.nmdaymask[currentDay])) ||
|
|
|
(notEmpty(byyearday) &&
|
|
|
((currentDay < ii.yearlen &&
|
|
|
!includes(byyearday, currentDay + 1) &&
|
|
|
!includes(byyearday, -ii.yearlen + currentDay)) ||
|
|
|
(currentDay >= ii.yearlen &&
|
|
|
!includes(byyearday, currentDay + 1 - ii.yearlen) &&
|
|
|
!includes(byyearday, -ii.nextyearlen + currentDay - ii.yearlen)))));
|
|
|
}
|
|
|
function rezoneIfNeeded(date, options) {
|
|
|
return new DateWithZone(date, options.tzid).rezonedDate();
|
|
|
}
|
|
|
function emitResult(iterResult) {
|
|
|
return iterResult.getValue();
|
|
|
}
|
|
|
function removeFilteredDays(dayset, start, end, ii, options) {
|
|
|
var filtered = false;
|
|
|
for (var dayCounter = start; dayCounter < end; dayCounter++) {
|
|
|
var currentDay = dayset[dayCounter];
|
|
|
filtered = isFiltered(ii, currentDay, options);
|
|
|
if (filtered)
|
|
|
dayset[currentDay] = null;
|
|
|
}
|
|
|
return filtered;
|
|
|
}
|
|
|
function makeTimeset(ii, counterDate, options) {
|
|
|
var freq = options.freq, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond;
|
|
|
if (freqIsDailyOrGreater(freq)) {
|
|
|
return buildTimeset(options);
|
|
|
}
|
|
|
if ((freq >= RRule.HOURLY &&
|
|
|
notEmpty(byhour) &&
|
|
|
!includes(byhour, counterDate.hour)) ||
|
|
|
(freq >= RRule.MINUTELY &&
|
|
|
notEmpty(byminute) &&
|
|
|
!includes(byminute, counterDate.minute)) ||
|
|
|
(freq >= RRule.SECONDLY &&
|
|
|
notEmpty(bysecond) &&
|
|
|
!includes(bysecond, counterDate.second))) {
|
|
|
return [];
|
|
|
}
|
|
|
return ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, counterDate.millisecond);
|
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
|
// RRule
|
|
|
// =============================================================================
|
|
|
var Days = {
|
|
|
MO: new Weekday(0),
|
|
|
TU: new Weekday(1),
|
|
|
WE: new Weekday(2),
|
|
|
TH: new Weekday(3),
|
|
|
FR: new Weekday(4),
|
|
|
SA: new Weekday(5),
|
|
|
SU: new Weekday(6)
|
|
|
};
|
|
|
var DEFAULT_OPTIONS$1 = {
|
|
|
freq: Frequency.YEARLY,
|
|
|
dtstart: null,
|
|
|
interval: 1,
|
|
|
wkst: Days.MO,
|
|
|
count: null,
|
|
|
until: null,
|
|
|
tzid: null,
|
|
|
bysetpos: null,
|
|
|
bymonth: null,
|
|
|
bymonthday: null,
|
|
|
bynmonthday: null,
|
|
|
byyearday: null,
|
|
|
byweekno: null,
|
|
|
byweekday: null,
|
|
|
bynweekday: null,
|
|
|
byhour: null,
|
|
|
byminute: null,
|
|
|
bysecond: null,
|
|
|
byeaster: null
|
|
|
};
|
|
|
var defaultKeys = Object.keys(DEFAULT_OPTIONS$1);
|
|
|
/**
|
|
|
*
|
|
|
* @param {Options?} options - see <http://labix.org/python-dateutil/#head-cf004ee9a75592797e076752b2a889c10f445418>
|
|
|
* The only required option is `freq`, one of RRule.YEARLY, RRule.MONTHLY, ...
|
|
|
* @constructor
|
|
|
*/
|
|
|
var RRule = /** @class */ (function () {
|
|
|
function RRule(options, noCache) {
|
|
|
if (options === void 0) { options = {}; }
|
|
|
if (noCache === void 0) { noCache = false; }
|
|
|
// RFC string
|
|
|
this._cache = noCache ? null : new Cache();
|
|
|
// used by toString()
|
|
|
this.origOptions = initializeOptions$1(options);
|
|
|
var parsedOptions = parseOptions(options).parsedOptions;
|
|
|
this.options = parsedOptions;
|
|
|
}
|
|
|
RRule.parseText = function (text, language) {
|
|
|
return parseText(text, language);
|
|
|
};
|
|
|
RRule.fromText = function (text, language) {
|
|
|
return fromText(text, language);
|
|
|
};
|
|
|
RRule.fromString = function (str) {
|
|
|
return new RRule(RRule.parseString(str) || undefined);
|
|
|
};
|
|
|
RRule.prototype._iter = function (iterResult) {
|
|
|
return iter(iterResult, this.options);
|
|
|
};
|
|
|
RRule.prototype._cacheGet = function (what, args) {
|
|
|
if (!this._cache)
|
|
|
return false;
|
|
|
return this._cache._cacheGet(what, args);
|
|
|
};
|
|
|
RRule.prototype._cacheAdd = function (what, value, args) {
|
|
|
if (!this._cache)
|
|
|
return;
|
|
|
return this._cache._cacheAdd(what, value, args);
|
|
|
};
|
|
|
/**
|
|
|
* @param {Function} iterator - optional function that will be called
|
|
|
* on each date that is added. It can return false
|
|
|
* to stop the iteration.
|
|
|
* @return Array containing all recurrences.
|
|
|
*/
|
|
|
RRule.prototype.all = function (iterator) {
|
|
|
if (iterator) {
|
|
|
return this._iter(new CallbackIterResult('all', {}, iterator));
|
|
|
}
|
|
|
var result = this._cacheGet('all');
|
|
|
if (result === false) {
|
|
|
result = this._iter(new IterResult('all', {}));
|
|
|
this._cacheAdd('all', result);
|
|
|
}
|
|
|
return result;
|
|
|
};
|
|
|
/**
|
|
|
* Returns all the occurrences of the rrule between after and before.
|
|
|
* The inc keyword defines what happens if after and/or before are
|
|
|
* themselves occurrences. With inc == True, they will be included in the
|
|
|
* list, if they are found in the recurrence set.
|
|
|
* @return Array
|
|
|
*/
|
|
|
RRule.prototype.between = function (after, before, inc, iterator) {
|
|
|
if (inc === void 0) { inc = false; }
|
|
|
if (!dateutil$1.isValidDate(after) || !dateutil$1.isValidDate(before))
|
|
|
throw new Error('Invalid date passed in to RRule.between');
|
|
|
var args = {
|
|
|
before: before,
|
|
|
after: after,
|
|
|
inc: inc
|
|
|
};
|
|
|
if (iterator) {
|
|
|
return this._iter(new CallbackIterResult('between', args, iterator));
|
|
|
}
|
|
|
var result = this._cacheGet('between', args);
|
|
|
if (result === false) {
|
|
|
result = this._iter(new IterResult('between', args));
|
|
|
this._cacheAdd('between', result, args);
|
|
|
}
|
|
|
return result;
|
|
|
};
|
|
|
/**
|
|
|
* Returns the last recurrence before the given datetime instance.
|
|
|
* The inc keyword defines what happens if dt is an occurrence.
|
|
|
* With inc == True, if dt itself is an occurrence, it will be returned.
|
|
|
* @return Date or null
|
|
|
*/
|
|
|
RRule.prototype.before = function (dt, inc) {
|
|
|
if (inc === void 0) { inc = false; }
|
|
|
if (!dateutil$1.isValidDate(dt))
|
|
|
throw new Error('Invalid date passed in to RRule.before');
|
|
|
var args = { dt: dt, inc: inc };
|
|
|
var result = this._cacheGet('before', args);
|
|
|
if (result === false) {
|
|
|
result = this._iter(new IterResult('before', args));
|
|
|
this._cacheAdd('before', result, args);
|
|
|
}
|
|
|
return result;
|
|
|
};
|
|
|
/**
|
|
|
* Returns the first recurrence after the given datetime instance.
|
|
|
* The inc keyword defines what happens if dt is an occurrence.
|
|
|
* With inc == True, if dt itself is an occurrence, it will be returned.
|
|
|
* @return Date or null
|
|
|
*/
|
|
|
RRule.prototype.after = function (dt, inc) {
|
|
|
if (inc === void 0) { inc = false; }
|
|
|
if (!dateutil$1.isValidDate(dt))
|
|
|
throw new Error('Invalid date passed in to RRule.after');
|
|
|
var args = { dt: dt, inc: inc };
|
|
|
var result = this._cacheGet('after', args);
|
|
|
if (result === false) {
|
|
|
result = this._iter(new IterResult('after', args));
|
|
|
this._cacheAdd('after', result, args);
|
|
|
}
|
|
|
return result;
|
|
|
};
|
|
|
/**
|
|
|
* Returns the number of recurrences in this set. It will have go trough
|
|
|
* the whole recurrence, if this hasn't been done before.
|
|
|
*/
|
|
|
RRule.prototype.count = function () {
|
|
|
return this.all().length;
|
|
|
};
|
|
|
/**
|
|
|
* Converts the rrule into its string representation
|
|
|
* @see <http://www.ietf.org/rfc/rfc2445.txt>
|
|
|
* @return String
|
|
|
*/
|
|
|
RRule.prototype.toString = function () {
|
|
|
return optionsToString(this.origOptions);
|
|
|
};
|
|
|
/**
|
|
|
* Will convert all rules described in nlp:ToText
|
|
|
* to text.
|
|
|
*/
|
|
|
RRule.prototype.toText = function (gettext, language, dateFormatter) {
|
|
|
return toText(this, gettext, language, dateFormatter);
|
|
|
};
|
|
|
RRule.prototype.isFullyConvertibleToText = function () {
|
|
|
return isFullyConvertible(this);
|
|
|
};
|
|
|
/**
|
|
|
* @return a RRule instance with the same freq and options
|
|
|
* as this one (cache is not cloned)
|
|
|
*/
|
|
|
RRule.prototype.clone = function () {
|
|
|
return new RRule(this.origOptions);
|
|
|
};
|
|
|
// RRule class 'constants'
|
|
|
RRule.FREQUENCIES = [
|
|
|
'YEARLY',
|
|
|
'MONTHLY',
|
|
|
'WEEKLY',
|
|
|
'DAILY',
|
|
|
'HOURLY',
|
|
|
'MINUTELY',
|
|
|
'SECONDLY'
|
|
|
];
|
|
|
RRule.YEARLY = Frequency.YEARLY;
|
|
|
RRule.MONTHLY = Frequency.MONTHLY;
|
|
|
RRule.WEEKLY = Frequency.WEEKLY;
|
|
|
RRule.DAILY = Frequency.DAILY;
|
|
|
RRule.HOURLY = Frequency.HOURLY;
|
|
|
RRule.MINUTELY = Frequency.MINUTELY;
|
|
|
RRule.SECONDLY = Frequency.SECONDLY;
|
|
|
RRule.MO = Days.MO;
|
|
|
RRule.TU = Days.TU;
|
|
|
RRule.WE = Days.WE;
|
|
|
RRule.TH = Days.TH;
|
|
|
RRule.FR = Days.FR;
|
|
|
RRule.SA = Days.SA;
|
|
|
RRule.SU = Days.SU;
|
|
|
RRule.parseString = parseString;
|
|
|
RRule.optionsToString = optionsToString;
|
|
|
return RRule;
|
|
|
}());
|
|
|
|
|
|
function iterSet(iterResult, _rrule, _exrule, _rdate, _exdate, tzid) {
|
|
|
var _exdateHash = {};
|
|
|
var _accept = iterResult.accept;
|
|
|
function evalExdate(after, before) {
|
|
|
_exrule.forEach(function (rrule) {
|
|
|
rrule.between(after, before, true).forEach(function (date) {
|
|
|
_exdateHash[Number(date)] = true;
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
_exdate.forEach(function (date) {
|
|
|
var zonedDate = new DateWithZone(date, tzid).rezonedDate();
|
|
|
_exdateHash[Number(zonedDate)] = true;
|
|
|
});
|
|
|
iterResult.accept = function (date) {
|
|
|
var dt = Number(date);
|
|
|
if (isNaN(dt))
|
|
|
return _accept.call(this, date);
|
|
|
if (!_exdateHash[dt]) {
|
|
|
evalExdate(new Date(dt - 1), new Date(dt + 1));
|
|
|
if (!_exdateHash[dt]) {
|
|
|
_exdateHash[dt] = true;
|
|
|
return _accept.call(this, date);
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
};
|
|
|
if (iterResult.method === 'between') {
|
|
|
evalExdate(iterResult.args.after, iterResult.args.before);
|
|
|
iterResult.accept = function (date) {
|
|
|
var dt = Number(date);
|
|
|
if (!_exdateHash[dt]) {
|
|
|
_exdateHash[dt] = true;
|
|
|
return _accept.call(this, date);
|
|
|
}
|
|
|
return true;
|
|
|
};
|
|
|
}
|
|
|
for (var i = 0; i < _rdate.length; i++) {
|
|
|
var zonedDate = new DateWithZone(_rdate[i], tzid).rezonedDate();
|
|
|
if (!iterResult.accept(new Date(zonedDate.getTime())))
|
|
|
break;
|
|
|
}
|
|
|
_rrule.forEach(function (rrule) {
|
|
|
iter(iterResult, rrule.options);
|
|
|
});
|
|
|
var res = iterResult._result;
|
|
|
dateutil$1.sort(res);
|
|
|
switch (iterResult.method) {
|
|
|
case 'all':
|
|
|
case 'between':
|
|
|
return res;
|
|
|
case 'before':
|
|
|
return ((res.length && res[res.length - 1]) || null);
|
|
|
case 'after':
|
|
|
default:
|
|
|
return ((res.length && res[0]) || null);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* RRuleStr
|
|
|
* To parse a set of rrule strings
|
|
|
*/
|
|
|
var DEFAULT_OPTIONS = {
|
|
|
dtstart: null,
|
|
|
cache: false,
|
|
|
unfold: false,
|
|
|
forceset: false,
|
|
|
compatible: false,
|
|
|
tzid: null
|
|
|
};
|
|
|
function parseInput(s, options) {
|
|
|
var rrulevals = [];
|
|
|
var rdatevals = [];
|
|
|
var exrulevals = [];
|
|
|
var exdatevals = [];
|
|
|
var _a = parseDtstart(s), dtstart = _a.dtstart, tzid = _a.tzid;
|
|
|
var lines = splitIntoLines(s, options.unfold);
|
|
|
lines.forEach(function (line) {
|
|
|
if (!line)
|
|
|
return;
|
|
|
var _a = breakDownLine(line), name = _a.name, parms = _a.parms, value = _a.value;
|
|
|
switch (name.toUpperCase()) {
|
|
|
case 'RRULE':
|
|
|
if (parms.length) {
|
|
|
throw new Error("unsupported RRULE parm: " + parms.join(','));
|
|
|
}
|
|
|
rrulevals.push(parseString(line));
|
|
|
break;
|
|
|
case 'RDATE':
|
|
|
var _b = /RDATE(?:;TZID=([^:=]+))?/i.exec(line); _b[0]; var rdateTzid = _b[1];
|
|
|
if (rdateTzid && !tzid) {
|
|
|
tzid = rdateTzid;
|
|
|
}
|
|
|
rdatevals = rdatevals.concat(parseRDate(value, parms));
|
|
|
break;
|
|
|
case 'EXRULE':
|
|
|
if (parms.length) {
|
|
|
throw new Error("unsupported EXRULE parm: " + parms.join(','));
|
|
|
}
|
|
|
exrulevals.push(parseString(value));
|
|
|
break;
|
|
|
case 'EXDATE':
|
|
|
exdatevals = exdatevals.concat(parseRDate(value, parms));
|
|
|
break;
|
|
|
case 'DTSTART':
|
|
|
break;
|
|
|
default:
|
|
|
throw new Error('unsupported property: ' + name);
|
|
|
}
|
|
|
});
|
|
|
return {
|
|
|
dtstart: dtstart,
|
|
|
tzid: tzid,
|
|
|
rrulevals: rrulevals,
|
|
|
rdatevals: rdatevals,
|
|
|
exrulevals: exrulevals,
|
|
|
exdatevals: exdatevals
|
|
|
};
|
|
|
}
|
|
|
function buildRule(s, options) {
|
|
|
var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid;
|
|
|
var noCache = options.cache === false;
|
|
|
if (options.compatible) {
|
|
|
options.forceset = true;
|
|
|
options.unfold = true;
|
|
|
}
|
|
|
if (options.forceset ||
|
|
|
rrulevals.length > 1 ||
|
|
|
rdatevals.length ||
|
|
|
exrulevals.length ||
|
|
|
exdatevals.length) {
|
|
|
var rset_1 = new RRuleSet(noCache);
|
|
|
rset_1.dtstart(dtstart);
|
|
|
rset_1.tzid(tzid || undefined);
|
|
|
rrulevals.forEach(function (val) {
|
|
|
rset_1.rrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache));
|
|
|
});
|
|
|
rdatevals.forEach(function (date) {
|
|
|
rset_1.rdate(date);
|
|
|
});
|
|
|
exrulevals.forEach(function (val) {
|
|
|
rset_1.exrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache));
|
|
|
});
|
|
|
exdatevals.forEach(function (date) {
|
|
|
rset_1.exdate(date);
|
|
|
});
|
|
|
if (options.compatible && options.dtstart)
|
|
|
rset_1.rdate(dtstart);
|
|
|
return rset_1;
|
|
|
}
|
|
|
var val = rrulevals[0] || {};
|
|
|
return new RRule(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache);
|
|
|
}
|
|
|
function rrulestr(s, options) {
|
|
|
if (options === void 0) { options = {}; }
|
|
|
return buildRule(s, initializeOptions(options));
|
|
|
}
|
|
|
function groomRruleOptions(val, dtstart, tzid) {
|
|
|
return __assign(__assign({}, val), { dtstart: dtstart,
|
|
|
tzid: tzid });
|
|
|
}
|
|
|
function initializeOptions(options) {
|
|
|
var invalid = [];
|
|
|
var keys = Object.keys(options);
|
|
|
var defaultKeys = Object.keys(DEFAULT_OPTIONS);
|
|
|
keys.forEach(function (key) {
|
|
|
if (!includes(defaultKeys, key))
|
|
|
invalid.push(key);
|
|
|
});
|
|
|
if (invalid.length) {
|
|
|
throw new Error('Invalid options: ' + invalid.join(', '));
|
|
|
}
|
|
|
return __assign(__assign({}, DEFAULT_OPTIONS), options);
|
|
|
}
|
|
|
function extractName(line) {
|
|
|
if (line.indexOf(':') === -1) {
|
|
|
return {
|
|
|
name: 'RRULE',
|
|
|
value: line
|
|
|
};
|
|
|
}
|
|
|
var _a = split(line, ':', 1), name = _a[0], value = _a[1];
|
|
|
return {
|
|
|
name: name,
|
|
|
value: value
|
|
|
};
|
|
|
}
|
|
|
function breakDownLine(line) {
|
|
|
var _a = extractName(line), name = _a.name, value = _a.value;
|
|
|
var parms = name.split(';');
|
|
|
if (!parms)
|
|
|
throw new Error('empty property name');
|
|
|
return {
|
|
|
name: parms[0].toUpperCase(),
|
|
|
parms: parms.slice(1),
|
|
|
value: value
|
|
|
};
|
|
|
}
|
|
|
function splitIntoLines(s, unfold) {
|
|
|
if (unfold === void 0) { unfold = false; }
|
|
|
s = s && s.trim();
|
|
|
if (!s)
|
|
|
throw new Error('Invalid empty string');
|
|
|
// More info about 'unfold' option
|
|
|
// Go head to http://www.ietf.org/rfc/rfc2445.txt
|
|
|
if (!unfold) {
|
|
|
return s.split(/\s/);
|
|
|
}
|
|
|
var lines = s.split('\n');
|
|
|
var i = 0;
|
|
|
while (i < lines.length) {
|
|
|
// TODO
|
|
|
var line = (lines[i] = lines[i].replace(/\s+$/g, ''));
|
|
|
if (!line) {
|
|
|
lines.splice(i, 1);
|
|
|
}
|
|
|
else if (i > 0 && line[0] === ' ') {
|
|
|
lines[i - 1] += line.slice(1);
|
|
|
lines.splice(i, 1);
|
|
|
}
|
|
|
else {
|
|
|
i += 1;
|
|
|
}
|
|
|
}
|
|
|
return lines;
|
|
|
}
|
|
|
function validateDateParm(parms) {
|
|
|
parms.forEach(function (parm) {
|
|
|
if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) {
|
|
|
throw new Error('unsupported RDATE/EXDATE parm: ' + parm);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
function parseRDate(rdateval, parms) {
|
|
|
validateDateParm(parms);
|
|
|
return rdateval
|
|
|
.split(',')
|
|
|
.map(function (datestr) { return dateutil$1.untilStringToDate(datestr); });
|
|
|
}
|
|
|
|
|
|
function createGetterSetter(fieldName) {
|
|
|
var _this = this;
|
|
|
return function (field) {
|
|
|
if (field !== undefined) {
|
|
|
_this["_" + fieldName] = field;
|
|
|
}
|
|
|
if (_this["_" + fieldName] !== undefined) {
|
|
|
return _this["_" + fieldName];
|
|
|
}
|
|
|
for (var i = 0; i < _this._rrule.length; i++) {
|
|
|
var field_1 = _this._rrule[i].origOptions[fieldName];
|
|
|
if (field_1) {
|
|
|
return field_1;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
var RRuleSet = /** @class */ (function (_super) {
|
|
|
__extends(RRuleSet, _super);
|
|
|
/**
|
|
|
*
|
|
|
* @param {Boolean?} noCache
|
|
|
* The same stratagy as RRule on cache, default to false
|
|
|
* @constructor
|
|
|
*/
|
|
|
function RRuleSet(noCache) {
|
|
|
if (noCache === void 0) { noCache = false; }
|
|
|
var _this = _super.call(this, {}, noCache) || this;
|
|
|
_this.dtstart = createGetterSetter.apply(_this, ['dtstart']);
|
|
|
_this.tzid = createGetterSetter.apply(_this, ['tzid']);
|
|
|
_this._rrule = [];
|
|
|
_this._rdate = [];
|
|
|
_this._exrule = [];
|
|
|
_this._exdate = [];
|
|
|
return _this;
|
|
|
}
|
|
|
RRuleSet.prototype._iter = function (iterResult) {
|
|
|
return iterSet(iterResult, this._rrule, this._exrule, this._rdate, this._exdate, this.tzid());
|
|
|
};
|
|
|
/**
|
|
|
* Adds an RRule to the set
|
|
|
*
|
|
|
* @param {RRule}
|
|
|
*/
|
|
|
RRuleSet.prototype.rrule = function (rrule) {
|
|
|
_addRule(rrule, this._rrule);
|
|
|
};
|
|
|
/**
|
|
|
* Adds an EXRULE to the set
|
|
|
*
|
|
|
* @param {RRule}
|
|
|
*/
|
|
|
RRuleSet.prototype.exrule = function (rrule) {
|
|
|
_addRule(rrule, this._exrule);
|
|
|
};
|
|
|
/**
|
|
|
* Adds an RDate to the set
|
|
|
*
|
|
|
* @param {Date}
|
|
|
*/
|
|
|
RRuleSet.prototype.rdate = function (date) {
|
|
|
_addDate(date, this._rdate);
|
|
|
};
|
|
|
/**
|
|
|
* Adds an EXDATE to the set
|
|
|
*
|
|
|
* @param {Date}
|
|
|
*/
|
|
|
RRuleSet.prototype.exdate = function (date) {
|
|
|
_addDate(date, this._exdate);
|
|
|
};
|
|
|
/**
|
|
|
* Get list of included rrules in this recurrence set.
|
|
|
*
|
|
|
* @return List of rrules
|
|
|
*/
|
|
|
RRuleSet.prototype.rrules = function () {
|
|
|
return this._rrule.map(function (e) { return rrulestr(e.toString()); });
|
|
|
};
|
|
|
/**
|
|
|
* Get list of excluded rrules in this recurrence set.
|
|
|
*
|
|
|
* @return List of exrules
|
|
|
*/
|
|
|
RRuleSet.prototype.exrules = function () {
|
|
|
return this._exrule.map(function (e) { return rrulestr(e.toString()); });
|
|
|
};
|
|
|
/**
|
|
|
* Get list of included datetimes in this recurrence set.
|
|
|
*
|
|
|
* @return List of rdates
|
|
|
*/
|
|
|
RRuleSet.prototype.rdates = function () {
|
|
|
return this._rdate.map(function (e) { return new Date(e.getTime()); });
|
|
|
};
|
|
|
/**
|
|
|
* Get list of included datetimes in this recurrence set.
|
|
|
*
|
|
|
* @return List of exdates
|
|
|
*/
|
|
|
RRuleSet.prototype.exdates = function () {
|
|
|
return this._exdate.map(function (e) { return new Date(e.getTime()); });
|
|
|
};
|
|
|
RRuleSet.prototype.valueOf = function () {
|
|
|
var result = [];
|
|
|
if (!this._rrule.length && this._dtstart) {
|
|
|
result = result.concat(optionsToString({ dtstart: this._dtstart }));
|
|
|
}
|
|
|
this._rrule.forEach(function (rrule) {
|
|
|
result = result.concat(rrule.toString().split('\n'));
|
|
|
});
|
|
|
this._exrule.forEach(function (exrule) {
|
|
|
result = result.concat(exrule.toString().split('\n')
|
|
|
.map(function (line) { return line.replace(/^RRULE:/, 'EXRULE:'); })
|
|
|
.filter(function (line) { return !/^DTSTART/.test(line); }));
|
|
|
});
|
|
|
if (this._rdate.length) {
|
|
|
result.push(rdatesToString('RDATE', this._rdate, this.tzid()));
|
|
|
}
|
|
|
if (this._exdate.length) {
|
|
|
result.push(rdatesToString('EXDATE', this._exdate, this.tzid()));
|
|
|
}
|
|
|
return result;
|
|
|
};
|
|
|
/**
|
|
|
* to generate recurrence field such as:
|
|
|
* DTSTART:19970902T010000Z
|
|
|
* RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU
|
|
|
* RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH
|
|
|
*/
|
|
|
RRuleSet.prototype.toString = function () {
|
|
|
return this.valueOf().join('\n');
|
|
|
};
|
|
|
/**
|
|
|
* Create a new RRuleSet Object completely base on current instance
|
|
|
*/
|
|
|
RRuleSet.prototype.clone = function () {
|
|
|
var rrs = new RRuleSet(!!this._cache);
|
|
|
this._rrule.forEach(function (rule) { return rrs.rrule(rule.clone()); });
|
|
|
this._exrule.forEach(function (rule) { return rrs.exrule(rule.clone()); });
|
|
|
this._rdate.forEach(function (date) { return rrs.rdate(new Date(date.getTime())); });
|
|
|
this._exdate.forEach(function (date) { return rrs.exdate(new Date(date.getTime())); });
|
|
|
return rrs;
|
|
|
};
|
|
|
return RRuleSet;
|
|
|
}(RRule));
|
|
|
function _addRule(rrule, collection) {
|
|
|
if (!(rrule instanceof RRule)) {
|
|
|
throw new TypeError(String(rrule) + ' is not RRule instance');
|
|
|
}
|
|
|
if (!includes(collection.map(String), String(rrule))) {
|
|
|
collection.push(rrule);
|
|
|
}
|
|
|
}
|
|
|
function _addDate(date, collection) {
|
|
|
if (!(date instanceof Date)) {
|
|
|
throw new TypeError(String(date) + ' is not Date instance');
|
|
|
}
|
|
|
if (!includes(collection.map(Number), Number(date))) {
|
|
|
collection.push(date);
|
|
|
dateutil$1.sort(collection);
|
|
|
}
|
|
|
}
|
|
|
function rdatesToString(param, rdates, tzid) {
|
|
|
var isUTC = !tzid || tzid.toUpperCase() === 'UTC';
|
|
|
var header = isUTC ? param + ":" : param + ";TZID=" + tzid + ":";
|
|
|
var dateString = rdates
|
|
|
.map(function (rdate) { return dateutil$1.timeToUntilString(rdate.valueOf(), isUTC); })
|
|
|
.join(',');
|
|
|
return "" + header + dateString;
|
|
|
}
|
|
|
|
|
|
class Symbol$1 {
|
|
|
constructor(primary, func) {
|
|
|
this.primary = primary;
|
|
|
this.func = func;
|
|
|
}
|
|
|
static ofChar(ch) {
|
|
|
return new Symbol$1(ch, text => {
|
|
|
return text === ch;
|
|
|
});
|
|
|
}
|
|
|
static ofChars(ch) {
|
|
|
if (ch.length === 0) {
|
|
|
throw "empty symbol";
|
|
|
}
|
|
|
if (ch[0] == null) {
|
|
|
throw "ch mustn't be null";
|
|
|
}
|
|
|
if (ch.length === 0) {
|
|
|
return this.ofChar(ch[0]);
|
|
|
}
|
|
|
return new Symbol$1(ch[0], text => {
|
|
|
return ch.filter(c => text === c).length > 0;
|
|
|
});
|
|
|
}
|
|
|
isSymbol(text) {
|
|
|
return this.func(text);
|
|
|
}
|
|
|
;
|
|
|
}
|
|
|
class Tokens {
|
|
|
constructor(tokens) {
|
|
|
this.tokens = tokens;
|
|
|
}
|
|
|
setTokenText(symbol, text, keepSpace = false, create = false, separateSymbolAndText = false) {
|
|
|
let token = this.getToken(symbol);
|
|
|
if (token === null) {
|
|
|
if (!create) {
|
|
|
return null;
|
|
|
}
|
|
|
// append new token
|
|
|
if (symbol instanceof Symbol$1) {
|
|
|
token = { symbol: symbol.primary, text };
|
|
|
}
|
|
|
else {
|
|
|
token = { symbol, text };
|
|
|
}
|
|
|
if (separateSymbolAndText && token.symbol !== '' && !token.text.startsWith(" ")) {
|
|
|
token.text = ' ' + token.text;
|
|
|
}
|
|
|
if (this.tokens.length > 0) {
|
|
|
const lastToken = this.tokens[this.tokens.length - 1];
|
|
|
if (!this.isTokenEndsWithSpace(lastToken)) {
|
|
|
// last token doesn't end with space. Append space to last token.
|
|
|
lastToken.text += ' ';
|
|
|
}
|
|
|
}
|
|
|
this.tokens.push(token);
|
|
|
return token;
|
|
|
}
|
|
|
this.replaceTokenText(token, text, keepSpace);
|
|
|
return token;
|
|
|
}
|
|
|
length() {
|
|
|
return this.tokens.length;
|
|
|
}
|
|
|
replaceTokenText(token, text, keepSpace = false) {
|
|
|
if (!keepSpace) {
|
|
|
token.text = text;
|
|
|
return;
|
|
|
}
|
|
|
token.text = token.text.replace(/^(\s*).*?(\s*)$/, `$1${text}$2`);
|
|
|
}
|
|
|
isTokenEndsWithSpace(token) {
|
|
|
return token.text.match(/^.*\s$/);
|
|
|
}
|
|
|
getToken(symbol) {
|
|
|
for (let token of this.tokens) {
|
|
|
if (symbol instanceof Symbol$1) {
|
|
|
if (symbol.isSymbol(token.symbol)) {
|
|
|
return token;
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
if (symbol === token.symbol) {
|
|
|
return token;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
getTokenText(symbol, removeSpace = false) {
|
|
|
const token = this.getToken(symbol);
|
|
|
if (token === null) {
|
|
|
return null;
|
|
|
}
|
|
|
if (!removeSpace) {
|
|
|
return token.text;
|
|
|
}
|
|
|
return token.text.replace(/^\s*(.*?)\s*$/, `$1`);
|
|
|
}
|
|
|
removeToken(symbol) {
|
|
|
this.tokens = this.tokens.filter(token => !symbol.isSymbol(token.symbol));
|
|
|
}
|
|
|
forEachTokens(consumer) {
|
|
|
this.tokens.forEach(consumer);
|
|
|
}
|
|
|
join() {
|
|
|
return this.tokens.map(t => t.symbol + t.text).join("");
|
|
|
}
|
|
|
}
|
|
|
function splitBySymbol(line, symbols) {
|
|
|
const chars = [...line];
|
|
|
let text = "";
|
|
|
let currentToken = null;
|
|
|
const splitted = [];
|
|
|
const fillPreviousToken = () => {
|
|
|
if (currentToken === null) {
|
|
|
// previous token
|
|
|
splitted.push({ symbol: '', text });
|
|
|
}
|
|
|
else {
|
|
|
// previous token
|
|
|
currentToken.text = text;
|
|
|
}
|
|
|
};
|
|
|
chars.forEach(c => {
|
|
|
let isSymbol = symbols.filter(s => s.isSymbol(c)).length > 0;
|
|
|
if (isSymbol) {
|
|
|
fillPreviousToken();
|
|
|
// new token
|
|
|
currentToken = { symbol: c, text: '' };
|
|
|
splitted.push(currentToken);
|
|
|
text = '';
|
|
|
}
|
|
|
else {
|
|
|
text += c;
|
|
|
}
|
|
|
});
|
|
|
if (text.length > 0) {
|
|
|
fillPreviousToken();
|
|
|
}
|
|
|
return splitted;
|
|
|
}
|
|
|
|
|
|
function removeTags(text) {
|
|
|
return text.replace(/#\w+/g, "");
|
|
|
}
|
|
|
class TasksPluginReminderModel {
|
|
|
constructor(useCustomEmoji, removeTags, strictDateFormat, tokens) {
|
|
|
this.useCustomEmoji = useCustomEmoji;
|
|
|
this.removeTags = removeTags;
|
|
|
this.strictDateFormat = strictDateFormat;
|
|
|
this.tokens = tokens;
|
|
|
}
|
|
|
static parse(line, useCustomEmoji, removeTags, strictDateFormat) {
|
|
|
return new TasksPluginReminderModel(useCustomEmoji !== null && useCustomEmoji !== void 0 ? useCustomEmoji : false, removeTags !== null && removeTags !== void 0 ? removeTags : false, strictDateFormat !== null && strictDateFormat !== void 0 ? strictDateFormat : true, new Tokens(splitBySymbol(line, this.allSymbols)));
|
|
|
}
|
|
|
getTitle() {
|
|
|
let title = this.tokens.getTokenText("", true);
|
|
|
if (title != null && this.removeTags) {
|
|
|
title = removeTags(title);
|
|
|
}
|
|
|
return title;
|
|
|
}
|
|
|
getTime() {
|
|
|
return this.getDate(this.getReminderSymbol());
|
|
|
}
|
|
|
setTime(time) {
|
|
|
this.setDate(this.getReminderSymbol(), time);
|
|
|
}
|
|
|
getDueDate() {
|
|
|
return this.getDate(TasksPluginReminderModel.symbolDueDate);
|
|
|
}
|
|
|
setDueDate(time) {
|
|
|
this.setDate(TasksPluginReminderModel.symbolDueDate, time);
|
|
|
}
|
|
|
setRawTime(rawTime) {
|
|
|
this.setDate(this.getReminderSymbol(), rawTime);
|
|
|
return true;
|
|
|
}
|
|
|
getReminderSymbol() {
|
|
|
if (this.useCustomEmoji) {
|
|
|
return TasksPluginReminderModel.symbolReminder;
|
|
|
}
|
|
|
else {
|
|
|
return TasksPluginReminderModel.symbolDueDate;
|
|
|
}
|
|
|
}
|
|
|
toMarkdown() {
|
|
|
return this.tokens.join();
|
|
|
}
|
|
|
setTitle(description) {
|
|
|
this.tokens.setTokenText("", description, true, true);
|
|
|
}
|
|
|
getDoneDate() {
|
|
|
return this.getDate(TasksPluginReminderModel.symbolDoneDate);
|
|
|
}
|
|
|
setDoneDate(time) {
|
|
|
this.setDate(TasksPluginReminderModel.symbolDoneDate, time);
|
|
|
}
|
|
|
getRecurrence() {
|
|
|
return this.tokens.getTokenText(TasksPluginReminderModel.symbolRecurrence, true);
|
|
|
}
|
|
|
clone() {
|
|
|
return TasksPluginReminderModel.parse(this.toMarkdown(), this.useCustomEmoji, this.removeTags, this.strictDateFormat);
|
|
|
}
|
|
|
getDate(symbol) {
|
|
|
const dateText = this.tokens.getTokenText(symbol, true);
|
|
|
if (dateText === null) {
|
|
|
return null;
|
|
|
}
|
|
|
if (symbol === TasksPluginReminderModel.symbolReminder) {
|
|
|
return DATE_TIME_FORMATTER.parse(dateText);
|
|
|
}
|
|
|
else {
|
|
|
const date = moment(dateText, TasksPluginReminderModel.dateFormat, this.strictDateFormat);
|
|
|
if (!date.isValid()) {
|
|
|
return null;
|
|
|
}
|
|
|
return new DateTime$2(date, false);
|
|
|
}
|
|
|
}
|
|
|
setDate(symbol, time) {
|
|
|
if (time == null) {
|
|
|
this.tokens.removeToken(symbol);
|
|
|
return;
|
|
|
}
|
|
|
let timeStr;
|
|
|
if (time instanceof DateTime$2) {
|
|
|
if (symbol === TasksPluginReminderModel.symbolReminder) {
|
|
|
timeStr = DATE_TIME_FORMATTER.toString(time);
|
|
|
}
|
|
|
else {
|
|
|
timeStr = time.format(TasksPluginReminderModel.dateFormat);
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
timeStr = time;
|
|
|
}
|
|
|
this.tokens.setTokenText(symbol, timeStr, true, true, this.shouldSplitBetweenSymbolAndText());
|
|
|
}
|
|
|
shouldSplitBetweenSymbolAndText() {
|
|
|
let withSpace = 0;
|
|
|
let noSpace = 0;
|
|
|
this.tokens.forEachTokens(token => {
|
|
|
if (token.symbol === '') {
|
|
|
return;
|
|
|
}
|
|
|
if (token.text.match(/^\s.*$/)) {
|
|
|
withSpace += 1;
|
|
|
}
|
|
|
else {
|
|
|
noSpace++;
|
|
|
}
|
|
|
});
|
|
|
if (withSpace > noSpace) {
|
|
|
return true;
|
|
|
}
|
|
|
else if (withSpace < noSpace) {
|
|
|
return false;
|
|
|
}
|
|
|
else {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
TasksPluginReminderModel.dateFormat = "YYYY-MM-DD";
|
|
|
TasksPluginReminderModel.symbolDueDate = Symbol$1.ofChars([..."📅📆🗓"]);
|
|
|
TasksPluginReminderModel.symbolDoneDate = Symbol$1.ofChar("✅");
|
|
|
TasksPluginReminderModel.symbolRecurrence = Symbol$1.ofChar("🔁");
|
|
|
TasksPluginReminderModel.symbolReminder = Symbol$1.ofChar("⏰");
|
|
|
TasksPluginReminderModel.allSymbols = [
|
|
|
TasksPluginReminderModel.symbolDueDate,
|
|
|
TasksPluginReminderModel.symbolDoneDate,
|
|
|
TasksPluginReminderModel.symbolRecurrence,
|
|
|
TasksPluginReminderModel.symbolReminder,
|
|
|
];
|
|
|
class TasksPluginFormat extends TodoBasedReminderFormat {
|
|
|
parseReminder(todo) {
|
|
|
const parsed = TasksPluginReminderModel.parse(todo.body, this.useCustomEmoji(), this.removeTagsEnabled(), this.isStrictDateFormat());
|
|
|
if (this.useCustomEmoji() && parsed.getDueDate() == null) {
|
|
|
return null;
|
|
|
}
|
|
|
return parsed;
|
|
|
}
|
|
|
removeTagsEnabled() {
|
|
|
return this.config.getParameter(ReminderFormatParameterKey.removeTagsForTasksPlugin);
|
|
|
}
|
|
|
useCustomEmoji() {
|
|
|
return this.config.getParameter(ReminderFormatParameterKey.useCustomEmojiForTasksPlugin);
|
|
|
}
|
|
|
modifyReminder(doc, todo, parsed, edit) {
|
|
|
if (!super.modifyReminder(doc, todo, parsed, edit)) {
|
|
|
return false;
|
|
|
}
|
|
|
if (edit.checked !== undefined) {
|
|
|
if (edit.checked) {
|
|
|
const recurrence = parsed.getRecurrence();
|
|
|
if (recurrence !== null) {
|
|
|
const nextReminderTodo = todo.clone();
|
|
|
const nextReminder = parsed.clone();
|
|
|
const dueDate = parsed.getDueDate();
|
|
|
if (dueDate == null) {
|
|
|
return false;
|
|
|
}
|
|
|
if (this.useCustomEmoji()) {
|
|
|
const time = parsed.getTime();
|
|
|
if (time == null) {
|
|
|
return false;
|
|
|
}
|
|
|
const nextTime = this.nextDate(recurrence, time.moment());
|
|
|
const nextDueDate = this.nextDate(recurrence, dueDate.moment());
|
|
|
if (nextTime == null || nextDueDate == null) {
|
|
|
return false;
|
|
|
}
|
|
|
nextReminder.setTime(new DateTime$2(moment(nextTime), true));
|
|
|
nextReminder.setDueDate(new DateTime$2(moment(nextDueDate), true));
|
|
|
}
|
|
|
else {
|
|
|
const next = this.nextDate(recurrence, dueDate.moment());
|
|
|
if (next == null) {
|
|
|
return false;
|
|
|
}
|
|
|
const nextDueDate = new DateTime$2(moment(next), true);
|
|
|
nextReminder.setTime(nextDueDate);
|
|
|
}
|
|
|
nextReminderTodo.body = nextReminder.toMarkdown();
|
|
|
nextReminderTodo.setChecked(false);
|
|
|
doc.insertTodo(todo.lineIndex, nextReminderTodo);
|
|
|
}
|
|
|
parsed.setDoneDate(this.config.getParameter(ReminderFormatParameterKey.now));
|
|
|
}
|
|
|
else {
|
|
|
parsed.setDoneDate(undefined);
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
nextDate(recurrence, dtStart) {
|
|
|
const rruleOptions = RRule.parseText(recurrence);
|
|
|
if (!rruleOptions) {
|
|
|
return undefined;
|
|
|
}
|
|
|
const today = this.config.getParameter(ReminderFormatParameterKey.now).moment();
|
|
|
today.set("hour", dtStart.get("hour"));
|
|
|
today.set("minute", dtStart.get("minute"));
|
|
|
today.set("second", dtStart.get("second"));
|
|
|
today.set("millisecond", dtStart.get("millisecond"));
|
|
|
if (today.isAfter(dtStart)) {
|
|
|
dtStart = today;
|
|
|
}
|
|
|
rruleOptions.dtstart = dtStart.toDate();
|
|
|
const rrule = new RRule(rruleOptions);
|
|
|
return rrule.after(dtStart.toDate(), false);
|
|
|
}
|
|
|
newReminder(title, time) {
|
|
|
const parsed = TasksPluginReminderModel.parse(title, this.useCustomEmoji(), this.removeTagsEnabled(), this.isStrictDateFormat());
|
|
|
parsed.setTime(time);
|
|
|
if (this.useCustomEmoji() && parsed.getDueDate() == null) {
|
|
|
parsed.setDueDate(time);
|
|
|
}
|
|
|
parsed.setTitle(title);
|
|
|
return parsed;
|
|
|
}
|
|
|
}
|
|
|
TasksPluginFormat.instance = new TasksPluginFormat();
|
|
|
|
|
|
const REMINDER_FORMAT = new CompositeReminderFormat();
|
|
|
REMINDER_FORMAT.resetFormat([DefaultReminderFormat.instance]);
|
|
|
class ReminderFormatType {
|
|
|
constructor(name, description, example, format, defaultEnabled) {
|
|
|
this.name = name;
|
|
|
this.description = description;
|
|
|
this.example = example;
|
|
|
this.format = format;
|
|
|
this.defaultEnabled = defaultEnabled;
|
|
|
}
|
|
|
;
|
|
|
}
|
|
|
function parseReminder(doc) {
|
|
|
return REMINDER_FORMAT.parse(doc);
|
|
|
}
|
|
|
function modifyReminder(doc, reminder, edit) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
return REMINDER_FORMAT.modify(doc, reminder, edit);
|
|
|
});
|
|
|
}
|
|
|
function changeReminderFormat(formatTypes) {
|
|
|
if (formatTypes.length === 0) {
|
|
|
REMINDER_FORMAT.resetFormat([DefaultReminderFormat.instance]);
|
|
|
}
|
|
|
else {
|
|
|
REMINDER_FORMAT.resetFormat(formatTypes.map(f => f.format));
|
|
|
}
|
|
|
}
|
|
|
function setReminderFormatConfig(config) {
|
|
|
REMINDER_FORMAT.setConfig(config);
|
|
|
}
|
|
|
const reminderPluginReminderFormat = new ReminderFormatType("ReminderPluginReminderFormat", "Reminder plugin format", "(@2021-09-08)", DefaultReminderFormat.instance, true);
|
|
|
const tasksPluginReminderFormat = new ReminderFormatType("TasksPluginReminderFormat", "Tasks plugin format", "📅 2021-09-08", TasksPluginFormat.instance, false);
|
|
|
const kanbanPluginReminderFormat = new ReminderFormatType("KanbanPluginReminderFormat", "Kanban plugin format", "@{2021-09-08}", KanbanReminderFormat.instance, false);
|
|
|
const ReminderFormatTypes = [
|
|
|
reminderPluginReminderFormat,
|
|
|
tasksPluginReminderFormat,
|
|
|
kanbanPluginReminderFormat
|
|
|
];
|
|
|
|
|
|
class SettingRegistry {
|
|
|
constructor() {
|
|
|
this.settingContexts = [];
|
|
|
}
|
|
|
register(settingContext) {
|
|
|
this.settingContexts.push(settingContext);
|
|
|
}
|
|
|
findByKey(key) {
|
|
|
return this.settingContexts.find(c => c.key === key);
|
|
|
}
|
|
|
forEach(consumer) {
|
|
|
this.settingContexts.forEach(consumer);
|
|
|
}
|
|
|
}
|
|
|
class SettingContext {
|
|
|
constructor(_settingRegistry) {
|
|
|
this._settingRegistry = _settingRegistry;
|
|
|
this.tags = [];
|
|
|
}
|
|
|
init(settingModel, setting, containerEl) {
|
|
|
this.settingModel = settingModel;
|
|
|
this._setting = setting;
|
|
|
this.validationEl = containerEl.createDiv("validation", el => {
|
|
|
el.style.color = 'var(--text-error)';
|
|
|
el.style.marginBottom = '1rem';
|
|
|
el.style.fontSize = '14px';
|
|
|
el.style.display = 'none';
|
|
|
});
|
|
|
this.infoEl = containerEl.createDiv("info", el => {
|
|
|
el.style.color = 'var(--text-faint)';
|
|
|
el.style.marginBottom = '1rem';
|
|
|
el.style.fontSize = '14px';
|
|
|
el.style.display = 'none';
|
|
|
});
|
|
|
}
|
|
|
setValidationError(error) {
|
|
|
this.setText(this.validationEl, error);
|
|
|
}
|
|
|
setInfo(info) {
|
|
|
this.setText(this.infoEl, info);
|
|
|
}
|
|
|
setText(el, text) {
|
|
|
if (!el) {
|
|
|
console.error("element not created");
|
|
|
return;
|
|
|
}
|
|
|
if (text === null) {
|
|
|
el.style.display = "none";
|
|
|
}
|
|
|
else {
|
|
|
el.style.display = "block";
|
|
|
el.innerHTML = text;
|
|
|
}
|
|
|
}
|
|
|
get setting() {
|
|
|
return this._setting;
|
|
|
}
|
|
|
get registry() {
|
|
|
return this._settingRegistry;
|
|
|
}
|
|
|
hasTag(tag) {
|
|
|
return this.tags.filter(t => t === tag).length > 0;
|
|
|
}
|
|
|
update() {
|
|
|
if (!this.anyValueChanged) {
|
|
|
return;
|
|
|
}
|
|
|
this.anyValueChanged(this);
|
|
|
}
|
|
|
setEnabled(enable) {
|
|
|
this.setting.setDisabled(!enable);
|
|
|
}
|
|
|
findContextByKey(key) {
|
|
|
return this._settingRegistry.findByKey(key);
|
|
|
}
|
|
|
booleanValue() {
|
|
|
return this.settingModel.value;
|
|
|
}
|
|
|
isInitialized() {
|
|
|
return this.settingModel && this.validationEl && this.setting;
|
|
|
}
|
|
|
}
|
|
|
class SettingModelBuilder {
|
|
|
constructor(registry) {
|
|
|
this.registry = registry;
|
|
|
this.context = new SettingContext(this.registry);
|
|
|
this.registry.register(this.context);
|
|
|
}
|
|
|
key(key) {
|
|
|
this.context.key = key;
|
|
|
return this;
|
|
|
}
|
|
|
name(name) {
|
|
|
this.context.name = name;
|
|
|
return this;
|
|
|
}
|
|
|
desc(desc) {
|
|
|
this.context.desc = desc;
|
|
|
return this;
|
|
|
}
|
|
|
tag(tag) {
|
|
|
this.context.tags.push(tag);
|
|
|
return this;
|
|
|
}
|
|
|
enableWhen(enableWhen) {
|
|
|
this.context.anyValueChanged = enableWhen;
|
|
|
return this;
|
|
|
}
|
|
|
text(initValue) {
|
|
|
return new TextSettingModelBuilder(this.context, false, initValue);
|
|
|
}
|
|
|
textArea(initValue) {
|
|
|
return new TextSettingModelBuilder(this.context, true, initValue);
|
|
|
}
|
|
|
number(initValue) {
|
|
|
return new NumberSettingModelBuilder(this.context, initValue);
|
|
|
}
|
|
|
toggle(initValue) {
|
|
|
return new ToggleSettingModelBuilder(this.context, initValue);
|
|
|
}
|
|
|
dropdown(initValue) {
|
|
|
return new DropdownSettingModelBuilder(this.context, initValue);
|
|
|
}
|
|
|
}
|
|
|
class AbstractSettingModelBuilder {
|
|
|
constructor(context, initValue) {
|
|
|
this.context = context;
|
|
|
this.initValue = initValue;
|
|
|
}
|
|
|
;
|
|
|
onAnyValueChanged(anyValueChanged) {
|
|
|
this.context.anyValueChanged = anyValueChanged;
|
|
|
return this;
|
|
|
}
|
|
|
onValueChange() {
|
|
|
this.context.registry.forEach(c => {
|
|
|
c.update();
|
|
|
});
|
|
|
}
|
|
|
buildSettingModel(serde, initializer) {
|
|
|
return new SettingModelImpl(this.context, serde, this.initValue, initializer);
|
|
|
}
|
|
|
}
|
|
|
class TextSettingModelBuilder extends AbstractSettingModelBuilder {
|
|
|
constructor(context, longText, initValue) {
|
|
|
super(context, initValue);
|
|
|
this.longText = longText;
|
|
|
}
|
|
|
placeHolder(placeHolder) {
|
|
|
this._placeHolder = placeHolder;
|
|
|
return this;
|
|
|
}
|
|
|
build(serde) {
|
|
|
return this.buildSettingModel(serde, ({ setting, rawValue, context }) => {
|
|
|
const initText = (text) => {
|
|
|
var _a;
|
|
|
text
|
|
|
.setPlaceholder((_a = this._placeHolder) !== null && _a !== void 0 ? _a : "")
|
|
|
.setValue(rawValue.value)
|
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
|
try {
|
|
|
serde.unmarshal(value);
|
|
|
rawValue.value = value;
|
|
|
context.setValidationError(null);
|
|
|
this.onValueChange();
|
|
|
}
|
|
|
catch (e) {
|
|
|
if (e instanceof Error) {
|
|
|
context.setValidationError(e.message);
|
|
|
}
|
|
|
else if (typeof e === "string") {
|
|
|
context.setValidationError(e);
|
|
|
}
|
|
|
}
|
|
|
}));
|
|
|
};
|
|
|
if (this.longText) {
|
|
|
setting.addTextArea((textarea) => {
|
|
|
initText(textarea);
|
|
|
});
|
|
|
}
|
|
|
else {
|
|
|
setting.addText((text) => {
|
|
|
initText(text);
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
class NumberSettingModelBuilder extends AbstractSettingModelBuilder {
|
|
|
constructor(context, initValue) {
|
|
|
super(context, initValue);
|
|
|
}
|
|
|
placeHolder(placeHolder) {
|
|
|
this._placeHolder = placeHolder;
|
|
|
return this;
|
|
|
}
|
|
|
build(serde) {
|
|
|
return this.buildSettingModel(serde, ({ setting, rawValue, context }) => {
|
|
|
const initText = (text) => {
|
|
|
var _a;
|
|
|
text
|
|
|
.setPlaceholder((_a = this._placeHolder) !== null && _a !== void 0 ? _a : "")
|
|
|
.setValue(rawValue.value.toString())
|
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
|
try {
|
|
|
const n = parseInt(value);
|
|
|
rawValue.value = n;
|
|
|
context.setValidationError(null);
|
|
|
this.onValueChange();
|
|
|
}
|
|
|
catch (e) {
|
|
|
if (e instanceof Error) {
|
|
|
context.setValidationError(e.message);
|
|
|
}
|
|
|
else if (typeof e === "string") {
|
|
|
context.setValidationError(e);
|
|
|
}
|
|
|
}
|
|
|
}));
|
|
|
};
|
|
|
setting.addText((textarea) => {
|
|
|
initText(textarea);
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
class ToggleSettingModelBuilder extends AbstractSettingModelBuilder {
|
|
|
build(serde) {
|
|
|
return new SettingModelImpl(this.context, serde, this.initValue, ({ setting, rawValue }) => {
|
|
|
setting.addToggle((toggle) => toggle
|
|
|
.setValue(rawValue.value)
|
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
|
rawValue.value = value;
|
|
|
this.onValueChange();
|
|
|
})));
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
class DropdownOption {
|
|
|
constructor(label, value) {
|
|
|
this.label = label;
|
|
|
this.value = value;
|
|
|
}
|
|
|
}
|
|
|
class DropdownSettingModelBuilder extends AbstractSettingModelBuilder {
|
|
|
constructor() {
|
|
|
super(...arguments);
|
|
|
this.options = [];
|
|
|
}
|
|
|
addOption(label, value) {
|
|
|
this.options.push(new DropdownOption(label, value));
|
|
|
return this;
|
|
|
}
|
|
|
build(serde) {
|
|
|
return new SettingModelImpl(this.context, serde, this.initValue, ({ setting, rawValue }) => {
|
|
|
setting.addDropdown(d => {
|
|
|
this.options.forEach(option => {
|
|
|
d.addOption(option.value, option.label);
|
|
|
});
|
|
|
d.setValue(rawValue.value);
|
|
|
d.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
|
rawValue.value = value;
|
|
|
this.onValueChange();
|
|
|
}));
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
class SettingModelImpl {
|
|
|
constructor(context, serde, initRawValue, settingInitializer) {
|
|
|
this.context = context;
|
|
|
this.serde = serde;
|
|
|
this.settingInitializer = settingInitializer;
|
|
|
this.rawValue = new Reference(initRawValue);
|
|
|
if (context.key == null) {
|
|
|
throw new Error("key is required.");
|
|
|
}
|
|
|
}
|
|
|
createSetting(containerEl) {
|
|
|
var _a, _b;
|
|
|
const setting = new obsidian.Setting(containerEl)
|
|
|
.setName((_a = this.context.name) !== null && _a !== void 0 ? _a : "")
|
|
|
.setDesc((_b = this.context.desc) !== null && _b !== void 0 ? _b : "");
|
|
|
this.context.init(this, setting, containerEl);
|
|
|
this.settingInitializer({
|
|
|
setting,
|
|
|
rawValue: this.rawValue,
|
|
|
context: this.context
|
|
|
});
|
|
|
return setting;
|
|
|
}
|
|
|
get value() {
|
|
|
return this.serde.unmarshal(this.rawValue.value);
|
|
|
}
|
|
|
get key() {
|
|
|
return this.context.key;
|
|
|
}
|
|
|
load(settings) {
|
|
|
if (settings === undefined) {
|
|
|
return;
|
|
|
}
|
|
|
const newValue = settings[this.key];
|
|
|
if (newValue !== undefined) {
|
|
|
this.rawValue.value = newValue;
|
|
|
}
|
|
|
}
|
|
|
store(settings) {
|
|
|
settings[this.key] = this.rawValue.value;
|
|
|
}
|
|
|
hasTag(tag) {
|
|
|
return this.context.hasTag(tag);
|
|
|
}
|
|
|
}
|
|
|
class SettingGroup {
|
|
|
constructor(name) {
|
|
|
this.name = name;
|
|
|
this.settings = [];
|
|
|
}
|
|
|
addSettings(...settingModels) {
|
|
|
this.settings.push(...settingModels);
|
|
|
}
|
|
|
}
|
|
|
class SettingTabModel {
|
|
|
constructor() {
|
|
|
this.groups = [];
|
|
|
this.registry = new SettingRegistry();
|
|
|
}
|
|
|
newSettingBuilder() {
|
|
|
return new SettingModelBuilder(this.registry);
|
|
|
}
|
|
|
newGroup(name) {
|
|
|
const group = new SettingGroup(name);
|
|
|
this.groups.push(group);
|
|
|
return group;
|
|
|
}
|
|
|
displayOn(el) {
|
|
|
el.empty();
|
|
|
this.groups.forEach(group => {
|
|
|
el.createEl('h3', { text: group.name });
|
|
|
group.settings.forEach(settings => {
|
|
|
settings.createSetting(el);
|
|
|
});
|
|
|
});
|
|
|
this.registry.forEach(context => context.update());
|
|
|
}
|
|
|
forEach(consumer) {
|
|
|
this.groups.forEach(group => {
|
|
|
group.settings.forEach(setting => {
|
|
|
consumer(setting);
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
class TimeSerde {
|
|
|
unmarshal(rawValue) {
|
|
|
return Time$1.parse(rawValue);
|
|
|
}
|
|
|
marshal(value) {
|
|
|
return value.toString();
|
|
|
}
|
|
|
}
|
|
|
class RawSerde {
|
|
|
unmarshal(rawValue) {
|
|
|
return rawValue;
|
|
|
}
|
|
|
marshal(value) {
|
|
|
return value;
|
|
|
}
|
|
|
}
|
|
|
class LatersSerde {
|
|
|
unmarshal(rawValue) {
|
|
|
return parseLaters(rawValue);
|
|
|
}
|
|
|
marshal(value) {
|
|
|
return value.map(v => v.label).join("\n");
|
|
|
}
|
|
|
}
|
|
|
class ReminderFormatTypeSerde {
|
|
|
unmarshal(rawValue) {
|
|
|
const format = ReminderFormatTypes.find(format => format.name === rawValue);
|
|
|
// TODO return undefined when it is not found
|
|
|
return format;
|
|
|
}
|
|
|
marshal(value) {
|
|
|
return value.name;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const TAG_RESCAN = "re-scan";
|
|
|
class Settings {
|
|
|
constructor() {
|
|
|
this.settings = new SettingTabModel();
|
|
|
const reminderFormatSettings = new ReminderFormatSettings(this.settings);
|
|
|
this.reminderTime = this.settings.newSettingBuilder()
|
|
|
.key("reminderTime")
|
|
|
.name("Reminder Time")
|
|
|
.desc("Time when a reminder with no time part will show")
|
|
|
.tag(TAG_RESCAN)
|
|
|
.text("09:00")
|
|
|
.placeHolder("Time (hh:mm)")
|
|
|
.build(new TimeSerde());
|
|
|
this.useSystemNotification = this.settings.newSettingBuilder()
|
|
|
.key("useSystemNotification")
|
|
|
.name("Use system notification")
|
|
|
.desc("Use system notification for reminder notifications")
|
|
|
.toggle(false)
|
|
|
.build(new RawSerde());
|
|
|
this.laters = this.settings.newSettingBuilder()
|
|
|
.key("laters")
|
|
|
.name("Remind me later")
|
|
|
.desc("Line-separated list of remind me later items")
|
|
|
.textArea("In 30 minutes\nIn 1 hour\nIn 3 hours\nTomorrow\nNext week")
|
|
|
.placeHolder("In 30 minutes\nIn 1 hour\nIn 3 hours\nTomorrow\nNext week")
|
|
|
.build(new LatersSerde());
|
|
|
this.dateFormat = this.settings.newSettingBuilder()
|
|
|
.key("dateFormat")
|
|
|
.name("Date format")
|
|
|
.desc("moment style date format: https://momentjs.com/docs/#/displaying/format/")
|
|
|
.tag(TAG_RESCAN)
|
|
|
.text("YYYY-MM-DD")
|
|
|
.placeHolder("YYYY-MM-DD")
|
|
|
.onAnyValueChanged(context => {
|
|
|
context.setEnabled(reminderFormatSettings.enableReminderPluginReminderFormat.value);
|
|
|
})
|
|
|
.build(new RawSerde());
|
|
|
this.strictDateFormat = this.settings.newSettingBuilder()
|
|
|
.key("strictDateFormat")
|
|
|
.name("Strict Date format")
|
|
|
.desc("Strictly parse the date and time")
|
|
|
.tag(TAG_RESCAN)
|
|
|
.toggle(false)
|
|
|
.build(new RawSerde());
|
|
|
this.dateTimeFormat = this.settings.newSettingBuilder()
|
|
|
.key("dateTimeFormat")
|
|
|
.name("Date and time format")
|
|
|
.desc("moment() style date time format: https://momentjs.com/docs/#/displaying/format/")
|
|
|
.tag(TAG_RESCAN)
|
|
|
.text("YYYY-MM-DD HH:mm")
|
|
|
.placeHolder("YYYY-MM-DD HH:mm")
|
|
|
.onAnyValueChanged(context => {
|
|
|
context.setEnabled(reminderFormatSettings.enableReminderPluginReminderFormat.value);
|
|
|
})
|
|
|
.build(new RawSerde());
|
|
|
this.linkDatesToDailyNotes = this.settings.newSettingBuilder()
|
|
|
.key("linkDatesToDailyNotes")
|
|
|
.name("Link dates to daily notes")
|
|
|
.desc("When toggled, Dates link to daily notes.")
|
|
|
.tag(TAG_RESCAN)
|
|
|
.toggle(false)
|
|
|
.onAnyValueChanged(context => {
|
|
|
context.setEnabled(reminderFormatSettings.enableReminderPluginReminderFormat.value);
|
|
|
})
|
|
|
.build(new RawSerde());
|
|
|
this.autoCompleteTrigger = this.settings.newSettingBuilder()
|
|
|
.key("autoCompleteTrigger")
|
|
|
.name("Calendar popup trigger")
|
|
|
.desc("Trigger text to show calendar popup")
|
|
|
.text("(@")
|
|
|
.placeHolder("(@")
|
|
|
.onAnyValueChanged(context => {
|
|
|
const value = this.autoCompleteTrigger.value;
|
|
|
context.setInfo(`Popup is ${value.length === 0 ? "disabled" : "enabled"}`);
|
|
|
})
|
|
|
.build(new RawSerde());
|
|
|
const primaryFormatBuilder = this.settings.newSettingBuilder()
|
|
|
.key("primaryReminderFormat")
|
|
|
.name("Primary reminder format")
|
|
|
.desc("Reminder format for generated reminder by calendar popup")
|
|
|
.dropdown(ReminderFormatTypes[0].name);
|
|
|
ReminderFormatTypes.forEach(f => primaryFormatBuilder.addOption(`${f.description} - ${f.example}`, f.name));
|
|
|
this.primaryFormat = primaryFormatBuilder.build(new ReminderFormatTypeSerde());
|
|
|
this.useCustomEmojiForTasksPlugin = this.settings.newSettingBuilder()
|
|
|
.key("useCustomEmojiForTasksPlugin")
|
|
|
.name("Distinguish between reminder date and due date")
|
|
|
.desc("Use custom emoji ⏰ instead of 📅 and distinguish between reminder date/time and Tasks Plugin's due date.")
|
|
|
.tag(TAG_RESCAN)
|
|
|
.toggle(false)
|
|
|
.onAnyValueChanged(context => {
|
|
|
context.setEnabled(reminderFormatSettings.enableTasksPluginReminderFormat.value);
|
|
|
})
|
|
|
.build(new RawSerde());
|
|
|
this.removeTagsForTasksPlugin = this.settings.newSettingBuilder()
|
|
|
.key("removeTagsForTasksPlugin")
|
|
|
.name("Remove tags from reminder title")
|
|
|
.desc("If checked, tags(#xxx) are removed from the reminder list view and notification.")
|
|
|
.tag(TAG_RESCAN)
|
|
|
.toggle(false)
|
|
|
.onAnyValueChanged(context => {
|
|
|
context.setEnabled(reminderFormatSettings.enableTasksPluginReminderFormat.value);
|
|
|
})
|
|
|
.build(new RawSerde());
|
|
|
this.editDetectionSec = this.settings.newSettingBuilder()
|
|
|
.key("editDetectionSec")
|
|
|
.name("Edit Detection Time")
|
|
|
.desc("The minimum amount of time (in seconds) after a key is typed that it will be identified as notifiable.")
|
|
|
.number(10)
|
|
|
.build(new RawSerde());
|
|
|
this.reminderCheckIntervalSec = this.settings.newSettingBuilder()
|
|
|
.key("reminderCheckIntervalSec")
|
|
|
.name("Reminder check interval")
|
|
|
.desc("Interval(in seconds) to periodically check whether or not you should be notified of reminders. You will need to restart Obsidian for this setting to take effect.")
|
|
|
.number(5)
|
|
|
.build(new RawSerde());
|
|
|
this.settings
|
|
|
.newGroup("Notification Settings")
|
|
|
.addSettings(this.reminderTime, this.laters, this.useSystemNotification);
|
|
|
this.settings
|
|
|
.newGroup("Editor")
|
|
|
.addSettings(this.autoCompleteTrigger, this.primaryFormat);
|
|
|
this.settings
|
|
|
.newGroup("Reminder Format - Reminder Plugin")
|
|
|
.addSettings(reminderFormatSettings.enableReminderPluginReminderFormat, this.dateFormat, this.dateTimeFormat, this.strictDateFormat, this.linkDatesToDailyNotes);
|
|
|
this.settings
|
|
|
.newGroup("Reminder Format - Tasks Plugin")
|
|
|
.addSettings(reminderFormatSettings.enableTasksPluginReminderFormat, this.useCustomEmojiForTasksPlugin, this.removeTagsForTasksPlugin);
|
|
|
this.settings
|
|
|
.newGroup("Reminder Format - Kanban Plugin")
|
|
|
.addSettings(reminderFormatSettings.enableKanbanPluginReminderFormat);
|
|
|
this.settings
|
|
|
.newGroup("Advanced")
|
|
|
.addSettings(this.editDetectionSec, this.reminderCheckIntervalSec);
|
|
|
const config = new ReminderFormatConfig();
|
|
|
config.setParameterFunc(ReminderFormatParameterKey.now, () => DateTime$2.now());
|
|
|
config.setParameter(ReminderFormatParameterKey.useCustomEmojiForTasksPlugin, this.useCustomEmojiForTasksPlugin);
|
|
|
config.setParameter(ReminderFormatParameterKey.linkDatesToDailyNotes, this.linkDatesToDailyNotes);
|
|
|
config.setParameter(ReminderFormatParameterKey.removeTagsForTasksPlugin, this.removeTagsForTasksPlugin);
|
|
|
setReminderFormatConfig(config);
|
|
|
}
|
|
|
forEach(consumer) {
|
|
|
this.settings.forEach(consumer);
|
|
|
}
|
|
|
}
|
|
|
class ReminderFormatSettings {
|
|
|
constructor(settings) {
|
|
|
this.settings = settings;
|
|
|
this.settingKeyToFormatName = new Map();
|
|
|
this.reminderFormatSettings = [];
|
|
|
this.enableReminderPluginReminderFormat = this.createUseReminderFormatSetting(reminderPluginReminderFormat);
|
|
|
this.enableTasksPluginReminderFormat = this.createUseReminderFormatSetting(tasksPluginReminderFormat);
|
|
|
this.enableKanbanPluginReminderFormat = this.createUseReminderFormatSetting(kanbanPluginReminderFormat);
|
|
|
}
|
|
|
createUseReminderFormatSetting(format) {
|
|
|
const key = `enable${format.name}`;
|
|
|
const setting = this.settings.newSettingBuilder()
|
|
|
.key(key)
|
|
|
.name(`Enable ${format.description}`)
|
|
|
.desc(`Enable ${format.description}`)
|
|
|
.tag(TAG_RESCAN)
|
|
|
.toggle(format.defaultEnabled)
|
|
|
.onAnyValueChanged(context => {
|
|
|
context.setInfo(`Example: ${format.format.appendReminder("- [ ] Task 1", DateTime$2.now())}`);
|
|
|
})
|
|
|
.build(new RawSerde());
|
|
|
this.settingKeyToFormatName.set(key, format);
|
|
|
this.reminderFormatSettings.push(setting);
|
|
|
setting.rawValue.onChanged(() => {
|
|
|
this.updateReminderFormat(setting);
|
|
|
});
|
|
|
return setting;
|
|
|
}
|
|
|
updateReminderFormat(setting) {
|
|
|
const selectedFormats = this.reminderFormatSettings
|
|
|
.filter(s => s.value)
|
|
|
.map(s => this.settingKeyToFormatName.get(s.key))
|
|
|
.filter((s) => s !== undefined);
|
|
|
changeReminderFormat(selectedFormats);
|
|
|
}
|
|
|
}
|
|
|
const SETTINGS = new Settings();
|
|
|
class ReminderSettingTab extends obsidian.PluginSettingTab {
|
|
|
constructor(app, plugin) {
|
|
|
super(app, plugin);
|
|
|
}
|
|
|
display() {
|
|
|
let { containerEl } = this;
|
|
|
SETTINGS.settings.displayOn(containerEl);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class Content {
|
|
|
constructor(file, content) {
|
|
|
this.doc = new MarkdownDocument(file, content);
|
|
|
}
|
|
|
getReminders(doneOnly = true) {
|
|
|
const reminders = parseReminder(this.doc);
|
|
|
if (!doneOnly) {
|
|
|
return reminders;
|
|
|
}
|
|
|
return reminders.filter(reminder => !reminder.done);
|
|
|
}
|
|
|
getTodos() {
|
|
|
return this.doc.getTodos();
|
|
|
}
|
|
|
modifyReminderLines(modifyFunc) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
for (const reminder of this.getReminders(false)) {
|
|
|
const edit = modifyFunc(reminder);
|
|
|
if (edit === null) {
|
|
|
return;
|
|
|
}
|
|
|
yield this.modifyReminderLine(reminder, edit);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
updateReminder(reminder, edit) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
yield this.modifyReminderLine(reminder, edit);
|
|
|
});
|
|
|
}
|
|
|
modifyReminderLine(reminder, edit) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
const modified = yield modifyReminder(this.doc, reminder, edit);
|
|
|
if (modified) {
|
|
|
console.info("Reminder was updated: reminder=%o", reminder);
|
|
|
}
|
|
|
else {
|
|
|
console.warn("Cannot modify reminder because it's not a reminder todo: reminder=%o", reminder);
|
|
|
}
|
|
|
return modified;
|
|
|
});
|
|
|
}
|
|
|
getContent() {
|
|
|
return this.doc.toMarkdown();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class RemindersController {
|
|
|
constructor(vault, viewProxy, reminders) {
|
|
|
this.vault = vault;
|
|
|
this.viewProxy = viewProxy;
|
|
|
this.reminders = reminders;
|
|
|
}
|
|
|
openReminder(reminder, leaf) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
console.log("Open reminder: ", reminder);
|
|
|
const file = this.vault.getAbstractFileByPath(reminder.file);
|
|
|
if (!(file instanceof obsidian.TFile)) {
|
|
|
console.error("Cannot open file because it isn't a TFile: %o", file);
|
|
|
return;
|
|
|
}
|
|
|
// Open the reminder file and select the reminder
|
|
|
yield leaf.openFile(file);
|
|
|
if (!(leaf.view instanceof obsidian.MarkdownView)) {
|
|
|
return;
|
|
|
}
|
|
|
const line = leaf.view.editor.getLine(reminder.rowNumber);
|
|
|
leaf.view.editor.setSelection({
|
|
|
line: reminder.rowNumber,
|
|
|
ch: 0,
|
|
|
}, {
|
|
|
line: reminder.rowNumber,
|
|
|
ch: line.length,
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
removeFile(path) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
console.debug("Remove file: path=%s", path);
|
|
|
const result = this.reminders.removeFile(path);
|
|
|
this.reloadUI();
|
|
|
return result;
|
|
|
});
|
|
|
}
|
|
|
reloadFile(file, reloadUI = false) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
console.debug("Reload file and collect reminders: file=%s, forceReloadUI=%s", file.path, reloadUI);
|
|
|
if (!(file instanceof obsidian.TFile)) {
|
|
|
console.debug("Cannot read file other than TFile: file=%o", file);
|
|
|
return false;
|
|
|
}
|
|
|
if (!this.isMarkdownFile(file)) {
|
|
|
console.debug("Not a markdown file: file=%o", file);
|
|
|
return false;
|
|
|
}
|
|
|
const content = new Content(file.path, yield this.vault.cachedRead(file));
|
|
|
const reminders = content.getReminders();
|
|
|
if (reminders.length > 0) {
|
|
|
if (!this.reminders.replaceFile(file.path, reminders)) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
if (!this.reminders.removeFile(file.path)) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
if (reloadUI) {
|
|
|
this.reloadUI();
|
|
|
}
|
|
|
return true;
|
|
|
});
|
|
|
}
|
|
|
convertDateTimeFormat(dateFormat, dateTimeFormat) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
let updated = 0;
|
|
|
for (const file of this.vault.getMarkdownFiles()) {
|
|
|
const content = new Content(file.path, yield this.vault.read(file));
|
|
|
let updatedInFile = 0;
|
|
|
yield content.modifyReminderLines(reminder => {
|
|
|
let converted;
|
|
|
if (reminder.time.hasTimePart) {
|
|
|
converted = reminder.time.format(dateTimeFormat);
|
|
|
}
|
|
|
else {
|
|
|
converted = reminder.time.format(dateFormat);
|
|
|
}
|
|
|
updated++;
|
|
|
updatedInFile++;
|
|
|
return {
|
|
|
rawTime: converted
|
|
|
};
|
|
|
});
|
|
|
if (updatedInFile > 0) {
|
|
|
yield this.vault.modify(file, content.getContent());
|
|
|
}
|
|
|
}
|
|
|
SETTINGS.dateFormat.rawValue.value = dateFormat;
|
|
|
SETTINGS.dateTimeFormat.rawValue.value = dateTimeFormat;
|
|
|
if (updated > 0) {
|
|
|
yield this.reloadAllFiles();
|
|
|
}
|
|
|
return updated;
|
|
|
});
|
|
|
}
|
|
|
isMarkdownFile(file) {
|
|
|
return file.extension.toLowerCase() === "md";
|
|
|
}
|
|
|
reloadAllFiles() {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
console.debug("Reload all files and collect reminders");
|
|
|
this.reminders.clear();
|
|
|
for (const file of this.vault.getMarkdownFiles()) {
|
|
|
yield this.reloadFile(file, false);
|
|
|
}
|
|
|
this.reloadUI();
|
|
|
});
|
|
|
}
|
|
|
updateReminder(reminder, checked) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
const file = this.vault.getAbstractFileByPath(reminder.file);
|
|
|
if (!(file instanceof obsidian.TFile)) {
|
|
|
console.error("file is not instance of TFile: %o", file);
|
|
|
return;
|
|
|
}
|
|
|
const content = new Content(file.path, yield this.vault.read(file));
|
|
|
yield content.updateReminder(reminder, {
|
|
|
checked,
|
|
|
time: reminder.time
|
|
|
});
|
|
|
yield this.vault.modify(file, content.getContent());
|
|
|
});
|
|
|
}
|
|
|
toggleCheck(file, lineNumber) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
if (!this.isMarkdownFile(file)) {
|
|
|
return;
|
|
|
}
|
|
|
const content = new Content(file.path, yield this.vault.read(file));
|
|
|
const reminder = content.getReminders(false).find(r => r.rowNumber === lineNumber);
|
|
|
if (reminder) {
|
|
|
yield content.updateReminder(reminder, {
|
|
|
checked: !reminder.done
|
|
|
});
|
|
|
}
|
|
|
else {
|
|
|
const todo = content.getTodos().find(t => t.lineIndex === lineNumber);
|
|
|
console.log(todo);
|
|
|
if (!todo) {
|
|
|
return;
|
|
|
}
|
|
|
todo.setChecked(!todo.isChecked());
|
|
|
}
|
|
|
yield this.vault.modify(file, content.getContent());
|
|
|
});
|
|
|
}
|
|
|
reloadUI() {
|
|
|
console.debug("Reload reminder list view");
|
|
|
if (this.viewProxy === null) {
|
|
|
console.debug("reminder list is null. Skipping UI reload.");
|
|
|
return;
|
|
|
}
|
|
|
this.viewProxy.reload(true);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class PluginDataIO {
|
|
|
constructor(plugin, reminders) {
|
|
|
this.plugin = plugin;
|
|
|
this.reminders = reminders;
|
|
|
this.restoring = true;
|
|
|
this.changed = false;
|
|
|
this.scanned = new Reference(false);
|
|
|
this.debug = new Reference(false);
|
|
|
SETTINGS.forEach(setting => {
|
|
|
setting.rawValue.onChanged(() => {
|
|
|
if (this.restoring) {
|
|
|
return;
|
|
|
}
|
|
|
if (setting.hasTag(TAG_RESCAN)) {
|
|
|
this.scanned.value = false;
|
|
|
}
|
|
|
this.changed = true;
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
load() {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
console.debug("Load reminder plugin data");
|
|
|
const data = yield this.plugin.loadData();
|
|
|
if (!data) {
|
|
|
this.scanned.value = false;
|
|
|
return;
|
|
|
}
|
|
|
this.scanned.value = data.scanned;
|
|
|
if (data.debug != null) {
|
|
|
this.debug.value = data.debug;
|
|
|
}
|
|
|
const loadedSettings = data.settings;
|
|
|
SETTINGS.forEach(setting => {
|
|
|
setting.load(loadedSettings);
|
|
|
});
|
|
|
if (data.reminders) {
|
|
|
Object.keys(data.reminders).forEach((filePath) => {
|
|
|
const remindersInFile = data.reminders[filePath];
|
|
|
if (!remindersInFile) {
|
|
|
return;
|
|
|
}
|
|
|
this.reminders.replaceFile(filePath, remindersInFile.map((d) => new Reminder$1(filePath, d.title, DateTime$2.parse(d.time), d.rowNumber, false)));
|
|
|
});
|
|
|
}
|
|
|
this.changed = false;
|
|
|
if (this.restoring) {
|
|
|
this.restoring = false;
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
save(force = false) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
if (!force && !this.changed) {
|
|
|
return;
|
|
|
}
|
|
|
console.debug("Save reminder plugin data: force=%s, changed=%s", force, this.changed);
|
|
|
const remindersData = {};
|
|
|
this.reminders.fileToReminders.forEach((r, filePath) => {
|
|
|
remindersData[filePath] = r.map((rr) => ({
|
|
|
title: rr.title,
|
|
|
time: rr.time.toString(),
|
|
|
rowNumber: rr.rowNumber,
|
|
|
}));
|
|
|
});
|
|
|
const settings = {};
|
|
|
SETTINGS.forEach(setting => {
|
|
|
setting.store(settings);
|
|
|
});
|
|
|
yield this.plugin.saveData({
|
|
|
scanned: this.scanned.value,
|
|
|
reminders: remindersData,
|
|
|
debug: this.debug.value,
|
|
|
settings
|
|
|
});
|
|
|
this.changed = false;
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Copied from: https://gist.github.com/liamcain/3f21f1ee820cb30f18050d2f3ad85f3f
|
|
|
// Call this method inside your plugin's
|
|
|
// `onload` function like so:
|
|
|
// monkeyPatchConsole(this);
|
|
|
function monkeyPatchConsole(plugin) {
|
|
|
if (!obsidian.Platform.isMobile) {
|
|
|
return;
|
|
|
}
|
|
|
const logFile = `${plugin.manifest.dir}/logs.txt`;
|
|
|
const logs = [];
|
|
|
const logMessages = (prefix) => (...messages) => {
|
|
|
logs.push(`\n[${prefix}]`);
|
|
|
for (const message of messages) {
|
|
|
logs.push(String(message));
|
|
|
}
|
|
|
plugin.app.vault.adapter.write(logFile, logs.join(" "));
|
|
|
};
|
|
|
console.debug = logMessages("debug");
|
|
|
console.error = logMessages("error");
|
|
|
console.info = logMessages("info");
|
|
|
console.log = logMessages("log");
|
|
|
console.warn = logMessages("warn");
|
|
|
}
|
|
|
|
|
|
function noop() { }
|
|
|
function run(fn) {
|
|
|
return fn();
|
|
|
}
|
|
|
function blank_object() {
|
|
|
return Object.create(null);
|
|
|
}
|
|
|
function run_all(fns) {
|
|
|
fns.forEach(run);
|
|
|
}
|
|
|
function is_function(thing) {
|
|
|
return typeof thing === 'function';
|
|
|
}
|
|
|
function safe_not_equal(a, b) {
|
|
|
return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');
|
|
|
}
|
|
|
function is_empty(obj) {
|
|
|
return Object.keys(obj).length === 0;
|
|
|
}
|
|
|
function append(target, node) {
|
|
|
target.appendChild(node);
|
|
|
}
|
|
|
function append_styles(target, style_sheet_id, styles) {
|
|
|
const append_styles_to = get_root_for_style(target);
|
|
|
if (!append_styles_to.getElementById(style_sheet_id)) {
|
|
|
const style = element('style');
|
|
|
style.id = style_sheet_id;
|
|
|
style.textContent = styles;
|
|
|
append_stylesheet(append_styles_to, style);
|
|
|
}
|
|
|
}
|
|
|
function get_root_for_style(node) {
|
|
|
if (!node)
|
|
|
return document;
|
|
|
const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;
|
|
|
if (root.host) {
|
|
|
return root;
|
|
|
}
|
|
|
return document;
|
|
|
}
|
|
|
function append_stylesheet(node, style) {
|
|
|
append(node.head || node, style);
|
|
|
}
|
|
|
function insert(target, node, anchor) {
|
|
|
target.insertBefore(node, anchor || null);
|
|
|
}
|
|
|
function detach(node) {
|
|
|
node.parentNode.removeChild(node);
|
|
|
}
|
|
|
function destroy_each(iterations, detaching) {
|
|
|
for (let i = 0; i < iterations.length; i += 1) {
|
|
|
if (iterations[i])
|
|
|
iterations[i].d(detaching);
|
|
|
}
|
|
|
}
|
|
|
function element(name) {
|
|
|
return document.createElement(name);
|
|
|
}
|
|
|
function text(data) {
|
|
|
return document.createTextNode(data);
|
|
|
}
|
|
|
function space() {
|
|
|
return text(' ');
|
|
|
}
|
|
|
function listen(node, event, handler, options) {
|
|
|
node.addEventListener(event, handler, options);
|
|
|
return () => node.removeEventListener(event, handler, options);
|
|
|
}
|
|
|
function attr(node, attribute, value) {
|
|
|
if (value == null)
|
|
|
node.removeAttribute(attribute);
|
|
|
else if (node.getAttribute(attribute) !== value)
|
|
|
node.setAttribute(attribute, value);
|
|
|
}
|
|
|
function children(element) {
|
|
|
return Array.from(element.childNodes);
|
|
|
}
|
|
|
function set_data(text, data) {
|
|
|
data = '' + data;
|
|
|
if (text.wholeText !== data)
|
|
|
text.data = data;
|
|
|
}
|
|
|
function select_option(select, value) {
|
|
|
for (let i = 0; i < select.options.length; i += 1) {
|
|
|
const option = select.options[i];
|
|
|
if (option.__value === value) {
|
|
|
option.selected = true;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
select.selectedIndex = -1; // no option should be selected
|
|
|
}
|
|
|
function select_value(select) {
|
|
|
const selected_option = select.querySelector(':checked') || select.options[0];
|
|
|
return selected_option && selected_option.__value;
|
|
|
}
|
|
|
function toggle_class(element, name, toggle) {
|
|
|
element.classList[toggle ? 'add' : 'remove'](name);
|
|
|
}
|
|
|
|
|
|
let current_component;
|
|
|
function set_current_component(component) {
|
|
|
current_component = component;
|
|
|
}
|
|
|
function get_current_component() {
|
|
|
if (!current_component)
|
|
|
throw new Error('Function called outside component initialization');
|
|
|
return current_component;
|
|
|
}
|
|
|
function onMount(fn) {
|
|
|
get_current_component().$$.on_mount.push(fn);
|
|
|
}
|
|
|
function afterUpdate(fn) {
|
|
|
get_current_component().$$.after_update.push(fn);
|
|
|
}
|
|
|
|
|
|
const dirty_components = [];
|
|
|
const binding_callbacks = [];
|
|
|
const render_callbacks = [];
|
|
|
const flush_callbacks = [];
|
|
|
const resolved_promise = Promise.resolve();
|
|
|
let update_scheduled = false;
|
|
|
function schedule_update() {
|
|
|
if (!update_scheduled) {
|
|
|
update_scheduled = true;
|
|
|
resolved_promise.then(flush);
|
|
|
}
|
|
|
}
|
|
|
function add_render_callback(fn) {
|
|
|
render_callbacks.push(fn);
|
|
|
}
|
|
|
let flushing = false;
|
|
|
const seen_callbacks = new Set();
|
|
|
function flush() {
|
|
|
if (flushing)
|
|
|
return;
|
|
|
flushing = true;
|
|
|
do {
|
|
|
// first, call beforeUpdate functions
|
|
|
// and update components
|
|
|
for (let i = 0; i < dirty_components.length; i += 1) {
|
|
|
const component = dirty_components[i];
|
|
|
set_current_component(component);
|
|
|
update(component.$$);
|
|
|
}
|
|
|
set_current_component(null);
|
|
|
dirty_components.length = 0;
|
|
|
while (binding_callbacks.length)
|
|
|
binding_callbacks.pop()();
|
|
|
// then, once components are updated, call
|
|
|
// afterUpdate functions. This may cause
|
|
|
// subsequent updates...
|
|
|
for (let i = 0; i < render_callbacks.length; i += 1) {
|
|
|
const callback = render_callbacks[i];
|
|
|
if (!seen_callbacks.has(callback)) {
|
|
|
// ...so guard against infinite loops
|
|
|
seen_callbacks.add(callback);
|
|
|
callback();
|
|
|
}
|
|
|
}
|
|
|
render_callbacks.length = 0;
|
|
|
} while (dirty_components.length);
|
|
|
while (flush_callbacks.length) {
|
|
|
flush_callbacks.pop()();
|
|
|
}
|
|
|
update_scheduled = false;
|
|
|
flushing = false;
|
|
|
seen_callbacks.clear();
|
|
|
}
|
|
|
function update($$) {
|
|
|
if ($$.fragment !== null) {
|
|
|
$$.update();
|
|
|
run_all($$.before_update);
|
|
|
const dirty = $$.dirty;
|
|
|
$$.dirty = [-1];
|
|
|
$$.fragment && $$.fragment.p($$.ctx, dirty);
|
|
|
$$.after_update.forEach(add_render_callback);
|
|
|
}
|
|
|
}
|
|
|
const outroing = new Set();
|
|
|
let outros;
|
|
|
function group_outros() {
|
|
|
outros = {
|
|
|
r: 0,
|
|
|
c: [],
|
|
|
p: outros // parent group
|
|
|
};
|
|
|
}
|
|
|
function check_outros() {
|
|
|
if (!outros.r) {
|
|
|
run_all(outros.c);
|
|
|
}
|
|
|
outros = outros.p;
|
|
|
}
|
|
|
function transition_in(block, local) {
|
|
|
if (block && block.i) {
|
|
|
outroing.delete(block);
|
|
|
block.i(local);
|
|
|
}
|
|
|
}
|
|
|
function transition_out(block, local, detach, callback) {
|
|
|
if (block && block.o) {
|
|
|
if (outroing.has(block))
|
|
|
return;
|
|
|
outroing.add(block);
|
|
|
outros.c.push(() => {
|
|
|
outroing.delete(block);
|
|
|
if (callback) {
|
|
|
if (detach)
|
|
|
block.d(1);
|
|
|
callback();
|
|
|
}
|
|
|
});
|
|
|
block.o(local);
|
|
|
}
|
|
|
}
|
|
|
function create_component(block) {
|
|
|
block && block.c();
|
|
|
}
|
|
|
function mount_component(component, target, anchor, customElement) {
|
|
|
const { fragment, on_mount, on_destroy, after_update } = component.$$;
|
|
|
fragment && fragment.m(target, anchor);
|
|
|
if (!customElement) {
|
|
|
// onMount happens before the initial afterUpdate
|
|
|
add_render_callback(() => {
|
|
|
const new_on_destroy = on_mount.map(run).filter(is_function);
|
|
|
if (on_destroy) {
|
|
|
on_destroy.push(...new_on_destroy);
|
|
|
}
|
|
|
else {
|
|
|
// Edge case - component was destroyed immediately,
|
|
|
// most likely as a result of a binding initialising
|
|
|
run_all(new_on_destroy);
|
|
|
}
|
|
|
component.$$.on_mount = [];
|
|
|
});
|
|
|
}
|
|
|
after_update.forEach(add_render_callback);
|
|
|
}
|
|
|
function destroy_component(component, detaching) {
|
|
|
const $$ = component.$$;
|
|
|
if ($$.fragment !== null) {
|
|
|
run_all($$.on_destroy);
|
|
|
$$.fragment && $$.fragment.d(detaching);
|
|
|
// TODO null out other refs, including component.$$ (but need to
|
|
|
// preserve final state?)
|
|
|
$$.on_destroy = $$.fragment = null;
|
|
|
$$.ctx = [];
|
|
|
}
|
|
|
}
|
|
|
function make_dirty(component, i) {
|
|
|
if (component.$$.dirty[0] === -1) {
|
|
|
dirty_components.push(component);
|
|
|
schedule_update();
|
|
|
component.$$.dirty.fill(0);
|
|
|
}
|
|
|
component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));
|
|
|
}
|
|
|
function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {
|
|
|
const parent_component = current_component;
|
|
|
set_current_component(component);
|
|
|
const $$ = component.$$ = {
|
|
|
fragment: null,
|
|
|
ctx: null,
|
|
|
// state
|
|
|
props,
|
|
|
update: noop,
|
|
|
not_equal,
|
|
|
bound: blank_object(),
|
|
|
// lifecycle
|
|
|
on_mount: [],
|
|
|
on_destroy: [],
|
|
|
on_disconnect: [],
|
|
|
before_update: [],
|
|
|
after_update: [],
|
|
|
context: new Map(parent_component ? parent_component.$$.context : options.context || []),
|
|
|
// everything else
|
|
|
callbacks: blank_object(),
|
|
|
dirty,
|
|
|
skip_bound: false,
|
|
|
root: options.target || parent_component.$$.root
|
|
|
};
|
|
|
append_styles && append_styles($$.root);
|
|
|
let ready = false;
|
|
|
$$.ctx = instance
|
|
|
? instance(component, options.props || {}, (i, ret, ...rest) => {
|
|
|
const value = rest.length ? rest[0] : ret;
|
|
|
if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {
|
|
|
if (!$$.skip_bound && $$.bound[i])
|
|
|
$$.bound[i](value);
|
|
|
if (ready)
|
|
|
make_dirty(component, i);
|
|
|
}
|
|
|
return ret;
|
|
|
})
|
|
|
: [];
|
|
|
$$.update();
|
|
|
ready = true;
|
|
|
run_all($$.before_update);
|
|
|
// `false` as a special case of no DOM component
|
|
|
$$.fragment = create_fragment ? create_fragment($$.ctx) : false;
|
|
|
if (options.target) {
|
|
|
if (options.hydrate) {
|
|
|
const nodes = children(options.target);
|
|
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
|
$$.fragment && $$.fragment.l(nodes);
|
|
|
nodes.forEach(detach);
|
|
|
}
|
|
|
else {
|
|
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
|
$$.fragment && $$.fragment.c();
|
|
|
}
|
|
|
if (options.intro)
|
|
|
transition_in(component.$$.fragment);
|
|
|
mount_component(component, options.target, options.anchor, options.customElement);
|
|
|
flush();
|
|
|
}
|
|
|
set_current_component(parent_component);
|
|
|
}
|
|
|
/**
|
|
|
* Base class for Svelte components. Used when dev=false.
|
|
|
*/
|
|
|
class SvelteComponent {
|
|
|
$destroy() {
|
|
|
destroy_component(this, 1);
|
|
|
this.$destroy = noop;
|
|
|
}
|
|
|
$on(type, callback) {
|
|
|
const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));
|
|
|
callbacks.push(callback);
|
|
|
return () => {
|
|
|
const index = callbacks.indexOf(callback);
|
|
|
if (index !== -1)
|
|
|
callbacks.splice(index, 1);
|
|
|
};
|
|
|
}
|
|
|
$set($$props) {
|
|
|
if (this.$$set && !is_empty($$props)) {
|
|
|
this.$$.skip_bound = true;
|
|
|
this.$$set($$props);
|
|
|
this.$$.skip_bound = false;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class Day {
|
|
|
constructor(date) {
|
|
|
this.date = date;
|
|
|
}
|
|
|
isToday(date) {
|
|
|
if (this.date === undefined) {
|
|
|
return false;
|
|
|
}
|
|
|
return this.date.date() === date.date() && this.date.month() === date.month() && this.date.year() === date.year();
|
|
|
}
|
|
|
isHoliday() {
|
|
|
return this.date.weekday() === 0 || this.date.weekday() === 6;
|
|
|
}
|
|
|
}
|
|
|
class Week {
|
|
|
constructor(weekStart) {
|
|
|
this.weekStart = weekStart;
|
|
|
this.days = [];
|
|
|
const current = weekStart.clone();
|
|
|
for (let i = 0; i < 7; i++) {
|
|
|
this.days.push(new Day(current.clone()));
|
|
|
current.add(1, "day");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
class Month {
|
|
|
constructor(monthStart) {
|
|
|
this.monthStart = monthStart;
|
|
|
this.weeks = [];
|
|
|
let current = monthStart.clone().add(-monthStart.weekday(), "day");
|
|
|
for (let i = 0; i < 6; i++) {
|
|
|
if (i > 0 && !this.isThisMonth(current)) {
|
|
|
break;
|
|
|
}
|
|
|
this.weeks.push(new Week(current.clone()));
|
|
|
current.add(1, "week");
|
|
|
}
|
|
|
}
|
|
|
isThisMonth(date) {
|
|
|
return this.monthStart.month() === date.month() && this.monthStart.year() === date.year();
|
|
|
}
|
|
|
}
|
|
|
class Calendar {
|
|
|
constructor(today, monthStart) {
|
|
|
if (today) {
|
|
|
this.today = today;
|
|
|
}
|
|
|
else {
|
|
|
this.today = moment();
|
|
|
}
|
|
|
if (monthStart) {
|
|
|
this._current = new Month(monthStart.clone().set("date", 1));
|
|
|
}
|
|
|
else {
|
|
|
this._current = new Month(this.today.clone().set("date", 1));
|
|
|
}
|
|
|
}
|
|
|
nextMonth() {
|
|
|
return new Calendar(this.today, this._current.monthStart.clone().add(1, "month"));
|
|
|
}
|
|
|
previousMonth() {
|
|
|
return new Calendar(this.today, this._current.monthStart.clone().add(-1, "month"));
|
|
|
}
|
|
|
calendarString() {
|
|
|
let str = `${this._current.monthStart.format("YYYY, MMM")}\nSun Mon Tue Wed Thu Fri Sat\n`;
|
|
|
this._current.weeks.forEach((week, weekIndex) => {
|
|
|
let line = " ";
|
|
|
week.days.forEach((slot, slotIndex) => {
|
|
|
let s;
|
|
|
if (slot.date) {
|
|
|
if (this._current.isThisMonth(slot.date)) {
|
|
|
s = slot.date.format("DD");
|
|
|
}
|
|
|
else {
|
|
|
s = " ";
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
s = " ";
|
|
|
}
|
|
|
line = line + s + " ";
|
|
|
});
|
|
|
str = str + line + "\n";
|
|
|
});
|
|
|
return str;
|
|
|
}
|
|
|
get current() {
|
|
|
return this._current;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* src/ui/components/Calendar.svelte generated by Svelte v3.42.2 */
|
|
|
|
|
|
function add_css$5(target) {
|
|
|
append_styles(target, "svelte-18sic8s", ".reminder-calendar.svelte-18sic8s.svelte-18sic8s{padding:0.5rem}.reminder-calendar.svelte-18sic8s .year-month.svelte-18sic8s{font-size:1rem;font-weight:bold;text-align:center}.reminder-calendar.svelte-18sic8s .month-nav.svelte-18sic8s{color:var(--text-muted);margin-left:1rem;margin-right:1rem;cursor:pointer}.reminder-calendar.svelte-18sic8s .month.svelte-18sic8s{color:var(--text-muted)}.reminder-calendar.svelte-18sic8s .year.svelte-18sic8s{color:var(--text-accent)}.reminder-calendar.svelte-18sic8s th.svelte-18sic8s{font-size:0.7rem;color:var(--text-muted)}.reminder-calendar.svelte-18sic8s .calendar-date.svelte-18sic8s{text-align:center;min-width:2rem;max-width:2rem}.reminder-calendar.svelte-18sic8s .calendar-date.svelte-18sic8s:hover{background-color:var(--background-secondary-alt)}.reminder-calendar.svelte-18sic8s .is-selected.svelte-18sic8s{background-color:var(--text-accent) !important;color:var(--text-normal) !important}.reminder-calendar.svelte-18sic8s .other-month.svelte-18sic8s,.reminder-calendar.svelte-18sic8s .is-past.svelte-18sic8s,.reminder-calendar.svelte-18sic8s .is-holiday.svelte-18sic8s{color:var(--text-faint)}");
|
|
|
}
|
|
|
|
|
|
function get_each_context$3(ctx, list, i) {
|
|
|
const child_ctx = ctx.slice();
|
|
|
child_ctx[8] = list[i];
|
|
|
child_ctx[10] = i;
|
|
|
return child_ctx;
|
|
|
}
|
|
|
|
|
|
function get_each_context_1(ctx, list, i) {
|
|
|
const child_ctx = ctx.slice();
|
|
|
child_ctx[11] = list[i];
|
|
|
child_ctx[10] = i;
|
|
|
return child_ctx;
|
|
|
}
|
|
|
|
|
|
// (41:20) {#each week.days as day, i}
|
|
|
function create_each_block_1(ctx) {
|
|
|
let td;
|
|
|
let t_value = /*day*/ ctx[11].date.format("D") + "";
|
|
|
let t;
|
|
|
let mounted;
|
|
|
let dispose;
|
|
|
|
|
|
function click_handler_2() {
|
|
|
return /*click_handler_2*/ ctx[7](/*day*/ ctx[11]);
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
td = element("td");
|
|
|
t = text(t_value);
|
|
|
attr(td, "class", "calendar-date svelte-18sic8s");
|
|
|
toggle_class(td, "is-selected", /*day*/ ctx[11].isToday(/*selectedDate*/ ctx[1]));
|
|
|
toggle_class(td, "other-month", !/*calendar*/ ctx[0].current.isThisMonth(/*day*/ ctx[11].date));
|
|
|
toggle_class(td, "is-holiday", /*day*/ ctx[11].isHoliday());
|
|
|
toggle_class(td, "is-past", /*day*/ ctx[11].date.isBefore(/*calendar*/ ctx[0].today));
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, td, anchor);
|
|
|
append(td, t);
|
|
|
|
|
|
if (!mounted) {
|
|
|
dispose = listen(td, "click", click_handler_2);
|
|
|
mounted = true;
|
|
|
}
|
|
|
},
|
|
|
p(new_ctx, dirty) {
|
|
|
ctx = new_ctx;
|
|
|
if (dirty & /*calendar*/ 1 && t_value !== (t_value = /*day*/ ctx[11].date.format("D") + "")) set_data(t, t_value);
|
|
|
|
|
|
if (dirty & /*calendar, selectedDate*/ 3) {
|
|
|
toggle_class(td, "is-selected", /*day*/ ctx[11].isToday(/*selectedDate*/ ctx[1]));
|
|
|
}
|
|
|
|
|
|
if (dirty & /*calendar*/ 1) {
|
|
|
toggle_class(td, "other-month", !/*calendar*/ ctx[0].current.isThisMonth(/*day*/ ctx[11].date));
|
|
|
}
|
|
|
|
|
|
if (dirty & /*calendar*/ 1) {
|
|
|
toggle_class(td, "is-holiday", /*day*/ ctx[11].isHoliday());
|
|
|
}
|
|
|
|
|
|
if (dirty & /*calendar*/ 1) {
|
|
|
toggle_class(td, "is-past", /*day*/ ctx[11].date.isBefore(/*calendar*/ ctx[0].today));
|
|
|
}
|
|
|
},
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(td);
|
|
|
mounted = false;
|
|
|
dispose();
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
// (39:12) {#each calendar.current.weeks as week, i}
|
|
|
function create_each_block$3(ctx) {
|
|
|
let tr;
|
|
|
let t;
|
|
|
let each_value_1 = /*week*/ ctx[8].days;
|
|
|
let each_blocks = [];
|
|
|
|
|
|
for (let i = 0; i < each_value_1.length; i += 1) {
|
|
|
each_blocks[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i));
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
tr = element("tr");
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].c();
|
|
|
}
|
|
|
|
|
|
t = space();
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, tr, anchor);
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].m(tr, null);
|
|
|
}
|
|
|
|
|
|
append(tr, t);
|
|
|
},
|
|
|
p(ctx, dirty) {
|
|
|
if (dirty & /*calendar, selectedDate, onClick, DateTime*/ 7) {
|
|
|
each_value_1 = /*week*/ ctx[8].days;
|
|
|
let i;
|
|
|
|
|
|
for (i = 0; i < each_value_1.length; i += 1) {
|
|
|
const child_ctx = get_each_context_1(ctx, each_value_1, i);
|
|
|
|
|
|
if (each_blocks[i]) {
|
|
|
each_blocks[i].p(child_ctx, dirty);
|
|
|
} else {
|
|
|
each_blocks[i] = create_each_block_1(child_ctx);
|
|
|
each_blocks[i].c();
|
|
|
each_blocks[i].m(tr, t);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].d(1);
|
|
|
}
|
|
|
|
|
|
each_blocks.length = each_value_1.length;
|
|
|
}
|
|
|
},
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(tr);
|
|
|
destroy_each(each_blocks, detaching);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function create_fragment$6(ctx) {
|
|
|
let div1;
|
|
|
let div0;
|
|
|
let span0;
|
|
|
let t1;
|
|
|
let span1;
|
|
|
let t2_value = /*calendar*/ ctx[0].current.monthStart.format("MMM") + "";
|
|
|
let t2;
|
|
|
let t3;
|
|
|
let span2;
|
|
|
let t4_value = /*calendar*/ ctx[0].current.monthStart.format("YYYY") + "";
|
|
|
let t4;
|
|
|
let t5;
|
|
|
let span3;
|
|
|
let t7;
|
|
|
let table;
|
|
|
let thead;
|
|
|
let t21;
|
|
|
let tbody;
|
|
|
let mounted;
|
|
|
let dispose;
|
|
|
let each_value = /*calendar*/ ctx[0].current.weeks;
|
|
|
let each_blocks = [];
|
|
|
|
|
|
for (let i = 0; i < each_value.length; i += 1) {
|
|
|
each_blocks[i] = create_each_block$3(get_each_context$3(ctx, each_value, i));
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
div1 = element("div");
|
|
|
div0 = element("div");
|
|
|
span0 = element("span");
|
|
|
span0.textContent = "<";
|
|
|
t1 = space();
|
|
|
span1 = element("span");
|
|
|
t2 = text(t2_value);
|
|
|
t3 = space();
|
|
|
span2 = element("span");
|
|
|
t4 = text(t4_value);
|
|
|
t5 = space();
|
|
|
span3 = element("span");
|
|
|
span3.textContent = ">";
|
|
|
t7 = space();
|
|
|
table = element("table");
|
|
|
thead = element("thead");
|
|
|
|
|
|
thead.innerHTML = `<tr><th class="svelte-18sic8s">SUN</th>
|
|
|
<th class="svelte-18sic8s">MON</th>
|
|
|
<th class="svelte-18sic8s">TUE</th>
|
|
|
<th class="svelte-18sic8s">WED</th>
|
|
|
<th class="svelte-18sic8s">THU</th>
|
|
|
<th class="svelte-18sic8s">FRI</th>
|
|
|
<th class="svelte-18sic8s">SAT</th></tr>`;
|
|
|
|
|
|
t21 = space();
|
|
|
tbody = element("tbody");
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].c();
|
|
|
}
|
|
|
|
|
|
attr(span0, "class", "month-nav svelte-18sic8s");
|
|
|
attr(span1, "class", "month svelte-18sic8s");
|
|
|
attr(span2, "class", "year svelte-18sic8s");
|
|
|
attr(span3, "class", "month-nav svelte-18sic8s");
|
|
|
attr(div0, "class", "year-month svelte-18sic8s");
|
|
|
attr(div1, "class", "reminder-calendar svelte-18sic8s");
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, div1, anchor);
|
|
|
append(div1, div0);
|
|
|
append(div0, span0);
|
|
|
append(div0, t1);
|
|
|
append(div0, span1);
|
|
|
append(span1, t2);
|
|
|
append(div0, t3);
|
|
|
append(div0, span2);
|
|
|
append(span2, t4);
|
|
|
append(div0, t5);
|
|
|
append(div0, span3);
|
|
|
append(div1, t7);
|
|
|
append(div1, table);
|
|
|
append(table, thead);
|
|
|
append(table, t21);
|
|
|
append(table, tbody);
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].m(tbody, null);
|
|
|
}
|
|
|
|
|
|
if (!mounted) {
|
|
|
dispose = [
|
|
|
listen(span0, "click", /*click_handler*/ ctx[5]),
|
|
|
listen(span3, "click", /*click_handler_1*/ ctx[6])
|
|
|
];
|
|
|
|
|
|
mounted = true;
|
|
|
}
|
|
|
},
|
|
|
p(ctx, [dirty]) {
|
|
|
if (dirty & /*calendar*/ 1 && t2_value !== (t2_value = /*calendar*/ ctx[0].current.monthStart.format("MMM") + "")) set_data(t2, t2_value);
|
|
|
if (dirty & /*calendar*/ 1 && t4_value !== (t4_value = /*calendar*/ ctx[0].current.monthStart.format("YYYY") + "")) set_data(t4, t4_value);
|
|
|
|
|
|
if (dirty & /*calendar, selectedDate, onClick, DateTime*/ 7) {
|
|
|
each_value = /*calendar*/ ctx[0].current.weeks;
|
|
|
let i;
|
|
|
|
|
|
for (i = 0; i < each_value.length; i += 1) {
|
|
|
const child_ctx = get_each_context$3(ctx, each_value, i);
|
|
|
|
|
|
if (each_blocks[i]) {
|
|
|
each_blocks[i].p(child_ctx, dirty);
|
|
|
} else {
|
|
|
each_blocks[i] = create_each_block$3(child_ctx);
|
|
|
each_blocks[i].c();
|
|
|
each_blocks[i].m(tbody, null);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].d(1);
|
|
|
}
|
|
|
|
|
|
each_blocks.length = each_value.length;
|
|
|
}
|
|
|
},
|
|
|
i: noop,
|
|
|
o: noop,
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(div1);
|
|
|
destroy_each(each_blocks, detaching);
|
|
|
mounted = false;
|
|
|
run_all(dispose);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function instance$6($$self, $$props, $$invalidate) {
|
|
|
let { calendar = new Calendar() } = $$props;
|
|
|
let { selectedDate = moment() } = $$props;
|
|
|
|
|
|
let { onClick = date => {
|
|
|
console.log(date);
|
|
|
} } = $$props;
|
|
|
|
|
|
function previousMonth() {
|
|
|
selectedDate.add(-1, "month");
|
|
|
$$invalidate(0, calendar = calendar.previousMonth());
|
|
|
}
|
|
|
|
|
|
function nextMonth() {
|
|
|
selectedDate.add(1, "month");
|
|
|
$$invalidate(0, calendar = calendar.nextMonth());
|
|
|
}
|
|
|
|
|
|
const click_handler = () => previousMonth();
|
|
|
const click_handler_1 = () => nextMonth();
|
|
|
const click_handler_2 = day => onClick(new DateTime$2(day.date, false));
|
|
|
|
|
|
$$self.$$set = $$props => {
|
|
|
if ('calendar' in $$props) $$invalidate(0, calendar = $$props.calendar);
|
|
|
if ('selectedDate' in $$props) $$invalidate(1, selectedDate = $$props.selectedDate);
|
|
|
if ('onClick' in $$props) $$invalidate(2, onClick = $$props.onClick);
|
|
|
};
|
|
|
|
|
|
return [
|
|
|
calendar,
|
|
|
selectedDate,
|
|
|
onClick,
|
|
|
previousMonth,
|
|
|
nextMonth,
|
|
|
click_handler,
|
|
|
click_handler_1,
|
|
|
click_handler_2
|
|
|
];
|
|
|
}
|
|
|
|
|
|
class Calendar_1 extends SvelteComponent {
|
|
|
constructor(options) {
|
|
|
super();
|
|
|
init(this, options, instance$6, create_fragment$6, safe_not_equal, { calendar: 0, selectedDate: 1, onClick: 2 }, add_css$5);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* src/ui/components/Markdown.svelte generated by Svelte v3.42.2 */
|
|
|
|
|
|
function create_fragment$5(ctx) {
|
|
|
let span1;
|
|
|
let span0;
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
span1 = element("span");
|
|
|
span0 = element("span");
|
|
|
attr(span0, "class", "reminder-markdown");
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, span1, anchor);
|
|
|
append(span1, span0);
|
|
|
/*span0_binding*/ ctx[4](span0);
|
|
|
},
|
|
|
p: noop,
|
|
|
i: noop,
|
|
|
o: noop,
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(span1);
|
|
|
/*span0_binding*/ ctx[4](null);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function instance$5($$self, $$props, $$invalidate) {
|
|
|
let { component } = $$props;
|
|
|
let { sourcePath } = $$props;
|
|
|
let { markdown } = $$props;
|
|
|
let span;
|
|
|
|
|
|
afterUpdate(() => {
|
|
|
span.empty();
|
|
|
obsidian.MarkdownRenderer.renderMarkdown(markdown, span, sourcePath, component);
|
|
|
|
|
|
span.childNodes.forEach(n => {
|
|
|
if (n instanceof HTMLElement) {
|
|
|
n.style.display = "inline";
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
|
|
|
function span0_binding($$value) {
|
|
|
binding_callbacks[$$value ? 'unshift' : 'push'](() => {
|
|
|
span = $$value;
|
|
|
$$invalidate(0, span);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
$$self.$$set = $$props => {
|
|
|
if ('component' in $$props) $$invalidate(1, component = $$props.component);
|
|
|
if ('sourcePath' in $$props) $$invalidate(2, sourcePath = $$props.sourcePath);
|
|
|
if ('markdown' in $$props) $$invalidate(3, markdown = $$props.markdown);
|
|
|
};
|
|
|
|
|
|
return [span, component, sourcePath, markdown, span0_binding];
|
|
|
}
|
|
|
|
|
|
class Markdown extends SvelteComponent {
|
|
|
constructor(options) {
|
|
|
super();
|
|
|
init(this, options, instance$5, create_fragment$5, safe_not_equal, { component: 1, sourcePath: 2, markdown: 3 });
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* src/ui/components/ReminderListByDate.svelte generated by Svelte v3.42.2 */
|
|
|
|
|
|
function add_css$4(target) {
|
|
|
append_styles(target, "svelte-gzdxib", ".reminder-group.svelte-gzdxib{margin-bottom:1rem;font-size:13px;color:var(--text-muted)}.reminder-list-item.svelte-gzdxib{list-style:none;line-height:14px;padding:3px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:break-all;width:100%}.reminder-list-item.svelte-gzdxib:hover{color:var(--text-normal);background-color:var(--background-secondary-alt)}.reminder-time.svelte-gzdxib{font-size:14px;font-family:monospace, serif}.reminder-file.svelte-gzdxib{color:var(--text-faint)}.no-reminders.svelte-gzdxib{font-style:italic}");
|
|
|
}
|
|
|
|
|
|
function get_each_context$2(ctx, list, i) {
|
|
|
const child_ctx = ctx.slice();
|
|
|
child_ctx[5] = list[i];
|
|
|
return child_ctx;
|
|
|
}
|
|
|
|
|
|
// (14:2) {:else}
|
|
|
function create_else_block(ctx) {
|
|
|
let div;
|
|
|
let current;
|
|
|
let each_value = /*reminders*/ ctx[0];
|
|
|
let each_blocks = [];
|
|
|
|
|
|
for (let i = 0; i < each_value.length; i += 1) {
|
|
|
each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i));
|
|
|
}
|
|
|
|
|
|
const out = i => transition_out(each_blocks[i], 1, 1, () => {
|
|
|
each_blocks[i] = null;
|
|
|
});
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
div = element("div");
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].c();
|
|
|
}
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, div, anchor);
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].m(div, null);
|
|
|
}
|
|
|
|
|
|
current = true;
|
|
|
},
|
|
|
p(ctx, dirty) {
|
|
|
if (dirty & /*reminders, onOpenReminder, component, timeToString*/ 15) {
|
|
|
each_value = /*reminders*/ ctx[0];
|
|
|
let i;
|
|
|
|
|
|
for (i = 0; i < each_value.length; i += 1) {
|
|
|
const child_ctx = get_each_context$2(ctx, each_value, i);
|
|
|
|
|
|
if (each_blocks[i]) {
|
|
|
each_blocks[i].p(child_ctx, dirty);
|
|
|
transition_in(each_blocks[i], 1);
|
|
|
} else {
|
|
|
each_blocks[i] = create_each_block$2(child_ctx);
|
|
|
each_blocks[i].c();
|
|
|
transition_in(each_blocks[i], 1);
|
|
|
each_blocks[i].m(div, null);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
group_outros();
|
|
|
|
|
|
for (i = each_value.length; i < each_blocks.length; i += 1) {
|
|
|
out(i);
|
|
|
}
|
|
|
|
|
|
check_outros();
|
|
|
}
|
|
|
},
|
|
|
i(local) {
|
|
|
if (current) return;
|
|
|
|
|
|
for (let i = 0; i < each_value.length; i += 1) {
|
|
|
transition_in(each_blocks[i]);
|
|
|
}
|
|
|
|
|
|
current = true;
|
|
|
},
|
|
|
o(local) {
|
|
|
each_blocks = each_blocks.filter(Boolean);
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
transition_out(each_blocks[i]);
|
|
|
}
|
|
|
|
|
|
current = false;
|
|
|
},
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(div);
|
|
|
destroy_each(each_blocks, detaching);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
// (12:2) {#if reminders.length === 0}
|
|
|
function create_if_block(ctx) {
|
|
|
let div;
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
div = element("div");
|
|
|
div.textContent = "No reminders";
|
|
|
attr(div, "class", "reminder-list-item no-reminders svelte-gzdxib");
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, div, anchor);
|
|
|
},
|
|
|
p: noop,
|
|
|
i: noop,
|
|
|
o: noop,
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(div);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
// (16:6) {#each reminders as reminder}
|
|
|
function create_each_block$2(ctx) {
|
|
|
let div;
|
|
|
let span0;
|
|
|
let t0_value = /*timeToString*/ ctx[3](/*reminder*/ ctx[5].time) + "";
|
|
|
let t0;
|
|
|
let t1;
|
|
|
let span1;
|
|
|
let markdown;
|
|
|
let t2;
|
|
|
let span2;
|
|
|
let t3;
|
|
|
let t4_value = /*reminder*/ ctx[5].getFileName() + "";
|
|
|
let t4;
|
|
|
let t5;
|
|
|
let div_aria_label_value;
|
|
|
let current;
|
|
|
let mounted;
|
|
|
let dispose;
|
|
|
|
|
|
markdown = new Markdown({
|
|
|
props: {
|
|
|
markdown: /*reminder*/ ctx[5].title,
|
|
|
sourcePath: /*reminder*/ ctx[5].file,
|
|
|
component: /*component*/ ctx[1]
|
|
|
}
|
|
|
});
|
|
|
|
|
|
function click_handler() {
|
|
|
return /*click_handler*/ ctx[4](/*reminder*/ ctx[5]);
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
div = element("div");
|
|
|
span0 = element("span");
|
|
|
t0 = text(t0_value);
|
|
|
t1 = space();
|
|
|
span1 = element("span");
|
|
|
create_component(markdown.$$.fragment);
|
|
|
t2 = space();
|
|
|
span2 = element("span");
|
|
|
t3 = text("- ");
|
|
|
t4 = text(t4_value);
|
|
|
t5 = space();
|
|
|
attr(span0, "class", "reminder-time svelte-gzdxib");
|
|
|
attr(span1, "class", "reminder-title");
|
|
|
attr(span2, "class", "reminder-file svelte-gzdxib");
|
|
|
attr(div, "class", "reminder-list-item svelte-gzdxib");
|
|
|
attr(div, "aria-label", div_aria_label_value = `[${/*reminder*/ ctx[5].time.toString()}] ${/*reminder*/ ctx[5].title} - ${/*reminder*/ ctx[5].getFileName()}`);
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, div, anchor);
|
|
|
append(div, span0);
|
|
|
append(span0, t0);
|
|
|
append(div, t1);
|
|
|
append(div, span1);
|
|
|
mount_component(markdown, span1, null);
|
|
|
append(div, t2);
|
|
|
append(div, span2);
|
|
|
append(span2, t3);
|
|
|
append(span2, t4);
|
|
|
append(div, t5);
|
|
|
current = true;
|
|
|
|
|
|
if (!mounted) {
|
|
|
dispose = listen(div, "click", click_handler);
|
|
|
mounted = true;
|
|
|
}
|
|
|
},
|
|
|
p(new_ctx, dirty) {
|
|
|
ctx = new_ctx;
|
|
|
if ((!current || dirty & /*timeToString, reminders*/ 9) && t0_value !== (t0_value = /*timeToString*/ ctx[3](/*reminder*/ ctx[5].time) + "")) set_data(t0, t0_value);
|
|
|
const markdown_changes = {};
|
|
|
if (dirty & /*reminders*/ 1) markdown_changes.markdown = /*reminder*/ ctx[5].title;
|
|
|
if (dirty & /*reminders*/ 1) markdown_changes.sourcePath = /*reminder*/ ctx[5].file;
|
|
|
if (dirty & /*component*/ 2) markdown_changes.component = /*component*/ ctx[1];
|
|
|
markdown.$set(markdown_changes);
|
|
|
if ((!current || dirty & /*reminders*/ 1) && t4_value !== (t4_value = /*reminder*/ ctx[5].getFileName() + "")) set_data(t4, t4_value);
|
|
|
|
|
|
if (!current || dirty & /*reminders*/ 1 && div_aria_label_value !== (div_aria_label_value = `[${/*reminder*/ ctx[5].time.toString()}] ${/*reminder*/ ctx[5].title} - ${/*reminder*/ ctx[5].getFileName()}`)) {
|
|
|
attr(div, "aria-label", div_aria_label_value);
|
|
|
}
|
|
|
},
|
|
|
i(local) {
|
|
|
if (current) return;
|
|
|
transition_in(markdown.$$.fragment, local);
|
|
|
current = true;
|
|
|
},
|
|
|
o(local) {
|
|
|
transition_out(markdown.$$.fragment, local);
|
|
|
current = false;
|
|
|
},
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(div);
|
|
|
destroy_component(markdown);
|
|
|
mounted = false;
|
|
|
dispose();
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function create_fragment$4(ctx) {
|
|
|
let div;
|
|
|
let current_block_type_index;
|
|
|
let if_block;
|
|
|
let current;
|
|
|
const if_block_creators = [create_if_block, create_else_block];
|
|
|
const if_blocks = [];
|
|
|
|
|
|
function select_block_type(ctx, dirty) {
|
|
|
if (/*reminders*/ ctx[0].length === 0) return 0;
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
current_block_type_index = select_block_type(ctx);
|
|
|
if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
div = element("div");
|
|
|
if_block.c();
|
|
|
attr(div, "class", "reminder-group svelte-gzdxib");
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, div, anchor);
|
|
|
if_blocks[current_block_type_index].m(div, null);
|
|
|
current = true;
|
|
|
},
|
|
|
p(ctx, [dirty]) {
|
|
|
let previous_block_index = current_block_type_index;
|
|
|
current_block_type_index = select_block_type(ctx);
|
|
|
|
|
|
if (current_block_type_index === previous_block_index) {
|
|
|
if_blocks[current_block_type_index].p(ctx, dirty);
|
|
|
} else {
|
|
|
group_outros();
|
|
|
|
|
|
transition_out(if_blocks[previous_block_index], 1, 1, () => {
|
|
|
if_blocks[previous_block_index] = null;
|
|
|
});
|
|
|
|
|
|
check_outros();
|
|
|
if_block = if_blocks[current_block_type_index];
|
|
|
|
|
|
if (!if_block) {
|
|
|
if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
|
|
|
if_block.c();
|
|
|
} else {
|
|
|
if_block.p(ctx, dirty);
|
|
|
}
|
|
|
|
|
|
transition_in(if_block, 1);
|
|
|
if_block.m(div, null);
|
|
|
}
|
|
|
},
|
|
|
i(local) {
|
|
|
if (current) return;
|
|
|
transition_in(if_block);
|
|
|
current = true;
|
|
|
},
|
|
|
o(local) {
|
|
|
transition_out(if_block);
|
|
|
current = false;
|
|
|
},
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(div);
|
|
|
if_blocks[current_block_type_index].d();
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function instance$4($$self, $$props, $$invalidate) {
|
|
|
|
|
|
|
|
|
|
|
|
let { reminders } = $$props;
|
|
|
let { component } = $$props;
|
|
|
|
|
|
let { onOpenReminder = () => {
|
|
|
|
|
|
} } = $$props;
|
|
|
|
|
|
let { timeToString = time => time.format("HH:MM") } = $$props;
|
|
|
|
|
|
const click_handler = reminder => {
|
|
|
onOpenReminder(reminder);
|
|
|
};
|
|
|
|
|
|
$$self.$$set = $$props => {
|
|
|
if ('reminders' in $$props) $$invalidate(0, reminders = $$props.reminders);
|
|
|
if ('component' in $$props) $$invalidate(1, component = $$props.component);
|
|
|
if ('onOpenReminder' in $$props) $$invalidate(2, onOpenReminder = $$props.onOpenReminder);
|
|
|
if ('timeToString' in $$props) $$invalidate(3, timeToString = $$props.timeToString);
|
|
|
};
|
|
|
|
|
|
return [reminders, component, onOpenReminder, timeToString, click_handler];
|
|
|
}
|
|
|
|
|
|
class ReminderListByDate extends SvelteComponent {
|
|
|
constructor(options) {
|
|
|
super();
|
|
|
|
|
|
init(
|
|
|
this,
|
|
|
options,
|
|
|
instance$4,
|
|
|
create_fragment$4,
|
|
|
safe_not_equal,
|
|
|
{
|
|
|
reminders: 0,
|
|
|
component: 1,
|
|
|
onOpenReminder: 2,
|
|
|
timeToString: 3
|
|
|
},
|
|
|
add_css$4
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* src/ui/components/DateTimeChooser.svelte generated by Svelte v3.42.2 */
|
|
|
|
|
|
function add_css$3(target) {
|
|
|
append_styles(target, "svelte-fjfxbq", ".dtchooser.svelte-fjfxbq{background-color:var(--background-primary-alt);z-index:2147483647}.dtchooser-divider.svelte-fjfxbq{margin:0.5rem}.reminder-list-container.svelte-fjfxbq{padding:0.5rem;max-width:16rem}");
|
|
|
}
|
|
|
|
|
|
function create_fragment$3(ctx) {
|
|
|
let div1;
|
|
|
let calendarview;
|
|
|
let t0;
|
|
|
let hr;
|
|
|
let t1;
|
|
|
let div0;
|
|
|
let reminderlistbydate;
|
|
|
let current;
|
|
|
|
|
|
calendarview = new Calendar_1({
|
|
|
props: {
|
|
|
onClick: /*onClick*/ ctx[4],
|
|
|
selectedDate: /*selectedDate*/ ctx[1],
|
|
|
calendar: /*calendar*/ ctx[0]
|
|
|
}
|
|
|
});
|
|
|
|
|
|
reminderlistbydate = new ReminderListByDate({
|
|
|
props: {
|
|
|
reminders: /*reminders*/ ctx[3].byDate(new DateTime$2(/*selectedDate*/ ctx[1], false)),
|
|
|
component: /*component*/ ctx[2]
|
|
|
}
|
|
|
});
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
div1 = element("div");
|
|
|
create_component(calendarview.$$.fragment);
|
|
|
t0 = space();
|
|
|
hr = element("hr");
|
|
|
t1 = space();
|
|
|
div0 = element("div");
|
|
|
create_component(reminderlistbydate.$$.fragment);
|
|
|
attr(hr, "class", "dtchooser-divider svelte-fjfxbq");
|
|
|
attr(div0, "class", "reminder-list-container svelte-fjfxbq");
|
|
|
attr(div1, "class", "dtchooser svelte-fjfxbq");
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, div1, anchor);
|
|
|
mount_component(calendarview, div1, null);
|
|
|
append(div1, t0);
|
|
|
append(div1, hr);
|
|
|
append(div1, t1);
|
|
|
append(div1, div0);
|
|
|
mount_component(reminderlistbydate, div0, null);
|
|
|
current = true;
|
|
|
},
|
|
|
p(ctx, [dirty]) {
|
|
|
const calendarview_changes = {};
|
|
|
if (dirty & /*onClick*/ 16) calendarview_changes.onClick = /*onClick*/ ctx[4];
|
|
|
if (dirty & /*selectedDate*/ 2) calendarview_changes.selectedDate = /*selectedDate*/ ctx[1];
|
|
|
if (dirty & /*calendar*/ 1) calendarview_changes.calendar = /*calendar*/ ctx[0];
|
|
|
calendarview.$set(calendarview_changes);
|
|
|
const reminderlistbydate_changes = {};
|
|
|
if (dirty & /*reminders, selectedDate*/ 10) reminderlistbydate_changes.reminders = /*reminders*/ ctx[3].byDate(new DateTime$2(/*selectedDate*/ ctx[1], false));
|
|
|
if (dirty & /*component*/ 4) reminderlistbydate_changes.component = /*component*/ ctx[2];
|
|
|
reminderlistbydate.$set(reminderlistbydate_changes);
|
|
|
},
|
|
|
i(local) {
|
|
|
if (current) return;
|
|
|
transition_in(calendarview.$$.fragment, local);
|
|
|
transition_in(reminderlistbydate.$$.fragment, local);
|
|
|
current = true;
|
|
|
},
|
|
|
o(local) {
|
|
|
transition_out(calendarview.$$.fragment, local);
|
|
|
transition_out(reminderlistbydate.$$.fragment, local);
|
|
|
current = false;
|
|
|
},
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(div1);
|
|
|
destroy_component(calendarview);
|
|
|
destroy_component(reminderlistbydate);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function instance$3($$self, $$props, $$invalidate) {
|
|
|
|
|
|
|
|
|
let { calendar = new Calendar() } = $$props;
|
|
|
let { component } = $$props;
|
|
|
let { selectedDate = moment() } = $$props;
|
|
|
let { reminders } = $$props;
|
|
|
|
|
|
function selectDate(date) {
|
|
|
// clone() for re-render forcibly
|
|
|
$$invalidate(1, selectedDate = date.clone());
|
|
|
|
|
|
$$invalidate(0, calendar = new Calendar(moment(), date));
|
|
|
}
|
|
|
|
|
|
function moveUp() {
|
|
|
selectDate(selectedDate.add(-7, "day"));
|
|
|
}
|
|
|
|
|
|
function moveDown() {
|
|
|
selectDate(selectedDate.add(7, "day"));
|
|
|
}
|
|
|
|
|
|
function moveLeft() {
|
|
|
selectDate(selectedDate.add(-1, "day"));
|
|
|
}
|
|
|
|
|
|
function moveRight() {
|
|
|
selectDate(selectedDate.add(1, "day"));
|
|
|
}
|
|
|
|
|
|
function selection() {
|
|
|
return new DateTime$2(selectedDate, false);
|
|
|
}
|
|
|
|
|
|
let { onClick } = $$props;
|
|
|
|
|
|
$$self.$$set = $$props => {
|
|
|
if ('calendar' in $$props) $$invalidate(0, calendar = $$props.calendar);
|
|
|
if ('component' in $$props) $$invalidate(2, component = $$props.component);
|
|
|
if ('selectedDate' in $$props) $$invalidate(1, selectedDate = $$props.selectedDate);
|
|
|
if ('reminders' in $$props) $$invalidate(3, reminders = $$props.reminders);
|
|
|
if ('onClick' in $$props) $$invalidate(4, onClick = $$props.onClick);
|
|
|
};
|
|
|
|
|
|
return [
|
|
|
calendar,
|
|
|
selectedDate,
|
|
|
component,
|
|
|
reminders,
|
|
|
onClick,
|
|
|
moveUp,
|
|
|
moveDown,
|
|
|
moveLeft,
|
|
|
moveRight,
|
|
|
selection
|
|
|
];
|
|
|
}
|
|
|
|
|
|
class DateTimeChooser extends SvelteComponent {
|
|
|
constructor(options) {
|
|
|
super();
|
|
|
|
|
|
init(
|
|
|
this,
|
|
|
options,
|
|
|
instance$3,
|
|
|
create_fragment$3,
|
|
|
safe_not_equal,
|
|
|
{
|
|
|
calendar: 0,
|
|
|
component: 2,
|
|
|
selectedDate: 1,
|
|
|
reminders: 3,
|
|
|
moveUp: 5,
|
|
|
moveDown: 6,
|
|
|
moveLeft: 7,
|
|
|
moveRight: 8,
|
|
|
selection: 9,
|
|
|
onClick: 4
|
|
|
},
|
|
|
add_css$3
|
|
|
);
|
|
|
}
|
|
|
|
|
|
get moveUp() {
|
|
|
return this.$$.ctx[5];
|
|
|
}
|
|
|
|
|
|
get moveDown() {
|
|
|
return this.$$.ctx[6];
|
|
|
}
|
|
|
|
|
|
get moveLeft() {
|
|
|
return this.$$.ctx[7];
|
|
|
}
|
|
|
|
|
|
get moveRight() {
|
|
|
return this.$$.ctx[8];
|
|
|
}
|
|
|
|
|
|
get selection() {
|
|
|
return this.$$.ctx[9];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class DateTimeChooserModal extends obsidian.Modal {
|
|
|
constructor(app, reminders, onSelect, onCancel) {
|
|
|
super(app);
|
|
|
this.reminders = reminders;
|
|
|
this.onSelect = onSelect;
|
|
|
this.onCancel = onCancel;
|
|
|
this.handlers = [];
|
|
|
}
|
|
|
onOpen() {
|
|
|
let targetElement;
|
|
|
if (obsidian.Platform.isDesktop) {
|
|
|
this.modalEl.style.minWidth = "0px";
|
|
|
this.modalEl.style.minHeight = "0px";
|
|
|
targetElement = this.contentEl;
|
|
|
}
|
|
|
else {
|
|
|
targetElement = this.containerEl;
|
|
|
}
|
|
|
const chooser = new DateTimeChooser({
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
target: targetElement,
|
|
|
props: {
|
|
|
onClick: (time) => {
|
|
|
this.select(time);
|
|
|
},
|
|
|
reminders: this.reminders,
|
|
|
undefined
|
|
|
},
|
|
|
});
|
|
|
this.registerKeymap(["Ctrl"], "P", () => chooser["moveUp"]());
|
|
|
this.registerKeymap([], "ArrowUp", () => chooser["moveUp"]());
|
|
|
this.registerKeymap(["Ctrl"], "N", () => chooser["moveDown"]());
|
|
|
this.registerKeymap([], "ArrowDown", () => chooser["moveDown"]());
|
|
|
this.registerKeymap(["Ctrl"], "B", () => chooser["moveLeft"]());
|
|
|
this.registerKeymap([], "ArrowLeft", () => chooser["moveLeft"]());
|
|
|
this.registerKeymap(["Ctrl"], "F", () => chooser["moveRight"]());
|
|
|
this.registerKeymap([], "ArrowRight", () => chooser["moveRight"]());
|
|
|
this.registerKeymap([], "Enter", () => this.select(chooser["selection"]()));
|
|
|
this.registerKeymap([], "Escape", () => this.close());
|
|
|
}
|
|
|
registerKeymap(modifier, key, action) {
|
|
|
this.handlers.push(this.scope.register(modifier, key, () => {
|
|
|
action();
|
|
|
return false;
|
|
|
}));
|
|
|
}
|
|
|
select(time) {
|
|
|
this.selected = time;
|
|
|
this.close();
|
|
|
}
|
|
|
onClose() {
|
|
|
this.handlers.forEach(handler => this.scope.unregister(handler));
|
|
|
if (this.selected != null) {
|
|
|
this.onSelect(this.selected);
|
|
|
}
|
|
|
else {
|
|
|
this.onCancel();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
function showDateTimeChooserModal(app, reminders) {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
const modal = new DateTimeChooserModal(app, reminders, resolve, reject);
|
|
|
modal.open();
|
|
|
});
|
|
|
}
|
|
|
|
|
|
class DateTimeChooserView {
|
|
|
constructor(editor, reminders) {
|
|
|
this.editor = editor;
|
|
|
this.keyMaps = {
|
|
|
'Ctrl-P': () => this.dateTimeChooser["moveUp"](),
|
|
|
'Ctrl-N': () => this.dateTimeChooser["moveDown"](),
|
|
|
'Ctrl-B': () => this.dateTimeChooser["moveLeft"](),
|
|
|
'Ctrl-F': () => this.dateTimeChooser["moveRight"](),
|
|
|
'Enter': () => this.select(),
|
|
|
Up: () => this.dateTimeChooser["moveUp"](),
|
|
|
Down: () => this.dateTimeChooser["moveDown"](),
|
|
|
Right: () => this.dateTimeChooser["moveRight"](),
|
|
|
Left: () => this.dateTimeChooser["moveLeft"](),
|
|
|
Esc: () => this.cancel(),
|
|
|
};
|
|
|
this.view = document.createElement("div");
|
|
|
this.view.addClass("date-time-chooser-popup");
|
|
|
this.view.style.position = "fixed";
|
|
|
this.dateTimeChooser = new DateTimeChooser({
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
target: this.view,
|
|
|
props: {
|
|
|
onClick: (time) => {
|
|
|
this.setResult(time);
|
|
|
this.hide();
|
|
|
},
|
|
|
reminders,
|
|
|
undefined
|
|
|
},
|
|
|
});
|
|
|
}
|
|
|
show() {
|
|
|
this.setResult(null);
|
|
|
this.hide();
|
|
|
this.dateTimeChooser.$set({
|
|
|
selectedDate: moment(),
|
|
|
calendar: new Calendar()
|
|
|
});
|
|
|
const cursor = this.editor.getCursor();
|
|
|
const coords = this.editor.charCoords(cursor);
|
|
|
const parent = document.body;
|
|
|
const parentRect = parent.getBoundingClientRect();
|
|
|
this.view.style.top = `${coords.top - parentRect.top + this.editor.defaultTextHeight()}px`;
|
|
|
this.view.style.left = `${coords.left - parentRect.left}px`;
|
|
|
parent.appendChild(this.view);
|
|
|
this.editor.addKeyMap(this.keyMaps);
|
|
|
return new Promise((resolve, reject) => {
|
|
|
this.resultResolve = resolve;
|
|
|
this.resultReject = reject;
|
|
|
});
|
|
|
}
|
|
|
select() {
|
|
|
this.setResult(this.dateTimeChooser["selection"]());
|
|
|
this.hide();
|
|
|
}
|
|
|
cancel() {
|
|
|
this.setResult(null);
|
|
|
this.hide();
|
|
|
}
|
|
|
setResult(result) {
|
|
|
if (this.resultReject == null || this.resultResolve == null) {
|
|
|
return;
|
|
|
}
|
|
|
if (result === null) {
|
|
|
this.resultReject();
|
|
|
}
|
|
|
else {
|
|
|
this.resultResolve(result);
|
|
|
}
|
|
|
this.resultReject = undefined;
|
|
|
this.resultResolve = undefined;
|
|
|
}
|
|
|
hide() {
|
|
|
if (this.view.parentNode) {
|
|
|
this.editor.removeKeyMap(this.keyMaps);
|
|
|
this.view.parentNode.removeChild(this.view);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class AutoComplete {
|
|
|
constructor(trigger) {
|
|
|
this.trigger = trigger;
|
|
|
}
|
|
|
;
|
|
|
isTrigger(cmEditor, changeObj) {
|
|
|
const trigger = this.trigger.value;
|
|
|
if (trigger.length === 0) {
|
|
|
return false;
|
|
|
}
|
|
|
if (changeObj.text.contains(trigger.charAt(trigger.length - 1))) {
|
|
|
const line = cmEditor.getLine(changeObj.from.line).substring(0, changeObj.to.ch) + changeObj.text;
|
|
|
if (!line.match(/^\s*\- \[.\]\s.*/)) {
|
|
|
// is not a TODO line
|
|
|
return false;
|
|
|
}
|
|
|
if (line.endsWith(trigger)) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
show(app, editor, reminders) {
|
|
|
let result;
|
|
|
if (obsidian.Platform.isDesktopApp) {
|
|
|
try {
|
|
|
const cm = editor.cm;
|
|
|
if (cm == null) {
|
|
|
console.error("Cannot get codemirror editor.");
|
|
|
return;
|
|
|
}
|
|
|
const v = new DateTimeChooserView(cm, reminders);
|
|
|
result = v.show();
|
|
|
}
|
|
|
catch (e) {
|
|
|
// Temporary workaround for Live preview mode
|
|
|
result = showDateTimeChooserModal(app, reminders);
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
result = showDateTimeChooserModal(app, reminders);
|
|
|
}
|
|
|
result
|
|
|
.then(value => {
|
|
|
this.insert(editor, value, true);
|
|
|
})
|
|
|
.catch(() => { });
|
|
|
}
|
|
|
insert(editor, value, triggerFromCommand = false) {
|
|
|
const pos = editor.getCursor();
|
|
|
let line = editor.getLine(pos.line);
|
|
|
const endPos = {
|
|
|
line: pos.line,
|
|
|
ch: line.length
|
|
|
};
|
|
|
// remove trigger string
|
|
|
if (!triggerFromCommand) {
|
|
|
line = line.substring(0, pos.ch - this.trigger.value.length);
|
|
|
}
|
|
|
// append reminder to the line
|
|
|
const format = SETTINGS.primaryFormat.value.format;
|
|
|
try {
|
|
|
const appended = format.appendReminder(line, value);
|
|
|
if (appended == null) {
|
|
|
console.error("Cannot append reminder time to the line: line=%s, date=%s", line, value);
|
|
|
return;
|
|
|
}
|
|
|
editor.replaceRange(appended, { line: pos.line, ch: 0 }, endPos);
|
|
|
}
|
|
|
catch (ex) {
|
|
|
console.error(ex);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class DateTimeFormatModal extends obsidian.FuzzySuggestModal {
|
|
|
constructor(app, suggestions, onChooseSuggestionFunc) {
|
|
|
super(app);
|
|
|
this.suggestions = suggestions;
|
|
|
this.onChooseSuggestionFunc = onChooseSuggestionFunc;
|
|
|
}
|
|
|
getItems() {
|
|
|
return this.suggestions;
|
|
|
}
|
|
|
getItemText(item) {
|
|
|
return item;
|
|
|
}
|
|
|
onChooseItem(item, evt) {
|
|
|
this.onChooseSuggestionFunc(item);
|
|
|
}
|
|
|
}
|
|
|
function openDateTimeFormatChooser(app, onSelectFormat) {
|
|
|
new DateTimeFormatModal(app, ["YYYY-MM-DD", "YYYY/MM/DD", "DD-MM-YYYY", "DD/MM/YYYY"], (dateFormat) => {
|
|
|
new DateTimeFormatModal(app, ["YYYY-MM-DD HH:mm", "YYYY/MM/DD HH:mm", "DD-MM-YYYY HH:mm", "DD/MM/YYYY HH:mm", "YYYY-MM-DDTHH:mm:ss:SSS"], (dateTimeFormat) => {
|
|
|
onSelectFormat(dateFormat, dateTimeFormat);
|
|
|
}).open();
|
|
|
}).open();
|
|
|
}
|
|
|
|
|
|
function buildCodeMirrorPlugin(app, reminders) {
|
|
|
return view.ViewPlugin.fromClass(class {
|
|
|
update(update) {
|
|
|
if (!update.docChanged) {
|
|
|
return;
|
|
|
}
|
|
|
update.changes.iterChanges((_fromA, _toA, _fromB, toB, inserted) => {
|
|
|
const doc = update.state.doc;
|
|
|
const text = doc.sliceString(toB - 2, toB);
|
|
|
if (inserted.length === 0) {
|
|
|
return;
|
|
|
}
|
|
|
const trigger = SETTINGS.autoCompleteTrigger.value;
|
|
|
if (trigger === text) {
|
|
|
showDateTimeChooserModal(app, reminders).then(value => {
|
|
|
const format = SETTINGS.primaryFormat.value.format;
|
|
|
try {
|
|
|
const line = doc.lineAt(toB);
|
|
|
const triggerStart = line.text.lastIndexOf(trigger);
|
|
|
const triggerExcludedLine = line.text.substring(0, triggerStart);
|
|
|
const appended = format.appendReminder(triggerExcludedLine, value);
|
|
|
if (appended == null) {
|
|
|
console.error("Cannot append reminder time to the line: line=%s, date=%s", line.text, value);
|
|
|
return;
|
|
|
}
|
|
|
const updateTextTransaction = update.view.state.update({
|
|
|
changes: { from: line.from, to: line.to, insert: appended },
|
|
|
// Move the cursor to the last of date string to make it easy to input time part.
|
|
|
selection: state.EditorSelection.cursor(line.from + appended.length - 1),
|
|
|
});
|
|
|
update.view.update([updateTextTransaction]);
|
|
|
}
|
|
|
catch (ex) {
|
|
|
console.error(ex);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/* src/ui/components/Icon.svelte generated by Svelte v3.42.2 */
|
|
|
|
|
|
function add_css$2(target) {
|
|
|
append_styles(target, "svelte-1gcidq0", ".icon.svelte-1gcidq0{vertical-align:middle}");
|
|
|
}
|
|
|
|
|
|
function create_fragment$2(ctx) {
|
|
|
let span_1;
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
span_1 = element("span");
|
|
|
attr(span_1, "class", "icon svelte-1gcidq0");
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, span_1, anchor);
|
|
|
/*span_1_binding*/ ctx[3](span_1);
|
|
|
},
|
|
|
p: noop,
|
|
|
i: noop,
|
|
|
o: noop,
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(span_1);
|
|
|
/*span_1_binding*/ ctx[3](null);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function instance$2($$self, $$props, $$invalidate) {
|
|
|
let { icon = "" } = $$props;
|
|
|
let { size = 16 } = $$props;
|
|
|
let span;
|
|
|
|
|
|
onMount(() => {
|
|
|
obsidian.setIcon(span, icon, size);
|
|
|
});
|
|
|
|
|
|
function span_1_binding($$value) {
|
|
|
binding_callbacks[$$value ? 'unshift' : 'push'](() => {
|
|
|
span = $$value;
|
|
|
$$invalidate(0, span);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
$$self.$$set = $$props => {
|
|
|
if ('icon' in $$props) $$invalidate(1, icon = $$props.icon);
|
|
|
if ('size' in $$props) $$invalidate(2, size = $$props.size);
|
|
|
};
|
|
|
|
|
|
return [span, icon, size, span_1_binding];
|
|
|
}
|
|
|
|
|
|
class Icon extends SvelteComponent {
|
|
|
constructor(options) {
|
|
|
super();
|
|
|
init(this, options, instance$2, create_fragment$2, safe_not_equal, { icon: 1, size: 2 }, add_css$2);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* src/ui/components/Reminder.svelte generated by Svelte v3.42.2 */
|
|
|
|
|
|
function add_css$1(target) {
|
|
|
append_styles(target, "svelte-1most86", "main.svelte-1most86{padding:1em;margin:0 auto}.reminder-actions.svelte-1most86{margin-top:1rem}.reminder-file.svelte-1most86{color:var(--text-muted);cursor:pointer}.reminder-file.svelte-1most86:hover{color:var(--text-normal);text-decoration:underline}.later-select.svelte-1most86{font-size:14px}");
|
|
|
}
|
|
|
|
|
|
function get_each_context$1(ctx, list, i) {
|
|
|
const child_ctx = ctx.slice();
|
|
|
child_ctx[10] = list[i];
|
|
|
child_ctx[12] = i;
|
|
|
return child_ctx;
|
|
|
}
|
|
|
|
|
|
// (51:6) {#each laters as later, i}
|
|
|
function create_each_block$1(ctx) {
|
|
|
let option;
|
|
|
let t_value = /*later*/ ctx[10].label + "";
|
|
|
let t;
|
|
|
let option_value_value;
|
|
|
let option_selected_value;
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
option = element("option");
|
|
|
t = text(t_value);
|
|
|
option.__value = option_value_value = /*i*/ ctx[12];
|
|
|
option.value = option.__value;
|
|
|
option.selected = option_selected_value = /*selectedIndex*/ ctx[6] === /*i*/ ctx[12];
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, option, anchor);
|
|
|
append(option, t);
|
|
|
},
|
|
|
p(ctx, dirty) {
|
|
|
if (dirty & /*laters*/ 32 && t_value !== (t_value = /*later*/ ctx[10].label + "")) set_data(t, t_value);
|
|
|
|
|
|
if (dirty & /*selectedIndex*/ 64 && option_selected_value !== (option_selected_value = /*selectedIndex*/ ctx[6] === /*i*/ ctx[12])) {
|
|
|
option.selected = option_selected_value;
|
|
|
}
|
|
|
},
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(option);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function create_fragment$1(ctx) {
|
|
|
let main;
|
|
|
let h1;
|
|
|
let markdown;
|
|
|
let t0;
|
|
|
let span;
|
|
|
let icon0;
|
|
|
let t1;
|
|
|
let t2_value = /*reminder*/ ctx[0].file + "";
|
|
|
let t2;
|
|
|
let t3;
|
|
|
let div;
|
|
|
let button0;
|
|
|
let icon1;
|
|
|
let t4;
|
|
|
let t5;
|
|
|
let button1;
|
|
|
let icon2;
|
|
|
let t6;
|
|
|
let t7;
|
|
|
let select;
|
|
|
let option;
|
|
|
let current;
|
|
|
let mounted;
|
|
|
let dispose;
|
|
|
|
|
|
markdown = new Markdown({
|
|
|
props: {
|
|
|
markdown: /*reminder*/ ctx[0].title,
|
|
|
sourcePath: /*reminder*/ ctx[0].file,
|
|
|
component: /*component*/ ctx[1]
|
|
|
}
|
|
|
});
|
|
|
|
|
|
icon0 = new Icon({ props: { icon: "link" } });
|
|
|
icon1 = new Icon({ props: { icon: "check-small" } });
|
|
|
icon2 = new Icon({ props: { icon: "minus-with-circle" } });
|
|
|
let each_value = /*laters*/ ctx[5];
|
|
|
let each_blocks = [];
|
|
|
|
|
|
for (let i = 0; i < each_value.length; i += 1) {
|
|
|
each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i));
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
main = element("main");
|
|
|
h1 = element("h1");
|
|
|
create_component(markdown.$$.fragment);
|
|
|
t0 = space();
|
|
|
span = element("span");
|
|
|
create_component(icon0.$$.fragment);
|
|
|
t1 = space();
|
|
|
t2 = text(t2_value);
|
|
|
t3 = space();
|
|
|
div = element("div");
|
|
|
button0 = element("button");
|
|
|
create_component(icon1.$$.fragment);
|
|
|
t4 = text(" Mark as Done");
|
|
|
t5 = space();
|
|
|
button1 = element("button");
|
|
|
create_component(icon2.$$.fragment);
|
|
|
t6 = text(" Mute");
|
|
|
t7 = space();
|
|
|
select = element("select");
|
|
|
option = element("option");
|
|
|
option.textContent = "Remind Me Later";
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].c();
|
|
|
}
|
|
|
|
|
|
attr(span, "class", "reminder-file svelte-1most86");
|
|
|
attr(button0, "class", "mod-cta");
|
|
|
option.selected = true;
|
|
|
option.disabled = true;
|
|
|
option.hidden = true;
|
|
|
option.__value = "Remind Me Later";
|
|
|
option.value = option.__value;
|
|
|
attr(select, "class", "dropdown later-select svelte-1most86");
|
|
|
if (/*selectedIndex*/ ctx[6] === void 0) add_render_callback(() => /*select_change_handler*/ ctx[9].call(select));
|
|
|
attr(div, "class", "reminder-actions svelte-1most86");
|
|
|
attr(main, "class", "svelte-1most86");
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, main, anchor);
|
|
|
append(main, h1);
|
|
|
mount_component(markdown, h1, null);
|
|
|
append(main, t0);
|
|
|
append(main, span);
|
|
|
mount_component(icon0, span, null);
|
|
|
append(span, t1);
|
|
|
append(span, t2);
|
|
|
append(main, t3);
|
|
|
append(main, div);
|
|
|
append(div, button0);
|
|
|
mount_component(icon1, button0, null);
|
|
|
append(button0, t4);
|
|
|
append(div, t5);
|
|
|
append(div, button1);
|
|
|
mount_component(icon2, button1, null);
|
|
|
append(button1, t6);
|
|
|
append(div, t7);
|
|
|
append(div, select);
|
|
|
append(select, option);
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].m(select, null);
|
|
|
}
|
|
|
|
|
|
select_option(select, /*selectedIndex*/ ctx[6]);
|
|
|
current = true;
|
|
|
|
|
|
if (!mounted) {
|
|
|
dispose = [
|
|
|
listen(span, "click", function () {
|
|
|
if (is_function(/*onOpenFile*/ ctx[3])) /*onOpenFile*/ ctx[3].apply(this, arguments);
|
|
|
}),
|
|
|
listen(button0, "click", function () {
|
|
|
if (is_function(/*onDone*/ ctx[2])) /*onDone*/ ctx[2].apply(this, arguments);
|
|
|
}),
|
|
|
listen(button1, "click", function () {
|
|
|
if (is_function(/*onMute*/ ctx[4])) /*onMute*/ ctx[4].apply(this, arguments);
|
|
|
}),
|
|
|
listen(select, "change", /*select_change_handler*/ ctx[9]),
|
|
|
listen(select, "change", /*remindMeLater*/ ctx[7])
|
|
|
];
|
|
|
|
|
|
mounted = true;
|
|
|
}
|
|
|
},
|
|
|
p(new_ctx, [dirty]) {
|
|
|
ctx = new_ctx;
|
|
|
const markdown_changes = {};
|
|
|
if (dirty & /*reminder*/ 1) markdown_changes.markdown = /*reminder*/ ctx[0].title;
|
|
|
if (dirty & /*reminder*/ 1) markdown_changes.sourcePath = /*reminder*/ ctx[0].file;
|
|
|
if (dirty & /*component*/ 2) markdown_changes.component = /*component*/ ctx[1];
|
|
|
markdown.$set(markdown_changes);
|
|
|
if ((!current || dirty & /*reminder*/ 1) && t2_value !== (t2_value = /*reminder*/ ctx[0].file + "")) set_data(t2, t2_value);
|
|
|
|
|
|
if (dirty & /*selectedIndex, laters*/ 96) {
|
|
|
each_value = /*laters*/ ctx[5];
|
|
|
let i;
|
|
|
|
|
|
for (i = 0; i < each_value.length; i += 1) {
|
|
|
const child_ctx = get_each_context$1(ctx, each_value, i);
|
|
|
|
|
|
if (each_blocks[i]) {
|
|
|
each_blocks[i].p(child_ctx, dirty);
|
|
|
} else {
|
|
|
each_blocks[i] = create_each_block$1(child_ctx);
|
|
|
each_blocks[i].c();
|
|
|
each_blocks[i].m(select, null);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].d(1);
|
|
|
}
|
|
|
|
|
|
each_blocks.length = each_value.length;
|
|
|
}
|
|
|
|
|
|
if (dirty & /*selectedIndex*/ 64) {
|
|
|
select_option(select, /*selectedIndex*/ ctx[6]);
|
|
|
}
|
|
|
},
|
|
|
i(local) {
|
|
|
if (current) return;
|
|
|
transition_in(markdown.$$.fragment, local);
|
|
|
transition_in(icon0.$$.fragment, local);
|
|
|
transition_in(icon1.$$.fragment, local);
|
|
|
transition_in(icon2.$$.fragment, local);
|
|
|
current = true;
|
|
|
},
|
|
|
o(local) {
|
|
|
transition_out(markdown.$$.fragment, local);
|
|
|
transition_out(icon0.$$.fragment, local);
|
|
|
transition_out(icon1.$$.fragment, local);
|
|
|
transition_out(icon2.$$.fragment, local);
|
|
|
current = false;
|
|
|
},
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(main);
|
|
|
destroy_component(markdown);
|
|
|
destroy_component(icon0);
|
|
|
destroy_component(icon1);
|
|
|
destroy_component(icon2);
|
|
|
destroy_each(each_blocks, detaching);
|
|
|
mounted = false;
|
|
|
run_all(dispose);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function instance$1($$self, $$props, $$invalidate) {
|
|
|
|
|
|
|
|
|
|
|
|
let { reminder } = $$props;
|
|
|
let { component } = $$props;
|
|
|
let { onRemindMeLater } = $$props;
|
|
|
let { onDone } = $$props;
|
|
|
let { onOpenFile } = $$props;
|
|
|
let { onMute } = $$props;
|
|
|
|
|
|
// Do not set initial value so that svelte can render the placeholder `Remind Me Later`.
|
|
|
let selectedIndex;
|
|
|
|
|
|
let { laters = [] } = $$props;
|
|
|
|
|
|
function remindMeLater() {
|
|
|
const selected = laters[selectedIndex];
|
|
|
|
|
|
if (selected == null) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
onRemindMeLater(selected.later());
|
|
|
}
|
|
|
|
|
|
function select_change_handler() {
|
|
|
selectedIndex = select_value(this);
|
|
|
$$invalidate(6, selectedIndex);
|
|
|
}
|
|
|
|
|
|
$$self.$$set = $$props => {
|
|
|
if ('reminder' in $$props) $$invalidate(0, reminder = $$props.reminder);
|
|
|
if ('component' in $$props) $$invalidate(1, component = $$props.component);
|
|
|
if ('onRemindMeLater' in $$props) $$invalidate(8, onRemindMeLater = $$props.onRemindMeLater);
|
|
|
if ('onDone' in $$props) $$invalidate(2, onDone = $$props.onDone);
|
|
|
if ('onOpenFile' in $$props) $$invalidate(3, onOpenFile = $$props.onOpenFile);
|
|
|
if ('onMute' in $$props) $$invalidate(4, onMute = $$props.onMute);
|
|
|
if ('laters' in $$props) $$invalidate(5, laters = $$props.laters);
|
|
|
};
|
|
|
|
|
|
return [
|
|
|
reminder,
|
|
|
component,
|
|
|
onDone,
|
|
|
onOpenFile,
|
|
|
onMute,
|
|
|
laters,
|
|
|
selectedIndex,
|
|
|
remindMeLater,
|
|
|
onRemindMeLater,
|
|
|
select_change_handler
|
|
|
];
|
|
|
}
|
|
|
|
|
|
class Reminder extends SvelteComponent {
|
|
|
constructor(options) {
|
|
|
super();
|
|
|
|
|
|
init(
|
|
|
this,
|
|
|
options,
|
|
|
instance$1,
|
|
|
create_fragment$1,
|
|
|
safe_not_equal,
|
|
|
{
|
|
|
reminder: 0,
|
|
|
component: 1,
|
|
|
onRemindMeLater: 8,
|
|
|
onDone: 2,
|
|
|
onOpenFile: 3,
|
|
|
onMute: 4,
|
|
|
laters: 5
|
|
|
},
|
|
|
add_css$1
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const electron$1 = require("electron");
|
|
|
class ReminderModal {
|
|
|
constructor(app, useSystemNotification, laters) {
|
|
|
this.app = app;
|
|
|
this.useSystemNotification = useSystemNotification;
|
|
|
this.laters = laters;
|
|
|
}
|
|
|
show(reminder, onRemindMeLater, onDone, onMute, onOpenFile) {
|
|
|
if (!this.isSystemNotification()) {
|
|
|
this.showBuiltinReminder(reminder, onRemindMeLater, onDone, onMute, onOpenFile);
|
|
|
}
|
|
|
else {
|
|
|
// Show system notification
|
|
|
const Notification = electron$1.remote.Notification;
|
|
|
const n = new Notification({
|
|
|
title: "Obsidian Reminder",
|
|
|
body: reminder.title,
|
|
|
});
|
|
|
n.on("click", () => {
|
|
|
n.close();
|
|
|
this.showBuiltinReminder(reminder, onRemindMeLater, onDone, onMute, onOpenFile);
|
|
|
});
|
|
|
n.on("close", () => {
|
|
|
onMute();
|
|
|
});
|
|
|
// Only for macOS
|
|
|
{
|
|
|
const laters = SETTINGS.laters.value;
|
|
|
n.on("action", (_, index) => {
|
|
|
if (index === 0) {
|
|
|
onDone();
|
|
|
return;
|
|
|
}
|
|
|
const later = laters[index - 1];
|
|
|
onRemindMeLater(later.later());
|
|
|
});
|
|
|
const actions = [{ type: "button", text: "Mark as Done" }];
|
|
|
laters.forEach(later => {
|
|
|
actions.push({ type: "button", text: later.label });
|
|
|
});
|
|
|
n.actions = actions;
|
|
|
}
|
|
|
n.show();
|
|
|
}
|
|
|
}
|
|
|
showBuiltinReminder(reminder, onRemindMeLater, onDone, onCancel, onOpenFile) {
|
|
|
new NotificationModal(this.app, this.laters.value, reminder, onRemindMeLater, onDone, onCancel, onOpenFile).open();
|
|
|
}
|
|
|
isSystemNotification() {
|
|
|
if (this.isMobile()) {
|
|
|
return false;
|
|
|
}
|
|
|
return this.useSystemNotification.value;
|
|
|
}
|
|
|
isMobile() {
|
|
|
return electron$1 === undefined;
|
|
|
}
|
|
|
}
|
|
|
class NotificationModal extends obsidian.Modal {
|
|
|
constructor(app, laters, reminder, onRemindMeLater, onDone, onCancel, onOpenFile) {
|
|
|
super(app);
|
|
|
this.laters = laters;
|
|
|
this.reminder = reminder;
|
|
|
this.onRemindMeLater = onRemindMeLater;
|
|
|
this.onDone = onDone;
|
|
|
this.onCancel = onCancel;
|
|
|
this.onOpenFile = onOpenFile;
|
|
|
this.canceled = true;
|
|
|
}
|
|
|
onOpen() {
|
|
|
// When the modal is opened we mark the reminder as being displayed. This
|
|
|
// lets us introspect the reminder's display state from elsewhere.
|
|
|
this.reminder.beingDisplayed = true;
|
|
|
let { contentEl } = this;
|
|
|
new Reminder({
|
|
|
target: contentEl,
|
|
|
props: {
|
|
|
reminder: this.reminder,
|
|
|
laters: this.laters,
|
|
|
component: this,
|
|
|
onRemindMeLater: (time) => {
|
|
|
this.onRemindMeLater(time);
|
|
|
this.canceled = false;
|
|
|
this.close();
|
|
|
},
|
|
|
onDone: () => {
|
|
|
this.canceled = false;
|
|
|
this.onDone();
|
|
|
this.close();
|
|
|
},
|
|
|
onOpenFile: () => {
|
|
|
this.canceled = true;
|
|
|
this.onOpenFile();
|
|
|
this.close();
|
|
|
},
|
|
|
onMute: () => {
|
|
|
this.canceled = true;
|
|
|
this.close();
|
|
|
},
|
|
|
},
|
|
|
});
|
|
|
}
|
|
|
onClose() {
|
|
|
// Unset the reminder from being displayed. This lets other parts of the
|
|
|
// plugin continue.
|
|
|
this.reminder.beingDisplayed = false;
|
|
|
let { contentEl } = this;
|
|
|
contentEl.empty();
|
|
|
if (this.canceled) {
|
|
|
this.onCancel();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const VIEW_TYPE_REMINDER_LIST = "reminder-list";
|
|
|
|
|
|
/* src/ui/components/ReminderList.svelte generated by Svelte v3.42.2 */
|
|
|
|
|
|
function add_css(target) {
|
|
|
append_styles(target, "svelte-2zqui4", ".group-name.svelte-2zqui4{font-size:14px;color:var(--text-muted);border-bottom:1px solid var(--text-muted);margin-bottom:0.5rem}.group-name-overdue.svelte-2zqui4{color:var(--text-accent)}");
|
|
|
}
|
|
|
|
|
|
function get_each_context(ctx, list, i) {
|
|
|
const child_ctx = ctx.slice();
|
|
|
child_ctx[4] = list[i];
|
|
|
return child_ctx;
|
|
|
}
|
|
|
|
|
|
// (11:4) {#each groups as group}
|
|
|
function create_each_block(ctx) {
|
|
|
let div;
|
|
|
let t0_value = /*group*/ ctx[4].name + "";
|
|
|
let t0;
|
|
|
let t1;
|
|
|
let reminderlistbydate;
|
|
|
let current;
|
|
|
|
|
|
function func(...args) {
|
|
|
return /*func*/ ctx[3](/*group*/ ctx[4], ...args);
|
|
|
}
|
|
|
|
|
|
reminderlistbydate = new ReminderListByDate({
|
|
|
props: {
|
|
|
reminders: /*group*/ ctx[4].reminders,
|
|
|
component: /*component*/ ctx[1],
|
|
|
onOpenReminder: /*onOpenReminder*/ ctx[2],
|
|
|
timeToString: func
|
|
|
}
|
|
|
});
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
div = element("div");
|
|
|
t0 = text(t0_value);
|
|
|
t1 = space();
|
|
|
create_component(reminderlistbydate.$$.fragment);
|
|
|
attr(div, "class", "group-name svelte-2zqui4");
|
|
|
toggle_class(div, "group-name-overdue", /*group*/ ctx[4].isOverdue);
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, div, anchor);
|
|
|
append(div, t0);
|
|
|
insert(target, t1, anchor);
|
|
|
mount_component(reminderlistbydate, target, anchor);
|
|
|
current = true;
|
|
|
},
|
|
|
p(new_ctx, dirty) {
|
|
|
ctx = new_ctx;
|
|
|
if ((!current || dirty & /*groups*/ 1) && t0_value !== (t0_value = /*group*/ ctx[4].name + "")) set_data(t0, t0_value);
|
|
|
|
|
|
if (dirty & /*groups*/ 1) {
|
|
|
toggle_class(div, "group-name-overdue", /*group*/ ctx[4].isOverdue);
|
|
|
}
|
|
|
|
|
|
const reminderlistbydate_changes = {};
|
|
|
if (dirty & /*groups*/ 1) reminderlistbydate_changes.reminders = /*group*/ ctx[4].reminders;
|
|
|
if (dirty & /*component*/ 2) reminderlistbydate_changes.component = /*component*/ ctx[1];
|
|
|
if (dirty & /*onOpenReminder*/ 4) reminderlistbydate_changes.onOpenReminder = /*onOpenReminder*/ ctx[2];
|
|
|
if (dirty & /*groups*/ 1) reminderlistbydate_changes.timeToString = func;
|
|
|
reminderlistbydate.$set(reminderlistbydate_changes);
|
|
|
},
|
|
|
i(local) {
|
|
|
if (current) return;
|
|
|
transition_in(reminderlistbydate.$$.fragment, local);
|
|
|
current = true;
|
|
|
},
|
|
|
o(local) {
|
|
|
transition_out(reminderlistbydate.$$.fragment, local);
|
|
|
current = false;
|
|
|
},
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(div);
|
|
|
if (detaching) detach(t1);
|
|
|
destroy_component(reminderlistbydate, detaching);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function create_fragment(ctx) {
|
|
|
let main;
|
|
|
let div;
|
|
|
let current;
|
|
|
let each_value = /*groups*/ ctx[0];
|
|
|
let each_blocks = [];
|
|
|
|
|
|
for (let i = 0; i < each_value.length; i += 1) {
|
|
|
each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i));
|
|
|
}
|
|
|
|
|
|
const out = i => transition_out(each_blocks[i], 1, 1, () => {
|
|
|
each_blocks[i] = null;
|
|
|
});
|
|
|
|
|
|
return {
|
|
|
c() {
|
|
|
main = element("main");
|
|
|
div = element("div");
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].c();
|
|
|
}
|
|
|
},
|
|
|
m(target, anchor) {
|
|
|
insert(target, main, anchor);
|
|
|
append(main, div);
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
each_blocks[i].m(div, null);
|
|
|
}
|
|
|
|
|
|
current = true;
|
|
|
},
|
|
|
p(ctx, [dirty]) {
|
|
|
if (dirty & /*groups, component, onOpenReminder*/ 7) {
|
|
|
each_value = /*groups*/ ctx[0];
|
|
|
let i;
|
|
|
|
|
|
for (i = 0; i < each_value.length; i += 1) {
|
|
|
const child_ctx = get_each_context(ctx, each_value, i);
|
|
|
|
|
|
if (each_blocks[i]) {
|
|
|
each_blocks[i].p(child_ctx, dirty);
|
|
|
transition_in(each_blocks[i], 1);
|
|
|
} else {
|
|
|
each_blocks[i] = create_each_block(child_ctx);
|
|
|
each_blocks[i].c();
|
|
|
transition_in(each_blocks[i], 1);
|
|
|
each_blocks[i].m(div, null);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
group_outros();
|
|
|
|
|
|
for (i = each_value.length; i < each_blocks.length; i += 1) {
|
|
|
out(i);
|
|
|
}
|
|
|
|
|
|
check_outros();
|
|
|
}
|
|
|
},
|
|
|
i(local) {
|
|
|
if (current) return;
|
|
|
|
|
|
for (let i = 0; i < each_value.length; i += 1) {
|
|
|
transition_in(each_blocks[i]);
|
|
|
}
|
|
|
|
|
|
current = true;
|
|
|
},
|
|
|
o(local) {
|
|
|
each_blocks = each_blocks.filter(Boolean);
|
|
|
|
|
|
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
|
transition_out(each_blocks[i]);
|
|
|
}
|
|
|
|
|
|
current = false;
|
|
|
},
|
|
|
d(detaching) {
|
|
|
if (detaching) detach(main);
|
|
|
destroy_each(each_blocks, detaching);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function instance($$self, $$props, $$invalidate) {
|
|
|
|
|
|
|
|
|
let { groups } = $$props;
|
|
|
let { component } = $$props;
|
|
|
let { onOpenReminder } = $$props;
|
|
|
const func = (group, time) => group.timeToString(time);
|
|
|
|
|
|
$$self.$$set = $$props => {
|
|
|
if ('groups' in $$props) $$invalidate(0, groups = $$props.groups);
|
|
|
if ('component' in $$props) $$invalidate(1, component = $$props.component);
|
|
|
if ('onOpenReminder' in $$props) $$invalidate(2, onOpenReminder = $$props.onOpenReminder);
|
|
|
};
|
|
|
|
|
|
return [groups, component, onOpenReminder, func];
|
|
|
}
|
|
|
|
|
|
class ReminderList extends SvelteComponent {
|
|
|
constructor(options) {
|
|
|
super();
|
|
|
|
|
|
init(
|
|
|
this,
|
|
|
options,
|
|
|
instance,
|
|
|
create_fragment,
|
|
|
safe_not_equal,
|
|
|
{
|
|
|
groups: 0,
|
|
|
component: 1,
|
|
|
onOpenReminder: 2
|
|
|
},
|
|
|
add_css
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class ReminderListItemView extends obsidian.ItemView {
|
|
|
constructor(leaf, reminders, reminderTime, onOpenReminder) {
|
|
|
super(leaf);
|
|
|
this.reminders = reminders;
|
|
|
this.reminderTime = reminderTime;
|
|
|
this.onOpenReminder = onOpenReminder;
|
|
|
}
|
|
|
getViewType() {
|
|
|
return VIEW_TYPE_REMINDER_LIST;
|
|
|
}
|
|
|
getDisplayText() {
|
|
|
return "Reminders";
|
|
|
}
|
|
|
getIcon() {
|
|
|
return "clock";
|
|
|
}
|
|
|
onOpen() {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
this.view = new ReminderList({
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
target: this.contentEl,
|
|
|
props: {
|
|
|
groups: this.remindersForView(),
|
|
|
onOpenReminder: this.onOpenReminder,
|
|
|
component: this,
|
|
|
},
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
reload() {
|
|
|
if (this.view == null) {
|
|
|
return;
|
|
|
}
|
|
|
this.view.$set({
|
|
|
groups: this.remindersForView(),
|
|
|
onOpenReminder: this.onOpenReminder,
|
|
|
});
|
|
|
}
|
|
|
remindersForView() {
|
|
|
return groupReminders(this.reminders.reminders, this.reminderTime.value);
|
|
|
}
|
|
|
onClose() {
|
|
|
if (this.view) {
|
|
|
this.view.$destroy();
|
|
|
}
|
|
|
return Promise.resolve();
|
|
|
}
|
|
|
}
|
|
|
class ReminderListItemViewProxy {
|
|
|
constructor(workspace, reminders, reminderTime, onOpenReminder) {
|
|
|
this.workspace = workspace;
|
|
|
this.reminders = reminders;
|
|
|
this.reminderTime = reminderTime;
|
|
|
this.onOpenReminder = onOpenReminder;
|
|
|
// valid is a flag which means that this view should be re-rendered if true;
|
|
|
this.valid = false;
|
|
|
}
|
|
|
createView(leaf) {
|
|
|
return new ReminderListItemView(leaf, this.reminders, this.reminderTime, this.onOpenReminder);
|
|
|
}
|
|
|
openView() {
|
|
|
if (this.workspace.getLeavesOfType(VIEW_TYPE_REMINDER_LIST).length) {
|
|
|
// reminder list view is already in workspace
|
|
|
return;
|
|
|
}
|
|
|
// Create new view
|
|
|
this.workspace.getRightLeaf(false).setViewState({
|
|
|
type: VIEW_TYPE_REMINDER_LIST,
|
|
|
});
|
|
|
}
|
|
|
reload(force = false) {
|
|
|
if (force || !this.valid) {
|
|
|
const views = this.getViews();
|
|
|
if (views.length > 0) {
|
|
|
views.forEach(view => view.reload());
|
|
|
this.valid = true;
|
|
|
}
|
|
|
else {
|
|
|
this.valid = false;
|
|
|
console.debug("view is null. Skipping reminder list view reload");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
getViews() {
|
|
|
return this.workspace
|
|
|
.getLeavesOfType(VIEW_TYPE_REMINDER_LIST)
|
|
|
.map(leaf => leaf.view);
|
|
|
}
|
|
|
invalidate() {
|
|
|
this.valid = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const electron = require("electron");
|
|
|
var OkCancel;
|
|
|
(function (OkCancel) {
|
|
|
OkCancel[OkCancel["OK"] = 0] = "OK";
|
|
|
OkCancel[OkCancel["CANCEL"] = 1] = "CANCEL";
|
|
|
})(OkCancel || (OkCancel = {}));
|
|
|
function showOkCancelDialog(title, message) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
if (!electron) {
|
|
|
return OkCancel.CANCEL;
|
|
|
}
|
|
|
const selected = yield electron.remote.dialog.showMessageBox({
|
|
|
"type": "question",
|
|
|
"title": "Obsidian Reminder",
|
|
|
"message": title,
|
|
|
"detail": message,
|
|
|
buttons: ['OK', 'Cancel'],
|
|
|
cancelId: 1
|
|
|
});
|
|
|
if (selected.response === 0) {
|
|
|
return OkCancel.OK;
|
|
|
}
|
|
|
return OkCancel.CANCEL;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
class ReminderPlugin extends obsidian.Plugin {
|
|
|
constructor(app, manifest) {
|
|
|
super(app, manifest);
|
|
|
this.reminders = new Reminders(() => {
|
|
|
// on changed
|
|
|
if (this.viewProxy) {
|
|
|
this.viewProxy.invalidate();
|
|
|
}
|
|
|
this.pluginDataIO.changed = true;
|
|
|
});
|
|
|
this.pluginDataIO = new PluginDataIO(this, this.reminders);
|
|
|
this.reminders.reminderTime = SETTINGS.reminderTime;
|
|
|
DATE_TIME_FORMATTER.setTimeFormat(SETTINGS.dateFormat, SETTINGS.dateTimeFormat, SETTINGS.strictDateFormat);
|
|
|
this.editDetector = new EditDetector(SETTINGS.editDetectionSec);
|
|
|
this.viewProxy = new ReminderListItemViewProxy(app.workspace, this.reminders, SETTINGS.reminderTime,
|
|
|
// On select a reminder in the list
|
|
|
(reminder) => {
|
|
|
if (reminder.muteNotification) {
|
|
|
this.showReminder(reminder);
|
|
|
return;
|
|
|
}
|
|
|
this.openReminderFile(reminder);
|
|
|
});
|
|
|
this.remindersController = new RemindersController(app.vault, this.viewProxy, this.reminders);
|
|
|
this.reminderModal = new ReminderModal(this.app, SETTINGS.useSystemNotification, SETTINGS.laters);
|
|
|
this.autoComplete = new AutoComplete(SETTINGS.autoCompleteTrigger);
|
|
|
}
|
|
|
onload() {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
this.setupUI();
|
|
|
this.setupCommands();
|
|
|
this.app.workspace.onLayoutReady(() => __awaiter(this, void 0, void 0, function* () {
|
|
|
yield this.pluginDataIO.load();
|
|
|
if (this.pluginDataIO.debug.value) {
|
|
|
monkeyPatchConsole(this);
|
|
|
}
|
|
|
this.watchVault();
|
|
|
this.startPeriodicTask();
|
|
|
}));
|
|
|
});
|
|
|
}
|
|
|
setupUI() {
|
|
|
// Reminder List
|
|
|
this.registerView(VIEW_TYPE_REMINDER_LIST, (leaf) => {
|
|
|
return this.viewProxy.createView(leaf);
|
|
|
});
|
|
|
this.addSettingTab(new ReminderSettingTab(this.app, this));
|
|
|
this.registerDomEvent(document, "keydown", (evt) => {
|
|
|
this.editDetector.fileChanged();
|
|
|
});
|
|
|
if (obsidian.Platform.isDesktopApp) {
|
|
|
this.registerEditorExtension(buildCodeMirrorPlugin(this.app, this.reminders));
|
|
|
this.registerCodeMirror((cm) => {
|
|
|
const dateTimeChooser = new DateTimeChooserView(cm, this.reminders);
|
|
|
cm.on("change", (cmEditor, changeObj) => {
|
|
|
if (!this.autoComplete.isTrigger(cmEditor, changeObj)) {
|
|
|
dateTimeChooser.cancel();
|
|
|
return;
|
|
|
}
|
|
|
dateTimeChooser.show()
|
|
|
.then(value => {
|
|
|
this.autoComplete.insert(cmEditor, value);
|
|
|
})
|
|
|
.catch(() => { });
|
|
|
return;
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
// Open reminder list view. This callback will fire immediately if the
|
|
|
// layout is ready, and will otherwise be enqueued.
|
|
|
this.app.workspace.onLayoutReady(() => {
|
|
|
this.viewProxy.openView();
|
|
|
});
|
|
|
}
|
|
|
setupCommands() {
|
|
|
this.addCommand({
|
|
|
id: "scan-reminders",
|
|
|
name: "Scan reminders",
|
|
|
checkCallback: (checking) => {
|
|
|
if (checking) {
|
|
|
return true;
|
|
|
}
|
|
|
this.remindersController.reloadAllFiles();
|
|
|
return true;
|
|
|
},
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "show-reminders",
|
|
|
name: "Show reminders",
|
|
|
checkCallback: (checking) => {
|
|
|
if (!checking) {
|
|
|
this.showReminderList();
|
|
|
}
|
|
|
return true;
|
|
|
},
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "convert-reminder-time-format",
|
|
|
name: "Convert reminder time format",
|
|
|
checkCallback: (checking) => {
|
|
|
if (!checking) {
|
|
|
showOkCancelDialog("Convert reminder time format", "This command rewrite reminder dates in all markdown files. You should make a backup of your vault before you execute this. May I continue to convert?").then((res) => {
|
|
|
if (res !== OkCancel.OK) {
|
|
|
return;
|
|
|
}
|
|
|
openDateTimeFormatChooser(this.app, (dateFormat, dateTimeFormat) => {
|
|
|
this.remindersController.convertDateTimeFormat(dateFormat, dateTimeFormat)
|
|
|
.catch(() => { });
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
return true;
|
|
|
},
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "show-date-chooser",
|
|
|
name: "Show calendar popup",
|
|
|
icon: "calendar-with-checkmark",
|
|
|
hotkeys: [
|
|
|
{
|
|
|
modifiers: ["Meta", "Shift"],
|
|
|
key: "2" // Shift + 2 = `@`
|
|
|
}
|
|
|
],
|
|
|
editorCheckCallback: (checking, editor) => {
|
|
|
if (checking) {
|
|
|
return true;
|
|
|
}
|
|
|
this.autoComplete.show(this.app, editor, this.reminders);
|
|
|
},
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "toggle-checklist-status",
|
|
|
name: "Toggle checklist status",
|
|
|
hotkeys: [
|
|
|
{
|
|
|
modifiers: ["Meta", "Shift"],
|
|
|
key: "Enter"
|
|
|
}
|
|
|
],
|
|
|
editorCheckCallback: (checking, editor, view) => {
|
|
|
if (checking) {
|
|
|
return true;
|
|
|
}
|
|
|
this.remindersController.toggleCheck(view.file, editor.getCursor().line);
|
|
|
},
|
|
|
});
|
|
|
}
|
|
|
watchVault() {
|
|
|
[
|
|
|
this.app.vault.on("modify", (file) => __awaiter(this, void 0, void 0, function* () {
|
|
|
this.remindersController.reloadFile(file, true);
|
|
|
})),
|
|
|
this.app.vault.on("delete", (file) => {
|
|
|
this.remindersController.removeFile(file.path);
|
|
|
}),
|
|
|
this.app.vault.on("rename", (file, oldPath) => __awaiter(this, void 0, void 0, function* () {
|
|
|
// We only reload the file if it CAN be deleted, otherwise this can
|
|
|
// cause crashes.
|
|
|
if (yield this.remindersController.removeFile(oldPath)) {
|
|
|
// We need to do the reload synchronously so as to avoid racing.
|
|
|
yield this.remindersController.reloadFile(file);
|
|
|
}
|
|
|
})),
|
|
|
].forEach(eventRef => {
|
|
|
this.registerEvent(eventRef);
|
|
|
});
|
|
|
}
|
|
|
startPeriodicTask() {
|
|
|
let intervalTaskRunning = true;
|
|
|
// Force the view to refresh as soon as possible.
|
|
|
this.periodicTask().finally(() => {
|
|
|
intervalTaskRunning = false;
|
|
|
});
|
|
|
// Set up the recurring check for reminders.
|
|
|
this.registerInterval(window.setInterval(() => {
|
|
|
if (intervalTaskRunning) {
|
|
|
console.log("Skip reminder interval task because task is already running.");
|
|
|
return;
|
|
|
}
|
|
|
intervalTaskRunning = true;
|
|
|
this.periodicTask().finally(() => {
|
|
|
intervalTaskRunning = false;
|
|
|
});
|
|
|
}, SETTINGS.reminderCheckIntervalSec.value * 1000));
|
|
|
}
|
|
|
periodicTask() {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
this.viewProxy.reload(false);
|
|
|
if (!this.pluginDataIO.scanned.value) {
|
|
|
this.remindersController.reloadAllFiles().then(() => {
|
|
|
this.pluginDataIO.scanned.value = true;
|
|
|
this.pluginDataIO.save();
|
|
|
});
|
|
|
}
|
|
|
this.pluginDataIO.save(false);
|
|
|
if (this.editDetector.isEditing()) {
|
|
|
return;
|
|
|
}
|
|
|
const expired = this.reminders.getExpiredReminders(SETTINGS.reminderTime.value);
|
|
|
let previousReminder = undefined;
|
|
|
for (let reminder of expired) {
|
|
|
if (this.app.workspace.layoutReady) {
|
|
|
if (reminder.muteNotification) {
|
|
|
// We don't want to set `previousReminder` in this case as the current
|
|
|
// reminder won't be shown.
|
|
|
continue;
|
|
|
}
|
|
|
if (previousReminder) {
|
|
|
while (previousReminder.beingDisplayed) {
|
|
|
// Displaying too many reminders at once can cause crashes on
|
|
|
// mobile. We use `beingDisplayed` to wait for the current modal to
|
|
|
// be dismissed before displaying the next.
|
|
|
yield this.sleep(100);
|
|
|
}
|
|
|
}
|
|
|
this.showReminder(reminder);
|
|
|
previousReminder = reminder;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
/* An asynchronous sleep function. To use it you must `await` as it hands
|
|
|
* off control to other portions of the JS control loop whilst waiting.
|
|
|
*
|
|
|
* @param milliseconds - The number of milliseconds to wait before resuming.
|
|
|
*/
|
|
|
sleep(milliseconds) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
return new Promise(resolve => setTimeout(resolve, milliseconds));
|
|
|
});
|
|
|
}
|
|
|
showReminder(reminder) {
|
|
|
reminder.muteNotification = true;
|
|
|
this.reminderModal.show(reminder, (time) => {
|
|
|
console.info("Remind me later: time=%o", time);
|
|
|
reminder.time = time;
|
|
|
reminder.muteNotification = false;
|
|
|
this.remindersController.updateReminder(reminder, false);
|
|
|
this.pluginDataIO.save(true);
|
|
|
}, () => {
|
|
|
console.info("done");
|
|
|
reminder.muteNotification = false;
|
|
|
this.remindersController.updateReminder(reminder, true);
|
|
|
this.reminders.removeReminder(reminder);
|
|
|
this.pluginDataIO.save(true);
|
|
|
}, () => {
|
|
|
console.info("Mute");
|
|
|
reminder.muteNotification = true;
|
|
|
this.viewProxy.reload(true);
|
|
|
}, () => {
|
|
|
console.info("Open");
|
|
|
this.openReminderFile(reminder);
|
|
|
});
|
|
|
}
|
|
|
openReminderFile(reminder) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
const leaf = this.app.workspace.getUnpinnedLeaf();
|
|
|
yield this.remindersController.openReminder(reminder, leaf);
|
|
|
});
|
|
|
}
|
|
|
onunload() {
|
|
|
this.app.workspace
|
|
|
.getLeavesOfType(VIEW_TYPE_REMINDER_LIST)
|
|
|
.forEach((leaf) => leaf.detach());
|
|
|
}
|
|
|
showReminderList() {
|
|
|
if (this.app.workspace.getLeavesOfType(VIEW_TYPE_REMINDER_LIST).length) {
|
|
|
return;
|
|
|
}
|
|
|
this.app.workspace.getRightLeaf(false).setViewState({
|
|
|
type: VIEW_TYPE_REMINDER_LIST,
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
class EditDetector {
|
|
|
constructor(editDetectionSec) {
|
|
|
this.editDetectionSec = editDetectionSec;
|
|
|
}
|
|
|
fileChanged() {
|
|
|
this.lastModified = new Date();
|
|
|
}
|
|
|
isEditing() {
|
|
|
if (this.editDetectionSec.value <= 0) {
|
|
|
return false;
|
|
|
}
|
|
|
if (this.lastModified == null) {
|
|
|
return false;
|
|
|
}
|
|
|
const elapsedSec = (new Date().getTime() - this.lastModified.getTime()) / 1000;
|
|
|
return elapsedSec < this.editDetectionSec.value;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
module.exports = ReminderPlugin;
|
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9tb2RlbC9mb3JtYXQvbWFya2Rvd24udHMiLCJzcmMvbW9kZWwvcmVmLnRzIiwibm9kZV9tb2R1bGVzL21vbWVudC9tb21lbnQuanMiLCJzcmMvbW9kZWwvdGltZS50cyIsInNyYy9tb2RlbC9yZW1pbmRlci50cyIsInNyYy9tb2RlbC9mb3JtYXQvcmVtaW5kZXItYmFzZS50cyIsInNyYy9tb2RlbC9mb3JtYXQvcmVtaW5kZXItZGVmYXVsdC50cyIsInNyYy9tb2RlbC9mb3JtYXQvdXRpbC50cyIsInNyYy9tb2RlbC9mb3JtYXQvcmVtaW5kZXIta2FuYmFuLXBsdWdpbi50cyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvd2Vla2RheS5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvaGVscGVycy5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvZGF0ZXV0aWwuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXJyZXN1bHQuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2NhbGxiYWNraXRlcnJlc3VsdC5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvbmxwL2kxOG4uanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL25scC90b3RleHQuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL25scC9wYXJzZXRleHQuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL3R5cGVzLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9ubHAvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2RhdGV0aW1lLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9wYXJzZW9wdGlvbnMuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL3BhcnNlc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2x1eG9uL2J1aWxkL25vZGUvbHV4b24uanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2RhdGV3aXRoem9uZS5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvb3B0aW9uc3Rvc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9jYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvbWFza3MuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXJpbmZvL3llYXJpbmZvLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9pdGVyaW5mby9tb250aGluZm8uanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXJpbmZvL2Vhc3Rlci5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvaXRlcmluZm8vaW5kZXguanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXIvcG9zbGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvaXRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvcnJ1bGUuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXJzZXQuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL3JydWxlc3RyLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9ycnVsZXNldC5qcyIsInNyYy9tb2RlbC9mb3JtYXQvc3BsaXR0ZXIudHMiLCJzcmMvbW9kZWwvZm9ybWF0L3JlbWluZGVyLXRhc2tzLXBsdWdpbi50cyIsInNyYy9tb2RlbC9mb3JtYXQvaW5kZXgudHMiLCJzcmMvbW9kZWwvc2V0dGluZ3MudHMiLCJzcmMvc2V0dGluZ3MudHMiLCJzcmMvbW9kZWwvY29udGVudC50cyIsInNyYy9jb250cm9sbGVyLnRzIiwic3JjL2RhdGEudHMiLCJzcmMvb2JzaWRpYW4taGFjay9vYnNpZGlhbi1kZWJ1Zy1tb2JpbGUudHMiLCJub2RlX21vZHVsZXMvc3ZlbHRlL2ludGVybmFsL2luZGV4Lm1qcyIsInNyYy9tb2RlbC9jYWxlbmRhci50cyIsInNyYy91aS9jb21wb25lbnRzL0NhbGVuZGFyLnN2ZWx0ZSIsInNyYy91aS9jb21wb25lbnRzL01hcmtkb3duLnN2ZWx0ZSIsInNyYy91aS9jb21wb25lbnRzL1JlbWluZGVyTGlzdEJ5RGF0ZS5zdmVsdGUiLCJzcmMvdWkvY29tcG9uZW50cy9EYXRlVGltZUNob29zZXIuc3ZlbHRlIiwic3JjL3VpL2RhdGUtY2hvb3Nlci1tb2RhbC50cyIsInNyYy91aS9kYXRldGltZS1jaG9vc2VyLnRzIiwic3JjL3VpL2F1dG9jb21wbGV0ZS50cyIsInNyYy91aS9kYXRldGltZS1mb3JtYXQtbW9kYWwudHMiLCJzcmMvdWkvZWRpdG9yLWV4dGVuc2lvbi50cyIsInNyYy91aS9jb21wb25lbnRzL0ljb24uc3ZlbHRlIiwic3JjL3VpL2NvbXBvbmVudHMvUmVtaW5kZXIuc3ZlbHRlIiwic3JjL3VpL3JlbWluZGVyLnRzIiwic3JjL2NvbnN0YW50cy50cyIsInNyYy91aS9jb21wb25lbnRzL1JlbWluZGVyTGlzdC5zdmVsdGUiLCJzcmMvdWkvcmVtaW5kZXItbGlzdC50cyIsInNyYy91aS91dGlsLnRzIiwic3JjL21haW4udHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbInRoaXMiLCJyZXF1aXJlIiwiRGF0ZVRpbWUiLCJUaW1lIiwiUmVtaW5kZXIiLCJpc051bWJlciIsInBhZFN0YXJ0IiwiaW5pdGlhbGl6ZU9wdGlvbnMiLCJkYXRldXRpbCIsIkRFRkFVTFRfT1BUSU9OUyIsIlNldHRpbmdzIiwiU3ltYm9sIiwiU2V0dGluZyIsIlBsdWdpblNldHRpbmdUYWIiLCJURmlsZSIsIk1hcmtkb3duVmlldyIsIlBsYXRmb3JtIiwiTWFya2Rvd25SZW5kZXJlciIsIk1vZGFsIiwiRnV6enlTdWdnZXN0TW9kYWwiLCJWaWV3UGx1Z2luIiwiRWRpdG9yU2VsZWN0aW9uIiwic2V0SWNvbiIsImVsZWN0cm9uIiwiUmVtaW5kZXJWaWV3IiwiSXRlbVZpZXciLCJSZW1pbmRlckxpc3RWaWV3IiwiUGx1Z2luIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjO0FBQ3pDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNwRixRQUFRLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMxRyxJQUFJLE9BQU8sYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFDRjtBQUNPLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUssSUFBSTtBQUM3QyxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLCtCQUErQixDQUFDLENBQUM7QUFDbEcsSUFBSSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLElBQUksU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQzNDLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBQ0Q7QUFDTyxJQUFJLFFBQVEsR0FBRyxXQUFXO0FBQ2pDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3JELFFBQVEsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0QsWUFBWSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLFlBQVksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekYsU0FBUztBQUNULFFBQVEsT0FBTyxDQUFDLENBQUM7QUFDakIsTUFBSztBQUNMLElBQUksT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMzQyxFQUFDO0FBNEJEO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5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QUFDO0FBQ3BDLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ25ELFFBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELFFBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbEQsUUFBUSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUMvQyxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxVQUFVLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQ3pELFFBQVEsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDbkMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEQsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRCxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRSxVQUFVLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQzNELFFBQVEsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO0FBQ25DLFlBQVksSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ25ELFFBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELFFBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbEQsS0FBSyxDQUFDLENBQUM7QUFDUDtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsVUFBVSxDQUFDLEtBQUssRUFBRTtBQUMvQjtBQUNBO0FBQ0EsUUFBUSxPQUFPLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDO0FBQzVELEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSwwQkFBMEIsR0FBRyxlQUFlO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQztBQUNBLElBQUksU0FBUyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUU7QUFDckQsUUFBUSxJQUFJLEtBQUssR0FBRyxFQUFFLEVBQUU7QUFDeEIsWUFBWSxPQUFPLE9BQU8sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLFNBQVMsTUFBTTtBQUNmLFlBQVksT0FBTyxPQUFPLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6QyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLFVBQVUsR0FBRztBQUNyQixRQUFRLFFBQVEsRUFBRSxlQUFlO0FBQ2pDLFFBQVEsY0FBYyxFQUFFLHFCQUFxQjtBQUM3QyxRQUFRLFdBQVcsRUFBRSxrQkFBa0I7QUFDdkMsUUFBUSxPQUFPLEVBQUUsY0FBYztBQUMvQixRQUFRLHNCQUFzQixFQUFFLDZCQUE2QjtBQUM3RCxRQUFRLFlBQVksRUFBRSxtQkFBbUI7QUFDekM7QUFDQSxRQUFRLE1BQU0sRUFBRSxtQkFBbUI7QUFDbkMsUUFBUSxXQUFXLEVBQUUsd0JBQXdCO0FBQzdDO0FBQ0EsUUFBUSxJQUFJLEVBQUUsaUJBQWlCO0FBQy9CO0FBQ0EsUUFBUSxRQUFRLEVBQUUscUJBQXFCO0FBQ3ZDLFFBQVEsV0FBVyxFQUFFLHdCQUF3QjtBQUM3QyxRQUFRLGFBQWEsRUFBRSwwQkFBMEI7QUFDakQ7QUFDQSxRQUFRLGFBQWEsRUFBRSwwQkFBMEI7QUFDakQsS0FBSyxDQUFDO0FBQ047QUFDQTtBQUNBLElBQUksSUFBSSxPQUFPLEdBQUcsRUFBRTtBQUNwQixRQUFRLGNBQWMsR0FBRyxFQUFFO0FBQzNCLFFBQVEsWUFBWSxDQUFDO0FBQ3JCO0FBQ0EsSUFBSSxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQ3RDLFFBQVEsSUFBSSxDQUFDO0FBQ2IsWUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0RCxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDdEMsWUFBWSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDckMsZ0JBQWdCLE9BQU8sQ0FBQyxDQUFDO0FBQ3pCLGFBQWE7QUFDYixTQUFTO0FBQ1QsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsZUFBZSxDQUFDLEdBQUcsRUFBRTtBQUNsQyxRQUFRLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMvRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsWUFBWSxDQUFDLEtBQUssRUFBRTtBQUNqQyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDakIsWUFBWSxDQUFDO0FBQ2IsWUFBWSxJQUFJO0FBQ2hCLFlBQVksTUFBTTtBQUNsQixZQUFZLEtBQUssQ0FBQztBQUNsQjtBQUNBLFFBQVEsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRTtBQUNqQyxZQUFZLEtBQUssR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pELFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDN0IsWUFBWSxJQUFJLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxZQUFZLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDakQsWUFBWSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDMUIsZ0JBQWdCLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakUsZ0JBQWdCLElBQUksTUFBTSxFQUFFO0FBQzVCLG9CQUFvQixPQUFPLE1BQU0sQ0FBQztBQUNsQyxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCLG9CQUFvQixJQUFJO0FBQ3hCLG9CQUFvQixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUM7QUFDcEMsb0JBQW9CLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDdEQsa0JBQWtCO0FBQ2xCO0FBQ0Esb0JBQW9CLE1BQU07QUFDMUIsaUJBQWlCO0FBQ2pCLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztBQUNwQixhQUFhO0FBQ2IsWUFBWSxDQUFDLEVBQUUsQ0FBQztBQUNoQixTQUFTO0FBQ1QsUUFBUSxPQUFPLFlBQVksQ0FBQztBQUM1QixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRTtBQUM5QixRQUFRLElBQUksU0FBUyxHQUFHLElBQUk7QUFDNUIsWUFBWSxjQUFjLENBQUM7QUFDM0I7QUFDQSxRQUFRO0FBQ1IsWUFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUztBQUN2QyxZQUFZLFFBQWEsS0FBSyxXQUFXO0FBQ3pDLFlBQVksTUFBTTtBQUNsQixZQUFZLE1BQU0sQ0FBQyxPQUFPO0FBQzFCLFVBQVU7QUFDVixZQUFZLElBQUk7QUFDaEIsZ0JBQWdCLFNBQVMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO0FBQy9DLGdCQUFnQixjQUFjLEdBQUdDLGVBQU8sQ0FBQztBQUN6QyxnQkFBZ0IsY0FBYyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNuRCxnQkFBZ0Isa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDOUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQ3hCO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNyQyxhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0IsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUU7QUFDN0MsUUFBUSxJQUFJLElBQUksQ0FBQztBQUNqQixRQUFRLElBQUksR0FBRyxFQUFFO0FBQ2pCLFlBQVksSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDckMsZ0JBQWdCLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEMsYUFBYSxNQUFNO0FBQ25CLGdCQUFnQixJQUFJLEdBQUcsWUFBWSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqRCxhQUFhO0FBQ2I7QUFDQSxZQUFZLElBQUksSUFBSSxFQUFFO0FBQ3RCO0FBQ0EsZ0JBQWdCLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDcEMsYUFBYSxNQUFNO0FBQ25CLGdCQUFnQixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO0FBQ3BFO0FBQ0Esb0JBQW9CLE9BQU8sQ0FBQyxJQUFJO0FBQ2hDLHdCQUF3QixTQUFTLEdBQUcsR0FBRyxHQUFHLHdDQUF3QztBQUNsRixxQkFBcUIsQ0FBQztBQUN0QixpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDO0FBQ2xDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtBQUN4QyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtBQUM3QixZQUFZLElBQUksTUFBTTtBQUN0QixnQkFBZ0IsWUFBWSxHQUFHLFVBQVUsQ0FBQztBQUMxQyxZQUFZLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQy9CLFlBQVksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO0FBQ3ZDLGdCQUFnQixlQUFlO0FBQy9CLG9CQUFvQixzQkFBc0I7QUFDMUMsb0JBQW9CLHdEQUF3RDtBQUM1RSx3QkFBd0Isc0RBQXNEO0FBQzlFLHdCQUF3Qix3REFBd0Q7QUFDaEYsd0JBQXdCLHlFQUF5RTtBQUNqRyxpQkFBaUIsQ0FBQztBQUNsQixnQkFBZ0IsWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFDckQsYUFBYSxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUU7QUFDcEQsZ0JBQWdCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDMUQsb0JBQW9CLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUN4RSxpQkFBaUIsTUFBTTtBQUN2QixvQkFBb0IsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDN0Qsb0JBQW9CLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtBQUN4Qyx3QkFBd0IsWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdEQscUJBQXFCLE1BQU07QUFDM0Isd0JBQXdCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFO0FBQ2xFLDRCQUE0QixjQUFjLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNyRSx5QkFBeUI7QUFDekIsd0JBQXdCLGNBQWMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2pFLDRCQUE0QixJQUFJLEVBQUUsSUFBSTtBQUN0Qyw0QkFBNEIsTUFBTSxFQUFFLE1BQU07QUFDMUMseUJBQXlCLENBQUMsQ0FBQztBQUMzQix3QkFBd0IsT0FBTyxJQUFJLENBQUM7QUFDcEMscUJBQXFCO0FBQ3JCLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsWUFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNFO0FBQ0EsWUFBWSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN0QyxnQkFBZ0IsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtBQUMxRCxvQkFBb0IsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25ELGlCQUFpQixDQUFDLENBQUM7QUFDbkIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQztBQUNBLFlBQVksT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsU0FBUyxNQUFNO0FBQ2Y7QUFDQSxZQUFZLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLFlBQVksT0FBTyxJQUFJLENBQUM7QUFDeEIsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtBQUN4QyxRQUFRLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtBQUM1QixZQUFZLElBQUksTUFBTTtBQUN0QixnQkFBZ0IsU0FBUztBQUN6QixnQkFBZ0IsWUFBWSxHQUFHLFVBQVUsQ0FBQztBQUMxQztBQUNBLFlBQVksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLElBQUksSUFBSSxFQUFFO0FBQzdFO0FBQ0EsZ0JBQWdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMvRSxhQUFhLE1BQU07QUFDbkI7QUFDQSxnQkFBZ0IsU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxnQkFBZ0IsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO0FBQ3ZDLG9CQUFvQixZQUFZLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztBQUNyRCxpQkFBaUI7QUFDakIsZ0JBQWdCLE1BQU0sR0FBRyxZQUFZLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzVELGdCQUFnQixJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7QUFDdkM7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLGlCQUFpQjtBQUNqQixnQkFBZ0IsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVDLGdCQUFnQixNQUFNLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwRCxnQkFBZ0IsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN2QyxhQUFhO0FBQ2I7QUFDQTtBQUNBLFlBQVksa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsU0FBUyxNQUFNO0FBQ2Y7QUFDQSxZQUFZLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtBQUN2QyxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLElBQUksRUFBRTtBQUN4RCxvQkFBb0IsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUM7QUFDL0Qsb0JBQW9CLElBQUksSUFBSSxLQUFLLGtCQUFrQixFQUFFLEVBQUU7QUFDdkQsd0JBQXdCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pELHFCQUFxQjtBQUNyQixpQkFBaUIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDbEQsb0JBQW9CLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0IsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRTtBQUM1QixRQUFRLElBQUksTUFBTSxDQUFDO0FBQ25CO0FBQ0EsUUFBUSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO0FBQ3JELFlBQVksR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3BDLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNsQixZQUFZLE9BQU8sWUFBWSxDQUFDO0FBQ2hDLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUMzQjtBQUNBLFlBQVksTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQyxZQUFZLElBQUksTUFBTSxFQUFFO0FBQ3hCLGdCQUFnQixPQUFPLE1BQU0sQ0FBQztBQUM5QixhQUFhO0FBQ2IsWUFBWSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxXQUFXLEdBQUc7QUFDM0IsUUFBUSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsYUFBYSxDQUFDLENBQUMsRUFBRTtBQUM5QixRQUFRLElBQUksUUFBUTtBQUNwQixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3JCO0FBQ0EsUUFBUSxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3JELFlBQVksUUFBUTtBQUNwQixnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtBQUM3QyxzQkFBc0IsS0FBSztBQUMzQixzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0Usc0JBQXNCLElBQUk7QUFDMUIsc0JBQXNCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ2pDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNsQyx1QkFBdUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDckMsMkJBQTJCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0FBQzFDLDhCQUE4QixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztBQUM3Qyw4QkFBOEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3BELHNCQUFzQixJQUFJO0FBQzFCLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO0FBQ3JELHNCQUFzQixNQUFNO0FBQzVCLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO0FBQ3JELHNCQUFzQixNQUFNO0FBQzVCLHNCQUFzQixDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHO0FBQ2hFLHNCQUFzQixXQUFXO0FBQ2pDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztBQUN6QjtBQUNBLFlBQVk7QUFDWixnQkFBZ0IsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQjtBQUNyRCxpQkFBaUIsUUFBUSxHQUFHLElBQUksSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3BELGNBQWM7QUFDZCxnQkFBZ0IsUUFBUSxHQUFHLElBQUksQ0FBQztBQUNoQyxhQUFhO0FBQ2IsWUFBWSxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksUUFBUSxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3RFLGdCQUFnQixRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLGFBQWE7QUFDYixZQUFZLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUN4RSxnQkFBZ0IsUUFBUSxHQUFHLE9BQU8sQ0FBQztBQUNuQyxhQUFhO0FBQ2I7QUFDQSxZQUFZLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQ25ELFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxDQUFDLENBQUM7QUFDakIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxnQkFBZ0IsR0FBRyxnSkFBZ0o7QUFDM0ssUUFBUSxhQUFhLEdBQUcsNElBQTRJO0FBQ3BLLFFBQVEsT0FBTyxHQUFHLHVCQUF1QjtBQUN6QyxRQUFRLFFBQVEsR0FBRztBQUNuQixZQUFZLENBQUMsY0FBYyxFQUFFLHFCQUFxQixDQUFDO0FBQ25ELFlBQVksQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7QUFDN0MsWUFBWSxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQztBQUM5QyxZQUFZLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUM7QUFDaEQsWUFBWSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUM7QUFDdkMsWUFBWSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDO0FBQzVDLFlBQVksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDO0FBQ3hDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDO0FBQ2pDLFlBQVksQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO0FBQ3pDLFlBQVksQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQztBQUMvQyxZQUFZLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQztBQUNoQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUM7QUFDdEMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDO0FBQ3BDLFNBQVM7QUFDVDtBQUNBLFFBQVEsUUFBUSxHQUFHO0FBQ25CLFlBQVksQ0FBQyxlQUFlLEVBQUUscUJBQXFCLENBQUM7QUFDcEQsWUFBWSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQztBQUNuRCxZQUFZLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDO0FBQzFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDO0FBQ2xDLFlBQVksQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLENBQUM7QUFDaEQsWUFBWSxDQUFDLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQztBQUMvQyxZQUFZLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQztBQUN0QyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztBQUNoQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztBQUMxQixTQUFTO0FBQ1QsUUFBUSxlQUFlLEdBQUcsb0JBQW9CO0FBQzlDO0FBQ0EsUUFBUSxPQUFPLEdBQUcseUxBQXlMO0FBQzNNLFFBQVEsVUFBVSxHQUFHO0FBQ3JCLFlBQVksRUFBRSxFQUFFLENBQUM7QUFDakIsWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUNsQixZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFO0FBQ3hCLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUU7QUFDeEIsWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRTtBQUN4QixZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFO0FBQ3hCLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUU7QUFDeEIsWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRTtBQUN4QixZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFO0FBQ3hCLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUU7QUFDeEIsU0FBUyxDQUFDO0FBQ1Y7QUFDQTtBQUNBLElBQUksU0FBUyxhQUFhLENBQUMsTUFBTSxFQUFFO0FBQ25DLFFBQVEsSUFBSSxDQUFDO0FBQ2IsWUFBWSxDQUFDO0FBQ2IsWUFBWSxNQUFNLEdBQUcsTUFBTSxDQUFDLEVBQUU7QUFDOUIsWUFBWSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQy9FLFlBQVksU0FBUztBQUNyQixZQUFZLFVBQVU7QUFDdEIsWUFBWSxVQUFVO0FBQ3RCLFlBQVksUUFBUSxDQUFDO0FBQ3JCO0FBQ0EsUUFBUSxJQUFJLEtBQUssRUFBRTtBQUNuQixZQUFZLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQy9DO0FBQ0EsWUFBWSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6RCxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ25ELG9CQUFvQixVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hELG9CQUFvQixTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQztBQUN6RCxvQkFBb0IsTUFBTTtBQUMxQixpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFlBQVksSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO0FBQ3BDLGdCQUFnQixNQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztBQUN4QyxnQkFBZ0IsT0FBTztBQUN2QixhQUFhO0FBQ2IsWUFBWSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxQixnQkFBZ0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0Qsb0JBQW9CLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN2RDtBQUNBLHdCQUF3QixVQUFVLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RSx3QkFBd0IsTUFBTTtBQUM5QixxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCLGdCQUFnQixJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7QUFDeEMsb0JBQW9CLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBQzVDLG9CQUFvQixPQUFPO0FBQzNCLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsU0FBUyxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7QUFDbEQsZ0JBQWdCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBQ3hDLGdCQUFnQixPQUFPO0FBQ3ZCLGFBQWE7QUFDYixZQUFZLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzFCLGdCQUFnQixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDNUMsb0JBQW9CLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDbkMsaUJBQWlCLE1BQU07QUFDdkIsb0JBQW9CLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBQzVDLG9CQUFvQixPQUFPO0FBQzNCLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsWUFBWSxNQUFNLENBQUMsRUFBRSxHQUFHLFVBQVUsSUFBSSxVQUFVLElBQUksRUFBRSxDQUFDLElBQUksUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzNFLFlBQVkseUJBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUMsU0FBUyxNQUFNO0FBQ2YsWUFBWSxNQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztBQUNwQyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLHlCQUF5QjtBQUN0QyxRQUFRLE9BQU87QUFDZixRQUFRLFFBQVE7QUFDaEIsUUFBUSxNQUFNO0FBQ2QsUUFBUSxPQUFPO0FBQ2YsUUFBUSxTQUFTO0FBQ2pCLFFBQVEsU0FBUztBQUNqQixNQUFNO0FBQ04sUUFBUSxJQUFJLE1BQU0sR0FBRztBQUNyQixZQUFZLGNBQWMsQ0FBQyxPQUFPLENBQUM7QUFDbkMsWUFBWSx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQ3RELFlBQVksUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7QUFDaEMsWUFBWSxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztBQUNqQyxZQUFZLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO0FBQ25DLFNBQVMsQ0FBQztBQUNWO0FBQ0EsUUFBUSxJQUFJLFNBQVMsRUFBRTtBQUN2QixZQUFZLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pELFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxNQUFNLENBQUM7QUFDdEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGNBQWMsQ0FBQyxPQUFPLEVBQUU7QUFDckMsUUFBUSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFO0FBQ3hCLFlBQVksT0FBTyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQy9CLFNBQVMsTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUU7QUFDaEMsWUFBWSxPQUFPLElBQUksR0FBRyxJQUFJLENBQUM7QUFDL0IsU0FBUztBQUNULFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGlCQUFpQixDQUFDLENBQUMsRUFBRTtBQUNsQztBQUNBLFFBQVEsT0FBTyxDQUFDO0FBQ2hCLGFBQWEsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQztBQUM5QyxhQUFhLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDO0FBQ3JDLGFBQWEsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7QUFDbEMsYUFBYSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ25DLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxZQUFZLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUU7QUFDM0QsUUFBUSxJQUFJLFVBQVUsRUFBRTtBQUN4QjtBQUNBLFlBQVksSUFBSSxlQUFlLEdBQUcsMEJBQTBCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNoRixnQkFBZ0IsYUFBYSxHQUFHLElBQUksSUFBSTtBQUN4QyxvQkFBb0IsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNsQyxvQkFBb0IsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNsQyxvQkFBb0IsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNsQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUMzQixZQUFZLElBQUksZUFBZSxLQUFLLGFBQWEsRUFBRTtBQUNuRCxnQkFBZ0IsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDL0QsZ0JBQWdCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBQ3hDLGdCQUFnQixPQUFPLEtBQUssQ0FBQztBQUM3QixhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGVBQWUsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRTtBQUNuRSxRQUFRLElBQUksU0FBUyxFQUFFO0FBQ3ZCLFlBQVksT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekMsU0FBUyxNQUFNLElBQUksY0FBYyxFQUFFO0FBQ25DO0FBQ0EsWUFBWSxPQUFPLENBQUMsQ0FBQztBQUNyQixTQUFTLE1BQU07QUFDZixZQUFZLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO0FBQzVDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUc7QUFDNUIsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ25DLFlBQVksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM5QixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLFNBQVMsaUJBQWlCLENBQUMsTUFBTSxFQUFFO0FBQ3ZDLFFBQVEsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDOUQsWUFBWSxXQUFXLENBQUM7QUFDeEIsUUFBUSxJQUFJLEtBQUssRUFBRTtBQUNuQixZQUFZLFdBQVcsR0FBRyx5QkFBeUI7QUFDbkQsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsYUFBYSxDQUFDO0FBQ2QsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLEVBQUU7QUFDOUQsZ0JBQWdCLE9BQU87QUFDdkIsYUFBYTtBQUNiO0FBQ0EsWUFBWSxNQUFNLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQztBQUNwQyxZQUFZLE1BQU0sQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekU7QUFDQSxZQUFZLE1BQU0sQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdELFlBQVksTUFBTSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0U7QUFDQSxZQUFZLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ25ELFNBQVMsTUFBTTtBQUNmLFlBQVksTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDcEMsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxTQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtBQUN0QyxRQUFRLElBQUksT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO0FBQzlCLFlBQVksTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLFlBQVksT0FBTztBQUNuQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QixRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7QUFDdkMsWUFBWSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDbkMsU0FBUyxNQUFNO0FBQ2YsWUFBWSxPQUFPO0FBQ25CLFNBQVM7QUFDVDtBQUNBLFFBQVEsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssS0FBSyxFQUFFO0FBQ3ZDLFlBQVksT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQ25DLFNBQVMsTUFBTTtBQUNmLFlBQVksT0FBTztBQUNuQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtBQUM1QixZQUFZLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLFNBQVMsTUFBTTtBQUNmO0FBQ0EsWUFBWSxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEQsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxDQUFDLHVCQUF1QixHQUFHLFNBQVM7QUFDN0MsUUFBUSw0R0FBNEc7QUFDcEgsWUFBWSwyRkFBMkY7QUFDdkcsWUFBWSw0RkFBNEY7QUFDeEcsUUFBUSxVQUFVLE1BQU0sRUFBRTtBQUMxQixZQUFZLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdFLFNBQVM7QUFDVCxLQUFLLENBQUM7QUFDTjtBQUNBO0FBQ0EsSUFBSSxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixRQUFRLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtBQUN2QixZQUFZLE9BQU8sQ0FBQyxDQUFDO0FBQ3JCLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtBQUN2QixZQUFZLE9BQU8sQ0FBQyxDQUFDO0FBQ3JCLFNBQVM7QUFDVCxRQUFRLE9BQU8sQ0FBQyxDQUFDO0FBQ2pCLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7QUFDdEM7QUFDQSxRQUFRLElBQUksUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzdDLFFBQVEsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO0FBQzVCLFlBQVksT0FBTztBQUNuQixnQkFBZ0IsUUFBUSxDQUFDLGNBQWMsRUFBRTtBQUN6QyxnQkFBZ0IsUUFBUSxDQUFDLFdBQVcsRUFBRTtBQUN0QyxnQkFBZ0IsUUFBUSxDQUFDLFVBQVUsRUFBRTtBQUNyQyxhQUFhLENBQUM7QUFDZCxTQUFTO0FBQ1QsUUFBUSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUNqRixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksU0FBUyxlQUFlLENBQUMsTUFBTSxFQUFFO0FBQ3JDLFFBQVEsSUFBSSxDQUFDO0FBQ2IsWUFBWSxJQUFJO0FBQ2hCLFlBQVksS0FBSyxHQUFHLEVBQUU7QUFDdEIsWUFBWSxXQUFXO0FBQ3ZCLFlBQVksZUFBZTtBQUMzQixZQUFZLFNBQVMsQ0FBQztBQUN0QjtBQUNBLFFBQVEsSUFBSSxNQUFNLENBQUMsRUFBRSxFQUFFO0FBQ3ZCLFlBQVksT0FBTztBQUNuQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQztBQUNBO0FBQ0EsUUFBUSxJQUFJLE1BQU0sQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDOUUsWUFBWSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQyxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVEsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTtBQUN2QyxZQUFZLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNyRTtBQUNBLFlBQVk7QUFDWixnQkFBZ0IsTUFBTSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO0FBQ3pELGdCQUFnQixNQUFNLENBQUMsVUFBVSxLQUFLLENBQUM7QUFDdkMsY0FBYztBQUNkLGdCQUFnQixlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBQ2xFLGFBQWE7QUFDYjtBQUNBLFlBQVksSUFBSSxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNsRSxZQUFZLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2xELFlBQVksTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDaEQsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDeEQsWUFBWSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckQsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzQixZQUFZLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNuQyxnQkFBZ0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsWUFBWSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDbEMsWUFBWSxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDbkMsWUFBWSxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDbkMsWUFBWSxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7QUFDeEMsVUFBVTtBQUNWLFlBQVksTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDbkMsWUFBWSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLGFBQWEsR0FBRyxVQUFVLEVBQUUsS0FBSztBQUN2RSxZQUFZLElBQUk7QUFDaEIsWUFBWSxLQUFLO0FBQ2pCLFNBQVMsQ0FBQztBQUNWLFFBQVEsZUFBZSxHQUFHLE1BQU0sQ0FBQyxPQUFPO0FBQ3hDLGNBQWMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUU7QUFDbkMsY0FBYyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtBQUNqQyxZQUFZLE1BQU0sQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdFLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO0FBQzdCLFlBQVksTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsWUFBWSxNQUFNLENBQUMsRUFBRTtBQUNyQixZQUFZLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssV0FBVztBQUM5QyxZQUFZLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLGVBQWU7QUFDM0MsVUFBVTtBQUNWLFlBQVksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDM0QsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUU7QUFDM0MsUUFBUSxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDO0FBQ2pGO0FBQ0EsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDeEQsWUFBWSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRLEdBQUcsUUFBUTtBQUMvQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUU7QUFDcEIsZ0JBQWdCLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQy9CLGdCQUFnQixVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7QUFDcEQsYUFBYSxDQUFDO0FBQ2QsWUFBWSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEMsWUFBWSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkMsWUFBWSxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRTtBQUM1QyxnQkFBZ0IsZUFBZSxHQUFHLElBQUksQ0FBQztBQUN2QyxhQUFhO0FBQ2IsU0FBUyxNQUFNO0FBQ2YsWUFBWSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQzNDLFlBQVksR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztBQUMzQztBQUNBLFlBQVksT0FBTyxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUQ7QUFDQSxZQUFZLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyRTtBQUNBO0FBQ0EsWUFBWSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DO0FBQ0EsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO0FBQzdCO0FBQ0EsZ0JBQWdCLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLGdCQUFnQixJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRTtBQUNoRCxvQkFBb0IsZUFBZSxHQUFHLElBQUksQ0FBQztBQUMzQyxpQkFBaUI7QUFDakIsYUFBYSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDcEM7QUFDQSxnQkFBZ0IsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3BDLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3hDLG9CQUFvQixlQUFlLEdBQUcsSUFBSSxDQUFDO0FBQzNDLGlCQUFpQjtBQUNqQixhQUFhLE1BQU07QUFDbkI7QUFDQSxnQkFBZ0IsT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUM5QixhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtBQUNoRSxZQUFZLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQzFELFNBQVMsTUFBTSxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUU7QUFDNUMsWUFBWSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQzVELFNBQVMsTUFBTTtBQUNmLFlBQVksSUFBSSxHQUFHLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN6RSxZQUFZLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUMvQyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsWUFBWSxFQUFFLENBQUM7QUFDcEM7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxZQUFZLEVBQUUsQ0FBQztBQUNwQztBQUNBO0FBQ0EsSUFBSSxTQUFTLHlCQUF5QixDQUFDLE1BQU0sRUFBRTtBQUMvQztBQUNBLFFBQVEsSUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxRQUFRLEVBQUU7QUFDMUMsWUFBWSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEMsWUFBWSxPQUFPO0FBQ25CLFNBQVM7QUFDVCxRQUFRLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsUUFBUSxFQUFFO0FBQzFDLFlBQVksaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEMsWUFBWSxPQUFPO0FBQ25CLFNBQVM7QUFDVCxRQUFRLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLFFBQVEsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDN0M7QUFDQTtBQUNBLFFBQVEsSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFO0FBQ25DLFlBQVksQ0FBQztBQUNiLFlBQVksV0FBVztBQUN2QixZQUFZLE1BQU07QUFDbEIsWUFBWSxLQUFLO0FBQ2pCLFlBQVksT0FBTztBQUNuQixZQUFZLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTTtBQUN4QyxZQUFZLHNCQUFzQixHQUFHLENBQUM7QUFDdEMsWUFBWSxHQUFHLENBQUM7QUFDaEI7QUFDQSxRQUFRLE1BQU07QUFDZCxZQUFZLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbEY7QUFDQSxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM1QyxZQUFZLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsWUFBWSxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM3RSxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLFlBQVksSUFBSSxXQUFXLEVBQUU7QUFDN0IsZ0JBQWdCLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDeEUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDeEMsb0JBQW9CLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RFLGlCQUFpQjtBQUNqQixnQkFBZ0IsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLO0FBQ3JDLG9CQUFvQixNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNO0FBQ3BFLGlCQUFpQixDQUFDO0FBQ2xCLGdCQUFnQixzQkFBc0IsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDO0FBQzdELGFBQWE7QUFDYjtBQUNBLFlBQVksSUFBSSxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUM3QyxnQkFBZ0IsSUFBSSxXQUFXLEVBQUU7QUFDakMsb0JBQW9CLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzFELGlCQUFpQixNQUFNO0FBQ3ZCLG9CQUFvQixlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyRSxpQkFBaUI7QUFDakIsZ0JBQWdCLHVCQUF1QixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDcEUsYUFBYSxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUN2RCxnQkFBZ0IsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakUsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYTtBQUM3QyxZQUFZLFlBQVksR0FBRyxzQkFBc0IsQ0FBQztBQUNsRCxRQUFRLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDL0IsWUFBWSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3RCxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVE7QUFDUixZQUFZLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtBQUNqQyxZQUFZLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSTtBQUNwRCxZQUFZLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUMvQixVQUFVO0FBQ1YsWUFBWSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUN4RCxTQUFTO0FBQ1Q7QUFDQSxRQUFRLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckUsUUFBUSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDNUQ7QUFDQSxRQUFRLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsZUFBZTtBQUN6QyxZQUFZLE1BQU0sQ0FBQyxPQUFPO0FBQzFCLFlBQVksTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7QUFDM0IsWUFBWSxNQUFNLENBQUMsU0FBUztBQUM1QixTQUFTLENBQUM7QUFDVjtBQUNBO0FBQ0EsUUFBUSxHQUFHLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMxQyxRQUFRLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtBQUMxQixZQUFZLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNuRixTQUFTO0FBQ1Q7QUFDQSxRQUFRLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoQyxRQUFRLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ3JELFFBQVEsSUFBSSxJQUFJLENBQUM7QUFDakI7QUFDQSxRQUFRLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtBQUM5QjtBQUNBLFlBQVksT0FBTyxJQUFJLENBQUM7QUFDeEIsU0FBUztBQUNULFFBQVEsSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksRUFBRTtBQUN6QyxZQUFZLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDdkQsU0FBUyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUU7QUFDeEM7QUFDQSxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3pDLFlBQVksSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsRUFBRTtBQUNuQyxnQkFBZ0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUMzQixhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLEVBQUU7QUFDdEMsZ0JBQWdCLElBQUksR0FBRyxDQUFDLENBQUM7QUFDekIsYUFBYTtBQUNiLFlBQVksT0FBTyxJQUFJLENBQUM7QUFDeEIsU0FBUyxNQUFNO0FBQ2Y7QUFDQSxZQUFZLE9BQU8sSUFBSSxDQUFDO0FBQ3hCLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksU0FBUyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUU7QUFDOUMsUUFBUSxJQUFJLFVBQVU7QUFDdEIsWUFBWSxVQUFVO0FBQ3RCLFlBQVksV0FBVztBQUN2QixZQUFZLENBQUM7QUFDYixZQUFZLFlBQVk7QUFDeEIsWUFBWSxnQkFBZ0I7QUFDNUIsWUFBWSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDdEM7QUFDQSxRQUFRLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ3BDLFlBQVksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDekQsWUFBWSxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLFlBQVksT0FBTztBQUNuQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDL0MsWUFBWSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLFlBQVksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLFlBQVksVUFBVSxHQUFHLFVBQVUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDaEQsWUFBWSxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFO0FBQ3hDLGdCQUFnQixVQUFVLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDcEQsYUFBYTtBQUNiLFlBQVksVUFBVSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLFlBQVkseUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbEQ7QUFDQSxZQUFZLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQ3JDLGdCQUFnQixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDeEMsYUFBYTtBQUNiO0FBQ0E7QUFDQSxZQUFZLFlBQVksSUFBSSxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsYUFBYSxDQUFDO0FBQ3RFO0FBQ0E7QUFDQSxZQUFZLFlBQVksSUFBSSxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDakY7QUFDQSxZQUFZLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO0FBQzdEO0FBQ0EsWUFBWSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7QUFDcEMsZ0JBQWdCO0FBQ2hCLG9CQUFvQixXQUFXLElBQUksSUFBSTtBQUN2QyxvQkFBb0IsWUFBWSxHQUFHLFdBQVc7QUFDOUMsb0JBQW9CLGdCQUFnQjtBQUNwQyxrQkFBa0I7QUFDbEIsb0JBQW9CLFdBQVcsR0FBRyxZQUFZLENBQUM7QUFDL0Msb0JBQW9CLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDNUMsb0JBQW9CLElBQUksZ0JBQWdCLEVBQUU7QUFDMUMsd0JBQXdCLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUNqRCxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCLGFBQWEsTUFBTTtBQUNuQixnQkFBZ0IsSUFBSSxZQUFZLEdBQUcsV0FBVyxFQUFFO0FBQ2hELG9CQUFvQixXQUFXLEdBQUcsWUFBWSxDQUFDO0FBQy9DLG9CQUFvQixVQUFVLEdBQUcsVUFBVSxDQUFDO0FBQzVDLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsSUFBSSxVQUFVLENBQUMsQ0FBQztBQUNqRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0FBQ3RDLFFBQVEsSUFBSSxNQUFNLENBQUMsRUFBRSxFQUFFO0FBQ3ZCLFlBQVksT0FBTztBQUNuQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7QUFDL0MsWUFBWSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzdELFFBQVEsTUFBTSxDQUFDLEVBQUUsR0FBRyxHQUFHO0FBQ3ZCLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUM7QUFDbkYsWUFBWSxVQUFVLEdBQUcsRUFBRTtBQUMzQixnQkFBZ0IsT0FBTyxHQUFHLElBQUksUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoRCxhQUFhO0FBQ2IsU0FBUyxDQUFDO0FBQ1Y7QUFDQSxRQUFRLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0FBQ3RDLFFBQVEsSUFBSSxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsUUFBUSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7QUFDMUI7QUFDQSxZQUFZLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLFlBQVksR0FBRyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7QUFDckMsU0FBUztBQUNUO0FBQ0EsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNuQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsYUFBYSxDQUFDLE1BQU0sRUFBRTtBQUNuQyxRQUFRLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFO0FBQzdCLFlBQVksTUFBTSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7QUFDL0I7QUFDQSxRQUFRLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hFO0FBQ0EsUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEtBQUssTUFBTSxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDLEVBQUU7QUFDdEUsWUFBWSxPQUFPLGFBQWEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7QUFDdkMsWUFBWSxNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvRCxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzdCLFlBQVksT0FBTyxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNwRCxTQUFTLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDbEMsWUFBWSxNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztBQUM5QixTQUFTLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDcEMsWUFBWSx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3QyxTQUFTLE1BQU0sSUFBSSxNQUFNLEVBQUU7QUFDM0IsWUFBWSx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QyxTQUFTLE1BQU07QUFDZixZQUFZLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwQyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDOUIsWUFBWSxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM3QixTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sTUFBTSxDQUFDO0FBQ3RCLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxlQUFlLENBQUMsTUFBTSxFQUFFO0FBQ3JDLFFBQVEsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztBQUM5QixRQUFRLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ2hDLFlBQVksTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUM5QyxTQUFTLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDbEMsWUFBWSxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELFNBQVMsTUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUM5QyxZQUFZLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDLFNBQVMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNuQyxZQUFZLE1BQU0sQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxHQUFHLEVBQUU7QUFDM0QsZ0JBQWdCLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6QyxhQUFhLENBQUMsQ0FBQztBQUNmLFlBQVksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLFNBQVMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNwQyxZQUFZLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDLFNBQVMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNwQztBQUNBLFlBQVksTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QyxTQUFTLE1BQU07QUFDZixZQUFZLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsRCxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFDcEUsUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbkI7QUFDQSxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO0FBQ2pELFlBQVksTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM1QixZQUFZLE1BQU0sR0FBRyxTQUFTLENBQUM7QUFDL0IsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRTtBQUNqRCxZQUFZLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDNUIsWUFBWSxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBQy9CLFNBQVM7QUFDVDtBQUNBLFFBQVE7QUFDUixZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUM7QUFDcEQsYUFBYSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7QUFDbEQsVUFBVTtBQUNWLFlBQVksS0FBSyxHQUFHLFNBQVMsQ0FBQztBQUM5QixTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVEsQ0FBQyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUNsQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDckMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztBQUN0QixRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7QUFDdEIsUUFBUSxDQUFDLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUMzQjtBQUNBLFFBQVEsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRTtBQUN4RCxRQUFRLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxZQUFZLEdBQUcsU0FBUztBQUNoQyxZQUFZLG9HQUFvRztBQUNoSCxZQUFZLFlBQVk7QUFDeEIsZ0JBQWdCLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9ELGdCQUFnQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7QUFDdkQsb0JBQW9CLE9BQU8sS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ3ZELGlCQUFpQixNQUFNO0FBQ3ZCLG9CQUFvQixPQUFPLGFBQWEsRUFBRSxDQUFDO0FBQzNDLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsWUFBWSxHQUFHLFNBQVM7QUFDaEMsWUFBWSxvR0FBb0c7QUFDaEgsWUFBWSxZQUFZO0FBQ3hCLGdCQUFnQixJQUFJLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMvRCxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFO0FBQ3ZELG9CQUFvQixPQUFPLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUN2RCxpQkFBaUIsTUFBTTtBQUN2QixvQkFBb0IsT0FBTyxhQUFhLEVBQUUsQ0FBQztBQUMzQyxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVMsQ0FBQztBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksU0FBUyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRTtBQUNqQyxRQUFRLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNuQixRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3pELFlBQVksT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtBQUM3QixZQUFZLE9BQU8sV0FBVyxFQUFFLENBQUM7QUFDakMsU0FBUztBQUNULFFBQVEsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtBQUM3QyxZQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQzlELGdCQUFnQixHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLGFBQWE7QUFDYixTQUFTO0FBQ1QsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNuQixLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksU0FBUyxHQUFHLEdBQUc7QUFDbkIsUUFBUSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0M7QUFDQSxRQUFRLE9BQU8sTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsR0FBRyxHQUFHO0FBQ25CLFFBQVEsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9DO0FBQ0EsUUFBUSxPQUFPLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkMsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEdBQUcsR0FBRyxZQUFZO0FBQzFCLFFBQVEsT0FBTyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7QUFDbkQsS0FBSyxDQUFDO0FBQ047QUFDQSxJQUFJLElBQUksUUFBUSxHQUFHO0FBQ25CLFFBQVEsTUFBTTtBQUNkLFFBQVEsU0FBUztBQUNqQixRQUFRLE9BQU87QUFDZixRQUFRLE1BQU07QUFDZCxRQUFRLEtBQUs7QUFDYixRQUFRLE1BQU07QUFDZCxRQUFRLFFBQVE7QUFDaEIsUUFBUSxRQUFRO0FBQ2hCLFFBQVEsYUFBYTtBQUNyQixLQUFLLENBQUM7QUFDTjtBQUNBLElBQUksU0FBUyxlQUFlLENBQUMsQ0FBQyxFQUFFO0FBQ2hDLFFBQVEsSUFBSSxHQUFHO0FBQ2YsWUFBWSxjQUFjLEdBQUcsS0FBSztBQUNsQyxZQUFZLENBQUMsQ0FBQztBQUNkLFFBQVEsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFO0FBQ3ZCLFlBQVk7QUFDWixnQkFBZ0IsVUFBVSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7QUFDbEMsZ0JBQWdCO0FBQ2hCLG9CQUFvQixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEQscUJBQXFCLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEQsaUJBQWlCO0FBQ2pCLGNBQWM7QUFDZCxnQkFBZ0IsT0FBTyxLQUFLLENBQUM7QUFDN0IsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQzlDLFlBQVksSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDaEMsZ0JBQWdCLElBQUksY0FBYyxFQUFFO0FBQ3BDLG9CQUFvQixPQUFPLEtBQUssQ0FBQztBQUNqQyxpQkFBaUI7QUFDakIsZ0JBQWdCLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxRSxvQkFBb0IsY0FBYyxHQUFHLElBQUksQ0FBQztBQUMxQyxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFNBQVMsR0FBRztBQUN6QixRQUFRLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUM3QixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsZUFBZSxHQUFHO0FBQy9CLFFBQVEsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFFBQVEsQ0FBQyxRQUFRLEVBQUU7QUFDaEMsUUFBUSxJQUFJLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7QUFDNUQsWUFBWSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksSUFBSSxDQUFDO0FBQzdDLFlBQVksUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLElBQUksQ0FBQztBQUNuRCxZQUFZLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDL0MsWUFBWSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksSUFBSSxlQUFlLENBQUMsT0FBTyxJQUFJLENBQUM7QUFDeEUsWUFBWSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzNDLFlBQVksS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUM3QyxZQUFZLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxJQUFJLENBQUM7QUFDakQsWUFBWSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sSUFBSSxDQUFDO0FBQ2pELFlBQVksWUFBWSxHQUFHLGVBQWUsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO0FBQzVEO0FBQ0EsUUFBUSxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUN6RDtBQUNBO0FBQ0EsUUFBUSxJQUFJLENBQUMsYUFBYTtBQUMxQixZQUFZLENBQUMsWUFBWTtBQUN6QixZQUFZLE9BQU8sR0FBRyxHQUFHO0FBQ3pCLFlBQVksT0FBTyxHQUFHLEdBQUc7QUFDekIsWUFBWSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkM7QUFDQTtBQUNBLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDM0Q7QUFDQSxRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3hCO0FBQ0EsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsRUFBRSxDQUFDO0FBQ25DO0FBQ0EsUUFBUSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDdkIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUU7QUFDN0IsUUFBUSxPQUFPLEdBQUcsWUFBWSxRQUFRLENBQUM7QUFDdkMsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFFBQVEsQ0FBQyxNQUFNLEVBQUU7QUFDOUIsUUFBUSxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDeEIsWUFBWSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEQsU0FBUyxNQUFNO0FBQ2YsWUFBWSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEMsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtBQUN4RCxRQUFRLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3hELFlBQVksVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ2hFLFlBQVksS0FBSyxHQUFHLENBQUM7QUFDckIsWUFBWSxDQUFDLENBQUM7QUFDZCxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2xDLFlBQVk7QUFDWixnQkFBZ0IsQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDdkQsaUJBQWlCLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkUsY0FBYztBQUNkLGdCQUFnQixLQUFLLEVBQUUsQ0FBQztBQUN4QixhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsT0FBTyxLQUFLLEdBQUcsVUFBVSxDQUFDO0FBQ2xDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUU7QUFDdEMsUUFBUSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtBQUNoRCxZQUFZLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDekMsZ0JBQWdCLElBQUksR0FBRyxHQUFHLENBQUM7QUFDM0IsWUFBWSxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDNUIsZ0JBQWdCLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUNqQyxnQkFBZ0IsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUMzQixhQUFhO0FBQ2IsWUFBWTtBQUNaLGdCQUFnQixJQUFJO0FBQ3BCLGdCQUFnQixRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUMsZ0JBQWdCLFNBQVM7QUFDekIsZ0JBQWdCLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUMsY0FBYztBQUNkLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyQjtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUN6QyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUMxQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxVQUFVLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFDOUIsUUFBUSxNQUFNLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hFLEtBQUssQ0FBQyxDQUFDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQztBQUN4QztBQUNBLElBQUksU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9DLFFBQVEsSUFBSSxPQUFPLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDbkQsWUFBWSxLQUFLO0FBQ2pCLFlBQVksS0FBSztBQUNqQixZQUFZLE9BQU8sQ0FBQztBQUNwQjtBQUNBLFFBQVEsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO0FBQzlCLFlBQVksT0FBTyxJQUFJLENBQUM7QUFDeEIsU0FBUztBQUNUO0FBQ0EsUUFBUSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2xELFFBQVEsS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9ELFFBQVEsT0FBTyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRDtBQUNBLFFBQVEsT0FBTyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQztBQUN6RSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksU0FBUyxlQUFlLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUMzQyxRQUFRLElBQUksR0FBRyxFQUFFLElBQUksQ0FBQztBQUN0QixRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtBQUMxQixZQUFZLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDaEMsWUFBWSxJQUFJO0FBQ2hCLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDO0FBQ2pELHNCQUFzQixLQUFLLENBQUMsT0FBTyxFQUFFO0FBQ3JDLHNCQUFzQixXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3BFO0FBQ0EsWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3BELFlBQVksS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDM0MsWUFBWSxPQUFPLEdBQUcsQ0FBQztBQUN2QixTQUFTLE1BQU07QUFDZixZQUFZLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQzlDLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsYUFBYSxDQUFDLENBQUMsRUFBRTtBQUM5QjtBQUNBO0FBQ0EsUUFBUSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztBQUNyRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLFlBQVksR0FBRyxZQUFZLEVBQUUsQ0FBQztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksU0FBUyxZQUFZLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUU7QUFDN0QsUUFBUSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUM7QUFDdEMsWUFBWSxXQUFXLENBQUM7QUFDeEIsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO0FBQzdCLFlBQVksT0FBTyxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7QUFDOUMsU0FBUztBQUNULFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO0FBQzNCLFlBQVksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7QUFDM0MsZ0JBQWdCLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNsRSxnQkFBZ0IsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO0FBQ3BDLG9CQUFvQixPQUFPLElBQUksQ0FBQztBQUNoQyxpQkFBaUI7QUFDakIsYUFBYSxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDN0QsZ0JBQWdCLEtBQUssR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ25DLGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLGFBQWEsRUFBRTtBQUMvQyxnQkFBZ0IsV0FBVyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsRCxhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUNqQyxZQUFZLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQy9CLFlBQVksSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO0FBQ3JDLGdCQUFnQixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQyxhQUFhO0FBQ2IsWUFBWSxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7QUFDbEMsZ0JBQWdCLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO0FBQzlELG9CQUFvQixXQUFXO0FBQy9CLHdCQUF3QixJQUFJO0FBQzVCLHdCQUF3QixjQUFjLENBQUMsS0FBSyxHQUFHLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFDM0Qsd0JBQXdCLENBQUM7QUFDekIsd0JBQXdCLEtBQUs7QUFDN0IscUJBQXFCLENBQUM7QUFDdEIsaUJBQWlCLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtBQUNwRCxvQkFBb0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUNsRCxvQkFBb0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkQsb0JBQW9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDbEQsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixZQUFZLE9BQU8sSUFBSSxDQUFDO0FBQ3hCLFNBQVMsTUFBTTtBQUNmLFlBQVksT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUQsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxVQUFVLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRTtBQUM5QyxRQUFRLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtBQUMzQixZQUFZLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQzNDLGdCQUFnQixLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDL0IsYUFBYTtBQUNiO0FBQ0EsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztBQUNqRDtBQUNBLFlBQVksT0FBTyxJQUFJLENBQUM7QUFDeEIsU0FBUyxNQUFNO0FBQ2YsWUFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3JDLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsY0FBYyxDQUFDLGFBQWEsRUFBRTtBQUMzQyxRQUFRLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDaEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGdCQUFnQixDQUFDLGFBQWEsRUFBRTtBQUM3QyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUN6QixZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzdDLFlBQVksSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDaEM7QUFDQSxZQUFZLElBQUksYUFBYSxFQUFFO0FBQy9CLGdCQUFnQixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN4RCxhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLHVCQUF1QixHQUFHO0FBQ3ZDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtBQUMvQixZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkQsU0FBUyxNQUFNLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLFFBQVEsRUFBRTtBQUNoRCxZQUFZLElBQUksS0FBSyxHQUFHLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDL0QsWUFBWSxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7QUFDL0IsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEMsYUFBYSxNQUFNO0FBQ25CLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4QyxhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLG9CQUFvQixDQUFDLEtBQUssRUFBRTtBQUN6QyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7QUFDN0IsWUFBWSxPQUFPLEtBQUssQ0FBQztBQUN6QixTQUFTO0FBQ1QsUUFBUSxLQUFLLEdBQUcsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0Q7QUFDQSxRQUFRLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsS0FBSyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDckQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLG9CQUFvQixHQUFHO0FBQ3BDLFFBQVE7QUFDUixZQUFZLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTtBQUNoRSxZQUFZLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTtBQUNoRSxVQUFVO0FBQ1YsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLDJCQUEyQixHQUFHO0FBQzNDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7QUFDOUMsWUFBWSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7QUFDdEMsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ2xCLFlBQVksS0FBSyxDQUFDO0FBQ2xCO0FBQ0EsUUFBUSxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzVCLFFBQVEsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QjtBQUNBLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ2xCLFlBQVksS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25FLFlBQVksSUFBSSxDQUFDLGFBQWE7QUFDOUIsZ0JBQWdCLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0UsU0FBUyxNQUFNO0FBQ2YsWUFBWSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztBQUN2QyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztBQUNsQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsT0FBTyxHQUFHO0FBQ3ZCLFFBQVEsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNyRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsV0FBVyxHQUFHO0FBQzNCLFFBQVEsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDcEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLEtBQUssR0FBRztBQUNyQixRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzFFLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxJQUFJLFdBQVcsR0FBRyx1REFBdUQ7QUFDN0U7QUFDQTtBQUNBO0FBQ0EsUUFBUSxRQUFRLEdBQUcscUtBQXFLLENBQUM7QUFDekw7QUFDQSxJQUFJLFNBQVMsY0FBYyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDeEMsUUFBUSxJQUFJLFFBQVEsR0FBRyxLQUFLO0FBQzVCO0FBQ0EsWUFBWSxLQUFLLEdBQUcsSUFBSTtBQUN4QixZQUFZLElBQUk7QUFDaEIsWUFBWSxHQUFHO0FBQ2YsWUFBWSxPQUFPLENBQUM7QUFDcEI7QUFDQSxRQUFRLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQy9CLFlBQVksUUFBUSxHQUFHO0FBQ3ZCLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxDQUFDLGFBQWE7QUFDdkMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSztBQUM5QixnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPO0FBQ2hDLGFBQWEsQ0FBQztBQUNkLFNBQVMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3RELFlBQVksUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUMxQixZQUFZLElBQUksR0FBRyxFQUFFO0FBQ3JCLGdCQUFnQixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDdkMsYUFBYSxNQUFNO0FBQ25CLGdCQUFnQixRQUFRLENBQUMsWUFBWSxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQy9DLGFBQWE7QUFDYixTQUFTLE1BQU0sS0FBSyxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztBQUN0RCxZQUFZLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QyxZQUFZLFFBQVEsR0FBRztBQUN2QixnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7QUFDcEIsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUM1QyxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJO0FBQzVDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUk7QUFDOUMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUM5QyxnQkFBZ0IsRUFBRSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUNyRSxhQUFhLENBQUM7QUFDZCxTQUFTLE1BQU0sS0FBSyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztBQUNuRCxZQUFZLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QyxZQUFZLFFBQVEsR0FBRztBQUN2QixnQkFBZ0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQzNDLGdCQUFnQixDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDM0MsZ0JBQWdCLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUMzQyxnQkFBZ0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQzNDLGdCQUFnQixDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDM0MsZ0JBQWdCLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUMzQyxnQkFBZ0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQzNDLGFBQWEsQ0FBQztBQUNkLFNBQVMsTUFBTSxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7QUFDckM7QUFDQSxZQUFZLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDMUIsU0FBUyxNQUFNO0FBQ2YsWUFBWSxPQUFPLFFBQVEsS0FBSyxRQUFRO0FBQ3hDLGFBQWEsTUFBTSxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDO0FBQ3BELFVBQVU7QUFDVixZQUFZLE9BQU8sR0FBRyxpQkFBaUI7QUFDdkMsZ0JBQWdCLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO0FBQzFDLGdCQUFnQixXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztBQUN4QyxhQUFhLENBQUM7QUFDZDtBQUNBLFlBQVksUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUMxQixZQUFZLFFBQVEsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUMvQyxZQUFZLFFBQVEsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUN4QyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLEdBQUcsR0FBRyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQztBQUNBLFFBQVEsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRTtBQUMvRCxZQUFZLEdBQUcsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztBQUN4QyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUU7QUFDaEUsWUFBWSxHQUFHLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7QUFDMUMsU0FBUztBQUNUO0FBQ0EsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNuQixLQUFLO0FBQ0w7QUFDQSxJQUFJLGNBQWMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUMzQyxJQUFJLGNBQWMsQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDO0FBQzdDO0FBQ0EsSUFBSSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNEO0FBQ0EsUUFBUSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDO0FBQzdDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ3BELFFBQVEsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JCO0FBQ0EsUUFBUSxHQUFHLENBQUMsTUFBTTtBQUNsQixZQUFZLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM3RSxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUM5RCxZQUFZLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUN6QixTQUFTO0FBQ1Q7QUFDQSxRQUFRLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdkU7QUFDQSxRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQ25CLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQzVDLFFBQVEsSUFBSSxHQUFHLENBQUM7QUFDaEIsUUFBUSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO0FBQ2xELFlBQVksT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ2xELFNBQVM7QUFDVDtBQUNBLFFBQVEsS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDbEMsWUFBWSxHQUFHLEdBQUcseUJBQXlCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pELFNBQVMsTUFBTTtBQUNmLFlBQVksR0FBRyxHQUFHLHlCQUF5QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6RCxZQUFZLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO0FBQ2pELFlBQVksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFDckMsU0FBUztBQUNUO0FBQ0EsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNuQixLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksU0FBUyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRTtBQUMxQyxRQUFRLE9BQU8sVUFBVSxHQUFHLEVBQUUsTUFBTSxFQUFFO0FBQ3RDLFlBQVksSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3pCO0FBQ0EsWUFBWSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNwRCxnQkFBZ0IsZUFBZTtBQUMvQixvQkFBb0IsSUFBSTtBQUN4QixvQkFBb0IsV0FBVztBQUMvQix3QkFBd0IsSUFBSTtBQUM1Qix3QkFBd0Isc0RBQXNEO0FBQzlFLHdCQUF3QixJQUFJO0FBQzVCLHdCQUF3QixvQkFBb0I7QUFDNUMsd0JBQXdCLDhFQUE4RTtBQUN0RyxpQkFBaUIsQ0FBQztBQUNsQixnQkFBZ0IsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUMxQixnQkFBZ0IsR0FBRyxHQUFHLE1BQU0sQ0FBQztBQUM3QixnQkFBZ0IsTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUM3QixhQUFhO0FBQ2I7QUFDQSxZQUFZLEdBQUcsR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzlDLFlBQVksV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDOUMsWUFBWSxPQUFPLElBQUksQ0FBQztBQUN4QixTQUFTLENBQUM7QUFDVixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTtBQUNoRSxRQUFRLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhO0FBQ2pELFlBQVksSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQzNDLFlBQVksTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDaEQ7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7QUFDNUI7QUFDQSxZQUFZLE9BQU87QUFDbkIsU0FBUztBQUNUO0FBQ0EsUUFBUSxZQUFZLEdBQUcsWUFBWSxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsWUFBWSxDQUFDO0FBQ2xFO0FBQ0EsUUFBUSxJQUFJLE1BQU0sRUFBRTtBQUNwQixZQUFZLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUM7QUFDakUsU0FBUztBQUNULFFBQVEsSUFBSSxJQUFJLEVBQUU7QUFDbEIsWUFBWSxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQztBQUNuRSxTQUFTO0FBQ1QsUUFBUSxJQUFJLFlBQVksRUFBRTtBQUMxQixZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsWUFBWSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZFLFNBQVM7QUFDVCxRQUFRLElBQUksWUFBWSxFQUFFO0FBQzFCLFlBQVksS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO0FBQ25DLFFBQVEsUUFBUSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUMvQztBQUNBLElBQUksU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFO0FBQzdCLFFBQVEsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLE1BQU0sQ0FBQztBQUNwRSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksU0FBUyxhQUFhLENBQUMsS0FBSyxFQUFFO0FBQ2xDLFFBQVE7QUFDUixZQUFZLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDM0IsWUFBWSxNQUFNLENBQUMsS0FBSyxDQUFDO0FBQ3pCLFlBQVksUUFBUSxDQUFDLEtBQUssQ0FBQztBQUMzQixZQUFZLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDM0IsWUFBWSxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7QUFDeEMsWUFBWSxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7QUFDdEMsWUFBWSxLQUFLLEtBQUssSUFBSTtBQUMxQixZQUFZLEtBQUssS0FBSyxTQUFTO0FBQy9CLFVBQVU7QUFDVixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsbUJBQW1CLENBQUMsS0FBSyxFQUFFO0FBQ3hDLFFBQVEsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztBQUNqRSxZQUFZLFlBQVksR0FBRyxLQUFLO0FBQ2hDLFlBQVksVUFBVSxHQUFHO0FBQ3pCLGdCQUFnQixPQUFPO0FBQ3ZCLGdCQUFnQixNQUFNO0FBQ3RCLGdCQUFnQixHQUFHO0FBQ25CLGdCQUFnQixRQUFRO0FBQ3hCLGdCQUFnQixPQUFPO0FBQ3ZCLGdCQUFnQixHQUFHO0FBQ25CLGdCQUFnQixNQUFNO0FBQ3RCLGdCQUFnQixLQUFLO0FBQ3JCLGdCQUFnQixHQUFHO0FBQ25CLGdCQUFnQixPQUFPO0FBQ3ZCLGdCQUFnQixNQUFNO0FBQ3RCLGdCQUFnQixHQUFHO0FBQ25CLGdCQUFnQixPQUFPO0FBQ3ZCLGdCQUFnQixNQUFNO0FBQ3RCLGdCQUFnQixHQUFHO0FBQ25CLGdCQUFnQixTQUFTO0FBQ3pCLGdCQUFnQixRQUFRO0FBQ3hCLGdCQUFnQixHQUFHO0FBQ25CLGdCQUFnQixTQUFTO0FBQ3pCLGdCQUFnQixRQUFRO0FBQ3hCLGdCQUFnQixHQUFHO0FBQ25CLGdCQUFnQixjQUFjO0FBQzlCLGdCQUFnQixhQUFhO0FBQzdCLGdCQUFnQixJQUFJO0FBQ3BCLGFBQWE7QUFDYixZQUFZLENBQUM7QUFDYixZQUFZLFFBQVEsQ0FBQztBQUNyQjtBQUNBLFFBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDbkQsWUFBWSxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLFlBQVksWUFBWSxHQUFHLFlBQVksSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZFLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxVQUFVLElBQUksWUFBWSxDQUFDO0FBQzFDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUU7QUFDMUMsUUFBUSxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3RDLFlBQVksWUFBWSxHQUFHLEtBQUssQ0FBQztBQUNqQyxRQUFRLElBQUksU0FBUyxFQUFFO0FBQ3ZCLFlBQVksWUFBWTtBQUN4QixnQkFBZ0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRTtBQUM3QyxvQkFBb0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUQsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLFNBQVM7QUFDVCxRQUFRLE9BQU8sU0FBUyxJQUFJLFlBQVksQ0FBQztBQUN6QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsY0FBYyxDQUFDLEtBQUssRUFBRTtBQUNuQyxRQUFRLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7QUFDakUsWUFBWSxZQUFZLEdBQUcsS0FBSztBQUNoQyxZQUFZLFVBQVUsR0FBRztBQUN6QixnQkFBZ0IsU0FBUztBQUN6QixnQkFBZ0IsU0FBUztBQUN6QixnQkFBZ0IsU0FBUztBQUN6QixnQkFBZ0IsVUFBVTtBQUMxQixnQkFBZ0IsVUFBVTtBQUMxQixnQkFBZ0IsVUFBVTtBQUMxQixhQUFhO0FBQ2IsWUFBWSxDQUFDO0FBQ2IsWUFBWSxRQUFRLENBQUM7QUFDckI7QUFDQSxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ25ELFlBQVksUUFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxZQUFZLFlBQVksR0FBRyxZQUFZLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN2RSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sVUFBVSxJQUFJLFlBQVksQ0FBQztBQUMxQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtBQUM5QyxRQUFRLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRCxRQUFRLE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN4QixjQUFjLFVBQVU7QUFDeEIsY0FBYyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLGNBQWMsVUFBVTtBQUN4QixjQUFjLElBQUksR0FBRyxDQUFDO0FBQ3RCLGNBQWMsU0FBUztBQUN2QixjQUFjLElBQUksR0FBRyxDQUFDO0FBQ3RCLGNBQWMsU0FBUztBQUN2QixjQUFjLElBQUksR0FBRyxDQUFDO0FBQ3RCLGNBQWMsU0FBUztBQUN2QixjQUFjLElBQUksR0FBRyxDQUFDO0FBQ3RCLGNBQWMsVUFBVTtBQUN4QixjQUFjLFVBQVUsQ0FBQztBQUN6QixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDdkM7QUFDQSxRQUFRLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDcEMsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQy9CLGdCQUFnQixJQUFJLEdBQUcsU0FBUyxDQUFDO0FBQ2pDLGdCQUFnQixPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQ3BDLGFBQWEsTUFBTSxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNwRCxnQkFBZ0IsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxnQkFBZ0IsT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUNwQyxhQUFhLE1BQU0sSUFBSSxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDckQsZ0JBQWdCLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsZ0JBQWdCLElBQUksR0FBRyxTQUFTLENBQUM7QUFDakMsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksV0FBVyxFQUFFO0FBQ3ZDLFlBQVksR0FBRyxHQUFHLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUMzRCxZQUFZLE1BQU0sR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxVQUFVO0FBQ2xFLFlBQVksTUFBTTtBQUNsQixnQkFBZ0IsT0FBTztBQUN2QixpQkFBaUIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM1QyxzQkFBc0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO0FBQ3JELHNCQUFzQixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUN2QztBQUNBLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBTTtBQUMxQixZQUFZLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hGLFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxLQUFLLEdBQUc7QUFDckIsUUFBUSxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUNuQyxRQUFRLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtBQUN2RCxZQUFZLE9BQU8sS0FBSyxDQUFDO0FBQ3pCLFNBQVM7QUFDVCxRQUFRLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksYUFBYSxDQUFDO0FBQ3ZELFFBQVEsSUFBSSxLQUFLLEtBQUssYUFBYSxFQUFFO0FBQ3JDLFlBQVksT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3pELFNBQVMsTUFBTTtBQUNmLFlBQVksT0FBTyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNoRixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQ3BDLFFBQVEsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEUsUUFBUSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO0FBQ3ZELFlBQVksT0FBTyxLQUFLLENBQUM7QUFDekIsU0FBUztBQUNULFFBQVEsS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUM7QUFDdkQsUUFBUSxJQUFJLEtBQUssS0FBSyxhQUFhLEVBQUU7QUFDckMsWUFBWSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDekQsU0FBUyxNQUFNO0FBQ2YsWUFBWSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQzlFLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRTtBQUNyRCxRQUFRLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztBQUNqRSxZQUFZLE9BQU8sR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxRCxRQUFRLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO0FBQzNFLFlBQVksT0FBTyxLQUFLLENBQUM7QUFDekIsU0FBUztBQUNULFFBQVEsV0FBVyxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUM7QUFDMUMsUUFBUTtBQUNSLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztBQUNuQyxrQkFBa0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDO0FBQ2hELGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQztBQUNsRCxhQUFhLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHO0FBQ25DLGtCQUFrQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7QUFDL0Msa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDaEQsVUFBVTtBQUNWLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUNsQyxRQUFRLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztBQUNyRSxZQUFZLE9BQU8sQ0FBQztBQUNwQixRQUFRLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7QUFDdkQsWUFBWSxPQUFPLEtBQUssQ0FBQztBQUN6QixTQUFTO0FBQ1QsUUFBUSxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQztBQUN2RCxRQUFRLElBQUksS0FBSyxLQUFLLGFBQWEsRUFBRTtBQUNyQyxZQUFZLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUMzRCxTQUFTLE1BQU07QUFDZixZQUFZLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDM0MsWUFBWTtBQUNaLGdCQUFnQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLE9BQU87QUFDaEUsZ0JBQWdCLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRTtBQUM5RCxjQUFjO0FBQ2QsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxhQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUN6QyxRQUFRLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkUsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQzFDLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4RSxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO0FBQ3pDLFFBQVEsSUFBSSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQztBQUNwQztBQUNBLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtBQUM3QixZQUFZLE9BQU8sR0FBRyxDQUFDO0FBQ3ZCLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUM7QUFDQSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7QUFDN0IsWUFBWSxPQUFPLEdBQUcsQ0FBQztBQUN2QixTQUFTO0FBQ1Q7QUFDQSxRQUFRLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2hFO0FBQ0EsUUFBUSxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RDO0FBQ0EsUUFBUSxRQUFRLEtBQUs7QUFDckIsWUFBWSxLQUFLLE1BQU07QUFDdkIsZ0JBQWdCLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNwRCxnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssT0FBTztBQUN4QixnQkFBZ0IsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0MsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLFNBQVM7QUFDMUIsZ0JBQWdCLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuRCxnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssUUFBUTtBQUN6QixnQkFBZ0IsTUFBTSxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxHQUFHLENBQUM7QUFDN0MsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLFFBQVE7QUFDekIsZ0JBQWdCLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksR0FBRyxDQUFDO0FBQzdDLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxNQUFNO0FBQ3ZCLGdCQUFnQixNQUFNLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQztBQUM5QyxnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssS0FBSztBQUN0QixnQkFBZ0IsTUFBTSxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxTQUFTLElBQUksS0FBSyxDQUFDO0FBQzNELGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxNQUFNO0FBQ3ZCLGdCQUFnQixNQUFNLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDNUQsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWTtBQUNaLGdCQUFnQixNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNyQyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sT0FBTyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbkQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO0FBQ2pDO0FBQ0E7QUFDQSxZQUFZLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2pGO0FBQ0EsWUFBWSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDO0FBQzVELFlBQVksT0FBTztBQUNuQixZQUFZLE1BQU0sQ0FBQztBQUNuQjtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUM1QixZQUFZLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDbEU7QUFDQSxZQUFZLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLEtBQUssTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZELFNBQVMsTUFBTTtBQUNmLFlBQVksT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNsRTtBQUNBLFlBQVksTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sS0FBSyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDdkQsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRLE9BQU8sRUFBRSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DLEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxDQUFDLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQztBQUNqRCxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQztBQUN0RDtBQUNBLElBQUksU0FBUyxRQUFRLEdBQUc7QUFDeEIsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUFDcEYsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFdBQVcsQ0FBQyxVQUFVLEVBQUU7QUFDckMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO0FBQzdCLFlBQVksT0FBTyxJQUFJLENBQUM7QUFDeEIsU0FBUztBQUNULFFBQVEsSUFBSSxHQUFHLEdBQUcsVUFBVSxLQUFLLElBQUk7QUFDckMsWUFBWSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEQsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksRUFBRTtBQUM3QyxZQUFZLE9BQU8sWUFBWTtBQUMvQixnQkFBZ0IsQ0FBQztBQUNqQixnQkFBZ0IsR0FBRztBQUNuQixzQkFBc0IsZ0NBQWdDO0FBQ3RELHNCQUFzQiw4QkFBOEI7QUFDcEQsYUFBYSxDQUFDO0FBQ2QsU0FBUztBQUNULFFBQVEsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtBQUNwRDtBQUNBLFlBQVksSUFBSSxHQUFHLEVBQUU7QUFDckIsZ0JBQWdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ25ELGFBQWEsTUFBTTtBQUNuQixnQkFBZ0IsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDOUUscUJBQXFCLFdBQVcsRUFBRTtBQUNsQyxxQkFBcUIsT0FBTyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLE9BQU8sWUFBWTtBQUMzQixZQUFZLENBQUM7QUFDYixZQUFZLEdBQUcsR0FBRyw4QkFBOEIsR0FBRyw0QkFBNEI7QUFDL0UsU0FBUyxDQUFDO0FBQ1YsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLE9BQU8sR0FBRztBQUN2QixRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7QUFDN0IsWUFBWSxPQUFPLG9CQUFvQixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBQzNELFNBQVM7QUFDVCxRQUFRLElBQUksSUFBSSxHQUFHLFFBQVE7QUFDM0IsWUFBWSxJQUFJLEdBQUcsRUFBRTtBQUNyQixZQUFZLE1BQU07QUFDbEIsWUFBWSxJQUFJO0FBQ2hCLFlBQVksUUFBUTtBQUNwQixZQUFZLE1BQU0sQ0FBQztBQUNuQixRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7QUFDN0IsWUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxZQUFZLEdBQUcsa0JBQWtCLENBQUM7QUFDOUUsWUFBWSxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ3ZCLFNBQVM7QUFDVCxRQUFRLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUNwQyxRQUFRLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQztBQUMzRSxRQUFRLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQztBQUMzQyxRQUFRLE1BQU0sR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBQy9CO0FBQ0EsUUFBUSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDOUQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLE1BQU0sQ0FBQyxXQUFXLEVBQUU7QUFDakMsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQzFCLFlBQVksV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDdEMsa0JBQWtCLEtBQUssQ0FBQyxnQkFBZ0I7QUFDeEMsa0JBQWtCLEtBQUssQ0FBQyxhQUFhLENBQUM7QUFDdEMsU0FBUztBQUNULFFBQVEsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNyRCxRQUFRLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7QUFDdkMsUUFBUTtBQUNSLFlBQVksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUMxQixhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDL0UsVUFBVTtBQUNWLFlBQVksT0FBTyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMzRCxpQkFBaUIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN0QyxpQkFBaUIsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDMUMsU0FBUyxNQUFNO0FBQ2YsWUFBWSxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuRCxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLE9BQU8sQ0FBQyxhQUFhLEVBQUU7QUFDcEMsUUFBUSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDdkQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO0FBQ3JDLFFBQVE7QUFDUixZQUFZLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDMUIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQy9FLFVBQVU7QUFDVixZQUFZLE9BQU8sY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDM0QsaUJBQWlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDdEMsaUJBQWlCLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQzFDLFNBQVMsTUFBTTtBQUNmLFlBQVksT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDbkQsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxLQUFLLENBQUMsYUFBYSxFQUFFO0FBQ2xDLFFBQVEsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3JELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFO0FBQ3pCLFFBQVEsSUFBSSxhQUFhLENBQUM7QUFDMUI7QUFDQSxRQUFRLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTtBQUMvQixZQUFZLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDdEMsU0FBUyxNQUFNO0FBQ2YsWUFBWSxhQUFhLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNDLFlBQVksSUFBSSxhQUFhLElBQUksSUFBSSxFQUFFO0FBQ3ZDLGdCQUFnQixJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQztBQUM3QyxhQUFhO0FBQ2IsWUFBWSxPQUFPLElBQUksQ0FBQztBQUN4QixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLElBQUksR0FBRyxTQUFTO0FBQ3hCLFFBQVEsaUpBQWlKO0FBQ3pKLFFBQVEsVUFBVSxHQUFHLEVBQUU7QUFDdkIsWUFBWSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7QUFDbkMsZ0JBQWdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3pDLGFBQWEsTUFBTTtBQUNuQixnQkFBZ0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hDLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSyxDQUFDO0FBQ047QUFDQSxJQUFJLFNBQVMsVUFBVSxHQUFHO0FBQzFCLFFBQVEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQzVCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxhQUFhLEdBQUcsSUFBSTtBQUM1QixRQUFRLGFBQWEsR0FBRyxFQUFFLEdBQUcsYUFBYTtBQUMxQyxRQUFRLFdBQVcsR0FBRyxFQUFFLEdBQUcsYUFBYTtBQUN4QyxRQUFRLGdCQUFnQixHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLFdBQVcsQ0FBQztBQUMvRDtBQUNBO0FBQ0EsSUFBSSxTQUFTLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFO0FBQ3RDLFFBQVEsT0FBTyxDQUFDLENBQUMsUUFBUSxHQUFHLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDO0FBQzFELEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN2QztBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDL0I7QUFDQSxZQUFZLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7QUFDOUQsU0FBUyxNQUFNO0FBQ2YsWUFBWSxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDL0MsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckM7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQy9CO0FBQ0EsWUFBWSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7QUFDOUQsU0FBUyxNQUFNO0FBQ2YsWUFBWSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyQyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDNUIsUUFBUSxJQUFJLElBQUksRUFBRSxXQUFXLENBQUM7QUFDOUIsUUFBUSxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7QUFDL0UsWUFBWSxPQUFPLElBQUksQ0FBQztBQUN4QixTQUFTO0FBQ1Q7QUFDQSxRQUFRLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQztBQUN0RTtBQUNBLFFBQVEsUUFBUSxLQUFLO0FBQ3JCLFlBQVksS0FBSyxNQUFNO0FBQ3ZCLGdCQUFnQixJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEQsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLFNBQVM7QUFDMUIsZ0JBQWdCLElBQUksR0FBRyxXQUFXO0FBQ2xDLG9CQUFvQixJQUFJLENBQUMsSUFBSSxFQUFFO0FBQy9CLG9CQUFvQixJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyRCxvQkFBb0IsQ0FBQztBQUNyQixpQkFBaUIsQ0FBQztBQUNsQixnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssT0FBTztBQUN4QixnQkFBZ0IsSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxNQUFNO0FBQ3ZCLGdCQUFnQixJQUFJLEdBQUcsV0FBVztBQUNsQyxvQkFBb0IsSUFBSSxDQUFDLElBQUksRUFBRTtBQUMvQixvQkFBb0IsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNoQyxvQkFBb0IsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDaEQsaUJBQWlCLENBQUM7QUFDbEIsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLFNBQVM7QUFDMUIsZ0JBQWdCLElBQUksR0FBRyxXQUFXO0FBQ2xDLG9CQUFvQixJQUFJLENBQUMsSUFBSSxFQUFFO0FBQy9CLG9CQUFvQixJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ2hDLG9CQUFvQixJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN6RCxpQkFBaUIsQ0FBQztBQUNsQixnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssS0FBSyxDQUFDO0FBQ3ZCLFlBQVksS0FBSyxNQUFNO0FBQ3ZCLGdCQUFnQixJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDM0UsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLE1BQU07QUFDdkIsZ0JBQWdCLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3pDLGdCQUFnQixJQUFJLElBQUksS0FBSztBQUM3QixvQkFBb0IsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxhQUFhLENBQUM7QUFDL0Usb0JBQW9CLFdBQVc7QUFDL0IsaUJBQWlCLENBQUM7QUFDbEIsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLFFBQVE7QUFDekIsZ0JBQWdCLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3pDLGdCQUFnQixJQUFJLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztBQUNuRCxnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssUUFBUTtBQUN6QixnQkFBZ0IsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDekMsZ0JBQWdCLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ25ELGdCQUFnQixNQUFNO0FBQ3RCLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUIsUUFBUSxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2QyxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFO0FBQzFCLFFBQVEsSUFBSSxJQUFJLEVBQUUsV0FBVyxDQUFDO0FBQzlCLFFBQVEsS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QyxRQUFRLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO0FBQy9FLFlBQVksT0FBTyxJQUFJLENBQUM7QUFDeEIsU0FBUztBQUNUO0FBQ0EsUUFBUSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7QUFDdEU7QUFDQSxRQUFRLFFBQVEsS0FBSztBQUNyQixZQUFZLEtBQUssTUFBTTtBQUN2QixnQkFBZ0IsSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUQsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLFNBQVM7QUFDMUIsZ0JBQWdCLElBQUk7QUFDcEIsb0JBQW9CLFdBQVc7QUFDL0Isd0JBQXdCLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDbkMsd0JBQXdCLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUM3RCx3QkFBd0IsQ0FBQztBQUN6QixxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDMUIsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLE9BQU87QUFDeEIsZ0JBQWdCLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pFLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxNQUFNO0FBQ3ZCLGdCQUFnQixJQUFJO0FBQ3BCLG9CQUFvQixXQUFXO0FBQy9CLHdCQUF3QixJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ25DLHdCQUF3QixJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ3BDLHdCQUF3QixJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUM7QUFDeEQscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxTQUFTO0FBQzFCLGdCQUFnQixJQUFJO0FBQ3BCLG9CQUFvQixXQUFXO0FBQy9CLHdCQUF3QixJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ25DLHdCQUF3QixJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ3BDLHdCQUF3QixJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDakUscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxLQUFLLENBQUM7QUFDdkIsWUFBWSxLQUFLLE1BQU07QUFDdkIsZ0JBQWdCLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25GLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxNQUFNO0FBQ3ZCLGdCQUFnQixJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN6QyxnQkFBZ0IsSUFBSTtBQUNwQixvQkFBb0IsV0FBVztBQUMvQixvQkFBb0IsS0FBSztBQUN6Qix3QkFBd0IsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxhQUFhLENBQUM7QUFDbkYsd0JBQXdCLFdBQVc7QUFDbkMscUJBQXFCO0FBQ3JCLG9CQUFvQixDQUFDLENBQUM7QUFDdEIsZ0JBQWdCLE1BQU07QUFDdEIsWUFBWSxLQUFLLFFBQVE7QUFDekIsZ0JBQWdCLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3pDLGdCQUFnQixJQUFJLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZFLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxRQUFRO0FBQ3pCLGdCQUFnQixJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN6QyxnQkFBZ0IsSUFBSSxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2RSxnQkFBZ0IsTUFBTTtBQUN0QixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLFFBQVEsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkMsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsT0FBTyxHQUFHO0FBQ3ZCLFFBQVEsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDO0FBQy9ELEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxJQUFJLEdBQUc7QUFDcEIsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2pELEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxNQUFNLEdBQUc7QUFDdEIsUUFBUSxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxPQUFPLEdBQUc7QUFDdkIsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckIsUUFBUSxPQUFPO0FBQ2YsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFO0FBQ3BCLFlBQVksQ0FBQyxDQUFDLEtBQUssRUFBRTtBQUNyQixZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUU7QUFDcEIsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFO0FBQ3BCLFlBQVksQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUN0QixZQUFZLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDdEIsWUFBWSxDQUFDLENBQUMsV0FBVyxFQUFFO0FBQzNCLFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxRQUFRLEdBQUc7QUFDeEIsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckIsUUFBUSxPQUFPO0FBQ2YsWUFBWSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRTtBQUMzQixZQUFZLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFO0FBQzdCLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7QUFDMUIsWUFBWSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRTtBQUM1QixZQUFZLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFO0FBQ2hDLFlBQVksT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUU7QUFDaEMsWUFBWSxZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVksRUFBRTtBQUMxQyxTQUFTLENBQUM7QUFDVixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsTUFBTSxHQUFHO0FBQ3RCO0FBQ0EsUUFBUSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzFELEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxTQUFTLEdBQUc7QUFDekIsUUFBUSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsWUFBWSxHQUFHO0FBQzVCLFFBQVEsT0FBTyxNQUFNLENBQUMsRUFBRSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2pELEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxTQUFTLEdBQUc7QUFDekIsUUFBUSxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDOUMsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFlBQVksR0FBRztBQUM1QixRQUFRLE9BQU87QUFDZixZQUFZLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtBQUMxQixZQUFZLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtBQUMzQixZQUFZLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztBQUNoQyxZQUFZLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTTtBQUM5QixZQUFZLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztBQUNoQyxTQUFTLENBQUM7QUFDVixLQUFLO0FBQ0w7QUFDQSxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN6QyxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxQyxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMzQyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM1QyxJQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMvQztBQUNBLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDbkQsSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRCxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2xELElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDbkQ7QUFDQSxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDckMsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RDLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN2QyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDeEMsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQzNDO0FBQ0EsSUFBSSxhQUFhLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUU7QUFDdkQsUUFBUSxLQUFLO0FBQ2IsUUFBUSxLQUFLO0FBQ2IsUUFBUSxNQUFNO0FBQ2QsUUFBUSxLQUFLO0FBQ2IsTUFBTTtBQUNOLFFBQVEsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekUsUUFBUSxJQUFJLEdBQUcsRUFBRTtBQUNqQixZQUFZLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzlDLFNBQVMsTUFBTTtBQUNmLFlBQVksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDdkQsU0FBUztBQUNULEtBQUssQ0FBQyxDQUFDO0FBQ1A7QUFDQSxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDdEMsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3ZDLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztBQUN4QyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDekMsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7QUFDN0M7QUFDQSxJQUFJLGFBQWEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3BELElBQUksYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFDakUsUUFBUSxJQUFJLEtBQUssQ0FBQztBQUNsQixRQUFRLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRTtBQUNqRCxZQUFZLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNyRSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTtBQUNoRCxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMzRSxTQUFTLE1BQU07QUFDZixZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlDLFNBQVM7QUFDVCxLQUFLLENBQUMsQ0FBQztBQUNQO0FBQ0EsSUFBSSxTQUFTLFVBQVUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFO0FBQ25DLFFBQVEsSUFBSSxDQUFDO0FBQ2IsWUFBWSxDQUFDO0FBQ2IsWUFBWSxJQUFJO0FBQ2hCLFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN2RCxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ2pELFlBQVksUUFBUSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO0FBQ3hDLGdCQUFnQixLQUFLLFFBQVE7QUFDN0I7QUFDQSxvQkFBb0IsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9ELG9CQUFvQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNuRCxvQkFBb0IsTUFBTTtBQUMxQixhQUFhO0FBQ2I7QUFDQSxZQUFZLFFBQVEsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztBQUN4QyxnQkFBZ0IsS0FBSyxXQUFXO0FBQ2hDLG9CQUFvQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsUUFBUSxDQUFDO0FBQzlDLG9CQUFvQixNQUFNO0FBQzFCLGdCQUFnQixLQUFLLFFBQVE7QUFDN0I7QUFDQSxvQkFBb0IsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3pFLG9CQUFvQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNuRCxvQkFBb0IsTUFBTTtBQUMxQixhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGVBQWUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRTtBQUN0RCxRQUFRLElBQUksQ0FBQztBQUNiLFlBQVksQ0FBQztBQUNiLFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDOUIsWUFBWSxJQUFJO0FBQ2hCLFlBQVksSUFBSTtBQUNoQixZQUFZLE1BQU0sQ0FBQztBQUNuQixRQUFRLE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDeEM7QUFDQSxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ2pELFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDOUMsWUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUM5QyxZQUFZLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2xEO0FBQ0EsWUFBWSxJQUFJLE1BQU0sRUFBRTtBQUN4QixnQkFBZ0IsUUFBUSxNQUFNO0FBQzlCLG9CQUFvQixLQUFLLEdBQUcsQ0FBQztBQUM3QixvQkFBb0IsS0FBSyxJQUFJLENBQUM7QUFDOUIsb0JBQW9CLEtBQUssS0FBSztBQUM5Qix3QkFBd0IsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFO0FBQzlDLDRCQUE0QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQyx5QkFBeUI7QUFDekIsd0JBQXdCLE1BQU07QUFDOUI7QUFDQSxvQkFBb0IsS0FBSyxNQUFNO0FBQy9CLHdCQUF3QixJQUFJLElBQUksS0FBSyxPQUFPLEVBQUU7QUFDOUMsNEJBQTRCLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLHlCQUF5QjtBQUN6Qix3QkFBd0IsTUFBTTtBQUM5QjtBQUNBLG9CQUFvQixLQUFLLE9BQU87QUFDaEMsd0JBQXdCLElBQUksTUFBTSxLQUFLLE9BQU8sRUFBRTtBQUNoRCw0QkFBNEIsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MseUJBQXlCO0FBQ3pCLHdCQUF3QixNQUFNO0FBQzlCLGlCQUFpQjtBQUNqQixhQUFhLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNuRSxnQkFBZ0IsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMscUJBQXFCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRTtBQUM5QyxRQUFRLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRCxRQUFRLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUNoQyxZQUFZLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUMzQyxTQUFTLE1BQU07QUFDZixZQUFZLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUN2RSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFVBQVUsR0FBRztBQUMxQixRQUFRLElBQUksQ0FBQztBQUNiLFlBQVksQ0FBQztBQUNiLFlBQVksR0FBRztBQUNmLFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM1QyxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ2pEO0FBQ0EsWUFBWSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN4RDtBQUNBLFlBQVksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtBQUM5RCxnQkFBZ0IsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3BDLGFBQWE7QUFDYixZQUFZLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7QUFDOUQsZ0JBQWdCLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNwQyxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsUUFBUSxPQUFPLEVBQUUsQ0FBQztBQUNsQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsWUFBWSxHQUFHO0FBQzVCLFFBQVEsSUFBSSxDQUFDO0FBQ2IsWUFBWSxDQUFDO0FBQ2IsWUFBWSxHQUFHO0FBQ2YsWUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzVDLFFBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDakQ7QUFDQSxZQUFZLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3hEO0FBQ0EsWUFBWSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO0FBQzlELGdCQUFnQixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDdEMsYUFBYTtBQUNiLFlBQVksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtBQUM5RCxnQkFBZ0IsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3RDLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sRUFBRSxDQUFDO0FBQ2xCLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxVQUFVLEdBQUc7QUFDMUIsUUFBUSxJQUFJLENBQUM7QUFDYixZQUFZLENBQUM7QUFDYixZQUFZLEdBQUc7QUFDZixZQUFZLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDNUMsUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtBQUNqRDtBQUNBLFlBQVksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDeEQ7QUFDQSxZQUFZLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7QUFDOUQsZ0JBQWdCLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNwQyxhQUFhO0FBQ2IsWUFBWSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO0FBQzlELGdCQUFnQixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEMsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxFQUFFLENBQUM7QUFDbEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFVBQVUsR0FBRztBQUMxQixRQUFRLElBQUksQ0FBQztBQUNiLFlBQVksQ0FBQztBQUNiLFlBQVksR0FBRztBQUNmLFlBQVksR0FBRztBQUNmLFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM1QyxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ2pELFlBQVksR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzRDtBQUNBO0FBQ0EsWUFBWSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN4RDtBQUNBLFlBQVk7QUFDWixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7QUFDN0QsaUJBQWlCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzlELGNBQWM7QUFDZCxnQkFBZ0I7QUFDaEIsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRztBQUNyRSxvQkFBb0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07QUFDbEMsa0JBQWtCO0FBQ2xCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzNCLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxhQUFhLENBQUMsUUFBUSxFQUFFO0FBQ3JDLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsRUFBRTtBQUNqRCxZQUFZLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxTQUFTO0FBQ1QsUUFBUSxPQUFPLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDaEUsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGFBQWEsQ0FBQyxRQUFRLEVBQUU7QUFDckMsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFO0FBQ2pELFlBQVksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hDLFNBQVM7QUFDVCxRQUFRLE9BQU8sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUNoRSxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsZUFBZSxDQUFDLFFBQVEsRUFBRTtBQUN2QyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLEVBQUU7QUFDbkQsWUFBWSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEMsU0FBUztBQUNULFFBQVEsT0FBTyxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDbEUsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFO0FBQzVDLFFBQVEsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzlDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRTtBQUM1QyxRQUFRLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM5QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUU7QUFDOUMsUUFBUSxPQUFPLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUU7QUFDbkQsUUFBUSxPQUFPLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSSxhQUFhLENBQUM7QUFDNUQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGdCQUFnQixHQUFHO0FBQ2hDLFFBQVEsSUFBSSxVQUFVLEdBQUcsRUFBRTtBQUMzQixZQUFZLFVBQVUsR0FBRyxFQUFFO0FBQzNCLFlBQVksWUFBWSxHQUFHLEVBQUU7QUFDN0IsWUFBWSxXQUFXLEdBQUcsRUFBRTtBQUM1QixZQUFZLENBQUM7QUFDYixZQUFZLENBQUM7QUFDYixZQUFZLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDL0I7QUFDQSxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ2pELFlBQVksVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkQsWUFBWSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2RCxZQUFZLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNEO0FBQ0EsWUFBWSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN4RCxZQUFZLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3hELFlBQVksV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDMUQsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM5RSxRQUFRLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2pGLFFBQVEsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDakYsUUFBUSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxNQUFNO0FBQzFDLFlBQVksSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRztBQUMvQyxZQUFZLEdBQUc7QUFDZixTQUFTLENBQUM7QUFDVixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsSUFBSSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZO0FBQ2hELFFBQVEsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JDLEtBQUssQ0FBQyxDQUFDO0FBQ1A7QUFDQSxJQUFJLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVk7QUFDaEQsUUFBUSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDeEMsS0FBSyxDQUFDLENBQUM7QUFDUDtBQUNBLElBQUksU0FBUyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQ25ELFFBQVEsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzVELEtBQUs7QUFDTDtBQUNBLElBQUksc0JBQXNCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQy9DLElBQUksc0JBQXNCLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2hELElBQUksc0JBQXNCLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ2xELElBQUksc0JBQXNCLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuQyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsSUFBSSxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25DLElBQUksZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0QztBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDcEMsSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDM0MsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMzQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDN0MsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzlDO0FBQ0EsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFO0FBQzFELFFBQVEsS0FBSztBQUNiLFFBQVEsSUFBSTtBQUNaLFFBQVEsTUFBTTtBQUNkLFFBQVEsS0FBSztBQUNiLE1BQU07QUFDTixRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRCxLQUFLLENBQUMsQ0FBQztBQUNQO0FBQ0EsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxVQUFVLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUMxRSxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckQsS0FBSyxDQUFDLENBQUM7QUFDUDtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsY0FBYyxDQUFDLEtBQUssRUFBRTtBQUNuQyxRQUFRLE9BQU8sb0JBQW9CLENBQUMsSUFBSTtBQUN4QyxZQUFZLElBQUk7QUFDaEIsWUFBWSxLQUFLO0FBQ2pCLFlBQVksSUFBSSxDQUFDLElBQUksRUFBRTtBQUN2QixZQUFZLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDMUIsWUFBWSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUc7QUFDdkMsWUFBWSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUc7QUFDdkMsU0FBUyxDQUFDO0FBQ1YsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGlCQUFpQixDQUFDLEtBQUssRUFBRTtBQUN0QyxRQUFRLE9BQU8sb0JBQW9CLENBQUMsSUFBSTtBQUN4QyxZQUFZLElBQUk7QUFDaEIsWUFBWSxLQUFLO0FBQ2pCLFlBQVksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUMxQixZQUFZLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDN0IsWUFBWSxDQUFDO0FBQ2IsWUFBWSxDQUFDO0FBQ2IsU0FBUyxDQUFDO0FBQ1YsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGlCQUFpQixHQUFHO0FBQ2pDLFFBQVEsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsd0JBQXdCLEdBQUc7QUFDeEMsUUFBUSxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JELEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxjQUFjLEdBQUc7QUFDOUIsUUFBUSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO0FBQy9DLFFBQVEsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BFLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxrQkFBa0IsR0FBRztBQUNsQyxRQUFRLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7QUFDL0MsUUFBUSxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEUsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLG9CQUFvQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDbEUsUUFBUSxJQUFJLFdBQVcsQ0FBQztBQUN4QixRQUFRLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtBQUMzQixZQUFZLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ25ELFNBQVMsTUFBTTtBQUNmLFlBQVksV0FBVyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZELFlBQVksSUFBSSxJQUFJLEdBQUcsV0FBVyxFQUFFO0FBQ3BDLGdCQUFnQixJQUFJLEdBQUcsV0FBVyxDQUFDO0FBQ25DLGFBQWE7QUFDYixZQUFZLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3pFLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDM0QsUUFBUSxJQUFJLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ2pGLFlBQVksSUFBSSxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDakY7QUFDQSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7QUFDekMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUNyQyxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM1QztBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsSUFBSSxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMvQixJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsVUFBVSxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQy9DLFFBQVEsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUMsS0FBSyxDQUFDLENBQUM7QUFDUDtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRTtBQUNsQyxRQUFRLE9BQU8sS0FBSyxJQUFJLElBQUk7QUFDNUIsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsY0FBYyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0EsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlCO0FBQ0E7QUFDQSxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2xDLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDM0MsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRTtBQUNwRDtBQUNBLFFBQVEsT0FBTyxRQUFRO0FBQ3ZCLGNBQWMsTUFBTSxDQUFDLHVCQUF1QixJQUFJLE1BQU0sQ0FBQyxhQUFhO0FBQ3BFLGNBQWMsTUFBTSxDQUFDLDhCQUE4QixDQUFDO0FBQ3BELEtBQUssQ0FBQyxDQUFDO0FBQ1A7QUFDQSxJQUFJLGFBQWEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNyQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQ2hELFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsS0FBSyxDQUFDLENBQUM7QUFDUDtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRDtBQUNBO0FBQ0E7QUFDQSxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLElBQUksWUFBWSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNyQztBQUNBO0FBQ0EsSUFBSSxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNwQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbEMsSUFBSSxhQUFhLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsVUFBVSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtBQUNuRSxRQUFRLE1BQU0sQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLEtBQUssQ0FBQyxDQUFDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksU0FBUyxlQUFlLENBQUMsS0FBSyxFQUFFO0FBQ3BDLFFBQVEsSUFBSSxTQUFTO0FBQ3JCLFlBQVksSUFBSSxDQUFDLEtBQUs7QUFDdEIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUs7QUFDcEYsYUFBYSxHQUFHLENBQUMsQ0FBQztBQUNsQixRQUFRLE9BQU8sS0FBSyxJQUFJLElBQUksR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVFLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLElBQUksWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNoQztBQUNBO0FBQ0E7QUFDQSxJQUFJLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2xDLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDM0MsSUFBSSxhQUFhLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLFlBQVksR0FBRyxVQUFVLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsQztBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDbEMsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMzQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN2QztBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksWUFBWSxHQUFHLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtBQUMxQyxRQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM1QyxLQUFLLENBQUMsQ0FBQztBQUNQO0FBQ0EsSUFBSSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZO0FBQ2hELFFBQVEsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLEtBQUssQ0FBQyxDQUFDO0FBQ1A7QUFDQSxJQUFJLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3BELElBQUksY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtBQUNsRCxRQUFRLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtBQUNuRCxRQUFRLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN4QyxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtBQUNwRCxRQUFRLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN6QyxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtBQUNyRCxRQUFRLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQztBQUMxQyxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtBQUN0RCxRQUFRLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQztBQUMzQyxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtBQUN2RCxRQUFRLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUM1QyxLQUFLLENBQUMsQ0FBQztBQUNQO0FBQ0E7QUFDQTtBQUNBLElBQUksWUFBWSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QztBQUNBO0FBQ0E7QUFDQSxJQUFJLGVBQWUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMxQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzNDLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUM7QUFDQSxJQUFJLElBQUksS0FBSyxFQUFFLGlCQUFpQixDQUFDO0FBQ2pDLElBQUksS0FBSyxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxHQUFHLEVBQUU7QUFDMUQsUUFBUSxhQUFhLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzVDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUNuQyxRQUFRLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQzFELEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxLQUFLLEdBQUcsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxHQUFHLEVBQUU7QUFDdkQsUUFBUSxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLEtBQUs7QUFDTDtBQUNBLElBQUksaUJBQWlCLEdBQUcsVUFBVSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxRDtBQUNBO0FBQ0E7QUFDQSxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUMxQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsV0FBVyxHQUFHO0FBQzNCLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDeEMsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFdBQVcsR0FBRztBQUMzQixRQUFRLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyw0QkFBNEIsR0FBRyxFQUFFLENBQUM7QUFDL0QsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0FBQ2pDO0FBQ0EsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNwQixJQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0FBQ2hDLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDeEIsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN0QixJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDMUIsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN0QixJQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzVCLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEIsSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN4QixJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDO0FBQzFCLElBQUksS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDaEMsSUFBSSxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUM1QixJQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQzlCLElBQUksS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDaEMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUMxQixJQUFJLEtBQUssQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQ3hDLElBQUksS0FBSyxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7QUFDMUMsSUFBSSxLQUFLLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUM5QixJQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDMUIsSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUNsQyxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDO0FBQzdCLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUM7QUFDN0IsSUFBSSxLQUFLLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztBQUN0QyxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDO0FBQzFCLElBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDNUIsSUFBSSxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM5QixJQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzVCLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDOUIsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUMxQixJQUFJLEtBQUssQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0FBQ3BDLElBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDNUIsSUFBSSxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRTtBQUM3RCxRQUFRLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUMsR0FBRyxZQUFZO0FBQ3RFLFlBQVksT0FBTyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNuRCxTQUFTLENBQUM7QUFDVixLQUFLO0FBQ0wsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUMxQixJQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQzlCLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDdEIsSUFBSSxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUM1QixJQUFJLEtBQUssQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ3RDLElBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7QUFDL0IsSUFBSSxLQUFLLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztBQUNuQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0FBQy9CLElBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7QUFDL0IsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztBQUM1QixJQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO0FBQ3JDLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUM7QUFDcEMsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDO0FBQzFDLElBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQztBQUNuRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO0FBQzlCLElBQUksS0FBSyxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7QUFDdkMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO0FBQzFDLElBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQztBQUNuRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO0FBQ3ZDLElBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUMvQyxJQUFJLEtBQUssQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQUM7QUFDN0MsSUFBSSxLQUFLLENBQUMscUJBQXFCLEdBQUcsd0JBQXdCLENBQUM7QUFDM0QsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0FBQ2xDLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztBQUM3QyxJQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUcscUJBQXFCLENBQUM7QUFDMUMsSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLElBQUksS0FBSyxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7QUFDdEMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO0FBQzFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQztBQUNoRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUM7QUFDaEQsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLEdBQUcsaUJBQWlCLENBQUM7QUFDL0QsSUFBSSxLQUFLLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztBQUNuQyxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDO0FBQy9CLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztBQUNuQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsdUJBQXVCLENBQUM7QUFDOUMsSUFBSSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7QUFDdEQsSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFHLG9CQUFvQixDQUFDO0FBQ3ZDLElBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDNUIsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztBQUNwQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDeEIsSUFBSSxLQUFLLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQztBQUNqQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO0FBQ2pDLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxTQUFTO0FBQzNCLFFBQVEsaURBQWlEO0FBQ3pELFFBQVEsZ0JBQWdCO0FBQ3hCLEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTO0FBQzVCLFFBQVEsa0RBQWtEO0FBQzFELFFBQVEsV0FBVztBQUNuQixLQUFLLENBQUM7QUFDTixJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUztBQUMzQixRQUFRLGdEQUFnRDtBQUN4RCxRQUFRLFVBQVU7QUFDbEIsS0FBSyxDQUFDO0FBQ04sSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLFNBQVM7QUFDMUIsUUFBUSwwR0FBMEc7QUFDbEgsUUFBUSxVQUFVO0FBQ2xCLEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxDQUFDLFlBQVksR0FBRyxTQUFTO0FBQ2xDLFFBQVEseUdBQXlHO0FBQ2pILFFBQVEsMkJBQTJCO0FBQ25DLEtBQUssQ0FBQztBQUNOO0FBQ0EsSUFBSSxTQUFTLFVBQVUsQ0FBQyxLQUFLLEVBQUU7QUFDL0IsUUFBUSxPQUFPLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDekMsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFlBQVksR0FBRztBQUM1QixRQUFRLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDOUQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtBQUN4QyxRQUFRLE9BQU8sTUFBTSxDQUFDO0FBQ3RCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUNuQztBQUNBLElBQUksT0FBTyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDaEMsSUFBSSxPQUFPLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztBQUM1QyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0FBQ3RDLElBQUksT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDOUIsSUFBSSxPQUFPLENBQUMsUUFBUSxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLElBQUksT0FBTyxDQUFDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztBQUM1QyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ3hDLElBQUksT0FBTyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDcEMsSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN0QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO0FBQzlCLElBQUksT0FBTyxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7QUFDeEMsSUFBSSxPQUFPLENBQUMsZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBQ3BELElBQUksT0FBTyxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7QUFDMUMsSUFBSSxPQUFPLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztBQUMxQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0FBQzlDO0FBQ0EsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztBQUNsQyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7QUFDNUMsSUFBSSxPQUFPLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDO0FBQzVDLElBQUksT0FBTyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7QUFDdEMsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7QUFDaEQsSUFBSSxPQUFPLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztBQUM5QixJQUFJLE9BQU8sQ0FBQyxjQUFjLEdBQUcsb0JBQW9CLENBQUM7QUFDbEQsSUFBSSxPQUFPLENBQUMsY0FBYyxHQUFHLG9CQUFvQixDQUFDO0FBQ2xEO0FBQ0EsSUFBSSxPQUFPLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQztBQUN0QyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7QUFDNUMsSUFBSSxPQUFPLENBQUMsYUFBYSxHQUFHLG1CQUFtQixDQUFDO0FBQ2hELElBQUksT0FBTyxDQUFDLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQztBQUNoRDtBQUNBLElBQUksT0FBTyxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7QUFDMUMsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7QUFDcEQsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7QUFDaEQ7QUFDQSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO0FBQzlCLElBQUksT0FBTyxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUM7QUFDdEM7QUFDQSxJQUFJLFNBQVMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtBQUNqRCxRQUFRLElBQUksTUFBTSxHQUFHLFNBQVMsRUFBRTtBQUNoQyxZQUFZLEdBQUcsR0FBRyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2pELFFBQVEsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzFDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDbEQsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUM5QixZQUFZLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDM0IsWUFBWSxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBQy9CLFNBQVM7QUFDVDtBQUNBLFFBQVEsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDOUI7QUFDQSxRQUFRLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtBQUMzQixZQUFZLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3hELFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDO0FBQ2IsWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JCLFFBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDakMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELFNBQVM7QUFDVCxRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQ25CLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQ2xFLFFBQVEsSUFBSSxPQUFPLFlBQVksS0FBSyxTQUFTLEVBQUU7QUFDL0MsWUFBWSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNsQyxnQkFBZ0IsS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUMvQixnQkFBZ0IsTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUNuQyxhQUFhO0FBQ2I7QUFDQSxZQUFZLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ2xDLFNBQVMsTUFBTTtBQUNmLFlBQVksTUFBTSxHQUFHLFlBQVksQ0FBQztBQUNsQyxZQUFZLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDM0IsWUFBWSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQ2pDO0FBQ0EsWUFBWSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNsQyxnQkFBZ0IsS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUMvQixnQkFBZ0IsTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUNuQyxhQUFhO0FBQ2I7QUFDQSxZQUFZLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ2xDLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxNQUFNLEdBQUcsU0FBUyxFQUFFO0FBQ2hDLFlBQVksS0FBSyxHQUFHLFlBQVksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3ZELFlBQVksQ0FBQztBQUNiLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyQjtBQUNBLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO0FBQzNCLFlBQVksT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BFLFNBQVM7QUFDVDtBQUNBLFFBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDaEMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNsRSxTQUFTO0FBQ1QsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNuQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFDdkMsUUFBUSxPQUFPLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZELEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUM1QyxRQUFRLE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDNUQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLFlBQVksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUN2RCxRQUFRLE9BQU8sZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDekUsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGlCQUFpQixDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQzVELFFBQVEsT0FBTyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztBQUM5RSxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsZUFBZSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQzFELFFBQVEsT0FBTyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztBQUM1RSxLQUFLO0FBQ0w7QUFDQSxJQUFJLGtCQUFrQixDQUFDLElBQUksRUFBRTtBQUM3QixRQUFRLElBQUksRUFBRTtBQUNkLFlBQVk7QUFDWixnQkFBZ0IsS0FBSyxFQUFFLFlBQVk7QUFDbkMsZ0JBQWdCLEtBQUssRUFBRSxDQUFDLFFBQVE7QUFDaEMsZ0JBQWdCLE1BQU0sRUFBRSxDQUFDO0FBQ3pCLGdCQUFnQixJQUFJLEVBQUUsYUFBYTtBQUNuQyxnQkFBZ0IsTUFBTSxFQUFFLElBQUk7QUFDNUIsZ0JBQWdCLElBQUksRUFBRSxJQUFJO0FBQzFCLGFBQWE7QUFDYixZQUFZO0FBQ1osZ0JBQWdCLEtBQUssRUFBRSxZQUFZO0FBQ25DLGdCQUFnQixLQUFLLEVBQUUsQ0FBQyxRQUFRO0FBQ2hDLGdCQUFnQixNQUFNLEVBQUUsQ0FBQztBQUN6QixnQkFBZ0IsSUFBSSxFQUFFLGVBQWU7QUFDckMsZ0JBQWdCLE1BQU0sRUFBRSxJQUFJO0FBQzVCLGdCQUFnQixJQUFJLEVBQUUsSUFBSTtBQUMxQixhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsc0JBQXNCLEVBQUUsc0JBQXNCO0FBQ3RELFFBQVEsT0FBTyxFQUFFLFVBQVUsTUFBTSxFQUFFO0FBQ25DLFlBQVksSUFBSSxDQUFDLEdBQUcsTUFBTSxHQUFHLEVBQUU7QUFDL0IsZ0JBQWdCLE1BQU07QUFDdEIsb0JBQW9CLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztBQUNwRCwwQkFBMEIsSUFBSTtBQUM5QiwwQkFBMEIsQ0FBQyxLQUFLLENBQUM7QUFDakMsMEJBQTBCLElBQUk7QUFDOUIsMEJBQTBCLENBQUMsS0FBSyxDQUFDO0FBQ2pDLDBCQUEwQixJQUFJO0FBQzlCLDBCQUEwQixDQUFDLEtBQUssQ0FBQztBQUNqQywwQkFBMEIsSUFBSTtBQUM5QiwwQkFBMEIsSUFBSSxDQUFDO0FBQy9CLFlBQVksT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ25DLFNBQVM7QUFDVCxLQUFLLENBQUMsQ0FBQztBQUNQO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxTQUFTO0FBQzFCLFFBQVEsdURBQXVEO0FBQy9ELFFBQVEsa0JBQWtCO0FBQzFCLEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTO0FBQzlCLFFBQVEsK0RBQStEO0FBQ3ZFLFFBQVEsU0FBUztBQUNqQixLQUFLLENBQUM7QUFDTjtBQUNBLElBQUksSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUMzQjtBQUNBLElBQUksU0FBUyxHQUFHLEdBQUc7QUFDbkIsUUFBUSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQzlCO0FBQ0EsUUFBUSxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDekQsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekMsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0M7QUFDQSxRQUFRLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN2RCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QyxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QyxRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6QyxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzQyxRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6QztBQUNBLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGFBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7QUFDOUQsUUFBUSxJQUFJLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2pEO0FBQ0EsUUFBUSxRQUFRLENBQUMsYUFBYSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO0FBQ2xFLFFBQVEsUUFBUSxDQUFDLEtBQUssSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUNsRCxRQUFRLFFBQVEsQ0FBQyxPQUFPLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDdEQ7QUFDQSxRQUFRLE9BQU8sUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ2xDLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQ2pDLFFBQVEsT0FBTyxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEQsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLFNBQVMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDdEMsUUFBUSxPQUFPLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQzdCLFFBQVEsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3hCLFlBQVksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RDLFNBQVMsTUFBTTtBQUNmLFlBQVksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsTUFBTSxHQUFHO0FBQ3RCLFFBQVEsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWE7QUFDN0MsWUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUs7QUFDN0IsWUFBWSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU87QUFDakMsWUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUs7QUFDN0IsWUFBWSxPQUFPO0FBQ25CLFlBQVksT0FBTztBQUNuQixZQUFZLEtBQUs7QUFDakIsWUFBWSxLQUFLO0FBQ2pCLFlBQVksY0FBYyxDQUFDO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixZQUFZO0FBQ1osZ0JBQWdCLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDO0FBQzlELGlCQUFpQixZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQztBQUMvRCxhQUFhO0FBQ2IsVUFBVTtBQUNWLFlBQVksWUFBWSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3pFLFlBQVksSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNyQixZQUFZLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDdkIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQ2hEO0FBQ0EsUUFBUSxPQUFPLEdBQUcsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNoRCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNwQztBQUNBLFFBQVEsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDekMsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDcEM7QUFDQSxRQUFRLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ2hDO0FBQ0EsUUFBUSxJQUFJLElBQUksUUFBUSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNyQztBQUNBO0FBQ0EsUUFBUSxjQUFjLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsTUFBTSxJQUFJLGNBQWMsQ0FBQztBQUNqQyxRQUFRLElBQUksSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDdEQ7QUFDQTtBQUNBLFFBQVEsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDdEMsUUFBUSxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ3JCO0FBQ0EsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQzdCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0I7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFO0FBQ2hDO0FBQ0E7QUFDQSxRQUFRLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLE1BQU0sQ0FBQztBQUN0QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsWUFBWSxDQUFDLE1BQU0sRUFBRTtBQUNsQztBQUNBLFFBQVEsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDO0FBQ3hDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFO0FBQ3ZCLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtBQUM3QixZQUFZLE9BQU8sR0FBRyxDQUFDO0FBQ3ZCLFNBQVM7QUFDVCxRQUFRLElBQUksSUFBSTtBQUNoQixZQUFZLE1BQU07QUFDbEIsWUFBWSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztBQUM5QztBQUNBLFFBQVEsS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QztBQUNBLFFBQVEsSUFBSSxLQUFLLEtBQUssT0FBTyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRTtBQUMxRSxZQUFZLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxLQUFLLENBQUM7QUFDckQsWUFBWSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkQsWUFBWSxRQUFRLEtBQUs7QUFDekIsZ0JBQWdCLEtBQUssT0FBTztBQUM1QixvQkFBb0IsT0FBTyxNQUFNLENBQUM7QUFDbEMsZ0JBQWdCLEtBQUssU0FBUztBQUM5QixvQkFBb0IsT0FBTyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLGdCQUFnQixLQUFLLE1BQU07QUFDM0Isb0JBQW9CLE9BQU8sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxhQUFhO0FBQ2IsU0FBUyxNQUFNO0FBQ2Y7QUFDQSxZQUFZLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLFlBQVksUUFBUSxLQUFLO0FBQ3pCLGdCQUFnQixLQUFLLE1BQU07QUFDM0Isb0JBQW9CLE9BQU8sSUFBSSxHQUFHLENBQUMsR0FBRyxZQUFZLEdBQUcsTUFBTSxDQUFDO0FBQzVELGdCQUFnQixLQUFLLEtBQUs7QUFDMUIsb0JBQW9CLE9BQU8sSUFBSSxHQUFHLFlBQVksR0FBRyxLQUFLLENBQUM7QUFDdkQsZ0JBQWdCLEtBQUssTUFBTTtBQUMzQixvQkFBb0IsT0FBTyxJQUFJLEdBQUcsRUFBRSxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDM0QsZ0JBQWdCLEtBQUssUUFBUTtBQUM3QixvQkFBb0IsT0FBTyxJQUFJLEdBQUcsSUFBSSxHQUFHLFlBQVksR0FBRyxHQUFHLENBQUM7QUFDNUQsZ0JBQWdCLEtBQUssUUFBUTtBQUM3QixvQkFBb0IsT0FBTyxJQUFJLEdBQUcsS0FBSyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDOUQ7QUFDQSxnQkFBZ0IsS0FBSyxhQUFhO0FBQ2xDLG9CQUFvQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUNuRSxnQkFBZ0I7QUFDaEIsb0JBQW9CLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzdELGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtBQUM3QixZQUFZLE9BQU8sR0FBRyxDQUFDO0FBQ3ZCLFNBQVM7QUFDVCxRQUFRO0FBQ1IsWUFBWSxJQUFJLENBQUMsYUFBYTtBQUM5QixZQUFZLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSztBQUM5QixZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLElBQUksTUFBTTtBQUN4QyxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU87QUFDOUMsVUFBVTtBQUNWLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxNQUFNLENBQUMsS0FBSyxFQUFFO0FBQzNCLFFBQVEsT0FBTyxZQUFZO0FBQzNCLFlBQVksT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUNyQyxRQUFRLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQy9CLFFBQVEsU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDL0IsUUFBUSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUM3QixRQUFRLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQzVCLFFBQVEsT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDN0IsUUFBUSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUM5QixRQUFRLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQ2hDLFFBQVEsT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5QjtBQUNBLElBQUksU0FBUyxPQUFPLEdBQUc7QUFDdkIsUUFBUSxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRTtBQUMxQixRQUFRLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEMsUUFBUSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQzFELEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQzlCLFFBQVEsT0FBTyxZQUFZO0FBQzNCLFlBQVksT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDM0QsU0FBUyxDQUFDO0FBQ1YsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLFlBQVksR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDO0FBQ2pELFFBQVEsT0FBTyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7QUFDdkMsUUFBUSxPQUFPLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztBQUN2QyxRQUFRLEtBQUssR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7QUFDakMsUUFBUSxNQUFNLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztBQUNyQyxRQUFRLEtBQUssR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEM7QUFDQSxJQUFJLFNBQVMsS0FBSyxHQUFHO0FBQ3JCLFFBQVEsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUs7QUFDMUIsUUFBUSxVQUFVLEdBQUc7QUFDckIsWUFBWSxFQUFFLEVBQUUsRUFBRTtBQUNsQixZQUFZLENBQUMsRUFBRSxFQUFFO0FBQ2pCLFlBQVksQ0FBQyxFQUFFLEVBQUU7QUFDakIsWUFBWSxDQUFDLEVBQUUsRUFBRTtBQUNqQixZQUFZLENBQUMsRUFBRSxFQUFFO0FBQ2pCLFlBQVksQ0FBQyxFQUFFLElBQUk7QUFDbkIsWUFBWSxDQUFDLEVBQUUsRUFBRTtBQUNqQixTQUFTLENBQUM7QUFDVjtBQUNBO0FBQ0EsSUFBSSxTQUFTLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUU7QUFDaEYsUUFBUSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNuRixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsY0FBYyxDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTtBQUMvRSxRQUFRLElBQUksUUFBUSxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLEVBQUU7QUFDM0QsWUFBWSxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0MsWUFBWSxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0MsWUFBWSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsWUFBWSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsWUFBWSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUMsWUFBWSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsWUFBWSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsWUFBWSxDQUFDO0FBQ2IsZ0JBQWdCLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO0FBQzNELGlCQUFpQixPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzRCxpQkFBaUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLGlCQUFpQixPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzRCxpQkFBaUIsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLGlCQUFpQixLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RCxpQkFBaUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLGlCQUFpQixJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3REO0FBQ0EsUUFBUSxJQUFJLFVBQVUsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO0FBQ2xDLFlBQVksQ0FBQztBQUNiLGdCQUFnQixDQUFDO0FBQ2pCLGlCQUFpQixLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckMsaUJBQWlCLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEQsU0FBUztBQUNULFFBQVEsQ0FBQyxHQUFHLENBQUM7QUFDYixhQUFhLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxhQUFhLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3JELGFBQWEsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbkQ7QUFDQSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUM7QUFDN0IsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN0QixRQUFRLE9BQU8saUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoRCxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksU0FBUywwQkFBMEIsQ0FBQyxnQkFBZ0IsRUFBRTtBQUMxRCxRQUFRLElBQUksZ0JBQWdCLEtBQUssU0FBUyxFQUFFO0FBQzVDLFlBQVksT0FBTyxLQUFLLENBQUM7QUFDekIsU0FBUztBQUNULFFBQVEsSUFBSSxPQUFPLGdCQUFnQixLQUFLLFVBQVUsRUFBRTtBQUNwRCxZQUFZLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztBQUNyQyxZQUFZLE9BQU8sSUFBSSxDQUFDO0FBQ3hCLFNBQVM7QUFDVCxRQUFRLE9BQU8sS0FBSyxDQUFDO0FBQ3JCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxTQUFTLDJCQUEyQixDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUU7QUFDM0QsUUFBUSxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxTQUFTLEVBQUU7QUFDakQsWUFBWSxPQUFPLEtBQUssQ0FBQztBQUN6QixTQUFTO0FBQ1QsUUFBUSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDakMsWUFBWSxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6QyxTQUFTO0FBQ1QsUUFBUSxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3RDLFFBQVEsSUFBSSxTQUFTLEtBQUssR0FBRyxFQUFFO0FBQy9CLFlBQVksVUFBVSxDQUFDLEVBQUUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLFNBQVM7QUFDVCxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxRQUFRLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRTtBQUNwRCxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7QUFDN0IsWUFBWSxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuRCxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksVUFBVSxHQUFHLEtBQUs7QUFDOUIsWUFBWSxFQUFFLEdBQUcsVUFBVTtBQUMzQixZQUFZLE1BQU07QUFDbEIsWUFBWSxNQUFNLENBQUM7QUFDbkI7QUFDQSxRQUFRLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO0FBQy9DLFlBQVksYUFBYSxHQUFHLGFBQWEsQ0FBQztBQUMxQyxZQUFZLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFDbEMsU0FBUztBQUNULFFBQVEsSUFBSSxPQUFPLGFBQWEsS0FBSyxTQUFTLEVBQUU7QUFDaEQsWUFBWSxVQUFVLEdBQUcsYUFBYSxDQUFDO0FBQ3ZDLFNBQVM7QUFDVCxRQUFRLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO0FBQy9DLFlBQVksRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUM5RCxZQUFZLElBQUksYUFBYSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksYUFBYSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUU7QUFDckUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUMsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNuQyxRQUFRLE1BQU0sR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMvRDtBQUNBLFFBQVEsSUFBSSxVQUFVLEVBQUU7QUFDeEIsWUFBWSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0RCxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDekI7QUFDQSxJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUNyQixRQUFRLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsYUFBYSxHQUFHO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO0FBQzdCLFlBQVksT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDbkQsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUk7QUFDdEQsWUFBWSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDcEMsWUFBWSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDeEMsWUFBWSxPQUFPO0FBQ25CLFlBQVksS0FBSztBQUNqQixZQUFZLEtBQUs7QUFDakIsWUFBWSxDQUFDO0FBQ2IsWUFBWSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUNwQyxZQUFZLFNBQVM7QUFDckIsWUFBWSxNQUFNO0FBQ2xCLFlBQVksUUFBUTtBQUNwQixZQUFZLE9BQU8sQ0FBQztBQUNwQjtBQUNBLFFBQVEsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNwQjtBQUNBO0FBQ0EsWUFBWSxPQUFPLEtBQUssQ0FBQztBQUN6QixTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVEsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDekMsUUFBUSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN2QyxRQUFRLE9BQU8sSUFBSSxFQUFFLENBQUM7QUFDdEIsUUFBUSxPQUFPLElBQUksRUFBRSxDQUFDO0FBQ3RCO0FBQ0E7QUFDQSxRQUFRLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNyQjtBQUNBO0FBQ0EsUUFBUSxDQUFDLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEU7QUFDQSxRQUFRLFNBQVMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDekMsUUFBUSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUMvRCxRQUFRLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQy9ELFFBQVEsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDdEU7QUFDQSxRQUFRO0FBQ1IsWUFBWSxTQUFTO0FBQ3JCLFlBQVksR0FBRztBQUNmLGFBQWEsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUMvQyxhQUFhLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDakQsYUFBYSxJQUFJLEdBQUcsUUFBUSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQy9DLGFBQWEsS0FBSyxJQUFJLE9BQU8sSUFBSSxPQUFPLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNwRCxhQUFhLEtBQUssR0FBRyxPQUFPLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDaEQsYUFBYSxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3BELGFBQWEsT0FBTyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUM5QyxVQUFVO0FBQ1YsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO0FBQ3JDO0FBQ0EsSUFBSSxPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUNoQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLElBQUksT0FBTyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFDeEIsSUFBSSxPQUFPLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztBQUNsQyxJQUFJLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLElBQUksT0FBTyxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7QUFDNUMsSUFBSSxPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUNsQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0FBQ2xDLElBQUksT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDOUIsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM1QixJQUFJLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzlCLElBQUksT0FBTyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDaEMsSUFBSSxPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUNwQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzlCLElBQUksT0FBTyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDaEMsSUFBSSxPQUFPLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUM3QixJQUFJLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBQzVCLElBQUksT0FBTyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFDeEIsSUFBSSxPQUFPLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztBQUN4QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzlCLElBQUksT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDOUIsSUFBSSxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMxQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLElBQUksT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDMUIsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM1QixJQUFJLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzFCLElBQUksT0FBTyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDaEMsSUFBSSxPQUFPLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQztBQUN4QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDO0FBQ3JDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7QUFDbkMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM1QixJQUFJLE9BQU8sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBQ3BDO0FBQ0EsSUFBSSxPQUFPLENBQUMsV0FBVyxHQUFHLFNBQVM7QUFDbkMsUUFBUSxxRkFBcUY7QUFDN0YsUUFBUSxhQUFhO0FBQ3JCLEtBQUssQ0FBQztBQUNOLElBQUksT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdEMsSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDekM7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLElBQUksYUFBYSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUN2QyxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsVUFBVSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtBQUN2RCxRQUFRLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3ZELEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFLFVBQVUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDdkQsUUFBUSxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzNDLEtBQUssQ0FBQyxDQUFDO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsSUFBSSxLQUFLLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUM3QjtBQUNBLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2pDO0FBQ0EsSUFBSSxLQUFLLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztBQUNyQixJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDcEIsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNwQixJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDO0FBQzFCLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7QUFDNUIsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztBQUM5QixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQzFCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQztBQUN0QyxJQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDO0FBQ2xDLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUM7QUFDcEMsSUFBSSxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM5QixJQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDO0FBQ2xDLElBQUksS0FBSyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUM7QUFDbkMsSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztBQUNqQyxJQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBQ2xDLElBQUksS0FBSyxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUM7QUFDeEMsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQztBQUN4QyxJQUFJLEtBQUssQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ3RDLElBQUksS0FBSyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7QUFDdEMsSUFBSSxLQUFLLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQztBQUNoQyxJQUFJLEtBQUssQ0FBQyxhQUFhLEdBQUcsaUJBQWlCLENBQUM7QUFDNUMsSUFBSSxLQUFLLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztBQUMxQyxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsR0FBRywwQkFBMEIsQ0FBQztBQUM1RCxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsR0FBRywyQkFBMkIsQ0FBQztBQUM5RCxJQUFJLEtBQUssQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQUM7QUFDN0MsSUFBSSxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztBQUM1QjtBQUNBO0FBQ0EsSUFBSSxLQUFLLENBQUMsU0FBUyxHQUFHO0FBQ3RCLFFBQVEsY0FBYyxFQUFFLGtCQUFrQjtBQUMxQyxRQUFRLHNCQUFzQixFQUFFLHFCQUFxQjtBQUNyRCxRQUFRLGlCQUFpQixFQUFFLHlCQUF5QjtBQUNwRCxRQUFRLElBQUksRUFBRSxZQUFZO0FBQzFCLFFBQVEsSUFBSSxFQUFFLE9BQU87QUFDckIsUUFBUSxZQUFZLEVBQUUsVUFBVTtBQUNoQyxRQUFRLE9BQU8sRUFBRSxjQUFjO0FBQy9CLFFBQVEsSUFBSSxFQUFFLFlBQVk7QUFDMUIsUUFBUSxLQUFLLEVBQUUsU0FBUztBQUN4QixLQUFLLENBQUM7QUFDTjtBQUNBLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakI7QUFDQSxDQUFDLEVBQUU7OztNQ2xpTFVDLFVBQVE7SUFzQm5CLFlBQW9CLElBQW1CLEVBQVUsWUFBcUI7UUFBbEQsU0FBSSxHQUFKLElBQUksQ0FBZTtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFTO0tBQUs7SUFyQnBFLE9BQU8sR0FBRztRQUNmLE9BQU8sSUFBSUEsVUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ3JDO0lBRU0sT0FBTyxLQUFLLENBQUMsSUFBWTtRQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFO1lBQ3BCLE9BQU8sSUFBSUEsVUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM3RDthQUFNO1lBQ0wsT0FBTyxJQUFJQSxVQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN4RDtLQUNGO0lBRU0sT0FBTyxRQUFRLENBQ3BCLElBQWMsRUFDZCxFQUFZLEVBQ1osSUFBVSxFQUNWLFdBQWtCO1FBRWxCLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUMxRTtJQUlNLGVBQWUsQ0FBQyxXQUFrQjtRQUN2QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDOUM7SUFFTSxNQUFNLENBQUMsTUFBYyxFQUFFLFdBQWtCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkQ7SUFFTSxVQUFVLENBQUMsV0FBa0I7UUFDbEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUN6RDtJQUVNLFVBQVUsQ0FBQyxXQUFrQjtRQUNsQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ3pEO0lBRU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFVLEVBQUUsV0FBa0I7UUFDdkQsT0FBTyxJQUFJQSxVQUFRLENBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFDckQsSUFBSSxDQUFDLFlBQVksQ0FDbEIsQ0FBQztLQUNIO0lBRU8sU0FBUyxDQUFDLFdBQWtCO1FBQ2xDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDbEI7UUFDRCxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQzlEO0lBRUQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztLQUMxQjtJQUVNLE1BQU07UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7S0FDbEI7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQzVCO0lBRU0sS0FBSyxDQUFDLFdBQXFCO1FBQ2hDLE1BQU0sWUFBWSxHQUFHLFdBQVcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDM0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQyxPQUFPLElBQUlBLFVBQVEsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDMUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3hDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDbEM7S0FDRjtJQUVNLE1BQU0sQ0FBQyxJQUFjO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsWUFBWTtlQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEM7Q0FDRjtNQUVZQyxNQUFJO0lBbUJmLFlBQTRCLElBQVksRUFBVSxNQUFjO1FBQXBDLFNBQUksR0FBSixJQUFJLENBQVE7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO0tBQUs7SUFsQjlELE9BQU8sS0FBSyxDQUFDLElBQVk7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNwQyxNQUFNLDBCQUEwQixJQUFJLHdCQUF3QixDQUFDO1NBQzlEO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLE1BQU0sMEJBQTBCLElBQUkseUJBQXlCLENBQUM7U0FDL0Q7UUFDRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDO1FBQy9CLElBQUksSUFBSSxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sbUJBQW1CLENBQUM7U0FDM0I7UUFDRCxJQUFJLE1BQU0sR0FBRyxFQUFFLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QixNQUFNLHFCQUFxQixDQUFDO1NBQzdCO1FBQ0QsT0FBTyxJQUFJQSxNQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQy9CO0lBR0QsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0tBQ3JDO0lBRU0sUUFBUTtRQUNiLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBUztZQUNwQixJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1YsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ2YsQ0FBQztRQUNGLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztLQUNoRDtDQUNGO0FBS0QsU0FBUyxHQUFHLENBQUMsTUFBYyxFQUFFLElBQVU7SUFDckMsT0FBTztRQUNMLE9BQU8sSUFBSUQsVUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDdkQsQ0FBQztBQUNKLENBQUM7U0FFZSxTQUFTLENBQUMsT0FBZTtJQUN2QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDakMsQ0FBQztTQUVlLE9BQU8sQ0FBQyxLQUFhO0lBQ25DLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM3QixDQUFDO1NBRWUsTUFBTSxDQUFDLElBQVk7SUFDakMsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLENBQUM7U0FFZSxPQUFPLENBQUMsS0FBYTtJQUNuQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0IsQ0FBQztTQUVlLFFBQVEsQ0FBQyxNQUFjO0lBQ3JDLE9BQU8sR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMvQixDQUFDO1NBRWUsT0FBTyxDQUFDLEtBQWE7SUFDbkMsT0FBTyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7U0FFZSxXQUFXLENBQUMsT0FBZTtJQUN6QyxPQUFPO1FBQ0wsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFFdkIsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksT0FBTyxFQUFFO1lBQ2pDLE9BQU8sSUFBSUEsVUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDdkQ7YUFBTTtZQUNMLE9BQU8sSUFBSUEsVUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN2RTtLQUNGLENBQUM7QUFDSixDQUFDO1NBRWUsUUFBUTtJQUN0QixPQUFPO1FBQ0wsT0FBTyxJQUFJQSxVQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUNyRCxDQUFDO0FBQ0osQ0FBQztTQUVlLFFBQVE7SUFDdEIsT0FBTztRQUNMLE9BQU8sSUFBSUEsVUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDdEQsQ0FBQztBQUNKLENBQUM7U0FFZSxTQUFTO0lBQ3ZCLE9BQU87UUFDTCxPQUFPLElBQUlBLFVBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3ZELENBQUM7QUFDSixDQUFDO1NBRWUsUUFBUTtJQUN0QixPQUFPO1FBQ0wsT0FBTyxJQUFJQSxVQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUN0RCxDQUFDO0FBQ0osQ0FBQztNQUVZLEtBQUs7SUFDaEIsWUFBbUIsS0FBYSxFQUFTLEtBQVk7UUFBbEMsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFTLFVBQUssR0FBTCxLQUFLLENBQU87S0FBSztDQUMzRDtTQUVlLFdBQVcsQ0FBQyxNQUFjO0lBQ3hDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNELENBQUM7U0FFZSxVQUFVLENBQUMsS0FBYTtJQUN0QyxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVCLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUMxQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdkIsTUFBTSx1REFBdUQsQ0FBQztTQUMvRDtRQUNELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDO1FBQzdFLFFBQVEsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNmLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxTQUFTO2dCQUNaO29CQUNFLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxHQUFHLFNBQVMsQ0FBQztvQkFDM0MsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkQ7WUFDSCxLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssT0FBTztnQkFDVjtvQkFDRSxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUM7b0JBQ3ZDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2pEO1lBQ0gsS0FBSyxLQUFLLENBQUM7WUFDWCxLQUFLLE1BQU07Z0JBQ1Q7b0JBQ0UsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO29CQUNyQyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRDtZQUNILEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxPQUFPO2dCQUNWO29CQUNFLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQztvQkFDdkMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDakQ7WUFDSCxLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssUUFBUTtnQkFDWDtvQkFDRSxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sR0FBRyxRQUFRLENBQUM7b0JBQ3pDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2xEO1lBQ0gsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE9BQU87Z0JBQ1Y7b0JBQ0UsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO29CQUN2QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNqRDtTQUNKO0tBQ0Y7U0FBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxRQUFRLE9BQU87WUFDYixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xELEtBQUssU0FBUztnQkFDWixPQUFPLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRCxLQUFLLFdBQVc7Z0JBQ2QsT0FBTyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xELEtBQUssVUFBVTtnQkFDYixPQUFPLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUMzQyxLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUM1QyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUM5QyxLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUM1QztnQkFDRSxNQUFNLHdCQUF3QixPQUFPLEVBQUUsQ0FBQztTQUMzQztLQUNGO1NBQU0sSUFBSSxLQUFLLEtBQUssVUFBVSxFQUFFO1FBQy9CLE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FDMUM7SUFDRCxNQUFNLHVCQUF1QixLQUFLLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBRTJDO0lBQzFDLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekMsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNqQyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLENBQUM7RUFDbEM7QUFFRixNQUFNLGlCQUFpQjtJQUF2QjtRQUVVLGVBQVUsR0FBOEIsSUFBSSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1RSxtQkFBYyxHQUE4QixJQUFJLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEYsV0FBTSxHQUErQixJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBdUMzRTtJQXJDQyxhQUFhLENBQUMsVUFBcUMsRUFBRSxjQUF5QyxFQUFFLE1BQWtDO1FBQ2hJLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0tBQ3RCO0lBRUQsS0FBSyxDQUFDLElBQVk7UUFDaEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ2xCLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2xDO0lBRU8sT0FBTyxDQUFDLElBQVksRUFBRSxNQUFlO1FBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakUsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdEIsT0FBTyxJQUFJQSxVQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNsQixPQUFPLElBQUlBLFVBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDbEM7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsUUFBUSxDQUFDLElBQWM7UUFDckIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9DO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQztLQUNGO0NBRUY7QUFFTSxNQUFNLG1CQUFtQixHQUFHLElBQUksaUJBQWlCLEVBQUU7O01DL1U3Q0UsVUFBUTtJQWNuQixZQUNTLElBQVksRUFDWixLQUFhLEVBQ2IsSUFBYyxFQUNkLFNBQWlCLEVBQ2pCLElBQWE7UUFKYixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLFNBQUksR0FBSixJQUFJLENBQVU7UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLFNBQUksR0FBSixJQUFJLENBQVM7O1FBaEJmLHFCQUFnQixHQUFZLEtBQUssQ0FBQzs7Ozs7Ozs7UUFTbEMsbUJBQWMsR0FBWSxLQUFLLENBQUM7S0FRbEM7SUFFTCxHQUFHO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUN0RDtJQUVELE1BQU0sQ0FBQyxRQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLFNBQVM7ZUFDdkMsSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsS0FBSztlQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2VBQy9CLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQztLQUNsQztJQUVNLFdBQVc7UUFDaEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDekQ7SUFFRCxPQUFPLGVBQWUsQ0FBQyxJQUFZO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDekQ7Q0FDRjtNQUVZLFNBQVM7SUFLcEIsWUFBb0IsUUFBb0I7UUFBcEIsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUpqQyxvQkFBZSxHQUFpQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzFELGNBQVMsR0FBb0IsRUFBRSxDQUFDO0tBR007SUFFdEMsbUJBQW1CLENBQUMsV0FBaUI7UUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBb0IsRUFBRSxDQUFDO1FBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBRSxDQUFDO1lBQ3BDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxFQUFFO2dCQUNyRCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3ZCO2lCQUFNO2dCQUNMLE1BQU07YUFDUDtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDZjtJQUVNLE1BQU0sQ0FBQyxJQUFjO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7S0FDNUY7SUFFTSxjQUFjLENBQUMsUUFBa0I7UUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM1QztTQUNGO1FBQ0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ2pCO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ2pCO0lBRU0sVUFBVSxDQUFDLFFBQWdCO1FBQ2hDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDekMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRU0sV0FBVyxDQUFDLFFBQWdCLEVBQUUsU0FBMEI7O1FBRTdELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksWUFBWSxFQUFFO1lBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUU7Z0JBQ3hDLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxNQUFNLDZCQUE2QixHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO1lBQ2pFLEtBQUssTUFBTSxRQUFRLElBQUksWUFBWSxFQUFFO2dCQUNuQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQzlFO1lBQ0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUU7Z0JBQ2hDLE1BQU0sT0FBTyxHQUFHLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDbEUsNkJBQTZCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO29CQUN6QixRQUFRLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO2lCQUNyQzthQUNGO1NBQ0Y7O1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQztLQUNiO0lBRU8sTUFBTSxDQUFDLEVBQW1CLEVBQUUsRUFBbUI7UUFDckQsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFDM0IsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbEIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtnQkFDMUMsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO2dCQUMxQyxPQUFPLEtBQUssQ0FBQzthQUNkO1lBQ0QsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7Z0JBQzFDLFNBQVM7YUFDVjtZQUNELElBQUksQ0FBQyxTQUFVLENBQUMsTUFBTSxDQUFDLFNBQVUsQ0FBQyxFQUFFO2dCQUNsQyxPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBRU8sYUFBYTtRQUNuQixNQUFNLFNBQVMsR0FBb0IsRUFBRSxDQUFDO1FBRXRDLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUM3QyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdEI7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUNqQjtJQUVPLElBQUksQ0FBQyxTQUEwQjtRQUNyQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O1lBQ2xCLE1BQU0sQ0FBQyxHQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQUEsSUFBSSxDQUFDLFlBQVksMENBQUUsS0FBSyxDQUFDO2dCQUNoRCxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFBLElBQUksQ0FBQyxZQUFZLDBDQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25ELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDbkMsQ0FBQyxDQUFDO0tBQ0o7Q0FDRjtBQUVELFNBQVMsYUFBYSxDQUFDLElBQWMsRUFBRSxHQUFhLEVBQUUsWUFBa0I7SUFDdEUsTUFBTSxJQUFJLEdBQUdGLFVBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDaEUsSUFBSSxJQUFJLEdBQUcsRUFBRSxFQUFFO1FBQ2IsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FDbkMsQ0FBQztLQUNIO0lBQ0QsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1FBQ2IsT0FBTyxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLEtBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUNuQyxDQUFDO0tBQ0g7SUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRTtRQUNsRSxNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEtBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUNuQyxDQUFDO1FBQ0YsV0FBVyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDM0IsT0FBTyxXQUFXLENBQUM7S0FDcEI7SUFDRCxJQUNFLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQzdCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFDN0M7UUFDQSxPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0tBQzVFO0lBQ0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksS0FDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQ25DLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxLQUFLO0lBR1QsWUFDUyxJQUFZLEVBQ1gsZ0JBQTRDO1FBRDdDLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTRCO1FBSi9DLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsY0FBUyxHQUFZLEtBQUssQ0FBQztLQUk3QjtJQUVMLFlBQVksQ0FBQyxJQUFjO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3BDO0NBQ0Y7U0FFZSxjQUFjLENBQzVCLGVBQWdDLEVBQ2hDLFlBQWtCO0lBRWxCLE1BQU0sR0FBRyxHQUFHQSxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQTJCLEVBQUUsQ0FBQztJQUMxQyxJQUFJLGdCQUFnQixHQUFvQixFQUFFLENBQUM7SUFDM0MsTUFBTSxnQkFBZ0IsR0FBb0IsRUFBRSxDQUFDOztJQUU3QyxJQUFJLGFBQWEsR0FBVSxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNqRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQyxNQUFNLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLEVBQUU7WUFDdEIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLFNBQVM7U0FDVjtRQUNELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN2RCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLElBQUksRUFBRTtZQUNyQyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRTtnQkFDeEQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2FBQ25FO1lBQ0QsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO1FBQ0QsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLGFBQWEsR0FBRyxLQUFLLENBQUM7S0FDdkI7SUFDRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0tBQ25FO0lBQ0QsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQy9CLE1BQU0sWUFBWSxHQUFVLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQy9GLFlBQVksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNyQjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7TUFFWSxlQUFlO0lBQzFCLFlBQW9CLEtBQVksRUFBUyxTQUEwQjtRQUEvQyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBaUI7S0FBSztJQUV4RSxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0tBQ3hCO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztLQUM3QjtJQUVELFlBQVksQ0FBQyxJQUFjO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDdEM7OztNQ3JQVSwwQkFBMEI7SUFNbkMsWUFBNEIsR0FBVyxFQUFrQixZQUFlO1FBQTVDLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFBa0IsaUJBQVksR0FBWixZQUFZLENBQUc7S0FDdkU7O0FBTmUsOEJBQUcsR0FBRyxJQUFJLDBCQUEwQixDQUFXLEtBQUssRUFBRUEsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDdEUsdURBQTRCLEdBQUcsSUFBSSwwQkFBMEIsQ0FBVSw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM5RyxtREFBd0IsR0FBRyxJQUFJLDBCQUEwQixDQUFVLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RHLGdEQUFxQixHQUFHLElBQUksMEJBQTBCLENBQVUsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDaEcsMkNBQWdCLEdBQUcsSUFBSSwwQkFBMEIsQ0FBVSxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztNQU83RixvQkFBb0I7SUFFN0I7UUFEUSxlQUFVLEdBQW9ELElBQUksR0FBRyxFQUFFLENBQUM7S0FDL0Q7Ozs7OztJQU9qQixZQUFZLENBQUksR0FBa0MsRUFBRSxLQUEyQjtRQUMzRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ25EOzs7Ozs7SUFPRCxnQkFBZ0IsQ0FBSSxHQUFrQyxFQUFFLENBQW1DO1FBQ3ZGLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDbkM7SUFFRCxpQkFBaUIsQ0FBSSxHQUFrQyxFQUFFLEtBQVE7UUFDN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEtBQUssQ0FBQyxDQUFDO0tBQzdDO0lBRUQsWUFBWSxDQUFJLEdBQWtDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMxQyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDZixPQUFPLEdBQUcsQ0FBQyxZQUFZLENBQUM7U0FDM0I7UUFDRCxPQUFPLEtBQUssRUFBRSxDQUFDO0tBQ2xCO0NBRUo7TUE0QnFCLHVCQUF1QjtJQUE3QztRQUVjLFdBQU0sR0FBeUIsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO0tBa0d2RTtJQWhHRyxTQUFTLENBQUMsTUFBNEI7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7S0FDeEI7SUFFRCxLQUFLLENBQUMsR0FBcUI7UUFDdkIsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFO2FBQ2hCLEdBQUcsQ0FBQyxJQUFJO1lBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtnQkFDaEIsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7Z0JBQ2YsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7Z0JBQ2QsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELE9BQU8sSUFBSUUsVUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1NBQ2hGLENBQUM7YUFDRCxNQUFNLENBQUMsQ0FBQyxRQUFRLEtBQTJCLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQztLQUNyRTtJQUVLLE1BQU0sQ0FBQyxHQUFxQixFQUFFLFFBQWtCLEVBQUUsSUFBa0I7O1lBQ3RFLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDZixPQUFPLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNsRCxPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQy9DLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUM7U0FDZjtLQUFBO0lBRU8sa0JBQWtCLENBQUMsSUFBVTtRQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0lBRUQsZUFBZSxDQUFDLFFBQVc7UUFDdkIsT0FBTyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDO0tBQ3RDO0lBRUQsY0FBYyxDQUFDLEdBQXFCLEVBQUUsSUFBVSxFQUFFLE1BQVMsRUFBRSxJQUFrQjtRQUMzRSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxrREFBa0QsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDekUsT0FBTyxLQUFLLENBQUM7YUFDaEI7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDN0I7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVELGNBQWMsQ0FBQyxJQUFZLEVBQUUsSUFBYztRQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDaEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QjthQUFNO1lBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7S0FDNUI7SUFNUyxrQkFBa0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ2hGO0NBRUo7TUFFWSx1QkFBdUI7SUFBcEM7UUFHWSxZQUFPLEdBQTBCLEVBQUUsQ0FBQztLQWdEL0M7SUE5Q0csU0FBUyxDQUFDLE1BQTRCO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztLQUNyQjtJQUVELEtBQUssQ0FBQyxHQUFxQjtRQUN2QixNQUFNLFNBQVMsR0FBb0IsRUFBRSxDQUFBO1FBQ3JDLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtnQkFDaEIsU0FBUzthQUNaO1lBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsT0FBTyxTQUFTLENBQUM7S0FDcEI7SUFFSyxNQUFNLENBQUMsR0FBcUIsRUFBRSxRQUFrQixFQUFFLElBQWtCOztZQUN0RSxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQy9CLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLFFBQVEsRUFBRTtvQkFDVixPQUFPLElBQUksQ0FBQztpQkFDZjthQUNKO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDaEI7S0FBQTtJQUVELFdBQVcsQ0FBQyxPQUE4QjtRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7S0FDckI7SUFFTyxVQUFVO1FBQ2QsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtZQUNyQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTyxDQUFDLENBQUMsQ0FBQztLQUN4RDtJQUVELGNBQWMsQ0FBQyxJQUFZLEVBQUUsSUFBYztRQUN2QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNyRDs7O0FDbFBMLE1BQU0sb0JBQW9CO0lBeUJ0QixZQUNZLHFCQUE4QixFQUMvQixNQUFjLEVBQ2QsSUFBWSxFQUNaLE1BQWM7UUFIYiwwQkFBcUIsR0FBckIscUJBQXFCLENBQVM7UUFDL0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixXQUFNLEdBQU4sTUFBTSxDQUFRO0tBQ3BCO0lBMUJMLE9BQU8sS0FBSyxDQUFDLElBQVksRUFBRSxxQkFBK0I7UUFDdEQsSUFBSSxxQkFBcUIsSUFBSSxJQUFJLEVBQUU7WUFDL0IscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1NBQ2pDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDaEIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFFLENBQUM7UUFDekMsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUUsQ0FBQztRQUN6QyxJQUFJLHFCQUFxQixFQUFFO1lBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM5QixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDakM7UUFDRCxPQUFPLElBQUksb0JBQW9CLENBQUMscUJBQXFCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztLQUNoRjtJQVNELFFBQVE7UUFDSixPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDL0Q7SUFDRCxPQUFPO1FBQ0gsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQy9DO0lBQ0QsT0FBTyxDQUFDLElBQWM7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEQ7SUFDRCxVQUFVLENBQUMsT0FBZTtRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQztLQUNmO0lBQ0QsVUFBVTtRQUNOLElBQUksTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzdCLE9BQU8sTUFBTSxDQUFDO1NBQ2pCO1FBRUQsSUFBSSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsT0FBTyxNQUFNLENBQUM7U0FDakI7UUFFRCxNQUFNLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO0tBQzlDOztBQXhEc0IsMkJBQU0sR0FBRyxnREFBZ0QsQ0FBQztNQTJEeEUscUJBQXNCLFNBQVEsdUJBQTZDO0lBSXBGLGFBQWEsQ0FBQyxJQUFVO1FBQ3BCLE9BQU8sb0JBQW9CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztLQUM5RTtJQUVELFdBQVcsQ0FBQyxLQUFhLEVBQUUsSUFBYztRQUNyQyxPQUFPLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztLQUM3RjtJQUVPLHFCQUFxQjtRQUN6QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLDBCQUEwQixDQUFDLHFCQUFxQixDQUFDLENBQUM7S0FDckY7O0FBWnNCLDhCQUFRLEdBQUcsSUFBSSxxQkFBcUIsRUFBRTs7U0NuRWpELGlCQUFpQixDQUFDLElBQVk7SUFDMUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZEOztBQ1lBLE1BQU0sYUFBYSxHQUFHLEtBQUssTUFBTSxhQUFhO0lBRTFDLElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDeEM7SUFFRCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO0tBQ2hEO0lBRUQsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUN6QztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDM0M7SUFFRCxJQUFJLG1CQUFtQjtRQUNuQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDckQ7SUFFTyxHQUFHLENBQUksR0FBVyxFQUFFLFlBQWU7O1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxPQUFPLFlBQVksQ0FBQztTQUN2QjtRQUNELE1BQU0sT0FBTyxHQUFHLE1BQUEsTUFBQSxNQUFDLE1BQWMsMENBQUUsR0FBRywwQ0FBRSxPQUFPLDBDQUFFLE9BQU8sQ0FBQztRQUN2RCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsT0FBTyxZQUFZLENBQUM7U0FDdkI7UUFDRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTyxZQUFZLENBQUM7U0FDdkI7UUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDWCxPQUFPLFlBQVksQ0FBQztTQUN2QjtRQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkMsT0FBTyxZQUFZLENBQUM7U0FDdkI7UUFDRCxPQUFPLEtBQUssQ0FBQztLQUNoQjtDQUNKLENBQUMsQ0FBQztNQU9VLG9CQUFvQjtJQU83QixZQUFvQixPQUEwQjtRQUExQixZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQUMxQyxJQUFJLGFBQXFCLENBQUM7UUFDMUIsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUU7WUFDN0IsYUFBYSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsMEJBQTBCLENBQUM7U0FDNUY7YUFBTTtZQUNILGFBQWEsR0FBRyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDO1NBQ3RGO1FBQ0QsTUFBTSxhQUFhLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztRQUN6RixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDL0M7SUFFRCxNQUFNLENBQUMsSUFBYztRQUNqQixJQUFJLFFBQWdCLENBQUM7UUFFckIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFO1lBQ2xDLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1NBQ3ZGO2FBQU07WUFDSCxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztTQUNyRjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ25CLE9BQU8sUUFBUSxDQUFDO1NBQ25CO1FBRUQsT0FBTyxHQUFHLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQTtLQUM1RjtJQUVELEtBQUssQ0FBQyxJQUFZLEVBQUUsZ0JBQTBCO1FBQzFDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLEtBQWEsQ0FBQztRQUNsQixJQUFJLElBQVksQ0FBQztRQUNqQixJQUFJLElBQXdCLENBQUM7UUFFN0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBSSxTQUFTLEVBQUU7WUFDWCxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUUsQ0FBQztZQUNsQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzVDO2FBQU07WUFDSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDO1NBQ2xDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBSSxTQUFTLEVBQUU7WUFDWCxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUUsQ0FBQztZQUNsQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzVDO1FBQ0QsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVwQixJQUFJLFVBQW9CLENBQUM7UUFDekIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLGFBQWhCLGdCQUFnQixjQUFoQixnQkFBZ0IsR0FBSSxJQUFJLENBQUM7UUFDeEMsSUFBSSxJQUFJLEVBQUU7WUFDTixVQUFVLEdBQUcsSUFBSUYsVUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7U0FDOUg7YUFBTTtZQUNILFVBQVUsR0FBRyxJQUFJQSxVQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtTQUNsRjtRQUNELElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3RCLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQztLQUNsQzs7QUFqRU0sNkJBQVEsR0FBeUIsSUFBSSxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztNQXFFdkUsbUJBQW1CO0lBVTVCLFlBQ1csS0FBYSxFQUNiLElBQWM7UUFEZCxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsU0FBSSxHQUFKLElBQUksQ0FBVTtLQUNwQjtJQVhMLE9BQU8sS0FBSyxDQUFDLElBQVksRUFBRSxnQkFBMEI7UUFDakQsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM3RSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPLElBQUksbUJBQW1CLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDakU7SUFPRCxRQUFRO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQzVCO0lBRUQsT0FBTztRQUNILElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNYLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztTQUNwQjtRQUNELE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFRCxPQUFPLENBQUMsSUFBYztRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztLQUNwQjtJQUVELFVBQVU7UUFDTixPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUVELFVBQVU7UUFDTixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0tBQ3BGO0NBRUo7TUFFWSxvQkFBcUIsU0FBUSx1QkFBNEM7SUFJbEYsYUFBYSxDQUFDLElBQVU7UUFDcEIsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0tBQzFFO0lBRUQsV0FBVyxDQUFDLEtBQWEsRUFBRSxJQUFjO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksbUJBQW1CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsT0FBTyxNQUFNLENBQUM7S0FDakI7O0FBVnNCLDZCQUFRLEdBQUcsSUFBSSxvQkFBb0IsRUFBRTs7QUNsTGhFO0FBQ0E7QUFDQTtBQUNPLElBQUksWUFBWSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckUsSUFBSSxPQUFPLGtCQUFrQixZQUFZO0FBQ3pDLElBQUksU0FBUyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtBQUNqQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDbkIsWUFBWSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUFDaEUsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMvQixRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLEtBQUs7QUFDTCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEdBQUcsVUFBVSxHQUFHLEVBQUU7QUFDckMsUUFBUSxPQUFPLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxLQUFLLENBQUM7QUFDTjtBQUNBO0FBQ0EsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsRUFBRTtBQUN6QyxRQUFRLE9BQU8sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEUsS0FBSyxDQUFDO0FBQ047QUFDQSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsS0FBSyxFQUFFO0FBQ2hELFFBQVEsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLEtBQUssQ0FBQztBQUNOO0FBQ0EsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxZQUFZO0FBQzdDLFFBQVEsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMzQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUM7QUFDbEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdELFFBQVEsT0FBTyxDQUFDLENBQUM7QUFDakIsS0FBSyxDQUFDO0FBQ04sSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxZQUFZO0FBQ2pELFFBQVEsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekQsS0FBSyxDQUFDO0FBQ04sSUFBSSxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDLEVBQUUsQ0FBQzs7QUNsQ0o7QUFJTyxJQUFJLFNBQVMsR0FBRyxVQUFVLEtBQUssRUFBRTtBQUN4QyxJQUFJLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUNLLElBQUlHLFVBQVEsR0FBRyxVQUFVLEtBQUssRUFBRTtBQUN2QyxJQUFJLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUNLLElBQUksWUFBWSxHQUFHLFVBQVUsS0FBSyxFQUFFO0FBQzNDLElBQUksT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QyxDQUFDLENBQUM7QUFDSyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQ25DO0FBQ0E7QUFDQTtBQUNPLElBQUksS0FBSyxHQUFHLFVBQVUsS0FBSyxFQUFFLEdBQUcsRUFBRTtBQUN6QyxJQUFJLElBQUksR0FBRyxLQUFLLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQ3hDLElBQUksSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUNoQyxRQUFRLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFDcEIsUUFBUSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLEtBQUs7QUFDTCxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNsQixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUlLLElBQUksTUFBTSxHQUFHLFVBQVUsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUM1QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ25CLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDeEIsUUFBUSxPQUFPLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEMsS0FBSztBQUNMLFNBQVM7QUFDVCxRQUFRLE9BQU8sQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUU7QUFDN0IsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzdCLEtBQUs7QUFDTCxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUNLLElBQUksT0FBTyxHQUFHLFVBQVUsSUFBSSxFQUFFO0FBQ3JDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDdkIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0wsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBQ0ssU0FBU0MsVUFBUSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFO0FBQ3hELElBQUksSUFBSSxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxTQUFTLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFDbEQsSUFBSSxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0IsSUFBSSxZQUFZLEdBQUcsWUFBWSxJQUFJLENBQUMsQ0FBQztBQUNyQyxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxZQUFZLEVBQUU7QUFDbkMsUUFBUSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixLQUFLO0FBQ0wsSUFBSSxZQUFZLEdBQUcsWUFBWSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFDN0MsSUFBSSxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFO0FBQ3pDLFFBQVEsU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN4RSxLQUFLO0FBQ0wsSUFBSSxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ08sSUFBSSxLQUFLLEdBQUcsVUFBVSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUM1QyxJQUFJLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsSUFBSSxPQUFPLEdBQUc7QUFDZCxVQUFVLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEUsVUFBVSxNQUFNLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQjtBQUNBLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDTyxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsSUFBSSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBQ0ssSUFBSSxLQUFLLEdBQUcsVUFBVSxHQUFHLEVBQUU7QUFDbEMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQy9DLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUksUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFO0FBQ3JDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDTyxJQUFJLFFBQVEsR0FBRyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDMUMsSUFBSSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7O0FDbEhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJLFFBQVEsQ0FBQztBQUNwQixDQUFDLFVBQVUsUUFBUSxFQUFFO0FBQ3JCLElBQUksUUFBUSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDM0U7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNqRDtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxJQUFJLEVBQUU7QUFDMUMsUUFBUSxJQUFJLFVBQVUsR0FBRyxJQUFJLElBQUks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QUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztBQUNsRCxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ3BELElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7QUFDbEQsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUNoRCxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO0FBQ2xELElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDdEQsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUN0RCxDQUFDLEVBQUUsU0FBUyxLQUFLLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFNBQVMsb0JBQW9CLENBQUMsSUFBSSxFQUFFO0FBQzNDLElBQUksT0FBTyxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztBQUNuQzs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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RSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQzNDLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRTtBQUMxQixFQUFFLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBQ0QsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQzFCLEVBQUUsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN0QyxDQUFDO0FBQ0QsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNsQyxFQUFFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUM7QUFDOUMsUUFBUSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLFFBQVEsSUFBSSxFQUFFLENBQUM7QUFDakQ7QUFDQSxFQUFFLElBQUksUUFBUSxLQUFLLENBQUMsRUFBRTtBQUN0QixJQUFJLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDekMsR0FBRyxNQUFNO0FBQ1QsSUFBSSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUUsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBLFNBQVMsWUFBWSxDQUFDLEdBQUcsRUFBRTtBQUMzQixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxD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Q0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUM7QUFDQSxRQUFRLEtBQUssR0FBRyxDQUFDO0FBQ2pCO0FBQ0EsUUFBUSxLQUFLLEtBQUs7QUFDbEIsVUFBVSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QztBQUNBO0FBQ0EsUUFBUSxLQUFLLEdBQUc7QUFDaEIsVUFBVSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsUUFBUSxLQUFLLElBQUk7QUFDakIsVUFBVSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QztBQUNBO0FBQ0EsUUFBUSxLQUFLLEdBQUc7QUFDaEIsVUFBVSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsUUFBUSxLQUFLLElBQUk7QUFDakIsVUFBVSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QztBQUNBO0FBQ0EsUUFBUSxLQUFLLEdBQUc7QUFDaEIsVUFBVSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2xFO0FBQ0EsUUFBUSxLQUFLLElBQUk7QUFDakIsVUFBVSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyRTtBQUNBLFFBQVEsS0FBSyxHQUFHO0FBQ2hCLFVBQVUsT0FBTyxJQUFJLENBQUMsR0FB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SyxLQUFLLENBQUMsY0FBYyxDQUFDO0FBQzFJLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxjQUFjLENBQUMsR0FBRyxPQUFPLEVBQUU7QUFDcEMsRUFBRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRCxFQUFFLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFDRDtBQUNBLFNBQVMsaUJBQWlCLENBQUMsR0FBRyxVQUFVLEVBQUU7QUFDMUMsRUFBRSxPQUFPLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSztBQUMxRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLEVBQUUsVUFBVSxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0RSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxRQUFRLEVBQUU7QUFDL0IsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDakIsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUks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QUFPLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQztBQUMzQyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLE1BQU0sR0FBRztBQUNmLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUNqRCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLElBQUksZUFBZSxHQUFHO0FBQ3hCLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztBQUMxRCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRTtBQUMzQjtBQUNBLElBQUksTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFO0FBQzVDLE1BQU0sS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSztBQUN6RCxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQzVHLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxF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LEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDbEMsSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDMUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkMsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNELEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRTtBQUNoQixJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzFGLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE9BQU8sR0FBRztBQUNaLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDakQsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFO0FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDcEMsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO0FBQzdCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsUUFBUSxDQUFD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QTtBQUNBLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRTtBQUNwQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ3BDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRTtBQUNsQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ3BDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRTtBQUNqQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ3BDLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xELEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRTtBQUNoQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtBQUN6QyxNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQ25CLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUU7QUFDdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksQ0FBQztBQUNuQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ2pELFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEQ7QUFDQSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNoQixNQUFNLE9BQU8sSUFBSSxDQUFDO0FBQ2xCLEtBQUssTUFBTTtBQUNYLE1BQU0sT0FBTyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUU7QUFDZixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ25DLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDakQsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsRCxJQUFJLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE9BQU8sS0FBSyxDQUFDLFNBQVMsRUFBRTtBQUMxQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxLQUFLO0FBQ2xHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNwQixRQUFRLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0IsT0FBTyxNQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3JFLFFBQVEsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDNUMsT0FBTyxNQUFNO0FBQ2IsUUFBUSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0MsT0FBTztBQUNQLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ25CO0FBQ0EsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUNmLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUMsU0FBUyxFQUFFO0FBQ3hCLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSTtBQUNwQixRQUFRLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDekIsSUFBSSxNQUFNLE9BQU8sR0FBRyxFQUFFO0FBQ3RCLFVBQVUsSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDckMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLElBQUksRUFBRSxHQUFHO0FBQ2YsS0FBSyxFQUFFO0FBQ1AsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLElBQUksRUFBRSxHQUFHO0FBQ2YsS0FBSyxDQUFDLENBQUM7QUFDUCxVQUFVLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNyRCxVQUFVLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxRDtBQUNBLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUU7QUFDekIsTUFBTSxZQUFZLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlDO0FBQ0EsTUFBTSxJQUFJLFlBQVksS0FBSyxDQUFDLEVBQUU7QUFDOUIsUUFBUSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN2QixPQUFPLE1BQU07QUFDYixRQUFRLElBQUksS0FBSyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtBQUN6QyxVQUFVLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDOUQsU0FBUztBQUNUO0FBQ0EsUUFBUSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuQyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFVBQVUsQ0FBQyxHQUFHLFNBQVMsRUFBRTtBQUMzQixJQUFJLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDaEgsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsUUFBUSxHQUFHO0FBQ2IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLFNBQVMsQ0FBQztBQUN4QyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTtBQUNkLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFDeEMsSUFBSSxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pELEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxTQUFTLEdBQUc7QUFDZCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sU0FBUyxDQUFDO0FBQ3hDLElBQUksT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekQsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRTtBQUNsQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sU0FBUyxDQUFDO0FBQ3hDLElBQUksT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFO0FBQ3ZCLElBQUksU0FBUyxHQUFHLEtBQUs7QUFDckIsR0FBRyxHQUFHLEVBQUUsRUFBRTtBQUNWLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFDeEMsSUFBSSxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDekIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUN2QixNQUFNLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDbEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUU7QUFDdEIsSUFBSSxPQUFPLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEUsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQUksQ0FBQztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksR0FBR0EsVUFBUSxDQUFDLFdBQVcsRUFBRTtBQUM3QyxJQUFJLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ25ELE1BQU0sS0FBSyxFQUFFLEVBQUU7QUFDZixLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQ3pELE1BQU0sS0FBSyxFQUFFLENBQUM7QUFDZCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE9BQU8sZUFBZSxDQUFDLElBQUksRUFBRTtBQUMvQixJQUFJLE9BQU8sUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekUsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxPQUFPLGFBQWEsQ0FBQyxLQUFLLEVBQUU7QUFDOUIsSUFBSSxPQUFPLGFBQWEsQ0FBQyxLQUFLLEVBQUVBLFVBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN0RCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLEVBQUU7QUFDakMsSUFBSSxNQUFNLEdBQUcsSUFBSTtBQUNqQixJQUFJLGVBQWUsR0FBRyxJQUFJO0FBQzFCLElBQUksTUFBTSxHQUFHLElBQUk7QUFDakIsSUFBSSxjQUFjLEdBQUcsU0FBUztBQUM5QixHQUFHLEdBQUcsRUFBRSxFQUFFO0FBQ1YsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0YsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxZQUFZLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRTtBQUN2QyxJQUFJLE1BQU0sR0FBRyxJQUFJO0FBQ2pCLElBQUksZUFBZSxHQUFHLElBQUk7QUFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSTtBQUNqQixJQUFJLGNBQWMsR0FBRyxTQUFTO0FBQzlCLEdBQUcsR0FBRyxFQUFFLEVBQUU7QUFDVixJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkcsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFO0FBQ25DLElBQUksTUFBTSxHQUFHLElBQUk7QUFDakIsSUFBSSxlQUFlLEdBQUcsSUFBSTtBQUMxQixJQUFJLE1BQU0sR0FBRyxJQUFJO0FBQ2pCLEdBQUcsR0FBRyxFQUFFLEVBQUU7QUFDVixJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNyRixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxjQUFjLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRTtBQUN6QyxJQUFJLE1BQU0sR0FBRyxJQUFJO0FBQ2pCLElBQUksZUFBZSxHQUFHLElBQUk7QUFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSTtBQUNqQixHQUFHLEdBQUcsRUFBRSxFQUFFO0FBQ1YsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNGLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFDbkIsSUFBSSxNQUFNLEdBQUcsSUFBSTtBQUNqQixHQUFHLEdBQUcsRUFBRSxFQUFFO0FBQ1YsSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDN0MsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sRUFBRTtBQUNoQyxJQUFJLE1BQU0sR0FBRyxJQUFJO0FBQ2pCLEdBQUcsR0FBRyxFQUFFLEVBQUU7QUFDVixJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE9BQU8sUUFBUSxHQUFHO0FBQ3BCLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSztBQUNwQixRQUFRLFVBQVUsR0FBRyxLQUFLO0FBQzFCLFFBQVEsS0FBSyxHQUFHLEtBQUs7QUFDckIsUUFBUSxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBQ3pCO0FBQ0EsSUFBSSxJQUFJLE9BQU8sRUFBRSxFQUFFO0FBQ25CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztBQUNsQixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0FBQ3RDLE1BQU0sUUFBUSxHQUFHLFdBQVcsRUFBRSxDQUFDO0FBQy9CO0FBQ0EsTUFBTSxJQUFJO0FBQ1YsUUFBUSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRTtBQUM5QyxVQUFVLFFBQVEsRUFBRSxrQkFBa0I7QUFDdEMsU0FBUyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxLQUFLLGtCQUFrQixDQUFDO0FBQzdELE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNsQixRQUFRLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEIsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTztBQUNYLE1BQU0sSUFBSTtBQUNWLE1BQU0sVUFBVTtBQUNoQixNQUFNLEtBQUs7QUFDWCxNQUFNLFFBQVE7QUFDZCxLQUFLLENBQUM7QUFDTixHQUFHO0FBQ0g7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxTQUFTLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFO0FBQ2pDLEVBQUUsTUFBTSxXQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3hDLElBQUksYUFBYSxFQUFFLElBQUk7QUFDdkIsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRTtBQUM3QixRQUFRLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZEO0FBQ0EsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUM5QyxFQUFFLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztBQUM5TCxJQUFJLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsSUFBSSxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDekIsRUFBRSxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDckIsRUFBRSxJQUFJLFdBQVcsRUFBRSxTQUFTLENBQUM7QUFDN0I7QUFDQSxFQUFFLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUU7QUFDeEMsSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUN6QixNQUFNLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUM5QixRQUFRLENBQUMsSUFBSSxHQUFHLEtBQUs7QUFDckIsT0FBTyxDQUFDLENBQUM7QUFDVDtBQUNBLE1BQU0sSUFBSSxTQUFTLEdBQUcsS0FBSyxFQUFFO0FBQzdCLFFBQVEsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDN0IsVUFBVSxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQztBQUMzQixTQUFTLENBQUMsQ0FBQztBQUNYLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztBQUNuQixPQUFPLE1BQU07QUFDYixRQUFRLE1BQU0sR0FBRyxTQUFTLENBQUM7QUFDM0IsT0FBTztBQUNQO0FBQ0EsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzVCLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7QUFDNUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEYsRUFBRSxNQUFNLGVBQWUsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBQ3pDLEVBQUUsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDN0c7QUFDQSxFQUFFLElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDcEMsSUFBSSxJQUFJLFNBQVMsR0FBRyxLQUFLLEVBQUU7QUFDM0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUM5QixRQUFRLENBQUMsV0FBVyxHQUFHLENBQUM7QUFDeEIsT0FBTyxDQUFDLENBQUM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtBQUM5QixNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUNsRyxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDckU7QUFDQSxFQUFFLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDbEMsSUFBSSxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqRyxHQUFHLE1BQU07QUFDVCxJQUFJLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQSxNQUFNLGdCQUFnQixHQUFHO0FBQ3pCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQjtBQUN6QixFQUFFLE9BQU8sRUFBRSxpQkFBaUI7QUFDNUIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCO0FBQ3pCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQjtBQUN6QixFQUFFLElBQUksRUFBRSxpQkFBaUI7QUFDekIsRUFBRSxRQUFRLEVBQUUsaUJBQWlCO0FBQzdCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQjtBQUN6QixFQUFFLE9BQU8sRUFBRSx1QkFBdUI7QUFDbEMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCO0FBQ3pCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQjtBQUN6QixFQUFFLElBQUksRUFBRSxpQkFBaUI7QUFDekIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCO0FBQ3pCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQjtBQUN6QixFQUFFLElBQUksRUFBRSxpQkFBaUI7QUFDekIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCO0FBQ3pCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQjtBQUN6QixFQUFFLE9BQU8sRUFBRSxpQkFBaUI7QUFDNUIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCO0FBQ3pCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQjtBQUN6QixFQUFFLElBQUksRUFBRSxpQkFBaUI7QUFDekIsRUFBRSxJQUFJLEVBQUUsS0FBSztBQUNiLENBQUMsQ0FBQztBQUNGLE1BQU0scUJBQXFCLEdBQUc7QUFDOUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUN2QixFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7QUFDcEIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ3BCLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUNwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7QUFDMUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ3BCLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUNwQixFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7QUFDcEIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ3BCLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUNwQixFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7QUFDcEIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ3BCLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUNwQixFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7QUFDcEIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUNwQixFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7QUFDcEIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hGLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRTtBQUMxQixFQUFFLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDaEM7QUFDQSxFQUFFLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3BCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNmO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxNQUFNLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckM7QUFDQSxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUMxRCxRQUFRLEtBQUssSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLE9BQU8sTUFBTTtBQUNiLFFBQVEsS0FBSyxNQUFNLEdBQUcsSUFBSSxxQkFBcUIsRUFBRTtBQUNqRCxVQUFVLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEQ7QUFDQSxVQUFVLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFO0FBQzFDLFlBQVksS0FBSyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7QUFDaEMsV0FBVztBQUNYLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0IsR0FBRyxNQUFNO0FBQ1QsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixHQUFHO0FBQ0gsQ0FBQztBQUNELFNBQVMsVUFBVSxDQUFDO0FBQ3BCLEVBQUUsZUFBZTtBQUNqQixDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRTtBQUNoQixFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBQ0Q7QUFDQSxNQUFNLFdBQVcsR0FBRyxtREFBbUQsQ0FBQztBQUN4RTtBQUNBLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN2QyxFQUFFLE9BQU87QUFDVCxJQUFJLEtBQUs7QUFDVCxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QyxHQUFHLENBQUM7QUFDSixDQUFDO0FBQ0Q7QUFDQSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxNQUFNLGlCQUFpQixHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN2RDtBQUNBLFNBQVMsWUFBWSxDQUFDLENBQUMsRUFBRTtBQUN6QjtBQUNBO0FBQ0EsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBQ0Q7QUFDQSxTQUFTLG9CQUFvQixDQUFDLENBQUMsRUFBRTtBQUNqQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0FBQzdCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQztBQUNsQyxHQUFHLFdBQVcsRUFBRSxDQUFDO0FBQ2pCLENBQUM7QUFDRDtBQUNBLFNBQVMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUU7QUFDcEMsRUFBRSxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7QUFDeEIsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHLE1BQU07QUFDVCxJQUFJLE9BQU87QUFDWCxNQUFNLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEQsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxLQUFLLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVTtBQUM5RyxLQUFLLENBQUM7QUFDTixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0EsU0FBUyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRTtBQUMvQixFQUFFLE9BQU87QUFDVCxJQUFJLEtBQUs7QUFDVCxJQUFJLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLElBQUksTUFBTTtBQUNWLEdBQUcsQ0FBQztBQUNKLENBQUM7QUFDRDtBQUNBLFNBQVMsTUFBTSxDQUFDLEtBQUssRUFBRTtBQUN2QixFQUFFLE9BQU87QUFDVCxJQUFJLEtBQUs7QUFDVCxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUNyQixHQUFHLENBQUM7QUFDSixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUU7QUFDNUI7QUFDQSxFQUFFLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO0FBQ2xDLEVBQUUsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztBQUM3QixRQUFRLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQztBQUNwQyxRQUFRLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQztBQUN0QyxRQUFRLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQztBQUNyQyxRQUFRLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQztBQUNwQyxRQUFRLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztBQUMzQyxRQUFRLFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztBQUM3QyxRQUFRLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztBQUMzQyxRQUFRLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztBQUM1QyxRQUFRLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztBQUM1QyxRQUFRLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztBQUM1QyxRQUFRLE9BQU8sR0FBRyxDQUFDLEtBQUs7QUFDeEIsSUFBSSxLQUFLLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FB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QUNBLE1BQU0sS0FBSyxLQUFLO0FBQ2hCLFFBQVEsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUI7QUFDQTtBQUNBLE1BQU0sS0FBSyxJQUFJO0FBQ2YsUUFBUSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QjtBQUNBLE1BQU0sS0FBSyxHQUFHO0FBQ2QsUUFBUSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQztBQUNBLE1BQU0sS0FBSyxJQUFJO0FBQ2YsUUFBUSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QjtBQUNBLE1BQU0sS0FBSyxHQUFHO0FBQ2QsUUFBUSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQztBQUNBLE1BQU0sS0FBSyxJQUFJO0FBQ2YsUUFBUSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QjtBQUNBLE1BQU0sS0FBSyxHQUFHO0FBQ2QsUUFBUSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQztBQUNBLE1BQU0sS0FBSyxHQUFHO0FBQ2QsUUFBUSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQztBQUNBLE1BQU0sS0FBSyxJQUFJO0FBQ2YsUUFBUSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QjtBQUNBLE1BQU0sS0FBSyxHQUFHO0FBQ2QsUUFBUSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQztBQUNBLE1BQU0sS0FBSyxJQUFJO0FBQ2YsUUFBUSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QjtBQUNBLE1BQU0sS0FBSyxHQUFHO0FBQ2QsUUFBUSxPQUFPLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuQztBQUNBLE1BQU0sS0FBSyxLQUFLO0FBQ2hCLFFBQVEsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUI7QUFDQSxNQUFNLEtBQUssR0FBRztBQUNkLFFBQVEsT0FBTyxN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QUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQy9CLEVBQUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDckIsUUFBUSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQ2xELFFBQVEsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7QUFDcEYsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUN0QyxJQUFJLElBQUk7QUFDUixJQUFJLEtBQUs7QUFDVCxJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQzFHLEdBQUcsQ0FBQztBQUNKLFFBQVEsV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7QUFDMUMsSUFBSSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDNUMsSUFBSSxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdB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QUFRLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuTyxJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25PLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN2QixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkIsSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUcsSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUcsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLElBQUksWUFBWSxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVILElBQUksWUFBWSxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVILElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDN0UsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM3RSxJQUFJLFFBQVEsR0FBRyxDQUFDLFlBQVk7QUFDNUIsSUFBSSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDdEIsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFB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QUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDcEIsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEIsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNyQyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN4QyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDckQsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEIsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2RCxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3BELElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENB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O0FBQ3hELEtBQUs7QUFDTCxDQUFDO0FBQ0QsU0FBUyxVQUFVLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUU7QUFDN0MsSUFBSSxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQzlOLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxRSxTQUFTLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdkQsU0FBUyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUM5RSxTQUFTLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdELFNBQVMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ25FLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQztBQUN2RCxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzFELFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUM3RCxTQUFTLFFBQVEsQ0FBQyxTQUFTLENBQUM7QUFDNUIsYUFBYSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsT0FBTztBQUNyQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDcEQsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0FBQzlELGlCQUFpQixVQUFVLElBQUksRUFBRSxDQUFDLE9BQU87QUFDekMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUM7QUFDckUsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN4RixDQUFDO0FBQ0QsU0FBUyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUN2QyxJQUFJLE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUM5RCxDQUFDO0FBQ0QsU0FBUyxVQUFVLENBQUMsVUFBVSxFQUFFO0FBQ2hDLElBQUksT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDakMsQ0FBQztBQUNELFNBQVMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRTtBQUM3RCxJQUFJLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztBQUN6QixJQUFJLEtBQUssSUFBSSxVQUFVLEdBQUcsS0FBSyxFQUFFLFVBQVUsR0FBRyxHQUFHLEVBQUUsVUFBVSxFQUFFLEVBQUU7QUFDakUsUUFBUSxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDNUMsUUFBUSxRQUFRLEdBQUcsVUFBVSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkQsUUFBUSxJQUFJLFFBQVE7QUFDcEIsWUFBWSxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLEtBQUs7QUFDTCxJQUFJLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFDRCxTQUFTLFdBQVcsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRTtBQUMvQyxJQUFJLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDL0csSUFBSSxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3BDLFFBQVEsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsS0FBSztBQUNMLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTTtBQUM3QixRQUFRLFFBQVEsQ0FBQyxNQUFNLENBQUM7QUFDeEIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQztBQUMzQyxTQUFTLElBQUksSUFBSSxLQUFLLENBQUMsUUFBUTtBQUMvQixZQUFZLFFBQVEsQ0FBQyxRQUFRLENBQUM7QUFDOUIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELFNBQVMsSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRO0FBQy9CLFlBQVksUUFBUSxDQUFDLFFBQVEsQ0FBQztBQUM5QixZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUN0RCxRQUFRLE9BQU8sRUFBRSxDQUFDO0FBQ2xCLEtBQUs7QUFDTCxJQUFJLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbEg7O0FDN0hBO0FBQ0E7QUFDQTtBQUNPLElBQUksSUFBSSxHQUFHO0FBQ2xCLElBQUksRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN0QixJQUFJLEVBQUUsRUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDdEIsSUFBSSxFQUFFLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLElBQUksRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN0QixJQUFJLEVBQUUsRUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDdEIsSUFBSSxFQUFFLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLElBQUksRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN0QixDQUFDLENBQUM7QUFDSyxJQUFJQyxpQkFBZSxHQUFHO0FBQzdCLElBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNO0FBQzFCLElBQUksT0FBTyxFQUFFLElBQUk7QUFDakIsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUNmLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO0FBQ2pCLElBQUksS0FBSyxFQUFFLElBQUk7QUFDZixJQUFJLEtBQUssRUFBRSxJQUFJO0FBQ2YsSUFBSSxJQUFJLEVBQUUsSUFBSTtBQUNkLElBQUksUUFBUSxFQUFFLElBQUk7QUFDbEIsSUFBSSxPQUFPLEVBQUUsSUFBSTtBQUNqQixJQUFJLFVBQVUsRUFBRSxJQUFJO0FBQ3BCLElBQUksV0FBVyxFQUFFLElBQUk7QUFDckIsSUFBSSxTQUFTLEVBQUUsSUFBSTtBQUNuQixJQUFJLFFBQVEsRUFBRSxJQUFJO0FBQ2xCLElBQUksU0FBUyxFQUFFLElBQUk7QUFDbkIsSUFBSSxVQUFVLEVBQUUsSUFBSTtBQUNwQixJQUFJLE1BQU0sRUFBRSxJQUFJO0FBQ2hCLElBQUksUUFBUSxFQUFFLElBQUk7QUFDbEIsSUFBSSxRQUFRLEVBQUUsSUFBSTtBQUNsQixJQUFJLFFBQVEsRUFBRSxJQUFJO0FBQ2xCLENBQUMsQ0FBQztBQUNLLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUNBLGlCQUFlLENBQUMsQ0FBQztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssa0JBQWtCLFlBQVk7QUFDdkMsSUFBSSxTQUFTLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3JDLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDakQsUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRTtBQUNwRDtBQUNBLFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEdBQUcsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFDbkQ7QUFDQSxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUdGLG1CQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELFFBQVEsSUFBSSxhQUFhLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQztBQUNoRSxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDO0FBQ3JDLEtBQUs7QUFDTCxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsVUFBVSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ2hELFFBQVEsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3pDLEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLElBQUksRUFBRSxRQUFRLEVBQUU7QUFDL0MsUUFBUSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEMsS0FBSyxDQUFDO0FBQ04sSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLFVBQVUsR0FBRyxFQUFFO0FBQ3RDLFFBQVEsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0FBQzlELEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxVQUFVLEVBQUU7QUFDbEQsUUFBUSxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlDLEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQ3RELFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO0FBQ3hCLFlBQVksT0FBTyxLQUFLLENBQUM7QUFDekIsUUFBUSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNqRCxLQUFLLENBQUM7QUFDTixJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFVBQVUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7QUFDN0QsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07QUFDeEIsWUFBWSxPQUFPO0FBQ25CLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hELEtBQUssQ0FBQztBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxRQUFRLEVBQUU7QUFDOUMsUUFBUSxJQUFJLFFBQVEsRUFBRTtBQUN0QixZQUFZLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLGtCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUMzRSxTQUFTO0FBQ1QsUUFBUSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNDLFFBQVEsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO0FBQzlCLFlBQVksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMxQyxTQUFTO0FBQ1QsUUFBUSxPQUFPLE1BQU0sQ0FBQztBQUN0QixLQUFLLENBQUM7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUU7QUFDdEUsUUFBUSxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRTtBQUM1QyxRQUFRLElBQUksQ0FBQ0MsVUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDQSxVQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztBQUN6RSxZQUFZLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztBQUN2RSxRQUFRLElBQUksSUFBSSxHQUFHO0FBQ25CLFlBQVksTUFBTSxFQUFFLE1BQU07QUFDMUIsWUFBWSxLQUFLLEVBQUUsS0FBSztBQUN4QixZQUFZLEdBQUcsRUFBRSxHQUFHO0FBQ3BCLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxRQUFRLEVBQUU7QUFDdEIsWUFBWSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDakYsU0FBUztBQUNULFFBQVEsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckQsUUFBUSxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7QUFDOUIsWUFBWSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqRSxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRCxTQUFTO0FBQ1QsUUFBUSxPQUFPLE1BQU0sQ0FBQztBQUN0QixLQUFLLENBQUM7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRTtBQUNoRCxRQUFRLElBQUksR0FBRyxLQUFLLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQzVDLFFBQVEsSUFBSSxDQUFDQSxVQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztBQUNyQyxZQUFZLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztBQUN0RSxRQUFRLElBQUksSUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEMsUUFBUSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRCxRQUFRLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRTtBQUM5QixZQUFZLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25ELFNBQVM7QUFDVCxRQUFRLE9BQU8sTUFBTSxDQUFDO0FBQ3RCLEtBQUssQ0FBQztBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFO0FBQy9DLFFBQVEsSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUU7QUFDNUMsUUFBUSxJQUFJLENBQUNBLFVBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0FBQ3JDLFlBQVksTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0FBQ3JFLFFBQVEsSUFBSSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN4QyxRQUFRLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25ELFFBQVEsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO0FBQzlCLFlBQVksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDL0QsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEQsU0FBUztBQUNULFFBQVEsT0FBTyxNQUFNLENBQUM7QUFDdEIsS0FBSyxDQUFDO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFlBQVk7QUFDeEMsUUFBUSxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7QUFDakMsS0FBSyxDQUFDO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsWUFBWTtBQUMzQyxRQUFRLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNqRCxLQUFLLENBQUM7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRTtBQUN6RSxRQUFRLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzlELEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsR0FBRyxZQUFZO0FBQzNELFFBQVEsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxLQUFLLENBQUM7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsWUFBWTtBQUN4QyxRQUFRLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzNDLEtBQUssQ0FBQztBQUNOO0FBQ0EsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHO0FBQ3hCLFFBQVEsUUFBUTtBQUNoQixRQUFRLFNBQVM7QUFDakIsUUFBUSxRQUFRO0FBQ2hCLFFBQVEsT0FBTztBQUNmLFFBQVEsUUFBUTtBQUNoQixRQUFRLFVBQVU7QUFDbEIsUUFBUSxVQUFVO0FBQ2xCLEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQ3BDLElBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO0FBQ3RDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQ3BDLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO0FBQ2xDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQ3BDLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO0FBQ3hDLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO0FBQ3hDLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3ZCLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3ZCLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3ZCLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3ZCLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3ZCLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3ZCLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3ZCLElBQUksS0FBSyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7QUFDcEMsSUFBSSxLQUFLLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztBQUM1QyxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMsRUFBRSxDQUFDOztBQzNORyxTQUFTLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtBQUM1RSxJQUFJLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUN6QixJQUFJLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7QUFDcEMsSUFBSSxTQUFTLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQ3ZDLFFBQVEsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssRUFBRTtBQUN6QyxZQUFZLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUU7QUFDdkUsZ0JBQWdCLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDakQsYUFBYSxDQUFDLENBQUM7QUFDZixTQUFTLENBQUMsQ0FBQztBQUNYLEtBQUs7QUFDTCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUU7QUFDcEMsUUFBUSxJQUFJLFNBQVMsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDbkUsUUFBUSxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzlDLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLFVBQVUsSUFBSSxFQUFFO0FBQ3hDLFFBQVEsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLFFBQVEsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO0FBQ3JCLFlBQVksT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM1QyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDOUIsWUFBWSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNELFlBQVksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxnQkFBZ0IsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN2QyxnQkFBZ0IsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoRCxhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSyxDQUFDO0FBQ04sSUFBSSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO0FBQ3pDLFFBQVEsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEUsUUFBUSxVQUFVLENBQUMsTUFBTSxHQUFHLFVBQVUsSUFBSSxFQUFFO0FBQzVDLFlBQVksSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xDLFlBQVksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxnQkFBZ0IsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN2QyxnQkFBZ0IsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoRCxhQUFhO0FBQ2IsWUFBWSxPQUFPLElBQUksQ0FBQztBQUN4QixTQUFTLENBQUM7QUFDVixLQUFLO0FBQ0wsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM1QyxRQUFRLElBQUksU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUN4RSxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQzdELFlBQVksTUFBTTtBQUNsQixLQUFLO0FBQ0wsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxFQUFFO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDeEMsS0FBSyxDQUFDLENBQUM7QUFDUCxJQUFJLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7QUFDakMsSUFBSUEsVUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixJQUFJLFFBQVEsVUFBVSxDQUFDLE1BQU07QUFDN0IsUUFBUSxLQUFLLEtBQUssQ0FBQztBQUNuQixRQUFRLEtBQUssU0FBUztBQUN0QixZQUFZLE9BQU8sR0FBRyxDQUFDO0FBQ3ZCLFFBQVEsS0FBSyxRQUFRO0FBQ3JCLFlBQVksUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO0FBQ2pFLFFBQVEsS0FBSyxPQUFPLENBQUM7QUFDckIsUUFBUTtBQUNSLFlBQVksUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtBQUNwRCxLQUFLO0FBQ0w7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxlQUFlLEdBQUc7QUFDdEIsSUFBSSxPQUFPLEVBQUUsSUFBSTtBQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQ2hCLElBQUksTUFBTSxFQUFFLEtBQUs7QUFDakIsSUFBSSxRQUFRLEVBQUUsS0FBSztBQUNuQixJQUFJLFVBQVUsRUFBRSxLQUFLO0FBQ3JCLElBQUksSUFBSSxFQUFFLElBQUk7QUFDZCxDQUFDLENBQUM7QUFDSyxTQUFTLFVBQVUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFO0FBQ3ZDLElBQUksSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLElBQUksSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLElBQUksSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLElBQUksSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLElBQUksSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQ25FLElBQUksSUFBSSxLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLElBQUk7QUFDakIsWUFBWSxPQUFPO0FBQ25CLFFBQVEsSUFBSSxFQUFFLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0FBQ3pGLFFBQVEsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQ2xDLFlBQVksS0FBSyxPQUFPO0FBQ3hCLGdCQUFnQixJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDbEMsb0JBQW9CLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLGlCQUFpQjtBQUNqQixnQkFBZ0IsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNsRCxnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssT0FBTztBQUN4QixnQkFBbUIsSUFBQyxFQUFFLEdBQUcsMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDOUYsZ0JBQWdCLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ3hDLG9CQUFvQixJQUFJLEdBQUcsU0FBUyxDQUFDO0FBQ3JDLGlCQUFpQjtBQUNqQixnQkFBZ0IsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxRQUFRO0FBQ3pCLGdCQUFnQixJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDbEMsb0JBQW9CLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25GLGlCQUFpQjtBQUNqQixnQkFBZ0IsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNwRCxnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssUUFBUTtBQUN6QixnQkFBZ0IsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVksS0FBSyxTQUFTO0FBQzFCLGdCQUFnQixNQUFNO0FBQ3RCLFlBQVk7QUFDWixnQkFBZ0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNqRSxTQUFTO0FBQ1QsS0FBSyxDQUFDLENBQUM7QUFDUCxJQUFJLE9BQU87QUFDWCxRQUFRLE9BQU8sRUFBRSxPQUFPO0FBQ3hCLFFBQVEsSUFBSSxFQUFFLElBQUk7QUFDbEIsUUFBUSxTQUFTLEVBQUUsU0FBUztBQUM1QixRQUFRLFNBQVMsRUFBRSxTQUFTO0FBQzVCLFFBQVEsVUFBVSxFQUFFLFVBQVU7QUFDOUIsUUFBUSxVQUFVLEVBQUUsVUFBVTtBQUM5QixLQUFLLENBQUM7QUFDTixDQUFDO0FBQ0QsU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRTtBQUMvQixJQUFJLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7QUFDdEwsSUFBSSxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQztBQUMxQyxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRTtBQUM1QixRQUFRLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLFFBQVEsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDOUIsS0FBSztBQUNMLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUTtBQUN4QixRQUFRLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztBQUM1QixRQUFRLFNBQVMsQ0FBQyxNQUFNO0FBQ3hCLFFBQVEsVUFBVSxDQUFDLE1BQU07QUFDekIsUUFBUSxVQUFVLENBQUMsTUFBTSxFQUFFO0FBQzNCLFFBQVEsSUFBSSxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0MsUUFBUSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2hDLFFBQVEsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLENBQUM7QUFDdkMsUUFBUSxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxFQUFFO0FBQ3pDLFlBQVksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDcEYsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUU7QUFDMUMsWUFBWSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxFQUFFO0FBQzFDLFlBQVksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDckYsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUU7QUFDM0MsWUFBWSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLE9BQU87QUFDakQsWUFBWSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2xDLFFBQVEsT0FBTyxNQUFNLENBQUM7QUFDdEIsS0FBSztBQUNMLElBQUksSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNqQyxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25JLENBQUM7QUFDTSxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFO0FBQ3JDLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0MsSUFBSSxPQUFPLFNBQVMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBQ0QsU0FBUyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtBQUMvQyxJQUFJLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTztBQUN6RCxRQUFRLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3RCLENBQUM7QUFDRCxTQUFTLGlCQUFpQixDQUFDLE9BQU8sRUFBRTtBQUNwQyxJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNyQixJQUFJLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsSUFBSSxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ25ELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsRUFBRTtBQUNoQyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQztBQUN2QyxZQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUIsS0FBSyxDQUFDLENBQUM7QUFDUCxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtBQUN4QixRQUFRLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLEtBQUs7QUFDTCxJQUFJLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsZUFBZSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUNELFNBQVMsV0FBVyxDQUFDLElBQUksRUFBRTtBQUMzQixJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNsQyxRQUFRLE9BQU87QUFDZixZQUFZLElBQUksRUFBRSxPQUFPO0FBQ3pCLFlBQVksS0FBSyxFQUFFLElBQUk7QUFDdkIsU0FBUyxDQUFDO0FBQ1YsS0FBSztBQUNMLElBQUksSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlELElBQUksT0FBTztBQUNYLFFBQVEsSUFBSSxFQUFFLElBQUk7QUFDbEIsUUFBUSxLQUFLLEVBQUUsS0FBSztBQUNwQixLQUFLLENBQUM7QUFDTixDQUFDO0FBQ0QsU0FBUyxhQUFhLENBQUMsSUFBSSxFQUFFO0FBQzdCLElBQUksSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0FBQ2pFLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxJQUFJLElBQUksQ0FBQyxLQUFLO0FBQ2QsUUFBUSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFDL0MsSUFBSSxPQUFPO0FBQ1gsUUFBUSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtBQUNwQyxRQUFRLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM3QixRQUFRLEtBQUssRUFBRSxLQUFLO0FBQ3BCLEtBQUssQ0FBQztBQUNOLENBQUM7QUFDRCxTQUFTLGNBQWMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFO0FBQ25DLElBQUksSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDLEVBQUU7QUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN0QixJQUFJLElBQUksQ0FBQyxDQUFDO0FBQ1YsUUFBUSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDaEQ7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNqQixRQUFRLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QixLQUFLO0FBQ0wsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFO0FBQzdCO0FBQ0EsUUFBUSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5RCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDbkIsWUFBWSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixTQUFTO0FBQ1QsYUFBYSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUMzQyxZQUFZLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxZQUFZLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFNBQVM7QUFDVCxhQUFhO0FBQ2IsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0QsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7QUFDakMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN4RCxZQUFZLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEUsU0FBUztBQUNULEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNELFNBQVMsVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUU7QUFDckMsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QixJQUFJLE9BQU8sUUFBUTtBQUNuQixTQUFTLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFDbkIsU0FBUyxHQUFHLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPQSxVQUFRLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDakY7O0FDbkxBLFNBQVMsa0JBQWtCLENBQUMsU0FBUyxFQUFFO0FBQ3ZDLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLElBQUksT0FBTyxVQUFVLEtBQUssRUFBRTtBQUM1QixRQUFRLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtBQUNqQyxZQUFZLEtBQUssQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzNDLFNBQVM7QUFDVCxRQUFRLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxTQUFTLEVBQUU7QUFDbEQsWUFBWSxPQUFPLEtBQUssQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUM7QUFDMUMsU0FBUztBQUNULFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3RELFlBQVksSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDakUsWUFBWSxJQUFJLE9BQU8sRUFBRTtBQUN6QixnQkFBZ0IsT0FBTyxPQUFPLENBQUM7QUFDL0IsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLLENBQUM7QUFDTixDQUFDO0FBQ0QsSUFBSSxRQUFRLGtCQUFrQixVQUFVLE1BQU0sRUFBRTtBQUNoRCxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLFFBQVEsQ0FBQyxPQUFPLEVBQUU7QUFDL0IsUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRTtBQUNwRCxRQUFRLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDM0QsUUFBUSxLQUFLLENBQUMsT0FBTyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLFFBQVEsS0FBSyxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMvRCxRQUFRLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVEsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDMUIsUUFBUSxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUMzQixRQUFRLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQzNCLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxVQUFVLEVBQUU7QUFDckQsUUFBUSxPQUFPLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUN0RyxLQUFLLENBQUM7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUFVLEtBQUssRUFBRTtBQUNoRCxRQUFRLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDLEtBQUssQ0FBQztBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsS0FBSyxFQUFFO0FBQ2pELFFBQVEsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsS0FBSyxDQUFDO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxJQUFJLEVBQUU7QUFDL0MsUUFBUSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwQyxLQUFLLENBQUM7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLElBQUksRUFBRTtBQUNoRCxRQUFRLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3JDLEtBQUssQ0FBQztBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7QUFDNUMsUUFBUSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEYsS0FBSyxDQUFDO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsWUFBWTtBQUM3QyxRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNqRixLQUFLLENBQUM7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxZQUFZO0FBQzVDLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDL0UsS0FBSyxDQUFDO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsWUFBWTtBQUM3QyxRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hGLEtBQUssQ0FBQztBQUNOLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsWUFBWTtBQUM3QyxRQUFRLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUN4QixRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO0FBQ2xELFlBQVksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEYsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLEVBQUU7QUFDN0MsWUFBWSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakUsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsTUFBTSxFQUFFO0FBQy9DLFlBQVksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDaEUsaUJBQWlCLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3BGLGlCQUFpQixNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdFLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQ2hDLFlBQVksTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRSxTQUFTO0FBQ1QsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQ2pDLFlBQVksTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RSxTQUFTO0FBQ1QsUUFBUSxPQUFPLE1BQU0sQ0FBQztBQUN0QixLQUFLLENBQUM7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFlBQVk7QUFDOUMsUUFBUSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsS0FBSyxDQUFDO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxZQUFZO0FBQzNDLFFBQVEsSUFBSSxHQUFHLEdBQUcsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pGLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkYsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdGLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMvRixRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQ25CLEtBQUssQ0FBQztBQUNOLElBQUksT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFVixTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFO0FBQ3JDLElBQUksSUFBSSxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsRUFBRTtBQUNuQyxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLHdCQUF3QixDQUFDLENBQUM7QUFDdEUsS0FBSztBQUNMLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQzFELFFBQVEsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixLQUFLO0FBQ0wsQ0FBQztBQUNELFNBQVMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7QUFDcEMsSUFBSSxJQUFJLEVBQUUsSUFBSSxZQUFZLElBQUksQ0FBQyxFQUFFO0FBQ2pDLFFBQVEsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsdUJBQXVCLENBQUMsQ0FBQztBQUNwRSxLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDekQsUUFBUSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLFFBQVFBLFVBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbEMsS0FBSztBQUNMLENBQUM7QUFDRCxTQUFTLGNBQWMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtBQUM3QyxJQUFJLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUM7QUFDdEQsSUFBSSxJQUFJLE1BQU0sR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsUUFBUSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7QUFDckUsSUFBSSxJQUFJLFVBQVUsR0FBRyxNQUFNO0FBQzNCLFNBQVMsR0FBRyxDQUFDLFVBQVUsS0FBSyxFQUFFLEVBQUUsT0FBT0EsVUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDN0YsU0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsSUFBSSxPQUFPLEVBQUUsR0FBRyxNQUFNLEdBQUcsVUFBVSxDQUFDO0FBQ3BDOztNQzdLYUcsUUFBTTtJQXVCZixZQUEyQixPQUFlLEVBQVUsSUFBK0I7UUFBeEQsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUFVLFNBQUksR0FBSixJQUFJLENBQTJCO0tBQUs7SUFyQnhGLE9BQU8sTUFBTSxDQUFDLEVBQVU7UUFDcEIsT0FBTyxJQUFJQSxRQUFNLENBQUMsRUFBRSxFQUFFLElBQUk7WUFDdEIsT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO1NBQ3RCLENBQUMsQ0FBQztLQUNOO0lBRUQsT0FBTyxPQUFPLENBQUMsRUFBaUI7UUFDNUIsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNqQixNQUFNLGNBQWMsQ0FBQztTQUN4QjtRQUNELElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtZQUNmLE1BQU0sb0JBQW9CLENBQUM7U0FDOUI7UUFDRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QjtRQUNELE9BQU8sSUFBSUEsUUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJO1lBQ3pCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDaEQsQ0FBQyxDQUFDO0tBQ047SUFJRCxRQUFRLENBQUMsSUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDMUI7O0NBQ0o7TUFFWSxNQUFNO0lBQ2YsWUFBb0IsTUFBb0I7UUFBcEIsV0FBTSxHQUFOLE1BQU0sQ0FBYztLQUFLO0lBRXRDLFlBQVksQ0FDZixNQUF1QixFQUN2QixJQUFZLEVBQ1osU0FBUyxHQUFHLEtBQUssRUFDakIsTUFBTSxHQUFHLEtBQUssRUFDZCxxQkFBcUIsR0FBRyxLQUFLO1FBQzdCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1QsT0FBTyxJQUFJLENBQUM7YUFDZjs7WUFFRCxJQUFJLE1BQU0sWUFBWUEsUUFBTSxFQUFFO2dCQUMxQixLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUM1QztpQkFBTTtnQkFDSCxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7YUFDNUI7WUFDRCxJQUFJLHFCQUFxQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzdFLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDakM7WUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUUsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRTs7b0JBRXZDLFNBQVMsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDO2lCQUN6QjthQUNKO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5QyxPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUVNLE1BQU07UUFDVCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0tBQzdCO0lBRU8sZ0JBQWdCLENBQUMsS0FBWSxFQUFFLElBQVksRUFBRSxTQUFTLEdBQUcsS0FBSztRQUNsRSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ1osS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDbEIsT0FBTztTQUNWO1FBRUQsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7S0FDckU7SUFFTyxvQkFBb0IsQ0FBQyxLQUFZO1FBQ3JDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDckM7SUFFTSxRQUFRLENBQUMsTUFBdUI7UUFDbkMsS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzNCLElBQUksTUFBTSxZQUFZQSxRQUFNLEVBQUU7Z0JBQzFCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQy9CLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO2lCQUFNO2dCQUNILElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUU7b0JBQ3pCLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNmO0lBRU0sWUFBWSxDQUFDLE1BQXVCLEVBQUUsV0FBVyxHQUFHLEtBQUs7UUFDNUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDaEIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDZCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUM7U0FDckI7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNwRDtJQUVNLFdBQVcsQ0FBQyxNQUFjO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUM3RTtJQUVELGFBQWEsQ0FBQyxRQUFnQztRQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNqQztJQUVNLElBQUk7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDM0Q7Q0FDSjtTQUVlLGFBQWEsQ0FBQyxJQUFZLEVBQUUsT0FBc0I7SUFDOUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3hCLElBQUksSUFBSSxHQUFXLEVBQUUsQ0FBQztJQUN0QixJQUFJLFlBQVksR0FBaUIsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFpQixFQUFFLENBQUM7SUFFbEMsTUFBTSxpQkFBaUIsR0FBRztRQUN0QixJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUU7O1lBRXZCLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7U0FDdkM7YUFBTTs7WUFFSCxZQUFZLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztTQUM1QjtLQUNKLENBQUE7SUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDWCxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM3RCxJQUFJLFFBQVEsRUFBRTtZQUNWLGlCQUFpQixFQUFFLENBQUM7O1lBR3BCLFlBQVksR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDNUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztTQUNiO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyxDQUFDO1NBQ2I7S0FDSixDQUFDLENBQUM7SUFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLGlCQUFpQixFQUFFLENBQUM7S0FDdkI7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUVwQjs7QUM1SkEsU0FBUyxVQUFVLENBQUMsSUFBWTtJQUM1QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7TUFDWSx3QkFBd0I7SUFzQmpDLFlBQ1ksY0FBdUIsRUFDdkIsVUFBbUIsRUFDbkIsZ0JBQXlCLEVBQ3pCLE1BQWM7UUFIZCxtQkFBYyxHQUFkLGNBQWMsQ0FBUztRQUN2QixlQUFVLEdBQVYsVUFBVSxDQUFTO1FBQ25CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBUztRQUN6QixXQUFNLEdBQU4sTUFBTSxDQUFRO0tBQ3pCO0lBYk0sT0FBTyxLQUFLLENBQUMsSUFBWSxFQUFFLGNBQXdCLEVBQUUsVUFBb0IsRUFBRSxnQkFBMEI7UUFDeEcsT0FBTyxJQUFJLHdCQUF3QixDQUMvQixjQUFjLGFBQWQsY0FBYyxjQUFkLGNBQWMsR0FBSSxLQUFLLEVBQ3ZCLFVBQVUsYUFBVixVQUFVLGNBQVYsVUFBVSxHQUFJLEtBQUssRUFDbkIsZ0JBQWdCLGFBQWhCLGdCQUFnQixjQUFoQixnQkFBZ0IsR0FBSSxJQUFJLEVBQ3hCLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6RDtJQVNELFFBQVE7UUFDSixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbEMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3QjtRQUNELE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0lBQ0QsT0FBTztRQUNILE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0tBQ2pEO0lBQ0QsT0FBTyxDQUFDLElBQWM7UUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNoRDtJQUNELFVBQVU7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDL0Q7SUFDRCxVQUFVLENBQUMsSUFBYztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM5RDtJQUNELFVBQVUsQ0FBQyxPQUFlO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEQsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNPLGlCQUFpQjtRQUNyQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDckIsT0FBTyx3QkFBd0IsQ0FBQyxjQUFjLENBQUM7U0FDbEQ7YUFBTTtZQUNILE9BQU8sd0JBQXdCLENBQUMsYUFBYSxDQUFDO1NBQ2pEO0tBQ0o7SUFDRCxVQUFVO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0tBQzdCO0lBRUQsUUFBUSxDQUFDLFdBQW1CO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsV0FBVztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztLQUNoRTtJQUVELFdBQVcsQ0FBQyxJQUFtQztRQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUMvRDtJQUVELGFBQWE7UUFDVCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ3BGO0lBRUQsS0FBSztRQUNELE9BQU8sd0JBQXdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7S0FDekg7SUFFTyxPQUFPLENBQUMsTUFBYztRQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEQsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLE1BQU0sS0FBSyx3QkFBd0IsQ0FBQyxjQUFjLEVBQUU7WUFDcEQsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFDRCxPQUFPLElBQUlULFVBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDcEM7S0FDSjtJQUVPLE9BQU8sQ0FBQyxNQUFjLEVBQUUsSUFBbUM7UUFDL0QsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsT0FBTztTQUNWO1FBQ0QsSUFBSSxPQUFlLENBQUM7UUFDcEIsSUFBSSxJQUFJLFlBQVlBLFVBQVEsRUFBRTtZQUMxQixJQUFJLE1BQU0sS0FBSyx3QkFBd0IsQ0FBQyxjQUFjLEVBQUU7Z0JBQ3BELE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEQ7aUJBQU07Z0JBQ0gsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDOUQ7U0FDSjthQUFNO1lBQ0gsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQyxDQUFDO0tBQ2pHO0lBRU8sK0JBQStCO1FBQ25DLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSztZQUMzQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO2dCQUNyQixPQUFPO2FBQ1Y7WUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM1QixTQUFTLElBQUksQ0FBQyxDQUFDO2FBQ2xCO2lCQUFNO2dCQUNILE9BQU8sRUFBRSxDQUFDO2FBQ2I7U0FDSixDQUFDLENBQUE7UUFDRixJQUFJLFNBQVMsR0FBRyxPQUFPLEVBQUU7WUFDckIsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNLElBQUksU0FBUyxHQUFHLE9BQU8sRUFBRTtZQUM1QixPQUFPLEtBQUssQ0FBQztTQUNoQjthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjtLQUNKOztBQXhJdUIsbUNBQVUsR0FBRyxZQUFZLENBQUM7QUFDMUIsc0NBQWEsR0FBR1MsUUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUM5Qyx1Q0FBYyxHQUFHQSxRQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLHlDQUFnQixHQUFHQSxRQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLHVDQUFjLEdBQUdBLFFBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEMsbUNBQVUsR0FBRztJQUNqQyx3QkFBd0IsQ0FBQyxhQUFhO0lBQ3RDLHdCQUF3QixDQUFDLGNBQWM7SUFDdkMsd0JBQXdCLENBQUMsZ0JBQWdCO0lBQ3pDLHdCQUF3QixDQUFDLGNBQWM7Q0FDMUMsQ0FBQztNQWlJTyxpQkFBa0IsU0FBUSx1QkFBaUQ7SUFJcEYsYUFBYSxDQUFDLElBQVU7UUFDcEIsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDckksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksRUFBRTtZQUN0RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDakI7SUFFTyxpQkFBaUI7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0tBQ3hGO0lBRU8sY0FBYztRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLDBCQUEwQixDQUFDLDRCQUE0QixDQUFDLENBQUM7S0FDNUY7SUFFUSxjQUFjLENBQUMsR0FBcUIsRUFBRSxJQUFVLEVBQUUsTUFBZ0MsRUFBRSxJQUFrQjtRQUMzRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNoRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNkLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO29CQUVyQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUcsQ0FBQztvQkFDdkMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3BDLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTt3QkFDakIsT0FBTyxLQUFLLENBQUM7cUJBQ2hCO29CQUVELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFO3dCQUN2QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQzlCLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTs0QkFDZCxPQUFPLEtBQUssQ0FBQzt5QkFDaEI7d0JBQ0QsTUFBTSxRQUFRLEdBQXFCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO3dCQUM1RSxNQUFNLFdBQVcsR0FBcUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7d0JBQ2xGLElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFOzRCQUN6QyxPQUFPLEtBQUssQ0FBQzt5QkFDaEI7d0JBQ0QsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJVCxVQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQzNELFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSUEsVUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO3FCQUNwRTt5QkFBTTt3QkFDSCxNQUFNLElBQUksR0FBcUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7d0JBQzNFLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTs0QkFDZCxPQUFPLEtBQUssQ0FBQzt5QkFDaEI7d0JBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSUEsVUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDckQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDckM7b0JBQ0QsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDbEQsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNuQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztpQkFDcEQ7Z0JBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hGO2lCQUFNO2dCQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDakM7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFTyxRQUFRLENBQUMsVUFBa0IsRUFBRSxPQUFlO1FBQ2hELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNmLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMzQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDM0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN4QixPQUFPLEdBQUcsS0FBSyxDQUFDO1NBQ25CO1FBRUQsWUFBWSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUMvQztJQUVELFdBQVcsQ0FBQyxLQUFhLEVBQUUsSUFBYztRQUNyQyxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ2pJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksRUFBRTtZQUN0RCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixPQUFPLE1BQU0sQ0FBQztLQUNqQjs7QUEvRnNCLDBCQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRTs7QUNqSjdELE1BQU0sZUFBZSxHQUFHLElBQUksdUJBQXVCLEVBQUUsQ0FBQztBQUN0RCxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztNQUVqRCxrQkFBa0I7SUFDM0IsWUFBbUIsSUFBWSxFQUFTLFdBQW1CLEVBQVMsT0FBZSxFQUFTLE1BQXNCLEVBQVMsY0FBdUI7UUFBL0gsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFTLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQVMsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQVMsbUJBQWMsR0FBZCxjQUFjLENBQVM7S0FBSzs7Q0FDMUo7U0FPZSxhQUFhLENBQUMsR0FBcUI7SUFDL0MsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLENBQUM7U0FFcUIsY0FBYyxDQUFDLEdBQXFCLEVBQUUsUUFBa0IsRUFBRSxJQUFrQjs7UUFDOUYsT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDdEQ7Q0FBQTtTQUVlLG9CQUFvQixDQUFDLFdBQXNDO0lBQ3ZFLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDMUIsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7S0FDakU7U0FBTTtRQUNILGVBQWUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDL0Q7QUFDTCxDQUFDO1NBRWUsdUJBQXVCLENBQUMsTUFBNEI7SUFDaEUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRU0sTUFBTSw0QkFBNEIsR0FBRyxJQUFJLGtCQUFrQixDQUFDLDhCQUE4QixFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0ssTUFBTSx5QkFBeUIsR0FBRyxJQUFJLGtCQUFrQixDQUFDLDJCQUEyQixFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakssTUFBTSwwQkFBMEIsR0FBRyxJQUFJLGtCQUFrQixDQUFDLDRCQUE0QixFQUFFLHNCQUFzQixFQUFFLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFdkssTUFBTSxtQkFBbUIsR0FBRztJQUMvQiw0QkFBNEI7SUFDNUIseUJBQXlCO0lBQ3pCLDBCQUEwQjtDQUM3Qjs7QUMzQ0QsTUFBTSxlQUFlO0lBQXJCO1FBQ1ksb0JBQWUsR0FBMEIsRUFBRSxDQUFDO0tBYXZEO0lBWEcsUUFBUSxDQUFDLGNBQThCO1FBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0tBQzdDO0lBRUQsU0FBUyxDQUFDLEdBQVc7UUFDakIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztLQUN4RDtJQUVELE9BQU8sQ0FBQyxRQUEyQztRQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUMxQztDQUNKO0FBRUQsTUFBTSxjQUFjO0lBWWhCLFlBQW9CLGdCQUFpQztRQUFqQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBSjlDLFNBQUksR0FBa0IsRUFBRSxDQUFDO0tBSTBCO0lBRTFELElBQUksQ0FBQyxZQUFvQyxFQUFFLE9BQWdCLEVBQUUsV0FBd0I7UUFDakYsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFFeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3RELEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLG1CQUFtQixDQUFDO1lBQ3JDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztZQUMvQixFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDM0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1NBQzdCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMxQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxtQkFBbUIsQ0FBQztZQUNyQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7WUFDL0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQzNCLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztTQUM3QixDQUFDLENBQUM7S0FDTjtJQUVELGtCQUFrQixDQUFDLEtBQW9CO1FBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUMzQztJQUVELE9BQU8sQ0FBQyxJQUFtQjtRQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDcEM7SUFFTyxPQUFPLENBQUMsRUFBZSxFQUFFLElBQW1CO1FBQ2hELElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDckMsT0FBTztTQUNWO1FBQ0QsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ2YsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1NBQzdCO2FBQU07WUFDSCxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDM0IsRUFBRSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDdkI7S0FDSjtJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtLQUN2QjtJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0tBQ2hDO0lBRUQsTUFBTSxDQUFDLEdBQVc7UUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztLQUN0RDtJQUVELE1BQU07UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN2QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzlCO0lBRUQsVUFBVSxDQUFDLE1BQWU7UUFDdEIsSUFBSSxDQUFDLE9BQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUN0QztJQUVELGdCQUFnQixDQUFDLEdBQVc7UUFDeEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQy9DO0lBRUQsWUFBWTtRQUNSLE9BQU8sSUFBSSxDQUFDLFlBQWEsQ0FBQyxLQUFnQixDQUFDO0tBQzlDO0lBRUQsYUFBYTtRQUNULE9BQU8sSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7S0FDakU7Q0FDSjtNQUVZLG1CQUFtQjtJQUk1QixZQUFtQixRQUF5QjtRQUF6QixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDeEM7SUFFRCxHQUFHLENBQUMsR0FBVztRQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQztLQUNmO0lBRUQsSUFBSSxDQUFDLElBQVk7UUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVELElBQUksQ0FBQyxJQUFZO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFRCxHQUFHLENBQUMsR0FBVztRQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQztLQUNmO0lBRUQsVUFBVSxDQUFDLFVBQTJCO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQztLQUNmO0lBRUQsSUFBSSxDQUFDLFNBQWlCO1FBQ2xCLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztLQUN0RTtJQUVELFFBQVEsQ0FBQyxTQUFpQjtRQUN0QixPQUFPLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDckU7SUFFRCxNQUFNLENBQUMsU0FBaUI7UUFDcEIsT0FBTyxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDakU7SUFFRCxNQUFNLENBQUMsU0FBa0I7UUFDckIsT0FBTyxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDakU7SUFFRCxRQUFRLENBQUMsU0FBaUI7UUFDdEIsT0FBTyxJQUFJLDJCQUEyQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDbkU7Q0FDSjtBQVNELE1BQWUsMkJBQTJCO0lBRXRDLFlBQXNCLE9BQXVCLEVBQVksU0FBWTtRQUEvQyxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUFZLGNBQVMsR0FBVCxTQUFTLENBQUc7S0FBSzs7SUFFMUUsaUJBQWlCLENBQUMsZUFBZ0M7UUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQy9DLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFJUyxhQUFhO1FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNkLENBQUMsQ0FBQztLQUNOO0lBRVMsaUJBQWlCLENBQUksS0FBa0IsRUFBRSxXQUFpQztRQUNoRixPQUFPLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztLQUNqRjtDQUVKO0FBRUQsTUFBTSx1QkFBd0IsU0FBUSwyQkFBbUM7SUFJckUsWUFBWSxPQUF1QixFQUFVLFFBQWlCLEVBQUUsU0FBaUI7UUFDN0UsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQURlLGFBQVEsR0FBUixRQUFRLENBQVM7S0FFN0Q7SUFFRCxXQUFXLENBQUMsV0FBbUI7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVELEtBQUssQ0FBSSxLQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBZ0M7O2dCQUM5QyxJQUFJO3FCQUNDLGNBQWMsQ0FBQyxNQUFBLElBQUksQ0FBQyxZQUFZLG1DQUFJLEVBQUUsQ0FBQztxQkFDdkMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7cUJBQ3hCLFFBQVEsQ0FBQyxDQUFPLEtBQUs7b0JBQ2xCLElBQUk7d0JBQ0EsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDdkIsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7d0JBQ3ZCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDakMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO3FCQUN4QjtvQkFBQyxPQUFPLENBQUMsRUFBRTt3QkFDUixJQUFJLENBQUMsWUFBWSxLQUFLLEVBQUU7NEJBQ3BCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQ3pDOzZCQUFNLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFOzRCQUM5QixPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ2pDO3FCQUNKO2lCQUNKLENBQUEsQ0FBQyxDQUFBO2FBQ1QsQ0FBQTtZQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDZixPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUTtvQkFDekIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN0QixDQUFDLENBQUE7YUFDTDtpQkFBTTtnQkFDSCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSTtvQkFDakIsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNsQixDQUFDLENBQUE7YUFDTDtTQUNKLENBQUMsQ0FBQztLQUNOO0NBQ0o7QUFFRCxNQUFNLHlCQUEwQixTQUFRLDJCQUFtQztJQUl2RSxZQUFZLE9BQXVCLEVBQUUsU0FBaUI7UUFDbEQsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztLQUM3QjtJQUVELFdBQVcsQ0FBQyxXQUFtQjtRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztLQUNmO0lBRUQsS0FBSyxDQUFJLEtBQXVCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7WUFDaEUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFnQzs7Z0JBQzlDLElBQUk7cUJBQ0MsY0FBYyxDQUFDLE1BQUEsSUFBSSxDQUFDLFlBQVksbUNBQUksRUFBRSxDQUFDO3FCQUN2QyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztxQkFDbkMsUUFBUSxDQUFDLENBQU8sS0FBSztvQkFDbEIsSUFBSTt3QkFDQSxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzFCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQixPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2pDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztxQkFDeEI7b0JBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ1IsSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFOzRCQUNwQixPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3lCQUN6Qzs2QkFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTs0QkFDOUIsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUNqQztxQkFDSjtpQkFDSixDQUFBLENBQUMsQ0FBQTthQUNULENBQUE7WUFDRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUTtnQkFDckIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3RCLENBQUMsQ0FBQTtTQUNMLENBQUMsQ0FBQztLQUNOO0NBQ0o7QUFFRCxNQUFNLHlCQUEwQixTQUFRLDJCQUFvQztJQUV4RSxLQUFLLENBQUksS0FBd0I7UUFDN0IsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUU7WUFDbkYsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FDckIsTUFBTTtpQkFDRCxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztpQkFDeEIsUUFBUSxDQUFDLENBQU8sS0FBSztnQkFDbEIsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUN4QixDQUFBLENBQUMsQ0FDVCxDQUFDO1NBQ0wsQ0FBQyxDQUFBO0tBQ0w7Q0FFSjtBQUVELE1BQU0sY0FBYztJQUNoQixZQUFtQixLQUFhLEVBQVMsS0FBYTtRQUFuQyxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBUTtLQUFLO0NBQzlEO0FBRUQsTUFBTSwyQkFBK0IsU0FBUSwyQkFBbUM7SUFBaEY7O1FBRVksWUFBTyxHQUEwQixFQUFFLENBQUM7S0FzQi9DO0lBcEJHLFNBQVMsQ0FBQyxLQUFhLEVBQUUsS0FBYTtRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQztLQUNmO0lBRUQsS0FBSyxDQUFJLEtBQXVCO1FBQzVCLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFO1lBQ25GLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTTtvQkFDdkIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDM0MsQ0FBQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQU8sS0FBSztvQkFDbkIsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDeEIsQ0FBQSxDQUFDLENBQUM7YUFDTixDQUFDLENBQUE7U0FDTCxDQUFDLENBQUE7S0FDTDtDQUVKO0FBb0JELE1BQU0sZ0JBQWdCO0lBSWxCLFlBQW9CLE9BQXVCLEVBQVUsS0FBa0IsRUFBRSxZQUFlLEVBQVUsa0JBQXdDO1FBQXRILFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBYTtRQUEyQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO1FBQ3RJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUMsSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRTtZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDdkM7S0FDSjtJQUVELGFBQWEsQ0FBQyxXQUF3Qjs7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSVUsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDbkMsT0FBTyxDQUFDLE1BQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLG1DQUFJLEVBQUUsQ0FBQzthQUNoQyxPQUFPLENBQUMsTUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksbUNBQUksRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDcEIsT0FBTztZQUNQLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDeEIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7S0FDbEI7SUFFRCxJQUFJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDcEQ7SUFFRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBSSxDQUFDO0tBQzVCO0lBRUQsSUFBSSxDQUFDLFFBQWE7UUFDZCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsT0FBTztTQUNWO1FBQ0QsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ2xDO0tBQ0o7SUFFRCxLQUFLLENBQUMsUUFBYTtRQUNmLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7S0FDNUM7SUFFRCxNQUFNLENBQUMsR0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDbkM7Q0FDSjtNQUVZLFlBQVk7SUFFckIsWUFBbUIsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7UUFEeEIsYUFBUSxHQUFrQyxFQUFFLENBQUM7S0FFbkQ7SUFFRCxXQUFXLENBQUMsR0FBRyxhQUE0QztRQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO0tBQ3hDO0NBQ0o7TUFFWSxlQUFlO0lBQTVCO1FBRVksV0FBTSxHQUF3QixFQUFFLENBQUM7UUFDakMsYUFBUSxHQUFvQixJQUFJLGVBQWUsRUFBRSxDQUFDO0tBOEI3RDtJQTVCRyxpQkFBaUI7UUFDYixPQUFPLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2pEO0lBRUQsUUFBUSxDQUFDLElBQVk7UUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFFRCxTQUFTLENBQUMsRUFBZTtRQUNyQixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLO1lBQ3JCLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVE7Z0JBQzNCLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDOUIsQ0FBQyxDQUFDO1NBQ04sQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQ3REO0lBRU0sT0FBTyxDQUFDLFFBQW1EO1FBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUs7WUFDckIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTztnQkFDMUIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3JCLENBQUMsQ0FBQTtTQUNMLENBQUMsQ0FBQTtLQUNMO0NBQ0o7TUFFWSxTQUFTO0lBQ2xCLFNBQVMsQ0FBQyxRQUFnQjtRQUN0QixPQUFPVCxNQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQy9CO0lBQ0QsT0FBTyxDQUFDLEtBQVc7UUFDZixPQUFPLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUMzQjtDQUNKO01BRVksUUFBUTtJQUNqQixTQUFTLENBQUMsUUFBVztRQUNqQixPQUFPLFFBQVEsQ0FBQztLQUNuQjtJQUNELE9BQU8sQ0FBQyxLQUFRO1FBQ1osT0FBTyxLQUFLLENBQUM7S0FDaEI7Q0FDSjtNQUVZLFdBQVc7SUFDcEIsU0FBUyxDQUFDLFFBQWdCO1FBQ3RCLE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2hDO0lBQ0QsT0FBTyxDQUFDLEtBQWM7UUFDbEIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzdDO0NBQ0o7TUFFWSx1QkFBdUI7SUFFaEMsU0FBUyxDQUFDLFFBQWdCO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUUsQ0FBQzs7UUFFN0UsT0FBTyxNQUFNLENBQUM7S0FDakI7SUFDRCxPQUFPLENBQUMsS0FBeUI7UUFDN0IsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDO0tBQ3JCOzs7QUMxZEUsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDO0FBRXBDLE1BQU0sUUFBUTtJQWtCWjtRQWhCQSxhQUFRLEdBQW9CLElBQUksZUFBZSxFQUFFLENBQUM7UUFpQmhELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFekUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFO2FBQ2xELEdBQUcsQ0FBQyxjQUFjLENBQUM7YUFDbkIsSUFBSSxDQUFDLGVBQWUsQ0FBQzthQUNyQixJQUFJLENBQUMsa0RBQWtELENBQUM7YUFDeEQsR0FBRyxDQUFDLFVBQVUsQ0FBQzthQUNmLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDYixXQUFXLENBQUMsY0FBYyxDQUFDO2FBQzNCLEtBQUssQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFMUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUU7YUFDM0QsR0FBRyxDQUFDLHVCQUF1QixDQUFDO2FBQzVCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQzthQUMvQixJQUFJLENBQUMsb0RBQW9ELENBQUM7YUFDMUQsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLEtBQUssQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFO2FBQzVDLEdBQUcsQ0FBQyxRQUFRLENBQUM7YUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUM7YUFDdkIsSUFBSSxDQUFDLDhDQUE4QyxDQUFDO2FBQ3BELFFBQVEsQ0FBQywyREFBMkQsQ0FBQzthQUNyRSxXQUFXLENBQUMsMkRBQTJELENBQUM7YUFDeEUsS0FBSyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsQ0FBQztRQUU1QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUU7YUFDaEQsR0FBRyxDQUFDLFlBQVksQ0FBQzthQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDO2FBQ25CLElBQUksQ0FBQywwRUFBMEUsQ0FBQzthQUNoRixHQUFHLENBQUMsVUFBVSxDQUFDO2FBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUNsQixXQUFXLENBQUMsWUFBWSxDQUFDO2FBQ3pCLGlCQUFpQixDQUFDLE9BQU87WUFDeEIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxrQ0FBa0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyRixDQUFDO2FBQ0QsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTthQUN0RCxHQUFHLENBQUMsa0JBQWtCLENBQUM7YUFDdkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDO2FBQzFCLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQzthQUN4QyxHQUFHLENBQUMsVUFBVSxDQUFDO2FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLEtBQUssQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFO2FBQ3BELEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQzthQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUM7YUFDNUIsSUFBSSxDQUFDLGlGQUFpRixDQUFDO2FBQ3ZGLEdBQUcsQ0FBQyxVQUFVLENBQUM7YUFDZixJQUFJLENBQUMsa0JBQWtCLENBQUM7YUFDeEIsV0FBVyxDQUFDLGtCQUFrQixDQUFDO2FBQy9CLGlCQUFpQixDQUFDLE9BQU87WUFDeEIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxrQ0FBa0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyRixDQUFDO2FBQ0QsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTthQUMzRCxHQUFHLENBQUMsdUJBQXVCLENBQUM7YUFDNUIsSUFBSSxDQUFDLDJCQUEyQixDQUFDO2FBQ2pDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQzthQUNoRCxHQUFHLENBQUMsVUFBVSxDQUFDO2FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLGlCQUFpQixDQUFDLE9BQU87WUFDeEIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxrQ0FBa0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyRixDQUFDO2FBQ0QsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTthQUN6RCxHQUFHLENBQUMscUJBQXFCLENBQUM7YUFDMUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDO2FBQzlCLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQzthQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ1YsV0FBVyxDQUFDLElBQUksQ0FBQzthQUNqQixpQkFBaUIsQ0FBQyxPQUFPO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7WUFDN0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLFVBQVUsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1NBQzVFLENBQUM7YUFDRCxLQUFLLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXpCLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTthQUMzRCxHQUFHLENBQUMsdUJBQXVCLENBQUM7YUFDNUIsSUFBSSxDQUFDLHlCQUF5QixDQUFDO2FBQy9CLElBQUksQ0FBQywwREFBMEQsQ0FBQzthQUNoRSxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1RyxJQUFJLENBQUMsYUFBYSxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLHVCQUF1QixFQUFFLENBQUMsQ0FBQztRQUUvRSxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTthQUNsRSxHQUFHLENBQUMsOEJBQThCLENBQUM7YUFDbkMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDO2FBQ3RELElBQUksQ0FBQywwR0FBMEcsQ0FBQzthQUNoSCxHQUFHLENBQUMsVUFBVSxDQUFDO2FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLGlCQUFpQixDQUFDLE9BQU87WUFDeEIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsRixDQUFDO2FBQ0QsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTthQUM5RCxHQUFHLENBQUMsMEJBQTBCLENBQUM7YUFDL0IsSUFBSSxDQUFDLGlDQUFpQyxDQUFDO2FBQ3ZDLElBQUksQ0FBQyxrRkFBa0YsQ0FBQzthQUN4RixHQUFHLENBQUMsVUFBVSxDQUFDO2FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLGlCQUFpQixDQUFDLE9BQU87WUFDeEIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsRixDQUFDO2FBQ0QsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTthQUN0RCxHQUFHLENBQUMsa0JBQWtCLENBQUM7YUFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDO2FBQzNCLElBQUksQ0FBQyx3R0FBd0csQ0FBQzthQUM5RyxNQUFNLENBQUMsRUFBRSxDQUFDO2FBQ1YsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTthQUM5RCxHQUFHLENBQUMsMEJBQTBCLENBQUM7YUFDL0IsSUFBSSxDQUFDLHlCQUF5QixDQUFDO2FBQy9CLElBQUksQ0FBQyxvS0FBb0ssQ0FBQzthQUMxSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ1QsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsUUFBUTthQUNWLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQzthQUNqQyxXQUFXLENBQ1YsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMscUJBQXFCLENBQzNCLENBQUM7UUFDSixJQUFJLENBQUMsUUFBUTthQUNWLFFBQVEsQ0FBQyxRQUFRLENBQUM7YUFDbEIsV0FBVyxDQUNWLElBQUksQ0FBQyxtQkFBbUIsRUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FDbkIsQ0FBQztRQUNKLElBQUksQ0FBQyxRQUFRO2FBQ1YsUUFBUSxDQUFDLG1DQUFtQyxDQUFDO2FBQzdDLFdBQVcsQ0FDVixzQkFBc0IsQ0FBQyxrQ0FBa0MsRUFDekQsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxxQkFBcUIsQ0FDM0IsQ0FBQztRQUNKLElBQUksQ0FBQyxRQUFRO2FBQ1YsUUFBUSxDQUFDLGdDQUFnQyxDQUFDO2FBQzFDLFdBQVcsQ0FDVixzQkFBc0IsQ0FBQywrQkFBK0IsRUFDdEQsSUFBSSxDQUFDLDRCQUE0QixFQUNqQyxJQUFJLENBQUMsd0JBQXdCLENBQzlCLENBQUM7UUFDSixJQUFJLENBQUMsUUFBUTthQUNWLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQzthQUMzQyxXQUFXLENBQ1Ysc0JBQXNCLENBQUMsZ0NBQWdDLENBQ3hELENBQUM7UUFDSixJQUFJLENBQUMsUUFBUTthQUNWLFFBQVEsQ0FBQyxVQUFVLENBQUM7YUFDcEIsV0FBVyxDQUNWLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsSUFBSSxDQUFDLHdCQUF3QixDQUM5QixDQUFDO1FBRUosTUFBTSxNQUFNLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLEVBQUUsTUFBTUQsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDOUUsTUFBTSxDQUFDLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyw0QkFBNEIsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoSCxNQUFNLENBQUMsWUFBWSxDQUFDLDBCQUEwQixDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2xHLE1BQU0sQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDeEcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDakM7SUFFTSxPQUFPLENBQUMsUUFBbUQ7UUFDaEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDakM7Q0FFRjtBQUVELE1BQU0sc0JBQXNCO0lBUzFCLFlBQW9CLFFBQXlCO1FBQXpCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBUHJDLDJCQUFzQixHQUFvQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzVFLDJCQUFzQixHQUEwQyxFQUFFLENBQUM7UUFPakUsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzVHLElBQUksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLDBCQUEwQixDQUFDLENBQUM7S0FDekc7SUFFTyw4QkFBOEIsQ0FBQyxNQUEwQjtRQUMvRCxNQUFNLEdBQUcsR0FBRyxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFO2FBQzlDLEdBQUcsQ0FBQyxHQUFHLENBQUM7YUFDUixJQUFJLENBQUMsVUFBVSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDcEMsSUFBSSxDQUFDLFVBQVUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3BDLEdBQUcsQ0FBQyxVQUFVLENBQUM7YUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQzthQUM3QixpQkFBaUIsQ0FBQyxPQUFPO1lBQ3hCLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUVBLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM3RixDQUFDO2FBQ0QsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztLQUNoQjtJQUVPLG9CQUFvQixDQUFDLE9BQXVDO1FBQ2xFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxzQkFBc0I7YUFDaEQsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ3BCLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDaEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUE4QixDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDM0Qsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUM7S0FDdkM7Q0FDRjtBQUVNLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7TUFFMUIsa0JBQW1CLFNBQVFXLHlCQUFnQjtJQUN0RCxZQUNFLEdBQVEsRUFDUixNQUFnQjtRQUVoQixLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3BCO0lBRUQsT0FBTztRQUNMLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFM0IsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDMUM7OztNQ2pRVSxPQUFPO0lBR2xCLFlBQVksSUFBWSxFQUFFLE9BQWU7UUFDdkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztLQUNoRDtJQUVNLFlBQVksQ0FBQyxXQUFvQixJQUFJO1FBQzFDLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNyRDtJQUVNLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDNUI7SUFFWSxtQkFBbUIsQ0FBQyxVQUEyRDs7WUFDMUYsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMvQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2xDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtvQkFDakIsT0FBTztpQkFDUjtnQkFDRCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDL0M7U0FDRjtLQUFBO0lBRVksY0FBYyxDQUFDLFFBQWtCLEVBQUUsSUFBc0I7O1lBQ3BFLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMvQztLQUFBO0lBRWEsa0JBQWtCLENBQzlCLFFBQWtCLEVBQ2xCLElBQXNCOztZQUV0QixNQUFNLFFBQVEsR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRSxJQUFJLFFBQVEsRUFBRTtnQkFDWixPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQzdEO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0VBQXNFLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDaEc7WUFDRCxPQUFPLFFBQVEsQ0FBQztTQUNqQjtLQUFBO0lBRU0sVUFBVTtRQUNmLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztLQUM5Qjs7O01DNUNVLG1CQUFtQjtJQUU5QixZQUFvQixLQUFZLEVBQVUsU0FBb0MsRUFBVSxTQUFvQjtRQUF4RixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBMkI7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFXO0tBQUs7SUFFM0csWUFBWSxDQUFDLFFBQWtCLEVBQUUsSUFBbUI7O1lBQ3hELE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0QsSUFBSSxFQUFFLElBQUksWUFBWUMsY0FBSyxDQUFDLEVBQUU7Z0JBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0NBQStDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JFLE9BQU87YUFDUjs7WUFHRCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLFlBQVlDLHFCQUFZLENBQUMsRUFBRTtnQkFDeEMsT0FBTzthQUNSO1lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQzNCO2dCQUNFLElBQUksRUFBRSxRQUFRLENBQUMsU0FBUztnQkFDeEIsRUFBRSxFQUFFLENBQUM7YUFDTixFQUNEO2dCQUNFLElBQUksRUFBRSxRQUFRLENBQUMsU0FBUztnQkFDeEIsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNO2FBQ2hCLENBQ0YsQ0FBQztTQUNIO0tBQUE7SUFFSyxVQUFVLENBQUMsSUFBWTs7WUFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsT0FBTyxNQUFNLENBQUM7U0FDZjtLQUFBO0lBRUssVUFBVSxDQUFDLElBQW1CLEVBQUUsV0FBb0IsS0FBSzs7WUFDN0QsT0FBTyxDQUFDLEtBQUssQ0FDWCw4REFBOEQsRUFDOUQsSUFBSSxDQUFDLElBQUksRUFDVCxRQUFRLENBQ1QsQ0FBQztZQUNGLElBQUksRUFBRSxJQUFJLFlBQVlELGNBQUssQ0FBQyxFQUFFO2dCQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNsRSxPQUFPLEtBQUssQ0FBQzthQUNkO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzlCLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3BELE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMxRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7b0JBQ3JELE9BQU8sS0FBSyxDQUFDO2lCQUNkO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDekMsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7YUFDRjtZQUNELElBQUksUUFBUSxFQUFFO2dCQUNaLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNqQjtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FBQTtJQUVLLHFCQUFxQixDQUFDLFVBQWtCLEVBQUUsY0FBc0I7O1lBQ3BFLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztnQkFDdEIsTUFBTSxPQUFPLENBQUMsbUJBQW1CLENBQUMsUUFBUTtvQkFDeEMsSUFBSSxTQUFpQixDQUFDO29CQUN0QixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO3dCQUM3QixTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7cUJBQ2xEO3lCQUFNO3dCQUNMLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDOUM7b0JBQ0QsT0FBTyxFQUFFLENBQUM7b0JBQ1YsYUFBYSxFQUFFLENBQUM7b0JBQ2hCLE9BQU87d0JBQ0wsT0FBTyxFQUFFLFNBQVM7cUJBQ25CLENBQUM7aUJBQ0gsQ0FBQyxDQUFBO2dCQUNGLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtvQkFDckIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUE7aUJBQ3BEO2FBQ0Y7WUFDRCxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO1lBQ2hELFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUM7WUFDeEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFO2dCQUNmLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQzdCO1lBQ0QsT0FBTyxPQUFPLENBQUM7U0FDaEI7S0FBQTtJQUVPLGNBQWMsQ0FBQyxJQUFXO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUM7S0FDOUM7SUFFSyxjQUFjOztZQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDaEQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNwQztZQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtLQUFBO0lBRUssY0FBYyxDQUFDLFFBQWtCLEVBQUUsT0FBZ0I7O1lBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdELElBQUksRUFBRSxJQUFJLFlBQVlBLGNBQUssQ0FBQyxFQUFFO2dCQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN6RCxPQUFPO2FBQ1I7WUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNwRSxNQUFNLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO2dCQUNyQyxPQUFPO2dCQUNQLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTthQUNwQixDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztTQUNyRDtLQUFBO0lBRUssV0FBVyxDQUFDLElBQVcsRUFBRSxVQUFrQjs7WUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzlCLE9BQU87YUFDUjtZQUNELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRXBFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxDQUFDO1lBQ25GLElBQUksUUFBUSxFQUFFO2dCQUNaLE1BQU0sT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUU7b0JBQ3JDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2lCQUN4QixDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQixJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNULE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2FBQ3BDO1lBQ0QsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDckQ7S0FBQTtJQUVPLFFBQVE7UUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRTtZQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7WUFDN0QsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDN0I7OztNQzFKVSxZQUFZO0lBT3ZCLFlBQW9CLE1BQWdCLEVBQVUsU0FBb0I7UUFBOUMsV0FBTSxHQUFOLE1BQU0sQ0FBVTtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFMMUQsY0FBUyxHQUFHLElBQUksQ0FBQztRQUN6QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ2xCLFlBQU8sR0FBdUIsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsVUFBSyxHQUF1QixJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUd0RCxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU87WUFDdEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDbEIsT0FBTztpQkFDUjtnQkFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztpQkFDNUI7Z0JBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7YUFDckIsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFBO0tBQ0g7SUFFSyxJQUFJOztZQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUMzQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQzNCLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDbEMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtnQkFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUMvQjtZQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDckMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2dCQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQzlCLENBQUMsQ0FBQTtZQUVGLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUTtvQkFDM0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQXdCLENBQUM7b0JBQ3hFLElBQUksQ0FBQyxlQUFlLEVBQUU7d0JBQ3BCLE9BQU87cUJBQ1I7b0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQ3hCLFFBQVEsRUFDUixlQUFlLENBQUMsR0FBRyxDQUNqQixDQUFDLENBQUMsS0FDQSxJQUFJVixVQUFRLENBQ1YsUUFBUSxFQUNSLENBQUMsQ0FBQyxLQUFLLEVBQ1BGLFVBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUN0QixDQUFDLENBQUMsU0FBUyxFQUNYLEtBQUssQ0FDTixDQUNKLENBQ0YsQ0FBQztpQkFDSCxDQUFDLENBQUM7YUFDSjtZQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7YUFDeEI7U0FDRjtLQUFBO0lBRUssSUFBSSxDQUFDLFFBQWlCLEtBQUs7O1lBQy9CLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUMzQixPQUFPO2FBQ1I7WUFDRCxPQUFPLENBQUMsS0FBSyxDQUNYLGlEQUFpRCxFQUNqRCxLQUFLLEVBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FDYixDQUFDO1lBQ0YsTUFBTSxhQUFhLEdBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRO2dCQUNqRCxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTTtvQkFDdkMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO29CQUNmLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDeEIsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTO2lCQUN4QixDQUFDLENBQUMsQ0FBQzthQUNMLENBQUMsQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNwQixRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU87Z0JBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDekIsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQkFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSztnQkFDM0IsU0FBUyxFQUFFLGFBQWE7Z0JBQ3hCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7Z0JBQ3ZCLFFBQVE7YUFDVCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztTQUN0QjtLQUFBOzs7QUN6R0g7QUFHQTtBQUNBO0FBQ0E7U0FDZ0Isa0JBQWtCLENBQUMsTUFBYztJQUM3QyxJQUFJLENBQUNjLGlCQUFRLENBQUMsUUFBUSxFQUFFO1FBQ3BCLE9BQU87S0FDVjtJQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsQ0FBQztJQUNsRCxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFjLEtBQUssQ0FBQyxHQUFHLFFBQW1CO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDM0QsQ0FBQztJQUVGLE9BQU8sQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZDOztBQzFCQSxTQUFTLElBQUksR0FBRyxHQUFHO0FBZ0JuQixTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUU7QUFDakIsSUFBSSxPQUFPLEVBQUUsRUFBRSxDQUFDO0FBQ2hCLENBQUM7QUFDRCxTQUFTLFlBQVksR0FBRztBQUN4QixJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBQ0QsU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQ3RCLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBQ0QsU0FBUyxXQUFXLENBQUMsS0FBSyxFQUFFO0FBQzVCLElBQUksT0FBTyxPQUFPLEtBQUssS0FBSyxVQUFVLENBQUM7QUFDdkMsQ0FBQztBQUNELFNBQVMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDOUIsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsS0FBSyxPQUFPLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQztBQUNsRyxDQUFDO0FBWUQsU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFO0FBQ3ZCLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQXVRRCxTQUFTLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFO0FBQzlCLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBQ0QsU0FBUyxhQUFhLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUU7QUFDdkQsSUFBSSxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRTtBQUMxRCxRQUFRLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2QyxRQUFRLEtBQUssQ0FBQyxFQUFFLEdBQUcsY0FBYyxDQUFDO0FBQ2xDLFFBQVEsS0FBSyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFDbkMsUUFBUSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNuRCxLQUFLO0FBQ0wsQ0FBQztBQUNELFNBQVMsa0JBQWtCLENBQUMsSUFBSSxFQUFFO0FBQ2xDLElBQUksSUFBSSxDQUFDLElBQUk7QUFDYixRQUFRLE9BQU8sUUFBUSxDQUFDO0FBQ3hCLElBQUksTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztBQUM1RSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtBQUNuQixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTCxJQUFJLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFNRCxTQUFTLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDeEMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQXlCRCxTQUFTLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtBQUN0QyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBU0QsU0FBUyxNQUFNLENBQUMsSUFBSSxFQUFFO0FBQ3RCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUNELFNBQVMsWUFBWSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUU7QUFDN0MsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ25ELFFBQVEsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN2QyxLQUFLO0FBQ0wsQ0FBQztBQUNELFNBQVMsT0FBTyxDQUFDLElBQUksRUFBRTtBQUN2QixJQUFJLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBbUJELFNBQVMsSUFBSSxDQUFDLElBQUksRUFBRTtBQUNwQixJQUFJLE9BQU8sUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBQ0QsU0FBUyxLQUFLLEdBQUc7QUFDakIsSUFBSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBSUQsU0FBUyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQy9DLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkQsSUFBSSxPQUFPLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQTZCRCxTQUFTLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRTtBQUN0QyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUk7QUFDckIsUUFBUSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3hDLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUs7QUFDbkQsUUFBUSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBMkRELFNBQVMsUUFBUSxDQUFDLE9BQU8sRUFBRTtBQUMzQixJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQXVIRCxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQzlCLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckIsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSTtBQUMvQixRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLENBQUM7QUFlRCxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQ3RDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDdkQsUUFBUSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLFFBQVEsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRTtBQUN0QyxZQUFZLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ25DLFlBQVksT0FBTztBQUNuQixTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUksTUFBTSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBT0QsU0FBUyxZQUFZLENBQUMsTUFBTSxFQUFFO0FBQzlCLElBQUksTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLElBQUksT0FBTyxlQUFlLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQztBQUN0RCxDQUFDO0FBeURELFNBQVMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0FBQzdDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUE4TUQ7QUFDQSxJQUFJLGlCQUFpQixDQUFDO0FBQ3RCLFNBQVMscUJBQXFCLENBQUMsU0FBUyxFQUFFO0FBQzFDLElBQUksaUJBQWlCLEdBQUcsU0FBUyxDQUFDO0FBQ2xDLENBQUM7QUFDRCxTQUFTLHFCQUFxQixHQUFHO0FBQ2pDLElBQUksSUFBSSxDQUFDLGlCQUFpQjtBQUMxQixRQUFRLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztBQUM1RSxJQUFJLE9BQU8saUJBQWlCLENBQUM7QUFDN0IsQ0FBQztBQUlELFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRTtBQUNyQixJQUFJLHFCQUFxQixFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUNELFNBQVMsV0FBVyxDQUFDLEVBQUUsRUFBRTtBQUN6QixJQUFJLHFCQUFxQixFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckQsQ0FBQztBQXdDRDtBQUNBLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBRTVCLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUMzQixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUMzQyxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUM3QixTQUFTLGVBQWUsR0FBRztBQUMzQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtBQUMzQixRQUFRLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUNoQyxRQUFRLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQyxLQUFLO0FBQ0wsQ0FBQztBQUtELFNBQVMsbUJBQW1CLENBQUMsRUFBRSxFQUFFO0FBQ2pDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFJRCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDckIsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNqQyxTQUFTLEtBQUssR0FBRztBQUNqQixJQUFJLElBQUksUUFBUTtBQUNoQixRQUFRLE9BQU87QUFDZixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDcEIsSUFBSSxHQUFHO0FBQ1A7QUFDQTtBQUNBLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzdELFlBQVksTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsWUFBWSxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM3QyxZQUFZLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDakMsU0FBUztBQUNULFFBQVEscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEMsUUFBUSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLFFBQVEsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNO0FBQ3ZDLFlBQVksaUJBQWlCLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUN0QztBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUM3RCxZQUFZLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pELFlBQVksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDL0M7QUFDQSxnQkFBZ0IsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3QyxnQkFBZ0IsUUFBUSxFQUFFLENBQUM7QUFDM0IsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDcEMsS0FBSyxRQUFRLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtBQUN0QyxJQUFJLE9BQU8sZUFBZSxDQUFDLE1BQU0sRUFBRTtBQUNuQyxRQUFRLGVBQWUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ2hDLEtBQUs7QUFDTCxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUM3QixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDckIsSUFBSSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDM0IsQ0FBQztBQUNELFNBQVMsTUFBTSxDQUFDLEVBQUUsRUFBRTtBQUNwQixJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7QUFDOUIsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDcEIsUUFBUSxPQUFPLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ2xDLFFBQVEsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztBQUMvQixRQUFRLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFFBQVEsRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BELFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUNyRCxLQUFLO0FBQ0wsQ0FBQztBQWVELE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDM0IsSUFBSSxNQUFNLENBQUM7QUFDWCxTQUFTLFlBQVksR0FBRztBQUN4QixJQUFJLE1BQU0sR0FBRztBQUNiLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFDWixRQUFRLENBQUMsRUFBRSxFQUFFO0FBQ2IsUUFBUSxDQUFDLEVBQUUsTUFBTTtBQUNqQixLQUFLLENBQUM7QUFDTixDQUFDO0FBQ0QsU0FBUyxZQUFZLEdBQUc7QUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUNuQixRQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsS0FBSztBQUNMLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDdEIsQ0FBQztBQUNELFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDckMsSUFBSSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQzFCLFFBQVEsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkIsS0FBSztBQUNMLENBQUM7QUFDRCxTQUFTLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7QUFDeEQsSUFBSSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQzFCLFFBQVEsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUMvQixZQUFZLE9BQU87QUFDbkIsUUFBUSxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLFFBQVEsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTTtBQUM1QixZQUFZLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsWUFBWSxJQUFJLFFBQVEsRUFBRTtBQUMxQixnQkFBZ0IsSUFBSSxNQUFNO0FBQzFCLG9CQUFvQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLGdCQUFnQixRQUFRLEVBQUUsQ0FBQztBQUMzQixhQUFhO0FBQ2IsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkIsS0FBSztBQUNMLENBQUM7QUFnbUJELFNBQVMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO0FBQ2pDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN2QixDQUFDO0FBSUQsU0FBUyxlQUFlLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFO0FBQ25FLElBQUksTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUM7QUFDMUUsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDM0MsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO0FBQ3hCO0FBQ0EsUUFBUSxtQkFBbUIsQ0FBQyxNQUFNO0FBQ2xDLFlBQVksTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDekUsWUFBWSxJQUFJLFVBQVUsRUFBRTtBQUM1QixnQkFBZ0IsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO0FBQ25ELGFBQWE7QUFDYixpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGdCQUFnQixPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDeEMsYUFBYTtBQUNiLFlBQVksU0FBUyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsS0FBSztBQUNMLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFDRCxTQUFTLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDakQsSUFBSSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDO0FBQzVCLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRTtBQUM5QixRQUFRLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDL0IsUUFBUSxFQUFFLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2hEO0FBQ0E7QUFDQSxRQUFRLEVBQUUsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDM0MsUUFBUSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNwQixLQUFLO0FBQ0wsQ0FBQztBQUNELFNBQVMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3RDLFFBQVEsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3pDLFFBQVEsZUFBZSxFQUFFLENBQUM7QUFDMUIsUUFBUSxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsS0FBSztBQUNMLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBQ0QsU0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDNUcsSUFBSSxNQUFNLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDO0FBQy9DLElBQUkscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckMsSUFBSSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxHQUFHO0FBQzlCLFFBQVEsUUFBUSxFQUFFLElBQUk7QUFDdEIsUUFBUSxHQUFHLEVBQUUsSUFBSTtBQUNqQjtBQUNBLFFBQVEsS0FBSztBQUNiLFFBQVEsTUFBTSxFQUFFLElBQUk7QUFDcEIsUUFBUSxTQUFTO0FBQ2pCLFFBQVEsS0FBSyxFQUFFLFlBQVksRUFBRTtBQUM3QjtBQUNBLFFBQVEsUUFBUSxFQUFFLEVBQUU7QUFDcEIsUUFBUSxVQUFVLEVBQUUsRUFBRTtBQUN0QixRQUFRLGFBQWEsRUFBRSxFQUFFO0FBQ3pCLFFBQVEsYUFBYSxFQUFFLEVBQUU7QUFDekIsUUFBUSxZQUFZLEVBQUUsRUFBRTtBQUN4QixRQUFRLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO0FBQ2hHO0FBQ0EsUUFBUSxTQUFTLEVBQUUsWUFBWSxFQUFFO0FBQ2pDLFFBQVEsS0FBSztBQUNiLFFBQVEsVUFBVSxFQUFFLEtBQUs7QUFDekIsUUFBUSxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsSUFBSTtBQUN4RCxLQUFLLENBQUM7QUFDTixJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVDLElBQUksSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxRQUFRO0FBQ3JCLFVBQVUsUUFBUSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEtBQUs7QUFDeEUsWUFBWSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdEQsWUFBWSxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRTtBQUNuRSxnQkFBZ0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDakQsb0JBQW9CLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkMsZ0JBQWdCLElBQUksS0FBSztBQUN6QixvQkFBb0IsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QyxhQUFhO0FBQ2IsWUFBWSxPQUFPLEdBQUcsQ0FBQztBQUN2QixTQUFTLENBQUM7QUFDVixVQUFVLEVBQUUsQ0FBQztBQUNiLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ2hCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztBQUNqQixJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDOUI7QUFDQSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEdBQUcsZUFBZSxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3BFLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQ3hCLFFBQVEsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO0FBRTdCLFlBQVksTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuRDtBQUNBLFlBQVksRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRCxZQUFZLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEMsU0FBUztBQUNULGFBQWE7QUFDYjtBQUNBLFlBQVksRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzNDLFNBQVM7QUFDVCxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUs7QUFDekIsWUFBWSxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqRCxRQUFRLGVBQWUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUxRixRQUFRLEtBQUssRUFBRSxDQUFDO0FBQ2hCLEtBQUs7QUFDTCxJQUFJLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDNUMsQ0FBQztBQThDRDtBQUNBO0FBQ0E7QUFDQSxNQUFNLGVBQWUsQ0FBQztBQUN0QixJQUFJLFFBQVEsR0FBRztBQUNmLFFBQVEsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDN0IsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7QUFDeEIsUUFBUSxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQyxRQUFRLE9BQU8sTUFBTTtBQUNyQixZQUFZLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdEQsWUFBWSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7QUFDNUIsZ0JBQWdCLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNDLFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDbEIsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDOUMsWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDdEMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2hDLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0FBQ3ZDLFNBQVM7QUFDVCxLQUFLO0FBQ0w7O01DcjJEYSxHQUFHO0lBQ1osWUFBbUIsSUFBbUI7UUFBbkIsU0FBSSxHQUFKLElBQUksQ0FBZTtLQUNyQztJQUVNLE9BQU8sQ0FBQyxJQUFtQjtRQUM5QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNySDtJQUVNLFNBQVM7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2pFO0NBQ0o7TUFFWSxJQUFJO0lBRWIsWUFBb0IsU0FBd0I7UUFBeEIsY0FBUyxHQUFULFNBQVMsQ0FBZTtRQURyQyxTQUFJLEdBQWUsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDekI7S0FDSjtDQUNKO01BRVksS0FBSztJQUVkLFlBQW1CLFVBQXlCO1FBQXpCLGVBQVUsR0FBVixVQUFVLENBQWU7UUFEckMsVUFBSyxHQUFnQixFQUFFLENBQUM7UUFFM0IsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRSxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3JDLE1BQU07YUFDVDtZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDMUI7S0FDSjtJQUVNLFdBQVcsQ0FBQyxJQUFtQjtRQUNsQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0tBQzdGO0NBQ0o7TUFFWSxRQUFRO0lBS2pCLFlBQVksS0FBcUIsRUFBRSxVQUEwQjtRQUN6RCxJQUFJLEtBQUssRUFBRTtZQUNQLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3RCO2FBQU07WUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO1NBQ3pCO1FBRUQsSUFBSSxVQUFVLEVBQUU7WUFDWixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEU7YUFBTTtZQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEU7S0FDSjtJQUVNLFNBQVM7UUFDWixPQUFPLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0tBQ3JGO0lBRU0sYUFBYTtRQUNoQixPQUFPLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDdEY7SUFFTSxjQUFjO1FBQ2pCLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxpQ0FBaUMsQ0FBQztRQUMzRixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUztZQUN4QyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7WUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTO2dCQUM5QixJQUFJLENBQUMsQ0FBQztnQkFDTixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1gsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ3RDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDOUI7eUJBQU07d0JBQ0gsQ0FBQyxHQUFHLElBQUksQ0FBQztxQkFDWjtpQkFDSjtxQkFBTTtvQkFDSCxDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUNaO2dCQUNELElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUMxQixDQUFDLENBQUM7WUFDSCxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7U0FDM0IsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7S0FDZDtJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztLQUN4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dUJDNUN3QixHQUFHLEtBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHOzs7Ozs7Ozs7Ozs7OzsyQ0FURCxHQUFHLEtBQUMsT0FBTyxrQkFBQyxHQUFZO2lEQUN2QixHQUFRLElBQUMsT0FBTyxDQUFDLFdBQVcsU0FDNUMsR0FBRyxLQUFDLElBQUE7MENBRVUsR0FBRyxLQUFDLFNBQVM7dUNBQ2hCLEdBQUcsS0FBQyxJQUFJLENBQUMsUUFBUSxjQUFDLEdBQVEsSUFBQyxLQUFLOzs7R0FQbkQsTUFZSTs7Ozs7Ozs7OztnRUFEQyxHQUFHLEtBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHOzs7NENBVEQsR0FBRyxLQUFDLE9BQU8sa0JBQUMsR0FBWTs7OztrREFDdkIsR0FBUSxJQUFDLE9BQU8sQ0FBQyxXQUFXLFNBQzVDLEdBQUcsS0FBQyxJQUFBOzs7OzJDQUVVLEdBQUcsS0FBQyxTQUFTOzs7O3dDQUNoQixHQUFHLEtBQUMsSUFBSSxDQUFDLFFBQVEsY0FBQyxHQUFRLElBQUMsS0FBSzs7Ozs7Ozs7Ozs7Ozs7OzZCQVJoRCxHQUFJLElBQUMsSUFBSTs7O2tDQUFkLE1BQUk7Ozs7Ozs7Ozs7Ozs7OztHQURWLE1BZ0JJOzs7Ozs7Ozs7OzRCQWZPLEdBQUksSUFBQyxJQUFJOzs7aUNBQWQsTUFBSTs7Ozs7Ozs7Ozs7Ozs7OztzQ0FBSixNQUFJOzs7Ozs7Ozs7Ozs7Ozs7OzZCQW5CRyxHQUFRLElBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSzs7Ozs2QkFDekMsR0FBUSxJQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU07Ozs7Ozs7Ozs7OytCQWdCbEQsR0FBUSxJQUFDLE9BQU8sQ0FBQyxLQUFLOzs7Z0NBQTNCLE1BQUk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FwQmxCLE1BeUNLO0dBeENELE1BS0s7R0FKRCxNQUFtRTs7R0FDbkUsTUFBcUU7OztHQUNyRSxNQUFxRTs7O0dBQ3JFLE1BQStEOztHQUVuRSxNQWlDTztHQWhDSCxNQVVPOztHQUNQLE1Bb0JPOzs7Ozs7Ozs7Ozs7Ozs7O3VFQXBDYyxHQUFRLElBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSzt1RUFDekMsR0FBUSxJQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU07Ozs4QkFnQmxELEdBQVEsSUFBQyxPQUFPLENBQUMsS0FBSzs7OytCQUEzQixNQUFJOzs7Ozs7Ozs7Ozs7Ozs7O29DQUFKLE1BQUk7Ozs7Ozs7Ozs7Ozs7OztPQW5DSCxRQUFRLE9BQWlCLFFBQVE7T0FDakMsWUFBWSxHQUFrQixNQUFNOztPQUNwQyxPQUFPLEdBQThCLElBQUk7RUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJOzs7VUFFWCxhQUFhO0VBQ2xCLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU87a0JBQzVCLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYTs7O1VBRTVCLFNBQVM7RUFDZCxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPO2tCQUMzQixRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVM7Ozs2QkFNVyxhQUFhOytCQUdiLFNBQVM7Z0NBMkJ6QixPQUFPLEtBQUtkLFVBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0NqQ3BFLE1BRU07R0FERixNQUFrRDs7Ozs7Ozs7Ozs7Ozs7T0FqQnZDLFNBQW9CO09BQ3BCLFVBQWtCO09BQ2xCLFFBQWdCO0tBQ3ZCLElBQWlCOztDQUVyQixXQUFXO0VBQ1AsSUFBSSxDQUFDLEtBQUs7RUFDVmUseUJBQWdCLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVM7O0VBQ3JFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFFLENBQUM7T0FDbEIsQ0FBQyxZQUFZLFdBQVc7SUFDeEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsUUFBUTs7Ozs7OztHQU9LLElBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0NDSHRDLEdBQVM7OztnQ0FBZCxNQUFJOzs7Ozs7Ozs7Ozs7Ozs7OztHQURSLE1BMEJLOzs7Ozs7Ozs7OytCQXpCSSxHQUFTOzs7K0JBQWQsTUFBSTs7Ozs7Ozs7Ozs7Ozs7Ozt3QkFBSixNQUFJOzs7Ozs7Ozs7O2tDQUFKLE1BQUk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQUhSLE1BQThEOzs7Ozs7Ozs7Ozs7Ozs7aUNBY3JELEdBQVksaUJBQUMsR0FBUSxJQUFDLElBQUk7Ozs7Ozs7OzZCQVV4QixHQUFRLElBQUMsV0FBVzs7Ozs7Ozs7OzsyQkFOWCxHQUFRLElBQUMsS0FBSzs2QkFDWixHQUFRLElBQUMsSUFBSTs7Ozs7Ozs7Ozs7Ozs7Ozs7OzthQUlGLElBQ3ZCOzs7Ozs7O21FQWxCWSxHQUFRLElBQUMsSUFBSSxDQUFDLFFBQVEsb0JBQ3BDLEdBQVEsSUFBQyxLQUFBLG1CQUNMLEdBQVEsSUFBQyxXQUFXOzs7R0FKNUIsTUFzQks7R0FiSCxNQUVNOzs7R0FDTixNQU1NOzs7R0FDTixNQUVNOzs7Ozs7Ozs7Ozs7O3dHQVhILEdBQVksaUJBQUMsR0FBUSxJQUFDLElBQUk7O3lFQUlmLEdBQVEsSUFBQyxLQUFLOzJFQUNaLEdBQVEsSUFBQyxJQUFJOzs7c0ZBS3hCLEdBQVEsSUFBQyxXQUFXOztnSEFsQlQsR0FBUSxJQUFDLElBQUksQ0FBQyxRQUFRLG9CQUNwQyxHQUFRLElBQUMsS0FBQSxtQkFDTCxHQUFRLElBQUMsV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFUN0IsR0FBUyxJQUFDLE1BQU0sS0FBSyxDQUFDOzs7Ozs7Ozs7Ozs7OztHQUQ3QixNQWdDSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BdENRLFNBQTBCO09BQzFCLFNBQW9COztPQUNwQixjQUFjOzs7O09BQ2QsWUFBWSxHQUFJLElBQWMsSUFBSyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87OztFQWV2RCxjQUFjLENBQUMsUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZCQ21CWixHQUFTLElBQUMsTUFBTSxLQUFLZixVQUFRLGtCQUFDLEdBQVksS0FBRSxLQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBTHhFLE1BU0s7OztHQVBELE1BQStCOztHQUMvQixNQUtLOzs7Ozs7Ozs7OztvR0FIYyxHQUFTLElBQUMsTUFBTSxLQUFLQSxVQUFRLGtCQUFDLEdBQVksS0FBRSxLQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWxDekQsUUFBUSxPQUFpQixRQUFRO09BQ2pDLFNBQW9CO09BQ3BCLFlBQVksR0FBRyxNQUFNO09BQ3JCLFNBQW9COztVQUV0QixVQUFVLENBQUMsSUFBbUI7O2tCQUVuQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUs7O2tCQUN6QixRQUFRLE9BQU8sUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJOzs7VUFHMUIsTUFBTTtFQUNsQixVQUFVLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSzs7O1VBRXpCLFFBQVE7RUFDcEIsVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUs7OztVQUV4QixRQUFRO0VBQ3BCLFVBQVUsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLOzs7VUFFekIsU0FBUztFQUNyQixVQUFVLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSzs7O1VBRXhCLFNBQVM7YUFDVkEsVUFBUSxDQUFDLFlBQVksRUFBRSxLQUFLOzs7T0FFaEMsT0FBaUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUJoRCxNQUFNLG9CQUFxQixTQUFRZ0IsY0FBSztJQUtwQyxZQUNJLEdBQVEsRUFDQSxTQUFvQixFQUNwQixRQUFtQyxFQUNuQyxRQUFvQjtRQUU1QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFKSCxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQTJCO1FBQ25DLGFBQVEsR0FBUixRQUFRLENBQVk7UUFOeEIsYUFBUSxHQUF5QixFQUFFLENBQUM7S0FTM0M7SUFFUSxNQUFNO1FBQ1gsSUFBSSxhQUEwQixDQUFDO1FBQy9CLElBQUlGLGlCQUFRLENBQUMsU0FBUyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUNyQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUNsQzthQUFNO1lBQ0gsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDcEM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQzs7WUFFaEMsTUFBTSxFQUFFLGFBQWE7WUFDckIsS0FBSyxFQUFFO2dCQUNILE9BQU8sRUFBRSxDQUFDLElBQWM7b0JBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3JCO2dCQUNELFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsU0FBUzthQUNaO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUN6RDtJQUVPLGNBQWMsQ0FBQyxRQUFvQixFQUFFLEdBQVcsRUFBRSxNQUFrQjtRQUN4RSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ2xELE1BQU0sRUFBRSxDQUFDO1lBQ1QsT0FBTyxLQUFLLENBQUM7U0FDaEIsQ0FBQyxDQUFDLENBQUM7S0FDUDtJQUVPLE1BQU0sQ0FBQyxJQUFjO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUNoQjtJQUVRLE9BQU87UUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNqRSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hDO2FBQU07WUFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkI7S0FDSjtDQUVKO1NBRWUsd0JBQXdCLENBQUMsR0FBUSxFQUFFLFNBQW9CO0lBQ25FLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTTtRQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNoQixDQUFDLENBQUM7QUFDUDs7TUMxRWEsbUJBQW1CO0lBa0I1QixZQUFvQixNQUF5QixFQUFFLFNBQW9CO1FBQS9DLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBYnJDLFlBQU8sR0FBRztZQUNkLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDaEQsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNsRCxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2xELFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDbkQsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM1QixFQUFFLEVBQUUsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzFDLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDOUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNoRCxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzlDLEdBQUcsRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUU7U0FDM0IsQ0FBQTtRQUdHLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBQzs7WUFFdkMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2pCLEtBQUssRUFBRTtnQkFDSCxPQUFPLEVBQUUsQ0FBQyxJQUFjO29CQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNyQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ2Y7Z0JBQ0QsU0FBUztnQkFDVCxTQUFTO2FBQ1o7U0FDSixDQUFDLENBQUM7S0FDTjtJQUVELElBQUk7UUFDQSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO1lBQ3RCLFlBQVksRUFBRSxNQUFNLEVBQUU7WUFDdEIsUUFBUSxFQUFFLElBQUksUUFBUSxFQUFFO1NBQzNCLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFOUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUM3QixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUM7UUFDM0YsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUM7UUFFNUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sSUFBSSxPQUFPLENBQVcsQ0FBQyxPQUFPLEVBQUUsTUFBTTtZQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztZQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztTQUM5QixDQUFDLENBQUM7S0FDTjtJQUVPLE1BQU07UUFDVixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ25ELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNmO0lBRU0sTUFBTTtRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ2Y7SUFFTyxTQUFTLENBQUMsTUFBdUI7UUFDckMsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRTtZQUN6RCxPQUFPO1NBQ1Y7UUFDRCxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDakIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3ZCO2FBQU07WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7S0FDbEM7SUFFTyxJQUFJO1FBQ1IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvQztLQUNKOzs7TUM1RVEsWUFBWTtJQUVyQixZQUFvQixPQUFrQztRQUFsQyxZQUFPLEdBQVAsT0FBTyxDQUEyQjtLQUFLOztJQUUzRCxTQUFTLENBQUMsUUFBMkIsRUFBRSxTQUFrQztRQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNuQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM3RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRTs7Z0JBRWpDLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN4QixPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUVELElBQUksQ0FBQyxHQUFRLEVBQUUsTUFBNkIsRUFBRSxTQUFvQjtRQUM5RCxJQUFJLE1BQXlCLENBQUM7UUFDOUIsSUFBSUEsaUJBQVEsQ0FBQyxZQUFZLEVBQUU7WUFDdkIsSUFBSTtnQkFDQSxNQUFNLEVBQUUsR0FBdUIsTUFBYyxDQUFDLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO29CQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQTtvQkFDOUMsT0FBTztpQkFDVjtnQkFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDakQsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNyQjtZQUFDLE9BQU8sQ0FBQyxFQUFFOztnQkFFUixNQUFNLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ3JEO1NBQ0o7YUFBTTtZQUNILE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDckQ7UUFFRCxNQUFNO2FBQ0QsSUFBSSxDQUFDLEtBQUs7WUFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDcEMsQ0FBQzthQUNELEtBQUssQ0FBQyxTQUFvQyxDQUFDLENBQUM7S0FDcEQ7SUFFRCxNQUFNLENBQUMsTUFBNkIsRUFBRSxLQUFlLEVBQUUscUJBQThCLEtBQUs7UUFDdEYsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQy9CLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sTUFBTSxHQUFHO1lBQ1gsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ2xCLENBQUM7O1FBR0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3JCLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hFOztRQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNuRCxJQUFJO1lBQ0EsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEQsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO2dCQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLDJEQUEyRCxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDeEYsT0FBTzthQUNWO1lBQ0QsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDcEU7UUFBQyxPQUFPLEVBQUUsRUFBRTtZQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDckI7S0FDSjs7O0FDeEZMLE1BQU0sbUJBQW9CLFNBQVFHLDBCQUF5QjtJQUV2RCxZQUFZLEdBQVEsRUFBVSxXQUEwQixFQUFVLHNCQUE4QztRQUM1RyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFEZSxnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUFVLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7S0FFL0c7SUFFRCxRQUFRO1FBQ0osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQzNCO0lBQ0QsV0FBVyxDQUFDLElBQVk7UUFDcEIsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELFlBQVksQ0FBQyxJQUFZLEVBQUUsR0FBK0I7UUFDdEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JDO0NBRUo7U0FFZSx5QkFBeUIsQ0FBQyxHQUFRLEVBQUUsY0FBb0U7SUFDcEgsSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLFVBQVU7UUFDOUYsSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsY0FBYztZQUNySixjQUFjLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1NBQzlDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNiLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNkOztTQ25CZ0IscUJBQXFCLENBQUMsR0FBUSxFQUFFLFNBQW9CO0lBQ2hFLE9BQU9DLGVBQVUsQ0FBQyxTQUFTLENBQ3ZCO1FBQ0ksTUFBTSxDQUFDLE1BQWtCO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUNwQixPQUFPO2FBQ1Y7WUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRO2dCQUMzRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFDN0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUN2QixPQUFPO2lCQUNWO2dCQUNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7Z0JBQ25ELElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtvQkFDbEIsd0JBQXdCLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO3dCQUMvQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7d0JBQ25ELElBQUk7NEJBQ0EsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDN0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQ3BELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDOzRCQUVqRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUNuRSxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0NBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkRBQTJELEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQ0FDN0YsT0FBTzs2QkFDVjs0QkFFRCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQ0FDbkQsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTs7Z0NBRTNELFNBQVMsRUFBRUMscUJBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs2QkFDckUsQ0FBQyxDQUFDOzRCQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO3lCQUMvQzt3QkFBQyxPQUFPLEVBQUUsRUFBRTs0QkFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3lCQUNyQjtxQkFDSixDQUFDLENBQUM7aUJBQ047YUFDSixDQUFDLENBQUM7U0FDTjtLQUNKLENBQ0osQ0FBQztBQUNOOzs7Ozs7Ozs7Ozs7Ozs7OztHQ3RDQSxNQUFxQzs7Ozs7Ozs7Ozs7Ozs7T0FUdEIsSUFBSSxHQUFHLEVBQUU7T0FDVCxJQUFJLEdBQUcsRUFBRTtLQUNoQixJQUFpQjs7Q0FFckIsT0FBTztFQUNIQyxnQkFBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTs7Ozs7R0FJRixJQUFJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7eUJDMkN3QixHQUFLLEtBQUMsS0FBSzs7Ozs7Ozs7OytDQUE5QyxHQUFDOzsrREFBWSxHQUFhLGNBQUssR0FBQzs7O0dBQS9DLE1BQXNFOzs7O2lFQUFwQixHQUFLLEtBQUMsS0FBSzs7NEdBQWpDLEdBQWEsY0FBSyxHQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7NkJBbEJsRCxHQUFRLElBQUMsSUFBSTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkJBUEYsR0FBUSxJQUFDLEtBQUs7NkJBQ1osR0FBUSxJQUFDLElBQUk7Ozs7Ozs7OzZCQXVCbEIsR0FBTTs7O2dDQUFYLE1BQUk7Ozs7Ozs7Ozs7Ozs7Ozs7OzthQWJxQixlQUM3Qjs7OzthQUVtQyxPQUNuQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O3lCQUdjLEdBQWE7Ozs7O0dBckIvQixNQWdDTTtHQS9CSixNQU1JOzs7R0FDSixNQUdNOzs7OztHQUNOLE1BbUJLO0dBbEJILE1BRVE7Ozs7R0FDUixNQUVROzs7O0dBQ1IsTUFXUTtHQUxOLE1BQXdEOzs7Ozs7MkNBSjVDLEdBQWE7Ozs7OztxQ0FiUyxHQUFVLHFCQUFWLEdBQVU7OztpQ0FLWixHQUFNLGlCQUFOLEdBQU07OztpQ0FHdEIsR0FBTSxpQkFBTixHQUFNOzs7Z0RBTVgsR0FBYTs7Ozs7Ozs7O3dFQW5CZCxHQUFRLElBQUMsS0FBSzswRUFDWixHQUFRLElBQUMsSUFBSTs7O3FGQU0xQixHQUFRLElBQUMsSUFBSTs7OzRCQWlCTCxHQUFNOzs7K0JBQVgsTUFBSTs7Ozs7Ozs7Ozs7Ozs7OztvQ0FBSixNQUFJOzs7OzRDQU5NLEdBQWE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BekNsQixRQUFrQjtPQUNsQixTQUFvQjtPQUNwQixlQUF5QztPQUN6QyxNQUFrQjtPQUNsQixVQUFzQjtPQUN0QixNQUFrQjs7O0tBRXpCLGFBQXFCOztPQUVkLE1BQU07O1VBRVIsYUFBYTtRQUNkLFFBQVEsR0FBRyxNQUFNLENBQUMsYUFBYTs7TUFDakMsUUFBUSxJQUFJLElBQUk7Ozs7RUFHcEIsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLOzs7O0VBeUJoQixhQUFhOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekMvQixNQUFNQyxVQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO01BRXhCLGFBQWE7SUFFeEIsWUFBb0IsR0FBUSxFQUFVLHFCQUFpRCxFQUFVLE1BQXVDO1FBQXBILFFBQUcsR0FBSCxHQUFHLENBQUs7UUFBVSwwQkFBcUIsR0FBckIscUJBQXFCLENBQTRCO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBaUM7S0FBSztJQUV0SSxJQUFJLENBQ1QsUUFBa0IsRUFDbEIsZUFBeUMsRUFDekMsTUFBa0IsRUFDbEIsTUFBa0IsRUFDbEIsVUFBc0I7UUFFdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDakY7YUFBTTs7WUFFTCxNQUFNLFlBQVksR0FBSUEsVUFBZ0IsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1lBQzNELE1BQU0sQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDO2dCQUN6QixLQUFLLEVBQUUsbUJBQW1CO2dCQUMxQixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7YUFDckIsQ0FBQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNWLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDakYsQ0FBQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osTUFBTSxFQUFFLENBQUM7YUFDVixDQUFDLENBQUM7O1lBRUg7Z0JBQ0UsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBTSxFQUFFLEtBQVU7b0JBQ2hDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTt3QkFDZixNQUFNLEVBQUUsQ0FBQzt3QkFDVCxPQUFPO3FCQUNSO29CQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFFLENBQUM7b0JBQ2pDLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztpQkFDaEMsQ0FBQyxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRCxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUs7b0JBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtpQkFDcEQsQ0FBQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBYyxDQUFDO2FBQzVCO1lBRUQsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ1Y7S0FDRjtJQUVPLG1CQUFtQixDQUN6QixRQUFrQixFQUNsQixlQUF5QyxFQUN6QyxNQUFrQixFQUNsQixRQUFvQixFQUNwQixVQUFzQjtRQUV0QixJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ3BIO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ25CLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7S0FDekM7SUFFTyxRQUFRO1FBQ2QsT0FBT0EsVUFBUSxLQUFLLFNBQVMsQ0FBQztLQUMvQjtDQUdGO0FBRUQsTUFBTSxpQkFBa0IsU0FBUUwsY0FBSztJQUluQyxZQUNFLEdBQVEsRUFDQSxNQUFvQixFQUNwQixRQUFrQixFQUNsQixlQUF5QyxFQUN6QyxNQUFrQixFQUNsQixRQUFvQixFQUNwQixVQUFzQjtRQUU5QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFQSCxXQUFNLEdBQU4sTUFBTSxDQUFjO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsb0JBQWUsR0FBZixlQUFlLENBQTBCO1FBQ3pDLFdBQU0sR0FBTixNQUFNLENBQVk7UUFDbEIsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBVGhDLGFBQVEsR0FBWSxJQUFJLENBQUM7S0FZeEI7SUFFUSxNQUFNOzs7UUFHYixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFcEMsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJTSxRQUFZLENBQUM7WUFDZixNQUFNLEVBQUUsU0FBUztZQUNqQixLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFNBQVMsRUFBRSxJQUFJO2dCQUNmLGVBQWUsRUFBRSxDQUFDLElBQWM7b0JBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO29CQUN0QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQ2Q7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO29CQUN0QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUNkO2dCQUNELFVBQVUsRUFBRTtvQkFDVixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDckIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQ2Q7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO29CQUNyQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQ2Q7YUFDRjtTQUNGLENBQUMsQ0FBQztLQUNKO0lBRVEsT0FBTzs7O1FBR2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDekIsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7S0FDRjs7O0FDOUlJLE1BQU0sdUJBQXVCLEdBQUcsZUFBZTs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJDYzdDLEdBQUssSUFBQyxJQUFJOzs7Ozs7Ozs7Ozs7eUJBR0EsR0FBSyxJQUFDLFNBQVM7Ozs7Ozs7Ozs7Ozs7O3FEQUpzQixHQUFLLElBQUMsU0FBUzs7O0dBQWpFLE1BRUs7Ozs7Ozs7O2dGQURGLEdBQUssSUFBQyxJQUFJOzs7c0RBRHFDLEdBQUssSUFBQyxTQUFTOzs7OzhFQUlwRCxHQUFLLElBQUMsU0FBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZCQUx2QixHQUFNOzs7Z0NBQVgsTUFBSTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBRlYsTUFjTTtHQWJKLE1BWUs7Ozs7Ozs7Ozs7NEJBWEksR0FBTTs7OytCQUFYLE1BQUk7Ozs7Ozs7Ozs7Ozs7Ozs7d0JBQUosTUFBSTs7Ozs7Ozs7OztrQ0FBSixNQUFJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BUEcsTUFBOEI7T0FDOUIsU0FBb0I7T0FDcEIsY0FBNEM7c0JBYWxDLElBQUksS0FBSyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNidkQsTUFBTSxvQkFBcUIsU0FBUUMsaUJBQVE7SUFHekMsWUFDRSxJQUFtQixFQUNYLFNBQW9CLEVBQ3BCLFlBQXFDLEVBQ3JDLGNBQTRDO1FBRXBELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUpKLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsaUJBQVksR0FBWixZQUFZLENBQXlCO1FBQ3JDLG1CQUFjLEdBQWQsY0FBYyxDQUE4QjtLQUdyRDtJQUVELFdBQVc7UUFDVCxPQUFPLHVCQUF1QixDQUFDO0tBQ2hDO0lBRUQsY0FBYztRQUNaLE9BQU8sV0FBVyxDQUFDO0tBQ3BCO0lBRVEsT0FBTztRQUNkLE9BQU8sT0FBTyxDQUFDO0tBQ2hCO0lBRWMsTUFBTTs7WUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJQyxZQUFnQixDQUFDOztnQkFFL0IsTUFBTSxFQUFHLElBQVksQ0FBQyxTQUFTO2dCQUMvQixLQUFLLEVBQUU7b0JBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDL0IsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO29CQUNuQyxTQUFTLEVBQUUsSUFBSTtpQkFDaEI7YUFDRixDQUFDLENBQUM7U0FDSjtLQUFBO0lBRUQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDckIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQy9CLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztTQUNwQyxDQUFDLENBQUM7S0FDSjtJQUVPLGdCQUFnQjtRQUN0QixPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzFFO0lBRVEsT0FBTztRQUNkLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDdEI7UUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUMxQjtDQUNGO01BRVkseUJBQXlCO0lBSXBDLFlBQ1UsU0FBb0IsRUFDcEIsU0FBb0IsRUFDcEIsWUFBcUMsRUFDckMsY0FBNEM7UUFINUMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGlCQUFZLEdBQVosWUFBWSxDQUF5QjtRQUNyQyxtQkFBYyxHQUFkLGNBQWMsQ0FBOEI7O1FBTjlDLFVBQUssR0FBWSxLQUFLLENBQUM7S0FPMUI7SUFFTCxVQUFVLENBQUMsSUFBbUI7UUFDNUIsT0FBTyxJQUFJLG9CQUFvQixDQUM3QixJQUFJLEVBQ0osSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsY0FBYyxDQUNwQixDQUFDO0tBQ0g7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sRUFBRTs7WUFFbEUsT0FBTztTQUNSOztRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUM5QyxJQUFJLEVBQUUsdUJBQXVCO1NBQzlCLENBQUMsQ0FBQztLQUNKO0lBRUQsTUFBTSxDQUFDLFFBQWlCLEtBQUs7UUFDM0IsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7YUFDbkI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQzthQUNwRTtTQUNGO0tBQ0Y7SUFFTyxRQUFRO1FBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUzthQUNsQixlQUFlLENBQUMsdUJBQXVCLENBQUM7YUFDeEMsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBNEIsQ0FBQyxDQUFDO0tBQ25EO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0tBQ3BCOzs7QUNuSEgsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBRXJDLElBQVksUUFHWDtBQUhELFdBQVksUUFBUTtJQUNoQixtQ0FBRSxDQUFBO0lBQ0YsMkNBQU0sQ0FBQTtBQUNWLENBQUMsRUFIVyxRQUFRLEtBQVIsUUFBUSxRQUduQjtTQUNxQixrQkFBa0IsQ0FBQyxLQUFhLEVBQUUsT0FBZTs7UUFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNYLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUMxQjtRQUNELE1BQU0sUUFBUSxHQUFtQyxNQUFPLFFBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7WUFDbEcsTUFBTSxFQUFFLFVBQVU7WUFDbEIsT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixTQUFTLEVBQUUsS0FBSztZQUNoQixRQUFRLEVBQUUsT0FBTztZQUNqQixPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO1lBQ3pCLFFBQVEsRUFBRSxDQUFDO1NBQ2QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxRQUFRLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtZQUN6QixPQUFPLFFBQVEsQ0FBQyxFQUFFLENBQUM7U0FDdEI7UUFDRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUM7S0FDMUI7OztNQ0RvQixjQUFlLFNBQVFDLGVBQU07SUFTaEQsWUFBWSxHQUFRLEVBQUUsUUFBd0I7UUFDNUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDOztZQUU3QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDN0I7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDbEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEQsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMzRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFlBQVk7O1FBRWpHLENBQUMsUUFBUTtZQUNQLElBQUksUUFBUSxDQUFDLGdCQUFnQixFQUFFO2dCQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDakMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLENBQ2hELEdBQUcsQ0FBQyxLQUFLLEVBQ1QsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsU0FBUyxDQUNmLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0tBQ3BFO0lBRWMsTUFBTTs7WUFDbkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMvQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRTtvQkFDakMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzFCO2dCQUNELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7YUFDMUIsQ0FBQSxDQUFDLENBQUE7U0FDSDtLQUFBO0lBRU8sT0FBTzs7UUFFYixJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixFQUFFLENBQUMsSUFBbUI7WUFDN0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxDQUNoQixJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQ3ZDLENBQUM7UUFFRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQWtCO1lBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDakMsQ0FBQyxDQUFDO1FBQ0gsSUFBSVgsaUJBQVEsQ0FBQyxZQUFZLEVBQUU7WUFDekIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBcUI7Z0JBQzVDLE1BQU0sZUFBZSxHQUFHLElBQUksbUJBQW1CLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEUsRUFBRSxDQUFDLEVBQUUsQ0FDSCxRQUFRLEVBQ1IsQ0FBQyxRQUEyQixFQUFFLFNBQWtDO29CQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxFQUFFO3dCQUNyRCxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ3pCLE9BQU87cUJBQ1I7b0JBQ0QsZUFBZSxDQUFDLElBQUksRUFBRTt5QkFDbkIsSUFBSSxDQUFDLEtBQUs7d0JBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUMzQyxDQUFDO3lCQUNELEtBQUssQ0FBQyxTQUFvQyxDQUFDLENBQUM7b0JBQy9DLE9BQU87aUJBQ1IsQ0FDRixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1NBQ0o7OztRQUlELElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQzNCLENBQUMsQ0FBQztLQUNKO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2QsRUFBRSxFQUFFLGdCQUFnQjtZQUNwQixJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLGFBQWEsRUFBRSxDQUFDLFFBQWlCO2dCQUMvQixJQUFJLFFBQVEsRUFBRTtvQkFDWixPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzFDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2QsRUFBRSxFQUFFLGdCQUFnQjtZQUNwQixJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLGFBQWEsRUFBRSxDQUFDLFFBQWlCO2dCQUMvQixJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNiLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2lCQUN6QjtnQkFDRCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNkLEVBQUUsRUFBRSw4QkFBOEI7WUFDbEMsSUFBSSxFQUFFLDhCQUE4QjtZQUNwQyxhQUFhLEVBQUUsQ0FBQyxRQUFpQjtnQkFDL0IsSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDYixrQkFBa0IsQ0FBQyw4QkFBOEIsRUFBRSx5SkFBeUosQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUc7d0JBQ3JOLElBQUksR0FBRyxLQUFLLFFBQVEsQ0FBQyxFQUFFLEVBQUU7NEJBQ3ZCLE9BQU87eUJBQ1I7d0JBQ0QseUJBQXlCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxjQUFjOzRCQUM3RCxJQUFJLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQztpQ0FDdkUsS0FBSyxDQUFDLFNBQXNCLENBQUMsQ0FBQzt5QkFDbEMsQ0FBQyxDQUFDO3FCQUNKLENBQUMsQ0FBQztpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNkLEVBQUUsRUFBRSxtQkFBbUI7WUFDdkIsSUFBSSxFQUFFLHFCQUFxQjtZQUMzQixJQUFJLEVBQUUseUJBQXlCO1lBQy9CLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO29CQUM1QixHQUFHLEVBQUUsR0FBRztpQkFDVDthQUNGO1lBQ0QsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTTtnQkFDcEMsSUFBSSxRQUFRLEVBQUU7b0JBQ1osT0FBTyxJQUFJLENBQUM7aUJBQ2I7Z0JBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQzFEO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNkLEVBQUUsRUFBRSx5QkFBeUI7WUFDN0IsSUFBSSxFQUFFLHlCQUF5QjtZQUMvQixPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztvQkFDNUIsR0FBRyxFQUFFLE9BQU87aUJBQ2I7YUFDRjtZQUNELG1CQUFtQixFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJO2dCQUMxQyxJQUFJLFFBQVEsRUFBRTtvQkFDWixPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzFFO1NBQ0YsQ0FBQyxDQUFDO0tBQ0o7SUFFTyxVQUFVO1FBQ2hCO1lBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFPLElBQUk7Z0JBQ3JDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2pELENBQUEsQ0FBQztZQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJO2dCQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNoRCxDQUFDO1lBQ0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFPLElBQUksRUFBRSxPQUFPOzs7Z0JBRzlDLElBQUksTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFOztvQkFFdEQsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNqRDthQUNGLENBQUEsQ0FBQztTQUNILENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM5QixDQUFDLENBQUE7S0FDSDtJQUVPLGlCQUFpQjtRQUN2QixJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQzs7UUFFL0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUMxQixtQkFBbUIsR0FBRyxLQUFLLENBQUM7U0FDN0IsQ0FBQyxDQUFDOztRQUdILElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkIsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUNqQixJQUFJLG1CQUFtQixFQUFFO2dCQUN2QixPQUFPLENBQUMsR0FBRyxDQUNULDhEQUE4RCxDQUMvRCxDQUFDO2dCQUNGLE9BQU87YUFDUjtZQUNELG1CQUFtQixHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDO2dCQUMxQixtQkFBbUIsR0FBRyxLQUFLLENBQUM7YUFDN0IsQ0FBQyxDQUFDO1NBQ0osRUFBRSxRQUFRLENBQUMsd0JBQXdCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUNuRCxDQUFDO0tBQ0g7SUFFYSxZQUFZOztZQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU3QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO2dCQUNwQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDO29CQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO29CQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUMxQixDQUFDLENBQUM7YUFDSjtZQUVELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDakMsT0FBTzthQUNSO1lBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FDaEQsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQzVCLENBQUM7WUFFRixJQUFJLGdCQUFnQixHQUF5QixTQUFTLENBQUM7WUFDdkQsS0FBSyxJQUFJLFFBQVEsSUFBSSxPQUFPLEVBQUU7Z0JBQzVCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO29CQUNsQyxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTs7O3dCQUc3QixTQUFTO3FCQUNWO29CQUNELElBQUksZ0JBQWdCLEVBQUU7d0JBQ3BCLE9BQU0sZ0JBQWdCLENBQUMsY0FBYyxFQUFFOzs7OzRCQUlyQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQ3ZCO3FCQUNGO29CQUNELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzVCLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztpQkFDN0I7YUFDRjtTQUNGO0tBQUE7Ozs7OztJQU9hLEtBQUssQ0FBQyxZQUFvQjs7WUFDdEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1NBQ2xFO0tBQUE7SUFFTyxZQUFZLENBQUMsUUFBa0I7UUFDckMsUUFBUSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsUUFBUSxFQUNSLENBQUMsSUFBSTtZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0MsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDckIsUUFBUSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QixFQUNEO1lBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQixRQUFRLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCLEVBQ0Q7WUFDRSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDN0IsRUFDRDtZQUNFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pDLENBQ0YsQ0FBQztLQUNIO0lBRWEsZ0JBQWdCLENBQUMsUUFBa0I7O1lBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDN0Q7S0FBQTtJQUVRLFFBQVE7UUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVM7YUFDZixlQUFlLENBQUMsdUJBQXVCLENBQUM7YUFDeEMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQ3JDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDdEUsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUNsRCxJQUFJLEVBQUUsdUJBQXVCO1NBQzlCLENBQUMsQ0FBQztLQUNKO0NBRUY7QUFFRCxNQUFNLFlBQVk7SUFHaEIsWUFBb0IsZ0JBQTJDO1FBQTNDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBMkI7S0FBSztJQUVwRSxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0tBQ2hDO0lBRUQsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDcEMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDN0IsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE1BQU0sVUFBVSxHQUNkLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQztRQUM5RCxPQUFPLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO0tBQ2pEOzs7OzsifQ==
|