From f973bb55f64085c43d09569e1c557a4e0fd4e9d2 Mon Sep 17 00:00:00 2001 From: Face <69168154+face-hh@users.noreply.github.com> Date: Sun, 31 Aug 2025 14:17:34 +0300 Subject: [PATCH] canvas API --- docs/docs/lua.md | 1267 +++++++++++++++++++++++++ docs/sidebars.ts | 1 + docs/static/img/docs/tween.png | Bin 0 -> 222569 bytes flumi/Scenes/Tags/canvas.tscn | 12 + flumi/Scenes/main.tscn | 4 +- flumi/Scripts/B9/Lua.gd | 50 + flumi/Scripts/SearchBar.gd | 11 + flumi/Scripts/SearchBar.gd.uid | 1 + flumi/Scripts/Tags/canvas.gd | 412 ++++++++ flumi/Scripts/Tags/canvas.gd.uid | 1 + flumi/Scripts/Utils/Lua/Canvas.gd | 1020 ++++++++++++++++++++ flumi/Scripts/Utils/Lua/Canvas.gd.uid | 1 + flumi/Scripts/Utils/Lua/DOM.gd | 3 + flumi/Scripts/main.gd | 6 +- tests/canvas.html | 363 +++++++ tests/snake.html | 237 +++++ 16 files changed, 3387 insertions(+), 2 deletions(-) create mode 100644 docs/docs/lua.md create mode 100644 docs/static/img/docs/tween.png create mode 100644 flumi/Scenes/Tags/canvas.tscn create mode 100644 flumi/Scripts/SearchBar.gd create mode 100644 flumi/Scripts/SearchBar.gd.uid create mode 100644 flumi/Scripts/Tags/canvas.gd create mode 100644 flumi/Scripts/Tags/canvas.gd.uid create mode 100644 flumi/Scripts/Utils/Lua/Canvas.gd create mode 100644 flumi/Scripts/Utils/Lua/Canvas.gd.uid create mode 100644 tests/canvas.html create mode 100644 tests/snake.html diff --git a/docs/docs/lua.md b/docs/docs/lua.md new file mode 100644 index 0000000..ecc8369 --- /dev/null +++ b/docs/docs/lua.md @@ -0,0 +1,1267 @@ +--- +sidebar_position: 3 +--- + +# Lua API + +Gurted provides a Lua API that enables dynamic web development with client-side scripting. The Lua runtime is integrated into the browser engine and provides access to DOM manipulation, network requests, animations, and more. + +## Global: gurt + +The main global object for DOM manipulation and core functionality. + +### gurt.select(selector) + +Selects the first element matching the CSS selector. + +```lua +local element = gurt.select('#my-id') +local firstButton = gurt.select('button') +local classElement = gurt.select('.my-class') +``` + +### gurt.selectAll(selector) + +Selects all elements matching the CSS selector, returns an array. + +```lua +local allButtons = gurt.selectAll('button') +local listItems = gurt.selectAll('li') + +-- Iterate through results +for i = 1, #allButtons do + local button = allButtons[i] + button.text = 'Button ' .. i +end +``` + +### gurt.create(tagName, options) + +Creates a new HTML element. + +```lua +-- Basic element +local div = gurt.create('div') + +-- Element with attributes and content +local button = gurt.create('button', { + text = 'Click me!', + style = 'bg-blue-500 text-white px-4 py-2 rounded', + id = 'my-button' +}) +``` + +### gurt.body + +Reference to the document body element. + +```lua +-- Add event listeners to body +gurt.body:on('keydown', function(event) + trace.log('Key pressed: ' .. event.key) +end) + +-- Append elements to body +local newDiv = gurt.create('div', { text = 'Hello World!' }) +gurt.body:append(newDiv) +``` + +### gurt.location + +Browser location and navigation control. + +### gurt.location.href + +Gets the current URL. + +```lua +local currentUrl = gurt.location.href +trace.log('Current URL: ' .. currentUrl) +``` + +### gurt.location.reload() + +Reloads the current page. + +```lua +gurt.location.reload() +``` + +### gurt.location.goto(url) + +Navigates to a new URL. + +```lua +gurt.location.goto('gurt://example.com/page') +gurt.location.goto('https://external-site.com') +``` + +### gurt.location.query + +Query parameter access. + +```lua +-- Get a specific parameter +local userId = gurt.location.query.get('user_id') + +-- Check if parameter exists +if gurt.location.query.has('debug') then + trace.log('Debug mode enabled') +end + +-- Get all values for a parameter (for repeated params) +local tags = gurt.location.query.getAll('tag') +``` +## Global: trace + +The global trace table for logging messages to the console. + +### trace.log(message) +Identical to `print()`, logs a message to the console. + +```lua +trace.log('Hello from Lua!') +``` + +### trace.warn(message) +Logs a warning message to the console. + +```lua +trace.warn('This is a warning!') +``` + +### trace.error(message) +Logs an error message to the console. + +```lua +trace.error('This is an error!') +``` + +## Element + +Elements returned by `gurt.select()`, `gurt.create()`, etc. have the following properties and methods: + +### Properties + +#### element.text + +Gets or sets the text content of an element. + +```lua +local p = gurt.select('p') +p.text = 'New paragraph content' +local currentText = p.text +``` + +#### element.value + +Gets or sets the value of form elements. + +```lua +local input = gurt.select('#username') +input.value = 'john_doe' +local username = input.value + +local checkbox = gurt.select('#agree') +checkbox.value = true -- Check the checkbox +``` + +#### element.visible + +Gets or sets element visibility. + +```lua +local modal = gurt.select('#modal') +modal.visible = false -- Hide element +modal.visible = true -- Show element + +if modal.visible then + trace.log('Element is visible') +end +``` + +#### element.children + +Gets an array of child elements. + +```lua +local container = gurt.select('.container') +local children = container.children + +for i = 1, #children do + local child = children[i] + trace.log('Child ' .. i .. ': ' .. child.text) +end +``` + +### DOM Traversal + +#### element.parent + +Gets the parent element. + +```lua +local button = gurt.select('#my-button') +local container = button.parent +``` + +#### element.nextSibling / element.previousSibling + +Gets adjacent sibling elements. + +```lua +local current = gurt.select('#current-item') +local next = current.nextSibling +local prev = current.previousSibling +``` + +#### element.firstChild / element.lastChild + +Gets first or last child element. + +```lua +local list = gurt.select('ul') +local firstItem = list.firstChild +local lastItem = list.lastChild +``` + +### Methods + +#### element:on(eventName, callback) + +Adds an event listener. Returns a subscription object. + +```lua +local button = gurt.select('#my-button') + +-- Click event +local subscription = button:on('click', function() + trace.log('Button clicked!') +end) + +-- Mouse events +button:on('mouseenter', function() + button.classList:add('hover-effect') +end) + +button:on('mouseexit', function() + button.classList:remove('hover-effect') +end) + +-- Input events (for form elements) +local input = gurt.select('#username') +input:on('change', function(event) + trace.log('Input changed to: ' .. event.value) +end) + +-- Focus events +input:on('focusin', function() + trace.log('Input focused') +end) + +input:on('focusout', function() + trace.log('Input lost focus') +end) + +-- Unsubscribe from event +subscription:unsubscribe() +``` + +#### element:append(childElement) + +Adds a child element. + +```lua +local container = gurt.select('.container') +local newDiv = gurt.create('div', { text = 'New content' }) +container:append(newDiv) +``` + +#### element:remove() + +Removes the element from the DOM. + +```lua +local elementToRemove = gurt.select('#temporary') +elementToRemove:remove() +``` + +#### element:insertBefore(newElement, referenceElement) + +Inserts an element before another element. + +```lua +local container = gurt.select('.container') +local newElement = gurt.create('div', { text = 'Inserted' }) +local reference = gurt.select('#reference') +container:insertBefore(newElement, reference) +``` + +#### element:insertAfter(newElement, referenceElement) + +Inserts an element after another element. + +```lua +local container = gurt.select('.container') +local newElement = gurt.create('div', { text = 'Inserted' }) +local reference = gurt.select('#reference') +container:insertAfter(newElement, reference) +``` + +#### element:replace(oldElement, newElement) + +Replaces a child element with a new element. + +```lua +local container = gurt.select('.container') +local oldElement = gurt.select('#old') +local newElement = gurt.create('div', { text = 'Replacement' }) +container:replace(oldElement, newElement) +``` + +#### element:clone(deep) + +Creates a copy of the element. + +```lua +-- Shallow clone (element only) +local copy = element:clone(false) + +-- Deep clone (element and all children) +local deepCopy = element:clone(true) +``` + +#### element:getAttribute(name) / element:setAttribute(name, value) + +Gets or sets element attributes. + +```lua +local img = gurt.select('img') +local src = img:getAttribute('src') +img:setAttribute('alt', 'Description text') + +-- Remove attribute by setting empty value +img:setAttribute('title', '') +``` + +#### element:show() / element:hide() + +Shows or hides an element. + +```lua +local modal = gurt.select('#modal') +modal:show() -- Makes element visible +modal:hide() -- Hides element +``` + +#### element:focus() / element:unfocus() + +Sets or removes focus from an element. + +```lua +local input = gurt.select('#search') +input:focus() -- Focus the input +input:unfocus() -- Remove focus +``` + +### Class List Management + +#### element.classList + +Provides methods for managing CSS classes. + +```lua +local button = gurt.select('#my-button') + +-- Add classes +button.classList:add('active') +button.classList:add('btn-primary') + +-- Remove classes +button.classList:remove('disabled') + +-- Toggle classes +button.classList:toggle('selected') + +-- Check if class exists +if button.classList:contains('active') then + trace.log('Button is active') +end + +-- Get specific class by index (1-based) +local firstClass = button.classList:item(1) + +-- Get number of classes +local classCount = button.classList.length +``` + +### Animations + +#### element:createTween() + +Creates a tween animation for the element. + +```lua +local box = gurt.select('#animated-box') + +-- Fade out +box:createTween() + :to('opacity', 0) + :duration(1.0) + :easing('out') + :transition('linear') + :play() + +-- Move and scale +box:createTween() + :to('x', 200) + :to('y', 100) + :to('scale', 1.5) + :duration(2.0) + :easing('inout') + :transition('cubic') + :play() + +-- Color animation +box:createTween() + :to('backgroundColor', '#ff0000') + :duration(1.5) + :easing('out') + :transition('quad') + :play() + +-- Rotation +box:createTween() + :to('rotation', 360) + :duration(3.0) + :easing('inout') + :transition('sine') + :play() +``` + +**Available Tween Properties:** +- `opacity` - Element transparency (0-1) +- `backgroundColor` - Background color (hex format) +- `scale` - Element scale (1.0 = normal size) +- `rotation` - Rotation in degrees +- `x`, `y` - Position offset + +**Easing Types:** `'in'`, `'out'`, `'inout'`, `'outin'` + +**Transition Types:** `'linear'`, `'quad'`, `'cubic'`, `'quart'`, `'quint'`, `'sine'`, `'expo'`, `'circ'`, `'elastic'`, `'back'`, `'bounce'` + +![CRT effect](../static/img/docs/tween.png) +Resource: [Reddit](https://www.reddit.com/r/godot/comments/frqzup/godot_tweening_cheat_sheet/) + +## Audio API + +Work with audio elements for sound playback. + +```lua +local audio = gurt.select('#my-audio') + +audio:play() -- Start playback +audio:pause() -- Pause playback +audio:stop() -- Stop and reset + +audio.currentTime = 30.0 -- Seek to 30 seconds +audio.volume = 0.8 -- Set volume (0.0 - 1.0) +audio.loop = true -- Enable looping +audio.src = 'gurt://new-audio.mp3' -- Change source + +local duration = audio.duration +local currentPos = audio.currentTime +local isPlaying = audio.playing +local isPaused = audio.paused +``` + +## Canvas API + +Gurted features a 2D canvas API similar to HTML5 Canvas, plus shader support. + +### Context + +```lua +local canvas = gurt.select('#my-canvas') + +local ctx = canvas:withContext('2d') +local shaderCtx = canvas:withContext('shader') +``` + +### 2D Drawing Context + +#### Rectangle + +```lua +-- Fill a solid rectangle +ctx:fillRect(x, y, width, height, color) +ctx:fillRect(50, 50, 100, 75, '#ff0000') -- Red filled rectangle + +-- Draw rectangle outline +ctx:strokeRect(x, y, width, height, color, strokeWidth) +ctx:strokeRect(200, 50, 100, 75, '#00ff00', 3) -- Green outline, 3px thick + +-- Clear a rectangular area +ctx:clearRect(x, y, width, height) +ctx:clearRect(80, 80, 40, 40) -- Clear 40x40 area +``` + +#### Circle + +```lua +-- Draw filled or outlined circles +ctx:drawCircle(x, y, radius, color, filled) +ctx:drawCircle(150, 100, 30, '#0000ff', true) -- Filled blue circle +ctx:drawCircle(200, 100, 30, '#ff00ff', false) -- Outlined magenta circle +``` + +#### Text + +```lua +ctx:drawText(x, y, text, color) +ctx:drawText(20, 250, 'Hello Canvas!', '#ffffff') +ctx:drawText(20, 280, 'Default Font Only', '#ffff00') + +-- Font size can be set with setFont (size only, not family) +ctx:setFont('20px sans-serif') -- Only size matters +ctx:drawText(20, 300, 'Larger text', '#00ff00') + +local metrics = ctx:measureText('Sample Text') +local textWidth = metrics.width +``` + +### Path-Based Drawing + +For complex shapes, use path-based drawing methods: + +```lua +ctx:beginPath() + +-- Move to starting point without drawing +ctx:moveTo(100, 100) + +-- Draw line to point +ctx:lineTo(200, 150) +ctx:lineTo(150, 200) +ctx:lineTo(50, 200) + +-- Close the path (connects back to start) +ctx:closePath() + +-- Draw the path +ctx:stroke() -- Draw outline +-- or +ctx:fill() -- Fill the shape +``` + +#### Advanced Path Methods + +##### Arc and Circle Paths + +```lua +-- Draw arc (part of circle) +ctx:arc(x, y, radius, startAngle, endAngle, counterclockwise) + +-- Example: Draw a quarter circle +ctx:beginPath() +ctx:arc(200, 200, 50, 0, math.pi/2, false) -- 0 to 90 degrees +ctx:stroke() + +-- Full circle path +ctx:beginPath() +ctx:arc(300, 200, 40, 0, 2 * math.pi, false) -- 0 to 360 degrees +ctx:fill() +``` + +##### Curve Methods + +```lua +-- Quadratic curve (one control point) +ctx:quadraticCurveTo(controlX, controlY, endX, endY) + +-- Example: Smooth curve +ctx:beginPath() +ctx:moveTo(50, 300) +ctx:quadraticCurveTo(150, 250, 250, 300) -- Control point at (150,250) +ctx:stroke() + +-- Bezier curve (two control points) +ctx:bezierCurveTo(cp1x, cp1y, cp2x, cp2y, endX, endY) + +-- Example: S-curve +ctx:beginPath() +ctx:moveTo(50, 350) +ctx:bezierCurveTo(100, 300, 200, 400, 250, 350) +ctx:stroke() +``` + +#### Styling and Properties + +##### Setting Draw Styles + +```lua +-- Set stroke (outline) color +ctx:setStrokeStyle('#ff0000') -- Red outline +ctx:setStrokeStyle('rgba(255, 0, 0, 0.5)') -- Semi-transparent red +ctx:setStrokeStyle('red-500') -- Tailwind color names +ctx:setStrokeStyle('blue') -- Named colors + +-- Set fill color +ctx:setFillStyle('#00ff00') -- Green fill +ctx:setFillStyle('#33aa88') -- Teal fill +ctx:setFillStyle('slate-800') -- Tailwind colors +ctx:setFillStyle('transparent') -- Named transparent + +-- Set line width for strokes +ctx:setLineWidth(5) -- 5 pixel wide lines +ctx:setLineWidth(0.5) -- Thin lines + +-- Set font for text (size only, not family) +ctx:setFont('20px sans-serif') -- Only size matters +ctx:setFont('16px Arial') -- Font family ignored +ctx:setFont('14px monospace') -- Uses default font at 14px +``` + +**Color Support**: Canvas color parsing is identical to CSS styling - supports hex colors (`#ff0000`), RGB/RGBA (`rgba(255,0,0,0.5)`), Tailwind color names (`red-500`, `slate-800`), and basic named colors (`red`, `blue`, `transparent`). + +##### Using Styles in Drawing + +```lua +-- Set up styles first +ctx:setFillStyle('#ff6b6b') +ctx:setStrokeStyle('#4ecdc4') +ctx:setLineWidth(3) + +-- Then draw with those styles +ctx:fillRect(50, 50, 100, 100) -- Uses fill style +ctx:strokeRect(200, 50, 100, 100) -- Uses stroke style and line width + +-- Styles persist until changed +ctx:setFillStyle('#45b7d1') +ctx:fillRect(50, 200, 100, 100) -- Now uses blue fill +``` + +#### Transformations + +Canvas transformations allow you to modify the coordinate system for drawing operations. + +##### Basic Transformations + +```lua +ctx:save() +ctx:translate(100, 50) +ctx:rotate(math.pi / 4) +ctx:scale(2.0, 1.5) +ctx:fillRect(0, 0, 50, 50) +ctx:restore() +ctx:fillRect(0, 0, 50, 50) +``` + +##### Transformation Examples + +```lua +ctx:save() +ctx:translate(200, 200) +ctx:rotate(math.pi / 6) +ctx:drawText(-25, 0, 'Rotated', 'Arial', '#000000') +ctx:restore() + +for i = 1, 5 do + ctx:save() + ctx:scale(i * 0.3, i * 0.3) + ctx:strokeRect(100, 100, 50, 50) + ctx:restore() +end + +for angle = 0, 360, 30 do + ctx:save() + ctx:translate(200, 200) + ctx:rotate(math.rad(angle)) + ctx:fillRect(50, -5, 40, 10) + ctx:restore() +end +``` + +### Shader Context + +For advanced visual effects, use the shader context: + +```lua +local canvas = gurt.select('#shader-canvas') +local shaderCtx = canvas:withContext('shader') + +shaderCtx:source([[ + shader_type canvas_item; + + uniform float time : hint_range(0.0, 10.0) = 1.0; + uniform vec2 resolution; + + void fragment() { + vec2 uv = UV; + + // Create animated rainbow effect + vec3 color = vec3( + 0.5 + 0.5 * cos(time + uv.x * 6.0), + 0.5 + 0.5 * cos(time + uv.y * 6.0 + 2.0), + 0.5 + 0.5 * cos(time + (uv.x + uv.y) * 6.0 + 4.0) + ); + + COLOR = vec4(color, 1.0); + } +]]) +``` + +## Network API + +### fetch(url, options) + +Makes HTTP requests with full control over method, headers, and body. + +```lua +-- Simple GET request +local response = fetch('https://api.example.com/data') + +-- POST request with data +local response = fetch('https://api.example.com/users', { + method = 'POST', + headers = { + ['Content-Type'] = 'application/json', + ['Authorization'] = 'Bearer token123' + }, + body = JSON.stringify({ + name = 'John Doe', + email = 'john@example.com' + }) +}) + +-- Check response +if response:ok() then + local data = response:json() -- Parse JSON response + local text = response:text() -- Get as text + + trace.log('Status: ' .. response.status) + trace.log('Status Text: ' .. response.statusText) + + -- Access headers + local contentType = response.headers['content-type'] +else + trace.log('Request failed with status: ' .. response.status) +end +``` + +**Supported Methods:** `GET`, `POST`, `PUT`, `DELETE`, `HEAD`, `OPTIONS`, `PATCH` + +**Relative URLs** are automatically resolved to the current domain with `gurt://` protocol. + +## JSON API + +### JSON.stringify(data) + +Converts Lua data to JSON string. + +```lua +local data = { + name = 'Alice', + age = 30, + hobbies = {'reading', 'coding'}, + active = true +} + +local jsonString = JSON.stringify(data) +trace.log(jsonString) -- {"name":"Alice","age":30,"hobbies":["reading","coding"],"active":true} +``` + +### JSON.parse(jsonString) + +Parses JSON string to Lua data. + +```lua +local jsonString = '{"name":"Bob","score":95.5}' +local data, error = JSON.parse(jsonString) + +if data then + trace.log('Name: ' .. data.name) + trace.log('Score: ' .. data.score) +else + trace.log('Parse error: ' .. error) +end +``` + +## Time API + +### Time.now() + +Gets current Unix timestamp. + +```lua +local timestamp = Time.now() +trace.log('Current time: ' .. timestamp) +``` + +### Time.format(timestamp, format) + +Formats a timestamp using format strings. + +```lua +local now = Time.now() +local formatted = Time.format(now, '%Y-%m-%d %H:%M:%S') +trace.log('Formatted: ' .. formatted) + +-- Format strings +-- %Y - Full year (2024) +-- %y - Two-digit year (24) +-- %m - Month (01-12) +-- %d - Day (01-31) +-- %H - Hour 24-format (00-23) +-- %I - Hour 12-format (01-12) +-- %M - Minute (00-59) +-- %S - Second (00-59) +-- %p - AM/PM +-- %A - Full weekday name +-- %a - Abbreviated weekday name +-- %B - Full month name +-- %b - Abbreviated month name +``` + +### Time.date(timestamp) + +Gets date components as a table. + +```lua +local now = Time.now() +local date = Time.date(now) + +trace.log('Year: ' .. date.year) +trace.log('Month: ' .. date.month) +trace.log('Day: ' .. date.day) +trace.log('Hour: ' .. date.hour) +trace.log('Minute: ' .. date.minute) +trace.log('Second: ' .. date.second) +trace.log('Weekday: ' .. date.weekday) -- 0=Sunday, 6=Saturday +``` + +### Time.sleep(seconds) + +Pauses execution for a specified duration. + +```lua +trace.log('Starting...') +Time.sleep(2.0) -- Wait 2 seconds +trace.log('Done waiting!') +``` + +:::note +This blocks the entire Lua thread. Use with caution, we recommend using `setTimeout()` for non-blocking delays. +::: + +### Time.benchmark(function) + +Measures function execution time. + +```lua +local elapsed, result = Time.benchmark(function() + -- Some complex calculation + local sum = 0 + for i = 1, 1000000 do + sum = sum + i + end + return sum +end) + +trace.log('Function took ' .. elapsed .. ' seconds') +trace.log('Result: ' .. result) +``` + +### Time.timer() + +Creates a timer object for measuring intervals. + +```lua +local timer = Time.timer() + +-- Do some work... +Time.sleep(1.5) + +local elapsed = timer:elapsed() +trace.log('Elapsed: ' .. elapsed .. ' seconds') + +timer:reset() -- Reset timer +``` + +### Time.delay(seconds) + +Creates a delay object for non-blocking waits. + +```lua +local delay = Time.delay(3.0) + +-- Check if delay is complete +if delay:complete() then + trace.log('Delay finished!') +end + +-- Get remaining time +local remaining = delay:remaining() +trace.log('Time left: ' .. remaining .. ' seconds') +``` + +## Timeout and Interval Functions + +### setTimeout(callback, milliseconds) + +Executes a function after a delay. + +```lua +local timeoutId = setTimeout(function() + trace.log('This runs after 2 seconds') +end, 2000) + +-- Cancel the timeout +-- clearTimeout(timeoutId) +``` + +### setInterval(callback, milliseconds) + +Executes a function repeatedly at intervals. + +```lua +local intervalId = setInterval(function() + trace.log('This runs every second') +end, 1000) + +setTimeout(function() + clearInterval(intervalId) + trace.log('Interval stopped') +end, 5000) +``` + +### clearTimeout(timeoutId) / clearInterval(intervalId) + +Cancels scheduled timeouts or intervals. + +```lua +local id = setTimeout(function() + trace.log('This will not run') +end, 1000) + +clearTimeout(id) +``` + +## WebSocket API + +Real-time communication with WebSocket servers. + +```lua +local ws = WebSocket.new('ws://localhost:8080/chat') + +ws:on('open', function() + trace.log('WebSocket connected') + ws:send('Hello server!') +end) + +ws:on('message', function(data) + trace.log('Received: ' .. data) +end) + +ws:on('close', function(code, reason) + trace.log('WebSocket closed: ' .. code .. ' - ' .. reason) +end) + +ws:on('error', function(error) + trace.log('WebSocket error: ' .. error) +end) + +ws:send('Hello from client!') +ws:send(JSON.stringify({ type = 'chat', message = 'Hello!' })) + +ws:close() + +if ws.readyState == WebSocket.OPEN then + ws:send('Connected message') +end +``` + +**WebSocket States:** +- `WebSocket.CONNECTING` (0) - Connection in progress +- `WebSocket.OPEN` (1) - Connection established +- `WebSocket.CLOSING` (2) - Connection closing +- `WebSocket.CLOSED` (3) - Connection closed + +## URL API + +URL encoding and decoding utilities for handling special characters in URLs. + +### urlEncode(string) + +Encodes a string for safe use in URLs by converting special characters to percent-encoded format. + +```lua +local encoded = urlEncode('hello world!') +trace.log(encoded) -- hello%20world%21 + +local params = urlEncode('name=John Doe&age=30') +trace.log(params) -- name%3DJohn%20Doe%26age%3D30 + +-- Building query strings +local searchTerm = 'cats & dogs' +local url = 'gurt://search.com/api?q=' .. urlEncode(searchTerm) +trace.log(url) -- gurt://search.com/api?q=cats%20%26%20dogs +``` + +### urlDecode(string) + +Decodes a percent-encoded URL string back to its original form. + +```lua +local decoded = urlDecode('hello%20world%21') +trace.log(decoded) -- hello world! + +local params = urlDecode('name%3DJohn%20Doe%26age%3D30') +trace.log(params) -- name=John Doe&age=30 + +local queryParam = 'cats%20%26%20dogs' +local searchTerm = urlDecode(queryParam) +trace.log(searchTerm) -- cats & dogs +``` + +## Clipboard API + +Write to the system clipboard. + +```lua +Clipboard.write('Hello clipboard!') +``` + +## Regex API + +Pattern matching and text processing with regular expressions. + +### Regex.new(pattern) + +Creates a new regex object from a pattern string. + +```lua +local emailPattern = Regex.new('[a-zA-Z]+@[a-zA-Z]+\\.[a-zA-Z]+') +local phonePattern = Regex.new('\\(\\d{3}\\)\\s*\\d{3}-\\d{4}') +``` + +### regex:test(text) + +Tests if the pattern matches anywhere in the text. Returns `true` or `false`. + +```lua +local pattern = Regex.new('[a-zA-Z]+@[a-zA-Z]+\\.[a-zA-Z]+') + +if pattern:test('user@example.com') then + trace.log('Valid email format') +end + +if pattern:test('Contact us at admin@site.com') then + trace.log('Found email in text') +end +``` + +### regex:match(text) + +Finds the first match and returns capture groups as an array, or `nil` if no match found. + +```lua +local pattern = Regex.new('(\\w+)@(\\w+)\\.(\\w+)') +local result = pattern:match('Contact: admin@site.com for help') + +if result then + trace.log('Full match: ' .. result[1]) -- admin@site.com + trace.log('Username: ' .. result[2]) -- admin + trace.log('Domain: ' .. result[3]) -- site + trace.log('TLD: ' .. result[4]) -- com +else + trace.log('No match found') +end +``` + +## Event Handling + +### Body Events + +Global events that can be captured on the document body: + +```lua +-- Keyboard events +gurt.body:on('keydown', function(event) + trace.log('Key down: ' .. event.key) + if event.ctrl and event.key == 's' then + trace.log('Ctrl+S pressed - Save shortcut!') + end +end) + +gurt.body:on('keyup', function(event) + trace.log('Key up: ' .. event.key) +end) + +gurt.body:on('keypress', function(event) + trace.log('Key pressed: ' .. event.key) + -- Event properties: key, keycode, ctrl, shift, alt +end) + +-- Mouse events +gurt.body:on('mousemove', function(event) + trace.log('Mouse at: ' .. event.x .. ', ' .. event.y) + -- Event properties: x, y, deltaX, deltaY +end) + +gurt.body:on('mouseenter', function() + trace.log('Mouse entered page') +end) + +gurt.body:on('mouseexit', function() + trace.log('Mouse left page') +end) +``` + +### Element Events + +Events specific to DOM elements: + +```lua +local button = gurt.select('#my-button') + +-- Mouse events +button:on('click', function() + trace.log('Button clicked!') +end) + +button:on('mousedown', function() + trace.log('Mouse button pressed') +end) + +button:on('mouseup', function() + trace.log('Mouse button released') +end) + +button:on('mouseenter', function() + trace.log('Mouse entered button') +end) + +button:on('mouseexit', function() + trace.log('Mouse left button') +end) + +button:on('mousemove', function(event) + trace.log('Mouse moved over button: ' .. event.x .. ', ' .. event.y) +end) + +-- Focus events +local input = gurt.select('#text-input') +input:on('focusin', function() + trace.log('Input gained focus') +end) + +input:on('focusout', function() + trace.log('Input lost focus') +end) + +-- Form events +input:on('change', function(event) + trace.log('Input value changed to: ' .. event.value) +end) + +input:on('input', function(event) + trace.log('Input text: ' .. event.value) +end) + +-- For file inputs +local fileInput = gurt.select('#file-input') +fileInput:on('change', function(event) + trace.log('File selected: ' .. event.fileName) +end) + +-- For form submission +local form = gurt.select('#my-form') +form:on('submit', function(event) + trace.log('Form submitted with data:') + for key, value in pairs(event.data) do + trace.log(key .. ': ' .. tostring(value)) + end +end) +``` + +## Error Handling + +### pcall for Protected Calls + +Use Lua's `pcall` for error handling: + +```lua +local success, result = pcall(function() + local data = JSON.parse('invalid json') + return data +end) + +if success then + trace.log('Parse successful: ' .. tostring(result)) +else + trace.log('Parse failed: ' .. result) -- result contains error message +end +``` + +## Additional utilities + +Gurted includes several helpful utilities: + +### print(...) +We modify the global `print()` function to log to the browser console, and also convert any type (e.g. tables) to a readable string. + +```lua +print('Hello, world!') +print({ name = 'Alice', age = 30, hobbies = {'reading', 'coding'} }) -- {age=30,hobbies={1="reading",2="coding"},name="Alice"} +``` + +### table.tostring(table) + +Converts a table to a readable string representation. + +```lua +local data = { name = 'John', age = 30, hobbies = {'reading', 'coding'} } +local str = table.tostring(data) -- {age=30,hobbies={1="reading",2="coding"},name="John"} +``` + +### string.replace(text, search, replacement) + +Replaces the first occurrence of a string or regex pattern. + +```lua +local text = 'Hello world, hello universe' +local result = string.replace(text, 'hello', 'hi') +trace.log(result) -- Hello world, hi universe + +local pattern = Regex.new('\\b\\w+@\\w+\\.\\w+\\b') +local masked = string.replace('Email: john@test.com', pattern, '[EMAIL]') +trace.log(masked) -- Email: [EMAIL] +``` + +### string.replaceAll(text, search, replacement) + +Replaces all occurrences of a string or regex pattern. + +```lua +local text = 'Hello world, hello universe' +local result = string.replaceAll(text, 'hello', 'hi') +trace.log(result) -- Hello world, hi universe + +local pattern = Regex.new('\\b\\w+@\\w+\\.\\w+\\b') +local text = 'Emails: john@test.com, jane@demo.org' +local masked = string.replaceAll(text, pattern, '[EMAIL]') +trace.log(masked) -- Emails: [EMAIL], [EMAIL] +``` + +### string.trim(text) + +Removes whitespace from the beginning and end of a string. + +```lua +local messy = ' Hello World ' +local clean = string.trim(messy) +trace.log('"' .. clean .. '"') -- "Hello World" +``` + +This is particularly useful for debugging and logging complex data structures. diff --git a/docs/sidebars.ts b/docs/sidebars.ts index 8ccef5d..c840a73 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -39,6 +39,7 @@ const sidebars: SidebarsConfig = { items: [ 'html', 'css', + 'lua', 'postprocess', ], }, diff --git a/docs/static/img/docs/tween.png b/docs/static/img/docs/tween.png new file mode 100644 index 0000000000000000000000000000000000000000..517a02fed2f9e65ee2cbfcf4b37b366acc0c8251 GIT binary patch literal 222569 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

|cpskFjNA&QK)!m{>VYVTgWH6kF7 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

xxpu`>Ni#MkQ0`WCOpVo(i!G-F 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

🎨 Complete Canvas API Test Suite

+ +
+
+

📋 API Coverage Test

+

This page tests every single Canvas 2D API function implemented in GURT:

+
    +
  • Basic Drawing: fillRect, strokeRect, clearRect, drawCircle, drawText
  • +
  • Path Drawing: beginPath, closePath, moveTo, lineTo, arc, stroke, fill
  • +
  • Transformations: save, restore, translate, rotate, scale
  • +
  • Advanced Paths: quadraticCurveTo, bezierCurveTo
  • +
  • Styling: setStrokeStyle, setFillStyle, setLineWidth, setFont
  • +
  • Text Measurement: measureText
  • +
  • Shader Support: withContext("shader"), source
  • +
+
+ +
+ +
+

Basic Drawing Functions

+

Rectangle and circle primitives

+ +
+ +
+

Path-Based Drawing

+

Paths, lines, arcs, and shapes

+ +
+ + +
+

Transformations

+

Translate, rotate, scale, save/restore

+ +
+ +
+

Curves & Advanced Paths

+

Quadratic and Bezier curves

+ +
+ + +
+

Styles & Text

+

Colors, line widths, fonts, text measurement

+ +
+ +
+

Complex Composition

+

Multiple techniques combined

+ +
+
+ + +
+

Shader Canvas Support

+

Custom fragment shader with animated colors

+
+ +
+
+ +
+

✅ Test Results

+

All canvas functions should render correctly above. Check the browser console for any errors.

+

This test demonstrates compatibility with HTML5 Canvas API standards.

+
+
+ \ No newline at end of file diff --git a/tests/snake.html b/tests/snake.html new file mode 100644 index 0000000..d55e96c --- /dev/null +++ b/tests/snake.html @@ -0,0 +1,237 @@ + + Snake Game - Canvas Demo + + + + + + + + + + +

🐍 Snake Game

+ +
+
+
+
Score: 0
+ +
+
+ +
+ +
+ +
Test
+ +
+

Controls:

+

Use Arrow Keys or WASD to control the snake

+
    +
  • 🔼 Up: Arrow Up or W
  • +
  • 🔽 Down: Arrow Down or S
  • +
  • ◀️ Left: Arrow Left or A
  • +
  • ▶️ Right: Arrow Right or D
  • +
+

Eat the red food to grow and increase your score!

+
+
+ \ No newline at end of file

|>bCE@j+-$AZn3cNdmlL7*{C zFlc2F9Q8In1sA}^8|8GpkmL^!nD5b{)8!`E9${Q$v3mK{_^QRQ2PEu%RfFv7$#oJ$#bV%^Qn(B0y=ApdgU&K&^0~tD41Sscwrn zMMVvF4mGj;ZCf%zh?|+LI@G206{h9Mt4FavNMc@DM*x$8fBBWp$K1^~!?pu!HzV4g zu;qdQMkB~umM>XduD$#UnO03zj`d^V(M9?eIG(wD)Jc=&r_wXj7EjxEo2F75P}Ag8 zv?Qx|GF={Bu572L*|zrN64)0ahX4CX(tNkTJ_sFl&_~@%(Lz|~6*{YV3b_sr^6J{r zJWd`z%yEeOVyF=fVs!3iRVW6Pci%yzO~!E6EPpt@V6n@_P8l1)R{?ib8OB}g-HZi* zmU6Z8y@@gl*I09?+ZZ9hC0Be7i?tZE7+>+x^6*51eEUX?v$2h)7{-jHHuMr6Aqi-Cfe%-Dmlo>-__J->c>v zbBr<9as+Hy)p0qk#)5OK(dVnh2<&&vDfr=1fC{*>wnpx_mq4bAEocWRI7xL!(TJnc ztzCjNbL`VhX_3=N0YGsgvhwG0ZLDz<p9$1{r@G7l`3;WH>S(Jbs$+Attzd(7Hqjd&D0xoD<>y-yyL+SU36fBi zzq)K%LsV$N1qnW}#lxC%)}>73uNOSSs)YWs&mY^oRrX`w8A|;wWo*w;y|i{>3drsA z#T*;cAJy5Vue~|mnAnMAe=zIa6{5hgPh%oa37gt~{!~1Dg&1?em>JI4*EtT}9S>$Z zT@U!#@--bZj9%RJ)>DxpTr;-r!}k*fA|Qy->0}VM_cswle3KA-Krm+pn*n~&MzN*G9iPU8vHcI%>e4wUGBzD^Q@kNra_)AE2Wo)zbt}*qW z&6Nd4M!9$E>(XY$fS+ENBwRL|*Mgw`2$<=teXkn5+km+G=Y~$Pg zP<_D#D@bZbMBFmDb($Tt2{BSV`$&AUUvZHL`Jw&0~g$>8lP&^|Bua2itu2vf?1935T?wYQ$IUe=!{15&*( z>#ZyS<=;n!=iX#jXjB76&v!@#y>~7sUjC{WTYPnL>;^#COX@u~ytTVq?NpTmQ+93u z(Q~9fadWh6p`mJM@R^1`mR1y!$y~zkoyL-(3QLCO@$>i5oOb>FnUYXn7sOkyJscUV zAO%KO4@7TciSE7k4N94K7)1{j{$Rc8fx2~Ssb{-kZ-y4o_IxS3o?UM$0w#%!#N`2My0X{b_JLV^XqS1jMwzMy0l2mmjtU(${_{Ys4`L0m+kG>! zf=>@La?rEbH#K%T?e9oZSji|>tqOgrqQO5Bn?iSg)&$|IjE+T`et9fL0FzgLmJxxR$Cr=k~0TE8@v!Gyo#6 z{f025GE9-yWMdv2p(=rduU%3}Y^LdSwA32v(E@#g`IS>0g(1O6QT`bPrqtP+IH6vWDaMNqJKr5{j9M?8Hk@aC>HhR}#*=>!VQg_UQA zp9mhKl2yU1vvXhJ0$te=B1ZT!k1bEM5B(+4L_pC?KtK7C=HplXau>Vpm)`4-;;ePB zDO$Db%$XvjI7Y;9!--`i z;+wuLY8nT{RDFMqfExF2nxDyJ2QgC3zAl7yxif}tQHx|JB`}%~eojnKbRHpfCPY}} z&*%>7o<%gg$k5%(88kFAU;9AWke<(d&Hj;S=Osb8ll@jmXF@@e+IIH1581iNce&H@e{+GZ*Mj_eD$vdj zE8}ntLwhlhM%9$Aa9SzP8OPr~eU!>I%*KWaB4d;Gjzf+Ogn2SDp_{9(nkiMOFeh5T zY{Bw>R9a_=K7a{^z)g(nC1fg@k@{nDHd-$D^ z!|DOPiMKJ8mgW%f72J!j$U<2kFZHx|o>JkD9q9+YmxcRrBOfOjbS4phNOY?Q5`CCp z4Z3k?-1vkLkjljVeu)M)lg@Z$2x_?Fu_Wrz!6j=V{u-*{X~}kYO;$mFdS6Ej8BR;5 z18tEB0;V^As0p^OXagpU@`#pth*V*3TU&5c@G8mVp?V{^A#O=^nmukcl#W9E8!`k? zeUBfUs?=8=QAvwi2Z@m@voz;wCoocZN*d^EMC8SupX`(4j6?`AEqwVU$s?kQh?bS2 zEmbkopDjeNyRFyz#*N|FkI@6e*19xyq+SL~VdDw)JTH27-E-2zOWHR(DnsbjetE7INMqykYc7QKgGFX zo}2v49=EEFUM_ToB$x2T`UQ-noEHqueknRhuwAa?yVq*z{*>d zVSFHi^1RLc7-S69Jkyl%&xr%3rBKzA+QlbQlvQ$Qyp2XzZuaLiYl8kWcBPu^;d5H( zBbiiEJV$p}9-D$Ko1>F1H#a3et&UgYgR#XxA=~^A5u#wRg_BK!b+4(8Sm@;tc`SRx$iejGkge_aS#dV&i($^yO-(Z_x!5H*Zb!Y{_kMYGJwmRW@R0#1>w z2Zw3g{FxV2Vnq|WWM~sM&Ln?|etn`>vZ0eGpPV?d+QfSFk*{i#U6-1YrbuJ4pp_(- zfa@zT|87<`nthO{T6BdAWGG0hxfHl6I^peG)cp73tY3UTI|ciFm`bNNEE|P^13)Hk zBL`gF0@4c3-K2k*F-a@|UFrBw2|M@ik4XH3voE?~vu2aC;3DPLe#9umm4wW^`28!tTc=%vb<}UY>&d`# zN6=4c0CRa~27N(Lf)t06wcyFoRU|uOu-yA&#*$3loW#;;E%H}PtlG|D!-2wpA-|FZ(u)N53T4==TyfC zp6SZK2pGDoF9E?F6NV>CuTZ@2anXOvCVsR~wT&Iva}Qy^n{p<=R!#}$es#xziqRvA zbmNyNMVB5shcQfL{i>p)aIjvY`QvDhfE$z4Qez`!%nj2g1!(qOry0JAjl*$9T&*fa*%ut5niV#$8@s-Dyr>w-4AnDWp zxcI)%vt0T_x7}*dVxB5DrVmj039P-B6!mzFn=K18xC=!WhH$BGxsm<_q z+(*nRj)DLoZ87+M%bME}y}{Lb@kwYDjN@jS0TmaxVenizQ@*F7Z90XOBcYe*5Vrn}iN z^~78A$^p#`KS^llR(+T~SBF zy`kVfF;0oa^R!8^Vo=4%Y+jf^giR--e6b}ukDhnXOuTY2h5Fy%Y6=%BL7&-XCBfdh zRgk)otZ84Vq7J<4sQB55k%&Wv>pxes&_DvxS9WBqJy`$(4-e{Qtw(EX5T> z67TtT=KODn{ishDn+S?SsEoFvz1 ze~2>zM*Af79q2Q&U1FOq7%$I`5h#3o?#{Zpm#Wz9jKu8mp=!jn()sflHU8^cJ>K)i z_1V5q*xaxgvJWZkcm$iX>bMG!l2F0Nr^7WvYStVB)lL&O^u^-mb1f*;T;rpc12UuQ z`k$C(&ou^C1i(hj}29Lb&-;7NPTnL8EWV@uLcl4O55-*ciO;@c>?cJEp8m^wk%<%>(gqo#!s&a}=Jns~g;pCjxY$Fw z!vdU&TsxntPI-M%=d6VnB_s65+;ffhB+W*yr8$AcnPun_O}uZBd;ZY{96D6gNqtwG z(6+EbKo3)Ol&CuGHaJa`&J43GN8DsRaDS7bI32JO+3eH5?^N_@%?)4kI?`t@x`q-( zWxK5+$;NHVBo(6N@Gh8vR0jT1MkDxOe-W|Mqk>-gx= zsjkd0-cCDGreb6IFG~NsIAUp3&Wsq%pt1Ex3(35{uQo3%BQI*PG^TjyJ6dIwYpw*e z3+)Pfs=$~eHRSNy>5``HUMJ@nI_jy9j$C+Z*GL+f)lV;9xKQofQCo0bk|L|LA(f%! z^dj85jVzu*Sq|QsE7nRgTxymL**%eQEg)>#klIzj`%tWC#H05K1#z`PF`@y}j4uH+ zXqLc5_P|9_fI7B2&Y|@VH02+WQzY$gf~4Cg>5gF2^;+!A9oMU}oqb_NWL&+}x99u&Vmn`OY{~K_6n}i2I5*6MGWSQ}N^X1w-A~JL*g4nC4O=rp#N1f= zw29CD4w65_Yk5D5XOBGw8V|0}?rQj{@Lp?G5uv)PgS>3fdO3biP?+)P_#vDuP|ZH*8_819QI^>{|A z!vQI*p99sjDXdnA6pb!-;*nl6pTgEcylUG9j$gSLPE98=N#H=by!A}>D2 z3KNCk190wf{u3sY+l{9UC%(ED*JO2xK$bnI{#A*9BA(#lxz4&A_-WVThd-2Wq2l`R zHVyk@Yw`^)eU%dsZQ!r&ImMe={^20(V;SFMiVrCTgSHzF+&xfRI8Jx7{!E}z0H`Ew zPTgw-_AZ0=X#zri$I2Engc}f|3el`diVT*+C*d$VjWB^ZsUn+@S^XBVJWr2bm8g~S zem8F-90`3by!?T05Y!Nh3J}VxRMObu4>1+4AXr)SvSLwiF~SmaBpOsZnIXm}%aCHf zAb+Fe=Nd_qkGWCm?d22QAOSu;T3t+LLeg!m*&NlT&|c5NC;vVdSD2{nZ6HhJycOah z@=TIUswY7U9H=c|&EjT6V5+?#>DyH})NIFFS#sa&p90q31jf_6Ep5AY;|BD|L5Qyb zS<4Gm2*tycRzN;y*2W>GF}*AD33m4JtsR;zj+E6W|DVOfS{#7?rNy70DW$H)Vn)YV zZ4A92F@XH70-JeD*uCYyDcvlmlEm%;<}7oJiy6jc8p^j)~S($>~H&82h&)tMK zo9wOSZy{t>)r78L(}a5{$-QxR^7lAcTT7ZccNV5g%;YO)<4Pq zF4x%M1n*KG_Pv~8vvU_JQdN_EY?GBE`ijVq!^x-;)+R`XWqKX4?yU}?B}IEbaGJfA zOvw=Y=d~#svDhCUk?u4(F-zrF!v@{;w60au_$E!}LmNzv2$kM2BYXJ?yvB)cWGK7R z&v7Sg={nMbD~5z_**v?^7=)5ZtJ2NzJs3Q8So>;`Ib2sa1Q0g==LI-g7)@(gN?<(B z+tw`aC@SW|B;^-l&s#Nvlk7;f1sgBLxb)x zYohsFd(%Odue8h-Vdp`0Ea*O}`;Ma_-imNw9L$N0AJ}guue%vh@({vOPb-uR`G__+ zXSoE2Q1nYDDP-{|kLewMtF!XV%GI3$op``PD;PyumJw*jy7DHy{LjwB9^}uTg7tJEC~fuT%8cAt(EADw zQRIStz<8o3e}b~0`HV^0()FFY}h~kYg)(?myKgIMG{xzVrT%UIF?+7tjyf z^RiB;+)zFz6D&c)kgS+Q>`|LCv!<)cK2fDj)x(FkX2zT?UEL9p;18`Hd*Ad>0Ifc{ zc=*Sw0Tb9^vS;=lbr=YpuoWe=3ew`PpN`F$NeLz8F@N)5m9}P9bbok}G+Qn;BQn%~7x4Axgrwawnno#b;NpV&!v0qG1 zE08VW)k%NBdV|KE8jI`RvO6yRU8rBetyo(Mc5%NM}F-4e<5#2%s10ci!eCql4EevNtdw^j;SN z>Yr$@&MtLFPFAp@wjA{=Xd~6wca%%>c7VH28Uy>H*Y{6Sruhx>XL2=T_(3h@glMr+ z#m0|@K~uY0zy(V_d6@gUEdpZw?-1hsWTny=E31S0>O0io5>4lKunY4ym0%J7vgk{- zUgH91Q**AJyk*E1Uz30H&`ukb=vU%ta3z~iGA+<2>p${bO&ge?d`&;XUrth;id!xS zA1_J=?G1T-ZJ8F$bT)mNA7VRyU^#uSl8XkRWB)Rs-Z3kBCL7MTwVS19slNm?bRCxVBnbFWx0TLa<#Z?7#f# zMQ06`uKI4EGImK|H_1!;;3A8eTl*&X9G}#9sa*~96#&~Y*3XGTD$9vN z4&8(KR@%|bFvjZh!QpmxfvojcU$Om4`xF7W>}NKRCxg1|CXPMr2i3^90Ud0={pPAc zt=W_3Un}mq+5{Q|xnL5U$In+Z^{tX}nr7tsz9E=S(gF7F;)$%vtNoT<&?Y{w|eTrGJ zTnppXv_=T)Ev!n2x)nvGi+N|b6WYy-{judgVEq^ZJNBCzHyQ5|j@M-fKwP|R0+O_q z*!3k}8L=>DCQyzxvkS}@ev)V}!rO4=C@ui@BYWs^iN;FLN?%E8q9%NzVdU<{b>ex8 zktIVGxnTan3-)~tF2i<2Z_N>*#b4m`m`tb8UeqZ-pmFtrPOt`OC&j%pDREP47fZ?g zS{T?--b4aHszqX%53UmqUHhZT!iWV0tXXmL%Q!LMapD=JS=645st?LA6QojBwa%O-#}}&ACg!$U8IrLlPmJrooVgrw-@! z#g=ETjSieR$p9;JEJf>*j=_eaic9CAtSWNRSb+a>r_VW5D&g$h>5j=>ML=5-7t3tJ zJ-U7!HYi;Ulm&H-Sks8T@_@JjS|6{JpfSG*NIVlf6`Ps~bky!)DVV%^$}G~p4`4De z4Kc}3|1#ks-7As@6gqxT_>f#KD`*Sn?+cR}^APeqvGW^F5Ls64O~WKtSB3UIf|g@i zT{-bdtoi;XXTlSwk`Ek6tY?n7Ac;t`d59?$b7y(%-fO%HdfpObsq5bQKDqSPsK?SZ zK~mZGW!z{msB@1<{H@=?+zN{!uebJO<>b_3;MXBwK%BiFpGKISIvgLS zUp|siP*mqzdQ!|KY+ZWsU3GAC&)s^3?JPO9jJa7<6&+h`|GvrC2d`*X~QhiP~Uu4`$QnC8jM6Vt36|LtN+JomeZD+a?W zU&`7dYRZyvQl<6T<)gi{6;rjo65}$^nwVY{hF%*cg`yR7V_oOh6+PfBZrSB9Vn}%v zQwyoE6_1J@V<<8yIDNhnC9pnN>|o-2N?Cjv)+g6e)m7PEf&XH6#o+4VMbvdfG~ww{ zxShL)yFEu3OtvObR1om+sD`pg6YdJ{K>dvo_MQ-y&;=gaRDj8?b$HG7g>J<(|3{y| zC*5o0sMEaG$2wzMKO1>f!fhh`FtV|xIwCJ!PEiz`q0)r^XmQh;+>jySle$sKU+}*P z;NJ^Cd2n$~UTn=D9QMV+;gD}P9O-b{fcMH&#&P$z)^+9c`9+n+&v?w(7+zhWge!g@ zS+`~6rF5bQm-yRxKu@)K?6mW{)>K_$jl~_wI%rS?ekO*wyV#(uw2otzfk6n@x2`t_ z17fmQ`dOJN~t(jXIk*Nziv*|7ccjLu zX5W%G9*7h7w+at^hwkV%;v-H&zUdetYkO2OrXY z3QgW8C^!6h@_M7i;k$Z{eQT?oIqQM$+#L0_0Lu$$s4|4ywW{XYDp~Eb%k8*Iv+`xK z&!r|*;34nAO>QAe=Xv~!$Oi{|c!eFeO|?s!8hsf%ne5u~nBZJR?F`Zd zo71X1WDXzcRxl!&xKEU+uk>X+U#Hk_o+wtfP4Kl75wzQ3zRZTq5yy^?Mdfr7huZFZvjw^IUdg{r0V^-izdERE9>%X2~7%v%|=%u6_wI(du4& zT(BP^qiOj!BAPFWT~TH3EDU>L*Y;C%byFxqM|FenJOaDmj(A_#Ay&y`T{1T|)s7vv zoCfRRm(?FoyH@D77YzNL9X*e)~-DSI##rp_> zXekxNgCsNtNFFKAD+r4038M0WzuovK{2H;}q8Buj2`L{r_i3@vf3wV>E!hxOUfE|P zGqz;JOEo55wD2^9nj>b6k&?o}5@#Ny*%!^B0C2kG;ULZEzbr4to9ejw}{C#S@+-YC#32>8pqkl`UmR zN{ZkQS8^4sXZSSCcIGY(GCl$>Q}78+zRoOA1NP~W`o1!6Tv#aUZE&FqOwW4~*77(= zt-j?;WxtY!y;V2T3PsV+b)-*qULd_llukj=7pPRYDoEM!Z=(xqjmEcH3Q{#QF-2JIkDt9}$EWdpWa z5X2O*_X#MKJJ=|aEV(kE!-R9V27_L4G=`Lf$ypMM=8If?pvQ`A?mvdi<#PhE#86rByb6I#WPJ*; zpx zuI(yIsvZ@EMb5VRRun$U?=w>60+8jfMV~pG+14Vo(Evua$&)wwPs^ZL{DlOct;g%M*J zjVNXEmW#t?#grmF7Dr2l*LuEPK~vr>`c=9(WVUZYm8m6$) zrY7hkHWD?5*b{;DmHdOfF8}|C-F1HZ>;fyO>Ba?K{Fc{dSU5qW8F_fe$&l8%_x>x7 zZ(^+LrF@pq#Jy7mjE-}wp2(E3ouTLkd1HPY3aRcOxOG;)K3PmN3Hm4Vr&KZ<%d&&N z{+Vpa=yxAD8NxIBX}|LNLOLan<>)%{6VTH+5LPzZG3_Vn@>5oPHGrEtee&@GON_2S zZeR~gk0>fG!#d#u8k%{NI}D(0LM(gdmoH37LwQ&^LKNn>#zdqV3Vz7(Rgs*m#d{Tz`B%bn?8cqtcZ-jrO}QdnM9 z{61DA4NY}Ua#mOfr&4y@Ck4Rsp_aYsaE{49G_G4qN$`zI$VAS68!ApL3~_1t&w7ik zPLUEYt>OI+Ou4^bAzF_w2`7%M;tLY15~Hz>V2iq&OPX!ub<}@~P2AD-ml)fKnsK`n zU6Fb~-T!u&u_=(S(H?BS_v1=*6+q%!&tNU0hMddYziFC*RqfIIOR{}{!1prA0I#!{ ze5Zj%QXebn&fl3p{<>Mqbz&r8XVW;u^B>=71Ns9~NA~U%h8{%ZHY=1OO=;HW1&3`w zO94RZaI(Gp!x0`Zi>VgM@`EQNf!Ou~SCHWm2C~#Ymw%(EG$yV*8l`bD5WP`BW<7R^KX~mZ`^>ZUryx8s-$>}uCeAP-de_P}U$F-=oM`+Dp8a)ZCP^J^AwBs11 zWoq@0$A#qdv3V7yA*(DSm&YIg z^)_^BY2wX%QL~&l&rNu1bld*pYNT8-J*K+ND@M;$j;x~oa(lpoOQb9Pt0vlhV}!WUE95MESg1Of6PuT_%N(-6pyIUGiealjom>(=t&UhS`)VyV;R5C zdg7mlK&kJq>~wKicd~olh&9QIyMK&4U`m$@4r*iz5^@yLeNkWz!cI(`HBaq#gzvSx zwUbX1*kb8h)f>2Nm7?;s^Pj+@O$%72sPsSVGw9@JS$MZX?+f4BEq zLa9@~@@v@2;(VL7208StL$*A~b`#0{ccPOI(xn*F97*KzBZ6K&HP1G3u239Pjd`9x zgJw#J72Ea4U4t>ln3_KyJ)?qeu<9C+OlXKG)*1hRs{F;4@Pycjt4-ew3R^0vgQjM`oBF_yGdd^!R)oK)x|<`QFs zFBOj|&Pml-e5c$XToERZCJrL+FE9K{OKD>efCEBnZzie=GK*xIFpN~v1-P?{TNmbM zpzLaYo6A$XAncgqMtk#!`O(4EN0G!96;|vDGdyZ6G-YlucK*|Q*aQS@9{nZR z$MB{7rDb}OSnQ-H*Nn>obR#XyXNQ!@L@DT9VVzpm#?JC_qM>G#lYL|zt`I-SgO7hSY6S0hluCSEoWH!}Y1-OvJaRePfemZO7}E~2`pIIJ{1X*Y<-md9wp zxGxT3%lFaoaQ15f_vxtx__4IeuT%Yk#*~eHLQ9uR7Fw-BuF>d5@h!d=H0X^^-e^jg#e zNM3!F1U`(#eBltb!NTXOVi+CS}w7Wq+S42Ah zPzPZnQ8H&IWKr1~_r4J6V-;hoy+Dae+aP$7 zZg~oWtD#oRS=`gzezy%|r23d`9>T)k@tOU2ft$Qjx^j!#S=@0O2s_!_Hq`=EV#0YJ zSqcKk%ST2`6U;AC4x}N;kQ1#}^^ZgNHIKXX@`g%($>y(@{lscKPk4`*EK>XAMq}aG zlOkiKu?#gakH_q~Si$|VdI2a=(K6@4A@Rvr>79_c9fhg6e!3Am5HW;=#`eJr#6ojV z&Oz$quOb!h{YdkN%1*D|+sBv23@N>EI9Kjs9(q zv38rR&XXt!xE`*;ru6DG=ZQD$g^^%}Vm}VJZOVZ0=HUlt9q#A|Eld6ZCB`hZfT(Gc zd>;Fw@_aRYBU$PE)H7AiK-ZFh_AO7pHfJORi|JiEs|=6cDrBXl+z@B;(oZ4e+(gTO zRr(@vUAgd5XDR&2>9*=0&5D1^I#?+fP|&y!-!`0C))b1zATgb|QxOL!E-6Osci&C5 zJRghaDp18~hd|CNkRNUiF_I^IE%uDtIlI#i=rhg|SNt0Wco9#LyeI{ax&M@%6aK;_ z$h`DFz8`ZbE6INGQ@u#kk)hUfB`TEBim=oajl19@7XMy?%;y6S_UHYg?ZK%&1rrln zfAXi;W=<|D^iitRh;x`f!@4=1la4a-`epD({<2xiJaL3du%0`QhiwZi znct6UmeZXphhPW4!YJSJp35?|XCCHnRf;8_ldo9a8sJcJ_-eq#x*)`;IbFV~cmDJ} z*p;EMz|Kq7%4w6$)Sh7T!3Q!1ug}axChW+m_Qj2~n=Y**|_9%{t%g88Y zYhd@Xim6Z#WnJ*PbP{atb(i6e0+{`18_G<+%B1g`emSKkOpJvaK=LhWx^;nzVI5BX z80*D}v@0tRlZL4yEnOe5w0bu}y{t;{7e9GY5v3VU)@2e;SHfmjw>xsyu*P7>b(3+Z zLm4ISuJfK;!~wwRxV=z?$3AuON_P^`u!P63lp{Jbd0zyiW3O1>xq?%KsGRw8-kn@( z&VsEMq_CWEG)-CAK6ywgfACBq!_W^;M`Sn6n=j)8ID3V$&n#bkvbYZg;aDcT%}(I9 z8u)%$t_jOqd&%ZIF43l-*9U#KB8d^@m*w}BUP_fr?Tf0TCGw0)8<@inPGJYHNg=hD zt^N8LlVa3)7X+G)T!Qh`K%9L#ZsmKqbkvB(vCO(eJkj33^Z4uv7wq_=eFqg7{YO`~r=Nin-}=XvocKP& zd)=91DLb#?L&aueXOy25oG_)-G{qrrjKeP@mSucDBZ12U-6 zS#L4vhw#1j=4W2`KU&@K@-J4d0G9vG3{&yRuYp{I1-#0QVs)H*BaiBg5MwEIWNxVb z_Q~WJX?{XG>%>v1(=^S$%!3AA$8U{0%Oc0GAoCHRUFL(DJpou-VT_3Xc>&5|t#v3C z;&ol<#pxlZ1(Xqz=^1YPf(O?hNO}e9THtlBQKL>NEoGK_9x!x!cz;6;RqriL4o5YC z3%Lc}Mm7*zio3#aG2Kzem_#IuSk-UOWJT{iqg&r)TqdW!$^v!`e{J-p_BGg2Ecp7H zc4D}HRVl#Plu!dN*cG#S!W{qd9*cN}vSQEV2CEiX27B<*lu|&+XNSc>`@MU>*#*4J zQvybX3G|{3Cm#1EZd2~gJHn3@Q!WruRF_7MmmwaUBnU`_$guO5;y0O*8K!QUB^E0) z<@4<#xZ_WSQl@_BshwQDMFMGGyasV)7o4ar!K$CJLzsr5XaIJiSRqv$s^=0}fc(4M z7)RrW3clJhDoKy}83dr0Sv$G;3CS?oE`43m8LTA3?pW(bp$EO$uv^XofAZ*) zocTD|FS@>H`rg~-WUfqN6`SMXf2_XAjJyI?85J`9Cx2U<9x)?i@eLz;dBBtD)PSJ( zdoTl`C(QhZcng@!hCO_5*vK(*}g~fsJpt9uyGbM!_ zI`@T#eWo+Sf zi-#X5f^LoI;<&F!3$}bP>RMtoDia>c^rz4WR?I0@cE8*<^=tB_07z#nx*>Ywj8bx( zx8ueX`ISM~q%mbdx!&g79FEG!dXKMpB&gdD{ESLZ%n9q{!7)Ik*M){SloP$7ytG#I z*la?v(oXiS3+G-o6I7u%4q9EonM$sC=sj}n-#)5-t25Gs7!6Q-=_Uv6b_P)42_8CYx@+~Ui+ z-A#<;krv^9iV3%$0F>Jhr>e;iEaYl5Q#mR3Bq(CUgSs!2D?CeIz>fJ`F)QG~$*$lQ z9WjW$(ZU|2eeYZ96MMqi`(tof8x*=Bco|)p_pGb+VQ&LSliP?NsFM(Z-c? zM;-kz1^*kG`2oP-yzS6PnsU_-EDs>#$c;oZ%``3Fuw zKI?Ve)M_K$YmRJwnZSS=6!hTJyp+DZR*bg$52SH2-Bx5$F-Lr874$}<7VN~76UV6J zviHe~cW6giKl3J}JNHb~A8+@fBcIsfc4~9yRiu~%gZ`c;Kw(e31D`^`bZRoTW};Gn zOv>+C_i7+4XQj-Jv2uw0A?BcoTom_hFSweD4i|AmZj#+S-;_XK?>;wvO+<*S&j}u* zgXyh-W-o~d`Al{I>)H0Ni$>Esb4;V&I55m>q-LQX7rFQL-X^?+JoGSpn^x83yZd zFIx!v^`HB+S2;H^BWzXyNhO85FFiENjeBu?bAQ5sH`!tE6bk+yNP}&wt`lM3kG3-Wj2;P*trQ7#tq3q#+Cz+HL6B6pEmU;PeZ^x&^HW~i< z=}Pv;i}XK!i+-rP@?#@u`Jd8f&r`)B*1PDLI{oita|j==6gA#1sk*h%9O8Un!L$rZ zJwc7~4=ZTYRJb5!KIg|*?Y>?RDBjKLw(~+hJ z7ndOgMGBS?-^1!-Ykx6?biMKQ%9HVJ6`4<4?62sUQ(hvNPv39GrvQ-$zq%=#U^JKP zJBLB-*~ZsW6}|Yf`8rwm8-|X?R|tUxb3qkvO#jRiKb3zaAD^>Ht^H_Y?IZUs@avL~ z2+*UFxvn(`He#>rz6-huZhEnUS+RQm#%1W|E+d~1`~a}*1HS}-Wfi}+pozY! z6pk(v>9Q)s^+i>>xnCtNWf4!#N1{N!Tl>;<*XNh=q~^p{e;h{9Ny?*t**_`ki4 z%&v7#a+0)tR4Lf@hDA61BUnWr;PQ!x(z3vZi*V)8;D&$*pU-Faa&eY7lU!#F<~xoo zVw5DRFg^}KcwT~x8;-G_%fu_7xfUiJ(X#KlwJ<3>&rJpeecqImO|-Qn*a+U2H=p5) zu<}SY{<@G6(DtU0pZ&cR#o>kqDKNX+%4?VS;2|fWyi!yWaPv}FeELEV#O(}AX|DJk z2oo&!|55L)`Z3^eJ)M%h)gSzBVkf$42FEhG(z?YHMVH=ptG+f8=fV`-&rj>G-?5t< zUf?k??Z>qz+kyn1Ji;!(>8UmnDRWbQSNzaf>G#$}|MlIUmqcHq-dG^@pc2BdAYS)~ zXq>V*@~n78-K)H_`=aRVJOcZrbMK!r1f_&a+8|Y#;?ZUK7WVW20h-g-iu=5bd0@3D zP(nB)BA12`U95*$q;Hbut$zSp)_5=ZCrrD)>S`UP|HK+R6X0HYzTWN~@TUKkZAD^<8GB=^$yIyMe zUJ62o)ZDbr4Reunf4*p;(BA^u*Jlo1{&QqSGS@vMf}nr-Vqx%)WkUe8lE^JTsM~(B zdj`E*_PfuI*Q@vdHB*3eBY%E!X7KuMQUZ=;)!oMSg#XwT9lgx`!K`rui1_>8D|Pym zV_g_ZHag3Yeo3Iqvj1s0PSe09kBG``>+4hkr4YOOulXDPQi?}okq6=L8roU!4utdi zk8}iyGL$nx+KNp1;bt^dIjJkIWkRGax4#{}w=ga_LZlXZBz=5YgZ&K$j~oVH0F?ci zzqAMJxcI%gkHLI*o6^Cymtp-^s+a2VB5v*u1D6|~w;*;?v5nsHN)E+d_(|fWeW}XA zi3#s@&G_x76wHdm)!YX*IFjB>VK?NYlfM#Hr-r7Ni}5wQ9H-jz)z;}Aa3wrv?^{|A z-LAyvP`DPEhXpQxP;mlLh84_hI1UIm54Pf+f4MY=`V(7lB`+LdObc(?N(y!Gm@47y zalAfwnJJQas{_S86D%?YON_oGCA+Jup_Z;uxgN4K2Dp$0Dz#69R)oA!|GAxgo*d`D z`(=i6@r$xsa?nLZ;aD(DHiNg}x<)^*DV=4k7%P_=cWJ2=;+)4x(Eo+|wDiBNNwN9L zL`S}>*0O8x9G5@`aJ`-w|K*}u+U%D?^?!=eQ5d(cVS zIF_~q{elrCaYEfV1hGm(h^E>&X zygUDI^8th&vs~k6XF%K_k5cG`fvBrwjLb}p=8k7bOXtM}DI78j7PD}i;x)HCrj98- zN7X&~55vZT z7NlFcyFt23K)Qv4?(Xh*7w3E3_jx^k!Sm%A!@(C}@4eQXYtCQHV;{5SSHw#8RvcG^ zT#a_`q#ZDhCM+$XAyJ&Xx{GqXA-+Ahm;&fz?n><+%h1RijAuPPo*VXo=2Gsx3*S97 z{#7)a{eF`Ba-!2Pp$xe>ozGC)`U!q;n*XnP>(FN}s`KP!V`u-U?&^-*2XU>ADCcOr`;k}_ zXF1-5o|gb5u4|FqQ25TeoCG|(IVDCYvcs2A(g=1>6DYjvsm11W(k=-mC$XQvK zg}2gze&s-wRXE@!WO1{tNp>mvbxWL}DY({XEBUhsf?b13Pv@_dVV{BWtK&&*uiMP# zvj}Q%_7q)~EJ4tlApa&$Mmf&x9m56-Np@ps3mhz;2;(8;D+*fg4b_g@crL+;&OEna zGR^3kMt$=e`s^9-CnOAJLlfV>&j06UrT0mOSc6@t(%1H|Eil&Bs(>O>BnKXEe*u__u=Fmt*-Yai0 z7DcxMu8+;gmjoT*rAfQHu^dh8&ix|uO9di5;cnYd3D24=ua#89C9iot|MQI&?H9NB zZ4am0pGXh-U`bAn!d+x;J#g!v;RKP%b`ihUVr%iyyVzaeyh{;cwP*u2X=K$_9j*i3ZNqR{h%BP>qTo7SC+ z9pjk)E)5v<>&ppSx&aW?q4h=RR9A@7=Dd*O6?gt>)fcGDJ-T9@-XV*w!X*f`Mg*S9 zw7wX|zlZPGEf!J6kYWPl**z5mJGA$U{j@#36DcQW>X9;EdekZ-3_iw)GIejKI`{3z zP`4qwVN9BfD#A&iXvFS!vY~mn+pQW8KnuN_Ta+JOWFoGy8mt1uE#ZKkwi{3Rpx@B? z$Z}~XWNcS3viR&A>bJIH%(1&?U+v{}*`F}#NktQhNi5Vno{Y{a5;}RB^czMb%l&<1M!-{?tDY4Ki77~Q26sHR50VuLx8B4^;WIEtT&90nU)a4 z^DOKY-cPIhv7f4y}LI*YyZrf%QiRSn=kIvWuxz8YF^3d6S{ zy!*44mYHPXbz)=KWLihBHhJYLWZLVU|;B@#4LQ|Un6zSQ)JW1kG^`~%#m))n_p zUWc8YguTRr_B8kVH}g~%j#OX1NA2^xos=0{dL|}ua9SZmY^4682%M;L=bus>n1%v{ z!5?X9Y5NnMMR+u*SDc7$-X_FN1}L)p_A$(6lLe-(WHmc!H>`4^Gjx-e53D(pgA%#P zYKIBb>Kuw2L?P8mD*!DA05&Xa?bMjMrCWLqLaR~h9)!qet}T(ERXd(R1d|N@jnwix znv<_J$20pKiS^JIzUb2ZJSlLJY)<9Hq|^M4jXrG*!xz?;1gis+3d)|qAR-%e=L}!G z1|kacx~rLqtvR;%_V9bW;0qHXxo5A?6Kllizp-IRG5%;G2&CXg*xTg2ypHS6PQ%6h z%rS44Vgq;*9(NL{Jp_SBQ(qWUMZLc5Wg-gk6t^8W!yDgg^~@3tVD99NJqyQ}2w7Zf z#~;N=sGRuAga|U@n)+sxPk{q-6(1%>5XfrsE#-gi5>(m6d~bemJJ^OP5OollMTY`- zV`jT1qR*^aV1r^b*-|7TGMq+&8HMD$6jusXwVB!jhh z_doeX9_?B5<&f-}{C$dz6P~ z5;XnPYrfM+4Mu(v4-5yB9Q$7p3NtNQ?3=&T+3y%+;c6HZh%cK6ZYovuH~k*&nJ2yl zFQJUE-Qm6KQuPj?A~qLte^M+8-S?+D_ZK#WF(;1B=* z)v~OedE%})sH|6gS*gLE#P&z%s(hLghx>c0Mdo1moAuk?&cGP zy0EdKyp2GkdqM27OgD_uY+|N6JbO)EaYr#qj9^*_J3}*Ms|vW|=xoWEtE(JhDQ*)w z$$0wzT{9ks>yksCJyD=2(;xE`G3Sl%U_3(n&knC%CT!*o-IuSt-%n<^TA`-eZ2aW9 zx=Iiab^h^8jLBuQ@mF~VU1yd++qar3?X>>_kGsw!riA@4)uZBRjt@8w7+}$9*AUMB z;Q2h#v-97$b{D>Jlh2#+#zxUXhw>c1{P+DaL~3n}uU_tUL3-v@d8eV8G-p#U^vCnq zce}a*zYCpP*u+{|yB(#uqp=LyvXGcbI`uXT@P7gsx#?H8@Jki8$khq^d6 zGww|rHU4MD%yLHYe|I+;=Vg5L#1l>D{ACUy(kj1vAChPiW>)ny_V(b5+f=1X$r;pd z_*O7g4mGD{S#X(D1_e~#H7jyly4~Uo?c>>BMmnMTKY=+SCbvB*ap09BU1@$(5}N4t zXs(_w-r%Hn0jVQ?pf-dQVUSDuQT$Izp_yab5`6-rO`ox;Q3NuiTH@0VmwWz@#9Q*0 z)`c)8N{&=+LII7K^SPrh@2J*&=6vNH6fhr7uRag#K~$J-m#*1p_sQ{05=Tyuz?@Ke z)zzeUt;LK(EBBcv3~7u$70w;G((NtPl<{J#~!2)4qI^FIS}M9nx9=?8j10P_)F zFylM8Is>y=tBuvrpNV)mmpi2L#*Unvp3Ypsx#2Co^knam^L_pS68H~uj^odag1Yk& za%(1K8qV<2fIJniE2E)Y>1;mPDkeJ8n5h4rR1>?|eCE~_6vwGIKIVU2N=^x4Opej( zlWGgY`XTS(eX@&otofh-UrcFxnpyeY|1|S^UIiN-=q|J<9te{mljv?vLxEBu<=H$| zH^rfa4+s6~Kc&so__VCO$rkg1kx7MP{!bYSTmSbdQNx8A38|R(chps~K!Tx$ovg); z{;01@@mZqNWD*n&lBko9)_njxvtfUyA)9^&bQ{M9Gq9?B;LFCx<(56ufbTH>MBMaU%u-lv(VFnVMsCV%JZH1dJFJf$;Tsujv;?V0DXq@rW8`?D~ZCHgIO1hLNl(D;A{qKo1K-U8kv(fgsf@Ns=mJwG6h zeNsECPwao4c}zg){Qi{wY5u+MN-^w3Kd7g6Pjt~UowxP=J$wl3$>`+swWW5C#t$Lo z1meJ|9M~`4v*}4iWkjNJcjT4cuiQ7MTt|VA;4KCc&>zF(??F4qwa2& zj-vRV)?^@CX)cV#UVPT(JFhGJXXj7N8Wg+ZbJEDkc~PT6{2OsKXqwSR-^^nQ_F?h0 z87}4mD{AwLSoS;kiep`6g-6edf{mpjRo6w@hQS|DJG#9qg(YC5!`$8ag9L>ydPqUF z7>k6||GHh3#p}Y5w0@qi-P@&bB-V}wiH|i`0y0|9oZTbMaYE1ukUWx|GJdPpTyckCfWSb3*~Tei)_jKk>fxs>EF%L~LuS?54>WAQesQqUKw#}8K-f3aI^RnawKbB*z+5WHlE!ge!a9?D18fG{!ia&h{yqwiJ zT&8a1Vn^!XG*p-5{3i8%?nHi=Z)bE+$m!LUn$x9>WaIQVVyolHYi@<9y)5K7}Zcg>%egh4qR22xg=+%=IYqSRn5=E>6&0E6Ae^aHNsKg zT1bp>&!0$ojdNc8GyUFqc>O`|Fmh5k3Jud=?#tLxT5@ib{@m{w2v?e}ZbyJ}C~8Ug z=J&7U<~+(ebHX}ov)L;;_4iN7#FZ^q!HOlq2+@sL9a+TuXk4;<(|lCA+ByPBhN1Rw zk@c6U-CIX&KV7-rG$Un{z}_!W2|Wz;79N%e`2AX;4OTG^b$Jh$)6gBu|K@Z`>z_V~4Rrn**44HxRsH!l-i@sTY`cAzD0*>0JLi(|j*rp+0JW zqz6%HQ!(~^_0t>$dF0oV6avdYd1+H>Xuh_TFQ0ecZPU|T%|CMCm_Dh{H`TWn4m+w`A$$ej8{|Hd+u+B|INFFWMQjowl?RE=&Z zSiE0(`i=^t_j29?Svlqhhd<>Loo-L%9P~n^7e0T@hEHO>KVs5Y^%wq1=Bj>JvFPyn zCy(2tHdE@8sNd}7!b65lWxkyN)Xz9q=oT~sqg37W(M>iP6xTHUS(loty2p`r2P~?O z3jD(CjmJs(DFanc|7RAU@tTyN>Dj*T$`geN_3N!D9|DApEc| z;gc~`c=}CQS-^Qy3CAQxF=iCbDtPlI5+))BZMc+bV(Y~A;xbCs3;jbWlqoC(eY zVPKh=ji@WGS^Esxtsrvur;{oJ0W;`{(?e4txo?NYrcNCj9`EV;D)R z<9YAFs3)l)y8|$Co0vd6bKFv141b{3Y}nH>_F#@YnJs_;gN3p6wvT>(B)=&oq? z_6Y(t8G^d6F$CU4+nT#zjOvjZVY_X{h)eB{rmgrLA6HFRs?CB#>~8-GzG%PVld}c} zMez9freQJ7d2?W@!#+U-jI5m2;zWx0D zwO(_4{rjZvN2S&Ow?}RoSJgL4SOw1$h5b z;@b%SL@5~$#&W*C?7Lg*Ug3iH$L|gT7FtcHvtA4A$^_rw1qu{5+6ke)*y%%l{16JI zOi^EUne=)YP}fV96(6<--VASR7!*?902i3C_k&Qfiycc0!RG^8sspW`^wHAu?+5{D;oGlb`QM z^%!IYp92(_Ui!|H9qdMLR1<-gWND|*xvhr%md6yLf+PUHWOv|RVNDvteWJC0C6#Jx z?>N0ld!i#YR*ej$^HvW6pZ{~eD?#Q@nUG`t9-){2@)+Dxje3qkItuoKXCBA zxZ`wN#%`(?UlWUg6MsUDJ`_ZO5+9_}-(0B?cHXEZwZKnOmA(5&+TC#78S>_)@1ms7 z-U!UAO)gYl3SRlMmK?{DNE23u_@tl?)4_C<7vIZi-FI4O1;4vrih^8=2jM4O{#`K4 zkT$>SRm8@%zVBFDlFmsuw5o^3S-rWsz@hQyF1%L5VPz7s=xg-pl4zS}+0YjK>VMqQ za_eJtu!m>|`;IGLHu_l#ncJLRWs zya@W{44e1&#xWuNHrs7tB5|*u1JKBiVK$GqG1-I$2Da38K3$xijCfDrS<5(U+=ISC z7~kmnoY8uX9J$Yb+~U2Rx=YlG%o{A>2ipm!D*cNlI3DX$ywR*Y1z(+Euidm6#Rwm4?ZNw4|{-n?t#y-#; zw>r2&dfW~p0^7;wsoS?g*N^SP{OZXtKEkw$mJv>f1eZ6rBf%wh$F2OlmAMxEZ}$j7 zCffYvzrcxo66KY6PDg;&ek#IE`w(r)$={Rzps8!=72wPlLCu$nMQh!!9QPV4B`5oP zo3LoI1ori_DZJIgiHPKaMY>*))BW0a!W2Z+^W$u_gq$xpIlm@+ch=1ReMj&%}s1JoHiDJTUqT$SM~k$kK%koEUuOyVfDi*GsIH)-9{{|s^a#c+MSKSPwkm6UVLG@vRcm(G> z_TG4%3$bjyQ?NIhjKzpiT8KZq-L)JJWpre%q2oC(oIKj{PKz)(xDnB3jFhKf_&cjN zZAm(Kg8oYhj`s_`wKreu6)`4Kv)vsd1z(GJ0ex8_vJS6Ko$gO<@_rO*@eppo_BPlb zXI+w0d+Y)daY|43pCQcKfr1w-1gAH3RqE@udg%SKAvu?fT`WYD4qC#N>#YVab{l zEN%z7^9pwG+2Kh1Py08bUBM3ov`V>BmGqxOWR92`B8AG`aeTTwkI$TOpP&Q1@2KcL z`TmOfWuWPVYg9$mC6y&D>C19A*3Q1Ra=%>;qjwJ1z*@)Oor7mGta>)w{zF$MV$wNa zpZq!YW8Yu@V~;A)Ptjzr$604b%Rj_FFa1ivF`alGsP%G7BSsQG4_6$XXOt7~AkX8e$qMIl+|cyl&qDy5d@&GQj7nd}yb0e`fg zd#@1`)(a9|cFsYZp=dVNo9lV>uNiq92=?urDfF17yYPWxt}iPykan-lycQy<(mKES4~It5kZ@= z9uB&H_HLj1(S^&gX+uy)T_ZYY@Y(E^EW40YuKrDcS?2QTC-CAU!li0j^j$coiX~t9 zy!A168x~G42gy+^S|tj&IGPhai_nes`ptrz_-v7h601k#MnSBdiU2K) zQ{eK9{md=4-ly?&@b4=c0#l@`wTzSuse`v2=d2sYe)Z7C4oB+FyPPbxWRnGJ=W$NC z)_Wytx#l-NOc>n0P`Z7m#9Ru!;CW)8B!h1Ma!FFcCgXZP$EQu$O`LqtiZOr1QzG@`h`oL!zE)sl`bQIp585BYZ(Wn&RE+XFt8ZzYW_`#X6VlQkvL) zG|Wpg;$y3FPTaIgr8M;4C{Zg0UVkJFvCE%r|F+xnDExQ0$k*{ojyZ;pZ_j8Bf&k^>YXX=++VhUegQIdG{Q)|MkDt zt`gP4IG~>knflcmIokH|-UV_f6h+p~zpi^%b9?I*rYoI`p0;fyHpT(A3c z*_-4TBGnKqXNnRAw`rqf8qVFB3*RXAgR9e&>B7buHnfeyh)pIE=pesj?Mda0q>NX3 z9j9b45x5BA@m{U&Ay~BWLU|@>3&soz713;hhiyLmTX28$b(;m-N6a*hX>krY*#};+ zUR2P7D~ZJP7?ASu zy$kK}lP?g>QzDhd$j0N)3>PEw7a@J+3niF=S}@t)*N5=<_~_qNJuhBVUT!i~`~?d3 zhcGW6U!w;POP;{g)D#vjZq8>hCL1lS`I=r%g75{;>&1^3_pbc!mt42gw7fE!ns`f9 zKR_888rIa+vGVg*%j0H4q5j%{I;lMK_=gmH-6UxX=QqRp2E7c2Q&q+iHaR(YXYY>r zQ(jHYuUZSp$PWK`UVVK+wdv@{?K#e&)7fx_NC92fs(@tsBd)z^E*5P*xsXuCpFbk9 zRG2b(7{X|1u=>-zr*5r|PEHeZb9C+bkp0Y_pMkge2?VpR0q5oNB&iaf{KR-M(gLim%sGM%d z8n+84GwfE(8fMv72Q_wlVQbwt5;fmD4$a5I!((J*RPF9e`K^{9K*X0O*y$7!yLJjLcnCgZv`2Cwu$YJX4{2L!mBay=Azo_>nu6=>`6M?@W`**WCca?5fPQsE(EAi$p7Kf3V0*Ji|ZY9?x4j95O-IGf=b5niz7I&L{1 zVK^@7cZiy0zSX^Q;h(YO1kp-LOiVoYq(^u~5dQPw!DC`_a(w@iYnaHUMNlw9p-qr8 zFv;(SPvr)N3?E&Sg>eqxb##|*J~CI`zB;fWPQ7k)EVd8Z`@ZvKGk5>^FYb;h z$kL}3TRIr?*ZP&}YezZ3!NIP>YSsa>mJ)XzIUfj7*6kauUB4Eq&>_S9c<`!#ghKe9 znM=0hOU1>pN#y z(R#rM(v>}0=H|5G;^Ice#`^38<7Vt+IF#qGlBuMbLZ{MCCH6Jf2 zNzFAnP&YdrzS7gv^MUBPhj#^{D)1?WWnsNOVjNnFoeF>=+{GtFLptBLc%1QsZo8_b zo~bd%q>DrH@qXI&j=+p5E-v0s$4xfujTqLDVzsD`vGF2EE5-_}5B9nrRVJIjvK%ZY z{}d}6Y8-^Vc*g!&0qa|B^4y#zr{&B?aq-u?ySs%`-!z6288}nI>zBRw1)=&mdXwoebP@~PY`d41LH*Vc7b^PKzV zvN&ftjJRM|*f}`tF8997&ClBqxR*?XZ{V|A4#?$DO~QU0^$(n`M4ThCCg|n=6(4VZ zoGe$WSsSvjpgl1$G4`$YOoW+=BA`njq&z4ifnA*^C(PjFI66B|E-j7h?Cg|sVdA`! zW{xuUNYq}BMdtaM(|hF|OEgin_T;ByMuELu23YZq*81IWI3k zs#wG_)liYFk1-UtPY8isRZ?r0Zg#wB+=M6+5)ydt-{D6nScEF zK`7{P6aQ!AXt8;=(y+I*U4edjM#RL$C2=r;$>DI0qg=a@bzeMo+$^kFu(7ex4kC%w z!wv0G)wkuyTRDGtc4=;H9g%WOPo4kH0@d>~*@D1oR+fbc*lf{?VlhyQa*N0T-mu9G z%nF8_!p`A4wZ%s{&|_a95xJMnBO;N?Z+xfXOU*q=JNAH&rM*ibAST{!+)mFaE3*paXIyyRpd`@B0)6=i9 z=@MSaD0a5KzCI~<*DlRWm}`DPw#RG1MjRvu3nAu8Atf z_jJ-Rcf>MP=w|Dz-bD&Maf7=$ED1Lep#=U=`|26j(!xJv!j?@_W!Q_Nsj12Bd3TZO zGy$rs#dN9u{&d+#$1F}3md^c(_Vg&Cf_?-)ACasm=SEgGwxZ(V?8e5V$NOuC-3dw$ zLE2B5Q&P4vU76UKit?gH8sT~e<2B$s6xK)V-x5J+Gl9$eP%JQq*rTG zxyHYc5nu{y>oDs`Kd_DYNfQDtQR#Ya;&i+uCoLVEy6Qn*c@LA#cj4Chlz$Dn^^(W= zFl|6?j~E&(c)fTG1v|l8@IWBm6H`+?oj>4t?ABmW0@v$$(Z!<=4lL`e7Y8DU_-JTo z8V)ZNX|M{X_Gp(ek>OmQZnqQSqG~uN{WXY&*%Pfx1*TJG$^+fLymsAE&>xq`;9B~K z3XloD-J!ycYdn(qH@1u-7mRkSHLjABAcSa@$vVoASxb}ck+f7n&*b#<^m%VR=#gi5 z?-Te^jq0uV^Q0aM5PLsAzXr%J8A{MAv2buEW|R2s*f|sa?K-NLsqXFXzf|S+yQzu> zm(#V7A$g3~(eOw|+bQp!gKQ~=8l%qvh7qFVD|L-kAuVcZO7120PMs=I8|2cZ!HQ9i zShVH>&EYeR7zKuK3i(>$<#MGIyxG9`ffdD+nq5|?efi8eapI_Y$;=7 zO09ZpV_RFaW&y9WGG(a)y1tcq2o^d*AkP%>A=ZU=3NONllI1&m{MA1JNv2m|F%md% zFuqVkL_}=5^rOZirvEH6X%4T)Y09`g6Lu;e(GrBFf-QL|eh?_qvN*0FjbN|Iv1w6A zXE!t?7Nom{goUAMjWlaBN=QnA+T}1u1b!l;{7paw#hT#VyP~qPP0(E8C#$ZH7C(7= z3xVocJx7Wm9t~>jdzTgH8qG3oR{Mh)mgJNaQ!Hm@JR>u+pz-l}CT>{ak9kV^tVw-+ zeIG#|1qb7|K8$7=PW^nifk#ke!nV?xu&a2%;&9abVE>by{9Cc=@~Wz;1^|6#o1H6K z*132V=XM=IQALFN;V+WaAf72-(51(mIc^q35e$yg%k9DOaDBXlfJkX7vBqL$2g^Rf zY$OSG7VeYitb=b4z*BuC6N@8^wd1?>#hu(D|eUdbJNJ$MRx)G8dVZ44uo$cetVa8#kg&ZYq+?N6+NpfnBET6ZvJ zeQGofHfnu}r?6(y>qpYSXeT1DeD3gR{;1=q`2C;dHG><1PR4*s&?nzTyYpoJeSwerb}B_}4XZ1l%gc}I_O zx!a^9MuK;~oeg{d&#$baLSbrbz0eR{Sy`zO*RXr(_JT%SU3t)Sq%JQnPtOLKMqRji zx6kcBmM#HOFyE$zB@PgJPft&&PIG*6GQowLfFH^4tm0Smi_J89%_5pJk_C(5!`lT} z4vFVo#3Az_2k!3NG{gXazIpV5gNNTeILHN5;OWWhZ*MQyK#)806?aqqS`q=&N$_eg+&?{`}yRBG$9yBJthvhdDi%MUZAeA10LFDi9S@S za-wv6ToJUXjoa~^ox%fBjPuRUB~ze}fdtenQ(dy1+`p`;uV<2K0mWs#H`3weWECtZ z>$4s+9w?-l+1Y-eqeMkV`%*|J4x3yZ&P&?ZFqM^+O)`>!{xe@^6)T>b=)=y>FKcQ_ z{Sx!*Yc^iqkoiM^=m*|K#a2WD76u3xq@cc@YdnD}OT`pVF@!8bS4%9PF-bUqf2CdP$K6{zJ&F57e-{FAHauvRh5{0$bQBdk(*@kQ9nI{# zGWgfcvGei{oUZrsIPQ#v^}y9?4(H3I zxa?#F(tP+JiUwPw$v}KR)4OwUU<9!A>;da=0w60OLPH?WD^cH8m5}^UP{Ce9{Mo?D z>$`}Xm=FZ3$W%0szb|icRvY;?L{#)m>}|H%7cwLQ?I#Pz@JH_km^aE@txD=vbbm9) z#w+UAm6jT*I_To|s9#o-^w#D~XxUD82T!rF(CEO1 z(SeQhnv#-o!Fk!UN+D!$)8P5(F)TcMm^)sI!f$dn_0*Gxnfc?VPj8Of?iok<&yi6V zYTwjq%9UdXejjy`Z{?J-xc{!(GBF%ic@q#$g7AWg9Jb{(#LjL#0P{GR*0LF&nc-eP zZ7MAdYjwY_vRjuJGO13*pMpSoQ*7EA%_yx|(2JN4&;9>cYq$M!Ni#U=u5vhPz1HQy zq{TuSpPU590wxfJNYg%lteQv^3g8?wGqaUWc;bz5N#eM-o^Ozlzz*ls*EswMldl8aa0JpZ>RMlVM6Vabmy51%Zoqq|JJC$xEFUt>^_|EPkbvk? z!upIAM;1B=vn&-X#kNxNPEZnjtJCrBQoc9~+o}^KSqK@x!X1GUzinDh|N2F~1JN;9 zZ2JChYAQ>q2()HB(ASYsQ76a8?dB21OiZZwoDN9%__UUyZOqLzYIL|WMtjHAyoZ(F z(e?KYilR|?d=uz}A<%987dY&6e$>!!6vI|Y()95NWN8oX*NwfYl4{;(a7#WJ zludvFaY6$CI3LLnYNyeqjxnQ9eujE&oZ|jD5iP4sFo~AAp^gEB`A}mX2UNJy>qfn3zxk9Py__jxd(^w{PDX9Cs&vy~s#e zRaHtyy!c1~JBNpxc?r5rd9=s&BBV%Icsb#kSbiN``ybF>`!WWm=+{Rcr!|lKcGu_f zW)C5gVNDk=pzC?J)3s@lH+pI_BS4LF(E@51t|C@{fB!0G#tp2{O(!bOgNGl9Uah8a z2Com-lFN_s@^T*IYHB~wC6SPjHii+J7e{8RO@ZL^Z+e;x;T33%Wm@%AvQmDi+hc5$ z(`ARX5Zx|I&T2qKK+i!6@B_ON5*ms*4f_G#BmWFvQ0W2+E-%{o4&{8kM5qhXaUHp| zwCWLLk^9v_rzPj$o|T2ghw$+5YK&+D0JuR?b9>w{M+)B2ptV*y16;1GJQ;!;j zsfQLPlFhv+Hl?GrqjJB~GA+_P+>e^f8$-0_m#v8PIrEN1R5;qh!1GeES#KmE48z$wuuQ}z3@w>LZ-fj#|K)?bO5XiVxwpCRX>siM*n-MgOD@lR zP+~yiZCseLuAc-&#{!-9FW}|{3K{X$cmT@)#SLg4;^;B-a}1zbAMr@^?kv;a@Tk#c zlbk&-U2dCU6Fk*zF|Y3>nYQ_JSl0fZS%7kiv-9)W8uQo|8qk&j`gao#kz$De-$itH z`J!J{Ju8;3ABKarQ3WvL?cL0wlYAO)Etwca9!*r9a%|C;(}Q><65hJ&<`yxslQc{Q zZkRVIR(Yx$Jo z5$YLE;Tptw{YH+S_Eol_lY)YR5+ofI?_a-u^{sELtdLMEq<0%suGn%jC&>cMq`0Ic z7H8cE2xlO;FA@ewaaduJ4<9})ZRkXJ)a|kH>t5lR#DVW5`nvhG{2_>C`G6y0)5qn$ zp5n$oTS{C!pv5IL>BC4b6LKt870p{ffc&w)LN073#%QpPf~s#rRYj`Z=s;LAc55k@vX$xoyE%sYs>D zbo4!7E%_XlSg^ipYX*Q62+r!wA38aJHeRmNT$gzo^2+GjmyMl&5A}-{<1`e!TICa~ zNMoz;-eM%=jy(dvJa&xJF;l7(4jqK3FO_dYcC2@e>4NVT7_=- zhopLSdSxdyO!4TjFk~Pz`Rw3LEH95nlS|?-Ob2|V3;_>UI?8$uah^H>5f)iRAh#xl zVI*Gmsz|bFg|w`Y#mEd~(``5Z+ju6=&g{V@%=O&hbIuKd{cO~?%~a>{12H_qyHFs^ zn}U*x!B`{<4G78F?OsH}Xv}!X{HNWR$|I5(!y6INf*DM^o4ugypJ@+npR<6T{Pim_ zXNufaV|ZMB4?kzD95}-{IXP!0h2v&`15)r5H=f=WFK-&=5%-j`o|f#lZ%L|oR~d*? zNclzmN=f;4Su+sAUY+zG{&QUH`y93~tIBUy{N;R(>)4 zIo#jw3IzkR7(<)w9)}UyHA%8mrK%;V;p^wOpm4Vq-LK1#qam!Ex@5pJAH~GS zOX%vR^B0`EwO(9Y47npq6e|6uWD4KDD&78&qKb(mX?yePf>+>SoDcUV)|m-I z*PlW;z|6#I=~jJvT{lMQ!|Pg3>%y)W3Ehr0IZv-Z*k8N zh?LH+yxPCMf5t-U`DNG_{>qN5HwwII6ZT(BpH4v1!{gFhkF2_1pDFyf@Yb3Zd(=?V zw?`xB(|yPh-KMp?!zlI;16s8S9(b4ZuCvpG#6!eZukRb(F6nwBhyW}H8VV2xY_yXg zG6kSPWP|tOSJh2VtCH}V=z@co@S*9pK&hy(s7M1Njt{KzBMHeHX`}#yxuJ)=f#WaU z@sc6LWIC~bndZHE&LLj?QKp*}l{k+hboBIL%7O0g?wiDy9zkMcfM4|%bpri$P-(n{ zh_2_^=6276TkPAwq84`cLl>V6B@GYSiiN*V~%jXwz)uFDTH zElGwhp>sSYc(>q}zAZ2OphxzO3d6l)(QfDRu3@J_AwP28TYs*pYnM`*(zmRmH20tv4r@UBh1ZvBX!CwT)Bzmv)y&*7bb) zl(d{F3?r%9Ipg%|R-Waj(twD(7@pfR&$>|#3+85&Z`)g*-D$*Ldw+SRLYW${j$$DK z;$Lh(#q;6$t*VEHR#<;owc%lvjaUU_aFZZvhQ)~G#w9QASV+CMm+ov6B99Vwp7&^a z+x$1+vc4I;mMo#k54ULeIru?S`M3blU$s24*RrsxbgS{ud*Js-ze5Tt1sJrcCIKvL zad8-k$c(1-0D}&sk*cu*A(|_$_VVg#?b1!B2aA71zmV0AoTwqGsl zVctdeFGdXbKF_C5U&zD|Wc6pVKGSRjdNbpto~>3W6|EsVE?PVP`AgBf_#Q&1U8KS| z$!H~Kh7pc#waxt6m^aY-TGg& z$lhxDEsoJr1_KLSf^X6yl;Z8{d^%kZ_fxultISWYkI>x63B=LA@GOgCaQOdW9J%y> z^U<5BEVQFH78CwRSrmju;sPHjJs1Zpjw0oPnFc%Z+S*#PTFs;OXD) zRXHJ9SvcG>b2ULkO(u-N8so^Tvyk1je@S)F`wkgy{o7%!=3!MyWefJ#QU>Esy1Yn= zdfW)>q(KXx;m5|uJNb@Vehiz4Vu=G!JW}9FJ%&u4o{lzGi;eEsXZr6d&5`Y1#&1=6EP9SAG85 z&B=Rdr|XQKOpq?}AFJmNl_TCNhm(GKyz_9gLT@g`$NM6q64Un%0`F3n6^vVcv4RYH z%4qK_l4g$`$KxF?!is?q?oj#s3AQWZpEg}j2pLAOUj4i)s2IQJ4?%@Pdh-VOWA4lZ z;r%E!!f3F*zyJgl+ozCZ83J*hG%*BPe~NaGU_xA6Pw|(M7)_b@w6t)*inn9lM^ckc z$-L<=_>jKU|0PmVJQo1FTZ{IVb+H#JK$_nWCVv4yy7L4>fFa*Ak4&&tE{{H&OYL}e`cd&tj zH9?Vm#M%7TS{A@(}`Yq|ChDgb#TP_8)g7HBU>$56Ph2Z&_(AG6CXwZ>4;u2K#+ z<`?vF2n37#1JiDZ0bo?w;7u?|uwu01!s|hbG=Xv1Hc5lEowN>M?yPa*!NbAjTfVnl z$E*5PF^X&P>Gs&U%($5YrdDJvFJAX)<3wE7V&8OVzn7>*olxFB)L#3r7I7-p6fOQdHI$2NASf#zoUU!tn0os-r?dwGgpDE8zA&7m z&$p_@9W!_6G?KIpc*}(XRWHjDSf2q$ozl$(@JWbLIHb;OvG>Ln*SGt|r!}!I5vATk3smX0DC3 zkwQZD!9UWvE}C1o3;Oo7k&*WZWZ0e%YRTYjG7|t*?824hm`g+o&!y5zk*=?fZ09{k z1tX3<{J;k%)?FX!OE20Zzo zh%!(Wr7h&Y0J@>0leQ2=i4i=uxY$b3Y>$M%U%MwQsC>)rmY1%^tGnLIAY?q#?D24i zF`VsAA(y_wn8 zlDE*|g_{5MMBPtsgW>`7wjN`OS^zBZzxF25AAzv>n`Zy)TID9CjgIXGvj@4mPS9uw z;dxG{m_fot+wGROaQb8qdW(t=6BC&5IHCRR^8pQ#@vo2qUV);kp@9#!4FnUVdX_%& zEdv9CcC(Y!Kv?d(icuw2gU7x6shv0sN)w`Q(rX37I*vRG7d)-pF#VUe%*7V8GWQq+ zdDse>u~*UUo$nghnxIGENk9FlDG2jf?5b@S`gLHdG!z{jjed2!JUXc$6h3R24-8JA zX{_6FgSv<)l%ZMn;;!1I8JUWbpk)>m1Oks9-&+Dp9BBAJR)or)J$x}2uH;)+-y_4} z6B6dOw`TzO1qG-%4I^WIZSD6?agegW+{i5`h)qfP1o}u^T%3JAa4pt>iuh@S{4*(y zOU*_7&BPp2CK`6j_$`%C!v)jKgL9pljZ#4FZj-}MU_V!fy#=ug`Ad^q&y~&15g=z< z8b5Pu)o!#80COxr6w?Jf8K{~oLrHAa1ex)#2*gQycEA25Cd~4@Xl{5&cp3M|9jGFR z%gyc8>!N1x#BA=7_z&9v&*LBnbg7e;;|hRO0N<0+&`5fSg2y8uSUZ@lM&z1V(jWe~ zIYKR2vHItC8t5-$+b!R%nl#I{UNpm(L!BrHT>ZEYYWbRd!XMgy{@uj~R3xWzx zK2neWok(`ZPT5E4^KU9E4ltgaD2e#yg93jNE!T)zd?xUeq~< z`9Gl6Q(Hh7m4nMF(Hl(azIT>nbB*-obS zj@yGxedfDkayKh64ir|}#V*R3N5@`z4eqgEZg9W&@_89g`>Fuy`}Sz!wNLcZ{s+xxi?DnrMu znFlmpI}$o=I?X;0c^VIf(mD+D)w@#ezj_9@=VtSjK}1Y>`91L3z_zKiISUWc&n|pq zj*FS^SN8Gr$?Zd`Mc<5bO3B#e=v{>%X)=^8=R<`9Q_DT&gJs9y6&agqY0}uajl0Pe zCPRPV!vXfV2d>iY!LSMx)jIXATp(jF{A>y6Hty8OVS^xR1s1+K-F`OxNp!C)eox}-0Z+N-IhDr37<(pn5w`rqC>I=M^|8uNiWq`UU@m}-C(h=-Mv}V4vq~Ufg;w66D zT;`gCZ*~RA!3Ug?Fe;fBcoSkQgpNJLarhFJLy`!|Q*m0R&3Y#m^YW4}?`oFhS$i|1 zy$+1vYJPauVt0cEr^=+hrnGQPIm~#iXJ|l7){UxGHllc9H)+;IVK|vIJ$5 z^wu{)YO`L_|Iqm=io$Kaht;%;2TXHM?eZ6QL?4KICf^5IIYILEYf;%Kss-q#Ta3#; zSq?LUHwE+;wv8Sjm(Vt(RGzsI)UZ?v0L4uU4y9!~baV=r%$AjSHY{PjD;n=2bt1}(IEPPN+) zFJ3Jfu!xp0b%KkKNa;_9Ch$SM!F}o}JoC`soTmOcO>{80VO{Cy9un5u(onv_a6t?Y zQ@pW=*&pVa3&G9zK{IJ}9L+QdMaz*Wvo8iVOw01tBHQvU8-MqpVw>S(`lsDCrQS~h z$4MgBbF}B0t@?dZ7KO;xE`~C}9ArqeyT9)_klKc2NmwL}(HEijEm04L;TlGz7+|KW zV2C=_)UA{HmrFbL@CyApjb~*RS0G&BiF@fz-uU6#m8518yDX=K?Vg=`ixt)#E+8{WWae`-COC_s~7a{il@VZ%Lh<2n&Y{e=|2q@CmYVr z&OLIqKo0Jaqi$t$y~qWO5(AwHnSdrx+;VGCZX0WXNgxu&J3CeO35)x?6bD*Jv)`Faz{O4kOICl2|h%#cA zXZucvN7%uwwR*#LYqN4PG9B?RZ8VO1W<$Uut*g@^MIn&JVB>>G)$i$Z_jWKKwY8;K z%t*qZpdiPkQrN$6GJikaZtkC$m_X^oQ6yj>Tt1m;H!Y9*I)x1 zr%&CG2-*0V$jZEp;*ok<8zgllY~)(OH_nT5N0ytS!M_??NkXN_0TcXFGmplufdPxn z%3(l=p#-b%<Kv-OXfQZL58hw z@kT~QfKhl;WEV2Lo>x?a71tHmZfvyF5eeVKX=|qLL3%6au3yNFKKzKFuawD?!c;_- zpf5ExHljD#%#7mGr{i2?0nqLDwXzNZU54Dd*ScUY$sEMoD%^ zprZ3jKn(sbQ(KnqRb(S?n@SxDA@XgB?B%26#tC1{2-|)N{J}Y;r!mc!>=YZ;)B%k4PWVte0&@;|M`$0OiFmh+sUoY)Oc(x&iv#C zrV9x=93kq{hYrBB>XI&RI8D6MYE51UPa_uz{wVx#l0ILK7d8!?|9g9TXhs9jE1(WB zF)_)h6cslPpH;6|SA_j)h4yao%fMgYF$4t#mu_1tDJgBv)<4Y<9~~LV8eTVJGLtxX zFfcRIgUi!k-+lCc)CvgRGN5ue?65#MxcBH$lj+#TTVQDHMtn%@2D(GDHO`LTU#4t+ zO5_aZMtC&pA9wQU93XG_)3wct`84}ZnlgdvtSU87EVcPH`{P1jKJwL46HOY7tUr^5X~vbRVuv3P5U@<3gdl92gx9>NQhv7n%uzA{eTMC2M@3j=}H( z74|Omlib0dN2e{dPr*VMwZ;yI96cdPJyH zx8e|D=X#j|?bpno#J(Uf)^9g;!`dn;D*9^3`w0jJpguug)#H=5zZIDi<2=jl)#9gF znCC%<&7czhFmNhsNv_4^%WVTX;qnHWM7L{D3E50nms^dZAtdO$6B9{cNhmyjP6-r0 z=pmqy3|dveJq)kA|Kj}A+-2LgSAnrVE0#Z&s_6=>V=58n)5DGhd-BYFp~5b0I{dHO zN4fC6TMSCISxgrT0I3HizCel&|J{+pu!~!+nl8A1o#}+J>YUfW$p&H0oRK|2{=oCR z#O-YoJFrh0h05sKzE0^cs0_lM2Wt^OHn01=Y4{Xc6+O1@jEj1xYdTc%s5@db>m>w# zOlZW*UTm)#t`6;N)e=-P>-HUHha8CA-cE*xYW?gbyV>hL8PBxqR9n8ZT3<3s>N$1} zrtgZ_GfghQ_B}n?E-WevftnbsF;Kfq?d@Yg=j5uZ8YqQshmMEmPNWQDb2Y%RKnaPh znuO)ZK|ce&8ZPrDm6&@Bv`)E$7XK3}oR0TiQr(tSFKbrLerYgx-OJ|O_bcUIzEs}b ziZ$D)+rf+<+vveDt7WygmkFW1JMeM+KDD_QIT}+>{a<2x>{^^Pfm9*PJsrG-Ly~S!jWj% z)_xQ!8E?VbAb&b-j;+i&>)0Wh02-R0?F{$>R}H}l8!l7p9L;n9FTA+x4)PaN z8r635%D}xu^p`&nij;l2YI5Hq8B4Z%(zsquF!fLMCDrZDGz<##E29RAS-Y5ti_1p2 z^9w=cWW=CFeCLbid2#dTVsiLQgY4ntZq4D-;`@RPY-VqfmOn4P%?9ETc2-Q2d!6o8 zq>q zgNgsg0we}^@416k#}}SaGj-GB{NyW&B=*XXv#1?@EX99a-}GeX^g~$`wM-a>nYDEU z^o#cd1i;AwkOT$N>+Hx+)At%rpMu*W^Nq`R3~<}5jc9xqbUki)TJ5_%#ulj!P-}O6!w8SmgtCpsw2;~`oNRkH;i>^@HIygAY;N6E4-o|Rq zlr~Z-wYg);`ALJ&cTLv7q7dS!H(WPf%X{R#E6ZwYYfDC@XJpU_T|ICY6Q+uK zK-*tZDx3dZQObg?fc}Naf(A)6A)i8n_JCABk8))mRe0Q+@r_81I~v8K%PT8P_j1~n zj!r$`NCUVJmZOxKDNsgGILx} z+-^Kw>eb{je=!B*If&-WPN>CILggy+CJghL8&Ue>bmlVL5Mdw=Zv$%|$ZQ7N8cG2B zAo>DLa(BV=g8#raLjelEI|>mmxX05jln#me`udo~#eF5lgFs0I9EkmA>K78 zONO_yZU#t9PN<_0bz447`S#^o^7o9`f8p_wVCJ{IwZ>h*68^?ZrRRPp)sXjlaaof* zK&j{~m6;iurT~gGNim5$z>`bot@p&tHow5`hG}r6wOSa?R$rOy2C2gE|A3yT+JtqrusBOV%VS$xZZhtk`8E-LevQ86YY@&d zG&S8~uC41}fxY=|NB=9CV#HPRFyfll70348009c6A?7h$X&^X2^1&tJR)q_m4ht@L zxV7%m(l)(8UtwOfy&SqtQg;6UeKA3=1vXC3yxd$9wbaMhSYkSd!oI5e(%)ivgHPvHcvLP& zbJBg8KCKPC>Pfp_-~|BgB$44GP+_!7bxD%2M+OJ){b_3h+<_qua9hQKz<6EQi4iin zoQUJ|3pP8P0QHtFf5nWF&xAMLl1fPVul<~yp6&(&5a1;ER=_x!7G9X$+ZXkc*Zp-D>JTp}jh-5-VTTyPefNT^+$P`~vB7o2uFtlC-IIp0ffbRdfT@9ux_ z=D@@Ry1K!?0l6plpME!OlV|sLe_Vt2uG_)R z5YI_ba4f*ecCu|0O>PNIvOm_iAZH`Jnc6F3V36q*-4>W9b_P7*#s&xP7+;b3re$eFfE6C#!6vFt?`?W9 zGBNaCEq)YCXmT}Ri{Rs==#>G|XWxB4CuU9eOF3PZ-ia~R8J?Y0f?BAxb?~(}K#JBA zpXiNTIdHqs1ZPLj*4Ea8@JCR8001lWQMc&B2dkFxKRf9N?3R;% z%rAt$dUWUO^VysKiaRcwidGG2}#{UWw+VF4y zI={#dq|U`vT>rASEF7|*2zxdIh;*&)+%I1vgTK2sezv{dW)MB4ug<<78%U%e}d7mDFI}TwN@MS;_ zY6D}UfUB1RdO&a{KraF8UX?uoz6hG;W2-0E%Dbz|AvM*JewJ4kt}MG4X=(1?YnI#G zY#`V%`d?6mkAL;4B)A^ZMn>6s&$suFL7Yt450o$aAW2VQfBYOf5H&Ah%9NvF@xHpG zgXgV9C1>g3dY7rOvH#qhzQ+?Bmxz z&B}D2d3COHq^H+CcmK4*4L$twIJI5-d8VC(|HsS>IdxMu(r^eVIzf*CwK6;%phc^# zCmm1kFegJX0=c3FvwE-NJtdt@ekQ8hPA3PJfYL7?+k;;W(wc;H6$H-)hKCvLB0m0? z&HE-@sf)I;-3u1oVx&T!it4Z0^Y&{2W?AZTi)U5F)gF+0%MQ zJVJ8!veIpS!9mOIqI2HOlh#sG#zm8}tJ=Db?CU#YUh3i3c&2{ND5fsk-)6q4y=Ik2 zLCR}^#By&2%F8VU$s_POCdl0sDn?)P@TbiA_+sIa+WvM!q>t}!R>lfAtu9G8xojV$ z?LYi55&WT~WHWv^FEuq4PM}b4i%nP2{a?M5T9x;qiE8kG-^cm$_!7?wC~hd5189;m z4VQmSPQu6uc2BX-$^+JUCKv${`mg`ohtOK66oaX`xk=@uDfPJ~N8G@Np)2;sx8bKE zBdm3pMH3|3djjuD<+F|^D(4IxY>7Ma4O%!4utsPXr^ndjXE$dr_+#K2OCP{x0^OVI z)caAm9IYoSUaG2@wTA(nLVU|puW9uAQ?fofowAkptu7<=GUIPNKZAK~VQqcm1lJYP zT_w-TuL0Yavt%hik;tjTXMuEr1a?tDfvB~CbXiw+`6_b8Z-{_aR=Cbu19SeJn~-R+)bA z;5y~o&(()KLJ5das6zW5tfm%*E8x*a_$v+`V1VmX;_FWyCD0tB>sr|ADDYlm zC477?KJ~G6HpzC*1xFq0i4m`^@7W9Y zK(y1O?mh)xI2jMfujVuQPG6JE=UXE>D}(+^amV`wIUfzxed5{2pNiG3wF3pVy%q zGtO0mX41F|#RNI)TN}*E5a+0z6kdwpfA+~xV)GON;ddVWGgNgN=drS|KzrTV)bqI4hhj}- zp5M#($Kc|dtaCCi@ymziu4+&ZnMZs1%ff2b}cRo~-=*mjf<_fEuykb_3&rF4w{?!OW8mCoQ*M_(s3|&qT=TSRKh-iR$_M`m8~9 z?5pn%8iXquR66l_&wW7mLD43e>BWr54B(*E?J zv^2lC_|=GLrY&4m1MC^e{N_=o^XX{u04P{i;;{Sp{e68j<44;~i#$#?7h2?+p86lW zg2WRpNZc$IpFdIrsmYr1ga;FyZjh9`1_@+Hu1J%;2>c(q2~-B8CxJ}_cX1-?%z-7=B~d55c{v* zRFnE9Jb_;{-|v0uPL%pHUk3Ed6}EbJ(k0Z>G#9ypo~Y;rWpcTMUbXLL8SN`~7r z51)3=DLR4L2e}G<$cNQV)|F1zr+3V;tVG>AMiQpvUEJ?`DefB}N9UEoq9_iO9@OR% z8iC^_I<1xcj}*Xc@_TGJU@>eT*t$UUNF`hKljmP6Fb%;dl*(0uQf{)z`?YoH#X1ae zr~qvoz9)pPw>VWzBP(GZ+j7UOkZ0s4=X&VF+Q#rI4pho#UrmODm zD_?!*C-WXBh{3f{z`l|1Q?5z_c;#OI7J{KKGU6o%A|}oIa1weo8lmvlk3m~OgLM~Y z$K^DyfU=)~WG!rOh&Q_oIfW<{%Dh+I`RecGNEA`~L~U%mMtvdNxN>sGv#~I(o#xKx z4+1#qKK{z-NRN%?fmLyYTOP9O!#yZ+?J-Z*u)UfBb+Wax%kPHXkh~$H{0RSHIwayd zF~<|+nanf21;NiY84BjrhYs}7$r>XJX@Cd2^2t2^=->dRK$xt~0eBI8czCF0bK<}b zlzG4j8MTNrtDuIH030mqzkf@XjdwCzK@uLUq>j?7hhM*1Xls)qkx24en6S2FA?5=A zn4IX&a~@OR#*xM3sF>M622Q9!p{AMA+;F-642O>db!Du~Kn1cku#kY91ic*2e5Yrh zEePOl1Vvoba3hpj0M9>tF9Kzc)eAp(I-Qps;w;p8wREl z^z5g>sk55#Ehfd4SQfmBpPJbXwEQz+mQ>y`?-GE&?QwzRfJ z*O%pk4yEcX4<@^2_(W453rm(=j#S=eMn|#W4o9%CnAA+aOs)P9e~XogaUmpFwaw*( z1&bv=o*1!C7%H#kS+(nJ#98y0?lIi`n+14=E&dqLj6OO)&_K5+fBsM(+D7?3eiIcH zMMU}*{n)Flw5&;$>F^C9N66CXArdQxkkrs1vTHsU6qugOhZBMsU zvF45)Elok|>%~V7ju53YhtCDehLDIzjXeR@Cw%E6fWIV^l;Enz1K}MSCpf_Wvz1M( zdwulvX+Wwd|K=t@(Z1q{Ucirzm*WV`IpojXoPTrv(4{5pp6UqI&1O(Dq34u#uv+G^ z?Z|~k2)faC7!DB8Whx1GSCwwv!dpsEEAB&p5B;LX#@>xB=+AH#a1 zV8hP;}dwSFLb;%p?9hyI2(?W5Zro8%TF4u1 z8y`;$VguaD@BlzYmYwmnWJRmzNF+9(zhEny^`#+gZEZ`))}H;-?i$xg_r6LR8C3Wq zb7AF!i}Nu{C+CPe%X9j!b?3bv{(k#un;OVmQgO7sQ)C90n3bKKV#op0rwhs#05rr- z)^g$6xU=5DLm0ZV+X?f_f@)8G7Xz{%md@!SLJhLQlSkQb@`6mCtr`NadhFwi?!rtT zitcg-{?O-U=0ssq6T?%jxvz`gI?sgeK+sPOCO@e`$8TQHZ$Ap1_TBOc%(w; z$YbD0i=71i<@IJ&&LAsVjD>=1Y~P{?%mx^EVmz254J8D~K%bZpJ8f<>Sw_>$dip%E z!mlD%j!q}5UXg*cUi|S3PIxRhdp9~E;GwrIe zxL50L-NKE3-V+UsBaG{DD>+*Fy0-Hbs~oBosL@(Qetoqq-R;=;3o=f|gxu#ALqjNH z04PX1=xB$>4v)Y{Fcp2)03RPn=VA50w*mEY~c^0xeir?)6f<}3V0oKQS~bJwank&9Emf&9O@ zBVR29_}sSiz#;>431-lgq@IJ!1obC65U+Ci6In0m}<+Rha`CiOVZX=s&d-DTL|m3khw|F($lqm6Uq3wD09s!5M(A$TkQ7&;rBm z?zp77tn5wMXc{JvUjqYgfSUmWkqUBhj5Qzf+&mzQyX2V!BRgZpT5z#hE0mWG|D~W`mIPGvLl6L$HVg%otb^sy?o1DoZ6H0zXHe8Zhzm$AKSl z7Y8YiC>SH{+%?QnCBTyosq~bbA%EBYZ>RN+)8+Y5XMsKK>0R>T{s75rLs)iDM+*tM ze1S|7I>tUWCJ2cwXXl-7xI8;B1?5hFM6@KmQEw)4e6ZE)e0#&;WN};4BWnk8Yu~k= zzJQ-WylPeDDYyFk-&q=vx9E`xa1^3py8zD@cu9d2F(FdHzAY>fZw_?md07*uGvpv{ z4|z;XC{Oj=W?dk3+Wv_4$$7-BvrE5A%B_%pQjMiBteC0KRr^ zQ&R>{QP+o z`Akta+mi46s#j>cnVf;5f}6&KFIn}yCW4uH(O$Tytc>>1a8*^BfdD;524wY5x}|Ul z0m0dx{UliCh1`i**Eo#QmF&qRi5=4_D;ySjAgJ|@)07J#ae4CyqMeJ7q%`SEd(e|A z1huGNuUV^w02Bx&k#>x+Sl}2%cRqoK40S?$LIO-Bh*DFDv$nHag+FPGu1;50%B?5) z0OXZZQi7yu&Y*>{26jLT9TX?w(kQ^fqSkKaAKBNkAENY@jl`UL}T#100Ypkp_{Tf{*if6#(z zn0n?G=5;v9PP0sGr#@S%woWeK1h)zZ2z&zT=;N0?95b)6!s;qhCX_4DzeT5GRj^-R zZvbBSZe&C=k;i~$V8KLo&Vgkk%U$gDI)IECN4> z<)1ePv8dj|yp&upMN|=%_69chwzv4|aJZ$_uIwLAz`+Ovhe=1oUC!s#5l|Y#r30`c z%wd^`RE8N}Fgok#6w<69I0E$q5sE?p^WhRP;!01KgKh_UD^yGj{`06Bi$Mk$0HQK^ z)cVJ@(q%&%J%33^9f z$(et9%=uA)gYNco4@-UsZv={0rpGGGd2_G`tDS{QF~AfEO2Bx5lK{OI0lDq!1IrJ8 z7RMlH0KKEVFclOxch(=k4RuHSEavdgm6S_Y3N|K`oZ!FS^NxmV8L6TY{o=`O&R3M( zFa57~Ph$!;19lB#<21Cj1#N>6YX(Cvbac>1CX|P;rqLIzhsSZqsknFUa|bjVaVA=9+}E5D+PPbrDMS`YLu?ieGf1`gg;z9?V^zMadWrpBJS~|({li|Zoi!b$;TrSAp`(1E9NyhNp^zhA78c;FS z@0cGfLOqx{!z(v6P2*JNUXTrMmUtZ&&C)j?UYwg6Fi#egmn~fFaQJnc#VKb}uJEL! zt@VD0d_KizjbD$Atcx*+0^RoyV&xrBuSP1 z7L^tJLaHIPv8jbAO^PpVF<<{;Xa$+h^K;VdwbkazYX1GMW?!bh)?TXfKV~_`)ys4! zgi+13Nx(*Hvb0wTOq>Hj4DOtVTjuCf@lO*u)(!L^f#Qv2g&1`W4K{9W%oALFC}>P7 zr0zpa3Dao^2?^g^Tp*u3_=rHFp%rN6rsb><+XM&ADsb3oYI;5Tln@hxHsm(F{`~cX z2C;peYT68VE?`fhCYD3N0t2!z>NUC<@bU5Cv;)8!iov_P8zNMFU(l(*rV4SYMxtUZ6jI?AA}v zc3b|G4+_-HHhk`Vv!CiCrKS{xd+7pq7kN0rKcc&}?vxy@=Wf!u^lDNROi1-C4Xa(` zBmW<~i+`vx$}ett4O%1`q|37s`>Wy`2!DIB{ipM;@Uic|T@l}ik;n9pGLjOpatq^$ zEfOel+)w+JzQshY4t;j7#l#Mh%sqi$lNOzFw(|MXa79u=a*%a?*6|Iuo#9a83&cpg z=^05--laA2`NNzL0ls_ z!^yT9hm9Ocigoiw+x=xZuh(;pC5q4A%DnHO+#|$Ss>U$-p_cV?Zqm)EH3CA<_r+cx zcx05h$7Z~l7&Q@73hQ$OK@1{_5Xc7!3dH^jfJW*}(i4%T--@)$OS1#;NS4NTefTuk zIE#p7rt~N+TuS3a`|=9ZijZSWL-|hos~DnKb?5OHoA>KXu$Ne8i@?$Tp@ zn^5N%nYq7l+m_=CMx=TxE(y=>L9Dqnf#o&Dl)K3P0UjYM-AQrp-hGEz4T{i5-n>nf zRbEa2_pqZQAA3R=G)+I6yp~X6q8xm2?#)f1v7#OE`07$? zyaxm>(!2LVGf?aNip6J2YJ8a)|Dc&QlEyDjUv$qH79eW=z?4sot%SJXqIqKc+&i|-IxqI$ z$xQvbbl!mG#Kx~3C#44%(RSn|0#*YP5w)*Gu$`k`EE!AScVsHRU+TC!zMrq-c5TOT zRQE#nP)IC$_tkA~FI#nD6ne_Z1k8K`mF9nHyz%TV%=rS?B~s@9&qF~~#W?HuP!v09 zAO|ehb}`oXLK%ia^K@(x628nfAII07?GoXgYn%2iT`W#ptiAfR@L_dOPsCtL?wfEo z-$q?M;^rGwgk-74*&r27=(qUGVD;=I(eIzLM~Vl{nSZ|D{`Q>5lN5_lXxMD=(D>#g z>GfXkM;EVTAGF8?eqpnxiARvgC|!-Uh{?4Przec;pA}k~9bcVmf3V(t?*pDd-E#+w z)8!}x);Ds#4-tClHE(&yd_&~~zMZ6uyKnwn`q#cUip_6{g9LE`{F;3jspK^IGD%HU z74VLSw#A-F-At#h@s={wp(1$G6e1IItko1^cR@>yWXJX`N`CCVN%>2O#jGmy?ikf? z=k$O56^swOH6K=MZ9V%YJX9RNtP|<%asABFAacfmnW@s28|(TKNFW? zMr$Ph$E=3JF!L|-e)~8pQ3yrH%DA2x0giC%a6iw&;AZL%`8ltxdJt+Hao-g@L+sn0 zyzKN{+}n#=bwkuM&;_K(B%=hcM|#o@@adhx)3nH;;K ze9OkCe)}>c3=f-mB##Yo6{a^GZq0@RvIx{31}-Ut!(d{m94ZjH_0rNmfuhYy@!^gd z$?2xQ&QDzDO02R+8D&s`yZ47v`g<{+UOQ*J_@!g{PxREDn$)|lfIV2Jze@Tp=+0+< z47pyuXq~6g`j<9bqY`lv9cP*z3D4(|?X*H&eOPjcB#PJ33B{%NG#>eJR8FZZ)m&kt zP>}%pG5z|dwOqFPt5FOu+nu|50RjoQL3@&?&5^2s*_88h=qsEQOpT$w&|imn`fo>-(Gi= zC1OtYU?cs=`8|tnQ0k=$?W<@3hgv7A-ZoA49t4FpK9`7To+m05+de(LZ#zVpf2oDQQMuaSCklJUxq zyLXA1Q;OEMOlAiQ*o25QauwTcn^FvGlbBa49XpdhYnzuzl@0BxuTYkh&dDWRE?@6^ zJA>$vc0FOAUY}BX=*Na3L4Lcq<3~bW60L^R)DNDcv*?-f8&dR^J)BB4MnbrUfY6+p8s>wb-84*5j5QOrrOTZ3$1V7#aL zSGr>-0rTTTo&E}EN*fw++7N2`AYnn#@;6NH_lsP|Ds#02@JQd5A=09tUai^DIqsQ-=C<%2O)9#^_s* z;`i0Gh?SAU`+H5R8iZt`SR#$i-kMBq0!CD(@0@#()dRnF%M0%}owO=3;~*8n*405l zg1ahICcsfPWhm-UdtYr0f9zQ2#+MoA?GLe{C|+#%Q=bZc?yp!=vZqc8VT8+F5pltM z|EnAOt*E6-BZFHSQaV@F>1Cf)lfVY1CJsqI&5LMJ=aUw_?wMO9Ov&!Qzt|^)=?D1Z z+d0cq3z5uxZLHkxpgr7oJvX~}4(}ie-oX&V>uaQuVb}jOHt5aCm1=Ol5+w<@#in@4 zr#%12OQQVYx!lS-J~m~}ysp_FO?~Rl$=aJ_WJGJu!wo*oGrNHfs_!foH%m-^r|Hj? z64iG{#7pwUr2kWS9DlOa87d{c>szw&oQhayzi8vtqUsUM4G~m-+S@k1nD@7|)v=Rk zQO^OD{0jFpTrMG#%RDuVKQ_y^P%zxKeC8fAQ@VP0e$;+#*+0@Nf$>Rp|ZoR>?H~w@1ZDdWjA< zg(R$ZPmDXftD$@pBO1jU+EbBSXJkgoPpG8%w^qmPv*i!c*ekbE?&j%yWFp_nALmGX zb2~vI-`r(Pev79m(q5qFREc)K{<_Lf+)N+C$J?K>`xW24iHFtI=G|`a>oDheh)iyS zZlmA)=4m>dIdQ68)P{Vi>83Je>W+EcK^*uf_}?m-l5axh<+G<~(PpW%&8SIAEQ1@T z5mm23xnl-n(4WY3>k``p(I~n!&1$v)MU#}7dx6Lz-odug_DNw*Oe@dX2Cux>CmPmn z)p5JQ6qcLbl3V0){%ZNFXAzbEexyxf%lL0v%(n6zJrY@7Wl2v^SzM&@;!^oo47_wm}#pdU%@n**7q%80bEcd-IEZvDOVlUXZ46_~%TAMp2bLZjN(GsU0d9ytgoR|p&u|?lsiq9rIuzcBaISx=i(G1 z(<etE>&-okqlyu~1*?iz}^*S5EBhx>^X z2CsHg6nGIJ^W`3w^|27UE|OA4-wK6&+YrHj{Ch@pC-}P8%$FpCO%GG4&fjxdPdc@C zn{Xu?Ko${t7WW!MJ_uD9eHI{|^hiROB2hHa9w#S8KoV{@s~~@o!kY%H=siZyvdcj( zaO@u763D<^x1=b~CPK;fKkDK26y|x)^nlW=25on|A~}z_=|n9ZOMp0G4EQQaJyZg6{a?2(RTgm^buQ{!s@{uqT$ql30ria_9dcSMQq0N}@&is|k*uO~oORf9b95^@E^BKhVL~uK$^~2V4Z$38B|KRy#OZb~`rIjWa z)-bB*Mbn!ZhZ_s=AA9Qq_xbyCrsoxs3^?x+DDyxwl^SjqV>UAQ`*1hu`hBWoOz)rZ zI7Ad$A7DG<1<3c;-R(A!&YS&n^WSmdoja$(mPtv5qKwf|T(Xw)j;2&79DiQDOR-A{ z?jQP*`uVF}70vrz?FzL|jQ2luJwA}5@FQ--%ts6^{3Qwt$tU>M_Nhqe-H43dRiVDe zmqFE%g_1U-M2Epx&f#%enodR^(?{!E1+{7_nj|+JS=)GuJN(s3Z~lz@a`fzJCGwY) zWP`%ktA7`F`H=%3)(em?La6uO)Wqoyw+EORc zD!$^IOGTU_@t%K$5yVh6HP!zVP0RG4k*V@)PJGlg_4{wFzlN{OZ%w!-7Fd;0Z$9^xDay&C+V~-lW)tS)Z<043xMfIe z`^kKuoo0sNIGpQRIL_?%ES)!5)i{VkWEgL>zHkgqcHByKVJzl*`V-r8H}J%Kon3%k z6Em`>E709^^uzJwWIOpNd)ftE^PEdy!K2KXa%L!ugHyQ6OaFF(h@ov>y6pF$h5+m4 zah~^Oh#A9G)A@!Q(|cmyGOie9*4`$$@!;Hk@CYeX5NFr5^nTA=c)}$F)9rer-}`!n zRZRpAvNi81+tnS+R;gTL!6DUN#d8c#CGM5d`OXz_I@mX>89G7^p-Xz#7Owbxs=bnO z`y*SAsmsT7Lt#lehLcZ`iOT8io1f?LZ@D>qI?jZ~Bp*K2i2CJxhdIZ1Wwj^c6(k4l z_okO@v8sU~1_!x>C&?r1KHfgq>_OM;czb-kGzCjBR}h-4h|-yRiy6Avi$j~}yFyzs z7GHGw@OC}RP^duTm+0ymg-*I`sMvP{r030FcF5mie;7@5#%MQYLyVD!lqW{Lm7s6g z=1Gf|&;Hrcd%Ct8PU&fM#)iPaL0cl^xA}{!)&)4gDJ;t;J+l@WZ73wTuNgt5m*v zPdxlm*!m8Bq)Z5dD?)?-gYcE3w$t`zYKRo0*Tf!n^UUc4>+Ok4+4~ex_#|9xHzWk- z4gTS;nw3CFxWAU&2`T}KC;VX4q)DT*z;cJFK7F zO>&SOth!=tIn`o!2-s|Ax9?9X!lY%@ql3=R%}*bZ5 zzf(dEm}yWL$w4ATB(=nm$GE7J*b?V^fvG$>4k) zTXmmO{L&9W&qjhD=}&HysveIDltj7zwIC|f3S*v@JUhAYFSAedCb+U-5y-lzhoIs? zmMvVSKfIYBDIrX_(&BcskkTQI_*vN>_D<)FOoi%mf-Zi&I^;cati} zc4V*RirCJbbCmaWQ{_Tka4T5*{fgg%%eIsm4jA{@9RH|g>Vr$|lVOwKzW2)Tc)ymY z?JiZC5k<)y4~{)?e`2h3DtCiXIVU8%GyCMQ;k8b3HF2qWfaqEa*+s)$%OUs)nX>1s zCL%@+Gh!U!E9-(|PX%^uZR%$n3T`xtB>BhtGU8hmmi&DUjRzlEOy0Mt^w=C2ZkXM< zda<)A#1tfd`?qp7mQn_T;f9inV83pV z;zBmQVsQOy+)LlpF2s}S^l-zv_Y}uU89%sgaC|-Kh=g>7xkql1X z*gMZ3-96w>kO-K{DKxix2!APxEt{8yQ}@1S6{_hmRy3<_G&XW5ODliz&V3@R8YuhZ z-7PM>(<}`FmGkqb=fjV1$==EbU{*=XwoxLMiOC{|wV=HiC+mAmk32J$eeh>)u$Mb| zQxk{CDnG$~cwb>)R%HO;U~cpG`2nV$iQ^_v4u$bs#b7PTI;_>^oV;C8-Gn~w?D9J^&~kt zKJOXqZLGosqffa{*Z(=KJ8k|E<8-5j(BU$p>rMnek(5+CwzoRe z47D}+P4owc`be*sz>Zf@tE|?DmOG#TKPaz*sDzo2ge>;SZq)-fN97Yo5E<~cNYe}~ zWX$1;kKZ@{5wA?H0;-l-WJ=^{sn-yLOmWb^gUC9!I2-xZewY-i+KJ53IiWnhR#bq_uz}Q+YJKvS!xZMs_#$Ft zRs8%q98o0jGe1zVE=DESK<_rGx-SwNR2?SnX+i2YDI%eM_?c^~yt@9*`P*aagIt)4)^GQbeEN^0 zk4!+2UXEf+E$gj|a}uZIe0}m=mp#2o^I&Xfg?73nt|T=nt6wq8a#nwaBxgR0E}{le z8dAV@-{VI&}R?F!rg16nGW=Ag8l?#6`4|}rssfxP1@QsH>b_k2i z!KWh`q>~Gu<(I$p3ia6uE!-ALH!`xEB^%@hJ|xE)=CrJ=&<1a?ZV;~WUr86iZJhEO zuDNOVNq0+_XzMwXfn?!Gxqu4|W`d90_=8-d3`^OULxWEzl|Q*1DAi*~2-hLfBa0o& zmbY}=2FNx|G|olO=KaLK!=f^WMMcQw$u&-Fb_E|xc7iK0`Bp09?kiRjOi+jZ}sPup={SRNO!tPX8Q4Q@d#SF1Zl7P-60=A!CQD`#g6JlPM+@N4HCrd7+K9& zjqLlJBRKa}5}V~}=DR*td$Tn3-Nj8F=aP!E&N=>j-JP=SZ#`W^A;QL&U_GUw_+PCH zi_(_ah1=!!3drYIV3lEqYqu|cmV)|=hn4{EM24ZO76-h)>B>lZO~qH@2|T?Ge%(|c z&8$xhep$^Ud)hIBh^Rvf-w_(FGC7H~P}U+_nd;(QM{jJFD)uGL&+>TvR4+PTRc$Yd zw4emv1O`n$TYaf)FG5d4%#>35f%iI~qunc!R2H>AkIr6vh$FAm-n%{!EH_PK~ zbV0it-g*1YYhZv4R7RZo+%?^gKVC%2ykAK8P_uTB?!y*R_!0N1PB-X>%->L-Z=eoz ztA$+EH;Bm^CC^mp(A7jy0((aBv;Hr?l?ofM1xN~vdsJGq#w7bQPOuf(zgrgcwk7Zn zCC6DCnLCl4PIa2sq3|yW1xP>k)ssX2pHN2zM3~3#?;L@-1p39Z5kg{3lx2A@9+6e) z$Zm+{{}XMC5SAdnBWS}Q_P)Bx>BP@VG70)FZ>(#Lb2wK;P;It$QLRG< z$qet3qy9(FI5_Y-$!Ml36x_6K_C4ucN>dHFd0jfMj!pY_8jb7y@TO=r!htG2TEDL3rME;H-u-pue*{U5gTh7{yCPP}g zk)|%jV5vJl*5!y%%5?2nD`K)Zf0ggpjfcR+~6^NPNFH%M}mUyUa8Z<++}&zG&mZc=haQV`yPCC>YpX)CwU_D&shNl*-jN4t6|W^4IH1(XWU1Oc5$h z=^Pw)I~*T&QJeSVuWJZ%*xY0Dq^zXKm46h|MV6FpZ%nY)lkBRf1H%0 z->*>%&S+5|g#M{647!UgvsZ#?_4;9h{%DW#J<9dKl9QEZ&bXFa-hMROx9gT7k~vK% z_T$33?wdP!^s#%MDWex9|3K%k?6|UfM#L-9EIunskNvE*NCcLNV&RB`!EPg1K$r#- zo!z4w|ArTu;lPWDWkq;PBqIBzJzUxAPu)w^drt5>5<$6G+;plnABzlRFq*TO>4P$s znF=rS!~=tEjgOF-HJ>iHx5{Rut_|x09c^((&&#O&I@ptEM>kHG2~a=5NourYrPH zocJwtYmzclHahOT$G-!vKndG-L!S=`LhR3_2rMZaK+&uCrDn~sjM{XvJaXN2ZN2%~ zeagMsxREp2+Wc3pD#!Yi){_aMc%}e4MJ<@ZFQm}aK~k4Q5EkfuxP~jHb|?hyDIZZ# zp2>tWMVK{noe7pkjFyR6h7D=g38G2t)a=><-E@lEUh~bj+FdG->aT3f+!FgcYs@jt zmWP;xHhj@OIF6>dc86p+F00%gd0022=FF856V0VWyZinB(R7tzQFUz>QBXRiL%O?L zkQlnVTe_t|y1To(Bn4qWLXc+Y?vxn1<2yXx_5Q>Qhkf?GW36?sv!|d8$lksR!Kwg2 z#iNz3pWHuJfnqj_lm_X!;4JjJrY_(*itZx9EP``v%U4EZ)gAt3GVPskC|j#@3O+<= z%~F3bJ!(hl>ZMx1eRFDdr}_wfw93FjIQxv97^|HAb^9Fu;1W)Z=on+T9&j>8sCVIg zH-Op~DnnFzE7=lYF~u>Y-1WV>)}ski0md>FQwlZ_KMFba=@ zR+SozNMf29P3a8&+>Uo}a@-p^JbeeYwR=tvLyJt1+}Iv-FIGu3DQO!Y4jr=i#u=dj zqpDrY7X=KbX0$CE*?sY0>{d~&^<#*R_{kkG0MBKr*(W;6?6A!6cYoZ>BqB)JkQQei8cxZCo!Nv`Q(Xd zXjvi~Kfh#$aDGm+m&nN{Edyk2In4+ihBQ76Cz}oR)@PbTE6PiL=zuEHFHrarL9?V4PM)CoJ#^6~+6Pzl;Ag5hA2v zdn|#~}sTPFl&MMyM?S(563~96;nZFtwQKa9MZM5HKA#XxXO4h?)Ntm0 zjd6rA{Ju2OwvnV+Of+aXipBLGiFVH^-AC%Ce{ww-Xsh}Ab1v25H7VFRF&sxxt!?Wv z_ks2;oPK>pVN$~CLdWNrn7DgNFOM{?eoB0yRv{iHJYU<~zHz&#Rtvh7YhWjo<`bz> z>y(7njkE=2Al$(Kc|ixQ*lb=LwY7g#+6~TACE&ysY9fGfcY6A51qbW&KAot~n;? zn;)NllX?_=qgah^)%XYx$PS;&RE%cJcVf5Vy+8lY3%~|PJ3)U8c$#51H1K-9K~zJu z?Rv^5UCd8H^pf1!U{>SfZX_3eXqZC^CMpnq`Iz7WU*#FfBx)*JHtp;U;R3`pr0<>i zVHS#nuNA}WPPWJoB}F1krHXp{9OL?(q^}^EFyP(ilz~(5kM}34wbYDCkKxp&Q;M%t zjP!k4YV->fUFiz$>|K&*EJOLeM(U9W&IvOg^x*#|F4XAfDE-1^=}ihba2cfgu=TG@ z)~^r$dIunpem`G~xo5h91hxU~7d=dz3_&X)qc5hh;X^2eN1zF(X))&zW#p8%Rc*J1b>A@K@ZCB}G zdcd{A-*qIGp${!cW^fK?SJjN;Vn0_#Sv)g1IT15y5$2M`!PjiZzt3-$&=Il)m?(Pn zU%vPnCNbiN$&nSXAHama>mj;bWnh1g8CK#lp43Ebz72(f)5f5ybS5A;H|(-;v}>H`z+0Srpu^)dK&Dc^1{*1y~4P>W?hT zKU(9IGOlmDjhooD+fvf3pe08r12o6)!Qz|*RQxCw6CWrj$o@Rvu%!CuEkwY5e)*$C zxwy7`RzXo0J&e<;%w{Tq9z0Iu%}j7Q0@wAWZt_oOERl=B{Y>Y;-H)9lgkc&vp|@R5 zfLmPZS`A1}%~`=D$Zxk@kMU{Y>qnruEC}*KbLZy<4C-9(yjp?pZ;ZA{b)vfJ$|Ea_ z^Ih{2J>d*wwW|0?@7Hnrz8WNeRU$T6ck|2woBt}Z}Y+jw(x=-XFGjTT9!T&IWn zQhd`JuZ%7!=N6`-blB?Kb5QB(UjMP%Nv@}m=AHr3gAN%AGe7A;&91kA-`Rp@lKc0e zcvI8aIA)58gWdHmz}Ou7Nlpj2BQy-hC+mX!LD%K++uBQg{j;5qF`KFZUZ#~HNClLy z1`;m}H=u&8xTo~%+O!<-T`TAAOKp7e*n3f0UFv!_iF=Mgumw8_BV8h{0(x3nh+G?` z6NU8yTay4q|J4^3r8UdVY#Zt_SnrEf=8pD}_{Hg-rZ1t&g=G_{j5LoKVk-H{BwcKM zIZ(g%YizpbUSg~BBSB}>71$ueh{dvR;m;t|2}RA3eq*-$c*-7SHV1D?O5lzozz>QX zJ$ls>hwGoz79kPTS*C6cpF_H8^Y~RMuiueVj+MQQ=a?0zSm|;cw@~Q@ZC~OGmP;;H za7BML_r+CW-4Ff;SeV!HU{L3q^jX|CoeX)UiJ4MA+h%VF{{Wb9VK!B|S}giY&`u5% z?AD<>6zTJfwgwIpS1CO3h7|vxe&T(;pU)Rp)0KGUxBP7wSU{bGq^Bk|CpPiO`52h2_|=O zeD4Pwcr-?{m_)-Wccp2E@(syhB~Q+&WdMkkIa0Fc^0dx!gc6W_-SgBO%X_71$z|5w z0>m6G?+NiBbCKE>l765F=Sx$ZrcC5iu9RORR5AHV4dvcI@wc?0<3D?d9labC z^ttg(cqm1%7mcEeqi8tp;4jJ(+FvnTo|@}OcelECQ-X$Pg+OtXwg$EUzBS0$>*-wK zhO0{c(Pv=-k@cG|qD72THWo@;Fk+1iIf1%~`oJ1von{r!nZj0BnXeuzW?}b=;F|~q z`6M&(3U#cbYxFbulZt&Ykr=Vf_m*Q~HA<($al_^!d&uggY%x$44>wjc?+q^Gg>c{8_QxGd>sE}yepeJhQ^HgMZ5F4=LA&zRp>=(m+1D6yi42R z0Mr=q5~YcgE39k_iDD|ci`K^d#iVDwM9K#FF9JUS@1q)GgwecUF){Sl6Szz$4lt#i zDKrXGBjzC5B_cSOqNVuHle-g%rn{bL))@b?9{)5{3#JW$#WMdAJUg^g}_{z4Y*maZT1<~5j;hxDYP&)&YJ|tAbF>j z{3WUQv)RhT{;E$J++4PVGi;$0qFvd@hjy2DaY}Pf^TFU+5u*G_KH!DQiAAPzWP-9rZK&f)@3<1BFTcPbk>0XJ&l}+jWe^E`F(@v8h|Fvatf8OKfL$cFDlSKEY`Ir zhx`cSp7VBX<;lH1>jr(*$&m`}5gb;y9+f?vc2j;TLp$Y)$axEA%zJdNW>4Q5aClzV zjqiB&>QvNtzC6gI{ZPhgha^4d#U$;;w9;w6NV86ErTq_f)~BVZw~&oklhYY)`O$H& zF4VP}K=bX&^X(l)rFuzHnyZLZ&Wf7bBQA5-*H(T4uP~GngD<^N?FRyj%&)RUTbt3S zlf2Gxs2O{V6^*Y#SY6cG$;)uKVdKJ-WR&HmUs@6@-#ayBuMS@|*QkqxPsk}^f$wo~ z3)QcAIBE~B&_5{FtZKS{)R!vYV!3uprHfJXJg{g2HaHjr3Ugp+dLpgf53A7q7l7E!(Nk&WTv}zQx+qU{?*N~Dr|eV{d#ePv2%*s z%fQ-R_JME9P3MBy)LTl*_+WA{4{2oi_m9|D5GnugK$C(6jQUTXCcUA=u)&uG+~(d; zbFaIndNT2MlizOS?mBCSWm`tZ20#|$K4ZTA4$p0O1&UAj0if?QLWBcMTUyTAsAL14 z{9n3Jno#~G9-partdeO(ft!SzQ#XDofVaZg3iDaHhC@o}A6<^eiWdSOv}?1!A=oFm z+zhC8q<8>V6OeYzU*gCLXub@X0!d~|Se;iMzR8g;s9{TmAI*6=asHPcyajxHu5(RW zwyG1(o_fv~!ykE;|MGV7vQDN2Qb8D2+LXlF>4PIgJi|*59$hu=a{kv9B?IgWstBJ; zs*+VK$zZB}@i<=m>pFh!d|v-l<(1gTi@8;{e-UOh<~(t~P4GB6$VMY^lq0I1o^nV= z66Z4T%L^8ACWOBwFvZec9-F(*!D2bv*LGgr5<|`wt9fT+{}fajf2XVBzq-%C&$y| z3MtE9p?6W;9S>VlEg}PB1#uQ$GbqzEeYWCfYuT#je}#XACJ?W*YgoxzG4*v0HSapw z?`S_N&UjwJJ$STics|!3pn^>!uoF`yRN4j<3Z{k{u7wHS5A1%O<`|AGn^*o_J)(1d z%=dd=|C#1cN^#AK$bMzde1hD!%@WttF&$rTO-4(BQku`n$jW9dJ};AERpQ*yF4BzU zn|wNg0c_^^r)B{jkr5>ikDGzv_Ss3MGE!cG==C2f?3%YzERzh!V6jIXx+W00NXjK2Vp9~W4#F?x{zmm$R-({FE1 zt%or)LzlE>+jd1#<;&QUQoqDraP~mnEWRg&2q>rw>!^iv+m~LX$iHh3yLpC5z_x{t znWDdl=ra-QY)%0^uCL{PoOkA{-3N78@C-od<6#p%q1pNqe5d)=38ED4T-p=AAJS6_ zfS49Jc)lg`tda5hR@6_IQq+6Bb;ipw=N?}kl|bFbke(+%_}xbrH41U}P0<$Y$s)TK z3TA}Fw>tQ_tYPO5+^T#+6m_haia%X;O|3IjQcpT&(X>w_Fp?!<{bd(3q&iWNZ7uGA9M4 zWvvwmObj0~K}%MIy_3kI7zfU7d*xkGM2g(AlP8|8xqEy~8+TOp$1SFLI|b7|Qw}u> zpxRscRTRbFwYkv#*gJ14q&Psiba`nh`wl7EBVAOpkJLVLJb^3P2`l-Hz${}drWUeb<{gWbBN1>%Sn`Cy<#a|IS{@MyS*Urw6fSFM* zDNOPW&ry<29dCS^lze2jEiBsU9JSDH&kzyI(tKm1XmVn- zInGq3bdjZe1l3;D9wlw$P+S8-+Pk0b)R-eF$}mb*mzGYg%> z&d592?|eAbx0+Mk+gyfwk%L3~>1seUA(rF)Mm$r`%lz6g$zniQdcxtqzv7_R173be z<6tTZEkfFxIyp2^zk%2BB~~H#jh+>Xzil6=qm!xvl>Ce2=PSrswnfKAu?J3U^Ow zM}jyMW$HUv(UP8JZBkHPn31tenOe7|Wu0V^IBo4_Tf*|ayM7*+`Q@${AZj3N1$Zpi zmA1Ae|Fw$eBmVnTo_(OS1Y1BDAB|>jcuP-d10kQ>?K`u=T87Ip*w`j3LH836HQ?&C zfjf}KXwODlBbyaAVF@6wt__|_1HDu}@xm|2w`u=~X{^jg7^K+B zy#~;?ew(s68^~h-K~-W0et5b?v_#0O6HJk~bFsodSO>PKf^dE?>53)piw>DMzf&gi z$cWQcoVfPn@~CgtWzI1#jSYc)QWD2-T-l;N>hIa-oQ~OZW~f`Wne>CR{zb%@dEH3i zdUQr>8Sdo$G{JqUbOdFeB?LRh1{Iu1ae<2-BhhBpyXI*-faNuSX+>!lSxg^CT=%ER zFs>fInn<5DkD=5z0mS(0fqeJI#(@S8B}Qtb*n}%ZdA&0}VS+pJ0XiX|;H;8=#2}SV zzy&|sf_^1+sX*BuAcDCw=Jw#OthdX!8TfCCj~uF`BgOCGvxg)&cYDuEg>3>|=0Jpu zz{B%2Vc@5(1q?FJS?qRXlJiT#E;lN#VOm-2Vs{#NWBiHrfoZvh<}*wT%gQ^{SKHLo zF7(|trdX4tWdvG z^Csp*0j>r)dV-y||IyI8?pT|CEg=SB9sV_YT9x9T`@NW4pKJMwWaIhLV24^Vg%|No z>`I&QuRt)jAx+$gNA6zM>I8rgT+Gvm10Z(hhYkj0^G=Rsxrn|CF$5_j@1H@*OyK*R z4jv&>cIuhGJ5$WmYpK1n&&0@~QXU=;jn#)M)w;}V_0Dm1#7qe~4_3a;D88iAugxp? zI_r+d5p+$2EwNFm-nA3bpBA3tdbzf-RcNL|yfTYb!P;b8Rbnh{9k&=j5v>kAw4&4waTxsE2t zvnDK&mFo@%G&re9vt|}tU$+;T-jOTogwdQNE6FR-;c<=Uj4F_nqnav*B-A9 zMF+?b1;63HT`yO=XKxqLYn|)$Z8-%V2cakJlpin;Z|>+$b%_Jrr^}%u?&s3Z?fp~2 zF>iw2oVF{f(3ivC;MZqN^7kRnoarky6r?F@rfSPXes7qmA)~*>`m<)0jcmMvj({r{ z(U0Th-%6ehzSZ7#v@o8IE}~LdTDmPdzo)xQIhRPB$uFqz?t(E$ z7fBl~GmzuOG4`C(@oPIzMF7!ECc?rGJm-9(O^hm~oku2scmQ8aWc#*(&{of7-#z`P zVmpn&J^@pj5?eww!|8&LHdDro7o?}5NZq{9X3w0Z+#h-(YOmeqtCuIM%4uPyu$$)M z|Cy1*^b=>W2hINS$Xpd;P_M2Cl>@$H>eu zCBCWSe}yFuZ-(#Npz@KmoW9;8+tK#Xz(!57uAubAwG4VpyRAA=I1onL-t46lX>B~|%Cl6(-PAZ`mTuI^cQ;&vAb2K#A2+h^qBL#4Ry$y2jdi7~qobL%JDsv&Q+`0HGB++F;;}VrH;oknRq;8 z#&Vr=(X-4B|EGgryb)&~sE?;~JV}moCblv?{Eu(nmX)xqN`O_@YLWP_4T;c0{s<}a zl1y|``X4(kgWD`ldS~^>p`o{Xr2?Ln&)Q&9gtH8lUjUl>Oe=S5N;8_R??+yiO4J)A z@8EPZD}|4Yc9_iE=20W1vfUQl{o9(r>!lo^E+$OpN}fAx!S_D4ZK5Zv#lJv|3NHh( za~evwTNraHC-h>foL;a`;>F^a2q5K;BN?bB33yq4*PQhTyz~aqaS{^R*&5oc%pwm* z=U9Aon`YUP0uC*m<09NbpB;Yq>*dN)vZ$tRnNlTI|Ngl7MdDhFxwb7FOD48RWPW@_ z7rJwnqxcVSh=5hDP+1LX1&b4jvhJ|DzS;j7%+`0pv~P?mm|*qoRwU_Rdd@24XT@&- zx^Hk{1EZ%ut>oKOBAT{Y3qHkSIN3 z#lBvT_nMFtx|stHL#c$o&zoD3M-qBk zzQO>>`K*{9_VABnJK;F)09dGRVgo~BWHz^4=FrL^;a9xd@tqmISvmF*djosFuss69 zIl2N6%`7HMi6MWs(Hy$K^L^^7Qy*`|prfOK{05ERXfZ+C$q#7U^Ub+P!!OIX8|foC zd|G^CQ-eQ9C2md`Tv3MEPwR~?7t1?L*dU+Nf30;PvRNf0&Ll`=FftFq8_{AH4Evuh zRWq0K=VW9wW6!&|8_KR2-cafX2GU!)v1yOQc%?c4+@SUTOo-F$v&(Z?DteJ6bFtjErUs z0;u(D;@Z;cX1J1o?HQRH>$*Yianv{3Hcg$jV#tbJ<){GyAhA{Xn3ppyb>)l%KK$=7 zzHTbyF&I$==#6AyxnBW*(hgLkKx_8(@*%QKB({!{FHqjiPiDHK+w&vUC;NLP_dzc& z=Yf?RylvZG*_lXk?L1;ia;mI|58`bqgyy3^;&I{zIKEBL@~WL+Z)H;R@x>UEZUcZw z%gceA$(scdhQ2Ui#smchfe;0M+_+EFr}mT)YX0brZ|R~IIKq*y39?lQs>2XU@+$w7HdV55VJY!3++p6W-9b{;r7 z#RN(AcDej}aT83ZB}~}O7wGPK^j;Hu_81K!=<4`B^0h|M9MdP{T6v@lxOalG>Rh5R zBh`$DekkAX+_hR?M1+tZ-99W`*4ZZ>*NYvUpJ5)H5i2?yuDk`xkx5s{c64!+b(B*E zvS33=Mr=ZyLVx9%TB6PHX3DNRAd6@W1P>0{GXA!&B*#8Bp=^?d@=Evaw`^u-OSw}1 zT@U33WJZKtcK%l9d#aIffnZ*zRU1QTO6IBrag#|~>g6eVv#in0e5T1r#^TQ;K z+?xznBkzTjY7*>ra|qm36M)(+Y;wR)VskI+DD$d9=wd^o0m(YBtR*8XN za{YN3j=#d+*aNQLEavLhxf2zI3! z-@k1VZj*e?0HVx2W9QO~eE+dM2F0D|hOM*A6~U!bg1BQJQJG?2)^$Tk+Du`NB}O=V z#PN)nn+cVkCt)2D9ntZ2fy-Db@t(iUyQe#YhTGedSO*A~r~9!3ZJI5O5tM1p0B=n3 zOy^3$b^peSM*zNfY3re&YuG!}Sb8tm@ud9?mFpmz{ce6V$x+*49c_*SU8@#&P9vu4 z%^Xe1eBbz!pFaAE%0Cq0L8y=5vp9(je z<82jfS&DsAG$6SfC{x(^X~n^IMj)2=gDSgza{ICE5s8`a&H9_CXh7)O&OXO-%E}g8 zyM>QC@`(MGhdlGl$rn4tO2B>@%eKK7LV~D}C*8lyE(WG}-KJX4;Q249R7rKS2K~#~ zUl!O}lYqa?$dMo}18Or~DpT7wW&7HpverFOOMWol1BbnM(ds>1q(UBnV9Icv=%j`J zWRrQIooFDt4CgUwufS;V?(-*t?G0jQPB2KXR8AlRiT(rH?Li_Yow@A^v5D&VgrCR> za1?F%_sF*J3@lvWKW~?E3mGN^P!Uw6S}w5Vbf^LO4=cQQKv3K!A*@5SG|9<>uRGUx zF;7=bL4b z2?Z;GPv54@h<53`20-+)w5C6M-s^QAf>E>;(04`8z{QK{fz^6Vqgzl$-wDOrVE=5wSkpiSo=?5Ne5P; zxOx$E{oZk`=;CK0h1X>#l_l|Y1p-})n8m*MaE1w}K;&e+F$%T07Zkg@B>j#a!Mby6 z{f#K&uPM%!!mhi7ZDg!Womu%fus2RGk|5?yGS1W49V?ol?DA=Ow)a$PZv${8 z!OZ)OrxJ-)nKr67`jO3?*GbU4x!P)?ogEU@bc-Gv!2IjBl z9R=h*Rf$|eF+HMTu12V|sy1X*>J!1%#1Ve09IA%9Lov;KnR{O`51y8MoFcp(G=^#| z1}vBaY*(+YIjt3cdiH^tvJ>~!TZ#_7HR%MQJfunmOUk3ICx9^y$VxB7COKx7O>&$A zH)-NG`Lb63F*sMqmigfl&W+!YGhGQrZLr&Y^2?Uya<+wF_;}x^DSu3HUrcp6y!Yoo zUwpB1Iw=3^fl^^EurWE9SN1!1`0Y}jMSHa*CRU$NV|aDQ46@yE@r5}) zO!gQcx<1-X`2wV3Qx#uG&dMb7%~dxmnXwnX$0g6|`~sJo*8h6cATf3C}-BE+Q0n=e`7)4>=nR zx?%n!CYvB%dNY|YwVywvAIY+5soI6CjT|cT8mz=wgw-rT2AAN?sMePC5eL(fM@jiv>W-}7L^+yPr^KjO)ZIF`=G zuhs6I9*fHZ0u&RH=ayRy>b5H2JgU+RdcBWjBQU0b7}}zy(x9wBRP#KhMYM&IQe(zl z1Z5af%%zUn5kgZIK<~+xoY*t2iw=lAlWL9m-2OGDvmbBgapxQr+3Xw6h(EX-Ud2*U ze;=@=T(YoW#Vhrt1jUpEz6wOC8{eK=Pf)>IC6rMGAA)wt(e0^-QtXD`53M%n&gytLOyd9pjJQERW7P>Uh$dQn}4-hKxO76Ra?UtI=US|g}mJxozj9ozodh#_NF zFuF3Jbb~t(;;XyJ)Ym;ETpD`x2cUEJ2v>ut-(A^QM1qnS&b8*aej^EZ4K|t|64UK` z^kn{Ho*}=q9(4JTwht)8o)#Zf0eKVPEmprAG5`cD%I`0O(X7qv^(Y!D=I#F$h$ZZW z3xt6lKvo=4Onb5b4hN^I9vKeBzcoQi5RjUjjE9<3U7rg)&={zup+(0TZmwW@szh|s z`-jagrQ_P3e1g`0PkHB}d(J)e(>_AzCW>@z&Bt>WexT3=;C{znnV}og9Ri#f$d&Jd z{(ZtEro>#jNiv*F=(g%MBF#ydXfzWz9S7_R9($p*A;0dm!4B%tMbNws9|g;*n|vRguq6Y z=qHibvp<{YA*kT+Nj!8RDzebMI$3G`8CE-X>j2LyFt%U-V7C+Jig}{f%1Pn(U&MW# zamiQg4%WKsG@iAgcw#=4BXA$Fa|OZznnyWTpE_Un+&L2&Z^pO1n4>~+cV}$(WwbMU zcjH^_^ZKrnLRx0D4s||yr`RxIyB_aurqD{p-s9hs32uZGn^ie{ ziWaTdQsbdHmr5pkIXv)5AjU`$0zhjYQu&A!Y4V8x2|exZ?R#;y@^b38^`K;c_9Lry ze{5vP$UdONi@=QVzmKN)PYeko9et*TXkii3scnZ$di#K5CF`#n;72nF$aRsROLM{X_nk?Yd8-diJZ`=vr5<5YQNuq40 z8z#jLU>B6*XJ+5GR9qh=l*0##=m18}n4-s-21NWu7#}pMs?_giDF?RE+eoP$O z9E!N;E@60vofj>vQR2ik*4M?7GJ%a@r%F)G=XP9V#v~@Osh`%Icq^U5rA(*So>6^= z2`&|=#KlfC!H*teXs^;6#3MP6>46H`(j~=7G9!?Qj>T*qNf~6ap0MTcMO9_jKe2X* zy;HXI2@e=*#M{}4`9!KRT=3bbym8=in_9Nq@VESz1NuOAZErVD?MJS=h#FqXpP}wS z3S*PWLPW5l!7D{ zGwv_WZ&x><8*3rqG&GrVb?INYzZQdt^YL`)RcTe_7=klUvbo+A#?pccKr{je z&E!1g-3kqSWZJe-W&T~A5#De5&ivES8#e2V>D?7EMjSJ{!;-$u3J%lC>tDdqy_D2K z09HS=eyBGrgD!6^C5U`=c($>udo(^-h99_bt&M>7%HA^q=j zs@lw-^sxvTCDM^Sr?>UulrPX@;KKWaeR0$qGR_-SrDQ4PfjJO&3r5_~C|klRz21&b z{VozCvzB;RT~d3?^5{hj%d55%oG=Y&3ThH$bGdInXLTi|BZmpoN{&XAE{6BrtJ*_f zwCJABeX^5Wto$7L^c`j}uFBSb%b#Tc;A3Nck_c>C{4t3PNu3KT_PTUh=6giE`#)Fq zxN_J}n@B)k{Fe=qOWumaITuMOJGXy8d~P{2xDTvw>zNlm&$$#h?!*u(QV;Go_w|e`&UAhl_IXtAnVc7+k>|m1zK5E>= z$Nd>H^K%YD#EQT7{xE%8fd744_|M2XtLoF!xG@6>aV2=CG!1WclCCN~7^ZSLQ8sC52@uVh+L~T_%rv;c8BirFT@`_o~f8$&RgvGB{Za^D1PqEO8_@gDGx^^7>&iu#I z^IrjTg4~5auYQ1Q%Q>unDJi8Dh4bdUCKF$YQP-m$Z|D;lW#Iuq3{V}qDFn9d?*k^W zk+@aiHol51wfmR2X9t;FYE`uQumN(^W<8!;mv>6R=rKE*^oRT*^+AalTt{07q$#@T ze7z;iv*Fq5^$_BLL%3JU=H1ZB=5?CAv?s?&Yo~kPYr!~B?s*zUh#=*C31IC=mdvP< z-zeYfD&qd;+ty*2kk89=;i(C9PN0(4i-NZ(V*r|#;BsUphyN{*_)GAw7w?%!kUWsL zW=`FLt5&-GU^m4H!O2qh;$ky4Y}KPD{sIt>fVbbUqhru&0%|(lu;_w0lB2>96~Twb zEfxp%)&h0Zy^n#AV_RJLMRjtNpQjVoQl2Jzs;@lCn941|OzCKwFph#YD!yMl;DOw> z6cKDn$!RIi49uNoY3A0e(h8YY+M2D8WSB^s>h=yo0R@|)&%Zv!++^s-)RhJCQ`KwH z?4Q83jvD-dCvs*pfXlSG9GOJhv{zs33y0Fngq6+Ar4_S-?cEhR#STEHhyo*L)QX?j zUbMWX)R{BkHZsCML%({_>-nv7cO&-UyR#)euHvtF({DB6ULFsof}I!AuX{X^*Z>-; z&){qP1+yuc{1qV}Jg>{PHLJB+lAjjfX3;wEIbRexFc$$_7Od)VVhe2IVy=Pg+@bD= zn+E{Zx;lG^!gDmNpx+esaafUR_s#|odkx5Fhn%pOPBwfc^oajltPGSLioIL9`QZkb zQ?5&N+q4wD3Ny*r_gRqNs%|w+F^_xDB6@c^iCCXiJHzh8Yjb`oIX_9Jw`u0oz<`tK z>19%2>`i^D2Oa+nIxu@jxQhL8ktZ7-LVj77Y@+=E7_%Z6<~~ZqGV93!34vzst)&5| zooK+LIcFe`3|?TqhlSt)B~eo+b)T5Q92tHVJ^C-^t z4?Zvf@QMMB11o$k7+X@?eEWQZGPA)^Yet#@C&U0pLZ-Lw5U9T<6!b8vkty1}(D+Jm z=efi$C>RcOb?N{(jwzV{4zH7IOa23gWOd`_=)V%gjwK!LTl|lB{WCtcz(Rj79>POw z*$Dy=&tRf~gLD*6SCp=B5xqL#TvPz<(mAf`j}Z^#Y*R9WjU2|&dWW}J1#Akmu#T|g zSAXBd$u~fwi0djbgn~>0M}~lLdt*2nzh>hv?;-%cB#vrH1Cc7&(hFqO!3DU+z4*z3 zVZ3;KMEe!c?&B5j)X)6K>0ot*(-a^0qmXbW51^ZCx+efQ41bDGW=MoVj*LO>b>*ix z7F;=v1U}TD^hrxD)b`#7iXPnr*hdPsiA3N=t&0JA*d+8b_V0J(c^o6ns2|FG4JV^M z6Ky(BUOI+3PaOCe>Ai`@;6i<1fQ+aeRmEn`2eWUuApTjVIN8O-lNm5>RiWfu!u7O^ z_?xX7tF_A9=DVN(#~v#GwB#z6(ZSe{+0g>`uBXN|uA|sJ`^ltks9&fC#zq<*sA2CG z;lFxY5QCwE*EVFr$)=;b-W+vi1}A!6u;AtT1Lj;CA5o~57-dQ^Ln3<(^)9XjW>nA% zR_w2j4=lref|8?E?$Lckp8>oFfZegVmWk_a0`gu_uxiA+#tMHzQdg=ym|3&T}xxv%y!H+8(WN@pxAWmDQ(HXmT=M?yPxQ^^xaP!TWqv7>it)Qa|CHk&56p-d?@Mj|4!t zdNtVXHj_k@&cE3Qc+h8Yg)^mS0&OV`73VWS7_ZeOQQJ7tQgZMp%ZQP}HD$Q@53Bs# zU(Y#SQZm~3Eq}@@GlbVL$=NdGTX}&?953vh1&PechlTa_Q(Ca;PRNK0E$p9XVzS6FN-hDCi(<7b|YyKzH?X zZw?d_X^>my45O|9$E73iMu22%w58JB_Z}Imu5t4}vdbQQZmn?{Y$BClU6$ONz;Z>Ud7jYsHs=o68|mlcLo+mG zu~V!oanKF|kT8hXo!CV{B32B>?{-za`Y3fFRg9>*m_AXD`YqS0ZMF5Arvi-GYuiZy zm7%XBt*ROnZz`pGxthOwa7w;pT6|l+#_8Mka3`bATymzBaej)NjIr^0vtuZP88q5A zvHPvCGk!Ipk2f=Srzf8t(0eJ-@mCDIm9H|?e#y4^?bHA~ztE)zkZQ4w*|4#qo2G;> zc>y(YpZI`dfuWI=mvK9X9c8ar&u7%PNw_}rIVHwR3X6P0&~aI4d%^il>-q7ExxAut zH8(anglb0JD`l=*BFQqrPOGnB%lTG~&BCaD{|YHTp*X$VxnXMEg%TX?JFMCFhYv02T(ciUrRHOtF;)6xI}dwld5p z(XBDJtIKy{YVE_0cy>p4w#6cp43O)z1*OlO53oeLI>6kh07z{xg)g=li64>x67BHL9}Q=iwMy-|7C=X&b&C-IS~%l9H{39(dPK z*`={$OX?j3puj?AzDB5t{h7nXjOxQ%SSWI*O!)3>Ytb;GP3uH>+)485Ef@%GPk~=` zG(;&Pdy2*1!GcH<>Ub4U_<^n zgdVH~vXnpptW+*Jnxp{8$cHAB2@mLdWIO9QfKnnzsdAq1U5~9$O{O^b$Dx1;Bl^wN zLeNdAfVF02fvvW{h0-S!M%x~m9Lf(m zsYIn~S*qhYia`+YOi~0Jp57RI^-_g`=s?}pjBwbG82L#H@xI5?YIfL!md@52Ch4GUP&mK^-kP{3K?eLL$!Wc@0W*wPmACBHSK3l2Oq z+#Gi1s_bV3R8+DOZ{Bmx^z^qde2|#(W-SAgM@2d?F6xupwQWee222a*pZ@7b$lT57 z@fyu5PgaIi`3N|kt^NH7V6tkxH55|iumFyUIB|@I88dKqSD>k~%UDP=p~y-vvDwL9 zP9oE>)@PHYNXZX6{Oya-MlhJX0|RI6=YuJk7NP|Gu;kzgyri<3Y9O{hXy<&<4#%Us z%Lq5$oFfn57dDc_Qcz~j;l}Wk48k9i%lA7b2S#{mEQp8zrgky`A|}N|iEVzgkDM*^ z=eHplN;20HqX|K;Fp#ZxGU&`B`>zoU{!KhdbY)MBl)RKWw%=_(KfD-eN*GVgGsB@5 z&tW>V=hw=hh7ssSJ&7bIx0uU|KF~1p-K*nhjU2U=Pza_RfDltf02Dy9+Xb&F*>{WP zsHy0AluL=DZZ35Ni>eZoI2#Yp=WsXhVZ@)Q2XHL<7L`>bCEQ0Y&rNDZbvBNweFKrdD@>!Gu8wo46= zKs*E1KIj4%jyT-?>HncMZqO*kr1p!2E2NfTwF#r z)1tp-M#+RP~;Kc6{m;0 zI85b5m#!4qG_&Wo99lH$@TAmdKesQuYZelZpY{2J~+O>|3ei>oX_Se zV|9+{HW34+(>Kov25W>~VfW#cfXvGVEH`3c3!M-wse1tqi-6ni4?)i>omcL=vCtbF zsm2G0S*zcUJmaBG0e}`&41kCx)mdtfAY}o+=8Cjx&Iscp4@{LV^Ctq?HHtzG95tnH z2N*}?ylvGx0aevD6dwGb5;UHh(K%{$F6vLLse|lJ9`&)XL8`6pm z5<8MFsR{(fh%)s>;cL~;LKGVqtG2$fuZxcX7LQyRDWMucQS=ElS$Wt*<^&q?C$QS) z0kPgg2@3l4SJ(?PWN%Eg5%0iorEhF04ISw(p+>zsj{Kke%D$q%ND#b6yvT|{u-}~2 zS(5?Nof9y}OZN9A%bW?WYm2Ml0gF%Pb@IUW(Y8ZEBZt&w9n1!d0ML!OxV^k)%A;OL zOR)6Iulu{drx^B3F5jPI{RWtzUgYmxC3#Fdogi0n)MSj!M!7S&-SomD+8?+|N3^@7 zgiyd_J@*>Fi_($ggLdiSod>iUuJ-HhHV$(F3X^Pv=NZWt4054zh4sL-cX6u;t_c@y zgWGv*SV1dtYv=F;FW}^TM=u;}lb4U_B4M&s>$5R&=hjh-StPQNg~rqDAEX`@md|_v zfQWokZ6ed<$}3qGl5kJbvUdIpd0Ac+m>x7s$%($H_4IzrGZwYZE$Z*6q+#VB3P}N_ z&_)_Ji6d5jitUuJ-3>$pfLOMjGQ@WO=lvKJ)>F!v%I|P)JZV)7-5rhQ+X%<)- zlwP{)9&h~-_qp@z5Br>F&z>{$&Ajt{@4Vj(_=U12i)}2f#jB|Q(E?Bv?e@^)Pm*p= z0aerF1?U}OfZi$DhyqYh{`c{_LFxBmz}qdChyz>_#u`fZay^8EkDWlUUnR&UI3-#g zh%EZ-IE(oAU_IN6KxTUO?--J>tz?o|9ud4W_`p%Kn%BcUEm-m&eIus%bnu%Y=xS}` zvCqk6JBMxJrONO7gW3a!1;yuYjk;%~=3%qRojxR(QB?0Da{=0Y`X2ez;(_-Ew|>OS zpUW!evu>`V5uAhB>i1@7m(xqI;nBK(gji$xk^H2&uZdd4$P3B@ezM7+mu?O9l(FT5 z&$yD-kJ%nvI=ezVlKsJ4tuNI2x0@$Vkpu>GhVtdQ%gHz?*joMZ{dy3#$Gt1=P z;(B1yP)=AZwWNMP{YJ*U#)YinntU(6D7!RwE!H+N3j$8?rC59`Z8C zH+WNSh`furcXv`{)HcEDE5QCyjweIQp<{{Bzw8Vmiir$3)xo1&@ zOYy`(oo~D+fh8BzgD}!O#b_&`e(}$7_T1~y9oPFb)msmagva2iH~;9FgXaM$R$4}S z)0`Qe&YJ}XfFJszLJ#jbnSU3UZBib3NKc7dJ0(6D{!7x9T@ z%BUmeUiWXq8b4Ju#Nuc1IGq6IOh})R9Pgy8+)Dm=Vo?JiEf^4p;h8ZS3GL|f28f$rifkYd%peM7VM~>orrmx&+ymskvEWzL=U5!- zx)=a*4q<*uy%O(Y93W8i;KZP#Npqt#LiCPj5Cq_NqAzT&tI~XO*pR5Uqa%FP@hfXt z73d&1uPmQmBTsR{4Q=;tIpjiS{1hiuXAAAz)N^8+dQ?|_Dg2{+zF1^J0`n}BIg3Y%pd_My4TCDY zknhf1G~FtQvI);9V;-HEw(;!I@KA)5^>BK}ie7*!4X&`YXSnTSUQ`Vx!5S?{H+!4w zu!~?7P#y>#6^sF2Qn>1W;GPxal8UMvK!Smh^eRFv zv;)zVDx;-FD@2X^^28_>CYGt>kv!1VJ-O%a4i+FYc45ovj|N0IcwPb^S{}!rD~n@5 z?DN@~^(RWXhxSoIh3TKKIdVX1;X0D*a?s3?kwgVdq1=@Ba%3oL^k!KMU=@HDR|Y`n z1+Z8g;=%!tLQ{vPg@C0}yiWw(q=hkxV6OpM4X8{QUIQ5u%4d9EAjrcGHw408BS6mg zZyL%#{ihKD#wO-Mp8kt}9c0jgtzg`p&jb{}jS62f`&<3M+13zKbwJ$AX`pD(>VCS^vGAX(CPegU zr+CkvakRttXkWb4OL$85ou|h>drZTO7TVQvmMF-mp#Gt%f4gB4AS(~XoRiyw!7L2f z6|r~-3&6i$z@+;!mKi9F(?AaF2{9=+BB}o)J{XRlil=?5~t6u znxU^55DU`R9bkh~oD8s#Mb=h#>MoPj3MXoLk%bkTbi(g1w-A89<|jqr)`4R<7ND?~ zi`LS%;aPqB@W>;;UpBS2x9Uvov~@lkWBi^id`=k0m?h?3K+JtJ=x8C4fyk-In&ljE z3z)v}nV_3`dH*W!6p&8`wBeibH);wQB&AbzURz&@j8^+oftoc!C&PE zuH2F~`!Q%*(M#fl^?_&C?Et*>%bX##q5cx|KCK!;lK;zMT%^7u*2uXftU5sg;@k7)WtsUJE2 zX$B7v;btF%;R9gy`qjIcT9O^?yERrZO!^Z4&F7t#s?pW*Gi+JlHBon7k&!blX9fwf zFF@0v8vr!i3rO#`Y`a14+$7j5!l3UVzYDgGBAOEnW2}a}H*#{sZ^kg_+>)~SZ@e$g zxgb$tjS^W>WvjS+#QT`yL1HH@R{9N;c=&EhC#DS@_9Xz}Lgb(FRX%lCBL<-{>Ml8U z>bD1oE|qO`EUA2J$I@)2W07mR!0MgJq0$DpiE_w5PkBiGG#a*k*3}*6Lz9Kne?3h< zE1n0aa(t>!FW6G(-dvL?^Ho~W=wQkWQEU}F69n@6i0~C`paDV!PV;^oKbPlJ)9NXo z94(LoIWztAPQ}op3D@ihE3Pv$j?o^`=ShI>2Lx!n|218?|EF1)Zqo26Zc1%@B{9bL zjqUCf+oAQ?mO869k2?Rl+Jz?2)ht%@;!6N6m02;qDciY8uuwY{{G&uX9mjKuQD*X( ziSCY&+(#d*b-yxFaKJwSM_j=tneU>1beSs1nUS^_Hjmw%;z?;6)nn)n)5bI2muEE3 z5{l~;8VL4IF!+AZWdDin7~gU7-YuEIG2hk-xYVh!SomkW{LJ0lkTPm z60K|UNQjMtoAFZp3dP!(o*At~?Fqcpi|4*95I)`;gqSA8ibvM>w(v>aDpi#=RTq~> z?sH&$U0Yefu3KjcTEz<(?vJ^xjbGZ1))6pX4qo1L?$LN<*?4p=M9rj3{B$COb6SP$ z{xA>&#Bc;9%cDmD<$Qm1y&|t-jmaR5R6Wp`B2%#%7MFLR-@Ir7q)*^>8|8ZPz~NlwVwZbRQAMQ9B$7uD{>|O&Csq~9S_iwC7AMxM>z%*T)wQxm zrnABXw>w`#UX|7#H)o=O0$_4GKhXnVu;a)23p#-s2^12hw>$ypA|g<-hi8kD{DpWj zWcUtBorIc>94gk7wV8c-$L5#?MN8a;I9F>Qo ztA<4iVlK|opGWDYSEv?S;9~E)Jmv_kDNuCU^2H!l8P+yT}{;yzc?(oH~x z71P@$GTUf(235Z;l5Q=Pa-n)HjV?RzH?jQ- z2lQ*s6q|P9hRVYmHoeSc2l!laBtr}+xC;55YM_k;)botvi-#Kti1&gpiuYcyiZPnI zB|c*STKC{?b%qBDXG~3MqDUk)##!K3D(rvxmYiCkJLcmtzsNG)@4xg0q~eW3uJ~?7 ziogJQn46h;x>?@P+D~9#Z;mphM!W43Oi<5^aS)#T>!S6<9*@YQ_31Lr zh9slA2zeAgbtZ|$i#1`HM4cdKjtzO>p`hRbtbEyHB97%4onLKAgi@YUFD6KLLJmZI z9tnd;dC1jkD$H`WU-vQCrYH9cLS%oGj$ow-)`smpbrHLiS4r3L?$038W~9PxTXDf} zGi^c3vn}Emjaz&$$CJKNsVY;1sJ{Iv_{#batb)LS4V(M?l^WrkO8uylYVnN4SYa&N zt6-0!84V;cCHrUbw|zfzkOz}lfFbkx<mj-w;?NtuoLNfgZGFZHdVgdCGy2Fn10%+HM4B*sdokgZHtyPL6OfuP0R z3S+?u4Td~Jf^TcWP7oLeCI}SRA7S18$!{Ga=ONqLP*lE98xqbrz!0arzuPHIt2X$Xw$in&|(|zMMp8 zdYNDUTr}9|c~pCTD^`?yriQ1|FcV1(L;7p;fB>4>JpdE%CwBw`RurZ3ozJy&fNj_! z%qc(R%kM1vwZ|1#ZClB{K@ttXXXdg~i;m56gD|Y7|25P~vj!XFv2yHO^ zoCx3fi^1%wZ*LWo<*^HcLkK&b4K3}VfV%d6RDGxPy%LRoSo#5ssc7zShVr@jQ|s|f zx~mZUu@+vDYaFubnWqidvFNg&#FtMHb@J<3o}j-bMIf`YLqdy9@v$b0SV&bowq`k| zWLpEVxW7~w1NQ2*JL6bL%4P4Vb#{9WOZXZ$sJIppJ^Hw&4XRwzJn)|8G7ve+?`l;^ z3W?_KpWP&1Y~2c*OIc2Ibw|y=+UdNSpAG@A7DO3|f@ntYLr_85+U5w3%jdzI!{eT` zsVuTY;k-Q+TI?=4!`*weg=`vRB~DVndA?scpG-|nW!^vV=pZnZwGOj9g9wZ(oK$an zf5J4r>Nq$3zDVjIo*2#bwCp3iM<-2ch~b;CYb?90`=T^c`dM)R37(glU8ge6S-O1S zpH}hsk&h3(wpEcD$jyo7hP>@YF>FUxP`lq#NqGNlj%!T+cn zf6hp>R|-2E`mxt6m=CwFfpN8yCcn02j=>v!#wLWJpo! z@ia!4ZF0`!99Ci>VapsI+&W#mdVM58SZdqbP+g+##E7ZvXs3Rd$r!^I9f}JQ5xXEJ zy>W&+wc-Zl!wC%p-QDTy3k1#31cSZ@sd%91gwruLSNq^-q`(|3rtJHfH zD((#H+Bd-)%NsDI=^z}7e=MGvDs=bgylEW~93>wszTZ6c)ncES6$@ox_^bkS`W{!B zkFQIfW-Ah*fBO7czy7ve4=;5gn$2cz=~f;T%*o1tjY^R8K){Z~HtI&N4$Z|cj*d0H zd~oyOR20It@EjeiSHEZeRaW`OH}4O_Dwd#~WmYkm3^Lb+7WDKEX{?sD7hK%_ZF=lO6I&=lCXXEo8avhC&ZMq%U{MCtbzzm2z@_xp7`=CaXs5rcjK6uARA^Q1 zF_OhVzSus4Xoj=J0uL&Aiz7?KKoTR9QFZvJGG)Y1i5m*K4xo!Pmziojx?6CsV#5WX zsMScJ)d)&hu_uPtSMHBQmz7~p2Lpd+SevQBy5>vw!J0bL2kvC4uS0p&c~*}h3mR_d zg~4$hpR(L9FSl$^2rtKD5kN@^X&+6h%D!1>Rgfauq%lxX$zD<=($jU4KKCb*x$V-A zHJS+tSqW72;lxJ$=>Aj*DMzh6s&lL~iLo zQVz}}2V@NIP2GiNJAJ*EKC!*=tWyT9Y8y#Bns(9BAzJx+DlzTk^yT^$P3zGDiOd=n zrKpq7N}LqM+yp=}Bt^;nyOZNPCmSM?r=lPLI$iEDGSs3`y`bw{M4PSb%+GCQKJIa# zsXvZB_MJ`fpaRogq_xR|)KiGZv6r>iS}wv#?zQSV4`CoV^B+wKsa|7Mo)!a;Kt78y zFCLK7{>^hOk#pGG1zoEzb-}mEL?)~B2QQu$dpa+JCK*Pgc{nVTAzW7Bpi4`;|LV%; z>eNSq0PfjmrlhS6m|aC(J<2?lMS1YUHzIjrz@&Lwz}?Xn(5ICw%G>+Z&5C@gq`;6O zj{`2NsHlV|Nk2;frxx=DObFrw2R(y`F2vuGVGLQ3gfehau8-(GX|xO4ZAywko%d)43vc-PN&5by`#UIP9tOVXVZ!1DJl`R%HHZATIY2Ced1(z!t5vF;@`yZ|} zKsSUip(v*s%zo^s2`w&urU;qP{Q8Ei)xLZ2x5iDq=&d<+a>0->D45~M)#fY=8x;a2E#$Y7YC4L8WK#G6^LF2F^egh3+;M|?p1gMHXdU=65a}^TCe8vf(Ct{G z-Xgt}j64}%bj;1csT-k%M=vaS&O_(2m%?&)XqD`g19rA`kLCt9YVydrdUz`jQ|x3D z-|H)}ri}~Ma4Vr!q9}3UO$c&1Na1VAeO_2W>1lQ>e*4lUOGns*JG1Yr0-3yrrzhjH zgvd+NDm&n?(n`a(vr9|H!iNS&0(^YLudszxNdZflpKB#-h?sw6ie+kRZ`Z8Q+Rf7O z_V$*8pFa;P1_r(?Q7>=xtfH-j1(QTsQ4w0b9w**Lz>2dE(r(OJ_2BR{zv{#HTI$GP zQ1Xyf@2_t$b=|=DS&1iU6NE6@j<+~X*N;L*ZxlP5oh?> zy91lw3An^5XwsufUAOZNBVi$jePaIa9cGjo$vp;^!yV2N*6KO?3x;NrOC9om7EBPL zflx zW_6@r;)cwWpi(M2fWm;?YK@=3?S?0T2h{GZxd**uPk;R#VZ`CJYMI=KI+>zdz~S`- zB$JV9?qek;C&KSV0b;<;$q=eK2wLGNcu(!kIoU?4@h+vU9`ML>?)FL7>a7=eqY&Lx zl*A~|ic5w{rz+}qe~@2yu|c@AfjK!h??Ay@ndV|IG7cX8#psuN-h!^B!P_!hq4t|7 zt7j`xaq}Cb_!}20I2VvKL=0&SDk=-5#fuXpC+3qfZp8hd1uELSbUAgL9fA?p-T5l& z15$CG4szJN6gM&hY-ZKdny>Y!^_F;hDJIfhmo--8y65f>7s~6fgzj!gW83~PvR}Mq z2@s3a^{0Hc^f|iHrDAI0lhS!)=mUui8MILQ${}&u;EIKg%z@yN8oE1 ze@Itid6w~otN-%84WX3UXeJ|M%GKy=TleCNLBYGK2C)_BtRM3Xy6o5OMSJrk+bqDG zp2J7McIuUo!sC^;YuQwDO27ZQf`_Es=Koq$s}~%?o%K#S=4QE-+9r9WF4Ut^9_M%3 z`25@O_Ec)uj0&4JlT0p9Jg95~*30r?L%lmC&f~1;Y;%*o!od+}pQ78EY6+=9D(PKG z@1~@&lW3i9jI^zoH8c5+Lf}SccK}&2a5J5{h0&EnA$8A&8nl*Y_lKfvjU3_sMyt^4 zsdh^NAn<78lhq)GR~;IE{D^{$niF)-_GJwEX3;!O=|*x~cuwOT@pic>z-4Ee<3a!I zMBbiqQGA2Jc>0(b3w7oZ^;n0?7X(I#RzgL0*ipJ=HN>vuLuj}XODF^OGgQ3c2BNtB zFSZ7HlJD#XYWDo}IrK5Qft>mvU|@ajDF1T-C3kS0VN8@q(ZAJ>>d5!s>zlMlP|cz ziT2UX_WR5yZ{-N3zL|9=pH$e+rQLbu*GdR`Aj28=e4I`wW7T|js5#T}t_+E1nz^9s zqM?s_UNV|dJ}oBI(ArcA}yXE zu(Hs779*>HUvJpmn`tw%6WdAU3RU;v+2DIfb$L8Yn=53dn-5iW%ZIub0&l6RKC zA9P;<1e>wEd84@Hm)g-;EMD=Et%Chp>l1U zb|LCDC>ItU#)NW-*A55*4u36eeD9!doE&&^oWr6jthaH8G6Wa0Z5`BT`FAm;U`vcu?I{8yhbRWJ+UC^PVc2xK zP-2tKV5oeLUtb zozYFCDn3HX6x*I9DJ|dl1`z^44l)vaM)H&=HUa9*u&vk1@Ur$G@*^(2E4QoVj1j(%#cUg`Su6gGa)5S(QH)HejaSpf5R*zPsXh zt-U{r{9*Qh-sQ46>=P>ft?8p}7B3$2qJ{|6P;9?_K%ORpR=S5wZ)dWwZ_|= zEhgriKGTM0xhWQDUUhY^PS$@I{r$U_7th1P|;f#5qD8h5%Ycp`iRi0BnT6}WUig|>qv7>%8RC|W}MV6 z&-GhM4=mn-eR=O@p}jkD((m+%o*T$Lz(eXR%r*|e@k{Z@?O*8$ZQ_J|W859p4vZHbILt|R4o)(7t2>J1_^I6K zhd!VD+^+pti6^dAb#brKwz?vb%i<{Bn4f8jf|*JI@E+4abvAq0)I^$GjdMMO@`|!`xXc|vQ6QC zb*r=t%BA178bz8@DwR!9Qd75Y#M%1EUr5pSDd*dts*_7T@(=N9grlv{@D@WcgnC8qx>g>TCC#P~nsm6n#0 z*C;WyQ64l!#z+5G;r?t+i7y!togs%f``_RH(M0SxGzq$t&V&Jk*MF9YXWz2?kmI|( rC618)F4JU~%K!fz0{K7H4j&&0?VGBY#?j7EK|oQKSA*1o%|ibJoO!vb literal 0 HcmV?d00001 diff --git a/flumi/Scenes/Tags/canvas.tscn b/flumi/Scenes/Tags/canvas.tscn new file mode 100644 index 0000000..73a06b7 --- /dev/null +++ b/flumi/Scenes/Tags/canvas.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=3 uid="uid://b8x4k5man2m1p"] + +[ext_resource type="Script" uid="uid://08xpof853sfh" path="res://Scripts/Tags/canvas.gd" id="1_canvas"] + +[node name="canvas" type="ColorRect"] +custom_minimum_size = Vector2(300, 150) +offset_right = 300.0 +offset_bottom = 150.0 +size_flags_horizontal = 0 +size_flags_vertical = 0 +color = Color(0, 0, 0, 0) +script = ExtResource("1_canvas") diff --git a/flumi/Scenes/main.tscn b/flumi/Scenes/main.tscn index 57e0c98..a61661d 100644 --- a/flumi/Scenes/main.tscn +++ b/flumi/Scenes/main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=35 format=3 uid="uid://bytm7bt2s4ak8"] +[gd_scene load_steps=36 format=3 uid="uid://bytm7bt2s4ak8"] [ext_resource type="Script" uid="uid://bg5iqnwic1rio" path="res://Scripts/main.gd" id="1_8q3xr"] [ext_resource type="Texture2D" uid="uid://df1m4j7uxi63v" path="res://Assets/Icons/chevron-down.svg" id="2_6bp64"] @@ -9,6 +9,7 @@ [ext_resource type="PackedScene" uid="uid://sqhcxhcre081" path="res://Scenes/Tab.tscn" id="4_344ge"] [ext_resource type="Texture2D" uid="uid://cu4hjoba6etf" path="res://Assets/Icons/rotate-cw.svg" id="5_344ge"] [ext_resource type="Texture2D" uid="uid://cehbtwq6gq0cn" path="res://Assets/Icons/plus.svg" id="5_ynf5e"] +[ext_resource type="Script" uid="uid://nve723radqih" path="res://Scripts/SearchBar.gd" id="9_gt3je"] [ext_resource type="Texture2D" uid="uid://cklatjc4m38dy" path="res://Assets/Icons/ellipsis-vertical.svg" id="10_6iyac"] [ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="11_ee4r6"] [ext_resource type="Script" uid="uid://vjjhljlftlbk" path="res://Scripts/OptionButton.gd" id="11_gt3je"] @@ -201,6 +202,7 @@ size_flags_horizontal = 3 theme = SubResource("Theme_jjvhh") placeholder_text = "Search or enter web address" caret_blink = true +script = ExtResource("9_gt3je") [node name="TextureRect" type="TextureRect" parent="VBoxContainer/HBoxContainer/LineEdit"] layout_mode = 2 diff --git a/flumi/Scripts/B9/Lua.gd b/flumi/Scripts/B9/Lua.gd index 90f80cc..affbfab 100644 --- a/flumi/Scripts/B9/Lua.gd +++ b/flumi/Scripts/B9/Lua.gd @@ -691,6 +691,56 @@ func _handle_dom_operation(operation: Dictionary): _handle_element_focus(operation) "unfocus_element": _handle_element_unfocus(operation) + "canvas_fillRect": + LuaCanvasUtils.handle_canvas_fillRect(operation, dom_parser) + "canvas_strokeRect": + LuaCanvasUtils.handle_canvas_strokeRect(operation, dom_parser) + "canvas_clearRect": + LuaCanvasUtils.handle_canvas_clearRect(operation, dom_parser) + "canvas_drawCircle": + LuaCanvasUtils.handle_canvas_drawCircle(operation, dom_parser) + "canvas_drawText": + LuaCanvasUtils.handle_canvas_drawText(operation, dom_parser) + "canvas_source": + LuaCanvasUtils.handle_canvas_source(operation, dom_parser) + "canvas_beginPath": + LuaCanvasUtils.handle_canvas_beginPath(operation, dom_parser) + "canvas_closePath": + LuaCanvasUtils.handle_canvas_closePath(operation, dom_parser) + "canvas_moveTo": + LuaCanvasUtils.handle_canvas_moveTo(operation, dom_parser) + "canvas_lineTo": + LuaCanvasUtils.handle_canvas_lineTo(operation, dom_parser) + "canvas_arc": + LuaCanvasUtils.handle_canvas_arc(operation, dom_parser) + "canvas_stroke": + LuaCanvasUtils.handle_canvas_stroke(operation, dom_parser) + "canvas_fill": + LuaCanvasUtils.handle_canvas_fill(operation, dom_parser) + # Transformation operations + "canvas_save": + LuaCanvasUtils.handle_canvas_save(operation, dom_parser) + "canvas_restore": + LuaCanvasUtils.handle_canvas_restore(operation, dom_parser) + "canvas_translate": + LuaCanvasUtils.handle_canvas_translate(operation, dom_parser) + "canvas_rotate": + LuaCanvasUtils.handle_canvas_rotate(operation, dom_parser) + "canvas_scale": + LuaCanvasUtils.handle_canvas_scale(operation, dom_parser) + "canvas_quadraticCurveTo": + LuaCanvasUtils.handle_canvas_quadraticCurveTo(operation, dom_parser) + "canvas_bezierCurveTo": + LuaCanvasUtils.handle_canvas_bezierCurveTo(operation, dom_parser) + # Style property operations + "canvas_setStrokeStyle": + LuaCanvasUtils.handle_canvas_setStrokeStyle(operation, dom_parser) + "canvas_setFillStyle": + LuaCanvasUtils.handle_canvas_setFillStyle(operation, dom_parser) + "canvas_setLineWidth": + LuaCanvasUtils.handle_canvas_setLineWidth(operation, dom_parser) + "canvas_setFont": + LuaCanvasUtils.handle_canvas_setFont(operation, dom_parser) _: pass # Unknown operation type, ignore diff --git a/flumi/Scripts/SearchBar.gd b/flumi/Scripts/SearchBar.gd new file mode 100644 index 0000000..9681cec --- /dev/null +++ b/flumi/Scripts/SearchBar.gd @@ -0,0 +1,11 @@ +extends LineEdit + +# NOTE: this should be implemented to every Control element, +# so that it defocuses on click outside element, instead of focusing on another control node, +# but I find it impractical to simply paste to every script in Tags. +# Will hold onto the above for now, and only implement it in SearchBar for now +func _input(event: InputEvent): + if event is InputEventMouseButton and event.is_pressed() and event.button_index == 1: + var evLocal = make_input_local(event) + if !Rect2(Vector2(0,0), size).has_point(evLocal.position): + release_focus() diff --git a/flumi/Scripts/SearchBar.gd.uid b/flumi/Scripts/SearchBar.gd.uid new file mode 100644 index 0000000..85d269f --- /dev/null +++ b/flumi/Scripts/SearchBar.gd.uid @@ -0,0 +1 @@ +uid://nve723radqih diff --git a/flumi/Scripts/Tags/canvas.gd b/flumi/Scripts/Tags/canvas.gd new file mode 100644 index 0000000..93322b5 --- /dev/null +++ b/flumi/Scripts/Tags/canvas.gd @@ -0,0 +1,412 @@ +class_name HTMLCanvas +extends ColorRect + +var canvas_element: HTMLParser.HTMLElement +var parser: HTMLParser +var canvas_width: int = 300 +var canvas_height: int = 150 +var draw_commands: Array = [] +var context_2d: CanvasContext2D = null +var context_shader: CanvasContextShader = null + +class CanvasContext2D: + var canvas: HTMLCanvas + # Drawing state + var current_path: PackedVector2Array = PackedVector2Array() + var path_started: bool = false + # Style properties + var stroke_style: String = "#000000" + var fill_style: String = "#000000" + var line_width: float = 1.0 + var line_cap: String = "butt" + var line_join: String = "miter" + var font: String = "16px sans-serif" + var text_align: String = "start" + var text_baseline: String = "alphabetic" + # Transformation state + var transform_stack: Array = [] + var current_transform: Transform2D = Transform2D.IDENTITY + + func _init(canvas_ref: HTMLCanvas): + canvas = canvas_ref + + func fillRect(x: float, y: float, width: float, height: float, color_hex: String = ""): + var color = _parse_color(fill_style if color_hex.is_empty() else color_hex) + var cmd = { + "type": "fillRect", + "x": x, + "y": y, + "width": width, + "height": height, + "color": color, + "transform": current_transform + } + canvas.draw_commands.append(cmd) + canvas.queue_redraw() + + func strokeRect(x: float, y: float, width: float, height: float, color_hex: String = "", stroke_width: float = 0.0): + var color = _parse_color(stroke_style if color_hex.is_empty() else color_hex) + var width_val = line_width if stroke_width == 0.0 else stroke_width + var cmd = { + "type": "strokeRect", + "x": x, + "y": y, + "width": width, + "height": height, + "color": color, + "stroke_width": width_val, + "transform": current_transform + } + canvas.draw_commands.append(cmd) + canvas.queue_redraw() + + func clearRect(x: float, y: float, width: float, height: float): + var cmd = { + "type": "clearRect", + "x": x, + "y": y, + "width": width, + "height": height + } + canvas.draw_commands.append(cmd) + canvas.queue_redraw() + + func drawCircle(x: float, y: float, radius: float, color_hex: String = "#000000", filled: bool = true): + var cmd = { + "type": "circle", + "x": x, + "y": y, + "radius": radius, + "color": _parse_color(color_hex), + "filled": filled, + "transform": current_transform + } + canvas.draw_commands.append(cmd) + canvas.queue_redraw() + + func drawText(x: float, y: float, text: String, color_hex: String = "#000000"): + var color = _parse_color(fill_style if color_hex == "#000000" else color_hex) + var cmd = { + "type": "text", + "x": x, + "y": y, + "text": text, + "color": color, + "font_size": _parse_font_size(font), + "transform": current_transform + } + canvas.draw_commands.append(cmd) + canvas.queue_redraw() + + # Path-based drawing functions + func beginPath(): + current_path.clear() + path_started = true + + func closePath(): + if current_path.size() > 0: + current_path.append(current_path[0]) + + func moveTo(x: float, y: float): + var point = current_transform * Vector2(x, y) + current_path.clear() + current_path.append(point) + path_started = true + + func lineTo(x: float, y: float): + if not path_started: + moveTo(x, y) + return + var point = current_transform * Vector2(x, y) + current_path.append(point) + + func arc(x: float, y: float, radius: float, start_angle: float, end_angle: float, counterclockwise: bool = false): + var segments = max(8, int(abs(end_angle - start_angle) * radius / 4)) + var angle_step = (end_angle - start_angle) / segments + if counterclockwise: + angle_step = -angle_step + + for i in range(segments + 1): + var angle = start_angle + i * angle_step + var point_x = x + cos(angle) * radius + var point_y = y + sin(angle) * radius + var point = current_transform * Vector2(point_x, point_y) + + if i == 0 and current_path.is_empty(): + current_path.append(point) + else: + current_path.append(point) + + func stroke(): + if current_path.size() < 2: + return + + var cmd = { + "type": "stroke_path", + "path": current_path.duplicate(), + "color": _parse_color(stroke_style), + "line_width": line_width, + "line_cap": line_cap, + "line_join": line_join + } + canvas.draw_commands.append(cmd) + canvas.queue_redraw() + + func fill(): + if current_path.size() < 3: + return + + var cmd = { + "type": "fill_path", + "path": current_path.duplicate(), + "color": _parse_color(fill_style) + } + canvas.draw_commands.append(cmd) + canvas.queue_redraw() + + # Transformation functions + func save(): + transform_stack.append({ + "transform": current_transform, + "stroke_style": stroke_style, + "fill_style": fill_style, + "line_width": line_width, + "line_cap": line_cap, + "line_join": line_join, + "font": font, + "text_align": text_align, + "text_baseline": text_baseline + }) + + func restore(): + if transform_stack.size() > 0: + var state = transform_stack.pop_back() + current_transform = state.transform + stroke_style = state.stroke_style + fill_style = state.fill_style + line_width = state.line_width + line_cap = state.line_cap + line_join = state.line_join + font = state.font + text_align = state.text_align + text_baseline = state.text_baseline + + func translate(x: float, y: float): + current_transform = current_transform.translated(Vector2(x, y)) + + func rotate(angle: float): + var cos_a = cos(angle) + var sin_a = sin(angle) + var new_x = Vector2( + current_transform.x.x * cos_a - current_transform.x.y * sin_a, + current_transform.x.x * sin_a + current_transform.x.y * cos_a + ) + var new_y = Vector2( + current_transform.y.x * cos_a - current_transform.y.y * sin_a, + current_transform.y.x * sin_a + current_transform.y.y * cos_a + ) + current_transform = Transform2D(new_x, new_y, current_transform.origin) + + func scale(x: float, y: float): + current_transform = Transform2D( + current_transform.x * x, + current_transform.y * y, + current_transform.origin + ) + + # Advanced drawing functions + func quadraticCurveTo(cpx: float, cpy: float, x: float, y: float): + if current_path.is_empty(): + moveTo(0, 0) + + var start_point = current_path[current_path.size() - 1] + var control_point = current_transform * Vector2(cpx, cpy) + var end_point = current_transform * Vector2(x, y) + + # Approximate quadratic curve with line segments + var segments = 20 + for i in range(1, segments + 1): + var t = float(i) / segments + var point = start_point.lerp(control_point, t).lerp(control_point.lerp(end_point, t), t) + current_path.append(point) + + func bezierCurveTo(cp1x: float, cp1y: float, cp2x: float, cp2y: float, x: float, y: float): + if current_path.is_empty(): + moveTo(0, 0) + + var start_point = current_path[current_path.size() - 1] + var cp1 = current_transform * Vector2(cp1x, cp1y) + var cp2 = current_transform * Vector2(cp2x, cp2y) + var end_point = current_transform * Vector2(x, y) + + # Approximate cubic bezier with line segments + var segments = 20 + for i in range(1, segments + 1): + var t = float(i) / segments + var inv_t = 1.0 - t + var point = start_point * (inv_t * inv_t * inv_t) + \ + cp1 * (3 * inv_t * inv_t * t) + \ + cp2 * (3 * inv_t * t * t) + \ + end_point * (t * t * t) + current_path.append(point) + + # Style setters + func setFont(font_str: String): + font = font_str + + func setStrokeStyle(style: String): + stroke_style = style + + func setFillStyle(style: String): + fill_style = style + + func setLineWidth(width: float): + line_width = width + + func measureText(text: String) -> Dictionary: + var font_resource = ThemeDB.fallback_font + var font_size = _parse_font_size(font) + var text_size = font_resource.get_string_size(text, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size) + return {"width": text_size.x} + + func _parse_font_size(font_str: String) -> int: + var regex = RegEx.new() + regex.compile(r"(\d+)px") + var result = regex.search(font_str) + if result: + return int(result.get_string(1)) + return 16 + + func _parse_color(color_str: String) -> Color: + return ColorUtils.parse_color(color_str) + +class CanvasContextShader: + var canvas: HTMLCanvas + + func _init(canvas_ref: HTMLCanvas): + canvas = canvas_ref + + func source(shader_code: String): + var shader = Shader.new() + shader.code = shader_code + + var material = ShaderMaterial.new() + material.shader = shader + + canvas.material = material + +func init(element: HTMLParser.HTMLElement, _parser: HTMLParser): + canvas_element = element + parser = _parser + + var width_attr = element.get_attribute("width", "300") + var height_attr = element.get_attribute("height", "150") + + canvas_width = int(width_attr) + canvas_height = int(height_attr) + + custom_minimum_size = Vector2(canvas_width, canvas_height) + size = Vector2(canvas_width, canvas_height) + color = Color.TRANSPARENT + clip_contents = true + + parser.register_dom_node(element, self) + +func withContext(context_type: String): + match context_type: + "2d": + if context_2d == null: + context_2d = CanvasContext2D.new(self) + return context_2d + "shader": + if context_shader == null: + context_shader = CanvasContextShader.new(self) + return context_shader + _: + return null + +func _draw(): + draw_rect(Rect2(Vector2.ZERO, size), Color.TRANSPARENT) + + for cmd in draw_commands: + match cmd.type: + "fillRect": + var transform = cmd.get("transform", Transform2D.IDENTITY) + + if transform != Transform2D.IDENTITY: + var corners = PackedVector2Array([ + transform * Vector2(cmd.x, cmd.y), + transform * Vector2(cmd.x + cmd.width, cmd.y), + transform * Vector2(cmd.x + cmd.width, cmd.y + cmd.height), + transform * Vector2(cmd.x, cmd.y + cmd.height) + ]) + draw_colored_polygon(corners, cmd.color) + else: + var pos = Vector2(cmd.x, cmd.y) + var sz = Vector2(cmd.width, cmd.height) + draw_rect(Rect2(pos, sz), cmd.color) + "strokeRect": + var transform = cmd.get("transform", Transform2D.IDENTITY) + var stroke_width = cmd.get("stroke_width", 1.0) + + if transform != Transform2D.IDENTITY: + # Draw as stroke polygon for transformed rectangles + var corners = PackedVector2Array([ + transform * Vector2(cmd.x, cmd.y), + transform * Vector2(cmd.x + cmd.width, cmd.y), + transform * Vector2(cmd.x + cmd.width, cmd.y + cmd.height), + transform * Vector2(cmd.x, cmd.y + cmd.height), + transform * Vector2(cmd.x, cmd.y) # Close the path + ]) + for i in range(corners.size() - 1): + draw_line(corners[i], corners[i + 1], cmd.color, stroke_width) + else: + var pos = Vector2(cmd.x, cmd.y) + # Draw stroke as four rectangles + draw_rect(Rect2(pos.x, pos.y, cmd.width, stroke_width), cmd.color) + draw_rect(Rect2(pos.x, pos.y + cmd.height - stroke_width, cmd.width, stroke_width), cmd.color) + draw_rect(Rect2(pos.x, pos.y, stroke_width, cmd.height), cmd.color) + draw_rect(Rect2(pos.x + cmd.width - stroke_width, pos.y, stroke_width, cmd.height), cmd.color) + "clearRect": + # Clear a rectangular area by painting with background color + var clear_rect = Rect2(cmd.x, cmd.y, cmd.width, cmd.height) + # Most canvases have a white or light background - paint with that + draw_rect(clear_rect, Color.WHITE) + "circle": + var transform = cmd.get("transform", Transform2D.IDENTITY) + var center = transform * Vector2(cmd.x, cmd.y) + if cmd.filled: + draw_circle(center, cmd.radius, cmd.color) + else: + # For stroke circle, we need to draw a ring - approximated with arc segments + var segments = 32 + var points = PackedVector2Array() + for i in range(segments + 1): + var angle = (i * TAU) / segments + var point = Vector2(cmd.x + cos(angle) * cmd.radius, cmd.y + sin(angle) * cmd.radius) + points.append(transform * point) + if points.size() > 1: + for i in range(points.size() - 1): + draw_line(points[i], points[i + 1], cmd.color, 1.0) + "text": + var font = ThemeDB.fallback_font + var transform = cmd.get("transform", Transform2D.IDENTITY) + var pos = transform * Vector2(cmd.x, cmd.y) + var font_size = cmd.get("font_size", 16) + draw_string(font, pos, cmd.text, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, cmd.color) + "stroke_path": + var path = cmd.path + var clr = cmd.color + var line_width = cmd.get("line_width", 1.0) + if path.size() > 1: + for i in range(path.size() - 1): + draw_line(path[i], path[i + 1], clr, line_width) + "fill_path": + var path = cmd.path + var clr = cmd.color + if path.size() > 2: + draw_colored_polygon(path, clr) + +func clear(): + draw_commands.clear() + queue_redraw() diff --git a/flumi/Scripts/Tags/canvas.gd.uid b/flumi/Scripts/Tags/canvas.gd.uid new file mode 100644 index 0000000..c6bed2b --- /dev/null +++ b/flumi/Scripts/Tags/canvas.gd.uid @@ -0,0 +1 @@ +uid://08xpof853sfh diff --git a/flumi/Scripts/Utils/Lua/Canvas.gd b/flumi/Scripts/Utils/Lua/Canvas.gd new file mode 100644 index 0000000..6780790 --- /dev/null +++ b/flumi/Scripts/Utils/Lua/Canvas.gd @@ -0,0 +1,1020 @@ +class_name LuaCanvasUtils +extends RefCounted + +# This file mainly creates operations that are handled by canvas.gd + +static func emit_canvas_operation(lua_api: LuaAPI, operation: Dictionary) -> void: + lua_api.threaded_vm.call_deferred("_emit_dom_operation_request", operation) + +static func _element_withContext_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + vm.lua_pushnil() + return 1 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var context_type: String = vm.luaL_checkstring(2) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + vm.lua_getfield(1, "_tag_name") + var tag_name: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + # Only works on canvas elements + if tag_name != "canvas": + vm.lua_pushnil() + return 1 + + vm.lua_newtable() + vm.lua_pushstring(element_id) + vm.lua_setfield(-2, "_element_id") + vm.lua_pushstring(context_type) + vm.lua_setfield(-2, "_context_type") + + match context_type: + "2d": + add_2d_context_methods(vm, lua_api) + "shader": + add_shader_context_methods(vm, lua_api) + + return 1 + +static func add_2d_context_methods(vm: LuauVM, lua_api: LuaAPI): + vm.set_meta("lua_api", lua_api) + + # Basic drawing functions + vm.lua_pushcallable(_2d_fillRect_wrapper, "context.fillRect") + vm.lua_setfield(-2, "fillRect") + + vm.lua_pushcallable(_2d_strokeRect_wrapper, "context.strokeRect") + vm.lua_setfield(-2, "strokeRect") + + vm.lua_pushcallable(_2d_clearRect_wrapper, "context.clearRect") + vm.lua_setfield(-2, "clearRect") + + vm.lua_pushcallable(_2d_drawCircle_wrapper, "context.drawCircle") + vm.lua_setfield(-2, "drawCircle") + + vm.lua_pushcallable(_2d_drawText_wrapper, "context.drawText") + vm.lua_setfield(-2, "drawText") + + # Path-based drawing functions + vm.lua_pushcallable(_2d_beginPath_wrapper, "context.beginPath") + vm.lua_setfield(-2, "beginPath") + + vm.lua_pushcallable(_2d_closePath_wrapper, "context.closePath") + vm.lua_setfield(-2, "closePath") + + vm.lua_pushcallable(_2d_moveTo_wrapper, "context.moveTo") + vm.lua_setfield(-2, "moveTo") + + vm.lua_pushcallable(_2d_lineTo_wrapper, "context.lineTo") + vm.lua_setfield(-2, "lineTo") + + vm.lua_pushcallable(_2d_arc_wrapper, "context.arc") + vm.lua_setfield(-2, "arc") + + vm.lua_pushcallable(_2d_stroke_wrapper, "context.stroke") + vm.lua_setfield(-2, "stroke") + + vm.lua_pushcallable(_2d_fill_wrapper, "context.fill") + vm.lua_setfield(-2, "fill") + + # Transformation functions + vm.lua_pushcallable(_2d_save_wrapper, "context.save") + vm.lua_setfield(-2, "save") + + vm.lua_pushcallable(_2d_restore_wrapper, "context.restore") + vm.lua_setfield(-2, "restore") + + vm.lua_pushcallable(_2d_translate_wrapper, "context.translate") + vm.lua_setfield(-2, "translate") + + vm.lua_pushcallable(_2d_rotate_wrapper, "context.rotate") + vm.lua_setfield(-2, "rotate") + + vm.lua_pushcallable(_2d_scale_wrapper, "context.scale") + vm.lua_setfield(-2, "scale") + + # Advanced drawing functions + vm.lua_pushcallable(_2d_quadraticCurveTo_wrapper, "context.quadraticCurveTo") + vm.lua_setfield(-2, "quadraticCurveTo") + + vm.lua_pushcallable(_2d_bezierCurveTo_wrapper, "context.bezierCurveTo") + vm.lua_setfield(-2, "bezierCurveTo") + + # Style property setters + vm.lua_pushcallable(_2d_setStrokeStyle_wrapper, "context.setStrokeStyle") + vm.lua_setfield(-2, "setStrokeStyle") + + vm.lua_pushcallable(_2d_setFillStyle_wrapper, "context.setFillStyle") + vm.lua_setfield(-2, "setFillStyle") + + vm.lua_pushcallable(_2d_setLineWidth_wrapper, "context.setLineWidth") + vm.lua_setfield(-2, "setLineWidth") + + vm.lua_pushcallable(_2d_setFont_wrapper, "context.setFont") + vm.lua_setfield(-2, "setFont") + + # Text measurement + vm.lua_pushcallable(_2d_measureText_wrapper, "context.measureText") + vm.lua_setfield(-2, "measureText") + +static func add_shader_context_methods(vm: LuauVM, lua_api: LuaAPI): + vm.set_meta("lua_api", lua_api) + + vm.lua_pushcallable(_shader_source_wrapper, "context.source") + vm.lua_setfield(-2, "source") + +static func _2d_fillRect_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var x: float = vm.luaL_checknumber(2) + var y: float = vm.luaL_checknumber(3) + var width: float = vm.luaL_checknumber(4) + var height: float = vm.luaL_checknumber(5) + var color: String = "" + + if vm.lua_gettop() >= 6: + color = vm.luaL_checkstring(6) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_fillRect", + "element_id": element_id, + "x": x, + "y": y, + "width": width, + "height": height, + "color": color + } + + emit_canvas_operation(lua_api, operation) + + return 0 + +static func _2d_strokeRect_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var x: float = vm.luaL_checknumber(2) + var y: float = vm.luaL_checknumber(3) + var width: float = vm.luaL_checknumber(4) + var height: float = vm.luaL_checknumber(5) + var color: String = "" + var stroke_width: float = 0.0 + + if vm.lua_gettop() >= 6: + color = vm.luaL_checkstring(6) + if vm.lua_gettop() >= 7: + stroke_width = vm.luaL_checknumber(7) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_strokeRect", + "element_id": element_id, + "x": x, + "y": y, + "width": width, + "height": height, + "color": color, + "stroke_width": stroke_width + } + + emit_canvas_operation(lua_api, operation) + + return 0 + +static func _2d_clearRect_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var x: float = vm.luaL_checknumber(2) + var y: float = vm.luaL_checknumber(3) + var width: float = vm.luaL_checknumber(4) + var height: float = vm.luaL_checknumber(5) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_clearRect", + "element_id": element_id, + "x": x, + "y": y, + "width": width, + "height": height + } + + emit_canvas_operation(lua_api, operation) + + return 0 + +static func _2d_drawCircle_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var x: float = vm.luaL_checknumber(2) + var y: float = vm.luaL_checknumber(3) + var radius: float = vm.luaL_checknumber(4) + var color: String = "#000000" + var filled: bool = true + + if vm.lua_gettop() >= 5: + color = vm.luaL_checkstring(5) + if vm.lua_gettop() >= 6: + filled = vm.lua_toboolean(6) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_drawCircle", + "element_id": element_id, + "x": x, + "y": y, + "radius": radius, + "color": color, + "filled": filled + } + + emit_canvas_operation(lua_api, operation) + + return 0 + +static func _2d_drawText_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var x: float = vm.luaL_checknumber(2) + var y: float = vm.luaL_checknumber(3) + var text: String = vm.luaL_checkstring(4) + var font_name: String = "default" + var color: String = "#000000" + + if vm.lua_gettop() >= 5: + font_name = vm.luaL_checkstring(5) + if vm.lua_gettop() >= 6: + color = vm.luaL_checkstring(6) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_drawText", + "element_id": element_id, + "x": x, + "y": y, + "text": text, + "font_name": font_name, + "color": color + } + + emit_canvas_operation(lua_api, operation) + + return 0 + +static func _shader_source_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var shader_code: String = vm.luaL_checkstring(2) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_source", + "element_id": element_id, + "shader_code": shader_code + } + + emit_canvas_operation(lua_api, operation) + + return 0 + +# Path-based drawing wrappers +static func _2d_beginPath_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_beginPath", + "element_id": element_id + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_closePath_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_closePath", + "element_id": element_id + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_moveTo_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var x: float = vm.luaL_checknumber(2) + var y: float = vm.luaL_checknumber(3) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_moveTo", + "element_id": element_id, + "x": x, + "y": y + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_lineTo_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var x: float = vm.luaL_checknumber(2) + var y: float = vm.luaL_checknumber(3) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_lineTo", + "element_id": element_id, + "x": x, + "y": y + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_arc_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var x: float = vm.luaL_checknumber(2) + var y: float = vm.luaL_checknumber(3) + var radius: float = vm.luaL_checknumber(4) + var start_angle: float = vm.luaL_checknumber(5) + var end_angle: float = vm.luaL_checknumber(6) + var counterclockwise: bool = false + + if vm.lua_gettop() >= 7: + counterclockwise = vm.lua_toboolean(7) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_arc", + "element_id": element_id, + "x": x, + "y": y, + "radius": radius, + "start_angle": start_angle, + "end_angle": end_angle, + "counterclockwise": counterclockwise + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_stroke_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_stroke", + "element_id": element_id + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_fill_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_fill", + "element_id": element_id + } + + emit_canvas_operation(lua_api, operation) + return 0 + +# Transformation wrappers +static func _2d_save_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_save", + "element_id": element_id + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_restore_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_restore", + "element_id": element_id + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_translate_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var x: float = vm.luaL_checknumber(2) + var y: float = vm.luaL_checknumber(3) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_translate", + "element_id": element_id, + "x": x, + "y": y + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_rotate_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var angle: float = vm.luaL_checknumber(2) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_rotate", + "element_id": element_id, + "angle": angle + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_scale_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var x: float = vm.luaL_checknumber(2) + var y: float = vm.luaL_checknumber(3) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_scale", + "element_id": element_id, + "x": x, + "y": y + } + + emit_canvas_operation(lua_api, operation) + return 0 + +# Advanced drawing wrappers +static func _2d_quadraticCurveTo_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var cpx: float = vm.luaL_checknumber(2) + var cpy: float = vm.luaL_checknumber(3) + var x: float = vm.luaL_checknumber(4) + var y: float = vm.luaL_checknumber(5) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_quadraticCurveTo", + "element_id": element_id, + "cpx": cpx, + "cpy": cpy, + "x": x, + "y": y + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_bezierCurveTo_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var cp1x: float = vm.luaL_checknumber(2) + var cp1y: float = vm.luaL_checknumber(3) + var cp2x: float = vm.luaL_checknumber(4) + var cp2y: float = vm.luaL_checknumber(5) + var x: float = vm.luaL_checknumber(6) + var y: float = vm.luaL_checknumber(7) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_bezierCurveTo", + "element_id": element_id, + "cp1x": cp1x, + "cp1y": cp1y, + "cp2x": cp2x, + "cp2y": cp2y, + "x": x, + "y": y + } + + emit_canvas_operation(lua_api, operation) + return 0 + +# Style property wrappers +static func _2d_setStrokeStyle_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var style: String = vm.luaL_checkstring(2) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_setStrokeStyle", + "element_id": element_id, + "style": style + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_setFillStyle_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var style: String = vm.luaL_checkstring(2) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_setFillStyle", + "element_id": element_id, + "style": style + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_setLineWidth_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var width: float = vm.luaL_checknumber(2) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_setLineWidth", + "element_id": element_id, + "width": width + } + + emit_canvas_operation(lua_api, operation) + return 0 + +static func _2d_setFont_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var font: String = vm.luaL_checkstring(2) + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + var operation = { + "type": "canvas_setFont", + "element_id": element_id, + "font": font + } + + emit_canvas_operation(lua_api, operation) + return 0 + +# TODO: should probably cache and async this, could lag otherwise if called looped +static func _2d_measureText_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + vm.lua_pushnil() + return 1 + + vm.luaL_checktype(1, vm.LUA_TTABLE) + var text: String = vm.luaL_checkstring(2) + + vm.lua_getfield(1, "_element_id") + var element_id = vm.lua_tostring(-1) + vm.lua_pop(1) + + var dom_parser = lua_api.dom_parser + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + var actual_width = text.length() * 10 # Fallback estimate + + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context and context.has_method("measureText"): + var metrics = context.measureText(text) + if metrics and metrics.has("width"): + actual_width = metrics.width + + vm.lua_newtable() + vm.lua_pushnumber(actual_width) + vm.lua_setfield(-2, "width") + + return 1 + +static func handle_canvas_fillRect(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var x: float = operation.x + var y: float = operation.y + var width: float = operation.width + var height: float = operation.height + var color: String = operation.color + + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.fillRect(x, y, width, height, color) + +static func handle_canvas_strokeRect(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var x: float = operation.x + var y: float = operation.y + var width: float = operation.width + var height: float = operation.height + var color: String = operation.color + var stroke_width: float = operation.get("stroke_width", 1.0) + + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.strokeRect(x, y, width, height, color, stroke_width) + +static func handle_canvas_clearRect(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var x: float = operation.x + var y: float = operation.y + var width: float = operation.width + var height: float = operation.height + + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.clearRect(x, y, width, height) + +static func handle_canvas_drawCircle(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var x: float = operation.x + var y: float = operation.y + var radius: float = operation.radius + var color: String = operation.color + var filled: bool = operation.get("filled", true) + + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.drawCircle(x, y, radius, color, filled) + +static func handle_canvas_drawText(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var x: float = operation.x + var y: float = operation.y + var text: String = operation.text + var color: String = operation.color + + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.drawText(x, y, text, color) + +static func handle_canvas_source(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var shader_code: String = operation.shader_code + + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("shader") + if context: + context.source(shader_code) + +static func handle_canvas_beginPath(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.beginPath() + +static func handle_canvas_closePath(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.closePath() + +static func handle_canvas_moveTo(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var x: float = operation.x + var y: float = operation.y + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.moveTo(x, y) + +static func handle_canvas_lineTo(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var x: float = operation.x + var y: float = operation.y + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.lineTo(x, y) + +static func handle_canvas_arc(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var x: float = operation.x + var y: float = operation.y + var radius: float = operation.radius + var start_angle: float = operation.start_angle + var end_angle: float = operation.end_angle + var counterclockwise: bool = operation.get("counterclockwise", false) + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.arc(x, y, radius, start_angle, end_angle, counterclockwise) + +static func handle_canvas_stroke(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.stroke() + +static func handle_canvas_fill(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.fill() + +static func handle_canvas_save(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.save() + +static func handle_canvas_restore(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.restore() + +static func handle_canvas_translate(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var x: float = operation.x + var y: float = operation.y + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.translate(x, y) + +static func handle_canvas_rotate(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var angle: float = operation.angle + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.rotate(angle) + +static func handle_canvas_scale(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var x: float = operation.x + var y: float = operation.y + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.scale(x, y) + +static func handle_canvas_quadraticCurveTo(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var cpx: float = operation.cpx + var cpy: float = operation.cpy + var x: float = operation.x + var y: float = operation.y + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.quadraticCurveTo(cpx, cpy, x, y) + +static func handle_canvas_bezierCurveTo(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var cp1x: float = operation.cp1x + var cp1y: float = operation.cp1y + var cp2x: float = operation.cp2x + var cp2y: float = operation.cp2y + var x: float = operation.x + var y: float = operation.y + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) + +static func handle_canvas_setStrokeStyle(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var style: String = operation.style + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.stroke_style = style + +static func handle_canvas_setFillStyle(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var style: String = operation.style + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.fill_style = style + +static func handle_canvas_setLineWidth(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var width: float = operation.width + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.line_width = width + +static func handle_canvas_setFont(operation: Dictionary, dom_parser: HTMLParser) -> void: + var element_id: String = operation.element_id + var font: String = operation.font + var dom_node = get_canvas_node_main_thread(dom_parser, element_id) + if dom_node and dom_node.has_method("withContext"): + var context = dom_node.withContext("2d") + if context: + context.font = font + +static func get_canvas_node_main_thread(dom_parser: HTMLParser, element_id: String) -> Node: + var dom_node = dom_parser.parse_result.dom_nodes.get(element_id, null) + if not dom_node: + return null + + if dom_node is MarginContainer and dom_node.get_child_count() > 0: + dom_node = dom_node.get_child(0) + + return dom_node diff --git a/flumi/Scripts/Utils/Lua/Canvas.gd.uid b/flumi/Scripts/Utils/Lua/Canvas.gd.uid new file mode 100644 index 0000000..b6f1b7d --- /dev/null +++ b/flumi/Scripts/Utils/Lua/Canvas.gd.uid @@ -0,0 +1 @@ +uid://cyngvqm6wghoh diff --git a/flumi/Scripts/Utils/Lua/DOM.gd b/flumi/Scripts/Utils/Lua/DOM.gd index acb2045..2197d70 100644 --- a/flumi/Scripts/Utils/Lua/DOM.gd +++ b/flumi/Scripts/Utils/Lua/DOM.gd @@ -645,6 +645,9 @@ static func add_element_methods(vm: LuauVM, lua_api: LuaAPI) -> void: vm.lua_pushcallable(LuaDOMUtils._element_unfocus_wrapper, "element.unfocus") vm.lua_setfield(-2, "unfocus") + vm.lua_pushcallable(LuaCanvasUtils._element_withContext_wrapper, "element.withContext") + vm.lua_setfield(-2, "withContext") + add_classlist_support(vm) vm.lua_newtable() diff --git a/flumi/Scripts/main.gd b/flumi/Scripts/main.gd index 6982339..532b2f3 100644 --- a/flumi/Scripts/main.gd +++ b/flumi/Scripts/main.gd @@ -30,6 +30,7 @@ const TEXTAREA = preload("res://Scenes/Tags/textarea.tscn") const DIV = preload("res://Scenes/Tags/div.tscn") const AUDIO = preload("res://Scenes/Tags/audio.tscn") const POSTPROCESS = preload("res://Scenes/Tags/postprocess.tscn") +const CANVAS = preload("res://Scenes/Tags/canvas.tscn") const MIN_SIZE = Vector2i(750, 200) @@ -324,7 +325,7 @@ func render_content(html_bytes: PackedByteArray) -> void: if element_node: # Input elements register their own DOM nodes in their init() function - if element.tag_name not in ["input", "textarea", "select", "button", "audio"]: + if element.tag_name not in ["input", "textarea", "select", "button", "audio", "canvas"]: parser.register_dom_node(element, element_node) # ul/ol handle their own adding @@ -606,6 +607,9 @@ func create_element_node_internal(element: HTMLParser.HTMLElement, parser: HTMLP "audio": node = AUDIO.instantiate() node.init(element, parser) + "canvas": + node = CANVAS.instantiate() + node.init(element, parser) "div": var styles = parser.get_element_styles_with_inheritance(element, "", []) var hover_styles = parser.get_element_styles_with_inheritance(element, "hover", []) diff --git a/tests/canvas.html b/tests/canvas.html new file mode 100644 index 0000000..f6f906e --- /dev/null +++ b/tests/canvas.html @@ -0,0 +1,363 @@ + + Complete Canvas API Test - GURT Browser + + + + + + + + + + +