From 81bee025106e986d8799a5d32482b6492af6a146 Mon Sep 17 00:00:00 2001 From: Francis Hinson Date: Thu, 9 Apr 2015 16:34:09 -0700 Subject: [PATCH 1/3] fix piece flickering bug --- js/chessboard.js | 125 ++++++++++++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 45 deletions(-) diff --git a/js/chessboard.js b/js/chessboard.js index 87c1d27c..9341fa91 100644 --- a/js/chessboard.js +++ b/js/chessboard.js @@ -186,6 +186,7 @@ function objToFen(obj) { } window['ChessBoard'] = window['ChessBoard'] || function(containerElOrId, cfg) { +'use strict'; cfg = cfg || {}; @@ -199,7 +200,6 @@ var MINIMUM_JQUERY_VERSION = '1.7.0', // use unique class names to prevent clashing with anything else on the page // and simplify selectors -// NOTE: these should never change var CSS = { alpha: 'alpha-d2270', black: 'black-3c85d', @@ -254,8 +254,8 @@ var ANIMATION_HAPPENING = false, // JS Util Functions //------------------------------------------------------------------------------ -// http://tinyurl.com/3ttloxj -function uuid() { +// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript +function createId() { return 'xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx'.replace(/x/g, function(c) { var r = Math.random() * 16 | 0; return r.toString(16); @@ -317,7 +317,7 @@ function error(code, msg, obj) { if (obj) { errorText += '\n\n' + JSON.stringify(obj); } - window.alert(errorText); + console.log(errorText); return; } @@ -333,7 +333,7 @@ function checkDeps() { if (typeof containerElOrId === 'string') { // cannot be empty if (containerElOrId === '') { - window.alert('ChessBoard Error 1001: ' + + console.log('ChessBoard Error 1001: ' + 'The first argument to ChessBoard() cannot be an empty string.' + '\n\nExiting...'); return false; @@ -342,7 +342,7 @@ function checkDeps() { // make sure the container element exists in the DOM var el = document.getElementById(containerElOrId); if (! el) { - window.alert('ChessBoard Error 1002: Element with id "' + + console.log('ChessBoard Error 1002: Element with id "' + containerElOrId + '" does not exist in the DOM.' + '\n\nExiting...'); return false; @@ -359,7 +359,7 @@ function checkDeps() { containerEl = $(containerElOrId); if (containerEl.length !== 1) { - window.alert('ChessBoard Error 1003: The first argument to ' + + console.log('ChessBoard Error 1003: The first argument to ' + 'ChessBoard() must be an ID or a single DOM node.' + '\n\nExiting...'); return false; @@ -370,7 +370,7 @@ function checkDeps() { if (! window.JSON || typeof JSON.stringify !== 'function' || typeof JSON.parse !== 'function') { - window.alert('ChessBoard Error 1004: JSON does not exist. ' + + console.log('ChessBoard Error 1004: JSON does not exist. ' + 'Please include a JSON polyfill.\n\nExiting...'); return false; } @@ -378,7 +378,7 @@ function checkDeps() { // check for a compatible version of jQuery if (! (typeof window.$ && $.fn && $.fn.jquery && compareSemVer($.fn.jquery, MINIMUM_JQUERY_VERSION) === true)) { - window.alert('ChessBoard Error 1005: Unable to find a valid version ' + + console.log('ChessBoard Error 1005: Unable to find a valid version ' + 'of jQuery. Please include jQuery ' + MINIMUM_JQUERY_VERSION + ' or ' + 'higher on the page.\n\nExiting...'); return false; @@ -499,7 +499,7 @@ function expandConfig() { // fudge factor, and then keep reducing until we find an exact mod 8 for // our square size function calculateSquareSize() { - var containerWidth = parseInt(containerEl.width(), 10); + var containerWidth = parseInt(containerEl.css('width'), 10); // defensive, prevent infinite loop if (! containerWidth || containerWidth <= 0) { @@ -522,7 +522,7 @@ function createElIds() { for (var i = 0; i < COLUMNS.length; i++) { for (var j = 1; j <= 8; j++) { var square = COLUMNS[i] + j; - SQUARE_ELS_IDS[square] = square + '-' + uuid(); + SQUARE_ELS_IDS[square] = square + '-' + createId(); } } @@ -531,8 +531,8 @@ function createElIds() { for (var i = 0; i < pieces.length; i++) { var whitePiece = 'w' + pieces[i]; var blackPiece = 'b' + pieces[i]; - SPARE_PIECE_ELS_IDS[whitePiece] = whitePiece + '-' + uuid(); - SPARE_PIECE_ELS_IDS[blackPiece] = blackPiece + '-' + uuid(); + SPARE_PIECE_ELS_IDS[whitePiece] = whitePiece + '-' + createId(); + SPARE_PIECE_ELS_IDS[blackPiece] = blackPiece + '-' + createId(); } } @@ -637,18 +637,45 @@ function buildBoard(orientation) { return html; } -function buildPieceImgSrc(piece) { - if (typeof cfg.pieceTheme === 'function') { - return cfg.pieceTheme(piece); +var imgCache = {} +function cacheImages() { + var pieces = ['wK', 'wQ', 'wR', 'wB', 'wN', 'wP', 'bK', 'bQ', 'bR', 'bB', 'bN', 'bP']; + pieces.forEach(function(piece) { + var img = new Image() + img.onload = function() { + imgCache[piece] = getBase64Image(img) + } + img.src = buildPieceImgSrc(piece) + }) + + function getBase64Image(img) { + var canvas = document.createElement("canvas"); + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0); + var dataURL = canvas.toDataURL("image/png"); + return dataURL; } +} - if (typeof cfg.pieceTheme === 'string') { - return cfg.pieceTheme.replace(/{piece}/g, piece); - } +function buildPieceImgSrc(piece) { + if(imgCache[piece]) return imgCache[piece] + else return getUrl(piece) + + function getUrl(piece) { + if (typeof cfg.pieceTheme === 'function') { + return cfg.pieceTheme(piece); + } - // NOTE: this should never happen - error(8272, 'Unable to build image source for cfg.pieceTheme.'); - return ''; + if (typeof cfg.pieceTheme === 'string') { + return cfg.pieceTheme.replace(/{piece}/g, piece); + } + + // NOTE: this should never happen + error(8272, 'Unable to build image source for cfg.pieceTheme.'); + return ''; + } } function buildPiece(piece, hidden, id) { @@ -696,7 +723,7 @@ function animateSquareToSquare(src, dest, piece, completeFn) { // create the animated piece and absolutely position it // over the source square - var animatedPieceId = uuid(); + var animatedPieceId = createId(); $('body').append(buildPiece(piece, true, animatedPieceId)); var animatedPieceEl = $('#' + animatedPieceId); animatedPieceEl.css({ @@ -737,7 +764,7 @@ function animateSparePieceToSquare(piece, dest, completeFn) { var destOffset = destSquareEl.offset(); // create the animate piece - var pieceId = uuid(); + var pieceId = createId(); $('body').append(buildPiece(piece, true, pieceId)); var animatedPieceEl = $('#' + pieceId); animatedPieceEl.css({ @@ -772,10 +799,6 @@ function animateSparePieceToSquare(piece, dest, completeFn) { // execute an array of animations function doAnimations(a, oldPos, newPos) { - if (a.length === 0) { - return; - } - ANIMATION_HAPPENING = true; var numFinished = 0; @@ -974,7 +997,7 @@ function drawPositionInstant() { // add the pieces for (var i in CURRENT_POSITION) { if (CURRENT_POSITION.hasOwnProperty(i) !== true) continue; - + if (DRAGGING_A_PIECE && DRAGGED_PIECE_SOURCE == i) continue; $('#' + SQUARE_ELS_IDS[i]).append(buildPiece(CURRENT_POSITION[i])); } } @@ -1298,6 +1321,17 @@ widget.clear = function(useAnimation) { widget.position({}, useAnimation); }; +/* +// get or set config properties +// TODO: write this, GitHub Issue #1 +widget.config = function(arg1, arg2) { + // get the current config + if (arguments.length === 0) { + return deepCopy(cfg); + } +}; +*/ + // remove the widget from the page widget.destroy = function() { // remove markup @@ -1315,7 +1349,7 @@ widget.fen = function() { // flip orientation widget.flip = function() { - return widget.orientation('flip'); + widget.orientation('flip'); }; /* @@ -1324,7 +1358,7 @@ widget.highlight = function() { }; */ - +widget.cache = cacheImages // move pieces widget.move = function() { // no need to throw an error here; just do nothing @@ -1371,14 +1405,14 @@ widget.orientation = function(arg) { if (arg === 'white' || arg === 'black') { CURRENT_ORIENTATION = arg; drawBoard(); - return CURRENT_ORIENTATION; + return; } // flip orientation if (arg === 'flip') { CURRENT_ORIENTATION = (CURRENT_ORIENTATION === 'white') ? 'black' : 'white'; drawBoard(); - return CURRENT_ORIENTATION; + return; } error(5482, 'Invalid value passed to the orientation method.', arg); @@ -1632,8 +1666,8 @@ function addEvents() { mousedownSparePiece); // mouse enter / leave square - boardEl.on('mouseenter', '.' + CSS.square, mouseenterSquare) - .on('mouseleave', '.' + CSS.square, mouseleaveSquare); + boardEl.on('mouseenter', '.' + CSS.square, mouseenterSquare); + boardEl.on('mouseleave', '.' + CSS.square, mouseleaveSquare); // IE doesn't like the events on the window object, but other browsers // perform better that way @@ -1641,12 +1675,12 @@ function addEvents() { // IE-specific prevent browser "image drag" document.ondragstart = function() { return false; }; - $('body').on('mousemove', mousemoveWindow) - .on('mouseup', mouseupWindow); + $('body').on('mousemove', mousemoveWindow); + $('body').on('mouseup', mouseupWindow); } else { - $(window).on('mousemove', mousemoveWindow) - .on('mouseup', mouseupWindow); + $(window).on('mousemove', mousemoveWindow); + $(window).on('mouseup', mouseupWindow); } // touch drag pieces @@ -1654,16 +1688,14 @@ function addEvents() { boardEl.on('touchstart', '.' + CSS.square, touchstartSquare); containerEl.on('touchstart', '.' + CSS.sparePieces + ' .' + CSS.piece, touchstartSparePiece); - $(window).on('touchmove', touchmoveWindow) - .on('touchend', touchendWindow); + $(window).on('touchmove', touchmoveWindow); + $(window).on('touchend', touchendWindow); } } function initDom() { - // create unique IDs for all the elements we will create - createElIds(); - // build board and save it in memory + cacheImages(); containerEl.html(buildBoardContainer()); boardEl = containerEl.find('.' + CSS.board); @@ -1673,7 +1705,7 @@ function initDom() { } // create the drag piece - var draggedPieceId = uuid(); + var draggedPieceId = createId(); $('body').append(buildPiece('wP', true, draggedPieceId)); draggedPieceEl = $('#' + draggedPieceId); @@ -1688,6 +1720,9 @@ function init() { if (checkDeps() !== true || expandConfig() !== true) return; + // create unique IDs for all the elements we will create + createElIds(); + initDom(); addEvents(); } From 42ddbee33d4e6d8010640d0842f8d9586e1e7056 Mon Sep 17 00:00:00 2001 From: Francis Hinson Date: Thu, 9 Apr 2015 16:55:16 -0700 Subject: [PATCH 2/3] incorporating previous changes --- .DS_Store | Bin 0 -> 8196 bytes examples/.DS_Store | Bin 0 -> 10244 bytes js/chessboard.js | 59 +++++++++++++++++++++++---------------------- 3 files changed, 30 insertions(+), 29 deletions(-) create mode 100644 .DS_Store create mode 100644 examples/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..855711a37463af641181cc4146a15b0c4cb262bf GIT binary patch literal 8196 zcmeHL&2Jk;6o1c7$-0Gh+oX_EiVV4cT2+ZCYB?YrCn-cwV&W)GXj-!$6MN`-$J*UA zNh5Az?B0EZ)Voc+D;`-h^q5eGrzYp@6E^0p11oJ z0It0hE1`Gp_B?B@(6sbrorP$G^LI+hU1t1)uW+kMnmw&>dY#=P9*wIKW zB&b~pwJWA62Bx_KYIo`{rS=_-+8t2MOyi_8W1690ntEVSnFE$In%Xd67#L+h;JT#;i&Ee7A&^)*_;BO81 z53CD+mG)F}dwW#NPZRy~#qL(zO20$=<+cJICsR|uVJ<&%=!sFQaQKM4?Bj>8R~urh znmEa3Ty~;s>W=%&P4$YCG`jk-5J69O+!fBYYWDc72or~gEXug9U*(}Mw#s5N^yBra z9`7pmlSa)xS&7&!a;-QaTj4QxdBBq$t01qMJ+Zs{%B9!N6{n{!w$BxJFHMtvVd`SL zZGU1}r(b?`=E_>D{n?jaef`b1-`)N3p4vKK8VzAg-}maD4kCtow^Cy8_bxFHY&%2E zlTRHzW*Hh%KyXC_WPd-}OE&z~vQ>@nBzZq_5YsaX+-s2psvYxRix)t2M&u)dnG z?WD?YvzmQkz;ucEH};#BcUojKzTcpRdoyAzRO2mfY{V>C&FE`2`&jHnA_yuX<_Qd3*m;K86~HSE!h>XuqY-R@>#teI4%no!?H*c(Oh$)$O-GLydy2;Xr2hu zUuTt*F84C|#-Ezb$@sjU6s(5U0kpq9ds>ze!@#4+Kwd9;LgxST5C8uEC~nQH z*)U)j_?Hae$Xs=u6LiRH<~FP^II97IiBjy(ksJQi>go U)I#!~e+V$of5p409&ZNz0V|$~r~m)} literal 0 HcmV?d00001 diff --git a/examples/.DS_Store b/examples/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bebe0f9ab5226b0084a8f4e0fb0f671b0e1f2be3 GIT binary patch literal 10244 zcmeI2J8l~>5Qc}c3juNABW!0^fhEh2a$z_D(k4wR!_Q8E(-?5M$MBI{_y9RVZlV1D zkVr!8XlENkDux0%@`~Sz`wjIVWf4giPxmvCMntBljQe|NjKarRdu39N93Up}A|K^J zp5;b<$j@HyI1mQHKo|%EVIT}_g8_VIvrIqa7;P8`17YB=0lq&psEloiU5@(Jfku}A zh`Ttf1^2NIP^KxdEwRf{QJgcc9#TP5Sz@G&w5!({G95XH{=<_4`sDzAPW_ZkLa@=);%QXVgQ~v|6G4$IYsBf1i6p z-@}!biklB}>FXNq*x`Py;TFT(~~ z)bMiZaF{O!cZ^&N&QH!4gIkDmeF^i$;7-Ny$@yY%=i=l~y*yW5cx}85UZ2p5#X0j# zy;z(xPW57OW4u_LlLz(k+wkJeGkUQ&XP&7Si#r?6gLUU|vS z=j4y`#pIm)(TmAB`J)$;bMi+oCg3t=j9#q#pIm4(@VwamxE}+Ko|%EVIT~Ifp;~qlh598|Nqna z-~Zor3~}->5C%4DAnjg$yS%^{%HDc!G~8=%P_I#0*sse`5j46TkEq-6_=DT=+$&_? rBSse7Z%gcQ#1WJY{1|}!%vk^H|7rF1Yh(RC;Kf>xJNtIqx&HqH^~Lfr literal 0 HcmV?d00001 diff --git a/js/chessboard.js b/js/chessboard.js index 9341fa91..17a844b8 100644 --- a/js/chessboard.js +++ b/js/chessboard.js @@ -200,6 +200,7 @@ var MINIMUM_JQUERY_VERSION = '1.7.0', // use unique class names to prevent clashing with anything else on the page // and simplify selectors +// NOTE: these should never change var CSS = { alpha: 'alpha-d2270', black: 'black-3c85d', @@ -254,8 +255,8 @@ var ANIMATION_HAPPENING = false, // JS Util Functions //------------------------------------------------------------------------------ -// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript -function createId() { +// http://tinyurl.com/3ttloxj +function uuid() { return 'xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx'.replace(/x/g, function(c) { var r = Math.random() * 16 | 0; return r.toString(16); @@ -317,7 +318,7 @@ function error(code, msg, obj) { if (obj) { errorText += '\n\n' + JSON.stringify(obj); } - console.log(errorText); + window.alert(errorText); return; } @@ -333,7 +334,7 @@ function checkDeps() { if (typeof containerElOrId === 'string') { // cannot be empty if (containerElOrId === '') { - console.log('ChessBoard Error 1001: ' + + window.alert('ChessBoard Error 1001: ' + 'The first argument to ChessBoard() cannot be an empty string.' + '\n\nExiting...'); return false; @@ -342,7 +343,7 @@ function checkDeps() { // make sure the container element exists in the DOM var el = document.getElementById(containerElOrId); if (! el) { - console.log('ChessBoard Error 1002: Element with id "' + + window.alert('ChessBoard Error 1002: Element with id "' + containerElOrId + '" does not exist in the DOM.' + '\n\nExiting...'); return false; @@ -359,7 +360,7 @@ function checkDeps() { containerEl = $(containerElOrId); if (containerEl.length !== 1) { - console.log('ChessBoard Error 1003: The first argument to ' + + window.alert('ChessBoard Error 1003: The first argument to ' + 'ChessBoard() must be an ID or a single DOM node.' + '\n\nExiting...'); return false; @@ -370,7 +371,7 @@ function checkDeps() { if (! window.JSON || typeof JSON.stringify !== 'function' || typeof JSON.parse !== 'function') { - console.log('ChessBoard Error 1004: JSON does not exist. ' + + window.alert('ChessBoard Error 1004: JSON does not exist. ' + 'Please include a JSON polyfill.\n\nExiting...'); return false; } @@ -378,7 +379,7 @@ function checkDeps() { // check for a compatible version of jQuery if (! (typeof window.$ && $.fn && $.fn.jquery && compareSemVer($.fn.jquery, MINIMUM_JQUERY_VERSION) === true)) { - console.log('ChessBoard Error 1005: Unable to find a valid version ' + + window.alert('ChessBoard Error 1005: Unable to find a valid version ' + 'of jQuery. Please include jQuery ' + MINIMUM_JQUERY_VERSION + ' or ' + 'higher on the page.\n\nExiting...'); return false; @@ -499,7 +500,7 @@ function expandConfig() { // fudge factor, and then keep reducing until we find an exact mod 8 for // our square size function calculateSquareSize() { - var containerWidth = parseInt(containerEl.css('width'), 10); + var containerWidth = parseInt(containerEl.width(), 10); // defensive, prevent infinite loop if (! containerWidth || containerWidth <= 0) { @@ -522,7 +523,7 @@ function createElIds() { for (var i = 0; i < COLUMNS.length; i++) { for (var j = 1; j <= 8; j++) { var square = COLUMNS[i] + j; - SQUARE_ELS_IDS[square] = square + '-' + createId(); + SQUARE_ELS_IDS[square] = square + '-' + uuid(); } } @@ -531,8 +532,8 @@ function createElIds() { for (var i = 0; i < pieces.length; i++) { var whitePiece = 'w' + pieces[i]; var blackPiece = 'b' + pieces[i]; - SPARE_PIECE_ELS_IDS[whitePiece] = whitePiece + '-' + createId(); - SPARE_PIECE_ELS_IDS[blackPiece] = blackPiece + '-' + createId(); + SPARE_PIECE_ELS_IDS[whitePiece] = whitePiece + '-' + uuid(); + SPARE_PIECE_ELS_IDS[blackPiece] = blackPiece + '-' + uuid(); } } @@ -723,7 +724,7 @@ function animateSquareToSquare(src, dest, piece, completeFn) { // create the animated piece and absolutely position it // over the source square - var animatedPieceId = createId(); + var animatedPieceId = uuid(); $('body').append(buildPiece(piece, true, animatedPieceId)); var animatedPieceEl = $('#' + animatedPieceId); animatedPieceEl.css({ @@ -764,7 +765,7 @@ function animateSparePieceToSquare(piece, dest, completeFn) { var destOffset = destSquareEl.offset(); // create the animate piece - var pieceId = createId(); + var pieceId = uuid(); $('body').append(buildPiece(piece, true, pieceId)); var animatedPieceEl = $('#' + pieceId); animatedPieceEl.css({ @@ -1349,7 +1350,7 @@ widget.fen = function() { // flip orientation widget.flip = function() { - widget.orientation('flip'); + return widget.orientation('flip'); }; /* @@ -1405,14 +1406,14 @@ widget.orientation = function(arg) { if (arg === 'white' || arg === 'black') { CURRENT_ORIENTATION = arg; drawBoard(); - return; + return CURRENT_ORIENTATION; } // flip orientation if (arg === 'flip') { CURRENT_ORIENTATION = (CURRENT_ORIENTATION === 'white') ? 'black' : 'white'; drawBoard(); - return; + return CURRENT_ORIENTATION; } error(5482, 'Invalid value passed to the orientation method.', arg); @@ -1666,8 +1667,8 @@ function addEvents() { mousedownSparePiece); // mouse enter / leave square - boardEl.on('mouseenter', '.' + CSS.square, mouseenterSquare); - boardEl.on('mouseleave', '.' + CSS.square, mouseleaveSquare); + boardEl.on('mouseenter', '.' + CSS.square, mouseenterSquare) + .on('mouseleave', '.' + CSS.square, mouseleaveSquare); // IE doesn't like the events on the window object, but other browsers // perform better that way @@ -1675,12 +1676,12 @@ function addEvents() { // IE-specific prevent browser "image drag" document.ondragstart = function() { return false; }; - $('body').on('mousemove', mousemoveWindow); - $('body').on('mouseup', mouseupWindow); + $('body').on('mousemove', mousemoveWindow) + .on('mouseup', mouseupWindow); } else { - $(window).on('mousemove', mousemoveWindow); - $(window).on('mouseup', mouseupWindow); + $(window).on('mousemove', mousemoveWindow) + .on('mouseup', mouseupWindow); } // touch drag pieces @@ -1688,12 +1689,15 @@ function addEvents() { boardEl.on('touchstart', '.' + CSS.square, touchstartSquare); containerEl.on('touchstart', '.' + CSS.sparePieces + ' .' + CSS.piece, touchstartSparePiece); - $(window).on('touchmove', touchmoveWindow); - $(window).on('touchend', touchendWindow); + $(window).on('touchmove', touchmoveWindow) + .on('touchend', touchendWindow); } } function initDom() { + // create unique IDs for all the elements we will create + createElIds(); + // build board and save it in memory cacheImages(); containerEl.html(buildBoardContainer()); @@ -1705,7 +1709,7 @@ function initDom() { } // create the drag piece - var draggedPieceId = createId(); + var draggedPieceId = uuid(); $('body').append(buildPiece('wP', true, draggedPieceId)); draggedPieceEl = $('#' + draggedPieceId); @@ -1720,9 +1724,6 @@ function init() { if (checkDeps() !== true || expandConfig() !== true) return; - // create unique IDs for all the elements we will create - createElIds(); - initDom(); addEvents(); } From 438eafbab0b40e703f0a62919def6ee56fa544ff Mon Sep 17 00:00:00 2001 From: Francis Hinson Date: Thu, 9 Apr 2015 16:55:52 -0700 Subject: [PATCH 3/3] remove .DS_Store --- .DS_Store | Bin 8196 -> 0 bytes examples/.DS_Store | Bin 10244 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store delete mode 100644 examples/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 855711a37463af641181cc4146a15b0c4cb262bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHL&2Jk;6o1c7$-0Gh+oX_EiVV4cT2+ZCYB?YrCn-cwV&W)GXj-!$6MN`-$J*UA zNh5Az?B0EZ)Voc+D;`-h^q5eGrzYp@6E^0p11oJ z0It0hE1`Gp_B?B@(6sbrorP$G^LI+hU1t1)uW+kMnmw&>dY#=P9*wIKW zB&b~pwJWA62Bx_KYIo`{rS=_-+8t2MOyi_8W1690ntEVSnFE$In%Xd67#L+h;JT#;i&Ee7A&^)*_;BO81 z53CD+mG)F}dwW#NPZRy~#qL(zO20$=<+cJICsR|uVJ<&%=!sFQaQKM4?Bj>8R~urh znmEa3Ty~;s>W=%&P4$YCG`jk-5J69O+!fBYYWDc72or~gEXug9U*(}Mw#s5N^yBra z9`7pmlSa)xS&7&!a;-QaTj4QxdBBq$t01qMJ+Zs{%B9!N6{n{!w$BxJFHMtvVd`SL zZGU1}r(b?`=E_>D{n?jaef`b1-`)N3p4vKK8VzAg-}maD4kCtow^Cy8_bxFHY&%2E zlTRHzW*Hh%KyXC_WPd-}OE&z~vQ>@nBzZq_5YsaX+-s2psvYxRix)t2M&u)dnG z?WD?YvzmQkz;ucEH};#BcUojKzTcpRdoyAzRO2mfY{V>C&FE`2`&jHnA_yuX<_Qd3*m;K86~HSE!h>XuqY-R@>#teI4%no!?H*c(Oh$)$O-GLydy2;Xr2hu zUuTt*F84C|#-Ezb$@sjU6s(5U0kpq9ds>ze!@#4+Kwd9;LgxST5C8uEC~nQH z*)U)j_?Hae$Xs=u6LiRH<~FP^II97IiBjy(ksJQi>go U)I#!~e+V$of5p409&ZNz0V|$~r~m)} diff --git a/examples/.DS_Store b/examples/.DS_Store deleted file mode 100644 index bebe0f9ab5226b0084a8f4e0fb0f671b0e1f2be3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeI2J8l~>5Qc}c3juNABW!0^fhEh2a$z_D(k4wR!_Q8E(-?5M$MBI{_y9RVZlV1D zkVr!8XlENkDux0%@`~Sz`wjIVWf4giPxmvCMntBljQe|NjKarRdu39N93Up}A|K^J zp5;b<$j@HyI1mQHKo|%EVIT}_g8_VIvrIqa7;P8`17YB=0lq&psEloiU5@(Jfku}A zh`Ttf1^2NIP^KxdEwRf{QJgcc9#TP5Sz@G&w5!({G95XH{=<_4`sDzAPW_ZkLa@=);%QXVgQ~v|6G4$IYsBf1i6p z-@}!biklB}>FXNq*x`Py;TFT(~~ z)bMiZaF{O!cZ^&N&QH!4gIkDmeF^i$;7-Ny$@yY%=i=l~y*yW5cx}85UZ2p5#X0j# zy;z(xPW57OW4u_LlLz(k+wkJeGkUQ&XP&7Si#r?6gLUU|vS z=j4y`#pIm)(TmAB`J)$;bMi+oCg3t=j9#q#pIm4(@VwamxE}+Ko|%EVIT~Ifp;~qlh598|Nqna z-~Zor3~}->5C%4DAnjg$yS%^{%HDc!G~8=%P_I#0*sse`5j46TkEq-6_=DT=+$&_? rBSse7Z%gcQ#1WJY{1|}!%vk^H|7rF1Yh(RC;Kf>xJNtIqx&HqH^~Lfr