tuain-ng-forms-lib
Version:
Componentes y Clases Angular para la gestión de formularios TUAIN
589 lines • 98.8 kB
JavaScript
import { Subject } from 'rxjs';
import { FormAction } from './action';
import { FieldDescriptor } from './field';
import { RecordTable } from './table/table';
import { RecordFormSection } from './section';
import { HEADER } from './form.constants';
const ACTIVE = 'active';
const SHOW = 'show';
const HIDE = 'hide';
const ENABLE = 'enable';
const DISABLE = 'disable';
const CLEAN = 'clean';
const alwaysVisible = 'ALWAYS';
const neverVisible = 'NONE';
const onStatesVisible = 'ONSTATES';
export class FormStructureAndData {
_stateChange = new Subject();
_immutableData = {};
_extraInfo = {};
_exclusiveSectionsByAttr = {};
loadInitialData = true;
subject = null;
stateFlow;
fields = {};
actions = {};
tables = {};
sections = {};
fieldArray;
actionArray;
tableArray;
sectionArray;
customAttributes = {};
formConfig;
state;
name = '';
title = '';
constructor() {
this.state = '';
this.actionArray = [];
this.fieldArray = [];
this.tableArray = [];
this.sectionArray = [];
this.stateFlow = {
defaultState: '',
states: [],
stateDescriptions: [],
transitions: [],
};
}
setConfig(formConfig) {
this.formConfig = formConfig;
}
cleanForm() {
this.actionArray = [];
this.fieldArray = [];
this.tableArray = [];
this.sectionArray = [];
this.stateFlow = {
defaultState: '',
states: [],
stateDescriptions: [],
transitions: [],
};
}
normalizeStates(objDef, modesField, allStates, includeEnabled = true) {
let visibleStates = objDef.visibleStates
?? (objDef[modesField]?.split(',')?.map((s) => s.trim())?.filter((s) => s))
?? [];
let enabledStates = objDef.enabledStates ?? objDef.editableStates ?? [];
if (!Array.isArray(visibleStates) && typeof visibleStates === 'string') {
visibleStates = (visibleStates === neverVisible) ? [] : allStates;
}
if (includeEnabled) {
if (!Array.isArray(enabledStates) && typeof enabledStates === 'string') {
enabledStates = (enabledStates === neverVisible) ? [] : visibleStates;
}
enabledStates = enabledStates.filter((s) => visibleStates.includes(s));
}
return { visibleStates, enabledStates };
}
loadDefinition(definitionReceived) {
this.state = '';
let allStates = [];
this.cleanForm();
if (!definitionReceived) {
return;
}
const { form = {} } = definitionReceived;
this.name = this.name ?? form.formCode;
this.title = form.formTitle ?? this.name;
this.loadInitialData = form.loadInitialData ?? true;
allStates = definitionReceived?.states;
this.setStateFlow(definitionReceived?.states, definitionReceived?.transitions, definitionReceived?.defaultState, definitionReceived?.stateDescriptions);
this.immutableData = definitionReceived.immutableData;
this.extraInfo = definitionReceived.extraInfo;
this.customAttributes = {};
if (definitionReceived?.customAttributes) {
this.setCustomAttributes(definitionReceived?.customAttributes);
}
if (definitionReceived.actions) {
const formActions = definitionReceived.actions.map((objDef) => {
const { visibleStates, enabledStates } = this.normalizeStates(objDef, 'actionModes', allStates);
return { ...objDef, visibleStates, enabledStates };
});
for (const actionReceived of formActions) {
const globalAction = new FormAction(actionReceived, this.formConfig);
const globalActionCode = globalAction.actionCode;
if (globalActionCode) {
this.actionArray.push(globalAction);
this.actions[globalActionCode] = globalAction;
}
}
}
if (definitionReceived.fields) {
const formFields = definitionReceived.fields.map((objDef) => {
const { visibleStates, enabledStates } = this.normalizeStates(objDef, 'fieldModes', allStates);
return { ...objDef, visibleStates, enabledStates };
});
for (const fieldReceived of formFields) {
const fieldToAdd = new FieldDescriptor(fieldReceived, this.formConfig);
const fieldCode = fieldToAdd.code;
if (fieldCode) {
this.fieldArray.push(fieldToAdd);
this.fields[fieldCode] = fieldToAdd;
}
}
}
if (definitionReceived.tables) {
const tables = definitionReceived.tables.map((objDef) => {
const { visibleStates, enabledStates } = this.normalizeStates(objDef, 'tableModes', allStates);
return { ...objDef, visibleStates, enabledStates };
});
for (const tableReceived of tables) {
const tableToAdd = new RecordTable(tableReceived, this.formConfig);
const tableCode = tableToAdd.tableCode;
if (tableCode) {
this.tableArray.push(tableToAdd);
this.tables[tableCode] = tableToAdd;
}
}
}
if (definitionReceived.sections) {
const formSections = definitionReceived.sections.map((objDef) => {
const { visibleStates } = this.normalizeStates(objDef, 'sectionModes', allStates, false);
const subsections = objDef.subsections.map((subSecDef) => {
let subSecVisibleStates = subSecDef.visibleStates ?? [];
if (!Array.isArray(subSecVisibleStates) && typeof subSecVisibleStates === 'string') {
subSecVisibleStates = (subSecVisibleStates === neverVisible) ? [] : allStates;
}
return { ...subSecDef, visibleStates: subSecVisibleStates };
});
return { ...objDef, subsections, visibleStates };
});
for (const sectionReceived of formSections) {
const sectionToAdd = new RecordFormSection(sectionReceived, this, this.formConfig);
const sectionCode = sectionToAdd.sectionCode;
if (sectionCode) {
this.sectionArray.push(sectionToAdd);
this.sections[sectionCode] = sectionToAdd;
}
}
}
}
// Estados
get defaultState() { return this.stateFlow.defaultState; }
get states() { return this.stateFlow.states; }
get stateDescriptions() { return this.stateFlow.stateDescriptions; }
supportState(state = '') { return (!!state && this.stateFlow.states?.includes(state)); }
getNextStates() {
return this.stateFlow.transitions.filter(trns => trns.source === this.state)
.map(trns => trns.destination);
}
changeState(newState) {
const currentState = this.state;
if (!newState || !this.supportState(newState) || currentState === newState) {
return false;
}
if (!this.state) {
this.state = newState;
}
else {
const transitionToChange = this.stateFlow.transitions.find(trns => trns.source === this.state && trns.destination === newState);
if (transitionToChange) {
this.state = newState;
}
}
this._stateChange.next({ state: this.state });
return (this.state === newState);
}
get stateChange() { return this._stateChange.asObservable(); }
setStateFlow(states, transitions, defaultState, stateDescriptions = []) {
this.stateFlow.states = states;
this.stateFlow.stateDescriptions = stateDescriptions;
this.stateFlow.defaultState = defaultState || this.stateFlow.states[0];
this.stateFlow.transitions = transitions.map((transition) => {
const name = transition.name;
const source = (this.stateFlow.states.includes(transition.source)) ? transition.source : '';
const destination = (this.stateFlow.states.includes(transition.destination)) ? transition.destination : '';
return { name, source, destination };
}).filter((item) => item.name && item.source && item.destination);
}
// immutable Data
getImmutableElement(name) { return this._immutableData?.[name]?.value ?? null; }
set immutableData(immutableData) { Object.assign(this._immutableData, immutableData); }
get immutableData() { return JSON.parse(JSON.stringify(this._immutableData)); }
// extra Info
getExtraInfo(name) { return this._extraInfo?.[name]?.value ?? null; }
set extraInfo(extraInfo) { Object.assign(this._extraInfo, extraInfo); }
get extraInfo() { return JSON.parse(JSON.stringify(this._extraInfo)); }
// Custom Attributes
getCustomAttribute(name) { return this.customAttributes?.[name] ?? null; }
setCustomAttribute(name, value) { if (name) {
this.customAttributes[name] = value;
} }
setCustomAttributes(attributes) {
if (attributes && typeof attributes === 'object') {
Object.entries(attributes).forEach(([name, value]) => {
this.setCustomAttribute(name, value);
});
}
return this;
}
// Fields
get fieldNames() { return this.getFieldNames(); }
getFields() { return this.fieldArray; }
getFieldNames() { return this.fieldArray.map(field => field.code); }
getField(code) { return (code && this.fields?.[code]) ? this.fields[code] : null; }
enableField(code) { this.getField(code)?.enable(); }
disableField(code) { this.getField(code)?.disable(); }
getFieldValue(code) { return this.getField(code)?.value; }
getFieldOptionText(code) { return this.getField(code)?.optionText; }
getFieldOptions(code) { return this.getField(code)?.options ?? null; }
setFieldValue(code, value) { this.getField(code)?.setValue(value); }
setFieldError(code, errorCode, message, type = 'error') { this.getField(code)?.setError(errorCode, message, type); }
setFieldIntrinsicErrorMessage(code, message) { this.getField(code)?.setIntrinsicErrorMessage(message); }
setFieldRequired(inputCodes, required) {
const codes = this.getFieldSet(null, inputCodes ?? null);
for (const code of codes) {
try {
const field = this.getField(code) ?? null;
field && (field.required = required);
}
catch (e) {
console.log(`Error modificando campo ${code}: ${e}`);
}
}
}
setFieldErrorMessage(code, message) { this.getField(code)?.setErrorMessage(message); }
setFieldOptions(code, optionsArray, idAttribute, valueAttribute, separator = '-') {
const field = this.getField(code);
if (!field) {
return;
}
const newOptions = [];
const numSeparators = (Array.isArray(valueAttribute)) ? (valueAttribute.length - 1) : 0;
for (let i = 0; i < optionsArray?.length; i++) {
const optionItem = optionsArray[i];
const fieldOptionId = optionItem?.[idAttribute];
let fieldOptionText = '';
if (Array.isArray(valueAttribute)) {
for (let index = 0; index < valueAttribute.length; index++) {
const textPart = valueAttribute[index];
fieldOptionText += (index < numSeparators)
? `${optionItem?.[textPart]} ${separator} ` : optionItem?.[textPart];
}
}
else {
fieldOptionText = optionItem?.[valueAttribute];
}
if (fieldOptionId !== undefined && fieldOptionId !== null
&& fieldOptionText !== undefined && fieldOptionText !== null) {
newOptions.push({ fieldOptionId, fieldOptionValue: fieldOptionText });
}
}
field.options = newOptions;
}
getFieldSet(filter, inputCodes, secCode, subCode) {
let codes = [];
if (inputCodes) {
if (typeof inputCodes === 'string') {
codes = [inputCodes];
}
else if (Array.isArray(inputCodes) && inputCodes.length > 0) {
codes = inputCodes ?? [];
}
}
else if (secCode && !subCode) {
codes = this.getSection(secCode)?.getFieldNames() ?? [];
}
else if (secCode && subCode) {
codes = this.getSubSection(secCode, subCode)?.getFieldNames() ?? [];
}
else {
codes = this.getFieldNames() ?? [];
}
return (filter) ? codes.filter((code) => filter(this.getField(code))) : codes;
}
applyOnFields(processFunc, inputCodes, secCode, subCode) {
if (!processFunc) {
return 0;
}
const codes = this.getFieldSet(null, inputCodes ?? null, secCode, subCode);
let processedFields = 0;
for (const code of codes) {
const field = this.getField(code);
if (field) {
try {
processFunc(field);
processedFields += 1;
}
catch (e) {
console.log(`Error procesando funcion en campo ${field}: ${e}`);
}
}
}
return processedFields;
}
applyProcessToAllFields(processFunc) {
return this.applyOnFields(processFunc);
}
enableFields(codes, secCode, subCode) {
return this.applyOnFields((fld) => fld?.enable(), codes, secCode, subCode);
}
showFields(codes, secCode, subCode) {
return this.applyOnFields((fld) => fld?.show(), codes, secCode, subCode);
}
hideFields(codes, secCode, subCode) {
return this.applyOnFields((fld) => fld?.hide(), codes, secCode, subCode);
}
showLabelFields(codes, secCode, subCode) {
return this.applyOnFields((fld) => fld?.showLabel(), codes, secCode, subCode);
}
hideLabelFields(codes, secCode, subCode) {
return this.applyOnFields((fld) => fld?.hideLabel(), codes, secCode, subCode);
}
disableFields(codes, secCode, subCode) {
return this.applyOnFields((fld) => fld?.disable(), codes, secCode, subCode);
}
cleanFields(codes, secCode, subCode) {
return this.applyOnFields((fld) => fld?.clean(), codes, secCode, subCode);
}
tagFieldsWithError(message, codes, secCode, subCode) {
return this.applyOnFields((fld) => fld?.setErrorMessage(message), codes, secCode, subCode);
}
cleanErrorFields(codes, secCode, subCode) {
return this.tagFieldsWithError('', codes, secCode, subCode);
}
tagEmptyRequiredFields(message, codes = null, secCode, subCode) {
return this.tagFieldsWithError(message, this.getRequiredEmptyFields(codes, secCode, subCode)) > 0;
}
getRequiredFields(codes, secCode, subCode) {
return this.getFieldSet((fld) => fld?.required, codes ?? null, secCode, subCode);
}
getRequiredEmptyFields(codes, secCode, subCode, onlyVisible) {
if (onlyVisible) {
return this.getFieldSet((fld) => fld?.required && fld?.visible && fld?.empty, codes ?? null, secCode, subCode);
}
return this.getFieldSet((fld) => fld?.required && fld?.empty, codes ?? null, secCode, subCode);
}
getChangedFields(codes, secCode, subCode) {
return this.getFieldSet((fld) => !fld?.outputOnly && fld?.hasChanged, codes ?? null, secCode, subCode);
}
getFieldsWithValidationIssues(codes, secCode, subCode, onlyVisible) {
if (onlyVisible) {
return this.getFieldSet((fld) => (fld?.hasError() && fld?.visible), codes ?? null, secCode, subCode);
}
return this.getFieldSet((fld) => fld?.hasError(), codes ?? null, secCode, subCode);
}
getFieldsValues(inputCodes, secCode, subCode) {
const codes = this.getFieldSet(null, inputCodes ?? null, secCode, subCode);
const resultObject = {};
for (let index = 0; index < codes.length; index++) {
const code = codes[index];
if (code) {
resultObject[code] = this.fields?.[code]?.getValue() ?? null;
}
}
return resultObject;
}
// Acciones
getActions() { return this.actionArray; }
getAction(code) { return (code && this.actions?.[code]) ? this.actions[code] : null; }
showActions(codes) { return this.execOnActions(codes, SHOW); }
hideActions(codes) { return this.execOnActions(codes, HIDE); }
enableActions(codes) { return this.execOnActions(codes, ENABLE); }
disableActions(codes) { return this.execOnActions(codes, DISABLE); }
enableAction(code) { return this.enableActions(code); }
disableAction(code) { return this.disableActions(code); }
showAction(code) { return this.showActions(code); }
hideAction(code) { return this.hideActions(code); }
getHeaderActions() { return this.getActionsByAttribute('location', HEADER); }
getActionsByAttribute(name, value) {
return this.actionArray.filter(actionItem => actionItem.matchAttribute(name, value));
}
execOnActions(codes, functionName) {
const actionCodes = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
if (!functionName || actionCodes.length === 0) {
return;
}
actionCodes.forEach(code => {
const action = this.getAction(code);
action?.[functionName]?.();
});
}
// Tablas
getTables() { return this.tableArray; }
getTable(code) { return (code && this.tables?.[code]) ? this.tables[code] : null; }
getTableRecord(code, id) { return this.getTable(code)?.getTableRecord(id); }
enableTables(codes) { return this.execOnTables(codes, ENABLE); }
disableTables(codes) { return this.execOnTables(codes, DISABLE); }
showTables(codes) { return this.execOnTables(codes, SHOW); }
hideTables(codes) { return this.execOnTables(codes, HIDE); }
cleanTables(codes) { return this.execOnTables(codes, CLEAN); }
showTable(code) { return this.showTables(code); }
hideTable(code) { return this.hideTables(code); }
cleanTable(code) { return this.getTable(code)?.clean(); }
execOnTables(codes, functionName) {
const tableCodes = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
if (!functionName || tableCodes.length === 0) {
return;
}
tableCodes.forEach(code => {
const table = this.getTable(code);
table?.[functionName]?.();
});
}
// Secciones
getSections() { return this.sectionArray; }
getSectionsTitles() { return this.getSections()?.filter(sec => sec?.title).map(sec => sec?.title ?? ''); }
numSections() { return this.sectionArray.length; }
getSectionsByAttribute(name, value) { return this.sectionArray.filter(item => item.matchAttribute(name, value)); }
get sectionTitles() { return this.getSectionsTitles(); }
get visibleSections() { return this.sectionArray.filter(sec => sec.absoluteVisible); }
getSection(code) { return (code && this.sections?.[code]) ? this.sections[code] : null; }
showSections(codes) { this.execOnSections(codes, SHOW); }
hideSections(codes) { this.execOnSections(codes, HIDE); }
showSection(code) { return this.showSections(code); }
hideSection(code) { return this.hideSections(code); }
activeSection() { return this._exclusiveSectionsByAttr[ACTIVE]; }
getSubSection(code, subCode) { return this.getSection(code)?.getSubsection(subCode) ?? null; }
showSubSections(code, subCodes) { return this.execOnSubSections(code, subCodes, SHOW); }
showSubSection(code, subCode) { return this.showSubSections(code, subCode); }
hideSubSection(code, subCode) { return this.hideSubSections(code, subCode); }
hideSubSections(code, subCodes) { return this.execOnSubSections(code, subCodes, HIDE); }
getSectionActions(code) { return this.getSection(code)?.getActions() ?? null; }
getSectionActionNames(code) { return this.getSection(code)?.getActionNames() ?? null; }
activateSection(code) {
if (code === this._exclusiveSectionsByAttr[ACTIVE]) {
return;
}
this.getSection(this.activeSection())?.inactivate();
this.getSection(code)?.activate();
this._exclusiveSectionsByAttr[ACTIVE] = code;
}
execOnSections(codes, functionName) {
const sectionCodes = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
if (!functionName || sectionCodes.length === 0) {
return;
}
sectionCodes.forEach(code => {
const section = this.getSection(code);
section?.[functionName]?.();
});
}
execOnSubSections(code, subNames, functionName) {
const subCodes = (Array.isArray(subNames)) ? subNames : (subNames ? [subNames] : []);
const section = this.getSection(code);
if (!functionName || !section || subCodes.length === 0) {
return;
}
for (const subCode of subCodes) {
const subSection = this.getSubSection(code, subCode);
subSection?.[functionName]?.();
}
}
/**
* Métodos propios de gestión del formulario
*/
cleanData() {
for (const field of this.fieldArray) {
field.setValue(field.defaultValue);
}
for (const table of this.tableArray) {
table.clean();
}
}
getPayload() {
const formData = { fields: [], tables: [] };
formData.fields = this.getFields().filter(fld => !fld?.outputOnly)
.map(fld => {
const fieldPayload = {
fieldCode: fld?.code,
fieldValue: fld?.value,
editable: !fld?.absoluteDisabled,
visible: fld?.absoluteVisible,
required: fld?.required,
fieldOptions: '',
};
return fieldPayload;
});
formData.tables = this.getTables().map(tbl => {
const tablePayload = {
tableCode: tbl.tableCode,
visible: tbl.absoluteVisible,
currentPage: tbl.currentPage,
requestedPage: tbl.requestedPage,
recordsPerPage: tbl.recordsPerPage,
currentFilter: tbl.currentFilter,
sortingColumn: tbl.sorting.columnName,
sortingDirection: tbl.sorting.direction,
};
return tablePayload;
});
return formData;
}
/**
* @deprecated Since v17. Use subject instead. Will be removed in v19.
*/
get formSubject() { return this.subject; }
/**
* @deprecated Since v17. Use subject instead. Will be removed in v19.
*/
set formSubject(subject) { this.subject = subject; }
/**
* @deprecated Since v17. Use states instead. Will be removed in v19.
*/
getStates() { return this.states; }
/**
* @deprecated Since v17. Use state instead. Will be removed in v19.
*/
getCurrentState() { return this.state; }
/**
* @deprecated Since v17. Use title instead. Will be removed in v19.
*/
getTitle() { return this.title; }
/**
* @deprecated Since v17. Use title instead. Will be removed in v19.
*/
setTitle(title) { this.title = title; }
/**
* @deprecated Since v17. Use supportState instead. Will be removed in v19.
*/
supportMode(state) { return this.supportState(state); }
/**
* @deprecated Since v17. Use enableFields instead. Will be removed in v19.
*/
enableEditFields(codes, secCode, subCode) {
return this.enableFields(codes, secCode, subCode);
}
/**
* @deprecated Since v17. Use disableFields instead. Will be removed in v19.
*/
disableEditFields(codes, secCode, subCode) {
return this.disableFields(codes, secCode, subCode);
}
/**
* @deprecated Since v17. Use getField instead. Will be removed in v19.
*/
getFieldObject(code) { return this.getField(code); }
/**
* @deprecated Since v17. Use getAction instead. Will be removed in v19.
*/
getActionObject(code) { return this.getAction(code); }
/**
* @deprecated Since v17. Use getTable instead. Will be removed in v19.
*/
getTableObject(code) { return this.getTable(code); }
/**
* @deprecated Since v17. Use getSection instead. Will be removed in v19.
*/
getSectionObject(code) { return this.getSection(code); }
/**
* @deprecated Since v17. Use changeState instead. Will be removed in v19.
*/
changeFormMode(state) { return this.changeState(state); }
/**
* @deprecated Since v17. Use subject instead. Will be removed in v19.
*/
getFormSubject() { return this.subject; }
/**
* @deprecated Since v17. Use subject instead. Will be removed in v19.
*/
getSubject() { return this.subject ?? ''; }
/**
* @deprecated Since v17. Use subject instead. Will be removed in v19.
*/
getformSubject() { return this.subject ?? ''; }
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1YWluLW5nLWZvcm1zLWxpYi9zcmMvbGliL2NsYXNzZXMvZm9ybXMvZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBZSxNQUFNLFNBQVMsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU5QyxPQUFPLEVBQVksTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUNwQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUM7QUFDcEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQ3hCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFFdEIsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDO0FBQy9CLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUM1QixNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUF1Q25DLE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7SUFDdEQsY0FBYyxHQUF3QixFQUFFLENBQUM7SUFDekMsVUFBVSxHQUF3QixFQUFFLENBQUM7SUFDckMsd0JBQXdCLEdBQTJCLEVBQUUsQ0FBQztJQUVwRCxlQUFlLEdBQVksSUFBSSxDQUFDO0lBQ2hDLE9BQU8sR0FBa0IsSUFBSSxDQUFDO0lBQzlCLFNBQVMsQ0FBWTtJQUNyQixNQUFNLEdBQW9DLEVBQUUsQ0FBQztJQUM3QyxPQUFPLEdBQStCLEVBQUUsQ0FBQztJQUN6QyxNQUFNLEdBQWdDLEVBQUUsQ0FBQztJQUN6QyxRQUFRLEdBQXNDLEVBQUUsQ0FBQztJQUNqRCxVQUFVLENBQW9CO0lBQzlCLFdBQVcsQ0FBZTtJQUMxQixVQUFVLENBQWdCO0lBQzFCLFlBQVksQ0FBc0I7SUFFckMsZ0JBQWdCLEdBQXdCLEVBQUUsQ0FBQztJQUNsRCxVQUFVLENBQWM7SUFDeEIsS0FBSyxDQUFTO0lBQ2QsSUFBSSxHQUFXLEVBQUUsQ0FBQztJQUNsQixLQUFLLEdBQVcsRUFBRSxDQUFDO0lBRW5CO1FBQ0UsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRztZQUNmLFlBQVksRUFBRSxFQUFFO1lBQ2hCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsaUJBQWlCLEVBQUUsRUFBRTtZQUNyQixXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVMsQ0FBQyxVQUF1QjtRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixZQUFZLEVBQUUsRUFBRTtZQUNoQixNQUFNLEVBQUUsRUFBRTtZQUNWLGlCQUFpQixFQUFFLEVBQUU7WUFDckIsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlLENBQ3JCLE1BQVcsRUFDWCxVQUFrQixFQUNsQixTQUFtQixFQUNuQixpQkFBMEIsSUFBSTtRQUU5QixJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYTtlQUNuQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2VBQ3hGLEVBQUUsQ0FBQztRQUNSLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDeEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkUsYUFBYSxHQUFHLENBQUMsYUFBYSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdkUsYUFBYSxHQUFHLENBQUMsYUFBYSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztZQUN4RSxDQUFDO1lBQ0QsYUFBYSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsY0FBYyxDQUFDLGtCQUF1QjtRQUNwQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDcEMsTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztRQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDO1FBQ3BELFNBQVMsR0FBRyxrQkFBa0IsRUFBRSxNQUFNLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUMzRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsYUFBYSxHQUFHLGtCQUFrQixDQUFDLGFBQWEsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7Z0JBQ2pFLE1BQU0sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRyxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxNQUFNLGNBQWMsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxZQUFZLEdBQUcsSUFBSSxVQUFVLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDckUsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUNqRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUNoRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzlCLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtnQkFDL0QsTUFBTSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQy9GLE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDckQsQ0FBQyxDQUFDLENBQUM7WUFDSCxLQUFLLE1BQU0sYUFBYSxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2RSxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUNsQyxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztnQkFDdEMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5QixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7Z0JBQzNELE1BQU0sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUMvRixPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxNQUFNLGFBQWEsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbkUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztnQkFDdkMsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUM7Z0JBQ3RDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksa0JBQWtCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEMsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO2dCQUNuRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDekYsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtvQkFDNUQsSUFBSSxtQkFBbUIsR0FBRyxTQUFTLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztvQkFDeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxPQUFPLG1CQUFtQixLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUNuRixtQkFBbUIsR0FBRyxDQUFDLG1CQUFtQixLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDaEYsQ0FBQztvQkFDRCxPQUFPLEVBQUUsR0FBRyxTQUFTLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLENBQUM7Z0JBQzlELENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7WUFDSCxLQUFLLE1BQU0sZUFBZSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUMzQyxNQUFNLFlBQVksR0FBRyxJQUFJLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNuRixNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDO2dCQUM3QyxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVO0lBQ1YsSUFBSSxZQUFZLEtBQWEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDbEUsSUFBSSxNQUFNLEtBQVksT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDckQsSUFBSSxpQkFBaUIsS0FBWSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQzNFLFlBQVksQ0FBQyxRQUFnQixFQUFFLElBQWEsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpHLGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQzthQUN6RSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELFdBQVcsQ0FBQyxRQUFnQjtRQUMxQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMzRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1FBQ3hCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDaEUsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUM7WUFDL0QsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLFdBQVcsS0FBSyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTlELFlBQVksQ0FBQyxNQUFXLEVBQUUsV0FBZ0IsRUFBRSxZQUFxQixFQUFFLG9CQUF5QixFQUFFO1FBQzVGLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBZSxFQUFFLEVBQUU7WUFDL0QsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztZQUM3QixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzVGLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0csT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsbUJBQW1CLENBQUMsSUFBWSxJQUFTLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdGLElBQUksYUFBYSxDQUFDLGFBQWtCLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RixJQUFJLGFBQWEsS0FBVSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFcEYsYUFBYTtJQUNiLFlBQVksQ0FBQyxJQUFZLElBQVMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEYsSUFBSSxTQUFTLENBQUMsU0FBYyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsSUFBSSxTQUFTLEtBQVUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVFLG9CQUFvQjtJQUNwQixrQkFBa0IsQ0FBQyxJQUFZLElBQVMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLGtCQUFrQixDQUFDLElBQVksRUFBRSxLQUFVLElBQVUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFBQyxDQUFDLENBQUMsQ0FBQztJQUN6RyxtQkFBbUIsQ0FBQyxVQUErQjtRQUNqRCxJQUFJLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNqRCxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsU0FBUztJQUNULElBQUksVUFBVSxLQUFlLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRCxTQUFTLEtBQXdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDMUQsYUFBYSxLQUFlLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlFLFFBQVEsQ0FBQyxJQUFZLElBQXFCLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUcsV0FBVyxDQUFDLElBQVksSUFBVSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxZQUFZLENBQUMsSUFBWSxJQUFVLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLGFBQWEsQ0FBQyxJQUFZLElBQVMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdkUsa0JBQWtCLENBQUMsSUFBWSxJQUFTLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLGVBQWUsQ0FBQyxJQUFZLElBQTBCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRyxhQUFhLENBQUMsSUFBWSxFQUFFLEtBQVUsSUFBUyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEYsYUFBYSxDQUFDLElBQVksRUFBRSxTQUFpQixFQUFFLE9BQWUsRUFBRSxPQUFlLE9BQU8sSUFBUyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6Siw2QkFBNkIsQ0FBQyxJQUFZLEVBQUUsT0FBZSxJQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTdILGdCQUFnQixDQUFDLFVBQW9DLEVBQUUsUUFBaUI7UUFDdEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3pELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO2dCQUMxQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQVksRUFBRSxPQUFlLElBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTNHLGVBQWUsQ0FBQyxJQUFZLEVBQUUsWUFBbUIsRUFBRSxXQUFtQixFQUFFLGNBQWlDLEVBQUUsU0FBUyxHQUFHLEdBQUc7UUFDeEgsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUN2QixNQUFNLFVBQVUsR0FBVSxFQUFFLENBQUM7UUFDN0IsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sYUFBYSxHQUFHLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hELElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztvQkFDM0QsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN2QyxlQUFlLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDO3dCQUN4QyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3pFLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sZUFBZSxHQUFHLFVBQVUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFDRCxJQUFJLGFBQWEsS0FBSyxTQUFTLElBQUksYUFBYSxLQUFLLElBQUk7bUJBQ3BELGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMvRCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7WUFDeEUsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQW9ELEVBQUUsVUFBb0MsRUFBRSxPQUF1QixFQUFFLE9BQXVCO1FBQ3RKLElBQUksS0FBSyxHQUFVLEVBQUUsQ0FBQztRQUN0QixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDbkMsS0FBSyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdkIsQ0FBQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsS0FBSyxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9CLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMxRCxDQUFDO2FBQU0sSUFBSSxPQUFPLElBQUksT0FBTyxFQUFFLENBQUM7WUFDOUIsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN0RSxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3hGLENBQUM7SUFFRCxhQUFhLENBQUMsV0FBNkMsRUFBRSxVQUFxQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDcEksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQUMsT0FBTyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNFLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztRQUN4QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixJQUFJLENBQUM7b0JBQ0gsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNuQixlQUFlLElBQUksQ0FBQyxDQUFDO2dCQUN2QixDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2xFLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxXQUE2QztRQUNuRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDL0UsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWdDLEVBQUUsT0FBZ0IsRUFBRSxPQUFnQjtRQUM3RSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBZ0MsRUFBRSxPQUFnQixFQUFFLE9BQWdCO1FBQzdFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDbEYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWdDLEVBQUUsT0FBZ0IsRUFBRSxPQUFnQjtRQUNsRixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBZ0MsRUFBRSxPQUFnQixFQUFFLE9BQWdCO1FBQ2hGLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDOUUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsa0JBQWtCLENBQUMsT0FBZSxFQUFFLEtBQWdDLEVBQUUsT0FBZ0IsRUFBRSxPQUFnQjtRQUN0RyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBZ0MsRUFBRSxPQUFnQixFQUFFLE9BQWdCO1FBQ25GLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxPQUFlLEVBQUUsUUFBYSxJQUFJLEVBQUUsT0FBZ0IsRUFBRSxPQUFnQjtRQUMzRixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQWdDLEVBQUUsT0FBZ0IsRUFBRSxPQUFnQjtRQUNwRixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELHNCQUFzQixDQUFDLEtBQWdDLEVBQUUsT0FBZ0IsRUFBRSxPQUFnQixFQUFFLFdBQXFCO1FBQ2hILElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWdDLEVBQUUsT0FBZ0IsRUFBRSxPQUFnQjtRQUNuRixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsSUFBSSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pHLENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0IsRUFBRSxXQUFxQjtRQUN2SCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZHLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsZUFBZSxDQUFDLFVBQXFDLEVBQUUsT0FBZ0IsRUFBRSxPQUFnQjtRQUN2RixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxVQUFVLElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzRSxNQUFNLFlBQVksR0FBd0IsRUFBRSxDQUFDO1FBQzdDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUM7WUFDL0QsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVztJQUNYLFVBQVUsS0FBbUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN2RCxTQUFTLENBQUMsSUFBWSxJQUFnQixPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFHLFdBQVcsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLFdBQVcsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLGFBQWEsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNGLGNBQWMsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdGLFlBQVksQ0FBQyxJQUFZLElBQVUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxhQUFhLENBQUMsSUFBWSxJQUFVLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsVUFBVSxDQUFDLElBQVksSUFBVSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLFVBQVUsQ0FBQyxJQ