From ca04f8db4dec4f3e3b88da15f884e6bf82a5a2ba Mon Sep 17 00:00:00 2001 From: Vince Date: Fri, 31 Aug 2012 10:45:07 +0200 Subject: [PATCH] Tool plugin architecture with eraser/pen/paintbucket tools. --- css/style.css | 66 +++++++++++- img/tools/.DS_Store | Bin 0 -> 6148 bytes img/tools/eraser.png | Bin 0 -> 774 bytes img/tools/paint-bucket.png | Bin 0 -> 50690 bytes img/tools/pen.png | Bin 0 -> 48235 bytes index.html | 25 ++++- js/Constants.js | 3 + js/Events.js | 6 ++ js/ToolSelector.js | 84 +++++++++++++++ js/drawingtools/BaseTool.js | 39 +++++++ js/drawingtools/Eraser.js | 38 +++++++ js/drawingtools/PaintBucket.js | 158 ++++++++++++++++++++++++++++ js/drawingtools/SimplePen.js | 41 ++++++++ js/frameSheetModel.js | 11 ++ js/lib/.DS_Store | Bin 0 -> 6148 bytes js/lib/jsColor_1_4_0/.DS_Store | Bin 0 -> 6148 bytes js/lib/pubsub.js | 6 +- js/piskel.js | 177 ++++++++++++++++++-------------- js/utils.js | 45 ++++++++ resources/cursors-resources.jpg | Bin 0 -> 11562 bytes 20 files changed, 614 insertions(+), 85 deletions(-) create mode 100644 img/tools/.DS_Store create mode 100644 img/tools/eraser.png create mode 100644 img/tools/paint-bucket.png create mode 100644 img/tools/pen.png create mode 100644 js/Constants.js create mode 100644 js/Events.js create mode 100644 js/ToolSelector.js create mode 100644 js/drawingtools/BaseTool.js create mode 100644 js/drawingtools/Eraser.js create mode 100644 js/drawingtools/PaintBucket.js create mode 100644 js/drawingtools/SimplePen.js create mode 100644 js/lib/.DS_Store create mode 100644 js/lib/jsColor_1_4_0/.DS_Store create mode 100644 js/utils.js create mode 100644 resources/cursors-resources.jpg diff --git a/css/style.css b/css/style.css index d9011854..5990a1a7 100644 --- a/css/style.css +++ b/css/style.css @@ -127,6 +127,26 @@ ul, li { z-index: 1; } +.drawing-canvas-container { + float: left; +} + +.tool-paint-bucket .drawing-canvas-container:hover { + cursor: url(../img/tools/paint-bucket.png) 18 17, pointer; +} + +.tool-pen .drawing-canvas-container:hover { + cursor: url(../img/tools/pen.png) 7 21, pointer; +} + +.tool-eraser .drawing-canvas-container:hover { + cursor: url(../img/tools/eraser.png) 5 21, pointer; +} + +/** + * Tool section: + */ + #palette li { display : inline-block; height : 20px; @@ -134,11 +154,55 @@ ul, li { margin : 5px; } +.tools-container { + float: left; +} + +.tools-container .tool-icon { + display: block; + float: left; + margin-right: 2px; +} + +.tool-icon { + width: 30px; + height: 30px; + border: 5px solid #fff; +} + +.tool-icon:hover { + border-color: #; +} + +.tool-icon:hover { + cursor: pointer; + border: 5px solid #eee; +} + +.tool-icon.selected { + cursor: auto; + border: 5px solid #ddd; +} + +.tool-icon.tool-pen { + background: #fff url(../img/tools/pen.png) 3px 3px no-repeat; +} + +.tool-icon.tool-paint-bucket { + background: #fff url(../img/tools/paint-bucket.png) 3px 3px no-repeat; +} + +.tool-icon.tool-eraser { + background: #fff url(../img/tools/eraser.png) 3px 3px no-repeat; +} + #preview-fps { width : 200px; } -/* User messages */ +/** + * User messages + */ .user-message { position: fixed; bottom: 0; diff --git a/img/tools/.DS_Store b/img/tools/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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

-
+
- -
    -
+
+
+
+
+ +
    +
    @@ -42,9 +46,20 @@
    - + + + + + + + + + + + + diff --git a/js/Constants.js b/js/Constants.js new file mode 100644 index 00000000..abd47a36 --- /dev/null +++ b/js/Constants.js @@ -0,0 +1,3 @@ +var Constants = { + TRANSPARENT_COLOR : "tc" +}; \ No newline at end of file diff --git a/js/Events.js b/js/Events.js new file mode 100644 index 00000000..a5cbfd7f --- /dev/null +++ b/js/Events.js @@ -0,0 +1,6 @@ +Events = { + + TOOL_SELECTED : "TOOL_SELECTED", + CANVAS_RIGHT_CLICKED: "CANVAS_RIGHT_CLICKED", + CANVAS_RIGHT_CLICK_RELEASED: "CANVAS_RIGHT_CLICK_RELEASED" +}; \ No newline at end of file diff --git a/js/ToolSelector.js b/js/ToolSelector.js new file mode 100644 index 00000000..45bae855 --- /dev/null +++ b/js/ToolSelector.js @@ -0,0 +1,84 @@ +/* + * @provide pskl.ToolSelector + * + * @require Constants + * @require Events + * @require pskl.drawingtools + */ + +pskl.ToolSelector = (function() { + + var toolInstances = { + "simplePen" : new pskl.drawingtools.SimplePen(), + "eraser" : new pskl.drawingtools.Eraser(), + "paintBucket" : new pskl.drawingtools.PaintBucket() + }; + var currentSelectedTool = toolInstances.simplePen; + var previousSelectedTool = toolInstances.simplePen; + + var selectTool_ = function(tool) { + + var maincontainer = $("body"); + var previousSelectedToolClass = maincontainer.data("selected-tool-class"); + if(previousSelectedToolClass) { + maincontainer.removeClass(previousSelectedToolClass); + } + maincontainer.addClass(toolBehavior.toolId); + $("#drawing-canvas-container").data("selected-tool-class", toolBehavior.toolId); + }; + + var activateToolOnStage_ = function(tool) { + var stage = $("body"); + var previousSelectedToolClass = stage.data("selected-tool-class"); + if(previousSelectedToolClass) { + stage.removeClass(previousSelectedToolClass); + } + stage.addClass(tool.toolId); + stage.data("selected-tool-class", tool.toolId); + }; + + var selectTool_ = function(tool) { + console.log("Selecting Tool:" , currentSelectedTool); + currentSelectedTool = tool; + activateToolOnStage_(currentSelectedTool); + $.publish(Events.TOOL_SELECTED, [tool]); + }; + + var onToolIconClicked_ = function(evt) { + var target = $(evt.target); + var clickedTool = target.closest(".tool-icon"); + + if(clickedTool.length) { + for(var tool in toolInstances) { + if (toolInstances[tool].toolId == clickedTool.data()["toolId"]) { + selectTool_(toolInstances[tool]); + + // Show tool as selected: + $("#tools-container .tool-icon.selected").removeClass("selected"); + clickedTool.addClass("selected"); + } + } + } + }; + + return { + init: function() { + $.subscribe(Events.CANVAS_RIGHT_CLICKED, function() { + previousSelectedTool = currentSelectedTool; + currentSelectedTool = toolInstances.eraser; + $.publish(Events.TOOL_SELECTED, [currentSelectedTool]); + }); + + $.subscribe(Events.CANVAS_RIGHT_CLICK_RELEASED, function() { + currentSelectedTool = previousSelectedTool; + $.publish(Events.TOOL_SELECTED, [currentSelectedTool]); + }); + + // Set SimplePen as default selected tool: + selectTool_(toolInstances.simplePen); + + // Activate listener on tool panel: + $("#tools-container").click(onToolIconClicked_); + } + }; +})() \ No newline at end of file diff --git a/js/drawingtools/BaseTool.js b/js/drawingtools/BaseTool.js new file mode 100644 index 00000000..cd102510 --- /dev/null +++ b/js/drawingtools/BaseTool.js @@ -0,0 +1,39 @@ +/* + * @provide pskl.drawingtools.BaseTool + * + * @require pskl.utils + */ +(function() { + var ns = $.namespace("pskl.drawingtools"); + + ns.BaseTool = function() {}; + + ns.BaseTool.prototype.applyToolOnFrameAt = function(col, row, frame, color) {}; + + ns.BaseTool.prototype.applyToolOnCanvasAt = function(col, row, canvas, color, dpi) {}; + + ns.BaseTool.prototype.releaseToolAt = function() {}; + + ns.BaseTool.prototype.drawPixelInCanvas = function (col, row, canvas, color, dpi) { + var context = canvas.getContext('2d'); + if(color == undefined || color == Constants.TRANSPARENT_COLOR) { + context.clearRect(col * dpi, row * dpi, dpi, dpi); + } + else { + // TODO(vincz): Remove this global access to piskel when Palette component is created. + piskel.addColorToPalette(color); + context.fillStyle = color; + context.fillRect(col * dpi, row * dpi, dpi, dpi); + } + }; + + ns.BaseTool.prototype.drawFrameInCanvas = function (frame, canvas, dpi) { + var color; + for(var col = 0, num_col = frame.length; col < num_col; col++) { + for(var row = 0, num_row = frame[col].length; row < num_row; row++) { + color = pskl.utils.normalizeColor(frame[col][row]); + this.drawPixelInCanvas(col, row,canvas, color, dpi); + } + } + }; +})(); diff --git a/js/drawingtools/Eraser.js b/js/drawingtools/Eraser.js new file mode 100644 index 00000000..c6592c38 --- /dev/null +++ b/js/drawingtools/Eraser.js @@ -0,0 +1,38 @@ +/* + * @provide pskl.drawingtools.Eraser + * + * @require Constants + * @require pskl.utils + */ + (function() { + var ns = $.namespace("pskl.drawingtools"); + + ns.Eraser = function() { + this.toolId = "tool-eraser"; + }; + + pskl.utils.inherit(ns.Eraser, ns.BaseTool); + + /** + * @override + */ + ns.Eraser.prototype.applyToolOnFrameAt = function(col, row, frame, color) { + frame[col][row] = Constants.TRANSPARENT_COLOR; + }; + + /** + * @override + */ + ns.Eraser.prototype.applyToolOnCanvasAt = function(col, row, canvas, frame, color, dpi) { + + this.drawPixelInCanvas(col, row, canvas, Constants.TRANSPARENT_COLOR, dpi); + }; + + /** + * @override + */ + ns.Eraser.prototype.releaseToolAt = function() { + // Do nothing + console.log('Eraser release'); + }; +})(); \ No newline at end of file diff --git a/js/drawingtools/PaintBucket.js b/js/drawingtools/PaintBucket.js new file mode 100644 index 00000000..0a55d411 --- /dev/null +++ b/js/drawingtools/PaintBucket.js @@ -0,0 +1,158 @@ +/* + * @provide pskl.drawingtools.PaintBucket + * + * @require pskl.utils + */ +(function() { + var ns = $.namespace("pskl.drawingtools"); + + ns.PaintBucket = function() { + this.toolId = "tool-paint-bucket" + }; + + pskl.utils.inherit(ns.PaintBucket, ns.BaseTool); + + /** + * @override + */ + ns.PaintBucket.prototype.applyToolOnFrameAt = function(col, row, frame, color) {}; + + /** + * @override + */ + ns.PaintBucket.prototype.applyToolOnCanvasAt = function(col, row, canvas, frame, replacementColor, dpi) { + + var targetColor = pskl.utils.normalizeColor(frame[col][row]); + //this.recursiveFloodFill(frame, col, row, targetColor, replacementColor); + this.queueLinearFloodFill(frame, col, row, targetColor, replacementColor); + this.drawFrameInCanvas(frame, canvas, dpi); + }; + + /** + * @override + */ + ns.PaintBucket.prototype.releaseToolAt = function() { + // Do nothing + console.log('PaintBucket release'); + }; + + /** + * Flood-fill (node, target-color, replacement-color): + 1. Set Q to the empty queue. + 2. If the color of node is not equal to target-color, return. + 3. Add node to Q. + 4. For each element n of Q: + 5. If the color of n is equal to target-color: + 6. Set w and e equal to n. + 7. Move w to the west until the color of the node to the west of w no longer matches target-color. + 8. Move e to the east until the color of the node to the east of e no longer matches target-color. + 9. Set the color of nodes between w and e to replacement-color. + 10. For each node n between w and e: + 11. If the color of the node to the north of n is target-color, add that node to Q. + 12. If the color of the node to the south of n is target-color, add that node to Q. + 13. Continue looping until Q is exhausted. + 14. Return. + */ + ns.PaintBucket.prototype.queueLinearFloodFill = function(frame, col, row, targetColor, replacementColor) { + + var queue = []; + var dy = [-1, 0, 1, 0]; + var dx = [0, 1, 0, -1]; + + try { + if(frame[col][row] == replacementColor) { + return; + } + } catch(e) { + // Frame out of bound exception. + } + + var isInFrameBound = function(frame_, col_, row_) { + if( col_ < 0 || + col_ >= frame_.length || + row_ < 0 || + row_ >= frame_[0].length) { + return false; + } + return true; + } + + queue.push({"col": col, "row": row}); + var loopCount = 0; + var cellCount = frame.length * frame[0].length; + while(queue.length > 0) { + loopCount ++; + + var currentItem = queue.pop(); + frame[currentItem.col][currentItem.row] = replacementColor; + + for (var i = 0; i < 4; i++) { + var nextCol = currentItem.col + dx[i] + var nextRow = currentItem.row + dy[i] + try { + if (isInFrameBound(frame, nextCol, nextRow) && frame[nextCol][nextRow] == targetColor) { + queue.push({"col": nextCol, "row": nextRow }); + } + } catch(e) { + // Frame out of bound exception. + } + } + + // Security loop breaker: + if(loopCount > 10 * cellCount) { + console.log("loop breaker called") + break; + } + } + } + + /** + * Basic Flood-fill implementation (Stack explosion !): + * Flood-fill (node, target-color, replacement-color): + * 1. If the color of node is not equal to target-color, return. + * 2. Set the color of node to replacement-color. + * 3. Perform Flood-fill (one step to the west of node, target-color, replacement-color). + * Perform Flood-fill (one step to the east of node, target-color, replacement-color). + * Perform Flood-fill (one step to the north of node, target-color, replacement-color). + * Perform Flood-fill (one step to the south of node, target-color, replacement-color). + * 4. Return. + * + * @private + */ + ns.PaintBucket.prototype.recursiveFloodFill = function(frame, col, row, targetColor, replacementColor) { + + // Step 1: + if( col < 0 || + col >= frame.length || + row < 0 || + row >= frame[0].length || + frame[col][row] != targetColor) { + return; + } + + // Step 2: + frame[col][row] = replacementColor; + + //Step 3: + this.simpleFloodFill(frame, col - 1, row, targetColor, replacementColor); + this.simpleFloodFill(frame, col + 1, row, targetColor, replacementColor); + this.simpleFloodFill(frame, col, row - 1, targetColor, replacementColor); + this.simpleFloodFill(frame, col, row + 1, targetColor, replacementColor); + + return; + }; + +})(); + + + + + + + + + + + + + diff --git a/js/drawingtools/SimplePen.js b/js/drawingtools/SimplePen.js new file mode 100644 index 00000000..c21c1cc1 --- /dev/null +++ b/js/drawingtools/SimplePen.js @@ -0,0 +1,41 @@ +/* + * @provide pskl.drawingtools.SimplePen + * + * @require pskl.utils + */ +(function() { + var ns = $.namespace("pskl.drawingtools"); + + ns.SimplePen = function() { + this.toolId = "tool-pen" + }; + + pskl.utils.inherit(ns.SimplePen, ns.BaseTool); + + /** + * @override + */ + ns.SimplePen.prototype.applyToolOnFrameAt = function(col, row, frame, color) { + var color = pskl.utils.normalizeColor(color); + if (color != frame[col][row]) { + frame[col][row] = color; + } + }; + + /** + * @override + */ + ns.SimplePen.prototype.applyToolOnCanvasAt = function(col, row, canvas, frame, color, dpi) { + + this.drawPixelInCanvas(col, row, canvas, color, dpi); + }; + + /** + * @override + */ + ns.SimplePen.prototype.releaseToolAt = function() { + // Do nothing + console.log('SimplePen release'); + }; + +})(); diff --git a/js/frameSheetModel.js b/js/frameSheetModel.js index f6d215e3..20f2544c 100644 --- a/js/frameSheetModel.js +++ b/js/frameSheetModel.js @@ -1,3 +1,4 @@ + var FrameSheetModel = (function() { var inst; @@ -5,12 +6,22 @@ var FrameSheetModel = (function() { var width; var height; + /** + * @private + */ var createEmptyFrame_ = function() { var emptyFrame = new Array(width); for (var columnIndex=0; columnIndex < width; columnIndex++) { emptyFrame[columnIndex] = new Array(height); } return emptyFrame; + }; + + /** + * @private + */ + var requestLocalStorageSave_ = function() { + }; return { diff --git a/js/lib/.DS_Store b/js/lib/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7fdcaf84ac5fb71c500ddbe135ef18efeff5f6b6 GIT binary patch literal 6148 zcmeHK%}T>S5T0$Trv5-LLXV5*A_-R7gNINncob6T!Aebt*hpwfliEYA2A{w;@ojt_ zXLh$@sR~{M%M8qZli8VF=G(A803ceE&;h6bfQ3p}C}Z=5P(SI46pV*Zs4-$lU<`e5 zP+9&11GIK~a0e-z;@W*)zdEj=9Zb_v5GMgfy#}K=N;BJj6NO@FV{^;0wyoV>HyVb? zw3SSTVS4EelBpMkH-SICQg-HNleFcJRnLW=4X{Vqog|6T?wROr6lQ~dr8=8APO~PD z8}_^=XN`tkll7zKd|obF<;sh-e{gtm-tiyik59Q~SKyDQWY6FNp3(TBuzPPjjFaIl zMlD8IWHK@X%m6d6_6(Sf&)Ql0O1VI0fEoBL1GGO#R6^Hau2F3r*wFQn`b&f)XwzGQ zP#Sa%<{GgFMd(ySohr-|L+Et$OB3fB%r)wC5Nc)|$IL9u3q`2e(Jxgv2v;Mw%m6d6 z%s^3pR_Odc`~LmEoWx(u05h;w42V+OYqzi@bGEJ&M`x`>y+$RWxLo5$3L5Gt##lOv ctEfuQFUdf34dxorgTfa9MFTg?z@IYk4qN$4pa1{> literal 0 HcmV?d00001 diff --git a/js/lib/jsColor_1_4_0/.DS_Store b/js/lib/jsColor_1_4_0/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..56a8035955ecc083e4f7c13c9beafb2922670ffd GIT binary patch literal 6148 zcmeHKOHRWu5PdFH)xxGrmRYi@#0{dVAax5DfTmDDfuNSpHpk#l9Dv)voAIdR*DXTT zOf`P?c%JP%S8)s=OkbC$z!<=gF4!Bf=rHLQZ&}YG17grI-Z8-n_qd(st!xkcM+Ic> zM!3eBzXFy0E3!piEZ8f5jdS|Rw;F50$TWY0&F_xa7@sZ15;u6{924B(g|&R1R~g}= z!5A=4Mt{Z=R*l@Rj@-BITwVJ|W$lM};J6uAlGE2@vE3M7)>7rL>E;T!0m+Zv0Uz%h{BVWM^yZ;pD7M=vQ 255 || g > 255 || b > 255) + throw "Invalid color component"; + return ((r << 16) | (g << 8) | b).toString(16); + }; + + ns.normalizeColor = function (color) { + if(color == undefined || color == Constants.TRANSPARENT_COLOR || color.indexOf("#") == 0) { + return color; + } else { + return "#" + color; + } + }; + + ns.inherit = function(extendedObject, inheritFrom) { + extendedObject.prototype = Object.create(inheritFrom.prototype); + extendedObject.prototype.constructor = extendedObject; + //pskl.ToolBehavior.Eraser.prototype = Object.create(pskl.ToolBehavior.BaseTool.prototype); + //prototypeskl.ToolBehavior.Eraser.prototype.constructor = pskl.ToolBehavior.Eraser; + }; + +})() + diff --git a/resources/cursors-resources.jpg b/resources/cursors-resources.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb47c0fa8752b0f45164de0ead5d83ec9d9c380f GIT binary patch literal 11562 zcmd^kbx>T*o9^K5!FA9;aJS%+;0eLq-Ccr1fZ*;P+}%C64+I?u4uiV{xg`01yLJEB z-Kx9y)>hr;)agFeXQt2F@;>j=-OmfpKLMCBQtzbzP|yH?@yi8xJ_KM%xENV^0H6S{ zfZv6H=VJi6sIi@)3Bb7fr3C7E84v`3`mY1}-vRS)_~-A?P*5*#U+#Z<@n3y-?gn5X zLTN!^!9ZaFps}D}u%Mp%0SPZ=!$AGMUo8C#1VkiccqkaSmrwo1zlwk7&@fQ2m;fkP z7yuLuEEE(BA`%<`01tqLLwI?HeuayK6OV_Fg$<-4pk$|}p>-!jW{b_GQ=8{aXdXm6l8|Q_&@k_3t-EQF!S~M!4T&io2sN2Ih0HJ5e~TDpRsspHAp0 z(~;#dtyb+n6)xBKr72TS0Z2yZX(Wggn06sGKM z+AUxu%(})Pyw+`+F>}kmY89$Fi)=lMsUAZ73&9ct{bI}#!s%%eM16H*)SeIi{-64w z&K$5Du8DUL!;laQd8)$$$OFO+T9)T4Z!ByVJ2Q@!GmHpFFkobyNfBl!PbNHOj*F|N zQt}WeYYSg}OTf288NjKH3`_Oqeh9)d^kgdk#oIDqdtJBOHS5mvxyaVxQNYCv$Vu@B z!IfnNnh|&gZ}|tjiz5pBbKYvG!E!~$*B%S7f8^IRB&sW4r`eX?$Wjyx_w%B@+DeE} z-}`x}9r5rG@$NycypDAj5g|!HAhD7>sx$?sP@hgfH~qGxW3Q+1dxK7~boYr4;%)>y zMAN3*+cflocf?`Tk|as{eAz!aoXyCv1NkA@O7vXw$G2ECsoUl|S=>9)$h|2?qA0Hn z{;DWuq%^Hkz9r*E?kNKuoJIydVxoAwX30E5=)+KKo2$#th-0%NscXkrMJ_Xig@^Al zBO%p)niXAM#@|pFNL!xn*^O9cm3snDW^C5TrcJ=B^wh#f%Q~G-Clh9Dq`%QlZEDQP z3Cdh<_i2l~Z!qGUOk#@}UUafz=?LYk%lEh_;p0v&vO2ErpyDGIebix_uIqSfKIg(? zYz?m#v5_6mXcNCeuy)VFe@+rjw-Sy&2n>dk=OM7OZwQaq7`#t(R zZc1~(PhN>6(QQw9^!Ll{Xy)g%)Oi($38A7BKNlc;dYM0D~x6H6$!@-h8< z-I$P=Xz6zb1zU7oq1ZuuTMm}4sxI>Z>ux8^pFWVONAFV!py~&tw`b!tUQBjg=)INY zaL7Jy=ZJVx@q!&232zDqmweL~VOJ zRHnvKFg|JTYcAopLA;1B(DHa4krtJ}b&uV%R>Bf|*gaY72h5rL(O=QdMSepx$<@Yc zp&mC(EBMTRTa8@SSx;K?d{^m4m_y?cu$wl*nD#5L)pERkAww;bO~US?gz@X4PQE-V zby`z%7(?5SwA ztjb1LH_(kHrLfTGUq80ls5D(8KE~5Es$P71dnB*EU&Hpdk16tLyyf%zs}t(7@9m0i z@20mNrfoubBql(nTs0075Ak7(?C;V7OZRn?O7>gsdRtP%hHnxNdA$N13FpuI7t>=e zE0;o)HN1ycgz?|Tlg?=qOgtUyazifeb1)itefnEvZM6oP1)RsYQxFe)T$@|@dy;^O zW9o;3f(}mXdD*7E$w1?vcGKY*Xtig)#C8ViZ`;&!S-(nF~;q+^0_Pw!2`+YTO3_Z*`%#p4JZnK z`z@eCFZsQSiq#p#>tBfYF^_bh@6NfSB}ui+1^Mt4?t_({H0kR$lyVCHnVZ+{%|w=b&PhVL`%3$bqLhVw=HhjDg!L0|eOda{rMn@Tfn?FW~LhnL5mz zIx^qVtLh{onCS|p*mG|;(rg0zEv1_LiODJxd?xQ)h{qM6&2Q32hn_-qaML4i9pzgE zeVN|rSm+_;#C!6-f#1`3PtHRoq( z>0P|LUbGe534WI#Vy8ynY}8)Gv7qzG()_5CYMTqZsK58;spF@2_w~XCyLRq|Zs%^Lj7T>R@H99TxprvT6NJq@1IV4_aIelXvHO2D-EeUpfu>6$FNA6JsEr+& z)H!d#cQCB8KUFn-%eD%k=sJGNXJyu&YHe=2N!ohg*Gwij2L(!t3ZD;(J-Ez+9qi9Y z$>%r*Kg0II;>m^buinAewN8jBWih+uZXjD~HoN7tI_~ihHkWYEp|)qn!(rgO+F)i- zKpQJ`+uU3CvtszG-jUtR&*0eXGA95f$0A)I*f;x^Tb5BBg}%d{r! zTRznh+#eaaSi6J{h3Gb%B<PN$Klu7hfW3P+uP;h$o0yT7 z=r1q zA;Scr_^&gF_G*9WE>fQBc#=J*LF4=UeNAn5R83}b#?ZUbLJ!WS$ec2kY`8kmPB*Bz z9Dw3SErK^#Z6sFzs&<9@eQq;seF5F(wghYioTewU%x*l$=d0>7fU)b9`{>7cHw|sk z@tZX^q%<|x#7$+5t0X$3?5QiT^kiXzUzZ@Nm#edaia`tCK67+hd`X(zUf;Ai(A8@jtrzpNz_Ushx;&mb2AJ-*I)U8ek>UT_3+v=(?j# zltSY%7Lh>eoPVO<|LE*|Lo%;uBmav? zfjzB3h&}7JL7`YYRzLK1?-thh4ni3Gkim*jNET^U$meg%Jdr%Mw)>rjHgg%9ydxM& z|7olVL=fVT3~v$NblZe%6%8Pw7UKv3w_(sjckPGhvDv%x0{CAe>kk&SByhvk-FfWq zFQ$^7U)z}B=Q{;vE@$F~Hw-_Su3O(nw>=WOQfo5!Fz`AfOGBFyn8Bc{5*gF8k%%yB zGmDa}>bu8ShmiK|S*$PanJwwmxr1DHj?<3^z#0=A5hY}Qi4-35f&5`jd5zh5H$l6~ z??`Jg(fxoYxdZ$A^`paigf~xh=%Uli6Z?er*u&j;DSri1{Y!!eDsS=5!|MjOEJ!~sG>pc+y^cyb8Z`s}&qPp|N>-Da3wR=zJg^94G& zx(qWNPaj$Hq)JE5zl9k$lqLp04cw^BAbbC!o~8*w+KoQG|vdP z2E%MfjQOD$UxRAT-Y7NY8dchsZ2)zX`)Q_(qf}+A9jy4~^*)H#W3YVl65HG$)m_h? z%omM|eojryNc-LIX%LutEWRJrG&mp(2>qDH%4uU~^5F1;Bv#V-YOL3l%-(m4$SWR3 z#W0y*~q zVB-DZXTX~%-MalyT?4G_-Gew;=Lnm7=$)1w8L{kFCAQ?mI`v8E+Im8Y-WnRy@pe3x zv!WF5j+Ho5|HMxOiuU|x0JE1~#63sa@e*@7^r2otx7KwAD{no@{b+uRZF!~Wi0q)g zZ7ifpQguCFoE38kJeE#+%N!8n{T}bhRCMLjk8DxRA-IfN&f5ErsyHI!pK!;xS+GYg zZ$`8`roE6J5_CRin}n>S@vmQg7h>c||JY)^J&P2hfwySt<*j>X*iY*Fl~!W~_My=r zLj2p-?+6SFOJe9dF5lNdcuqY148YbN9?SJH`4XI^Q$@q|2H3FTuHpzsauS^$r;+3! z6?*555b$+JT7gHPPg-C_$bBvlzH(cq+7x1NexoD6Gry5mbH`c0H(v4P+{8#pE%(tW zWr%;~so46BVE_4dgdd9&5o{gl3ocAfU%upaW-CO}Fp+k6ejN1aqPOAymfDt>Ucg28 zS8%`yABCqCSKmR_GHR_nA9m#6Gn>tz3nTiaLydcB8vTb49T@4~@b-ZG!-N?J_a@6M z>ZDF~rP_Ce!JE7%cu7`mi0gHP3d{~xrG0@B?kTbyKtX(kNo8*)Bq9x-EuP6fu-P=& zm_?L(N*Y4_2>(?CyQ;E+n_SEF8Bi8b#@eTNeJ{%GJMKRwgg)TDo~@(x;dI#tqu9jY*P$iD1%IZJ zpP_=I{m>WNFIOU?YuMXlY6ZNYcQ_iLA<9gcXr`tO25oaC*+7H-i3;a^lzBZL zeys<==fLLaDkdeiezI4#w_T!|cgJutr1oW;%wj7v`P$oTAmq&A^rHvwL5 zJRI^&_&bfr$rqp8uAc$v&j7PW;j5gxel3-C434C)4%;1_Lh+5u9FYr$_+k=2 zkI{0Q;X^7dHPf1lfoKMn47RN;%nTbTNX1C^B!%CQPYJ)Lo9^SDIRW{E1zztcC=$fS zCD{-6*Hv9sv@AE-P5|AN{;t*jZ>Jur-#1Q>cc2KdMFcoW0*DzYux!{!o3jwrCqz0) zc%zJcmCMJzcfT5&zo?+nwFQNoWQe`91Z6YUgCh+fF@MdIma9msl%?_k8~X|OMEcn% zhi>PFZf3k%N-Wxa2Go?XjakG_m?`=>d`k2h6VR&w;@_?`m4eEa!H*P=Jps8!>W>$c zurY8osG%sqWFu&!0~6JjAK{gm;ca=h4~>%1v?k%x(1*oGIVS8kgg$&tYCEfP&1|hE z`}W6eVVy@7OSfuyj()s@c_3JTpW}_vB#7eckuTBo@%=?qM>3E~vg3SbCg3eyM$Zxq)n z!ONO$12N6TeZnq80zljt8?1hA#@XC9?>d)3J<4lfKk0#z9(1eC z#zMD8ct8t%p7xA%j;@@qxP| zxs8+Vs-g&yMfYTb?=G%d2#2q7f-{<0$O z&IRO2d;1~$84#wMyu0e&Guh#Tv+1#-GAA2I5@AYy&iK`XEGGKbGoae*!L8ylTWk9M zh+OUVeyJP??iQ< zX==(0C^YTLv>>{0&EWCgz!q1{xHBm{w8DUKc{zy~&pSltXFn<4V@(yq+lV!}(TT%X zMUi>+HX{3I z^c84N|5{H*1L&GkuOa?=D7C2XBdkar$LY9PYTsn7TT2#r!D%!1Ikz}RMZ7+jHQkl8n2DisEb@*ix@7u~(7B=gRB;71WvSh}u%cxC4M@L7%k;|J%O zBMN`!8iXnKqZkh=w53ocnhWQ-qV@5^-qbT-)T@Pj)9FS6b5L{|`LE7V|{h*lKQP(`OTyrg!7R_ zdf)ZFx~z*Po5*>7SceOd%z#_`!>S7*I-~6e2xM0vzf#wz#i&X8y;wTzxYSU$T&w@f zV3BU~A#73(4yb+qsiC>_JD{Gq@k+b~Pq}xIkZJ$gbg+b9eR2QK=mn81;$%L%x40_&-dQbJmu8 zHxIsjUcScP*EuL~od(_My6^+v<#d6rS?JsCqhB zp3?sG*QNejQrw-(4mMT&Pp@CA;bn_xx~EymE6ba9kv@DmTQl#`@z=-Qp!jm-0;T37 zPTJhv=j`+hu)8`t`|#nyMA=AO*#Phi2q5$dyh}J5z3<+;Y3mA^pue9HIZ13@FBdx5 z5DXPl%qaUR zzUSKrpeVJr*BM@Gq|PdV6r<8fWD^&I7E5?HpXM5IDl|rib*6L>Ebua}=7qBoEkhy# ztT>8eHd=6_NAJjq1}rUB=e3|GXPT56HW;5=k%De(2!9s>1^-~>EhKO-}_K3>GjZ~3^?zY$#h++V9)%sjtA228J15$V~mVc zkN!EKh=?4JlP7cA;a%o0(UaeB_T>ib2PIm(vc=xwhA`TA1x7Gov)?J&N8$~2EK(?| z^oiEbp#(anKd~qm9k2Cad>252`$G~6&wve_?ye{wy(eA|lrxt3XF#Jc{mVjTc7D^h z^ci6B6!DmPlAZ2l_fxpdcj3hSzBBN=>Pqp))iYp)qWQ&;KVZ8qyJNT_upJg29FTu0mmJrPB+;IY{mSgMGz&3o&-DBCPa>Ein`X7PS`7|@#^&P0 zSlE+<_vhGE>0Hy1ZB3T*F$Ecm=kF(U45r=ect0)(0n@)hz0ndKPtUQ)$YgXyvN*{y zrROJe=Hn7R&_j_J8Sx>Jl$X7i5(=NuL?}F9byw89;AlcvrcQ*~B z^h+ovdWD$@SE9d(*`7(MlutK{5`7LL8x}E=%2LCyj zfMIiivvo|j-9l8!hlQb9(_6gM3POf(rXYoU&}-QiFF`mW*FuU7lk>XLclXUIqAPXy z`+Y_-tsBX=)<>ysG!a5?=)nvsnYFyx{bQk)?0@(gb>$8znjtu^6Na;?hasVduf zVtbszi%um~HC`1<-kM4M+Iw0d8Xt*EduZzXn-2^hr>fk97SLe|yGOmW zD?HSyG8U8kguC;>2k7gTu}F}Uq4dU5_a|&er@m;XMDA8-8FUlRJnXW&7y z1E3BHK_0>1$ip6~?A)vIsa&xl5Y}~Of=J7NYiK!B%m#T~DD|ir&mpn?-ufyzYs1wn zW#qKMWF1CUbryTqJ9TSFUF0`vgFGbTvmJE$e#>w1%`f5Frrb<&5O{2oeY$yS3k(U3 z%g2s4(^f@XJ!rYvNRK~S{|qMd@Fl80igp8jyF&%nS!4h1cGUZAZ^N)Q{x?yDFKcOW zdKCDnBO&)puLy{Xfl7z69o~`-0$i)gjzI%1*~K$Jha}E2)e4R<QNrcx!EgFc)i`)|m7%dU0WT(p?DE$`&L+6@X@mX_ z8fF8&?AHsh8Ll$4P?j?~zlbj_5L;|Vz&7TCGBIk-sZSw-5e60t5z9yAnxG|#UJ6aF zGh1F#Bz)Ym`)UxeBl#SHO!!3upDqX*V|O>tPoML98ylw^DV>4(cNQMLWWGiwF~p%1 z)et;zqZJk9JDs;lX>JqPvcj?8=<)+wCAk;Ze*yij-Sl;`^oR6P{^kr=w{!84&CdY? zV?n?y6z;O0V}?a?BFK3;G$}qG;Xi~P5y^?KLPk+I$#F!M3*dcedqP*;_!yGg^35k1 z>iRRrX0y2yugpBe+nSGg>=(%&;uoCQnw0)@6U!U<{s~_QbU#&2xuw^YumK9!9E9{v^j1Z#E<)qUlh6-|1)5H z()WcAGwUSq(y;jPr7>L3U7 z_89dTM)3G=}1d8;A2jVONSl8Hh>Ol`}KOA8FoA@4!bfn z4mNCX@b-3491h%|nVAU)!!&egCu>L{R$)jWA;IkpiV{vo><|ot@vp)+fWQ*oQS*4~1rdy& zTACxhGHvPMAiohyyRD)M39$p&dk{Zq6FrF8_%`@JE3W2r_ijcY4l{6j^|qQ1{HQj{ z;Y=Kw%AIh-BJ+iVikLVXy73T{DFE)Zr5SDdaE=D^d9SQMEyv1ylvUCnmP(Hu1way^ zR8emw=BLG+S1rRJ>)1@)PhEZs8is7lAfyDiUlS>)dpuney5Ld)$y>^fdN^|aY<`XV zh#zfybq*?Kct9bopryOFYJdotauLPEx#_KnJv4xtt~lDccJ{qJa}+WOkP9*=Wspx+ z*K6J_yGi6LWLiYC1|yBEJ|-&5;FbI%o1EH2y#4fov)?3L_SnAcsbWNFMdfa5c4e4w z9&z75^~Nm+wn3S9Mp1u$ZMYF0UL+thyc_TCV1!6c$INJ6drw&4lhK;!TT$#R@z2-> zrU7hwyO`G!1Ps=(*5T~BlXS!f3Wk^2r5mi z*PB?;oVwIhSYY>J(t`^wo0>kN0-fL&nVVR5!;Sg|Vs*_QcSU5gD!RkY`MlW8oq5>* z#oT4k?xN?XwCrBCJ-6K?Datr^6;JGxwmgIJ=zwJX4fZu#g>TsHR2;WlFlA-ZNA&t3 z0e%74A3{Vdvvdu?DpEvCZirIWvHbHx#>bRRrh>eNh8`AQlB453tY1;2Di`1OW(Cl; zZsriG)wJsD``qq&s}?^t`zEz$Y@NC)4sJ52=V#wVWtW#rpDMednBy0M;Z><2l0z+P zipx&5*K11ZeOcSs!aFm_gIyCybgA{z#Mr}8VW?adi@RS(~GGiOV7Bot2Vx4+?*4J~9M-eBY`rntwLxx&>{cMArQ<%x2J^Dh2>ZmsFu@JE76#2F&prM<=kdL+9_YcCFVx^% z`gZ1a+y@ALhi1p7{5tfYyQ<-rbL^E zmedJV5@^JXhPklt=G{>>pthUw$h((ao@0kO<+e@=uapjD?s+giuZkTo2pUvCeY{ zW52!gRz?WxDWaR)tLuG6t`+Q$42Hr&0g^Wc-A|%$IQp|cf}Aku--l+)xxLdgm^abk`%?Xpt;%gncd9Cn+8$(kSnIWS zy7;4F{AC}$p86kYfYtDFHl6G)0oHT=k@(o8iR~eA7pvA7YJRpS_zcM4Y$IGy^mxS( zofHsv9-b9uepTpZetwUk1p!yxE|(4RBGLRkHi3e3HyK`OBDRcNjeVG#JY?>E22fce zt}xM$Y&R4#Z5qd^!{f1RHp0iQVebiMC24+VcM^)-$##yRN_0Me9LKn2=AQJHdNwwm zTiiqH0f4ips2i+ literal 0 HcmV?d00001