resig.js
Version:
Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.
356 lines • 24.9 kB
JavaScript
;
/**
* Scheduler - Stream coalgebra for managing async operations and animations
* Following coalgebraic principles for time-evolving systems
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.throttle = exports.debounce = exports.animate = exports.idle = exports.nextFrame = exports.delay = exports.cancel = exports.schedule = exports.getGlobalScheduler = exports.scheduler = exports.Priority = void 0;
const signal_1 = require("../core/signal");
// Task priority levels
var Priority;
(function (Priority) {
Priority[Priority["IMMEDIATE"] = 0] = "IMMEDIATE";
Priority[Priority["HIGH"] = 1] = "HIGH";
Priority[Priority["NORMAL"] = 2] = "NORMAL";
Priority[Priority["LOW"] = 3] = "LOW";
Priority[Priority["IDLE"] = 4] = "IDLE";
})(Priority || (exports.Priority = Priority = {}));
// Task queue implementation with priority
class TaskQueue {
constructor() {
this.queues = new Map();
this.taskMap = new Map();
// Initialize priority queues
Object.values(Priority).forEach((priority) => {
if (typeof priority === 'number') {
this.queues.set(priority, []);
}
});
}
enqueue(task) {
const queue = this.queues.get(task.priority);
if (queue) {
queue.push(task);
this.taskMap.set(task.id, task);
}
}
dequeue() {
// Process tasks by priority (lower number = higher priority)
for (const priority of [
Priority.IMMEDIATE,
Priority.HIGH,
Priority.NORMAL,
Priority.LOW,
Priority.IDLE,
]) {
const queue = this.queues.get(priority);
if (queue && queue.length > 0) {
const task = queue.shift();
this.taskMap.delete(task.id);
return task;
}
}
return null;
}
remove(taskId) {
const task = this.taskMap.get(taskId);
if (!task)
return false;
const queue = this.queues.get(task.priority);
if (queue) {
const index = queue.findIndex((t) => t.id === taskId);
if (index !== -1) {
queue.splice(index, 1);
this.taskMap.delete(taskId);
return true;
}
}
return false;
}
clear() {
this.queues.forEach((queue) => (queue.length = 0));
this.taskMap.clear();
}
get size() {
return this.taskMap.size;
}
}
// Main scheduler implementation
const scheduler = () => {
const taskQueue = new TaskQueue();
const delayedTasks = new Map(); // taskId -> timeoutId
const repeatingTasks = new Map(); // taskId -> repeat info
let isRunning = false;
let animationFrameId = null;
let completedCount = 0;
let failedCount = 0;
const stateSignal = (0, signal_1.signal)({
running: false,
taskCount: 0,
completedTasks: 0,
failedTasks: 0,
});
const updateState = () => {
stateSignal._set({
running: isRunning,
taskCount: taskQueue.size + delayedTasks.size,
completedTasks: completedCount,
failedTasks: failedCount,
});
};
const processTask = async (task) => {
try {
await task.execute();
completedCount++;
// Handle repeating tasks
if (task.repeat) {
const repeatInfo = repeatingTasks.get(task.id);
if (repeatInfo) {
if (typeof task.repeat === 'number') {
repeatInfo.remaining--;
if (repeatInfo.remaining <= 0) {
repeatingTasks.delete(task.id);
return;
}
}
// Reschedule the task
if (task.delay) {
const timeoutId = window.setTimeout(() => {
delayedTasks.delete(task.id);
taskQueue.enqueue(task);
updateState();
}, task.delay);
delayedTasks.set(task.id, timeoutId);
}
else {
taskQueue.enqueue(task);
}
}
}
}
catch (error) {
console.error(`Task ${task.id} failed:`, error);
failedCount++;
// Cancel task if it has a cancel handler
if (task.cancel) {
try {
task.cancel();
}
catch (cancelError) {
console.error(`Task ${task.id} cancel failed:`, cancelError);
}
}
}
updateState();
};
const tick = () => {
if (!isRunning)
return;
const task = taskQueue.dequeue();
if (task) {
processTask(task);
}
updateState();
if (isRunning) {
animationFrameId = requestAnimationFrame(tick);
}
};
const instance = {
state: stateSignal,
schedule: (task) => {
const taskId = task.id ||
`task-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
const taskWithId = { ...task, id: taskId };
// Handle repeating tasks
if (task.repeat) {
const remaining = typeof task.repeat === 'number' ? task.repeat : Infinity;
repeatingTasks.set(taskId, { task: taskWithId, remaining });
}
// Handle delayed tasks
if (task.delay && task.delay > 0) {
const timeoutId = window.setTimeout(() => {
delayedTasks.delete(taskId);
taskQueue.enqueue(taskWithId);
updateState();
}, task.delay);
delayedTasks.set(taskId, timeoutId);
}
else {
taskQueue.enqueue(taskWithId);
}
updateState();
return taskId;
},
cancel: (taskId) => {
// Cancel delayed task
const timeoutId = delayedTasks.get(taskId);
if (timeoutId) {
clearTimeout(timeoutId);
delayedTasks.delete(taskId);
repeatingTasks.delete(taskId);
updateState();
return true;
}
// Cancel queued task
const removed = taskQueue.remove(taskId);
if (removed) {
repeatingTasks.delete(taskId);
updateState();
return true;
}
return false;
},
start: () => {
if (isRunning)
return;
isRunning = true;
updateState();
tick();
},
stop: () => {
if (!isRunning)
return;
isRunning = false;
if (animationFrameId) {
cancelAnimationFrame(animationFrameId);
animationFrameId = null;
}
updateState();
},
clear: () => {
// Cancel all delayed tasks
delayedTasks.forEach((timeoutId) => clearTimeout(timeoutId));
delayedTasks.clear();
// Clear all queues
taskQueue.clear();
repeatingTasks.clear();
// Reset counters
completedCount = 0;
failedCount = 0;
updateState();
},
};
return instance;
};
exports.scheduler = scheduler;
// Global scheduler instance
let globalScheduler = null;
const getGlobalScheduler = () => {
if (!globalScheduler) {
globalScheduler = (0, exports.scheduler)();
globalScheduler.start(); // Auto-start global scheduler
}
return globalScheduler;
};
exports.getGlobalScheduler = getGlobalScheduler;
// Convenience functions using global scheduler
const schedule = (task) => {
const taskId = task.id || `task-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
return (0, exports.getGlobalScheduler)().schedule({ ...task, id: taskId });
};
exports.schedule = schedule;
const cancel = (taskId) => {
return (0, exports.getGlobalScheduler)().cancel(taskId);
};
exports.cancel = cancel;
const delay = (ms) => {
return new Promise((resolve) => {
(0, exports.schedule)({
priority: Priority.NORMAL,
execute: resolve,
delay: ms,
});
});
};
exports.delay = delay;
const nextFrame = () => {
return new Promise((resolve) => {
(0, exports.schedule)({
priority: Priority.HIGH,
execute: resolve,
});
});
};
exports.nextFrame = nextFrame;
const idle = (callback) => {
return (0, exports.schedule)({
priority: Priority.IDLE,
execute: callback,
});
};
exports.idle = idle;
// Animation utilities
const animate = (duration, callback, easing = (t) => t) => {
const startTime = performance.now();
const taskId = (0, exports.schedule)({
priority: Priority.HIGH,
repeat: true,
execute: () => {
const elapsed = performance.now() - startTime;
const progress = Math.min(elapsed / duration, 1);
const easedProgress = easing(progress);
callback(easedProgress);
if (progress >= 1) {
(0, exports.cancel)(taskId);
}
},
});
return taskId;
};
exports.animate = animate;
// Debounce utility using scheduler
const debounce = (fn, delay) => {
let taskId = null;
const debouncedFn = ((...args) => {
if (taskId) {
(0, exports.cancel)(taskId);
}
taskId = (0, exports.schedule)({
priority: Priority.NORMAL,
delay,
execute: () => fn(...args),
});
});
debouncedFn.cancel = () => {
if (taskId) {
(0, exports.cancel)(taskId);
taskId = null;
}
};
return debouncedFn;
};
exports.debounce = debounce;
// Throttle utility using scheduler
const throttle = (fn, delay) => {
let lastExecution = 0;
let taskId = null;
const throttledFn = ((...args) => {
const now = performance.now();
const timeSinceLastExecution = now - lastExecution;
if (timeSinceLastExecution >= delay) {
lastExecution = now;
fn(...args);
}
else if (!taskId) {
const remainingDelay = delay - timeSinceLastExecution;
taskId = (0, exports.schedule)({
priority: Priority.NORMAL,
delay: remainingDelay,
execute: () => {
lastExecution = performance.now();
fn(...args);
taskId = null;
},
});
}
});
throttledFn.cancel = () => {
if (taskId) {
(0, exports.cancel)(taskId);
taskId = null;
}
};
return throttledFn;
};
exports.throttle = throttle;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NoZWR1bGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILDJDQUFnRDtBQUVoRCx1QkFBdUI7QUFDdkIsSUFBWSxRQU1YO0FBTkQsV0FBWSxRQUFRO0lBQ2xCLGlEQUFhLENBQUE7SUFDYix1Q0FBUSxDQUFBO0lBQ1IsMkNBQVUsQ0FBQTtJQUNWLHFDQUFPLENBQUE7SUFDUCx1Q0FBUSxDQUFBO0FBQ1YsQ0FBQyxFQU5XLFFBQVEsd0JBQVIsUUFBUSxRQU1uQjtBQThCRCwwQ0FBMEM7QUFDMUMsTUFBTSxTQUFTO0lBSWI7UUFIUSxXQUFNLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDMUMsWUFBTyxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRzdDLDZCQUE2QjtRQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzNDLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVU7UUFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsNkRBQTZEO1FBQzdELEtBQUssTUFBTSxRQUFRLElBQUk7WUFDckIsUUFBUSxDQUFDLFNBQVM7WUFDbEIsUUFBUSxDQUFDLElBQUk7WUFDYixRQUFRLENBQUMsTUFBTTtZQUNmLFFBQVEsQ0FBQyxHQUFHO1lBQ1osUUFBUSxDQUFDLElBQUk7U0FDZCxFQUFFLENBQUM7WUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFHLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFjO1FBQ25CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUFFRCxnQ0FBZ0M7QUFDekIsTUFBTSxTQUFTLEdBQUcsR0FBYyxFQUFFO0lBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7SUFDbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUMsQ0FBQyxzQkFBc0I7SUFDdEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQTZDLENBQUMsQ0FBQyx3QkFBd0I7SUFFckcsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLElBQUksZ0JBQWdCLEdBQWtCLElBQUksQ0FBQztJQUMzQyxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDdkIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLE1BQU0sV0FBVyxHQUFHLElBQUEsZUFBTSxFQUFpQjtRQUN6QyxPQUFPLEVBQUUsS0FBSztRQUNkLFNBQVMsRUFBRSxDQUFDO1FBQ1osY0FBYyxFQUFFLENBQUM7UUFDakIsV0FBVyxFQUFFLENBQUM7S0FDZixDQUFDLENBQUM7SUFFSCxNQUFNLFdBQVcsR0FBRyxHQUFHLEVBQUU7UUFDdkIsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNmLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJO1lBQzdDLGNBQWMsRUFBRSxjQUFjO1lBQzlCLFdBQVcsRUFBRSxXQUFXO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxJQUFVLEVBQWlCLEVBQUU7UUFDdEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckIsY0FBYyxFQUFFLENBQUM7WUFFakIseUJBQXlCO1lBQ3pCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDZixJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDcEMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUN2QixJQUFJLFVBQVUsQ0FBQyxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7NEJBQzlCLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUMvQixPQUFPO3dCQUNULENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxzQkFBc0I7b0JBQ3RCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNmLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFOzRCQUN2QyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDN0IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDeEIsV0FBVyxFQUFFLENBQUM7d0JBQ2hCLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ2YsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUN2QyxDQUFDO3lCQUFNLENBQUM7d0JBQ04sU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDMUIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoRCxXQUFXLEVBQUUsQ0FBQztZQUVkLHlDQUF5QztZQUN6QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDO29CQUNILElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEIsQ0FBQztnQkFBQyxPQUFPLFdBQVcsRUFBRSxDQUFDO29CQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQy9ELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELFdBQVcsRUFBRSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtRQUNoQixJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFFdkIsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUVELFdBQVcsRUFBRSxDQUFDO1FBRWQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLGdCQUFnQixHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLFFBQVEsR0FBYztRQUMxQixLQUFLLEVBQUUsV0FBVztRQUVsQixRQUFRLEVBQUUsQ0FBQyxJQUFVLEVBQVUsRUFBRTtZQUMvQixNQUFNLE1BQU0sR0FDVixJQUFJLENBQUMsRUFBRTtnQkFDUCxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRSxNQUFNLFVBQVUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUUzQyx5QkFBeUI7WUFDekIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sU0FBUyxHQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDM0QsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUVELHVCQUF1QjtZQUN2QixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzVCLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzlCLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNmLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7WUFFRCxXQUFXLEVBQUUsQ0FBQztZQUNkLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxNQUFNLEVBQUUsQ0FBQyxNQUFjLEVBQVcsRUFBRTtZQUNsQyxzQkFBc0I7WUFDdEIsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUIsV0FBVyxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQscUJBQXFCO1lBQ3JCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixjQUFjLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM5QixXQUFXLEVBQUUsQ0FBQztnQkFDZCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQ1YsSUFBSSxTQUFTO2dCQUFFLE9BQU87WUFDdEIsU0FBUyxHQUFHLElBQUksQ0FBQztZQUNqQixXQUFXLEVBQUUsQ0FBQztZQUNkLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQztRQUVELElBQUksRUFBRSxHQUFHLEVBQUU7WUFDVCxJQUFJLENBQUMsU0FBUztnQkFBRSxPQUFPO1lBQ3ZCLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQixvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN2QyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDMUIsQ0FBQztZQUNELFdBQVcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQ1YsMkJBQTJCO1lBQzNCLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzdELFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVyQixtQkFBbUI7WUFDbkIsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUV2QixpQkFBaUI7WUFDakIsY0FBYyxHQUFHLENBQUMsQ0FBQztZQUNuQixXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBRWhCLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0lBRUYsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBakxXLFFBQUEsU0FBUyxhQWlMcEI7QUFFRiw0QkFBNEI7QUFDNUIsSUFBSSxlQUFlLEdBQXFCLElBQUksQ0FBQztBQUV0QyxNQUFNLGtCQUFrQixHQUFHLEdBQWMsRUFBRTtJQUNoRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckIsZUFBZSxHQUFHLElBQUEsaUJBQVMsR0FBRSxDQUFDO1FBQzlCLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLDhCQUE4QjtJQUN6RCxDQUFDO0lBQ0QsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQyxDQUFDO0FBTlcsUUFBQSxrQkFBa0Isc0JBTTdCO0FBRUYsK0NBQStDO0FBQ3hDLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBd0MsRUFBVSxFQUFFO0lBQzNFLE1BQU0sTUFBTSxHQUNWLElBQUksQ0FBQyxFQUFFLElBQUksUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDN0UsT0FBTyxJQUFBLDBCQUFrQixHQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQyxDQUFDO0FBSlcsUUFBQSxRQUFRLFlBSW5CO0FBRUssTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFjLEVBQVcsRUFBRTtJQUNoRCxPQUFPLElBQUEsMEJBQWtCLEdBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDO0FBRlcsUUFBQSxNQUFNLFVBRWpCO0FBRUssTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQWlCLEVBQUU7SUFDakQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLElBQUEsZ0JBQVEsRUFBQztZQUNQLFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTTtZQUN6QixPQUFPLEVBQUUsT0FBTztZQUNoQixLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBUlcsUUFBQSxLQUFLLFNBUWhCO0FBRUssTUFBTSxTQUFTLEdBQUcsR0FBa0IsRUFBRTtJQUMzQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsSUFBQSxnQkFBUSxFQUFDO1lBQ1AsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3ZCLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBUFcsUUFBQSxTQUFTLGFBT3BCO0FBRUssTUFBTSxJQUFJLEdBQUcsQ0FBQyxRQUFvQixFQUFVLEVBQUU7SUFDbkQsT0FBTyxJQUFBLGdCQUFRLEVBQUM7UUFDZCxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDdkIsT0FBTyxFQUFFLFFBQVE7S0FDbEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBTFcsUUFBQSxJQUFJLFFBS2Y7QUFFRixzQkFBc0I7QUFDZixNQUFNLE9BQU8sR0FBRyxDQUNyQixRQUFnQixFQUNoQixRQUFvQyxFQUNwQyxTQUFnQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUNoQyxFQUFFO0lBQ1YsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRXBDLE1BQU0sTUFBTSxHQUFHLElBQUEsZ0JBQVEsRUFBQztRQUN0QixRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDdkIsTUFBTSxFQUFFLElBQUk7UUFDWixPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQ1osTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztZQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXZDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUV4QixJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbEIsSUFBQSxjQUFNLEVBQUMsTUFBTSxDQUFDLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUF4QlcsUUFBQSxPQUFPLFdBd0JsQjtBQUVGLG1DQUFtQztBQUM1QixNQUFNLFFBQVEsR0FBRyxDQUN0QixFQUFLLEVBQ0wsS0FBYSxFQUNlLEVBQUU7SUFDOUIsSUFBSSxNQUFNLEdBQWtCLElBQUksQ0FBQztJQUVqQyxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRTtRQUN0QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBQSxjQUFNLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUVELE1BQU0sR0FBRyxJQUFBLGdCQUFRLEVBQUM7WUFDaEIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3pCLEtBQUs7WUFDTCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQzNCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBK0IsQ0FBQztJQUVqQyxXQUFXLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtRQUN4QixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBQSxjQUFNLEVBQUMsTUFBTSxDQUFDLENBQUM7WUFDZixNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDLENBQUM7QUExQlcsUUFBQSxRQUFRLFlBMEJuQjtBQUVGLG1DQUFtQztBQUM1QixNQUFNLFFBQVEsR0FBRyxDQUN0QixFQUFLLEVBQ0wsS0FBYSxFQUNlLEVBQUU7SUFDOUIsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLElBQUksTUFBTSxHQUFrQixJQUFJLENBQUM7SUFFakMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBVyxFQUFFLEVBQUU7UUFDdEMsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlCLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FBQztRQUVuRCxJQUFJLHNCQUFzQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3BDLGFBQWEsR0FBRyxHQUFHLENBQUM7WUFDcEIsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE1BQU0sY0FBYyxHQUFHLEtBQUssR0FBRyxzQkFBc0IsQ0FBQztZQUN0RCxNQUFNLEdBQUcsSUFBQSxnQkFBUSxFQUFDO2dCQUNoQixRQUFRLEVBQUUsUUFBUSxDQUFDLE1BQU07Z0JBQ3pCLEtBQUssRUFBRSxjQUFjO2dCQUNyQixPQUFPLEVBQUUsR0FBRyxFQUFFO29CQUNaLGFBQWEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ2xDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO29CQUNaLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUErQixDQUFDO0lBRWpDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO1FBQ3hCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFBLGNBQU0sRUFBQyxNQUFNLENBQUMsQ0FBQztZQUNmLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQXBDVyxRQUFBLFFBQVEsWUFvQ25CIn0=