From a32f6f2afcb39330d03aa22db523ab8fa0e6e0a1 Mon Sep 17 00:00:00 2001 From: Patrick Barroca <pbarroca@sandbox.pergame.net> Date: Thu, 2 Apr 2015 18:08:01 +0200 Subject: [PATCH] rel #18297: Accessible slimbox replacement --- .../modules/opac/views/scripts/head.phtml | 4 +- .../views/scripts/recherche/viewnotice.phtml | 19 +- doc/extern_libs.org | 3 +- library/Class/ScriptLoader.php | 17 + public/admin/js/onload_utils.js | 34 +- public/opac/js/butterfly/alert-64.png | Bin 0 -> 3144 bytes public/opac/js/butterfly/butterfly-ie.css | 37 + public/opac/js/butterfly/butterfly-thumb.jpg | Bin 0 -> 2665 bytes public/opac/js/butterfly/butterfly.css | 125 ++ public/opac/js/butterfly/butterfly.jpg | Bin 0 -> 28274 bytes public/opac/js/butterfly/close-black.png | Bin 0 -> 1186 bytes public/opac/js/butterfly/close.png | Bin 0 -> 801 bytes public/opac/js/butterfly/external.html | 34 + .../js/butterfly/gallery-controls-sprite.png | Bin 0 -> 2608 bytes .../js/butterfly/gallery-controls-sprite.psd | Bin 0 -> 84985 bytes public/opac/js/butterfly/index.html | 145 ++ public/opac/js/butterfly/jquery.butterfly.js | 1472 +++++++++++++++++ .../opac/js/butterfly/jquery.butterfly.min.js | 6 + public/opac/js/butterfly/jquery.history.js | 194 +++ public/opac/js/butterfly/jquery.pxToEm.js | 56 + .../opac/js/butterfly/jquery.resize-events.js | 173 ++ .../js/butterfly/loading-black-on-white.gif | Bin 0 -> 5559 bytes public/opac/js/butterfly/reactive-overlay.png | Bin 0 -> 962 bytes public/opac/js/butterfly/reactive-overlay.psd | Bin 0 -> 162454 bytes 24 files changed, 2291 insertions(+), 28 deletions(-) create mode 100644 public/opac/js/butterfly/alert-64.png create mode 100644 public/opac/js/butterfly/butterfly-ie.css create mode 100644 public/opac/js/butterfly/butterfly-thumb.jpg create mode 100644 public/opac/js/butterfly/butterfly.css create mode 100644 public/opac/js/butterfly/butterfly.jpg create mode 100644 public/opac/js/butterfly/close-black.png create mode 100644 public/opac/js/butterfly/close.png create mode 100644 public/opac/js/butterfly/external.html create mode 100644 public/opac/js/butterfly/gallery-controls-sprite.png create mode 100644 public/opac/js/butterfly/gallery-controls-sprite.psd create mode 100644 public/opac/js/butterfly/index.html create mode 100644 public/opac/js/butterfly/jquery.butterfly.js create mode 100644 public/opac/js/butterfly/jquery.butterfly.min.js create mode 100644 public/opac/js/butterfly/jquery.history.js create mode 100644 public/opac/js/butterfly/jquery.pxToEm.js create mode 100644 public/opac/js/butterfly/jquery.resize-events.js create mode 100644 public/opac/js/butterfly/loading-black-on-white.gif create mode 100644 public/opac/js/butterfly/reactive-overlay.png create mode 100644 public/opac/js/butterfly/reactive-overlay.psd diff --git a/application/modules/opac/views/scripts/head.phtml b/application/modules/opac/views/scripts/head.phtml index c0bbb9b9726..04832a80ae6 100644 --- a/application/modules/opac/views/scripts/head.phtml +++ b/application/modules/opac/views/scripts/head.phtml @@ -13,7 +13,7 @@ Class_ScriptLoader::getInstance()->loadMeta(); echo $current_profil->getStyleCss(); - if ($current_profil->hasFavicon()) + if ($current_profil->hasFavicon()) echo sprintf('<link rel="shortcut icon" href="%s"/>', $current_profil->getFavicon()); $head_scripts = Class_ScriptLoader::newInstance() @@ -32,7 +32,6 @@ 'division-five', 'reload_module']) ->addJQueryReady(' $("input").placeholder(); - setupAnchorsTarget(); autoHideShowConfigurationModule(); initializeNoticeMurAnimation(); initializeImgHover(); @@ -102,6 +101,7 @@ $script_loader->addSkinStyleSheet('ie' . $ie, ['ie_version' => $ie]) ->addUserFilesStylSheet($current_profil->getHeaderCssIE($ie), ['ie_version' => $ie]); + $script_loader->addJQueryReady('setupAnchorsTarget();'); $head_scripts->renderStyleSheets(); $script_loader->renderStyleSheets(); diff --git a/application/modules/opac/views/scripts/recherche/viewnotice.phtml b/application/modules/opac/views/scripts/recherche/viewnotice.phtml index 215ba42ba43..83c3650763e 100644 --- a/application/modules/opac/views/scripts/recherche/viewnotice.phtml +++ b/application/modules/opac/views/scripts/recherche/viewnotice.phtml @@ -2,8 +2,8 @@ $this->openBoite($this->title); $script_loader = Class_ScriptLoader::getInstance() - ->addStyleSheet(URL_ADMIN_JS.'slimbox/slimbox2') - ->addAdminScript('slimbox/slimbox2.min.js') + ->loadButterflyLightbox() + ->addAdminScript('multi_inputs/multi_inputs.js') ->addStyleSheet(URL_ADMIN_JS.'rating/jquery.rating') @@ -13,19 +13,19 @@ $script_loader = Class_ScriptLoader::getInstance() ->addOpacScripts(['subModal', 'recherche', 'liste_notices_mur']) + ->addJQueryReady(sprintf('$("#reseaux-sociaux").load("%s")', - $this->url(array('controller' => 'recherche', - 'action' => 'reseau', - 'id_notice' => $this->notice->getId(), - 'type_doc' => $this->notice->getTypeDoc())))); + $this->url(['controller' => 'recherche', + 'action' => 'reseau', + 'id_notice' => $this->notice->getId(), + 'type_doc' => $this->notice->getTypeDoc()]))); ?> <div class="navigation"> - <a class="retour" href="<?php echo $this->url($this->criteres_recherche->getUrlRetourListe(), null, true).'#'.$this->notice->getId(); ?>"> + <a class="retour" href="<?php echo $this->url($this->criteres_recherche->getUrlRetourListe(), null, true).'#'.$this->notice->getId(); ?>"> <?php echo $this->_('Retour à la liste') ?> </a> - <?php echo $this->tagAnchor($this->url_panier, $this->_('Ajouter au Panier'), ['class'=>'panier'. @@ -55,8 +55,7 @@ $script_loader = Class_ScriptLoader::getInstance() ['id' => 'vignette', 'href' => $this->notice->getUrlImage(), 'title' => htmlentities($this->notice->getTitrePrincipal())]); - - echo '<script type="text/javascript">$("a[id=\'vignette\']").slimbox({}, null, null)</script>'; + $script_loader->addJQueryReady('$("a#vignette").butterfly({closeButton:false});'); } else echo $this->notice_Vignette($this->notice); diff --git a/doc/extern_libs.org b/doc/extern_libs.org index 35f6c37ab69..281e10e8f8a 100644 --- a/doc/extern_libs.org +++ b/doc/extern_libs.org @@ -39,6 +39,7 @@ | DateTimepicker | MIT License | | Choix de la date et de l'heure dans les articles | X ajout du support des dates courante sans partie d'heures | https://github.com/mugifly/jquery-simple-datetimepicker/ | | DataTables | MIT Licence | | Ecran des variables | | http://www.datatables.net/ | | CodeMirror | MIT Licence | | Edition code source javascript | | http://codemirror.net | -| | | | | | | +| Butterfly Lighbox | GPL | - | Accessible lightbox plugin | | http://irama.org/web/dhtml/butterfly/ | + diff --git a/library/Class/ScriptLoader.php b/library/Class/ScriptLoader.php index 89b321678e3..c23c25708df 100644 --- a/library/Class/ScriptLoader.php +++ b/library/Class/ScriptLoader.php @@ -256,6 +256,14 @@ class Class_ScriptLoader { } + /** + * @return ScriptLoader + */ + public function addOPACScriptStyleSheet($style_sheet, $attributes=null) { + return $this->addStyleSheet(BASE_URL."/public/opac/js/".$style_sheet, $attributes); + } + + /** * @return ScriptLoader */ @@ -733,6 +741,15 @@ class Class_ScriptLoader { } + public function loadButterflyLightbox() { + return $this->addOPACScript('butterfly/jquery.resize-events') + ->addOPACScript('butterfly/jquery.history') + ->addOPACScript('butterfly/jquery.butterfly.min') + ->addOPACScriptStyleSheet('butterfly/butterfly') + ->addOPACScriptStyleSheet('butterfly/butterfly-ie', ['ie_version' => 6]); + } + + public function addRecordMeta($record) { $this->_metas[] = '<meta property="og:title" content="' . htmlentities($record->getTitrePrincipal()) . ' - ' . $record->getAuteurPrincipal() . '" />'; $this->_metas[] = '<meta property="og:description" content="' . htmlentities($record->getResume()) . '" />'; diff --git a/public/admin/js/onload_utils.js b/public/admin/js/onload_utils.js index f3c8223bf51..5c6cd208049 100644 --- a/public/admin/js/onload_utils.js +++ b/public/admin/js/onload_utils.js @@ -48,22 +48,26 @@ if (typeof jQuery != "undefined") //Les liens qui référencent des sites externes doivent être ouverts dans un nouvel onglet var setupAnchorsTarget = function() { - var internalLink = new RegExp('/' + window.location.host + '/'); - $('a[href^="http"]').each(function() { - if (!internalLink.test($(this).attr('href')) && (undefined == this.onclick) && (undefined == $(this).data('events') || undefined == $(this).data('events').click)) { - if ($.browser.msie || !!navigator.userAgent.match(/Trident/)) { - // Otherwise IE doesn't send HTTP Referer - this.target = '_blank'; - return; - } - - $(this).click(function(event) { - event.preventDefault(); - event.stopPropagation(); - window.open(this.href, '_blank'); + var internalLink = new RegExp('/' + window.location.host + '/'); + $('a[href^="http"]').each(function() { + if (!internalLink.test($(this).attr('href')) + && (undefined == this.onclick) + && (undefined == $(this).data('events') || undefined == $(this).data('events').click) // jquery < 1.8 + && (undefined == $._data(this, 'events') || undefined == $._data(this, 'events').click) // jquery >= 1.8 + ) { + if ($.browser.msie || !!navigator.userAgent.match(/Trident/)) { + // Otherwise IE doesn't send HTTP Referer + this.target = '_blank'; + return; + } + + $(this).click(function(event) { + event.preventDefault(); + event.stopPropagation(); + window.open(this.href, '_blank'); }); - } - }); + } + }); } diff --git a/public/opac/js/butterfly/alert-64.png b/public/opac/js/butterfly/alert-64.png new file mode 100644 index 0000000000000000000000000000000000000000..c836fec1ef19889577ae1a930ed0ea2be25461ea GIT binary patch literal 3144 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 literal 0 HcmV?d00001 diff --git a/public/opac/js/butterfly/butterfly-ie.css b/public/opac/js/butterfly/butterfly-ie.css new file mode 100644 index 00000000000..5f2d24399cb --- /dev/null +++ b/public/opac/js/butterfly/butterfly-ie.css @@ -0,0 +1,37 @@ +/** + * jquery.butterfly.js + * @version 0.10 + * @see http://irama.org/web/dhtml/butterfly/ + * @license GNU GENERAL PUBLIC LICENSE (GPL) <http://www.gnu.org/licenses/gpl.html> + */ + /* butterfly lightbox IE6 hacks */ + * html #jb-overlay { + position: absolute !important; + top: expression(eval(document.documentElement.scrollTop)); + height: expression(eval(document.documentElement.clientHeight) + 'px'); + filter: alpha(opacity = 70); + } + * html #jb-window { + position: absolute; + top: expression(eval(document.documentElement.scrollTop)); + height: expression(eval(document.documentElement.clientHeight) + 'px'); + } + * html #jb-window.reactive { + background-image: url(../images/skin/reactive-overlay.gif); + } + * html #jb-window-inner { + margin-top: expression( (( this.parentNode.clientHeight - this.clientHeight ) / 2 ) + "px" ); + margin-left: auto; + margin-right: auto; + overflow: auto !important; + } + * html #jb-window-content { + overflow: hidden; + } + + + /* IE6 Fixed Position Jitter Fix */ + * html { + background-image: url(about:blank); + background-attachment: fixed; + } diff --git a/public/opac/js/butterfly/butterfly-thumb.jpg b/public/opac/js/butterfly/butterfly-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c6db5c8eec1f07aec972b6bf150bbf48337e2d7 GIT binary patch literal 2665 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 literal 0 HcmV?d00001 diff --git a/public/opac/js/butterfly/butterfly.css b/public/opac/js/butterfly/butterfly.css new file mode 100644 index 00000000000..4c3bc39b8de --- /dev/null +++ b/public/opac/js/butterfly/butterfly.css @@ -0,0 +1,125 @@ +/** + * jquery.butterfly.js + * @version 0.10 + * @see http://irama.org/web/dhtml/butterfly/ + * @license GNU GENERAL PUBLIC LICENSE (GPL) <http://www.gnu.org/licenses/gpl.html> + */ + +#jb-overlay { + background: #000; + z-index: 999; + position: fixed; + top: 0; + height: 100%; + left: 0; + width: 100%; +} +#jb-window { + z-index: 1000; + position: fixed; + top: 0; + height: 100%; + left: 0; + width: 100%; +} + +#jb-window-inner { + background-color: #fff; + color: #444; + width: 50%; + height: 50%; + margin: auto; + overflow: auto; + /*position: relative;*/ +} + +#jb-loading { /* For semantic value, not to be seen */ + position: absolute; + left: 0; top: 0; + width: 0; height: 0; + padding: 0; margin: 0; + line-height: 0; + display: block; + overflow: hidden; +} + +#jb-window.reactive { + background: transparent url(reactive-overlay.png) right top no-repeat; +} + + +#jb-window.loading #jb-window-inner { + background-image: url(loading-black-on-white.gif); + background-position: center center; + background-repeat: no-repeat; +} +/*.type-fragment #jb-window-content, */ +.type-ajax #jb-window-content { + padding: 0 1em 1em; +} + +.type-media #jb-window-content { + padding: 0; +} + +#jb-window-content:focus { + outline: none; +} + +#jb-window-content .jb-caption { + display: block; + clear: both; + margin: 0; + position: absolute; + bottom: 0; + left: 0; + background: #fff; + width: 100%; +} +#jb-window-content .jb-caption span { + display: block; + padding: .5em 1em; +} + + + + +#jb-close-button img { + border: none; +} + +#jb-window.error-no-content #jb-window-content { + background: transparent url(alert-64.png) 15px center no-repeat; + padding-left: 70px; +} + +/* Image replacement on gallery controls */ + #jb-gallery-prev, + #jb-gallery-next { + height: 0; + padding-top: 85px; + width: 49px; + background: transparent url(gallery-controls-sprite.png) left top no-repeat; + } + #jb-gallery-next { + background-position: -49px top; + } + #jb-gallery-prev:hover, + #jb-gallery-prev:focus { + background-position: left -85px; + } + #jb-gallery-next:hover, + #jb-gallery-next:focus { + background-position: -49px -85px; + } + #jb-gallery-prev.disabled, + #jb-gallery-next.disabled { + background: none; + cursor: default; + } + + .type-iframe #jb-window-content iframe { + border: none; + background: transparent; + padding: 0; + } diff --git a/public/opac/js/butterfly/butterfly.jpg b/public/opac/js/butterfly/butterfly.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e407b320cf9a2394cfa23b6a20b850ea14c3f7ae GIT binary patch literal 28274 zcmZs?1yEZ})G!>Z1qwVA_qI5}-Kj#GU?mVN0g4w1!CflQ7Hx5dBEbnoLvV^ifkN;g z#f!U_^5=QpdFTJWneW`0yLM;y+}&e)&hE|B%`X5gSOcU1AR-0;YzPnFW*cz#nU}Sb zAAkrz3IG7O2vxfPn#VRsD_ej~8=;2i1`h}Y(B8Rohw2V36%{S>Kh*y)vop}rGO*uc z{ul0XF|!eXnTv~uPk@hyOI%!9T3r0m{|!WU|M}-G{ar>nI!1=OgollRiHU)YpN)-! zjg4P|hl>C_62f8v0s>;fva%8qva*jJJ^VkrxM>62B`5YH_9G$U1`yvRBDqU+(+S7| z0EkJ5h=>Sy{x1*_laP|#x=pD37yh@Fkp9;|3m_&UCM6*wB_}1lMNCBYZ}nZ02a<H8 zkM+nb-QIH3$L3T@?YECSf$%WgTC{SPK6qF4G%okMJ}=`a(~|Z3Wf{J^gl>rmKtxJJ zO7h<TM0bfFkVw)!)+4p#mZEoy&3VG`_5gA-1E3-ye0rDUF5n^H^bLs;mJ&ckssx~A zAbs;1V8zOCpXd#M>c1WYSqKU3f7$=ni-ER{6hJ_h0OYp-52%P~sU88zZUHpj$la%Z zlJfwN#z;Z&mW?trCFSndRDOPSjd!oVNRj^(lpuO3C~@C_Fis~x>08kUvOL<MvbUcA zukPQs=9XaTloDilbBmaTitHuf6F?`C7J&S}QU1>tF>PX><0Q3AuwkYnHvWHF1Obo! z|4#_S^oCF*23QgPLDB#KfC8MgSV|ZqC2U~#5#bRzFDb*+Ulx-rNy$=vc|rD4mkrRa zwAztEW~@&HP;Ucx*^oUVXCVhz7t<1h-c|U%iTFYeBw=L>d-UaQ(I#mLBahzO`*Z*n z0GR|WpzRR}fR+mIjEYo(K(mAr5rFDnTweY!K7=12C7~t1b>E5{@rn2=F_FZr`_9^L z<oG+M(kT%Uxz11mPL*=}ZS0h>gnXhpM3yP{4v^xDmcv`#?o`sg`+Rzzh%=wwB{OCY zQ`gHh{%_DnZBGF#?{d_i<QA0>Fk)1H89oMlk{?g}w3xI90(?zgp!D`WZQHB+l&}65 z5kmUtfAU2ClivTgL?B55hL73+Pn;io0s`L{XcLejan=s6lBJBdfzewP6AA<@Q%S6x z*}12vt3(OykMK;nqOs1vt_Q`8{2&Q2tvFjy{3C72*r!?)fH!x(=j*eMhlc4H015rx zVq|=Di;*^+D7?}@`^_dJ_mlxe0mYXh9C2rNs;Nypu|qVimP4#QD{1$eFTGL!v-<yw z^&`NCe<zZhKp_7j`yWNV``SiI?0l=UJ=XcwR64zt^V>T0N;&m!ywgmb(@bsgHjcpe zuNVoFsU6P^rMKY-U18+!#ol%2UU|&lx$?LdN{k>(G-a5Kwp2~uSCMBUa7|jer`#V% z-@N$3#IN*4%S%ZypVU!_fGgvZeEp(LjhvT!dUC*Dz&D$OMJsuUC(Jgv7iDY_kxU=I zkzN5=aWtVPenvvcFqOBL|AV?@0qGkkfaPEM{SW>lV&XT1Jn5shM*zTm0FeYs3dI{q ziT|YpfOF)lnfogw&XHEm(Jy$X(z&P7iN@IPPi4G`w{pL~^7uz&Sj;o{Cq-I!%F5oz zSlE}0w_#~tN}j%~CAkAs`T{xir7NO)wq%%%lX4@TidT0Nc_btA;45!91%O(zfPmLf zl)%f1gTJIezu~!N$K9b>Z)Kl?oz)T#ofwJ!$d=F=Pyf%m=E=BKVIMK&<h;yAO?|Vy zRdZat$JuJ)b$Q0jBHHmGdGA5BOZ_@NjU1oRV%%EPg}<i&2d!=;?@jhtZ#Uim4w8D# zb{DP(GnVHRS|h@j%^Jg@U8uwWzq@X6(9zNLwt(S!x6{*u>kC|Ze%)j)wvZxZ3{iPi zookWnGncByY$<s4dwEaIdr?*c2euF{p!Rrzl2AW|2dP!sdthdtnniwVyq%E4$F~!$ z$*!j9va+LThE>o#P_Gqt?A$~=^f-wwr)%Bp*q=AO0jym#ul8FWn}+F%S6y$_)sM;7 zWv04iwyFeLABp?T&zw+aowA)`^1KzB#qZg@#%jqLKzS?*XBdgCwcfo-RS%DY010g9 zZWAx0m1e_KAk&ZIO=03EkFfbdW#cGOAW4v)013i!0=^Q&&A$qZkN{rs1MbsOX=z7% zr6%x-deyCI<_B_*dvC3%6Bdr?dp?0q3E6kr;l1x|;BP}SK4HHQh?AKDOG{X2LW9l| zcj3(5?_&Cnk|uQ<e{b{nT}3+CRpKj5onrLN?|WxNrDqjZ;Vu1-4O%IWG^Z+6&|76l zj4^mEGUOd&RM2#amtie;Gv5thPHuudK+LS#)4X>)V{4(_Kk)~Ttb==~Q8!dEXz?TN zoT_hSvB2zkh`fo5SnE+=AS-k8yvp8e&{6V?2D{UwPytO`-~Qz*C(Oth#0kpa+NIRs zAsrx_Epp{JcsaP#e?9)!F9=oFfYGnnq8=ZcRK$wgltex}k>_w?TEY33zT00CZkAf% zDXH1^J7>+DfkkDFHf9Q(!BMjIMSNP#zKgn>pC>-+Q)qy|VwH}?Wodpgfei^sX%i_1 zr>!*@=H25Be527FX}4N|zWiCE<4oz;g`yG4xNxY9<bwnP^F4~Qn*tX`UmrN8H#g4& zp03_rU^V)iH#K&Y-7KQB)<5`LUpuwg9U-2|8`r}DGE{+^PGnT}Y^2Ui&(Cyo`E`rc ztJhqoSh-Hc$7zeu4{`)3T`$(P%&I;wbX>}fDQOr9@}u5C)Qo}(!6imZe)YQ*-AX*} z;CpgO`=^|D*sl+R)1qyfW?YeE_zwEP*5`Ij{i_(WY*AQDI%|F&T*|^$%ScK6xbz=+ zYn0w(Wott2__@rv8q1MPx8Yjp^B5U>#f529mpvX~t^*7BiL!p*hf@I>Eo%7V)18=u zk<!cN{GyXDs@=qOfTGr>dU~8Se~JV5=bIOhs?!~@3T9YG#}(dX*@UGHzNP5&tVI7Y z_}5aFarwEP<faY<9hx{3uFL@07BMsanaPmCzq|808`LwfbSFhiR@Age>ZVeN@st;N zA*Q|=44p|%a%x}y6*!-tC-elYhX5%ReDhlK>|Z?5w$QC{d>*k8(kRcwfj~O>Pu|Ji zC6E|I)n(Gh+Q-2hKM1co@5$z`XM$Io>a*E8L`#VNs~6(5?&$NUf^BfbWB<v=wv^ri z30^5dOD%%N1Q5L;D4_q?<`pr3@e$cetNZNqw+PCRdrI!{H}==>zhrz;Bx@(I27N43 z?<+h(EOJl5*$G0@gWiTD_V#_}&=h?F+XzXE9fe?~@ss|Z$korxQ(xHN$@dm_6gi(( z?3|uptdG!W3*Z5vShg#l7#ac`{-w)|=SkVp3w4+~p&r_WHp@+tmvJY%B`6Od5EbT5 zT4sFleQL|{4l1M5iX~Wn@LXfEO&-D#N%pj~?)SLU_^(8_J*6b?B)NlpsKR8eeQZxi z--Pe#(CP3;y5Z-oLMU03p4@prLQHLDSc+b^kbS!^8=p6aB=?^7BBRcPpZD%Iex1fB zs6?;Qg}T9d_>XeGJbQU_e#S1J*63~rH}m)gEY625P-a~}vH{~L3UN=!k}BzvT{1_v z23*ydc@3`On#aq!86o=F<RwRIKiISK_u4f?3$UnRl^>!S<szk>LLI;SkALHg9P&TH zol=j@Ki6C{Ygb$T*;FdLhWMkl%m2w(4L`o3KM{eY8@PwsOai-GO{P&r8Q>9{M`<iy z+VWq&c>TLQLwsH`qe0a=B6>>E$1k}nvm^B?rnABm(I4$ZzNMM<v2>HqXlSbRhjVz+ z2eLZk>o^N96)CiuY8Ve++`i@fv=?X14L}UiwK4<sTwX<R@_EmL3e}VC9hUK9n|=6J zZ@dnDf?uD!DOb=9fDM)kuiL<MOkg;0JztjHQ0JvPDkm|8L7LCdit1&;40C~!_K;bO zDK0~JSm(}Pe;L<>g00mKgxoj=5(1{pnnZemr6T;ROU@Z}4ly3jG9?X4e9z=!`2s!! zMO#@p)f||l8?U-t%65qwvUx8kEp{jwtPRm&1X#<0BT2@K3yQw2Wj%92IQMB9Fr*ud z_q1mo|B0?$c1Si0C|hbOH%!xKI+EG;kJ+;H8OIN6UJdN_g-D6d9j7P7Ww1FksNK2n zJy0A}XpjYou=V}&_uNj`5f?i`cz+HU4RJ;IM;NYLa}Kj37R7%D>eL2jI~-2+>-p#Y zo)9YA^f&)}RbqI&bNMliRpSOQZx;XDM3W0E<&c2K-ua>*nvf%6kQd?9lnIX1=S>G{ z#l3>(8>c?88GD130wwZmOYndAR3O86pN{2UgS3eJ?HG_?)xWvLPq2n>@%Iv}P-oJq z^jp1h3<QnD5wUvz75EuDy$y`}7oG<q8cxtvOzo9&3<i;}rf;>m+v+FMBT1{b;nSSm zYZLQ$tUp*1Zo$>*XI?si-c83i)@>UmT#fG8aMBcBy_?H4tV_Up2)O-;-CY}2^l|gP z?r~qqSUZXrMsh87OCbac7Jz}8%W2sw=hm@;u*~UhTB!SX72sfiOS=E1eqn4m)c62J zGaijfcMbKt$P0DSm<$Te`)nUL*&`O<4O&i?b{Mf$XdUx2b1m@Ybdp0%fB00AziCn; zq-S*=beBT6-TRmC={DYRxo+Y@dpLeyIKCUZ-}Wx6SfNX?PsQO`{Ek;!dbKxbD=yTu zU!nCp>y{)PkI)k#MX;o9I>=|~2d1H5Vu;c_Z<WIc!_B_+vy%0@D0nGPXL;fPu9~4E zI#7jGbxGVdP*pXPc5y<d*{96~l+I?PML{s%vFJ+{0ma#*VmbU$m+3cEr44ioPtC;R zmjJn9bwydm$Rvinwo9*?W%91IxPfmMHvsjS=1B;C<`-&H_tJVTgygphv4s$KZ(@(s z80nYJ4`k$V+#h11SWx6cVsy}`cx`Xl$5DwEz*+pU4>Q7A(<4EDJJRW%B~+(%_tWf0 z<5r4RQG;?cr4+QIyYNA(BN5fJmjE(qP}jIz+ETTWvKUI(L1SfQ?sXD1B(rQS%p~(T zUCYpW)c7RHWoq_uKQ&mqaq(r+93*KzLr80RDRs^JD!uMroVF2tHD*f!D=HO}kO(uz zJnd;UoS7XmM_iVzxwn|tmhfl9T@5fUnK-#_J=d0LtJMYxiT&XWCbhStJ97IqVgC>r z$x&vUmc)9h5_L3fTAu;CsMd)Vm{KqO>1F;J*I74yd0|t1dLAzFSJt+&XYM$%Zlci_ zmEqy*t~gXYLg)eQ8JD}fBe|!9$m|R()(E^u(rU3{(!H>`Q|NVItfUK{^Xx0?x=i;u zGDXsyAF8(W6d`<0p*u~r;?4J(nfvnA@#P<u9Yp1=ja3+yqb#CH?3-tuk-~VtjkMwT zza~7B=))ml40FmQR3mj@L)8g6wlkv2{t1P~o%f_ELFE%nQx$r1US!zZ`qZ0Y^324> zhO946t3)L2l{Qs`b&-BiCqRO>_g_^;OJYSN2jFkh{zBL-5R_O>74`*h|0*{NUF@yS z>D%`Urf;=Z-hD(7{*B#+{WdqvBY7UC8$i+2G;G{$0=e>TNUN~KD*z@~Uw{g#5K;8* zJ#35~92}f<-_FQCLO*6k`kY}fUh~1w!**K+t0dVKZS_7}w8M|z+e(^PaU<9Cy2=P+ zs7IjIUQ2`4g2+zOgaks)$A_5#;uf08G1Km*tZbfW?=qG?w(t*TqixRdhiK0;rj$Zc zkptdUmWKUbzKzPK_>N(W?UZ1*FlnMRiV|%$mhK6%eB+Nc7J-#Bs;Pv-@O`63Gl^0W zecofMJp)qek{<QNj<V~(5%IDX<=5-}rs-EHMd#czsAQUsdoMR%PUjbwEO$L;{HPMH zTG!IhwKmTtW>IUUi0YHq+E--Xtu`~<wr1KuV}Gvi`kb9f`TvgZ6Qc+TPdM=kmdV%~ zsLQmFRh-2VW=MbOyyf7z%!a9}B^bCqOMU|4^?qkuH;<I~O7uvHNMWP9c=8*~+0GqG z*udnxcRA|bQR@wWWHRr^-=UAmK5BTUYuznXAbEzSl@WvSn>d#H#BXzmMiRadv*h*u zJ)0R_TkuUg5^z9^Rw$iG4=B5jqS6Lvf(n1Ox*cC2FU@*k&}OG21lr%}W0Ygy87#^a z?h#1iBYfA*NoB(3wcP!mQ~*!G$1#Bb;B`LP6Lc+Hiiju=(cFyjdXI4XOww4h=`DX3 z^cRk`KjCtwFAxwL%JjMBINO{=9-hh=>rK{_tQHMa9x0@oSGa$FnKsF|Q^8YV9b|U{ z=;NIM^~*wgIuCcoTe4ZRk#chZjtTIcRyj!%*^}h&riqTcOXK(GXhda}KdNas4^#1Z z&x*C<v5bN(fkSdfD6^_9=8}8fpn%kA2>PGfseC|Dv1m7~iS(Vq54H1K=B9H4cv!!8 z{?1(8zSFHnUE7fm*O`Sb<5^jxXOfA=szT4U!qr?@W2<=Le)_qZJ=aMjJ|H2^p%BWO z*5z)GDQ!Tk4~(FX>__8yQ&;`(?ILuP&2xCO4EG*}{>9-6GTHi8hNc}nZA@5MaUxM~ za7^0LDmEreWPQ;fg93=7f}OjOeltxo(q68ay^j6kNuhW#J#g=SF+(4N1TF20$1m@b z5*GndB;^1EMO8%|M)QpKyA~R9pO3rvg}W^xj5;=C@xanFLnji8ZQeA~^rHa7Ksrq2 z&<QcaaXu9Pgz%EOcPOzl5y6j9CHjTt`MuJUB7}amWw8qvGF15rd^v0i^Ac^Dn>hLo zS)?DdR@G0hU^|Eh+Q1u?<2>qT)4dRD)53CM=2_{EO;^lv7L`-O9;)t#cwHrXojY&w zGtLjJs!@`j?~T1(6}^45?F5oluXy)MEk~CT8a~OXK-A1o<WLg{Q;CNAaI|mG$B#j~ zXR_;c_<pQTVo4$8(F1bu8B-42@0>2cPsc5>XEoY3C!pkYiGg&6@5A;dvkyX{v}kx( zk#fAhC8Lo!1>>%KlCygMN?ak0TF1vRrJl_P!V(7W2h(t+h&|~KwWH(BPs<GJPDc+* z3i+})V$=t!8bu+ev`e=eb;>;txH3J{+ULn{dA_C+oOtz;uJ;j1j+N`raY^K7N?K6W zHLB3Z%Mk~KWN?oTrB$BY6`nq(PTo-RY6d5}{IwnOEn|Myw)rf=pf^LCqKk=JQXrP( z5jo)NYZgvc8DdtF8vy-UvxnVjkdd1;8MA;OUs7uMi%Y$w8-V{#hWx3Ike>^FbitWZ zjhgO&{OIfy<IKC-B@%xnv?pY59VBez{W8It6%3M>eLtWiz!T$vbFv*yoLEtD*rO7} zex&?_d-QZskAWa{C8<ckQVC{OGl3Jt#C)kv)ngd%IMWk#*SLzN?Hzfy+4cs7LEc$k zYjB{h{4<Bj=0;1w?~(64b#G?{^@t5&?QGl^&?cS!f_<Qog0$}$AV(ZfMaL_q(9S&{ zRnTOPXp+__HjnNXgqwad*1G{DR+Jr?IUjKalxJB#O{U=hiy7Aj7$6_({Ii<Yow(hW z7QM<=TT!KW#djJZ4~07>EKt~$4$`^(0Hyl6o+%3_S)}^G@@?BsUu=8Qw5m2OSI!R{ zw!nP&GVW1Z^!N2kG;-2+J+yD;Xx{Di{xgj?(8~ty2YoCoZCthwQkL!tIN=>P6jnmR zM|g)H{8T!w8;u$8Cm7i^7`N-5_J^zXWl`~<eLv}Ok)|H?gIH%9JBUcsJG4u2mQ#5v z?nErRxewNmBR@40LYWmV9ewrQ@r<3lGUBMqKX&h9`mZOd41C4~+S2JGKBYdmZS!(? zZmmz*^}4!LxPce9)GcDlFO2k*;cp0jHyaow`vZRJ#QtXzkXU%iDuEMI_4w7lIX^aT z=-yqMESycu@L`5K?~K2m8~6+!Dk)X+rr*E|!>ALR%OqcZPF-G$@7CpVE;##Zp%<31 zy<P0TweDBZ|M6a;U$(dqwzbfe>_r{TGxqzuL(C>yj^C3OoVWZFGR~iUG~FthNy0k- zhlOTM#CkK7*&WP2SNM(21WN_BhKt6hB|E5;L~(WrPx7s5Lord=f|E-w)6T6hKJOK1 zBdvjH@YQy)3%+o`cN{;Up0Y@uKMq+nzioJzV9hZkyei(l(&22LT2esb59lf#C8Ho0 zJfTMRR0Az3cXhL=;^|$C)#baI;#89G9&icwxPhtAxN?uUAEE1xvv71D-(Zc$S&;i+ z!J@5GNpLV{LeD*iaxXmcZn0boPoDd>HM3CP^X4q1$2cZABX3ji>3)~~LaNSIK!}&B z(LHJzV^-X7c6$~Yomw`8lU=AN<ru3Szo<k;{&+$%@>jvTjSXrAVENvh`HO_eAP(>> zj&}5ZE5gaFi&@8S<lN57U-c6j>nO}g2|3Vny65oT+TL|_%hdS!rqTjNWUg^+&&8Ip zVAhuP;aZ{ufu2*6l`r<Y{rnS5=qQ-fIZbtVM@YkSZ@r-<(x;@NiK4yF#vSTTP=Pmq z$>Y8v_5PFWA2mt7uO|P<Div9M&h(r^Wsa9dK>qw*WVm2GOJ~{1Kj}6Zk;zoMU9>sJ z1XKNSnbpTf!M`_ME;w_M{Fx+tT;33A3Z6|!Ff6D-4E!Dzo1Zy7_))et&=INdy}TX6 zHQO8KIdJ}IkJFO!)0Z~}lvKuLEW}WvPhbCy5!@rbb)vS*L6fZ$)+5*@u9MhRX6jjy ze$Mfuas@HHw~TS>EoGQ<&@%VqxUy~7U!P7_QI3(i$}&naw(Q{KIoupu1X-@d{4*U3 zm!A*=ON=wEgVfbb*5JF350LRg=v414VYw`GO_BUX3VHs@#nKx<TrYYRxHBl1J$S3g z^lRmgHNm7<ELQ(jf9_6q7>I?Tv+`@(FM`ky+va{YteoOvIs!Lthn0TbZK1dU2#exa z>vk?|`&Mk`wjcP5*5(Fs5fsR0T_bNX;kwLh#%=w-T)cTagPvTK3jM0`fyc8kOfH&x z`n!``s&w{f6Tg`9yGdm7<8D9PzGyN4d!+N^zb&{ZIk(o~TkCc(0vgH3)g#@YytiYb z+E3<B`^&ErYKzL&9kWyK*$Kc9!Sta5w@YS66Ktv+%1GI8yoPCPU+8aX6tNSwgxayr zLUl&`^4!=LZ{mRoAB7nEV!>MFl^6)`%O7)3y+rG#hsJ`mI~NKunDgC%l^7?=rGwtl z=^?!C34XHCAZgMiL#|q<WCaz5FU6KqW)J?z)4@5{)foU$?mGI-J~|)Ww<|M_Pg^Tr zMZ#{sW$I<f_nXH|%52W;@WmL3i68gu+=Fj9D%GW%_*G%uLJCw1g>9=mTu!!ms9s;~ zSA=kzHQPBUBY2-X)ZPF>+>1%)Qx1@^xZ3IyTlVCnbT>`yreqItJXUctAp{eX%r;^P zE;~^=lzZLmB`Q8z8_jO+V=i;mqSnzjJ&ha~tUDdE^{N=CrS|+Tw;ZPSeLxPyBJT!4 zEMWugh?>?S6gskG2a{YoxMWn$>?A&LFuz}%m03CJ+oy0evBDdBKm29iIwoT5DCL!o zzQd-U%8U8lm&Nh7+ChgcHy%l*aS)f63wO0A!^)d3C+ZaHZ!-B%-mUwMD=SX4;CD}l zc8KAAduqzAsdDPmk~4X|^7fKZA$XEW0g^wT5>b=5$M?*AY@>ZPVq3ozXX3N^*1+k< zBxlUJ4vIrqmusj)*+c=uDjJiIa<Z=r&M58A(Aj%Bt?BSBBKypx6|!!fOfu{#8g+)R z7492AS`P}e5A1fHf>^h39M{#{dLrR0xt(6GM`YBwU%dTFDgj&~S$?S`p-uTd<QX+x zv4Pdo`=wqO3>H6&pDPWUs_#$5rKts924!N5lll+cF|754A{@!H$fipvsM*K3>*d<S z@}Y$ye0wYJ0=1t1*M*QVYd@E|r;G1{M!o0b6T>!Y*Gw8JI@F6ZSUWV=>ScR4Mz*%$ zMs@pGF(K=ZT=rR;jYd|d`8a*A4iO7VE|;u<Y_rz6OgU_qN2l5WSK&)Q8>z%s{f$4j z0kmy4<W@8QnRL&kXF!0gB7Yh}p9h+i<3Cm#I4mDSr+M(K7Z|r8p5#*XN0ooFc)F$X zutm0AZQ0o-O<U=V>#<yR(?ZRrkw{H?nbVrKz5ej@`3*p+9*H~Ryj<1_S1(*meyd$R z82!DBF9K!6U=sGa#Wq^uJj=zNNnv?W<H-8XLCJSF!frME=kI1iAKOdLHTF`+FYz}3 zchyYP-NfLk%!zS0*wtUGeS+Skz+Z{rGCKF#+Fobez;U`NW(pTIk8!4NJoRyatURP! zR5+E+(Z`EaOU@}YyvTcf0|3<r2wbPvVrv3Rwv<EQnvNPLDZ9>%5Pw@U!?o(r<-?lC zE%d(z3}U>8J%oR{H6-{jnWz7R-vH?Tny@WPMQ$<*L%4E*+OdR?f_jx;!Y4U88}<j3 z5Q2t|wb6r!z87xvW-8Y?=_#12#|{}cr~@(TksYz>>{~}V^P}TIhylk^$cUq;f3^F2 zQ&&&pKZCC<?zq;H<1vink0FxAyvaQGbSj19$K>UXk@6Jsw+*-P7NV$9#t-6TYx{EF zD3pReW^HA9j6!A*W-cmX+OB_%e<qu6SrkOh>@2Lc?rH~(4>bMS*_PLww8ED|{Pd&J z&si~4J9XRvh|IpHCv?WP#j9K=!?9EN9avr3VV_lL^usj0rN3l#-lOr5G}GLoa+TbR z{?sdK*T_%<C&NmFn~GU8c5xLS;G}Aa!4$-JAXyHOk!_C5F0+&FE|QCkT7e!pP7w*U zN&?B;cd@o$z47N%TXBj3c2-Y(_puHp2dAk%%GWJ34J##ClDa>>typfV8oDNI<4q0C z^GZ(jIM|c<+;xn&iscRG#b>-W|2SckT{jBN{m=zR<^3zUWrgG=o4$@-d*v!R289Bm z+DqrL<?cL&0Ww>YCY|1Cy|3=e6>vOqOsO0F`cjfxFBElHaJ@)wlbIeHksi%`h$Q0M zFM_`Vz2f^(DFQ&h(Ph}Iezt@6K^I}Pb(wYFJ*#_>9Ak8hr`cHr3TaT*Pb5@W#ZJx5 z8G2W1kAfho7cXN*hc|WvQN?TX+9{Wr>%ptd&GoW!qj}2$p^($OL1e3)8b>+CKJOZ9 zCD&kv4Vh0sLr*b`yU(HAndM>DNXJh1TC#u6^>PJI8lL59Q*b-n)#iQyq9&6ddJ7ph zg07mV@vv~h`*Nt?GSaf&{erVoE5$92)#=alo65=x_PHhmo1Ucu{vrAnbJ*3l<I-2^ zRx$!l^DVK9_BjP!W7SJQh0l97W*x3^I2Xk34PfWAG~)W1kxIfJcU!ZEMX<SPNIYuF zk`JtRcBo=@i9pX^cFSd~sm$*=cp%)0yEf2tc~I#rOwp6^xtjFl2nXQR{#lmcih<o| zpUt6?r;pjXie<Chk5ywTw!ECVN{Aj-p`lpj;^00D)g9<nc$p!`Qg#=mkz>(lo|h-+ zp_}Q~52X3yt^;8fQ`|4pB9Hi&yKLx3ifghmOgl3^Ng6my%FqJrNS@NMXhhd78QNr+ z-{D9<=VUk2Q^fnwxf?4!|401DU^&`5<8*5hDKd{WFRz)XZzvq#cFRWSwNHC7*P)7= z4b9jCAxis=cfL&8ZWg>gM4~4CepZ_?fi$|9F4tFzGVkbphu=FKsCsT~+4A9VsHVm& z66cK{l3tygao0DgaJVhpXx8atD4C@H!E~wRb<0?lvghe?#C-Z6Ri<3M*lc8dEw=j3 zM5d*z`Pg}3|7WSr-~QD{oVsqT#m{{(&}M`~#>3sG@?0lrGSjVhCYHVNWxOTXU25B@ z&+Iky<xYKU>))Ygmdnq@vEo;;n)6UkgK5>*Lj`FNok|Cp30bu9XA>aWgL?&97Fqw; zI+g;Q&(Vve2gX}DL)^Z9{vgX3v_}Pe#DO0%)Ac+(jyhE~nRMNpX$($FEQl{ifr6pS z>RK!=ySqLf*Ia{*-Y_SRCNP>pmK9d5wQd;SF_0uKnzW6tyr<DskH`EICt(mVZg_>O zu>O%d>tN1t?t1E>sERBNj-VMVQSBIXd$%q&Z_MmvUPzPesQ>xQE)7F@G-MGT5PUnX z)@AMVGP9>#9z1T?oJCrv;|P1Ob9&}O=L0wEQyOjc+jnVFtgft_^1B9M+(iYL_91S8 z%zSN03r;RRd{(&p2iJY5_cws!r3*K^jd{JuP?garCzcT$m4aAD&m6&WUt0)pp&KXf zLcO!_66Z*=GtqS0<a-bC6T7=Mr}@At&I7TDsKKEa1@#*i5T|+(2_;)#L+qsVut05R zDo72heDw*DvuPe|n>LoHOjq1C@3QA|CW^_OIo$Bo^FIADhuqy0Qv^4dv(bOgQUM!S z3go={hB#1dR^_Tz_VdQ+rWxfY_An;6>VB>%U+M!HF%%`Sy?A-7L~9`QsW=Qw^hUpv zi0QeOVL{1)4~-Z3V~obPtGSHZ?xxv5pw#U<lMg~|wS+$6YD{+>$BQ@DjVv694Ok>R zt+~nsc}Ww2I-z>^zwUYNX0zWNR|4xY^49xgC^SJOdw^UYkz-|zAh|>#gAK-CepkCw z-DOB**jZ+yYhvH8+|rrnxt?eBvn|EJN|qMA@0b59SZ3STVJGB4{Yu_-C|CySbARKo zK1&gbr9>UbThIOXp;6i3k-nLZVC4gK`WMG?ujA-=Ke6$C%6%co@`3cx?Wd)wFSWj; zGBR;%Q{=vU19&GLYR^o86719KDk=DUXTsaapZTSc+&Bz&-p*eyVr|}^b-Wn7JJWd0 zZNw8*cVzUi|4-Zv0IIbkEuoOiGbRu77xw;z<}(3dhY}3@_`(NTM=;*;arwW~{Vm8& z(l7a!^doB{^$PsNb8{w)N6{6tzH;06QYYS+;7QX1kI=6hyttKK*WwMO?)JIQr4}OA zP&Ph|daO)x(~+-0%tIafioz-++DsNN5z4SazWK9AP7!#K@H$&0Tw}0LfWMffT)PR_ zcssP8vivj|mY?*|OqgjaF@Wse6VYOMpj$-yc~em54M1OT5*KC3k>EM`58IJ6LeUVX z%QZd?ZHruM{!kB|-|#mQL|f)AX)?pJ)S2tfoLf~KiX9`-G~)dH3k=DNFGfkRE8q`l zyb_#}o{ODteZn3AfEIQ0^LV*mn^_EjQOkW+V$}})CaD7>2%jX3WSK<TMNXLOa%#@& z42YkreKJN7mQ=6Fh<{pJwNSdHX=>kPZ}?f<-l#&d10ngtrM5mu?Fbu*hdWI~{33+w z2)^r`;$lAD%`Bm^qC<ts1Q(6eNis+P^#I-srrA1^7)0@~f#86>jA>TIUe}h(oueCK zo$a9-cEy52pQRgfG%Rw`!a@$j9*Ty{#4lcp&pM6k7D}sR*x#lo`3@?`(pLF#D%Ssl zU>kXji*FCE3ziY=q*S`nfYjSk#X9fC_2tT7ML;76^BHY5CuBL)sycq<lSt+iEHY!} zrSYbngKGDILuAr|%Vx$QR-x$_w_^VHyJW3!wULiP&6dlA+ec??)ipBZA0!69Q!XrL z$?`<OL6hpmp1gNm5?}CEzEvi(+_~6<yetbAG%C!rKsK1ATY5rqLfs$M<lI3n<~gKg zg9(#&*;PUx3?XlCM=A1@Th0E;8vP!e3j(i`_Xzy8^lZ)-ordJPmk}bN(rBuU_9vqu z5jxRFfy3fHKB-(fLqBHKrE5i77Dn-fo0@wfSAEk}<?1Mq_R>nCvZ;EUOA{WQcBp9f zykw>pJy^HuR-))0^!sQ_ZvKFE0=6iI8b|DW-GMn8Wd*+W>zhs7kXN*h>`6iExO>GT zPQzvJ30V(K_BJ;rL6_IfY#XxRXaWAJj;;glY_=uv>UfkW_O;(8%2ikwXy3UxWBMiR z(Tkk218P}L;?VwIMcTYL#PWN%@TUZrr%6+^lC|AJS`0FpA&Da#$-$IYsGcgM0UDrk zEbifGq!ii{^RYvf&^hX^^(fsj&ritB<Z_}2dS}ZIed(Zb*X~pOCM2(1rePvuOIvOK z=jir&DwH&wj6zVZB+;Q)P-8BpKcIN@GtQ*XJ7uY4bhy&~mp{#CE4Qju+2<-rvV}3X z#dfZ}>YFO-rlOhZyhXYM)uC=q^y1K_o#~N#EeD=TanVqkdqxS(#@$W8WQ4A`b|X^S zIAb#Jx)t#hW$d6gY>@p&=kt{3XlI_it?|rsRVzN!dfPyz>)zuDJ_hXv+%Je8e0^a< zO-*4Z!_WpGj|Ol$rQ9O1F)$97QIFtxL@<CD_PlQZB{LRy!YLb!pujcwQ@y2y;_qZt z;UkPtk)nWcgNPAA_vwo=Wtw}t!Rca|W6e%ZH-LMtbG`16iYztiu~u7b*tz3)k^{zk z_JZqP-{$)CKvf`Sp>|6YxEryu^m|UZmdhhxbhY-V@n;-z6>RaxGb?5`53Kg*$r{ed zZ^CW7NBXl7Vyph#-mKDGT7G)>Hhtc>+`at963QgBd|_+sn@hGmxwxJn7r&<rHCHUN zD4>&zLAw!0V_&T~v1_jGdzlGZO6n5wT<=v7|D3XEMQ6+4)NH=^gkfdgAF&UPMj{t% zueM<k9^fN~jfk;0Ux)a0Qxz%%YxQrlX|wk(Gd`kC`N=V=D7wf<9G^zD#_IUl=k>S* z_tB-ArJ_8oRBP<Fc^Q<ZycEPBqRUN_YC5$J_XFgeWu3x;?$DkK`)&9V_1iT=Qp1Ot zd98!ZT|U(`9sGnPk|D)_>j}_iQ=uO;t|S|N_iIe6?k0`7X7goL4i3vQUx(|d^;q+B ztnsYlRPWHnp7Hx#DV4R%Tv#K5t$%J~AXsL*qd!}IHvk!n0lt&8jOm{GIqTqoqwnPp zqXM;0eP~+|@DI9#b2vh0oJwb>85d5P*`kg%;!or)Q4KP<s3f<zC4F>gVt-m~6K8a1 zA<W0M)g`Ss-XcOZ3ai8_{#_sEjYDmDxdvWzol4=E^ZaMhIzschrA!Lc&Ak7J;C=Y_ z%_rtT3^Spt0>PJmrY%|a->o$IRVB&>|3UZtg(fW{<Fn_JKdARFCBDY(dJ#{{WpYuO zesYxb(!QKQ;B}AeLz%nIi9VxG1c2My{Rw}!ZUFgf2oa&aZph0L#9+fl1pLKznXX&F zSayG=tw85i$Lm#>FJZisYh4ZQabbbLp`groa}H%?$&TQOyM|WFP=;cL-*bu$ZXy|D zrXDE$wj8q$Gov5$L5|uZlR6J&6*zQI<9vQak4MB)%Wx~cCtLVx<Vc5^*rcecZpkpL z+Me>&N_EfMzR`Ip-xj}CI!c{dUreVge<rMgtfTYn<YZ8Q%RJL7jz>xUgmFnbHfN+V zj9E?LP1^?&#CoUG=T6T8<G3)aE_uPq#<TbkJ<%&^frQ|wx}o{ibxpSl`3{cwpeE|N zhM-0zvE9`dtun8woi0j`cOKMlazUx9ykF&MBubW6{6iw|d{8Ryw4bm8n}#U0%7Ka- z78#T7{j$uc1+~lyhX<ZjHQr_)8Qafa_)!m4nHLEgkc{RK({S?|xD5pt&gqr4IFz*l zeWQf5?h)l9zQxL<@M?a#mBr)4R^cYtBsi!{joFmH8>#!uEm4sbk2G<FYoL>>XZgw< zVjha*rk`detS1J4s^nwI{|5hJ_;4xk`brG%zF0S1;-a%+wR&b`Ycb|lHq$t!lpw0U zc?9iG084bGDSfyUqsOr7zcc7AUe>R;3Mf!TFPtzNt<Qs&Gpy6h1qu%?_YNzY1qQxF za)0V#;`PsbkPo{5^w~=W7Qlm?2XEQ{1UCpLybS<Ik&z=cFy(pTtj$WxLN0t8wh_A- zq_(yoToPX?rf(v)9(y!bx3)X9T{fqy?m3GQqY;a`j9qH=Jq|aW4cXrAIYf_GI0?=g zL|I(4@Ow`nB=zrzxOiWEQtTmvo3^Vh4Z5~Jsft~%Q!ef*g*bt`<e$ZvWPP;D5!Oq) zNb5TE%YN8cF<QS<o~UzWa|ZKaHc}Yx&R|pN%w6WsqJFj2k+!ee@H}g)(U!BLnOs#= zRNJ-`6I;=}({<dW`{DBR9BtStmIe&yeb+VlR$L5ZJriIS>*XsY1LeJb`|M?!L5HM% zPbx2!&2u)&{QA4ZTgvH4X`^%WI*H#)Rixy*Pw_r3;L{Wr_HouSr{Mz|_un!HT>)Bi z0_S#H;=d<DtR}N?C)|JfBU+$v)5YV?&ZP}_lDWWB<k$m@`LlI_4+?x{#^o~B*w*Pe zgT}fD-;44KU?Ze0ZbzY7WT0l5)q~TW=GMY<2S0VwhDEuOYv_B=KH1L=nJ6PU`L7u@ zSaslpn(cBy&4K)mnh`$Bq|K92a>ZPY!644F_Y=|2sXbdqN2y?t(u<9m*57mE76Vvy zHBf6(h{JmB@88p<$OeZZkN{J$PEYF4R%FVMqz6~*P!mYQ{-IM)KO3wxMmIxSFJ;Kg zYk!iJ!|d;sTlK72C~tgyt>b6luZ=+)WOKc@v(7q8R|A*5o4b!V*uy{n$oX4o*{+z( z()vdS8+o6yJ{>8y0(cZ-j>4?d?TElZ%Zz3Xd~gL~eEr2}1C~GL)|r>;?pjH?e8JuA z#T{;p82fWOarU^f#<<?r{GHj|EjM>f@>9@(o!pXX`cAa_#*W;<%+5EkM?6lqbLJNe z+ftX5k+J12mJp|7iaJX)T@tdWy}hNAl{Dv2_pP-4kB;1#|L$!4@`n<^rc8ygBW;(f z;Ll<Wb9H?#XJ;;;_JIM@{3=~(dM~df&L#T_ZM*7^g(jckJSo@si{eYX7Q1}H%mf|2 zGSUg$(XZbiGu%+$=}nbZ11<f*2K1mx#60EjQ#ummlXswt@&)Th5QWuWW)z-{x>~lv z<;$%7!cXG*D@{?)lk8k>09tc@bJ-E0)`~jEP2rBwj9w@(ZtWL%?Qm#8OU_jrwU&{y z=3)_E*6YRIP>|SIvcgu8OkU>8Lrt|+j!*v^E;}r%oa_Sk%E%}k!k&Nmy79wP2_*0l z#JdlodCx+j(flWsx1Kx@NYa~T^Rg|&x;VeuCEUAuWZV0W1Hv$73!0JaFu1|~5VDPg zo4;rkF>SB;{8UTw$6@euJ7k&LHhxLSz2lxkvR`9#sk>gByM=dsVR*@AJ1X`2W^i)Z zMpXTwE>E^$JR*<n$5?~fDC}<@nXK{S%Va-@ifSPyLh)hUsYT(GaJ2!p-VvGhdG1Q5 z|M|~&dYW|xf-?t1CL{5PfeNnih;YBdiiO;Yb^OOm!kK!OPx+mF6kqTEEYi-Ek$NID zzhl`vV~&SkAl2JjbY=dq29YuzexxvI*)cP4jgKC_{d`;1Wg6uu;|Nx8jBH=jxy^HC zp^L5FOcvKa^wAv;t%v>@n2ERy(eqv^S5C9$Pe{5WbJSBEzWOJov1T!I%{+WARKK)q z-z0T+_QYzZjQO8D2GQa=+}NlwaNOsY1v@xnMg{J;yj0JQ{>W#tlZE!4_u5u;uUi&i z<<GB%>#JskF&&hwoU`}@J#=VrsXHEASNP?x)XG03zrTgP0U#xKG`1W9oIKRWpSSM^ zb^Vk5?PSXiC)F?@L{SA22y>WMXavT9`mUmZL{A_ND@D&~KNM$Ke-C}G^(gX3B;P#$ z{TRjp8aSwXr+2`>X0!1HZU(57Our$fmNtI|iE_b*4T`U!IFkI~p9XjM6LMhsAu_?f zL8bHdcO_X*Ot&?m4?w@>xGxy%YsOu_w~UlAq26yZ70buSbWAaPNcpHsR~kIvQLv=F zo*ZLuE~V|E@&l$V^V{nbmI->?WO{gRXEg+JoovK1)?rH-mL_YCW-|RUb&9=&!84xm zzUYp`bg@c=icr%12^n#i;-xt%kWyIvNr48E>z<a*4{_M^c3w^~JPyYyA`G{nVO)B( zaT*jfYps>(*4_NJr3F2I$j2fQX8={)8|=us0W@5qXLr-_-v?bkh;u^Y$BWN{KHS>e zJP69mn9a1{2+Du$Wag&eWES*-LU2+X2>`2@!<l)sd32r5lVSMTOy1<gl7fBnpGJ8u zSs8{XgSCSauU~)2!K;0cDr9}KkbCn}``erz9u9_J3LM8o;dyYB+d}`W=Ts=78#);V zt5CGFF&X&<dX>i2TD*1Y;_jePFY@KU>P4&@(+k>BT8ZKj{hCi7NE<uVNQkIBMJq9l z!Alqy+4wFaVwix;4<iPAE)@B0xNY0nU#{pfJq>kc)l%m;?b(Zfq#wbZn9hCJ;{$cY zkwHz4t93U3T8)`dgIC3jald5!%7h?r3E^hJC*lm*lnp$?(%Bd>1bs77Goh3VoN_Rr zt*cm{C{I&i8Y3QGV2f|Q!t&=PB{MECTe#)r96M!doRzwlI^A9i3IEHIHI!9hF=ytP z62Mv3tleCi7NqJLRTIpX|J(daZk&NJ-&<aPb{QGoa556w?{A2{Ja_{Dv=LD~Rl>eu z0aOwFB+usuzathUc~%6Zef%{CNJbH6v*7G~b=`D||Fjue^#`<{U~-gIj+5sU2;A1j z+)Eqp`cSkAor^u8<e0A=DfdDYq67-If!nix#N)SPMYwL;k7L;VtTki(ih~LR5UoB- zs26CO#Np<AKUiI%<H`=))E-gar$+ti?`@-8h`xK`0~g`-Qsc9UkLj(2a61j}QNNf~ z*s#c^x<xHz-+0ll)#u<tV`d?fv_nluh@bve8-vvxWNa&a&<FDI^W+kCfB2!U8|hq0 z&n}jCe=V6LGvw>{ZIt)yT&+l+Rwm8FLoZ0vYa#XLgNl%7;L>&1WKeBu-D1$ULl`=} z0WTo*{hO{%ZKBp#fp3rk&&)6`!E-3iWMs)6Ywh6H2mWER+J&-kSg`1?zs8B`^dCOS znQa{r9o)nVApSCK-3#Vdo}&+OP=rVs|H_iN0m#zKoH+!$&dw|T>YK&5kJZdZhF0ep zc&<IA^uCIzS}hw6h0%Ml-__^&WVuIg`O-%A(bqXs=wI&KHGN)ru;rI;UtbZ;$bt=X zDT%}m_2NSlzW&B(``(RKNaC#(l}Wbw#%~|`L--8kznnh&PPn2bvsXb$NloElSr`oD ze#h*&d%C)AlCQvQeFm04T^^sF)qw+ThUU&G?B_&m9yQqDQCeGTtGuw9mTet~<`0}E zr@|31KHkeW6tZ-nDZV7jY7b89JhZas!KFcy6TPoPw;U<-oDwC`FJdt8l8e~Vpv7l} zLMraRzI;Tjz03S6@^p!0iRf|RW60-B)zEK%uWe2es3)d@wL68cd6jGcaR<K`a%`KM zuL#@S{A`9y)fy#bm$2X!FEf8d5j7k;65Zk?@4!(-2&7C}B#C9rc%E}b469F1JJe%q z)8pke#_LNoghYNP-R5lN59yW+2+q*tB-S1D_f;{>Uh)#%xfbk})a)-dU2?=loRgFc zUUS{fMx5aXxK2wV0^R+-#=+S{b!t1PN-EWT_+0LK_=(Kq6*@@^D14XRbs72rPo_HO z39FyCz#4D)vzOCkofWk|Zs+3@;mUUt3{di4Pv?}G+-c1_#-51wV-kz}(1WhJA{SYk zU6F>O8iPee-+>XrJegM>)|Wb&tRTqF4d6$%Om=VcN8@8TI+h1NiKqbo-fSed(Fc&e zc?AHdEmCc+S=0UmP?6`802qnifBj7=2&AW^eey2Hmh6#=?(X0BZsy4b_~+2Z?1gtw zH;2IMQI!I-i^bFIS8m!e<NEDrYIlW9{nJA21&zAgI!w!Ud5QX|g6%e6q!<@*_nDiW zn<L`8IExWUAriglLdoSgsy$*g!BFm-L<oY|okUVM>cuQ^aAJWsfDR>&fGg^?34>YV z%)&nhZf7;__)^%unOB9ry?fz5vYm5k#w~$Hbc0Hk=w-cf&&~GHdUqACMvN#3Oy`zB z5S)6Gm~iy4;oP(~6r?Y3TIS0k_lMwgU~)-b+*B3SG;l-9URv&PI5+*q`eykBFV1(D zcgqgCUuouC#VlRypk)(Hwa;WvGWMQZGi%Rvu?iVRgxh70X@b}1v}ojS0G8FyW^D-l zW#G|@hfi(*+b|#g8gN7nTJ%b2U;0}4TH13O<M*w)Arj)IlLAgmu1#q@R#pY|Lo(?h z2BYc!{Oza%`EixhEq7FNKC>{#_kg`ijyixIvSm9NPuX)X$s%O(x5SfLJET>I@mJZW zE7^n?zFH$DS9>ENJ1wQ`-b5<P3Eqcy;zM3Er&~^OK%oG}#-sHZR<0wgV%olfy=Hm( zbvIL1A%7ofX!d)%qhzP46z;2HCcO^nX`UH(tjCIYEKR;eBAsslqXB!TE3n@nUUZ)v z-ZamY?|Z%eJXn=XyLNK}dT0s1m;{XkG-tr#n`+fqfC95H>Y?dAK^?}G;)C9<ot>lX zQ&r5BD@K*(q_{$RGb$14(bnT*?T?SP`f~#S76kPkH#Q!Gaj)cU29{%Vye`0H<zcCp z)vYe8^G^59A-(g>SIeo1ndyJ9a!O)rOYV&qdT=hOQ}zcV2n}#$!h%!oK$XDb6VBEv zN27auY}S7rSuke$eyB^iAi*+@{1cS`m7?rvd~N4-fe&T_`4?k}iNt#GCaF0t{&GJ% z^VaOEJrZnC^ghynVZ`9^J~k^0Qpu*7$6M8z<><5xd%3dahtREZ3$`O5w2Msol~+vk zmEm~!cVYI}Tur44S)<M#@A8IqeH4zt-rJDf6g`t!54xVy{KsJ!%e<ix$h)x(y0){I z>%0&I&oS^8$B2L1c#4{Cim&zPR<m(0nnt8!5Sj)81(COZAkY)R_)t77&~W-Vy)uzU zX7hLa;UtOd&WBC>5e(r0F8ynoUN>hbD!7|tknSJ1p6L*dtM+gT3Wg^fFO7C*ZqbKr zZ{sesuydHnVR2EE?*aVd9sTV7bSK%<tj|7`GxIU|iKUhOAU)rN?Hm?OTq7qlmrK1a zVb{5r@*|_-^x(37bjBj0?CUb~S(bY1*Et;dIF7V>*ZelhUqJmm6ir#AQtbc|6=tbU zzAkTxzmoIwsh#V?Dnt5PMI{7iGMkeJ>~uxO)nrt`5#<ud%-~VeJch$A+n#?8#IG}3 z;!bytkC-maPeXP#;Hv|v6^Nh6S+J2sLHz+z+#W|#D>`efDyw5q5^Y$x2gHu;Jc&RU zrWStqXQML&i8!FYl5eGIy>`brVo*A!PJ0%XL0RE-wS2rMO=)RkY0Q7OklLCn1B_b1 z9OqxKlcyV^k_i`Ov66Ga!wY80-U!&?cgd*W&4^r4kVluBLe*AfH(0@*&3*}TxqVVx zv{(=$9=R5E128=6yADvjZ51@z9q(l_p5?L!YgM{*8!44L7`*``6rThgwZl<{$w~Z$ z8UspoSN?@4H_f`@AX{da-`x<9RnhsYBVR6a*xYQ3Q&n>0(i5pHQBc>~k;ciNKv|{j z3vYQ<jopd06umBxhMvJ{dx}rMv_*bS38O(;Ib(oOTLq$K4#|;YCAM7R4kE-0DjY^C zudIvB^5VjZTBH(#MvC#~<@O!Hl|4N@sq?=>FuN`&&Y?{)cCRR_eUELWX64gvJVMsT zL)?6+OC#Z(y_*<^0#AO5DTp`DnD5Id=dCZ~agQH8e)R7xYz6?;8#Y?P9b{tO2bu8i zEFaWm004shMfAy1olr?h1&Dl7*ea#<=y5JRs6@qx-?)E0R<ON(%2^CLhc}I1TV(q~ zW4jwU%DeEFul8E@^QEcM*?MZ6@p!ddnfvO`2I#}T4Hj$3HvpdW)@e_(d?#Vg_zNo( z5OV{#`*VvE!Y=6WIqkT`_z*t5_VA%!$QagSGuYv3VE`VRZnNsq4IR|j>ADQ?hrUjP z_0(xia>cDO`?#q}`Syvyhmr>D?|7eR426z5^o{qmkYPk&c?3av5m%r#F)VMt0$)-@ zOs$AzTg|Ssj*J)$7Q1arE<~5=I}r|IZH_+I^$I}xuji4OI22%3O$^q|W`^p)#WsUp z_$<ePGm}!ojgOXjwzb#lb5h@hmF&Y=5cYf~mIEY)Gx%?K<3oF$!TKsOyjzFq28`j) zXu9sZ*A_V&`ynFv^%EAalyUKgCD!kM{eMNh2UHVF|M(pdEU1V`FJ7e+dPj<KQ9wd3 zp*N|LNa!6Ar6`0Z5Rfh<lmvp*5SmJrex(E<q4yG`BOu)Wa^L57-r=0hE@wBhCue59 z{WDL7_%IcozAHd1-YsBAj&S-iiloH4!Y+1X7n8fxQVX@u#WB9DHo=VZ*>d)-u<6xC zl+1r$!-c_mjttOwnVB=pBmu7R5-6*v_!}mCa!Cew?p(1{mogmYLbBdH;#i;%-uw&t z+|m{^e$N>h5KMUuE-S%&eBO^8iSt4W>sTm&n<q=SEh@9Qo3bo=<Y_D&pYHB#&O4V} z{iR6UoJo^-tNUts{GRW_aZ}{3UP2;}7r#$Z)~F*GjF{6%h$og5=wg~voFOVDI<={M zHZmAko!i2!-eP+G4c|heQB2uVszYl*slIk4cV9X>SgY@C!PX8{J;6n*&8x_%wC3sI zc^>vJs3|K{<P3cTcp9=7;HK%jFlbqp*<C=>gr}Fh-I;xXB9H=Q!OzX2l!~;`$Eg+T zd&(%!udT~7{Uj})tvQNhD|xOD-X}HfL2<wlG*gPw|BNv<rmee~K}z`4jOy5TwPUWj zM&C?^hkp0kuU0YkF4P4RV0InaWr)n;9OFOcf9`NGek;kO@NvNEAjrnZgOPthDThUk zt;-TWAk7;y?Rm{ngJn%w`lgxonS+USX-dpv4oiaC>;jyUfV|?bAmbB0l1+;Law?T9 z`4=SVQ#rynK%8I9%B~9i{F~|AY04R+pM`Zb8mp7ZE@Tyeno-oNYO|Yr3>Q=Ue%}sy zbazt!9hX{Y1|P!X&A30*F*=m(uaVN@vMAyH*DoK}?AzB>HTlHGE)OKF*1&L^p?95s z)cFgQLw$hcB{%B?BLpF%B`fr0dN6ulBRzSm%p0w;VW`vS|1ST_fLn{K$+w+txh}I& zOYioS4sSxxk2RxYlSJn*>YS{zl;Fj|&OWz?-H;%Y&HXGcd9PbiH7sGm1D1`4m@jVq z<S^XI&~?Q}YzCOl(|Uw(Qm`{~unZ}|hOZwOV}WYdHLhzY7nHVikzSQZ7kh|$hzh68 zWQ6X_XN<nPjCl@wn#{xC#xV9E?%F4yhF=l{@Es&C0k91~ne2LSfn@m3dd*&fz71eP zTn5$~5OqfvKedywS6WZ1ZbqF24l}yw7gho<nfzl`vTL<4!{cGL&U_L!91?@+ZFFzn z(OL|=af&>hYA1N>1t1=A&d`uu76$C-@k-eAEeK`8)Z5RQBz$CC{7%8M(BwC}e-nrQ zJlYS|u)Vb@TUsi@u%&#KGrYr-d-~@A*Yq+Br)VcWuVyr*Z1wHWEv9(z2Wa0mo^eIJ zw<J$_UQ@`&!nyv7g`Uyalui@If~z?#-Nta>sFj*;wBjUYebc&ZLG3i4P;ksX^U!1s zG3>)m_$GX-PgI!T!&%-rJIw}mnE|Khjx8nlap*z?ETD!Amazgfra5p382_#+W5u~Q zOiN!6s$Y{Oukg1(CG)lyw!PD!SgU?5nsc|ptb=GOXkbvG+{|I|FDMhmT&96#GwTeH z@~N;2bDDnn_JH$qUm8?>XtIFZMCiOO)LUz!pAk}9aG<*Ysr#ubq<hX<UaInG=vH&l znn=7sbw0Z?lbc~VLxrS8vp2ZKi@f`7B+BRMKyxTt!TB<xUT)fC4HJ4A7lNf7K$jiQ zTt++eyH^;QmmBuZAXMO#@^n-{*2Z4UHW8o8hK&}cdz#)*Z>1F+yb(L740&$4T7`SI zwQ<5=2)~{6;bFVZJ`r6_QsA9tSR^nFiYYYK^``_KHk3kz954~4W&C4aYC*H{@aJK2 zs4f&QCY?!b)a^{<m4aQ3fb~YFv^sLS$V6OR#<N}CR^w4#Lnmcrw@;ualkBD<HMFI5 z?^R8<-GLXW*Lbo={l%X8ifw4zE;6!oemH1HgJeeL)B00+WzS}5{G|}4sJ40Sn~yXl z;jV)Bq$QSmLDK}tM{RtdzW3br=FbYjW+Sh;c@6)-ISrM9rCiZ%s2^HbLswf{w`g4P zM`S*48Pd9^&8TGF8Ycbdj?yh5MMdT0zIbh!+LS<yYxmk49UB{#G;Q#i(g0AQmH~q` z_(&UNqFG$;IU2=&bNbd*u{MX)Pg2(~`P%y+z>C!iVXm3`qIldWB8N|%)96+EjHOTQ zsPIx363>Gw*1oCN5)7|h-X#+)mR4mo7KPn0%^A+zM8Wo9QCo<24iujpG`glS?6$o$ z={>_viCa<$GAkDKrbur2OXfJGWr&n@kSW_e1!A=$`ch(9*4r7K-f|%=UEQ8IE8kQb z0hW|a*M^@SqQB(+AzSrAG4n;a!e4i+NUx6>6QoeWIvdud!L1S1gqjIK>*EyxMK7op zP|492QcKA2&!cO$kZMTddt>s|o{AN8?Fpy|nB@Q%<;kV+Xwb9w>wZ3x@2Nii6Rirm zPo>HWl&%Bql7y3mU}Udz#>)(y8b0$~yOz|on!pn%!PYV}US&*q>zlYCxmfa8Ki`il zKIeQg1m4#tQdARHqqBVmo)WjM9&^5K_*?Puo9_ArOZT}(vJ<h)^=qSCiAacWjO=yZ z(zM&*WA#-j%D_)9Rcz`O|0*L}uM|&9;Vt@99jY{>y2M!4$!L?DSs3r&frVELWaztz z*?Lc9RUdP&p-i=#H{Ip7nDfgTm)9n(SWAZlJH0ziQk^wWP>zDY@iPINQ!%pW^yr+& zXt1fi@}ue@5r^7JdF3kWt0q`hGqw4V&fR{b2Mr5)PlGDQY(PNFD=@VOhG-B-SH49n zWQGh>#z5q(0-F`o7p-R<&t!_SN&<d9{QC(z|E|22Am;g7sV1X_KiCFWWvpUEHp<59 zFg*y$ImYwNAuF^nnjh(3=ptL01#XVRr!;Px%PAKi(*^u3?W>0xay|wl#IGxC2UZ3l zK9Wo<=1OA=baz=i-dE`xkc0iL9a5b|%Dyg9D7}=<9*5&ui>B;f(<7W#fjnU|uB+z8 z=>v~T_x*-!yf=!Q1r#1q7C&tWaQ46AXLb%ciRZ6^26A!5`KgzeI*=#vRb<EqBcr0^ zG`<;m?MI|st4d1wNzz_%iDm7`${_>Uz5Z~MPpJFe4Q7`~gkR4?wL7ta>R=wMn|lC# zxe2_}5PFZRzR}v6tir5)&$hEAq@fdBVc~x-VP6=Ln6ywsQi|PVFiL!|^%$?-ap-p# zvhi_m%F9}}YuMkV@`*r9@xW5pq;61w`+keIp17=K;72}~>7T<f-dy2z4xhWPq@~&I zvqnoXDc{bVDAuSlQ-$t0yQ}@U&hJx2X+g66Ka@O{&1Lhvx^_B)HqBd<>e6hQC9U5N z_7{9Uq>mUTr^`}ggb0S7^BM6C%{)?(P2)0rh{T&rp6C4O?5&}~DXRGqIH8n@(tb)Y zHp`dY$Xwm*3z%gso_b6|Tbyc9?FKXPcDkE9Bhk{X!P>|ij|w`Zxu>6|+9vD1T$+Sx zdM(Snw%jh|h3pJrVers<IQvICuZTXg*z$!9TXC8~LB*Z<)qANm$RQp%i1$D9=#EH= zT%FSolUL@UI85CO0^&X~<Cw!_^RAV$c-pN<u4#g^u4(d^ZLq`A!M!elcQp-X;zs!3 zI@1-?e?jR&AsJiTBZU^q#><JX?RFBXUfwXYzHtW)h+`0_=)rr?6Dn#+Aj|>qcYu=I zL7W>Xnz8Htefx0wTQ>n%6EJI~E>+)5dBA;57bVrhRBc*7sAF6b;o)?e5u6{&^Tke= z7_}(Mb4;S!si!fgL(flByboLc@{(B-Mh++b3nDDN-W|)mUD7n&nk7?SlP;Kj%I{kx zw_}@T=E%tcbH3ZW1Qt2#aD+i*Q?Mr!PL5AWb6>X|G;^^AD623bT7v{_c?g?g^uZ)z z^j^mD44uPIy|X2&3eD}F<@3U@rr^`Nwo)X>V=x+m<KxF*HR_D7Sk8|GW1ft7rywm; zpqNcw?A?TPQQhL-Qo0yuIkOWFy9hR3u#W?h^LDbD)6!k0dS1_1%cw4BB*wO}SsM4W z@TvwmIpxG&CoPIa+4-HLfVmp$Twg<+Q!>^vd4BtdJ1g0^bHTcaz-+Qu;%~;G6=X&f z)JU98|4o&k_57Si`{oT)?AA_-G(y}h{xJ*p2E|~=Sz~c(O<Y7G@wN1;;AMRIfJOBL zpG>ZFnsjLLtZ$`d1)k}fy{4Ooj_l*iz}7AG@!RUzN_uRYR&h3TudN~uD6%Pu-@eqY zlWY-tx2+=}9mlZ56Z78|OKEKgT3Ixcc7DjPUm{r2{pCq4?X)z&Rd|8*yXw9c)cpIN zReXJy&CdIEia?oeNsge6H<N}KD!$RXe+}}GF9E8e;;m~fw_8jPN$e;%oCv~cE@$cD zHU~0a#BSNg;P3b?6QtwH$>U7ZzV*BD8-59*1zFpAiiGE4Th1KXgPms#VOll0Ba^O6 zL-@*Nxl-QUg{1wlF=ZcXqyS3<^4o`zVyx@{XZ2n-`{}_i-g%OVWy*jV17l&y=Tyhe zZ9XG7r>A{snoK*M3Z|c+e0({otT+=LYRG~DlQ0caPRSOtgyD$SvTU;M-_TIBL+STY zt)c!gwtOzBN*6zVl#SAPoSST9b*ZQ_sBiRvm)hrwz}-)cVQYjFc?tKRz;Xo+PxwIW zq9CP0BMgVCq<n21VX=C=+d6VX2tBqa)OI&UQGngav?ygn+%3nwxhu>%=a4v+m0+0d z+o&ja0Nyik#jWmTpCBfU{ZjCpAxfdQmEf*o=++-JR&q1Tdgd52vAwaMHHd+R$=ces z>l)ySAG~QERrk)DPx>2&Zru^Fe*ZL6=12H7L0~=syfxqt1gOA(b<G;>3rI?5<4ZT+ zghyXieGm>zI{K?r)ZeRhklfg0psYvu1GxLfkqdEarAT|&5)Jbr@HTY9j1FOCizn<6 zP2exG;KYI+{?aiso*uvHceenq#bF4zjcj>P(fu~4S0#J!RpwM(HUG%lENsD$)R68P zW$6&*o`0Rs%h3*X$nMrf@O*^$W3BMpv1O!w92bn|u~7bNuARyNe?wchwzk~ud#jK3 zW4EV8OJ>QNvSLIZ#N7w;8^72S${Dbmj8N}F>pn^m%J#ZrO!>n556N3U1|dK;d5>cR zM!!kwr`khNsE63S9n-o(_hzWJNY@8Fy=th(CAh`xpAROnCGdWvZ|BO8JmtD!^WP$# zUnAcMmT*?#ZdPc>iuNk3MEyl2r5(-m`+cdx@W%y%yfpDBt+mSMrt1*qrNO9dGOrK* zE~+m#+sl3AvThUPbIo6AY^m<tB-EPtn!Nf8?d&R7ti=Xzu;Tt4hK(Va$AihJ*JMpu zyq7+n!+J+;+TD>*cdciw2$KibX}xpA<j3Cb!GYW&BY$UXE@(&Bog2(K5GUzlq20PK zu+xqkkUOao!E0tHl@-&e?>6`wNnKLVhbo2-?b6CilWni|uTM@7hPGJ2PmR_ZxpKS) zdgE3NO}a-YYoF6Y^Xjr#q}Sndi<90+Yg(}#JDma1=f)~yd2i&m8;_wPo^v991xWLq zvaQX<Zpo?J=he!<wH{}Ie`nV<;Ieeuf7%{Ytfdcdvb~%iS+qx{&3NLR*%Y6xE6PIS zbv$t5_wK12bQ)nhvK^{CQn<H6GXxzRx&%^f+>)xTV?5oF%3ADY7zN|$Crt0?etcU{ z1%QAdeRCPJ8)atSlHl5*!X2rWdd+O|jO&J0NH{2BB=Yl;bqu(3DZ?d-FOk8SP6qyY zs1-Jqp}W15;gLDg&FZu0us-fsEP=#{*0oc^ajrqpb-VjE;x6@BO8&!pwP>#$?_?bR z?*itX*jMlC1&@a4s${h8Jbn8yoGP3iWb%X_6n^az05k*xBs&nV%!3?O$@d^fdQcaD zVFBF&q|dc$SJdNUJ{Tkme}D^rU<L~}Ay_JU$2!fe^%(S1KRZ{@2PFlzrlPM|lX{3- z)84fkf6Ax4gN?8!{+#bUo;zZH<;<j+Ay(}Mmwz<Yq-V7DdY8>^jc|}$={SycO&3q8 zybOISfRONFvI+W{99qQ7wmr3c&f0z$A*20{yDuRrHW1cX@EzRf%xEl+ds#DRn#vTo zl;P~=emKj=rO<lg4!JOPai@~%PeEN|(_a$E&f3o%a6G-%*mL#1#Gf2vF0|q)D?g#^ zver#KHol1-ptoJw=D7^Vx&n}8pQD46IG(IoU+1Wr3^19zYbZZ1U2jEn>8yXgYh_{f z*G+AYMsnrVBy;45&^efIwo`$iWsE2L<CRo``!%v?tHce3N$RV%?U0DF$v~fD`WQ2l z`WgL(h0Njc`aBEV9ZA2QhRp?c`>lZxo)|GnGdqzpF`wc*LT4EL`i6Dt105dIoeHbs z(Aav8#E}ZAW2>SvQpf5qgjI-EIY+k8<>iSDQigJit)J`U-);S7EG7ezCjBMOD<m~* z)L+CGg^$wmx|ExON~@7Sia3@BWCUBY%NTY4u$Ly>iTA{bNTN+cV|s5h_1sC&ZY<&8 zG9X)xW(8?EPFs8?U`TlJOoh89seJCcU;ALTx${yz+I<iH)Kzsi*`*OMjZPXwhQfI} zJ}CB)I)kN6VD>`aLTWMLv!QQ?_p!0Va@<^{B;!sAw}*hvH7%JQ0q9W1ONSs$I^Ov| zJv+F(t4U-in6J#CB~hXk>>Y3V)L{t~f^-D8$aJrDM9z<3`tv@eI%BFnbdxPm1G}X5 z{uMsf%Jr|SL*rk(%qKOW%UJMiL6h#8bbdG7=YVBt9id>n6tlLv(Fzalwxx{`v(~=D z7{fC<`OM)7cQ}Za8bB3N0o2F~<m81NL>&!`XTZT>f02s@kQzZC8cEQd%iKM8o@*t& z$l~r%H&XZhN+>Af7G7z2?WU4wN$`f$<A#V4b6P4!HtSGDEA2zE$+(I><DP|`ira>- z-5tHSSSVeaLApZXLEoptCMO|yf6>ifm8kYbkK<3?TkA(3`;_2m8mrjOWc*Ds3g%L! zG+kbfC@l1GT}hm`OHhfM*#CNby5ZM=Gxd(kMf$;Y(3y*|_p`Iy{>eF(7Zs+vbgc-f z5R;&nX&UxVlRDb}ezI@DK<#IWFVoR+>Y_k$WDXS)DvX@%k$;Bcb=X0B-GZ6DSWMHE z>htPBmB9!)t8Q<1&zyf-3w`0^2&&0~H3~eE_Km42n=+*sBYS+Dt>Bip34Gflw@|$) z<G4mYJ<Hl)|9m<j$7wY(Y^R;Q;IzuSQiho_pS93ItUh&KYh|85B8RtUVR6q$QI49q z&Og5YQhsRgp=)C+tfF*@hWU^4yHWo^7AW331c{SP8RL{L7)~E`tX?p!%`U6+7>!NS z1wW=D)n~pNcnj_Rppr0sgf2FK*Uf4NuoM_ztcPyb9(H-}??vSZ$>LEqrX_moJn)#5 zBAHFS8P>jgD{p^u?B{9fFWl4pf-+WPmn?gANv)tilj!!OcbuhTa85f`veWRD%i7=b zu7Ju-@cPYJ?u&w?=T@dXD>$hjrWqC5tTB^x$(xWOar=dLciE3^mK|*;gDGZ-4Dw9y zUxGEF00M9cR-ADzVjU!2Iyl0i90Fe!MjAy2;w~rl84>u{_^}pH!QWoIQ#|TXIzLm| zOh(_)y6KAfabOZhHApEz$8IQv&)vO#P%Ye!tfpo+zdG44J&V={mS-p~vk)z`L*bo+ z^?A4DMJBB8zcfenI7Z*7jdV0y_OM*)WIc%j*mO%RO%*1@l5Yz-@oOdZ+e8%>?TN6g zm)SdC{F9pm2F=m42(?Y#MBjyXFOn}RPlNzdA9TMMpf{>g1JKbc_b+|A80>EVGa~N7 z)d#HMG^+NX%d~(eAe;)oD_xHPmU2U9Z}s>)FQCS}rawYITxGZ|eu|SOou`*hw)rno z2D2Uc$^<qY@nKTcI87$L2<wCr+qEP4GdT*<ZptM4?t)<B$j_jAd4%})+HS8-0(eBw z?@kis7yXt)wE7+0(v3uWgOO$FQp}F(5xS1Cg}?722u^{Acm+pRK}?TnLZq1D4E%#r z7;INKMQ>wMWcQ=oNOIvyxTW=Y%$3}a<I89pDXe-@Aw=sr<W$=-$s!6NN90F8TPC2~ z3v!kF&&*zPq4A6x-sZeE&ZL)Ok60C>mzClVn(lNZLqkh_>zUD*rRC3IP>N>G8YV!# z>a|Rco%@RrxRo=E?7mVg^XeD-slH1~V8UeB&;Gg2-46eX7BQ(o1@<#O$kh^^SLpqA zTQU#zcG$2R)zf5|LBl{+=y%Ohyw{o@VGkmsc#AWB-OPiG?~?I)Rg$;M+c@8NaO^7| zLNXOC-a*vr%x!s`Bm`iv;*A;s2wTG{ap{QNRvB<}i-KEFu5Bx!;tc-7gDz2B*Sc^% z^JK6ure_rkCBME=GSWc#=Y;EV=i=r$gj0B0kAB(wlfK4P9f=|TF~dYZ=EAja0l#w~ zo=yU8&$=d^EBxD2Ziw<vb|y_tpzDvh+{~9EY}@d7<CM7cG;M9kGxyW(E4A5{TVVof z3>D>)#U399$z7%gngZ8Hehy^8k+$hkaEj)miQR?f72ee%0w!ept~)vIale(8`f*iP zq&+rFKl$t8N|<pn;yrHCD0`l0A;y=CNU*;4H`>2$;CdfbQe>)8QPFB1!xEEzDaLC| zVL<VP->cDlmHNqF1}KNAmIB{YA_GD1&Z#bZ+<(psh8!PGLuySmS4T3JOs_u58wm)h z*bm^q>P<DdYxkE<aXGY(d~tMl^|-Cq!N@aluqUSS>Xos^!T6OJa14W{##>&1#mE{i zc)`{U2k^82&>7$_Q!9qI6|mlAr{@CH7pjjP)K6H$^W)wFUT)fACVF}%K;{3~LFMq` zrOvf~B4QlxKA|ePE4ScSOLh$FY>MAWH4Y=be4%^ya?I<)!)e*vHhs8H982ct7YwH| zozv7=-LEGh?iTLHVkK5)kBjy7RNhtO=LJ<&wUCB9f@LF9I$fD}Q$rGLaug{$eR9fY zZa_M8uTNf3dI(+3h`{P}{T2yXB(5P^rrF|j+UNgcBcPzf@wtH8xj=rStFCYVE&!>R z4qQ^PG%<RMlhLBR<4;jA#mPc<z|p(xXSX`|>Kl{wSfIk>-<ht0>rs}5X|fn?x?3L` z-4)ut*NjHRH{-}{67g1B%Js_>%HawP#^>0fX;(8Kq<a08#(Y(MEpd_&vH9mi%E@4! z#;WOwH;ROl50D;odw%cx=z*`FgG>2B8Up#x7f9i2&o8o$th=vDU{RS*v{u`eY(FTl zxLpN!ZYO`UC?t8gzzV!QCJw~O?jtPd!g8Mg=3=z`%@M3-`mWD9Wo#*Tu+JUGUNkoO zrw_dAf}K)=t1DF(M9VJwyb7{vK+9^NO>J7H&WjD=YxfOhn(Vw5YeHPNIs)vfa_~*I zslHZvA6H_F1)Raz33<=E3~{$=Cl}sK#_7LauuA+gw!C$&Q2>c}=Bq;YOyO;eGu6ik zLATj^nFIC~I+}mKS$gedfkI{u7kN13?P)F_v5F$*=dMFyFhZ@P+peG2l~_IMQ%FNs z#*^)$wfO^EhO}oWt_75sAJ1_@z2XG)6D7aC8$MhFE$gZZWg-UmRHWI7DBIN%jmQ8< zR2548WiDiI)acGRH0ss2)q|X(=_&Kk#WgnGC8jf}vi1|X-ws__Sx7m@;~Im(yjiDL z+K8elzI4>cl^+vpXUtQnm56jKAx*T8wYyqyRj)G(sYB^9T%6C8uUzPnhUo?d<>1#9 z(VZ|dr-*>nxYFGo=@Am1!!z!F8Bm8PcFhxiO<m)TVQjCEA-5J+9TBbo`}^-AnP@2W zhdY3Z6ASRO0eU#-5<P(R1;F0a)W)pg1*-R{zP)$Vlm<}=g@*%qd;n>&7!26I*FXTm z0k8p7K~w+&7<`k8NA*(&Xk9(o;WCTyT2>eu@9$A5=Seuq7kjY?a8xGK4oOk3140hO zZYik6gK<)$!Tgu+4pP4WGk|!CEVZIQQB;wujND7M$zpt?cVi?7E~z)O>M4A|A4T}O z>0EW&iufFj3eA-Ty*JmhHe!iQ6W)tzhr~mfxb4j}XEWaHGhyb`px)FY)WN+s1X8aR zE>A9fK*@06wN`-MYE!qu%sLClNZiYk^TL70bSuZ6l(Rp9?mvN`jMq}Co%{gDFb(5p zbG~HW51Shsneg{>t<$5tknp5|YLk1a0C7nbz#Rj;cvT4?uL?*jz6gl{KN5{WsR0#j zcn1^HGk}Fm1>(NoyFUQdlTwo#fc|KH;Z(oy!vTbKKj3!g1vUMWL1{P$cn~CU_dWn2 zPloylzJzkom%artUjlNLsosPBe#)qN&7pvc9@LRc3uvPSAkZhnyR<q_J{dI7M$poL zK!S>ZqmLE@GOiU=1(gC!s87bVAgVX2AX@)$1Bp98kC$%#4ZJb{<E91_+qdDM`yc?K z9u2%ROPs2&{a4U`4KUkS!+~2api<%204D9lrM8@;m-A&1)h8y^zi*{#2RKNj`a#=Q zhO>ccKI2$lzE?fw4Rd>?THP(;weA17iDkendM&d_-TkC~x~Qh4CK_*&QDikd@ph@` z6y9HvQYScuDaYje^?8VpDt8)i1Crq0btgeo-VDswTk-M4`TNi5EjcZS9LcP_45O&b z->`U99dY=}hCi=lZ)EEzs%49~VTkvaN<}%O3^ip8R-Fyv*7pKmf5?!-1w0>-J4&g$ zCT==KTwf^>1Up@QJzlpSY&l*ASzCBYN2!y&%2%-%r}6|Y+WA|_`$yOqL2oo&mbbLs zt=TH;aFiI|S!x}>;UUXAx8?iwR-zx?=$|chNG&>WSG26tD7WW4&*!$8t5U4#ukMHx zjQ37ZP7#d{*`j_Fp(o+N$Dac4iY)Xe7h<H4u>-}Kzq7ZBmhq=dG#EYOU^oOL#yvq! z4X*f2woTpA5Mv%Gw@jSI(5{9RbfrHwQZ!}4l!)}GQLuTu3yQAjlI@psov+WC*GlyJ z^G<&F&+G+9p*0<>LSPt^F@J0}tZe=&bf!9o>w8I0t=1r|VjUl6=l}rzJxp~TI|6IT zRFH=5-HZbGj9dO*=N%NG7jw+3pH+QZtW5N+U+nss?-ld-#QM4md^5X?6cEmllVi~L zsZa3@Wx|a8p^KheYMJ^zqovSwU3@)Fd`j(>ZP8=)!_%uKD64|yK@H**VZRTMb`?G4 zUoyD6z5PX}ChSm_5&rz=f6VCiuj-o^jZSLkcpk<|N1_~g#~mfs&4PjT^3>nG%kbTG zt>&|+1pnt>B6+TIG;)+1X?4!^-vY+oMPs}Sx=($XI~-VcK%nURpkJW-YOH{Sjs>F6 zH!p@Q2qYl}_}c6*ZvL;m{RrF!;3t6x?q34tCKZS#3uN(`q3>g-v9dhfpXKtAk$SST zk1RG><3mA#)X!<5sV^=YanATu<20=@OnKj#)$0W18jEG>iDV8A{}myN><W!#=}7kB z#ozOvw`CxkLi}i!;<`PNwP;>G0-nt(GSf`VSO;!~@&TPG%aSrvY;#PE!mNFSTdME@ zKDYW(3%w^{?3N3&9J-_y;mQ5dwgvo^&!fbknkSih@jrI$T@v;2f7uNwZh19qaC#QA zUf-W;uKzq)PZl*EL7A2sr^qyYfa+<<Ccx=-^bQ&nx{SI!bj;*VFGY${vc)tOalJ-y zzK+H5rp@&Kg0$fWkINwGzDn+U$e!QKV?KpPBky7HZctl`qc^CRk44RMCLnEYtI5!B zW8mGdL?+uC5`nIyiJkjH4U@u06}AU_*DbJb<AoA}K1B~oHVN-$mjpvHm-NBsCZA=@ z7W7`tr`C4XVxQ(P3C~`U9iFYPnG8<eUnZm9;>0T7I8VhPPK=0i!DBMycv<6Em&{r0 zCMz3r@1n=x9}iij7!7?$F`F^fR4b90vnUJIv+%G_&SwAb4)A+-QMCh7Pf(?ymS_9p z7w&RZlji&G&6tBnM7#Y@mlB9w{`GrR9CgMiX%z~X7VAEFD+NSFDfxK3k1tauoXz9q znf5<l5SHTKjG^G{AQ=UBTv*A0yi-;jCqryOp&z#Fldx(uRa|O8QFZ8fHC8Fgf9bnm z-I|K%wub~Z92iv>(hU%I7dut_H`*=%AD{>CV=oZh7fB8`K{ulBD@xb{22eO4^sZ0= z@{ks=e=c-JK<WWw?GjZ`1j9f$+B8Rc)~C^Fp?+<BYFwL0K6~aW03-$6TPR{w*QDDb z0v(gf5x;&3_!%`mU@FrnjvpMBngT*>X&<}v&U%(fwov5qU=F<@qbJ9>%c&v!AnSb_ zI8U@e(Tx0}$?M7MhQ@`Z$)9Mn&Jx($rrQ>|_7g0Qu=jMVO?~{tMXQ(6qcjf7LMxxZ z&vdGU(}P1IbbkdfczMKey<RF%GO=xwj;npF7i;pZ8FQ6=67Tg(Tn4B6FKA)n9h;j8 zB4;uG`V+5f+Cx6h_1{L6D$EqU6_sw)klYtw2&rti1z(PhE+e$^Ug)!jN?L0ElwV>~ z#;A`FZ$o`KtblxbL!5h`+ejLv{+I5UJn9P+$AwZnaqMx-z3hcFag#-{f2A|tNBD`> zVG&h$7H{J}9=uK3jVWdbN`2i3E_iW6U*y*M9i*;07|frh{ULpSobO8rGL`|KuO>8B z*V!EYEleuCVog+ntjFvwf?3!bV3+rQjxhCK!wVmAuke$C9g+DzesD^dJ4f4mU0@!~ z)Gg1Ex{L}5xK6>#7jMW4S>fFk71n$!9l5u$#C`Xdq6l1d_SlQFZmS=)8|In=d-heo zZtIbB6^hZhY)5Z;t8OHHak<;XPq9MvH8jhLa3@)`$kh|;YJUMG=8E`dn7Y3>>8kOx z<B$p=OHUe?;X;Gh;u|zkL6@Q#Qt^{c<O)06iVP8%wbRPaHK9{|^>W)OaV7jDy+j=^ zS&gX%#V(;o9WG}gI1lHrP43x({F`3pQLd@K+V;<w$FjyB0E8{yfk6nmu?X)SDNsE5 z7MbGrr{}Sl%Q%9LozpmxMu%o~((9kuT4HT6)3v2`ui&vdHmIE$Q%vLR`61d&$I$&q z$tt9Je5FO9>yFW}73HYLx1Pv%6=8sk@biMx?r~JPbxC@fAj_dr&&{Wo#I3BGvz+oF z!$v4!vyKwyb$Qs7HDjUhksTX!4bp;?{&YwRf*7M32wFx)#UknXE-^1mAjk%~mz8!6 zs3z~%89^ty__GE~&t5*(O=!rcAvimq`BPP8M(99@?jux-VRGyk)3erR4-iw0tFiGm zHV>2j+a)9xP)6uGfaykcp?<spHpl@{8v&Pq+ZfQUKn)<eIAG2JXBRE}LMmKnGO8E5 z<fwk^pug?~vIZ_dPwuEXty|%1NgHqf02Ik6@A6!i8gYY(^XlHWX)$UL&vY8Tep-BP z{W$DMZVO_J*V5G@N<pDt8>bHkI{E8NCCz|L-VE><TR=cb1M;UevPub)Ob|z*bKi9s zk!Gs=f1%yUc>n(AS2ByN?|yqzbC72JK!FIGAERL;!9LEeC5axys7Xio5P>AIN?GQx zK><Z8t3%@OV)@B*&KJlMZpG$V&H(!RR9zS|k1$LsZc~#MypFl-xXuABNcIkZ+7~jD zihaMP2Gk26Sh&fku2F~djE3d1iH`nqYpa}!?-QmJl9_CmOp)LAkg}vuG!fPoMUv+c zH(lyfkj2pHRgEMvejPuF(GGFd$tzUy$zd;+gm=_WpLBLDu*vKbz{Oa`Jq=;g0L%dv z?}+iLQh4}Wo&QfA^e~Ck?!|G48yxG!8b#L05HZE8*thK<dD098r$--|6(F4dqi8LG zE=s9o-Zr_0KO5I|YovE)54;4pyzng?912QCdZVO<<YQP-UC8&75VXVK#6$`z3!?{1 z_0nI~YgSz+6K)s;h^a_gRM$0=UZA>FB<qKBi$-+!On6!XUTceMD3<*8X>0fqz<E5; zA{_FwYiwxH;GY$wJD+8eFJ<fS$XT!r_8IEeP8XPZUZo!b8zY!9#ATVl#ZhAgNMfZ; zlPp3iq2fz%5s`fZ6NkckZ*9OILp)6v1of&4bVtZEXKH68=6oeY{Gdc2)JR|IhF60X zHp_Gb#=hVs?wjPN?bGB!9|<tUq@<D|4FWN~?v`~3V>~TH``%01!;pz-TcD>Ch)sex z*E75FhI|)R$Qclrzsa!NsZxuhRFLb;5$@`49?BBKy=aHsgb^QBSPn`%X#rjSD*R>f zJVOMrgn2mAOY6su`oTj|Dqj9@kj%G)LYRsMxpmbl3Q`r)^Xbh4f+jya{7rZ`Fs%P; z)DrhqL5$ZN?*H%l3h*gG^$$H4+kX?`fB(IZNkAATni~jB(no_Hi19E1W(e3GFj%6+ z?yrl$q!{zrFaV)k*90a6=6m-byf=xewCnHpAO|Vdx1XeFZ&DTB2bBVr3Dp%4lOPDp z1Y*Td(|rPDAE0zG{jV2500N1CfZ1^&|Dr+nSwVmyK^K1ULiQkcfF%vQ2H-yo4+m^W z;GX|~zET0vAz-Eh21vw(kOi4s9R6$e!0|G$m(>5YE2{r@cJXQO;LSy!7wyt}d*FB> znyDN>a^EiuQ;AR1)E9fv0Ok?!j{nyiHJ}PIm%C}sd<7o3=oly<|Nk~o0*cT6XM@>4 zNCLhHNSOGq0a+6u8bE&xkEUY11iD{pa^-$0@Rfk^1OgT!V6pkHS5@~^$?s0#vGM9= zJ*U?{T!QY>wmuD~z6|1Ka*CuXg~oy6?e3R;r7;A~pwCS~R9M=o@H@caJyki>5yTWi zRSu#tW!eORu#4<XAXXZ6>}QAjvNR#o60{e%8WlCry-%Z{ONQ$V|2r84QRN$e3i1tD zY1BS}m}tYlLN{sSt}$sEI9|HK17d#g{wvLUhi9rHs`gYjwLmxMJM1rMu*O~3rVh%g N_V+s+F8@36{{W-fJLmua literal 0 HcmV?d00001 diff --git a/public/opac/js/butterfly/close-black.png b/public/opac/js/butterfly/close-black.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac5532fc1a9047f7b0b9d36dcec38850171da81 GIT binary patch literal 1186 zcmV;T1YP@yP)<h;3K|Lk000e1NJLTq000^Q000^Y1^@s6sY*=F00004b3#c}2nYxW zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|A9O`nbW?9;ba!ELWdKcKV{&h8Wn^h# zAVz6&Wp{6KYjYqtwP@0K0000MbVXQnLvm$dbZKvHAXI5>WdJZUFEKMOFgKor?f?J) z1NTWpK~zYIm6p#-V^<W%zt10&+DxfhnX!tHX(qKb5VY77wFMWV=~fX05pm;Ax4LoX z#%vUXxQL6a`~&Qi*j7-ft+t_Ph=s935fhp)jL{|&&2PV5<lgk=^`*mHIK1~R@7&M( zo^$SbS0f3d;q`i9v)N#^TG7$bQSp+dX(j*!Py|3$TSOfsD{OUj6~SPz<gJWYEXIqA zi+lY%fOi1Y1E>L@>DQB1@vyP6ft#Bfl4LHIqsQa<VPs_FcazCP)tpXeY<YRvpH8PG z?0o<Y0P3p2$~PX52Zcg`B<c72pIfcgj2@u3uCA`+@$qq7QTHBz2S(~Z5^lE}*Vor1 z$<58p{Wk&hwy?19Oo25SsRPM!PW*oV^S6aabGzM#0`vqxi-6UXLF?=5AjwoJMT^Cf zQ=NNzdtVI<4E&{Ew7tEZlarIjjg5`vIkVZ!NF+i9)-1xPkp%Yl_d$|tYir-Ci#Z&Q zzhyY)=jXqX^ER6;9f?G8B)PJ(a-jN5O-=nIKwSXZ0GOpJgu`KwWPgAErRrq0TC;a| zcT`~8ot>Sx5<-%Ti;EQ>*V@`jSx^9;s;WSeiA2IM?k<<>T!kf*$@0C==Q}m>2?PR3 z0kW&AK$7R@=T%GD<#L^8GMS1^S`A_{nYgvJ^+JF?1Mm@mMga9S0FcdQ3)MPDI2>+E zrBW4hCnqPD)!r`@3isl+R&<Qoa_FwEuBvUw*U@OSD3!?g%bXec92^|H5{jGvJ{6^I zLL!kMNm?wHyz0=>(n1yD^Z8DPhlgLNIh&rI{t>0-TDEvRP6hNy8FX}X^pYfJXJ@}t zL4AFFF?~(|aA;`gPYLsSy}zoE!NI{xlHA$ZiT+0sfCnTQjYg?%K(Q}=o|%~`?-jXV zPft&LZf@>bTU%R&n(giFuu$_AfX@MZ4B!J%;;0J-gRe<)X=&;E|7$b)FsU{^KK`4i z;5>i<UDeeArA}*>VVanj_~mUuPN(x_Hk*~X`BH?<4&Xxo?+OMqA+5=%<-7?rHa2!5 zb0#2t0J?>mCMcajs%il6NWwy)P<nK9^i<88KJj~dd*upLAUyzV03Jc<;2KG2nx=`3 zWdiW<?Ck8qZnrl8KqiwxC=^N@9v=RY&*zIyr}K%!;dtEK+zbE+27|ZV-Q8aUC;-R; zNC8NSYX(4(RR4gb5Y_>B2;eb*r-4A=hE>My?ruy}*8qSoM7V4KTE!X_KR%7h0Y<0H zEF2odbFKIo{fVb2l%$1<Tk%|^vUmkZ2dhWvgwue3Pdb_oaxX%b5ugl!ydGi*QeZNa z^-!B*<&bB)oB$S3<(y{-G5|`55$Il+AwZ6Q03v(u>C44mK>z>%07*qoM6N<$g6#() Aa{vGU literal 0 HcmV?d00001 diff --git a/public/opac/js/butterfly/close.png b/public/opac/js/butterfly/close.png new file mode 100644 index 0000000000000000000000000000000000000000..a758a3d79b130e5008c5aedc5e2bdc773ced2283 GIT binary patch literal 801 zcmV++1K#|JP)<h;3K|Lk000e1NJLTq001Na001Ni0{{R3*4}8U0002|P)t-s|Ns90 z00000000006%`c+2L}KE07^<qLqkJ3IXN>kGbku1T3T9CQc_AvN_>2Lb8~ZRYinj^ zW|^6pg@uKDe0-&)rJ0$TwzjsctgNM_rNza?y}iA*wzk&R*38Vz#l^+n-{02O*6!}^ z=H}**Iwzh$E2Kg!vP(0)PBp?#G{aOoy;VKRR5`+8OwM6Qy>DI8Zdbi{Y1MaPzJhhw zfo<A|cFmB2)Q^DJkAK{ce#@4M-j#&mqLk07qSvaR-l?9=wXf&1r`No;-MqEe#K7yr zy4=gh=F7$J%EI8*)aBLE^3~7q-`nx#<M-y``tIxe_xAVq_y7O@411eM0000bbW%=J z01+ZHL_|bYRaI40W@cu0cXxM)h=`e)s;a8HySvQH%-!AY?#bPM=l}o#uSrBfRA}Cv z)Mr=1Fcb!0Yo$&E_d<cv)D}fV1Q)mmA`bfg|Nr7m+9Yj7JjeT?ISmh4y*CpR{|SS~ zpFqa%WKzax77EieEsGweU?Yv0$!*#W?7gk!QB07j-7;j@E5wpYm^BBuJMlf{`=@=N zIKx%S6o`0C#!(+mHlYZa>j;inEZl1Zi!sGb9ynylxI#HYtJlb~ags93eLz7C6;Af# zQh)W*4MD3$4=(^;mO?fTsCWMh9idtn@;#hkR}Mucix)9K1L(Tkpv_->lr4=maK^Nf zhOsxyM)Mi`jOt9OS7q1@avBv;V_GT0&asg|ZWL`o9r<z*M<vv?x!0<TRgJdMQl{-T zl<KL2BD91@(aHBkja2)ns3V}SQijhv2f}dm=~2@}$<&C>;FkaBHKWBe#D6}Jm!E~t zH}B~Espz1nb0z%3AAZU-5KPAtiV|}N@70894#obBcxGB944ayGUBt3UD@yYBmM2K9 zGejjPsw!PB`64f--t&MrJ9B9hDKlRPD{pTr`=ji12~(A47iO*B>RjCy0*ofHn`hGa f<Bl4CIgO2P7x!(&C1k8K00000NkvXXu0mjf+m4Ec literal 0 HcmV?d00001 diff --git a/public/opac/js/butterfly/external.html b/public/opac/js/butterfly/external.html new file mode 100644 index 00000000000..c965a231f70 --- /dev/null +++ b/public/opac/js/butterfly/external.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Test content</title> +</head> + +<body> + +<p>A page with test content.</p> + +<div id="external-fragment"> + <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. <a href="#">Aliquam hendrerit lacinia justo,</a> eu ornare eros convallis sed. Nam lacus urna, auctor quis fringilla in, malesuada sit amet lacus. Aliquam erat volutpat. Vivamus turpis sapien, luctus sit amet rutrum vitae, dapibus sed ipsum. Ut interdum suscipit pretium. Etiam semper aliquam sapien nec porttitor. Nunc quis lacinia augue. Fusce eros neque, vulputate ut dignissim quis, fringilla fermentum velit. Nulla lacinia sollicitudin faucibus. In id nibh justo. Quisque hendrerit, nulla at placerat accumsan, magna augue placerat sem, eget tempus dui ipsum eu tellus. Phasellus interdum semper sapien, sit amet tristique metus porta ac. Integer vestibulum, dolor eu rhoncus porta, augue risus condimentum tortor, sed rhoncus ante dui sit amet lorem. Sed pellentesque nulla et erat sollicitudin at scelerisque lectus faucibus. Nulla quis dapibus turpis. Sed id velit sapien, at pulvinar nibh. In tincidunt laoreet urna vel molestie.</p> + <p>Praesent mauris nisl, vulputate id ultricies non, semper quis nisl. Integer enim neque, egestas eget consequat ut, facilisis non lectus. Nam molestie vulputate tincidunt. Sed at dui dui, nec lacinia mi. Praesent posuere leo eget nibh fermentum a eleifend tortor aliquet. Sed ac urna mauris, eu cursus elit. Nunc quis felis et justo aliquet pretium. Ut massa quam, interdum vitae rutrum vitae, auctor non ligula. Ut facilisis faucibus lorem, vitae rhoncus felis posuere ac. Vivamus vitae tellus eget tellus tincidunt scelerisque vel at tortor. Donec non ullamcorper nulla. Mauris pulvinar interdum felis eget egestas. Donec ac nunc velit, at eleifend sem. Duis mollis tempus vehicula. Etiam id mauris nunc. Vivamus sollicitudin sem ullamcorper leo commodo non pellentesque est fermentum. Maecenas adipiscing dui vel odio vulputate lacinia. Vestibulum sed mattis sapien. Aenean odio justo, ultrices eu dignissim laoreet, mattis id lacus. Vestibulum sed felis nulla, ac molestie nisl.</p> + <p>Nulla rhoncus mi eget nisi aliquam id porta metus consectetur. Nulla tempor magna ut odio tincidunt sollicitudin. Quisque ac venenatis felis. Donec blandit nisl id turpis rhoncus molestie. Pellentesque consequat dapibus lobortis. Pellentesque ut arcu metus. Morbi vel dui quis augue convallis placerat non at sem. Morbi quis sem ut felis hendrerit mattis. Proin non ante in sapien accumsan adipiscing id sit amet nulla. Nunc accumsan fringilla diam, quis molestie nibh bibendum ac. Aenean libero libero, placerat quis laoreet in, lobortis ac risus. Nam lorem sapien, laoreet nec vehicula sit amet, placerat malesuada sapien. Mauris mattis placerat quam, sit amet blandit nulla viverra et. Proin condimentum egestas est in mattis.</p> + + <p>Nam ultrices pulvinar quam ac aliquam. Praesent vel ultricies massa. Donec varius mi non tortor sodales quis ullamcorper odio volutpat. Morbi dapibus eros et justo convallis eget dictum elit fringilla. Suspendisse volutpat auctor pulvinar. Donec mattis feugiat mi eu suscipit. Sed sed nisl enim. Sed eu urna eu risus eleifend pellentesque eu sit amet odio. Vivamus sodales felis ac diam pellentesque ut tincidunt sem tincidunt. Maecenas magna dolor, tincidunt vitae luctus quis, tincidunt a justo. Mauris eros leo, varius vel vestibulum quis, interdum feugiat nulla. </p> + <p>Quisque ut nisl mattis metus dictum viverra. Aliquam enim ante, lobortis eget varius sed, tincidunt sagittis justo. In fermentum ullamcorper eros at mollis. Donec semper feugiat justo et varius. Ut ultrices, massa sit amet pellentesque malesuada, velit eros dictum justo, vitae pellentesque mauris dui ac nunc. Suspendisse posuere eleifend orci, ac dictum risus venenatis ac. Cras ut justo ac tortor egestas condimentum. Suspendisse quis mi nec nunc convallis laoreet ut vitae lorem. Fusce nisi odio, dapibus quis auctor quis, facilisis accumsan sem. Vestibulum sem ante, condimentum ut pellentesque porta, lacinia id mauris. Etiam dapibus nisi sit amet nisl euismod facilisis. In quis lacus eget lectus venenatis tincidunt vitae sit amet nibh. Nunc fermentum tellus mollis magna rhoncus pellentesque. Praesent scelerisque odio a diam ultricies sed bibendum leo adipiscing. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut aliquet, libero eget vestibulum posuere, est ante aliquet urna, ac rhoncus ligula arcu et leo. Cras fermentum gravida auctor. Morbi ac elit eget velit <a href="#">malesuada blandit</a>. In tincidunt nisi sed ligula viverra malesuada. Sed eleifend luctus arcu in tincidunt. </p> + + <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam hendrerit lacinia justo, eu ornare eros convallis sed. Nam lacus urna, auctor quis fringilla in, malesuada sit amet lacus. Aliquam erat volutpat. Vivamus turpis sapien, luctus sit amet rutrum vitae, dapibus sed ipsum. Ut interdum suscipit pretium. Etiam semper aliquam sapien nec porttitor. Nunc quis lacinia augue. Fusce eros neque, vulputate ut dignissim quis, fringilla fermentum velit. Nulla lacinia sollicitudin faucibus. In id nibh justo. Quisque hendrerit, nulla at placerat accumsan, magna augue placerat sem, eget tempus dui ipsum eu tellus. Phasellus interdum semper sapien, sit amet tristique metus porta ac. Integer vestibulum, dolor eu rhoncus porta, augue risus condimentum tortor, sed rhoncus ante dui sit amet lorem. Sed pellentesque nulla et erat sollicitudin at scelerisque lectus faucibus. Nulla quis dapibus turpis. Sed id velit sapien, at pulvinar nibh. In tincidunt laoreet urna vel molestie.</p> + <p>Praesent mauris nisl, vulputate id ultricies non, semper quis nisl. Integer enim neque, egestas eget consequat ut, facilisis non lectus. Nam molestie vulputate tincidunt. Sed at dui dui, nec lacinia mi. Praesent posuere leo eget nibh fermentum a eleifend tortor aliquet. Sed ac urna mauris, eu cursus elit. Nunc quis felis et justo aliquet pretium. Ut massa quam, interdum vitae rutrum vitae, auctor non ligula. Ut facilisis faucibus lorem, vitae rhoncus felis posuere ac. Vivamus vitae tellus eget tellus tincidunt scelerisque vel at tortor. Donec non ullamcorper nulla. Mauris pulvinar interdum felis eget egestas. Donec ac nunc velit, at eleifend sem. Duis mollis tempus vehicula. Etiam id mauris nunc. Vivamus sollicitudin sem ullamcorper leo commodo non pellentesque est fermentum. Maecenas adipiscing dui vel odio vulputate lacinia. Vestibulum sed mattis sapien. Aenean odio justo, ultrices eu dignissim laoreet, mattis id lacus. Vestibulum sed felis nulla, ac molestie nisl.</p> + <p>Nulla rhoncus mi eget nisi aliquam id porta metus consectetur. Nulla tempor magna ut odio tincidunt sollicitudin. Quisque ac venenatis felis. Donec blandit nisl id turpis rhoncus molestie. Pellentesque consequat dapibus lobortis. Pellentesque ut arcu metus. Morbi vel dui quis augue convallis placerat non at sem. Morbi quis sem ut felis hendrerit mattis. Proin non ante in sapien accumsan adipiscing id sit amet nulla. Nunc accumsan fringilla diam, quis molestie nibh bibendum ac. Aenean libero libero, placerat quis laoreet in, lobortis ac risus. Nam lorem sapien, laoreet nec vehicula sit amet, placerat malesuada sapien. Mauris mattis placerat quam, sit amet blandit nulla viverra et. Proin condimentum egestas est in mattis.</p> +</div> + +<div id="another-fragment"> + + <p>Praesent mauris nisl, <a href="#">vulputate id ultricies non</a>, semper quis nisl. Integer enim neque, egestas eget consequat ut, facilisis non lectus. Nam molestie vulputate tincidunt. Sed at dui dui, nec lacinia mi. Praesent posuere leo eget nibh fermentum a eleifend tortor aliquet. Sed ac urna mauris, eu cursus elit. Nunc quis felis et justo aliquet pretium. Ut massa quam, interdum vitae rutrum vitae, auctor non ligula. Ut facilisis faucibus lorem, vitae rhoncus felis posuere ac. Vivamus vitae tellus eget tellus tincidunt scelerisque vel at tortor. Donec non ullamcorper nulla. Mauris pulvinar interdum felis eget egestas. Donec ac nunc velit, at eleifend sem. Duis mollis tempus vehicula. Etiam id mauris nunc. Vivamus sollicitudin sem ullamcorper leo commodo non pellentesque est fermentum. Maecenas adipiscing dui vel odio vulputate lacinia. Vestibulum sed mattis sapien. Aenean odio justo, ultrices eu dignissim laoreet, mattis id lacus. Vestibulum sed felis nulla, ac molestie nisl.</p> + <p>Nulla rhoncus mi eget nisi aliquam id porta metus consectetur. Nulla tempor magna ut odio tincidunt sollicitudin. Quisque ac venenatis felis. Donec blandit nisl id turpis rhoncus molestie. Pellentesque consequat dapibus lobortis. Pellentesque ut arcu metus. Morbi vel dui quis augue convallis placerat non at sem. Morbi quis sem ut felis hendrerit mattis. Proin non ante in sapien accumsan adipiscing id sit amet nulla. Nunc accumsan fringilla diam, quis molestie nibh bibendum ac. Aenean libero libero, placerat quis laoreet in, lobortis ac risus. Nam lorem sapien, laoreet nec vehicula sit amet, placerat malesuada sapien. Mauris mattis placerat quam, sit amet blandit nulla viverra et. Proin condimentum egestas est in mattis.</p> + +</div> + + +</body> +</html> diff --git a/public/opac/js/butterfly/gallery-controls-sprite.png b/public/opac/js/butterfly/gallery-controls-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb249870c4926a8ff2179d0d00711f54debef30 GIT binary patch literal 2608 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 SECNIT0000<MNUMnLSTX_Hjb|V literal 0 HcmV?d00001 diff --git a/public/opac/js/butterfly/gallery-controls-sprite.psd b/public/opac/js/butterfly/gallery-controls-sprite.psd new file mode 100644 index 0000000000000000000000000000000000000000..5f1f9b3bc203a2e746fdf311a2557df3c12f9919 GIT binary patch literal 84985 zcmeHw4PX`3weFfZNk~FWOa!H*(ggVtG$arRf{~x_BZxtMf`L@5`8f%>oSYNSIe`GL zG_>6MuJ7HxR{D75K6`1kt+aT(7fa<nS`@|FOG|6Tq9`?pME)azKp+}D?^|p3%sDv; zaFnDHJCmH*Yu2n;vuEwK_pI4#)|xx==FBIJj3o-iFYqg&SaKMsg}=WeZ)SefVA;Cf zzy;T`ZxC-!I+HuGwz{}<snefU;;g82-!<^`uU{CLR#|q}z``;4S^3pdoJ%Tatn@nP zubf>_x^ijhxUzv0C&cI0j<2n%u5$W|(`u_+Zr}LYy9O4Qc}kq)0W&&tV49Hlm)<pS zGVe%Rm_H|NipT3r8#5v+qckfgD=lZ_h>_W&$BrF)d)lb1ky)8pqcTU1${0CzeD<jE zSy^dn88{&xP_DPEeEhtr)79y)b=SZpet-4&%*^G>mycMUJ;LLy$Q(It+&E@4YE%X& zGJGrC{^HsUx9=8%iOFZG(^u-PtoB!W+-c0WxWrTAziZ$?K9RMk>#C}@PUQBDkZT-K z>Z!`CEw0WSIU+05;*0}xA(Qb_yv}03$6Mg>xF#4^K4*!?@9{11RHsduKPIiP(p~0R z?#s;#Ck~!H$j3Rg*zcSG>5R<C%E5oZsFCBdMvfnqb=$}+$S8z~K^ev)A1zT<>@V(& zOV0RFV?(*LqYdZdDXT1B5fPUlrQ(sB$s!IBxwI!sD-3_7rYI}5TB5qf>yid9E6sGe zoK;S@--p&1*}gT(O2?Obyj8{i3B}dbuFBG4Zt%=y?lRSk)n>coW(G;Sy4Gmr{Cun8 zovKh(Rc2?Z=krfn2CY<D-szFPf)&-y%y~|qr^Z|AoVE;d2&%eL$o%~AGu=LavAfhc zbLs?CXGCRX8QOm2s4>$<Paid9T-G$G*SK*br;W?LBReO1>e#WP#*7usYJX^Zoxr}S zp3)i?y<%I&Y)3}MHssI_Z13|{VjwDZh0t)VKMng%Sadkej7lH6=?YUDjeajWIp6tk zd#tIfu1e9->SC|Y$&$Zopeg#$QNZBD$4Co~FD_-hn^4N*g0n0)vmG{At?<JtJ885l zO4r~Wa_FV`FJIzxUv6YESP9jonfN^A{^iA9=j00L!R3cLgJ1gt!WkQ5g{!g~#P2I! zc9p^(btTolO5u+lKgJr?KM&ytHMVp~vAe=qHX+kgRuj>q+AG^`uO8K2qr17ia!hN- z?p#+t7>?=g#u`6zl-*vY?Qr$&mDBz0HQH{ku4}I=n&($(Y=l1j_2}`?Fd5sM?B>Hu zn2FzIPoma?W9Lt2*6xlI1lF$cQ#>w@H{Vm{oRFQH*%?~hyF0J6fyI0XreZR!xtI=S zv-M2Tl|Z;r(UrU{UiL{WQA7gR;)+B{7L6?~OB9g+wzwjZl0{>S%MwK-fGw^_q-4?9 z;<7{$31EvW5-C|Uwzw=&L;~32ibP5ljV&%q6p;Y7xFV5~MPrN05=A6{Ev`tUWYO5- zvP2OHV2djfDOohOxGYgb0@&h;L`oKoEiOwGkpQ;1B9W3sV~fiYMI?YNu1KV0(b(d$ zL=g#Kiz^Z-Sv0n|EKx)P*y4&rN*0YRE=v@V0JgXyk&;DYi^~#4B!DfhNTg)Z*y6H8 z5eZ<6D-tPLG`6@bQA7gR;)+B{7L6?~OB9g+wzwjZl0{>S%MwK-fGw^_q-4?9;<7{$ z32<3)#Rsz+INeBTupGGyNU|S{muv{@u;%OtMka;c)!s_C|GpZ3b&Vg$XeOEB^3Hd< zYpP6`%XxR_P2qB;+wU~@G0Zs73vGUNo~r~Y0GM-<@SR^-%j9{Le#SGcaXzPac5#)n zVA{e0pqO0hcPA5Q&tes<UrI>*?vv~VKI~6n$|==;x5*ZDDDhew^D2D#*2WaCdrEM_ z?GJ9;TjKIrduCVomsuOrs$5g84P0iBbzbSxiu+3bp%mv=sVJ0WBnid5vb3}^Pff`r z&%0bhS?>0_JK*wM9qIDCWd#e|{^_^Ob8$;pOP;GNtuy>QpUW@!Ikm1y3+d%L<B0fW z&Qip9BX0pRJQ!_3b1LTe%tm9FDN#y;-s>zk*o2+70I3@~JMH{Zmw}(-EuFN;I48HB zqfy}N=^;l7M5CLfwCoVsmuOJ)dSac?=8g{pcU?k(x7h7Nkh#-cy28+gzOrWk*4I%1 zd8wG(<fCeoUUC91r4@?DX`ux7KtLd(GR@#IMz)i&Mq_o@d$a82Od<yLb=G#R)cQ-- z_5iuUX4#IDHCDzsh8meh;!SlRU1-k>)eOokFUKAi)-i(76z0bp{>8$K5@tnMn>1W+ zjWU85;dv3;1PS0uI$Ipacz0)e0)ea9C$eDHgjO{qg%V4itgmV%yt9Nwx^|_-I5$g$ zCB@w@UXG6y%m}Q3(<d1}LzY0q|A;AhiAlpMVG>q-CuwqI4q&29_ytECa@V+cs1mOC zdwp(~$6bMK;o@``mzV=X9EQj|C$eogLnvZ_oLugAdP8tDzq&M(OMF$O`#vO~sr0W< zRIF+7RmHXKv8)%A=W^#Os$Np(Y{u%WwH@mm&-=pa99QneSUcbEtZqMUsmtW1<STJ{ zIfIKjQy(CEmpR=Y)HI0J7c#A|o5yJ#c%YjAl(9tlE32H5pMnp%#3^FSYET*EkBFGt zP3RPt;ugQ$<6Sz_UC>pv>&^Ud!~9eXFIPdjcZ%B|qAp1lE>B6Z3nOCb(tDAx<9^q@ zGGgNr<CYZr@;xjXQ9{v&(JV=tj$cQ8kbWAb4}E+~oKC5|tJ3XM_f+#7!jZ>ZqTsmL zpEvauthi5fJPY6YVoQpB&XAjWG%dhr?ZjBkOAL|?xyyX*+jCy2e<b$FdH8OlL?8$7 zT`6=s&+n;H+nn`@=2a{)_m^NZ#)nilPM^98t=)N|Wgm#xXy_#yGpB~|?p5LS)Ks@a z#dstgi@IedOq<W#jr=O$ab0nZ-*dOq%{|6h1_W_l6h$0w5Hp7N%&e+NL($#W??7&# z5Nir&<lfyLlkcktwYX5JVwb<5xS}0ZVyP3yIcxnheKQL3?=>xmSQFijIBto@yK=It zvcjz{KFPTF873O_=vC${FRl@bCT^M2>+gj8eiPlEymv{3#EXUqH`(Bycek|zhtO<~ zn`Is6_f(@>`kba>@V<B#6sZF?p~T~dLUq9RMzb#oBbOd=EAyfR{Pc-U0vq=twk&XG zP}T;Inub0Pm7|!R9QR_y_l^hf`w>7;JzWQU7WE@7us_g936e7FYg6(`4}3t0vPET} z!TtlZmJ(uPW8-2I;^GpLd&l=q?wgd5kkq%|4L9_?;f8+639_id*a%;1*Y)mwUE+1u zCnjFsCowUx53dsY7>6WB!XU7dl4DW%2OQc!(vvkuvKDv;9XBTMvNjR5j5hAvs4y=M z()6h4m|n4Q@x8V1ov;iY=FaO$i_#o=lpftHCN|oUkd2+mj;QpMk<pXq7T+-N;WeXT z`h4%lTk>uh)OX&CCE26B-+XOKufdPaZ#s0Q)HmkFC!YP*kg4km%BH>aq(A4Ty$jxR zp8e(8U9Z<1Zk|5$`#<@|t^fPwzcift>92mf@BQ=lmoNMF`ky`b${R;o#@=06vHX$$ z^VGKAy?OLPGU+;M8zpt>6%##1s*pZ1B?>ioc;F4uqt<+{57*$ud9O8P4=Oq2{pMp+ z=Jzf2jXpCthAYr($e5S*q7qNuR5oovj^Fv7RfS8}U}&%kfww8aA?Hk{iFCf;v6+L1 z4SH<mJu?SAHt(^SgTDV0g}5*9=gaMU?Q%Q!UT){>m)rT5%kA8Ext(uZZs(hq+j-gR zd`tROx~SO#tkLuEs7aHlj66sM=%h57LrVbr@$(79mcb2Iph%-BG@lHkTh1_$&!COS z&!^!4VyTywB3TBZ&cOGV$7DWriI!@?|DfHfXmHonMzXC;U&ha?jS`qghwnU6Dfc@* z_9yuLnG%0iON3_#RbD1}9&tvz@mV?ePveYuoXr3%$N~G7@4y;A-~33o_?P_1VZn0G z1Wk<QP<6zUM({ec0m19ghJ;>+u9-Zv5qgj}pO=>z`0=$!$&yR@5w<A$xhhY!AAr=0 zF<5%x2UQn(L6}b}*g)N_r!(1SuFMCzD3jn)B_F`V_Rp4qtpk6bI$#bOD7Dd81)o$B z3yQrJPXBzT-(Tsj;HN1bjVRympVIDGA$~TVJC`}<))cc{&!ZQfzth@1necR8$kPMy zlwas}f!8gQiaadFmsh%+(<L3J`FJqh!eD>&oY{Ae;+n=|4i-}e#ih<Nb9N!Y?a43p z`<-Iyns#`qKV+J0YNdaP(>vK!fu|M!5+tRR8QY{VG`O1<a=%WFuEK+vWiZPK{$oCZ zGOA!mqYTP0N=+E>h4q5X?!!~4b>VX46MP`WR{2IRN9hpUlZ?`0tBT!~Gv`g8hmAJI zPj*k`R`@G^!84dMFCzEJ)8||D0u@d7&UAPBd}kiT_gkitXS?Xy@BiM|p6W6xY0Q9u zY3EOgCKq`co$hP*I7pMHd(Ed$W=hk2)4gV0n7etl_7C!Wo%1}wxg<VPWWslT*alVQ z-b$2Q?+_W7_s9KfiT2M39Ar|p@Ljxwa4W<?a!1D+t${Uo=)YjzZYW!T_<>#ffjSD$ zE_}q5e|kxU)Nj6LiU-G5;}=q|kk;o3|Fm}f#&i!z%bAnl>ikleli;B^a}wOdas6F2 zZk9<bembtTLU1c8xi@ml$b4U^tAyw0qF51mf2F$|Hk9m_?WOLeTz{sQZI`dQyxn%G zi)SVH9I`ME-;ydmhh@i<*7#Wad1*hA#B!o%PA`l-T!A=O@d~Gx=Yn`TZ1U@?GKPL@ z#2s?p@>;LRaOWeNm=En-ktJn^m9(hn0bez9)n!X&l8qMa2c%{merqJH$ux<%nfG$_ z(qxLm@B%3br-5N2<x(cyiy8G5GE<XA6_~H_Pz~CCf=J%&V@XB1FcyThL|@tVm9msr z($d@i=8_)u)%KG9Hp}S?Cg~fm4M`ttFX=ToQBUVRwr{8Jr~ZVguYX&a<vinYKYpdg zC>6DsTSI%0bsB4oQrd%jHNjCzU&|C&BG&0%^OqD?JJUuopRO9IKCQcs&%Lb5w-oi> ziJy#mgeR&?EU}lsGdc>g;T|8p0GqIc3by@8%I|qHr2Ny6{|V}wUAIx-!Lu~UwOq<l z*Gp1r^o>3LNKC^eAH${aAf~zH8%yLEE|~|H#t3PQx_wZIUU(2*f)Sxw9;PurE83^V z0Uty!+rbg}Cf>g0N963iVcNTF@WBUPd3dL9*5(T*1|9q?+RG!2{(aSK5o>RP(%!UE zPc__^QY%}FyHtyL&LtsCi_<V7d7#rPuAt5RdW1HQ{@2TDv(m|65iN5oVjs7+F9M%n z@LI{&%p-ESVK=h9!y^GNci_i5Ucwt#BG&WX3*5!aiYr~kB`&AP+!$fFZF<8q<i-fI z48KZpVO@eXX7GhBII?_6whaq|?<-;rRTukw2L5ks(~bF6n9SSX|5!NfmY!(SMTbcI z^Rwy3#$Q&_pJlA(=ONqD=;4-zJYih(md4lvVcHvsr4ju!j~$n?liAYX?kG#dBk;9p zY3R4(DtffN3_IU=Mpq4D6*?7u^LpC+)Zh-KP7{|OqkTpH*`d^EVp@NCE9)ptJnN^o zfA~k5bns*P>$taYj=T>)p#$Epb|`iFYV;7=^8D@&rAA-PTSL#x`0rFy{2O}urH!<x zu7x(|K8HG9y4F+Pd6D*c_fdGM(`~Q+3vGTOuS2QPupd^?<{?dV>mL&6>2+_?(0A6- zGnt1`>s#lnr7dq9=}_u4sc17DcyvXFQlq>@-=hQPj?t9yh4i*NKvPq{O#6@Ds4Rk@ z<?vapx+K1@UGpQy9dBQD<goP21R}KR>hPKY#ulDCx@xN~ZnA09wQCzbK^$DHSF-4$ zLhOsr-=Z5oFihTGK#T7B5Q%?&7TukDI+wKT7svYj(^ISo1^98f89#gO2tu%ySPSY1 zTzc+kjhZ{+lIMZAH0F+esOFA#s=1@X*4$A*%^h*c$8c%P9Wf2h74b1#GLNp9J4)^m z<8tl~!n9XebW1N3p8m_s=g};kXs>P2wNuw?T8l4Z8@;J4y6{q`7nDU8UTXA$vglq= z7Tr$EqI*eMbm65=2b4t@UTSneS#)nJi|(xmEV^CFq6;r|+N><P@KU3nD~oQEvgn?& zEV@m~q6;r|+NmtM@KU3flts5oS#&RVu|=2CBSwz9zH_CKqg^MV%Ug7@e9a-=z(F{e zExKX&@jRX39R`3U;-|#u86Lcq+s>N19>+(+6Y7CIC+}~I4H2A|yFs?Em3g@duZGE3 zS#d$zLIh&1BAu6GYlN4GB^fmvZ%yL>k&f}q!aSmAHl$cf;r`P;VN#TMl+SH;bJADZ zOYw{7N9`XX@z2i|p0uu=q$mB;?K`0*G->sBx#+k=s;}45y8)@!grq0y?IpeTo|oaV zeq+*#Xz^IHsMTC@A;3cAvF0v($(cBN9vQ;9^ixM&O+R{i-(=#l`sVkf%r5^H=AFy> z-cS07FVp0{@lp=x^SqSsa&K)Tp+U*V@HX?%h-vDtdrFSsl6i0$I>Pe(@6&p$zs%Zs z&Cdo+ej!YIAAKJlYwx7m&Fry$7uWr%wU?)9Y>zcd4$HNq#aH98zPU$ebKcr3YO~QS zYJGW2IFYZJE#df%9&2XsP5g!{P7&L0UEr~nC~?=dVi`~QzhN@(c>hx}GK!vPX?*3H zur#I_@qgy~o|9}#qr2aY>lv0tT8|i;r@a(5PDEm9L_fiUhV8LdBj{(F-~1bC@nz;W zhXo#{1@9lH@DkqVxF68%qY68e@YWVr(5(;LN|XOr0u4ExN0WZMmIlwyf$w+1x4%h4 z`v0;+snd}E_Eoy?Pt!Y;8V#8cp!riDp`l;-EfxH}8uKlW(*1K5LavwgSl{*J3v_$` zaTH$awBX;4(t<zk=}>A^*wCNuFCRb)pYu~e>sVU!<i|9B@$IPfqO6bUzUPK@D0P}V zWFHOD*LNu4wI6z#2LE6vO}KkF4IOYj-Bn&jw?5h0?%CvOth)3bF>*}bcEyoH^$(+n z(5maiW6j5ZCadl$J=Oz5><gaF`+VO)oG~~|-d{kA?v@aVe}1!cGr!fjq*pI6=Z+Sr zxud6{753Z__fK>AO!q>KjJYEzF%KlAF?ZCU=8j%eb4UMb%^j^#b4OhA+!2??+!538 zToE6`CG+TtxuZcnVqCswewg+ui|*?mnR7>-Xs>P2nF=iBHLb;$v5kJNEV}Sgr<asP z7hb|!t1P+~l|{GHvgn>y7F~F$)6bMe7hY=gGiA{|r7XHl5m<CPltmX_>a<T;bm65& zZz_v!zq07wvMjo{ltmX_>hz+r=)y~Q?UhCMyt3$abg@M@xJQf}vo>65<Y?DPuHdm2 zpJ#~2dNdB^8T*?Q6ZTkt>Up});ISSOVpDwnR@}Y&!ep$hIAvQ%T~{oVxLe3)j*?Zd zh;*KguauXFXF#Loc%92|fYcz=gFQzwZZ0!wX2oJlj;oN_&d=9_J$rO}seTdts=Y(> z`17-kXFt_W(mSgby53BC@S#c5C&m5bJ9E;YK%C7I*;t8lLk=?hs@h)x6Rn3|kJmb{ z`D%>Of&Hou7goGPtgk8(IGg!&RScz31!Em)&H^J6Slfi7t|qd9Gn#f532ej_42!Rn zxPs8qh%1=4qfO!pLQ5mA;QsI5CUFG|wPcAaSoFi2A$g7~Sh#Ovhth~E$Q+m;aRs5J z5m#{A<~<TuFnsV~i7U8u<A=E7OV^s?3Ff`=C5bBtEseN>VFSM{aRs5J5m#{QqoXCR zVAzFJi7U8m-B8q;;|emz5ARSKaRmz-e<N`Pp`{U5uxR0J5?4^TcZ$Rn+<$M8^de(? z>*zm5c2(Jb>4@h9-ha*ekMDb=eJ}miAF}^=ed4o|Mh-7HylZP3TF&gHnSjk+YFNER zqK8G&OGR42UaJ2WsCkLFm#R3V?CywoHmYK*KV5I7b2zGddh0c-_wDZN9cL%ADbgtE z>v}{Fm=l&8MD>7)Z3`0qNBlQJRmXrMwX68OOI{-G0ln_#1hYoQ3YC4u7<cZrvaO_1 zSf+(eGOmc%`<k)0=DgW{d<nM#kkius>uL#X4A_5NEdku?Y)$QQ32Y?$ud5|sYif7& z)UIwNo8Lyf7}6ar_4m%x)~v3VfMLpqtXXptkuV$?x$)hh1pIhy{PjleBI7RsWxTaz zK=HsZWR&rUh>t^#$<F?Gk4bIN8{ABeCcoY|uX#SR4o004QM>C=OQimMo2cI>*)$Qq zjJN4sijJGH=7~M67XnfHx2-EmeU}cCBV*0Zw#I<tz=qk520B7|KkutY0{V${IY;Oi z=|eZR9SUfB<{qOHqz(V+Ujy3S!V`3g^n^#--U?{DhM%HF(h3^h2<UB(CVW7rk&15P z-hj40<1{tli2Z*KXf5SUbOuB%e++0FW6si9(kk2j5YV>8HB&Run*R!DyHn2bQ}?5< zfPcz)I!{#lGO%$i)IwDBQb60{xIh<>si5`60Ij`17jc^XI|Eu<-bKK)>G^<mv|lUX zC7Yt(1ZZn3eMnl$(O(B>?uP(r{q}&?knj<G1P*QgFF=nlNL&9Cb?e(kZA4km0V&Yt z=K@-D(#P~MX@lB+6`)!M;XMw}eu3(L8K9g`2+6U=JsY5P0<C{G;Aq5z0g#8b1oUxu z{hlcOKLUEKK#Kuw6KFl469Vn}_W;tWgRBw242+2>&jhqelo=@3qRd6fGorIlK7q0j z<rb9XD0irGJIW$#Z$&v5<tCJT+&Yx$C|5yWW7=?nB0f_+fE)&%K`q)67+M8ruhb_O z(0Yb6M++`tu3XGkTvuC)fL>heD{`>|0M&fLLfN?$4Uj5e5#+N~gcf%cLYwh13$+G9 z-NQoF5*oJ!sGyC7z8XT`=U`AvXh2iU`iL8-V0(ZzeaP*%^*4}zDuY^j(~bbSTDgG> zpAXQMi_idCk5;cwVo-~D6^hZCeE~Y6r8eveP*DpsM;m_Pw*m5;hdyapjlV++o`aTY zLl6BPwJmRE?MvOe2Q5GMENf-T);~cva?h~l*0#O|VfJmJ4@etV{}(W?{Q&B%$E|67 zGoWoB)JP}6XxrNX?NH%KIu4?3^#Q%UJmv%)B|YPbmcs%4l_De)ejokgp&iEpdc&IZ z_vt-y^etGozX?k6jA!V3R8P@K*`<$c*!j_(s3$g*=cU(kd}a^3E&d|Vlm2Y!c4uqZ z((QKX+GdAscGzZzZFbmZM|TdjUCrCRF?O{?L;2a#4V6Y$!`8e9f91>mi$nq^_6NxR z*)r$~9cY0rnTtK|XwN&^^N#ksqdo5kr-nW6*yS%|1f8e0bc3?!dZ-6V_p{79CQ}OB zkA0{we#YMo*iH%gV+!Ms_ZT#N6@6b|*u`o%H*I(4-_YIpT0lRvr}>!W^n5K4RqvqO z=Hr(0^R)nN|AaI_sp&{Kc$)xfxh*Fwf9R_g?qtw23O}17JZbqz;fGVWQ<k?Bo?(S+ zwEU*<-3e}D%LkSRb$19(`BLFYR%EA@R}~Irg=td$)!$l}Gs@EnPqU&qt9-7z6eh2w zS$SXKX%w2gmUGGv`=W_yJFh&l@Ju!)!3W#~gt%rw(pCh~q%(;)X~D+8G=Pn`YjG-t z!KuV?i|Qy0s$;ltaTN-MIvdX1-&rVJnBmsN)hntd%fSmFwJqi<G@Q0vz3d1za1f^H z^hHZ3B&4p~zwp;vILi@?W>m;imP;7zt#BtT=P+EU7S3`LEB#4tfUcPS;=Q6}=?%~_ z<u`^N)<4eMw)fcf9$y3Yo;}gnotBF&-ENg`a1tq!DNLIt%AUftr?I<C2kdEF`}I-# z^-;24AGKc}Z8vS%ohDD$^R`XYu9s<$qb=Q_EV>>N>Dtq{e@Cy6+S9o9G;Vr>J&kJz z0d>6#vpvVIzgu-DN88S@r5n`W?vzE>^EPL3p~LnREl;X-#XFWZkDe<>t3!kV{I0AK zq0e#fi6PPX93{^$mGCPiMvQ)fipggj!@MWB4vp3Cg)hl*WWE`jA4+9#G}h+pDkgt3 zGC#EBS|#BHmlUk^pK~;@BfD_bhOLMO-n_v(JL4S=7>=2?b{7JMTehzncZeEDpS7vw zctCGlKdym8jZ+^zicsVF+N7h1Le|qawjB)U&HtQo9P!C|(z><-*s6^=i7<Vw=qMtW z_vM}9kmi2dUq=AG5u`uu1pM>+hjWlVt$|CQWAqUj9kb~Vh_64x0n-UP@b19lj%JRd zPTGUl4W4nF<M8U39SE=9c#eav9a|7|{m6Na(O-wS{PGqK&@RMl5FC_^5dHL~7mQ$S z1arr{ieT<d7dgbc7IFErBt$>8`PU#wkQn`EI4=J~4iV2qh<IzNgy?Ta-1v7t;$ZR| z#O14C{bvwij$nO6=%*t>Uu%prLi7=sUntN4KzO+TZ(?LT3r;B#wqCm>K(htf1_*Kc z2z8G^s5|XtkaGV$p!bzXcn_c%0zD3>MxdR5HVD)JXuCkIfc6o_V?^%jM;RCZ0OCaK z{l5jkorW3(qah)U`T=NUAP&F*VbTO9y9Ig`&?bSl0D45AwSX22Q~)SLpaK68a5P)F z2Ka3pT<7Dsj#`0=0A(<w#Wh0=`$Qlc0o4eUCn5U`YL0q{ahv2ks05TJf%<VrA@JQI z`Wiq8&Nt)qcS|D`A(28`mIUf=M=P%9lndIR)*T3;Pmw@<7cwz$QU)l(rWYht0|NDv z>hUJbE@W_k&SW&<jh6#`B~m}91ux??43bd&*=<m<rVNSIpWOo0JDM%A`nipGAE<ti z#Oh}p!W$`j`kmp-5-D5p(#eK6iPf)dgJL%qaIC(Ty=NcZwMmyyeOD7wR2-Up61gk% zlz(o12d@s*B%I*17Ab3+4k0?<6?cqNUL+K4KN4`XZl2{h!Wl98)og7>MvN1iOOp=M zL5dnzvtf55a%ME_+~68|kdta8eUh!s;;b4mZ`04YMcd77Uh7*w5A>uzTe{uZTDEk% zUAne4Vp}7&HDX&Mwl&hJmDHW%Z`bp-@0VRK(;!D%x<OfVJ!H+4*mH=OL$&7+?KxEF z0A^;?V$U4fGl%xfp*?fRNj_~`-L};`l|XmS?RLGz*PR?~TfN(*`)OwmlPMX&^hQX1 zaLo|^alpOdcVx)Ka`?Rg_YsO@<pni7rM4fl%l(+h3cY<xGg73R-pu0x$3_QDdoAeH zJQ0Wjh6cbzYdSYi1fm%gv+d88m-D2Fdew4wS}1sQO~2<UlWdRW0BwW=7x(#?ZE*IQ zp3o0W-0v-ysD=73%Qt%3r23uZByBQKaob+8yrpMM)Nd`f=~)x?vgJQ*Hc`7wN2-N+ z$@Hk6gNu?al5H=Vu2o<jfycA_1;fRPF#6qb*#7QL*&cu(`dzXO7KYOmLG%U&r!l;* zh@m$ysEcyLS}4?5`C}1QZ&2a7lw%f21q>9fUU_IgFj0_^a@97PsNI&&_EbRIDYg1T z(0Oa&&@Rf0d(tHPqvg&$VWR#N^y^wU=z?<a9uGwAjDyAiqa3}*0uEqiL512<mA@C7 zcj%QC=$Y;HwY|RAxDVL2F1p>i_?z3epWSxuPFZw4Z*xKkI&8nIY0tCv+;=Ry^8HwQ zp4EOs6SJ%K8=CeTn)Vx-SF(h<-X`fzj<&6COE;*|-6@N%=PkNx&$E63-_W$@Syh~h zHLGgRv)c2l2<)<>Yr1vjtLyJk-O16m-E8UhSli8<Xtn2ABbsOCw;k=bUhTJDyFv%d zu4k3}_H3-g$8&Uj=YK|weCPX&H%;QeLqCatY<)m>LK8((dRt&u0zT7C(>{S)J>e|Q zlC+yad^;X7)(Sqy0nZ9P&%w<KZsCuQEBFG3G7G#j?jnC5UcnN=tl$s%Z4U*1#Ge>f za2rQ1EBIp$f){uPT>2awkNP-v!21r{ieY_+gG1?4no!LoMml~9BtE17S_U2Usl+@O z*6Q*7bdIDq;E(y73U1@NDEK1|vsN(2VQY>j<k(ieCIw&QYgO<C3Gg;(T39v;f1YKg z;ByeA0#QeiZ++@nL*(_TXSfa0OH-ThHe^@Y2q(d>YyRw7MJ`8?RV2MLj%|T2M*ov8 z8bfC&I%#*{aT2ZjbUG8cd_Qd;xkfl!gEz8~5Z<3MmQi&m@5q~(Kd0F5XB5NJ^L<MJ zCWO*`I%%?I*?+bKYzcfpBoIemqJDHEKHFvd@n^iuk9jd{d<2Z&J2v1H(0_$)p+Phl ze}m-j78+>%rBgbk;g8F7g}nvz<`F}1)IjX%r`}gK-eES+!tXE}9}+XyH==Ggg8EAs z-Fiq(HwNrKTLQKO{vIW;n;bXw?|;()WSr`y_rHBYeo^^@&4kyv>!Mr_+>?=bh*MKJ zZpkb8u#ReY$Hh8_JAbJDKD|%+kb+eg6#9IfUUN_CQO<IeIL&`fVb9iS<-?A1BCO;& ztIsNAQ=L|MJEw`$WA9nrq>vxfX(fFdIh9t1{{w|<tkYLdi#biFkrr<8DTO>)r@3xw z;#^#})SOhf6Ls3E>@zUBY4UM}I##F6K^8fF4lX#Ra7XL32cpmM198mPjw;-dI?Wk( zo*#^3%a17B`>0@Ci##BI?R|x70A2J2eo)pIH7MNSI&G0INyqLvtWfXO5z>%dB)T1t z$m_j2ZFRal?I+ioxI=ZCU((NMjwOc_-Me*EB+1Tl0m+dE>u8u{LQ7m3L}}ibHqKU8 zh`mBpUq@3Vo!S6E3Zt#+{V`{+TWq4<0g+^4OFdSnFJ82=Rgu0^r>%_r1dr`hc)ZRr zN2goNJs0crhs#$&a=DV$EqV2cx+v_YB$J@EF3O|RfRzxqOLD+XK2aCV6pjaiB*Y*5 zV;UWk4~Um=pEPMMsv5M`X|<S)&<3nJQK#P{x#n)Nh)m_WXc3*P)0gX*B%s_=CZ`s~ z=|TvRb~DpF&{#)vcpBn?^NOa$qB&Kk<-#Iztb(!`G^Wm;w`dxnFL>G*V39N{Hs=&c z8jjX#Kyt@vlZ&b3%^@U|sL^aFI-e){fisE;`i5M2+A178NTY|a!=Nzx#2JeMm@yi8 z!Q7z05z^G?N{R;#&eQ1YsG&h&_My`j1rDA?aTWn&BP?(Q!XkYYcFm<Eh~WXLr`h2k z1x0{eizpfEsc6b<v-3fc#{Sii^4F*jgyW0`!3>iDdhBv28P#I{VoHK!N@TxT129;P z<bhf;Gbo}22*w~VuK_hM2)sCV0YyVD27xICT!SLOHQb|7twmvq5@Jvk5W@tGmOyd_ z53@OdP!zyqXtW527!+ocf~lea*Hn%2c+8S3!C6I?sJTU<t&Y)XII3=tpyon?t6!bT z7wZN8N~lf}F8?9nVk#*Fs7P>vS**wpTQsJ!LrE14&M=H=W<$&dAG6m$*)1A<bsQ6A zV5BsN%>IX7qliw`>80HNwCI%<mD!Wg0TmTG;GNQy=Nzw#dMLWxfDoi{tWFf7^ka1n z5DhW;pyUxD*?R&lEdz`0!HD#5>8c<F4=c%D3@d|VU>bw5OC*O8$upbr<q}vF?GG8; zhRbkwr-`Yr)0XOt(qg<J<Kz$-IWtTQ%7TwDtx1c`;q_e%hlz~RQobHCF6T(*$s7}d za*<@6EHKA&jPagWMrpAg^G<-9!`J)s%|W}VHh9CJ3`s|sx+-{Ip*tii<<Ql^+YjYR za>}8r%)1osT&uGsN#%g$=G_c;xK+a>S>;U+n|HnAb((j8B(01qf`~<KXw0JCXZR+X zyV~rM(5J8Gp62YV{mad62t`_)@&RXW&8amz7IgIC+fQK<OOLyIrP))?pdqpyCpiaf zTwblI`^`|F4E;FgiH*rvZ0d4Lo$j5Sd<3~<9SL_9S@)d}>m17q@91-w-leFU@62~D z|3oU=>%sE!x%t`Y$p`5GIbva#G?ODUJ3B+n6C+>ko?pWXIq`8IYX7!%MX6$*aMs!n z@xD9nxEOF8*f856<_WUbUQp=sNW!@;N6Zssu|+hW5F<!$&s;H2kjxgbf`UW@-rhnn zPmt3VVTOX_fV<&ho)jHLfTG~=se`sh6U02}w;f-l6(oY`_GgHBGVKJuN-H=-&b5?_ zd9nsymlf18q{NL8^CV^yzI-gWqXBJOoR}vGJB}*c5d<2hh<TE<=ZM0+j|!%Uc@neZ zeT8e_fJ8A*99tR`?l3+X>=5&0-C>1#54lmrJShYuCw-3-r;2%!-eltN?X;u)WWqn@ z)kBKzT||3|c~T2VjyxEkxniEAHV08!LxOa&XRueO>LtDuwn#1@g+UCe^w;es>Kzb? zd6HwiKGmv7-$8y=eA@V9qGwdNs=4Q)_04D*Mbg{M;8l~LHRL1GVxFwAVp)SE)>ozV z92u?-Sdpw3RSjCz=a%_1)A~9wPckebQ@Ji$MEJyXqXT0o)mrhdEsE2H5F%|H(`>T> zV$Um@7K;X9nzb-bV({T<6*Oz=EWYV1pM=hBLB!`a+(2?I61;LH5=L~Y`m!|C_5?^g zRsgN3<Oo=`Ncdj%I24_ObK|xlidLAQZzu{JJVT?MR(P%1ClI}=D1fQdsKJW1#Sy{- zT}e^k;I$gHS}%o}eF(9wiUJ3(rxc3-vJn=z0wLgUV$%~ezzWSZI~=5-2(W7lrDH9T zx@PBtB#r&}8aC~qp;qXw$pAgp{C+lVr(h_rSpzUIzHiM8wo*SUve&!@)Ifaz8|U6c zaaL5XDF$4FBEU7Q)2PX!FhvP5C<=&Sl}4{xVZdf{0HG*=Dbi?*6%}kYDVQn>aLv(Z zEst3e{)@AkO=?kSZ3!9`SV6<6xsX6F)aSFoe=k&LfE6%oDk%i0NN|GntjLEf8dKS! zq>2V-n9DSeTT#YluYs~#G<sVK6BSu8#%BLRuTez!Qu`}np2Rg<RAx^`2UJw(fHl&U zH=41@CJlPBMdN5o6{0*9t{kM15yALQxC|_gdLw)}NWtHxH@+G!15+i&E|DBYB=z-h zF;C)-h74{6GThaen0n+!cZhkC&=4|C&XSR{$i$%BB<9KXchxE0#c+rO<uFeMwT6t# zE-_DBCI;meF;6y`<2lCo`Xn(=lIqPn0d5Yh*<zk#GzD)MR3zp}PD}8<LLM<sX14`z zKd|KaA$oR;d6&YStF2tjliWu0ZiYKt%Um%}G7gz{z2nHcoh#-^%2s@eUF3$w+}c;n zliD`3OG2MoYsEat-eYz{DAM*pVxG8~%#H;eJya;>3G!^4J>?7<q8w@HVV)r0wyFEg zP@f`)m?y})ZR&ChvT?6T7xRSEZ=0?BVZhP&jAy8rCz6Ky6RB*kU+>xT#D?;`^n>*O E0iA?{1^@s6 literal 0 HcmV?d00001 diff --git a/public/opac/js/butterfly/index.html b/public/opac/js/butterfly/index.html new file mode 100644 index 00000000000..8b46b90c300 --- /dev/null +++ b/public/opac/js/butterfly/index.html @@ -0,0 +1,145 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Butterfly lightbox test page</title> +<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.js"></script> +<script type='text/javascript' src='jquery.resize-events.js'></script> +<script type='text/javascript' src='jquery.history.js'></script> +<script type='text/javascript' src='jquery.pxToEm.js'></script> +<script type='text/javascript' src='jquery.butterfly.js'></script> +<script type="text/javascript"> +$(function(){ + /* Enhance all image links, and internal (relative) links only */ + //$('a:not([href^="http://"]), a[href$=".jpg"], a[href$=".jpeg"], a[href$=".png"], a[href$=".gif"]').butterfly(options={ + $('#examples a').not('.image').butterfly(options={ + contentDefaultWidth: '50em', // for content + contentDefaultHeight: '100%', // for content + mediaMaxWidth: '100%', // for images + mediaMaxHeight: '100%', // for images + lightBoxMargin: '2em', // margin around screen (can be em, % or px) + animateResize: true, + //animationSpeed: 250, // in ms + //preloadNextGalleryImage: false, + //reuseFragment: true, + //closeButton: true, + //closeButtonImage: 'close.png', + //galleryMode: 'all', + //galleryLoops: true, + galleryContainers: '.gallery-test', // can specify more than one, i.e. '#gallery-container, .gallery-test' + preloadLoadingImage: 'loading-black-on-white.gif', + preloadGalleryControlsSprite: 'gallery-controls-sprite.png' + }); + + options.treatAsImage = true; + $('#examples a.image').butterfly(options); +}); +</script> +<link type="text/css" rel="stylesheet" href="butterfly.css" /> +<!--[if lt IE 9]> + <link type="text/css" rel="stylesheet" href="butterfly-ie.css" /> +<![endif]--> +<style type="text/css"> + /* + Styles for this page + */ + body { + font-family: Helvetica, Arial, sans-serif; + background: #efefef; + color: #000; + } + #page-container { + width: 48em; + padding: 1em; + margin: 1em auto; + background: #fff; + } + + .butterfly-gallery-demo { + overflow: hidden; + clear: both; + } + .butterfly-gallery-demo ul { + overflow: hidden; + clear: both; + background: #000; + float: left; + padding: 0 1em; + } + .butterfly-gallery-demo li { + list-style-type: none; + float: left; + margin: 1em; + padding: 0; + } + .butterfly-gallery-demo li a { + display: block; + float: left; + } + .butterfly-gallery-demo li a:hover, + .butterfly-gallery-demo li a:focus { + outline: 2px solid #fff; + } + +</style> +</head> + +<body> + +<div id="page-container"> + + <h1>Butterfly lightbox test page</h1> + <p>This page demonstrates <a href="http://irama.org/web/dhtml/butterfly/"><em>Butterfly</em>, a robust, flexible and fully accessible lightbox solution</a>.</p> + + <p>Note: This lightbox effect will not work in IE6, but the fallback (linked content) is still accessible and usable to visitors using IE6.</p> + <p>Butterfly has been tested and works in Internet Explorer 7–9, Safari 5, Chrome 11, Opera 11 and Firefox 3–4.</p> + + <div id="examples"> + <p>Butterfly can link to any content, for example:</p> + <ul class="gallery-test"> + <li><a href="butterfly.jpg" rel="gallery" title="The Cairns Birdwing butterfly">An image (with a caption)</a></li> + <li><a href="#same-page-fragment" rel="gallery">A fragment of content from the same page</a></li> + <li><a href="external.html" rel="gallery">Another page of content (using Ajax)</a></li> + <li><a href="external.html#external-fragment" rel="gallery">A fragment from within the external content page</a></li> + <li><a href="http://en.wikipedia.org/wiki/Cairns_Birdwing" rel="gallery">External domain, via iframe</a></li> + </ul> + + <p>Test also:</p> + <ul> + <li>An image with thumbnail (at right) <a href="http://irama.org/assets/images/dhtml/butterfly/butterfly-1.jpg" style="float: right;"><img src="http://irama.org/assets/images/dhtml/butterfly/butterfly-1-preview.jpg" alt="test image" /></a></li> + <li><a href="external.html#another-fragment">Another fragment from the external content page</a></li> + <li>Try resizing the window and making it quite narrow or short (or change the text size)!</li> + <li><a class="image" href="http://chart.apis.google.com/chart?cht=qr&chs=500x500&chl=http://irama.org/web/dhtml/butterfly/">Link to an image without an image file extension (option set to treat as imnage anyway).</a></li> + </ul> + + <div class="section" id="gallery"> + <h2>Gallery</h2> + <p>A gallery can be created using a container element or by specifying links with the same <code>rel</code> attribute.</p> + <div class="butterfly-gallery-demo"> + <ul> + <li><a href="http://irama.org/assets/images/dhtml/butterfly/butterfly-1.jpg" rel="butterflies"><img src="http://irama.org/assets/images/dhtml/butterfly/butterfly-1-preview.jpg" alt="Cairns Birdwing" /></a></li> + <li><a href="http://irama.org/assets/images/dhtml/butterfly/butterfly-2.jpg" rel="butterflies"><img src="http://irama.org/assets/images/dhtml/butterfly/butterfly-2-preview.jpg" alt="Orange butterfly" /></a></li> + <li><a href="http://irama.org/assets/images/dhtml/butterfly/butterfly-3.jpg" rel="butterflies"><img src="http://irama.org/assets/images/dhtml/butterfly/butterfly-3-preview.jpg" alt="Blue butterfly" /></a></li> + <li><a href="http://irama.org/assets/images/dhtml/butterfly/butterfly-4.jpg" rel="butterflies"><img src="http://irama.org/assets/images/dhtml/butterfly/butterfly-4-preview.jpg" alt="Green butterfly" /></a></li> + </ul> + </div> + </div> + + <div class="section" id="same-page-fragment"> + <h2>A fragment of this page</h2> + The <a href="butterfly.jpg">Cairns Birdwing</a> (<em>Ornithoptera euphorion</em>) is Australia's largest endemic butterfly species, with females reaching a wingspan of up to 16 cm. Males are usually a few centimeters smaller. A closely allied species, the New Guinea or Priam's Birdwing (<em>Ornithoptera priamus</em>) reaches 19 cm and is the largest butterfly species found in Australia, but it is not endemic. Cairns Birdwings are found southwards from Mount Webb and Cooktown to Mackay in Queensland. Its favoured habitat is primary rainforest, although the species will breed readily in a home garden if the correct larval host plants are grown. (via <a href="http://en.wikipedia.org/wiki/Cairns_Birdwing">Wikipedia</a>)</div> + + <div class="section" id="error-handling"> + <h2>Error handling</h2> + <p>These links are all broken:</p> + <ul> + <li><a href="butterfly-error.jpg">A broken image</a></li> + <li><a href="#fragment-error">A non-existent fragment</a></li> + <li><a href="external-error.html">A non-page</a></li> + <li><a href="external.html#fragment-error">A non-existent fragment from within a real external content page</a></li> + </ul> + </div> + </div> + </div> +</body> +</html> diff --git a/public/opac/js/butterfly/jquery.butterfly.js b/public/opac/js/butterfly/jquery.butterfly.js new file mode 100644 index 00000000000..191e5cdcce8 --- /dev/null +++ b/public/opac/js/butterfly/jquery.butterfly.js @@ -0,0 +1,1472 @@ +/* + * "Float like a butterfly" + * Muhammad Ali (a not-so-lightboxer). + * + * jquery.butterfly is a fairly light-weight and fully accessible lightbox implementation for jQuery. + * + * jquery.butterfly.js + * @version 0.13 + * Changelog: + * * 0.1 Initial implementation. + * * 0.2: Support for window resizing added. + * * 0.3: Support added for callback functions (open/close/resize pre and post events). Error handling added for when lightbox target resource doesn't exist. + * * 0.4: Accessibility features added (controlling focus for user initiated lightboxes, keyboard support) - as per: http://irama.org/web/dhtml/lightbox/#accessibility + * * 0.5: Bug fixes for webkit. Blocked IE6 (no LB for them). Basic caption support (thanks to Ray Latchmanan). Gallery support. + * * 0.6: ARIA style keyboard support for navigating through galleries. Keyboard access now trapped in lightbox while lightbox is open. Support for preloading next image in galleries. + * * 0.7: Captions can be configured to come from link title attribute, link text (including any img alt text within), or not be displayed at all. + * * 0.8: Added ability to load pages in an iFrame (kicks in automatically for external-domain URLs). + * * 0.9: Support restored for IE6 (all thanks to the perseverance of github.com/bboyle - he has more patience than I). Added support for back button (through jquery.history.js) + * * 0.10: Set default close icon; fixing issues reported by jslint; minor jquery optimisations + * * 0.11: Fix for jQuery 1.8 compatibility issue + * * 0.12: Fix for captions extending outside lightbox (thanks to Roger Kowallis) + * * 0.13: Added option to treat links as image links (overriding automatic type detection). Handy for image URLs that don't have an image file extension (like Google Charts API URLs) + * + * @author Andrew Ramsden <http://irama.org/> + * @see http://irama.org/web/dhtml/butterfly/ + * @license GNU GENERAL PUBLIC LICENSE (GPL) <http://www.gnu.org/licenses/gpl.html> + * + * @requires jQuery (tested with 1.8.3) <http://jquery.com/> + * @requires jQuery jARIA plugin <http://outstandingelephant.com/jaria/> + * + * @optional (but reccommended) jQuery ResizeEvents plugin <http://irama.org/web/dhtml/resize-events/> + * @optional (but reccommended) jQuery Got Style? plugin <http://irama.org/web/dhtml/got-style/> + * @optional (but reccommended) jQuery ARIA keyboard navigation plugin <http://irama.org/web/dhtml/aria/key-nav/> + * + */ +jQuery.butterfly = {}; + +jQuery.butterfly.defaultOptions = { + contentDefaultWidth: null, // For content (can be em, % or px) - null default means 50em if pxToEm is available or 700px otherwise (a good line length for legibility) + contentDefaultHeight: '100%', // For content (can be em, % or px) + mediaMaxWidth: '100%', // For images (can be em, % or px) + mediaMaxHeight: '100%', // For images (can be em, % or px) + treatAsMedia: false, // Set to true for content to be resized as if it's media (good for video content) + lightBoxMargin: null, // Margin around screen (can be em, % or px) - null default === 2em if pxToEm is available or 20px otherwise + animateResize: true, + animationSpeed: 150, + useIframe: 'autodetect', // load contents in an iframe (good for cross-domain URLs). Options are: 'autodetect' (will load iframe for external URLs), true (will load in an iframe). false (will atempt to load with ajax). + collapseHeightWhenPossible: true, // When content is shorter than available height, collapse height of lightbox + reuseFragment: false, // When using a fragment from the same page as the link, reuse the same DOM nodes (persisting their state) or clone a new copy? + closeButton: true, // Should we have a close button? + closeButtonImage: 'close.png', // Set to the path of your close button image + closeButtonCorner: 'tr', // Top left 'tl' or top right 'tr' or bottom left (bl) or bottom right (br) - top left is the most intuitive option that doesn't overlap scrollabrs + clickOverlayCloses: true, // Will clicking the overlay layer (the dark tinted area) close the lightbox? + preloadLoadingImage: '', // Specify an image path here and it will be preloaded + preloadGalleryControlsSprite: '', // Specify an image path here and it will be preloaded + galleryControlWidth: 49, // width of each control (default based on sprite that ships with butterfly) + galleryControlHeight: 85, // height of each control (default based on sprite that ships with butterfly) + galleryMode: 'rel', // Allow navigation between lightboxed images? Options are: rel (all links that have the same 'rel' attribute), 'container' (all links within the one container), 'all' (all linked images), or nothing '' (don't use galleries) + galleryContainers: '', // CSS selectors specifying elements that contain linked images to form discrete galleries. e.g: '.gallery-pets, #gallery-flowers' + galleryLoops: false, // When you reach the end of the gallery, should 'next' take you back to the begining? (and vice versa) + captionMode: 'title', // Whether to use captions, and if so, where to grab the caption text from? Options are: 'title' (the title attribute of the link), 'text' (any text within the link, including image alt text), or nothing '' (don't display captions) + preloadNextGalleryImage: true, // Should the next lightbox be preloaded if it's an image? + zoomFromClicked: false, // Experimental + callbackPreOpen: null, // Six callback functions can be defined that will be called at various points in the opening, closing and resizing of lightboxes + callbackPreResize: null, + callbackPostResize: null, + callbackPostOpen: null, + callbackPreClose: null, + callbackPostClose: null, + treatAsImage: false // If set to true, will treat all links as image links (overriding automatic type detection). +}; + +jQuery.butterfly.conf = { + overlayOpacity: '.7', + lightboxClass: 'lightbox', + lightboxLinkSelector: 'a.lightbox' +}; + +jQuery.butterfly.linkCount = 0; + +/** + * Standard key mappings + */ + DOM_VK_END = 35; + DOM_VK_HOME = 36; + DOM_VK_LEFT = 37; + DOM_VK_UP = 38; + DOM_VK_RIGHT = 39; + DOM_VK_DOWN = 40; + DOM_VK_ESCAPE = 27; + +(function( $, ResizeEvents ) {// start closure + 'use strict'; + + + // functions and vars + var resizeLightBox, closeLightBox, initLightBox, openLightBox, loadLightBoxContent, + lightBoxKeypress, overlayClicked, loadLightBoxComplete, galleryControlsClick, + isImage, parsePixels, findOffsetToCentre, checkForContent; + + + // helper functions + + /** + * Get the keycode of an event + */ + function getKeyCode(evt) { + evt = evt || window.event; + + if (evt.keyCode) { + return evt.keyCode; + } else if (evt.which) { + return evt.which; + } + return null; + } + + /** + * jQuery plugin that returns the text nodes within the target element, combined/concatenated with any alt text. + */ + $.fn.accessibleText = function() { + if (this.is('img')) { + return this.attr( 'alt' ); + } else if (this.is('input')) { + return this.attr( 'value' ); + } else { + return $.map( this.contents(), function( domElement ) { + if ( domElement.nodeType === 3 ) { + return domElement.data; + } else if ( domElement.nodeType === 1 ) { + var $element = $( domElement ); + if ( $element.is( 'img, input' ) || $element.find( 'img[alt], input[value]' ).length > 0 ) { + return $element.accessibleText(); + } else { + return $element.text(); + } + } + }).join( '' ); + } + }; + + + // On DOMLoad + $(function() { + /*// IE6 fails, bail here. + if ($.browser.msie && $.browser.version < 7) { + return; + } + */ + + // If ResizeEvents plugin is available, listen for resize events + if (typeof ResizeEvents !== 'undefined') { + $(this).each(function(){ + ResizeEvents.bind ( + 'x-text-resize x-window-resize', // no need to catch 'x-initial-sizes', lightbox not open initially + resizeLightBox + ); + }); + } + + // Create containers + $( document.body ) + .append( '<div id="jb-overlay"></div><div id="jb-window"><div id="jb-window-inner"><div id="jb-window-content" style="width: auto; height: auto;" tabindex="0"></div></div></div>') + .bind( 'keydown', lightBoxKeypress ) + ; + $( '#jb-overlay' ) + .fadeTo( 0, $.butterfly.conf.overlayOpacity, function() { + // hide when animation complete + $( this ).hide(); + }) + ; + $( '#jb-window' ) + .hide() + .click( overlayClicked ) + ; + $( '#jb-window-inner' ) + .centre() + ; + $( '#jb-window-content' ) + .css({ + overflow: 'hidden' + }) + .hide() + ; + + $.history.init( + function( hash ){ + if( hash === '' ) { + closeLightBox.apply(); + } else { + // restore the state from hash + if( /^!/.test( hash )) { + hash = hash.substring( 1 ); + $( '#' + hash ).trigger( 'click', [/*storeState*/false] ); + } + } + }, + { unescape: ',/' } + ); + }); + + + $.fn.butterfly = function( options ) { + + // IE6 fails, bail here. + /*if ($.browser.msie && $.browser.version < 7) { + return; + }*/ + + options = typeof options !== 'undefined' ? options : {}; + + // Pre-load images + if (options.closeButtonImage) { + $('<img src="'+options.closeButtonImage+'" alt="" />'); + } + if (options.preloadLoadingImage) { + $('<img src="'+options.preloadLoadingImage+'" alt="" />'); + } + if (options.preloadGalleryControlsSprite) { + $('<img src="'+options.preloadGalleryControlsSprite+'" alt="" />'); + } + + // Initialise lightbox links for each match + return this.each(function () { + initLightBox.apply(this, [options]); + }); + }; + + + initLightBox = function( options ) { + var pxToEmExists = (typeof Number.prototype.pxToEm !== 'undefined') ? true : false; + + // Merge runtime options with defaults + // Note: The first argument sent to extend is an empty object to + // prevent extend from overriding the default $.AKN.defaultOptions object. + options = (typeof options === 'undefined') + ? $.butterfly.defaultOptions + : $.extend({}, $.butterfly.defaultOptions, options) + ; + + if (options.lightBoxMargin === null) { + // if no margin specified, use 2em if pxToEm available, otherwise use 20px + options.lightBoxMargin = pxToEmExists ? '2em' : '20px' ; + } + if (options.contentDefaultWidth === null) { + // if no default width specified, use 50em if pxToEm available, otherwise use 700px (good line lengths for legibility) + options.contentDefaultWidth = pxToEmExists ? '50em' : '700px' ; + } + + // Assign an id if none exists + if (typeof $(this).attr('id') === 'undefined' || $(this).attr('id') === '') { // cater for jquery 1.6 and previous versions + $(this).attr('id', $.butterfly.conf.lightboxClass+'-uid-'+$.butterfly.linkCount); + } + options.linkID = $(this).attr('id'); + $.butterfly.linkCount++; + + $(this).data('options', options); + $(this).addClass($.butterfly.conf.lightboxClass); + $(this).click(openLightBox); + }; + + + openLightBox = function( e, storeState ) { + var options, originalTrigger, href, location, title, linkText, thisLink, selector, previousOptions; + + if (typeof e !== 'undefined') { + e.preventDefault(); // so that links aren't followed + } + + // Add state to history + storeState = (typeof storeState !== 'undefined') ? storeState : true ; + if (storeState) { + $.history.load('!'+$(this).attr('id')); + return; // This function will be called again by history.load after storing the state in the hash + } + + // when opening, overflow should always be set to hidden (it is changed as appropriate later once the content loads) + $('#jb-window-inner').css('overflow','hidden'); + + // if lightbox is open already and fragment was reused... clean up + if ($('#jb-overlay').is(':visible')) { + options = $('#jb-overlay').data('options'); + if (options.linkType === 'fragment' && options.reuseFragment) { + $('.jb-placeholder').remove(); + } + originalTrigger = options.originalTrigger; + } else { + // if opening for the first time, set the original trigger + originalTrigger = this; + } + + // get target content + location = window.location.href.replace( /#.*$/, '' ); + href = $(this).attr('href'); + if ( href.indexOf( location ) === 0 ) { + href = href.substring( location.length ); + } + title = $(this).attr('title'); + linkText = $(this).accessibleText(); + + // get options + options = $(this).data('options'); + options.href = href; + options.title = title; + options.linkText = linkText; + options.trigger = this; // current trigger element + options.originalTrigger = originalTrigger; // original trigger element + + // custom class? + document.getElementById( 'jb-window-inner' ).className = options.className || ''; + + if (options.treatAsImage || isImage(href)) { + options.linkType = 'image'; + } else if (href.substring(0,1) === '#') { + options.linkType = 'fragment'; + } else if (options.useIframe === true || (options.useIframe !== false && this.hostname !== window.location.hostname)) { + options.linkType = 'iframe'; + options.useIframe = true; + options.contentDefaultWidth = '100%'; + options.contentDefaultHeight = '100%'; + } else { + options.linkType = 'ajax'; + } + + // run preOpen callback function + if (options.callbackPreOpen !== null && typeof options.callbackPreOpen === 'function') { + options.callbackPreOpen.apply(this); + } + + // add/remove close button + if (options.closeButton) { + if ($('#jb-close-button').length === 0) { + $('#jb-window').prepend('<a href="#" id="jb-close-button"><img src="'+options.closeButtonImage+'" alt="Close lightbox" /></a>'); + $('#jb-close-button').click(closeLightBox); + } + } else { + $('#jb-close-button').remove(); + } + + // add class if overlay can be clicked to close + if (options.clickOverlayCloses) { + $('#jb-window').addClass('reactive'); + } else { + $('#jb-window').removeClass('reactive'); + } + + // Find and store details of gallery (if configured) + thisLink = $(this); + if (options.galleryContainers !== '') { + options.galleryMode = 'container'; + } + options.gallerySelector = ''; + switch (options.galleryMode) { + case 'all': + options.gallerySelector = $.butterfly.conf.lightboxLinkSelector; + break; + case 'container': + $.each( options.galleryContainers.split( ',' ), function() { + selector = this + ' ' + $.butterfly.conf.lightboxLinkSelector; + if ( thisLink.is( selector )) { + options.gallerySelector = selector; + return false; // we found the container, break loop + } + }); + break; + // default: do nothing + } + if (options.gallerySelector === '' && $(this).attr('rel') !== '') { + options.gallerySelector = $.butterfly.conf.lightboxLinkSelector+'[rel="'+$(this).attr('rel')+'"]'; + } + + // grab previousOptions + previousOptions = $('#jb-overlay').data('options') || {}; + + // assign link options to lightbox + $(this).data('options', options); + $('#jb-overlay').data('options', options); + + // Temporarily focus here, until loading is complete + $('#jb-window').append('<p id="jb-loading">Loading...</p>'); + $('#jb-loading').attr('tabindex', '0').focus(); + + if ($('#jb-overlay').is(':visible')) { + // if lightbox is open: + + // cleanup after fragment positioning + if (previousOptions.linkType === 'fragment' && previousOptions.reuseFragment) { + $('.jb-placeholder').after($(previousOptions.href)); + $('.jb-placeholder').remove(); + $(previousOptions.href).disableFocussableElements(); + } + + // hide/clear content + $('#jb-window-content') + .hide() + .empty() + ; + $('#jb-window').addClass('loading'); + + loadLightBoxContent.apply(this, [loadLightBoxComplete]); + + } else { + // if lightbox is closed: + // Disable focussable elements + $( document.body ).disableFocussableElements( '#jb-window *' ); + + // hide button + $('#jb-close-button').hide(); + + // hide gallery controls + $('#jb-gallery-controls').hide(); + + // show overlay + $('#jb-overlay').fadeIn(options.animationSpeed).centre(); + + // open small lightbox with loading spinner + $('#jb-window') + .addClass('loading') + .show() + ; + + // to zoom or not to zoom? + if (options.zoomFromClicked) { + // align window with clicked element (for 'zoom in' effect) + $('#jb-window-inner').css({ + top: $(this).offset().top, + left: $(this).offset().left, + width: $(this).width(), + height: $(this).height() + }); + } else { + // just centre + $('#jb-window-inner') + .css({ + width: '100px', + height: '100px' + }) + .centre() + ; + } + + // load new content to hidden layer + loadLightBoxContent.apply(this, [loadLightBoxComplete]); + } + // for any images in the lightbox, if they are now physically smaller than the relevant max-size, add click-to-zoom capability + }; + + + loadLightBoxComplete = function(){ + // once loaded + // init options + var options = $('#jb-overlay').data('options'); + + // restore focussable elements inside content (in case content cloned from current page) + $('#jb-window').restoreFocussableElements(); + + // remove spinner + $('#jb-window').removeClass('loading'); + + + // Redundant settimeout for webkit, cause otherwise dimensions are 0 when image loaded from cache. Thanks JKS! <http://stackoverflow.com/users/144149/jks> + // @see http://stackoverflow.com/questions/318630/get-real-image-width-and-height-with-javascript-in-safari-chrome#answer-4909227 + setTimeout(function(){ + + // Establish appropriate classes for new content type before fade in + $('#jb-window').removeClass('type-media type-image type-fragment type-ajax'); + switch (options.linkType) { + case 'image': + $('#jb-window').addClass('type-image type-media'); + $('#jb-window-inner').css('overflow','hidden'); + break; + case 'fragment': + $('#jb-window').addClass('type-fragment'); + $('#jb-window-inner').css('overflow','auto'); + break; + case 'iframe': + $('#jb-window').addClass('type-iframe'); + $('#jb-window-inner').css('overflow','hidden'); + break; + case 'ajax': + $('#jb-window').addClass('type-ajax'); + $('#jb-window-inner').css('overflow','auto'); + break; + } + if (options.treatAsMedia) { + $('#jb-window').addClass('type-media'); + } + + // resize + resizeLightBox.apply(this, [function(){ + var nextControl; + + if (options.linkType === 'iframe') { + $('#jb-window-content').css('visibility', 'visible'); + } + // fade in new content + $('#jb-window-content').fadeIn(options.animationSpeed, function(){ + + // set focus to start of lightbox content + $('#jb-window-content') + //.attr('tabindex',0) // add to tab index (now occurs during initialisation) + .focus() // set focus + ; + + // Remove temporary loading message + $('#jb-loading').remove(); + + // run postOpen callback function + if (options.callbackPostOpen !== null && typeof options.callbackPostOpen === 'function') { + options.callbackPostOpen.apply(this); + } + + // preload next gallery image? + nextControl = $('#jb-gallery-next'); + if ( + options.preloadNextGalleryImage && + nextControl.length > 0 && + nextControl.is(':visible') && + nextControl.attr('href') !== '#' && + isImage(nextControl.attr('href')) + ) { + $('<img src="'+nextControl.attr('href')+'" alt="" />'); + } + }); + }]); + }, 0); + }; + + + resizeLightBox = function( callback ) { + + var options = $('#jb-overlay').data('options'), + lbMargin, availableWidth, availableHeight, contentDefaultWidth, contentDefaultHeight, mediaMaxWidth, mediaMaxHeight, w, h, + reductionRatio, prevWidth, topLeft, animationSpeed, buttonWidth, buttonHeight, buttonLeft, buttonTop, prevTop, prevLeft, nextTop, nextLeft; + + if (typeof options === 'undefined') { + return; // options haven't been assigned to lightbox overlay yet + } + + lbMargin = parseInt(parsePixels(options.lightBoxMargin), 10); + + availableWidth = $('#jb-window').width() - (lbMargin * 2); + availableHeight = $('#jb-window').height() - (lbMargin * 2); + + // find current default/max dimensions (convert to pixels if necessary) + contentDefaultWidth = parsePixels(options.contentDefaultWidth, availableWidth); + contentDefaultHeight = parsePixels(options.contentDefaultHeight, availableHeight); + mediaMaxWidth = parsePixels(options.mediaMaxWidth, availableWidth); + mediaMaxHeight = parsePixels(options.mediaMaxHeight, availableHeight); + + + // run preResize callback function + if (options.callbackPreResize !== null && typeof options.callbackPreResize === 'function') { + options.callbackPreResize.apply($('#jb-window'), [availableWidth, availableHeight, contentDefaultWidth, contentDefaultHeight, mediaMaxWidth, mediaMaxHeight]); + } + + /*// IE6 needs help with resizing the overlay and window + if ( + $.browser.msie && $.browser.version === 6 + ) { + + $('#jb-overlay, #jb-window').css({ + position: 'absolute', + top: 0-$( document.body ).css('margin-top'), + left: 0-$( document.body ).css('margin-left'), + width: $(window).width(), + height: $(window).height() + }); + + } + */ + + if (options.linkType === 'image' || options.treatAsMedia) { + + + + // measure content size + w = $('#jb-window-content').lightBoxContentWidth(); + h = $('#jb-window-content').lightBoxContentHeight(); + + + // compare dimensions against max width and height + if (w > mediaMaxWidth) { + reductionRatio = w / mediaMaxWidth; + w = mediaMaxWidth; + h = h / reductionRatio; + // $.debug('w ratio = '+reductionRatio); + } + if (h > mediaMaxHeight) { + reductionRatio = h / mediaMaxHeight; + h = mediaMaxHeight; + w = w / reductionRatio; + // $.debug('h ratio = '+reductionRatio); + } + + // compare dimensions against available width and height + if (w > availableWidth) { + reductionRatio = w / availableWidth; + w = availableWidth; + h = h * reductionRatio; + // $.debug('w ratio = '+reductionRatio); + } + if (h > availableHeight) { + reductionRatio = h / availableHeight; + h = availableHeight; + w = w * reductionRatio; + // $.debug('h ratio = '+reductionRatio); + } + // $.debug('max img width = '+options.mediaMaxWidth); + // $.debug('max img height = '+options.mediaMaxHeight); + + } else if (options.linkType === 'iframe') { + + w = contentDefaultWidth; + h = contentDefaultHeight; + + } else { + + // not an image or treat as media (must be content fragment) + + // $.debug('contentDefaultWidth = '+options.contentDefaultWidth); + // $.debug('contentDefaultHeight = '+options.contentDefaultHeight); + + // measure content width + w = $('#jb-window-content').lightBoxContentWidth(); + + if ( + contentDefaultWidth === '' || + contentDefaultWidth === '100%' || + availableWidth < contentDefaultWidth + ) { + w = availableWidth; + } else { + w = contentDefaultWidth; + } + + if (options.collapseHeightWhenPossible) { + + // set new width temporarily + prevWidth = $('#jb-window-inner').width(); + //$('#jb-window-inner').width(w); // not kicking in fast enough, use animate to lock in new width + $('#jb-window-inner').animate({width: w}, 0); + + // measure height + h = $('#jb-window-content').lightBoxContentHeight( false ); + + // set width back to previous value + $('#jb-window-inner').width(prevWidth); + + if ( + availableHeight < h + ) { + h = availableHeight; + // } else { + // do nothing + // h = contentDefaultHeight; + } + + } else { + + // same height for all content boxes (based on contentDefaultHeight) + h = $('#jb-window-content').lightBoxContentHeight(); + if ( + contentDefaultHeight === '' || + contentDefaultHeight === '100%' || + availableHeight < contentDefaultHeight + ) { + h = availableHeight; + } else { + h = contentDefaultHeight; + } + } + } + + // $.debug('availableWidth = '+availableWidth); + // $.debug('availableHeight = '+availableHeight); + // $.debug('final w = '+w); + // $.debug('final h = '+h); + + topLeft = findOffsetToCentre(w, h); + + // if not animating resize, set speed to 0 + animationSpeed = options.animateResize ? options.animationSpeed : 0; + + $('#jb-close-button').hide(); + $('#jb-gallery-controls').hide(); + + if (options.linkType === 'iframe') { + $('#jb-window-inner iframe').css('visibility','hidden'); + } + + $('#jb-window-inner').animate({ + 'width' : w, + 'height' : h, + 'left' : topLeft[1], + 'top' : topLeft[0] + }, animationSpeed, 0, function() { + + options = $('#jb-overlay').data('options'); + w = $('#jb-window-inner').width(); + h = $('#jb-window-inner').height(); + + + // Show iframe + if (options.linkType === 'iframe') { + $('#jb-window-inner iframe') + .width(w) + .height(h) + ; + $('#jb-window-inner iframe').css('visibility','visible'); + } + + // Show close button + if ($('#jb-close-button').length > 0) { + buttonWidth = parseInt($('#jb-close-button').width(), 10); + buttonHeight = parseInt($('#jb-close-button').height(), 10); + + switch (options.closeButtonCorner) { + case 'tr': + buttonLeft = topLeft[1] + w - buttonWidth/2; + buttonTop = topLeft[0] - buttonHeight/2; + break; + case 'br': + buttonLeft = topLeft[1] + w - buttonWidth/2; + buttonTop = topLeft[0] + h - buttonHeight/2; + break; + case 'bl': + buttonLeft = topLeft[1] - buttonWidth/2; + buttonTop = topLeft[0] + h - buttonHeight/2; + break; + default: + // case 'tl': + buttonLeft = topLeft[1] - buttonWidth/2; + buttonTop = topLeft[0] - buttonHeight/2; + } + + $('#jb-close-button') + .css({ + position: 'absolute', + 'z-index': '999999', + left: buttonLeft, + top: buttonTop + }) + .show() + ; + } + + // Are gallery controls relevant? + if ($('#jb-gallery-controls').is('.active')) { + // Position gallery controls + prevTop = topLeft[0] + h/2 - options.galleryControlHeight/2; + prevLeft = topLeft[1] - options.galleryControlWidth; + $('#jb-gallery-prev').css({top: prevTop, left: prevLeft}); + + nextTop = topLeft[0] + h/2 - options.galleryControlHeight/2; + nextLeft = topLeft[1] + w; + $('#jb-gallery-next').css({top: nextTop, left: nextLeft}); + + // Show gallery controls + $('#jb-gallery-controls') + //.fadeIn() + .show() // faster! + ; + } + + // run postResize callback function + if (options.callbackPostResize !== null && typeof options.callbackPostResize === 'function') { + options.callbackPostResize.apply($('#jb-window'), [availableWidth, availableHeight, contentDefaultWidth, contentDefaultHeight, mediaMaxWidth, mediaMaxHeight]); + } + + if (typeof callback !== 'undefined' && typeof callback.apply !== 'undefined') { + callback.apply(); + } + }); + }; + + + loadLightBoxContent = function( callback ) { + + var options = $( '#jb-overlay' ).data( 'options' ), + href = options.href, + caption, gallerySet, prevControl, nextControl, prevLink, nextLink, + lbMargin, availableWidth, availableHeight, contentDefaultWidth, contentDefaultHeight, ajaxHref; + + // Populate caption + switch (options.captionMode) { + case 'title': + caption = options.title ? '<p class=\'jb-caption\'><span>' + options.title + '</span></p>':''; + break; + case 'text': + caption = options.linkText ? '<p class=\'jb-caption\'><span>' + options.linkText + '</span></p>':''; + break; + default: + caption = ''; + break; + } + + + // remove previous error states + $('#jb-window').removeClass('error-no-content'); + + // Setup/adjust gallery (next/prev) links + // Find the gallery set + gallerySet = $(options.gallerySelector); + + $('#jb-gallery-controls').removeClass('active'); + + if (gallerySet.length > 1 && gallerySet.isInSet('#'+options.linkID)) { + + // Setup the HTML for the gallery controls + if ($('#jb-gallery-controls').length === 0) { + $('#jb-window').append('<div id="jb-gallery-controls"></div>'); + prevControl = $('<a id="jb-gallery-prev" href="#">Previous</a>').click(galleryControlsClick); + nextControl = $('<a id="jb-gallery-next" href="#">Next</a>').click(galleryControlsClick); + $('#jb-gallery-controls').append(prevControl).append(nextControl); + prevControl.add(nextControl).css({ + position: 'absolute', + 'z-index': '99999', + display: 'block', + overflow: 'hidden' + }); + } else { + prevControl = $('#jb-gallery-prev'); + nextControl = $('#jb-gallery-next'); + prevControl.add(nextControl) + .removeClass('disabled') + .attr('tabindex', '0') + .attr('title', '') + .show() + ; + } + $('#jb-gallery-controls').hide(); + $('#jb-gallery-controls').addClass('active'); + + + // Find previous link + prevLink = gallerySet.prevInSet('#'+options.linkID); + if (prevLink === false) { + if (options.galleryLoops) { + prevLink = gallerySet.lastInSet(); + } else { + prevLink = $('<a href="#" id=""></a>'); + prevControl + .addClass('disabled') + .attr('tabindex', '-1') + // hide it or it traps mouse clicks + .hide() + ; + } + } + prevControl + .attr('href', prevLink.attr('href')) + .data('linkID', prevLink.attr('id')) + .attr('title', $.trim( prevLink.accessibleText() )) + ; + + // Find next link + nextLink = gallerySet.nextInSet('#'+options.linkID); + if (nextLink === false) { + if (options.galleryLoops) { + nextLink = gallerySet.firstInSet(); + } else { + nextLink = $('<a href="#" id=""></a>'); + nextControl + .addClass('disabled') + .attr('tabindex', '-1') + // hide it or it traps mouse clicks + .hide() + ; + } + } + nextControl + .attr('href', nextLink.attr('href')) + .data('linkID', nextLink.attr('id')) + .attr('title', $.trim( nextLink.accessibleText() )) + ; + + } else { + $('#jb-gallery-controls').hide(); + } + + switch (options.linkType) { + case 'fragment': // internal page fragment + + if (options.reuseFragment) { + $(href).after('<span class="jb-placeholder"></span>'); + $('#jb-window-content').empty().append($(href)); // href becomes a selector for an id fragment + } else { + $('#jb-window-content').empty().append($(href).clone(true)); + } + + checkForContent.apply(this, [options.linkType, href]); + callback.apply(this); + break; + + case 'image': // link to image + + $('#jb-window-content').empty().append( + '<img src="'+href+'" alt="" style="max-width: 100%; max-height: 100%; float: left;" />'+caption + ); + $('#jb-window-content img') + .error(function(){ + checkForContent.apply(this, [options.linkType, href, callback]); + }) + .data('full-width', '') + .data('full-height', '') + .load(callback) + ; + break; + + case 'iframe': // link to iframe URL + $('#jb-window-content').show().css('visibility', 'hidden'); + $('#jb-window-content').empty().append( + '<iframe src="'+href+'" title="'+caption+'" width="100%" height="1000" />' + ); + $('#jb-window-content').css('visibility', 'hidden'); + + lbMargin = parseInt(parsePixels(options.lightBoxMargin), 10); + availableWidth = $('#jb-window').width() - (lbMargin * 2); + availableHeight = $('#jb-window').height() - (lbMargin * 2); + // find current default/max dimensions (convert to pixels if necessary) + contentDefaultWidth = parsePixels(options.contentDefaultWidth, availableWidth); + contentDefaultHeight = parsePixels(options.contentDefaultHeight, availableHeight); + + $('#jb-window-content > iframe') + .width(contentDefaultWidth) + .height(contentDefaultHeight) + .error(function(){ + checkForContent.apply(this, [options.linkType, href, callback]); + }) + .load(callback) + ; + break; + + default: + // case 'ajax': + // case '': // link to external page (or fragment of a page) + // ajax call on remote file + $.ajaxSetup ({ + cache: true + }); + if (href.indexOf('#') !== -1) { + ajaxHref = href.split('#').join(' #'); + } else { + ajaxHref = href; + } + $('#jb-window-content').empty().load(ajaxHref, function(){ + checkForContent.apply(this, [options.linkType, href]); + callback.apply(this); + }); + } + }; + + + checkForContent = function( linkType, href, callback ) { + // check if no content loaded + var wasError = false, + options; + + // checkForContent only called for images on .error() + // otherwise, if no children() exist + if (linkType === 'image' || $('#jb-window-content').children().length === 0) { + wasError = true; + } + + if (wasError) { + options = $('#jb-overlay').data('options'); + options.linkType = 'fragment'; + options.treatAsMedia = false; + $('#jb-overlay').data('options', options); + $('#jb-window') + .removeClass('type-image type-media') + .addClass('type-fragment error-no-content') + ; + $('#jb-window-content').empty().append('<p>There was an error loading lightbox content. <strong>'+$(options.trigger).text()+'</strong> (<samp>'+href+'</samp>) could not be found.</p>'); + } + if (typeof callback !== 'undefined') { + callback.apply(this); + } + }; + + + closeLightBox = function( evt ) { + var options, href, originalTriggerEL; + + if ( evt ) { + evt.preventDefault(); // prevent click from following link + } + + if ($('#jb-window:hidden').length) { + return; // Already closed, do nothing + } + + options = $('#jb-overlay').data('options'); + href = options.href; + + // run preClose callback function + if (options.callbackPreClose !== null && typeof options.callbackPreClose === 'function') { + options.callbackPreClose.apply(options.trigger); + } + + // cleanup after fragment positioning + if (options.linkType === 'fragment' && options.reuseFragment) { + $('.jb-placeholder').after($(href)); + $('.jb-placeholder').remove(); + } + + + // Restore all focussable elements + $( document.body ).restoreFocussableElements(); + + $('#jb-overlay').fadeOut(options.animationSpeed); + $('#jb-window').hide(); + $('#jb-window-content').hide(); + + // return focus to original trigger element + originalTriggerEL = $(options.originalTrigger); + if (typeof originalTriggerEL.attr('tabindex') === 'undefined') { + originalTriggerEL.attr('tabindex',0); + } + originalTriggerEL.focus(); + + // Remove temporary loading message + $('#jb-loading').remove(); + + // run postClose callback function + if (options.callbackPostClose !== null && typeof options.callbackPostClose === 'function') { + options.callbackPostClose.apply(options.trigger); + } + + // TODO pop history? ... if this was a gallery, pop the entire gallery? + // window.history.back(); + + // TODO + // load '' = jump to top of screen + // load '!' = no jump, back links do not work + $.history.load( '' ); + }; + + + /** + * A plugin to measure the width of an element accurately (even if it is hidden) + */ + $.fn.lightBoxContentWidth = function () { + + var jbWindow = this.closest('#jb-window'), + jbWindowInner = $('#jb-window-inner'), + isImageType = jbWindow.hasClass('type-media') ? true : false, + isImageMedia = jbWindow.hasClass('media-image') ? true : false, + currentWidth = jbWindowInner.width(), + currentHeight = jbWindowInner.height(), + currentLeft = jbWindowInner.css('left'), + currentTop = jbWindowInner.css('top'), + fullWidth + ; + + // relax size for measurement + if ( + $.browser.msie && + $.browser.version === 7 && + isImageType && + isImageMedia && + this.find('img').outerWidth(true) === 0 // IE7 width === 0 on initial load + ) { // only works with '100%' for IE7 on initial load + jbWindowInner.css({ + width: '100%', + height: '100%', + left:0, + top:0 + }); + } else { // must use 'auto' for all other situations + jbWindowInner.css({ + width: 'auto', + height: 'auto', + left:0, + top:0 + }); + } + + + // if element is hidden, unhide it, then measure + if ( this.css('display') === 'none') { + + // make element display for a nanosecond + this.css('display', 'block'); + + // measure + if (isImageType) { + fullWidth = this.find('img').outerWidth(true); + } else { + fullWidth = this.outerWidth(true); + } + // restore + this.css('display', 'none'); + + } else { + fullWidth = this.outerWidth(true); + } + + + // reinstate previous size/position + jbWindowInner.css({'left':currentLeft,'top':currentTop}); + jbWindowInner.animate({ + width: currentWidth, + height: currentHeight//, + //left: curentLeft, + //top: currentTop + },0); + + return fullWidth; + }; + + + /** + * A plugin to measure the height of an element accurately (even if it is hidden) + */ + $.fn.lightBoxContentHeight = function( relaxWidth ) { + + var jbWindow = this.closest('#jb-window'), + jbWindowInner = jbWindow.find( '#jb-window-inner' ), + isImageType = jbWindow.hasClass('type-media') ? true : false, + isImageMedia = jbWindow.hasClass('media-image') ? true : false, + + // always relax height + currentWidth = jbWindowInner.width(), + currentHeight = jbWindowInner.height(), + currentLeft = jbWindowInner.css('left'), + currentTop = jbWindowInner.css('top'), + + fullHeight + ; + + relaxWidth = typeof relaxWidth !== 'undefined' ? relaxWidth : true; + + // relax size for measurement + if ( + $.browser.msie && + $.browser.version === 7 && + isImageType && + isImageMedia && + this.find('img').outerWidth(true) === 0 // IE7 width === 0 on initial load + ) { // only works with '100%' for IE7 on initial load + $('#jb-window-inner').height('100%'); + if (relaxWidth) { + $('#jb-window-inner').width('100%').css({left:0,top:0}); + } + } else { // must use 'auto' for all other situations + $('#jb-window-inner').height('auto'); + if (relaxWidth) { + $('#jb-window-inner').width('auto').css({left:0,top:0}); + } + } + + // if element is hidden, unhide it, then measure + if ( this.css('display') === 'none' ) { + + // make element display for a nanosecond + this.css('display', 'block'); + + // measure + fullHeight = this.outerHeight(true); + + // restore + this.css('display', 'none'); + + + } else { + fullHeight = $(this).outerHeight(true); + } + + // reinstate previous size + $('#jb-window-inner') + .width(currentWidth) + .height(currentHeight) + .css({left:currentLeft,top:currentTop}) + ; + + return fullHeight; + }; + + + overlayClicked = function( evt ) { + var options = $('#jb-overlay').data('options'); + + if ( evt.target === $('#jb-window').get(0) && options.clickOverlayCloses ) { + closeLightBox.apply(); + // } else { + // do nothing + } + }; + + + /** + * Key pressed on keyboard + */ + lightBoxKeypress = function( evt ) { + var evtKeyCode; + + //$.debug('Key pressed: '+evt.keyCode); + + // If lightbox is not open or if modifier keys are down, ignore key presses + if ( + !$('#jb-overlay').is(':visible') || + evt.ctrlKey || + evt.altKey || + evt.shiftKey || + evt.metaKey + ) { + return true; /* facilitate further bubbling */ + } + + // Get the key that was pressed + evtKeyCode = getKeyCode(evt); + + + // handle keypresses here + switch (evtKeyCode) { + case DOM_VK_UP: + case DOM_VK_LEFT: + $('#jb-gallery-prev').click(); + break; + case DOM_VK_DOWN: + case DOM_VK_RIGHT: + $('#jb-gallery-next').click(); + break; + case DOM_VK_HOME: + $($('#jb-overlay').data('options').gallerySelector).firstInSet().click(); + break; + case DOM_VK_END: + $($('#jb-overlay').data('options').gallerySelector).lastInSet().click(); + break; + case DOM_VK_ESCAPE: + closeLightBox.apply(); + break; + default: + // A different (untracked) key was pressed, just ignore it + return true; /* facilitate further bubbling */ + } + + // Event already handled, prevent default + evt.preventDefault(); + }; + + + /** + * Someone activated gallery 'next' or 'prev' links + */ + galleryControlsClick = function( evt ) { + var lightboxLink, + $this = $( this ); + + // Prevent default action + evt.preventDefault(); + + // find the gallery link, and activate it + if ( $this.data( 'linkID' ) !== '' ) { + + $( '#jb-gallery-controls' ).hide(); // hide gallery controls for the transition + + lightboxLink = $( '#' + $this.data( 'linkID' )); + return lightboxLink.click(); + } + }; + + + /** + * A plugin to centre a visible element on the screen + */ + $.fn.centre = function () { + return this.css({ + 'position': 'fixed', + 'top': ( $(window).height() - this.outerHeight() ) / 2 + 'px', + 'left': ( $(window).width() - this.outerWidth() ) / 2 + 'px' + }); + }; + + + findOffsetToCentre = function( w, h ) { + var topOffset = ( $(window).height() - h ) / 2, + leftOffset = ( $(window).width() - w ) / 2; + + //// $.debug ('w = '+w+' | h = '+h+' | top = '+top+' | left = '+left); + + return [ topOffset, leftOffset ]; + }; + + + /** + * Find if the node is in the set of nodes + */ + $.fn.isInSet = function( currentElement ) { + return this.index( $( currentElement )) !== -1; + }; + + + /** + * Find the next node in the currently selected set of nodes + */ + $.fn.nextInSet = function( currentElement ) { + var currentIndex = this.index( $( currentElement )); + if ( this.length > currentIndex + 1 ) { + return this.eq( currentIndex + 1 ); + } else { + return false; + } + }; + + + /** + * Find the previous node in the currently selected set of nodes + */ + $.fn.prevInSet = function( currentElement ) { + var currentIndex = this.index( $( currentElement )); + if ( currentIndex > 0 ) { + return this.eq( currentIndex - 1 ); + } else { + return false; + } + }; + + + /** + * Find the first node in the currently selected set of nodes + */ + $.fn.firstInSet = function() { + if ( this.length > 0 ) { + return this.eq( 0 ); + } else { + return false; + } + }; + + + /** + * Find the last node in the currently selected set of nodes + */ + $.fn.lastInSet = function() { + if ( this.length > 0 ) { + return this.eq( -1 ); + } else { + return false; + } + }; + + + /** + * from: http://stackoverflow.com/questions/1933501/how-to-put-targetblank-in-jquery + */ + isImage = function( fileName ) { + + if (typeof fileName === 'undefined' || fileName === '') { + return false; + } + var pos = String( fileName ).lastIndexOf( '.' ), + extension; + + if (pos === -1 ) { + return false; + } else { + return ( /^\.(jpg|png|gif|bmp|jpeg)$/i ).test( fileName.substring( pos )); + } + }; + + + /** + * Disable all focussable elements outside the lightbox. Stores previous tabindex for later restoration + * Currently targets links, common form elements and anything with tabindex > -1 + * @see http://stackoverflow.com/questions/1599660/which-html-elements-can-receive-focus + */ + $.fn.disableFocussableElements = function( excludeElements ) { + excludeElements = excludeElements || ''; + var focussable = this.find( 'a, input, button, area, frame, iframe, [tabindex]' ).not( excludeElements ).not( '*[tabindex="-1"]' ); + + focussable.each(function() { + var $this = $( this ), + prevTabIndex = $this.attr( 'tabindex' ) + ; + + prevTabIndex = typeof ( prevTabIndex ) === 'undefined' || prevTabIndex === '' ? '' : prevTabIndex; + + $this + .data( 'prevTabIndex', prevTabIndex ) + .addClass( 'jb-unfocussed' ) + .attr( 'tabindex', '-1' ) + ; + }); + }; + + + /** + * Restore all focussable elements outside the lightbox. + */ + $.fn.restoreFocussableElements = function() { + var focussable = this.find( '.jb-unfocussed' ); + + focussable.each(function() { + var $this = $( this ), + prevTabIndex = $this.data( 'prevTabIndex' ); + + switch ( prevTabIndex ) { + case '': + $this.removeAttr( 'tabindex' ); + break; + default: + $this.attr( 'tabindex', prevTabIndex ); + } + + $this.removeClass( 'jb-unfocussed' ); + }); + }; + + + /** + * Converts % or em values to a number of pixels (integer). + * Use pxToEm (reverse mode) to convert em values to pixels (if the plugin is available) + * @param String input The dimenion to be converted (may include % or em or px) + * @param integer centDimension The dimension that represents 100% + * @return integer Converted dimension in pixels + */ + parsePixels = function( input, centDimension ) { + + centDimension = typeof centDimension !== 'undefined' ? centDimension : $( document.body ).width() ; + + input = input + .replace('px','') // remove px units if present + .replace(/^\s+|\s+$/g,"") // trim leading and trailing whitespace + ; + + if (!isNaN(input)) { + // int already, return as pixels + return parseInt(input, 10); + + } else if (input.substr(input.length - 1) === '%') { + // %, convert to pixels + + if (typeof centDimension !== 'undefined') { + input = parseInt(input + .substr(0, input.length - 1) // strip unit + .replace(/^\s+|\s+$/g,"") // trim + , 10); + return input/100 * parseInt(centDimension, 10); + } else { + $.debug('Warning: percentage unit was supplied to parsePixels() but could not be calculated because centDimension was not supplied.'); + return parseInt(input, 10); + } + + } else if (input.substr(input.length - 2) === 'em') { + // em, check for pxToEm and convert (or warn) + if (typeof Number.prototype.pxToEm !== 'undefined') { + input = parseInt(input + .substr(0, input.length - 2) // strip unit + .replace(/^\s+|\s+$/g,"") // trim + , 10); + input = input.pxToEm({ + reverse: true + }); + return input.substr(0, input.length - 2); // strip unit px; + + } else { + $.debug('Warning: em unit was supplied to parsePixels() but could not be calulated because pxToEm plugin was not found.'); + return parseInt(input, 10); + } + } else { + // unknown units, warn + $.debug('Warning: unknown unit was supplied. parsePixels() can support px, em or % units only.'); + return parseInt(input, 10); + } + }; + + +}( jQuery, ResizeEvents )); +/* end closure */ diff --git a/public/opac/js/butterfly/jquery.butterfly.min.js b/public/opac/js/butterfly/jquery.butterfly.min.js new file mode 100644 index 00000000000..991d1113309 --- /dev/null +++ b/public/opac/js/butterfly/jquery.butterfly.min.js @@ -0,0 +1,6 @@ +/** + * @author Andrew Ramsden <http://irama.org/> + * @see http://irama.org/web/dhtml/butterfly/ + * @license GNU GENERAL PUBLIC LICENSE (GPL) <http://www.gnu.org/licenses/gpl.html> + */ +jQuery.butterfly={},jQuery.butterfly.defaultOptions={contentDefaultWidth:null,contentDefaultHeight:"100%",mediaMaxWidth:"100%",mediaMaxHeight:"100%",treatAsMedia:!1,lightBoxMargin:null,animateResize:!0,animationSpeed:150,useIframe:"autodetect",collapseHeightWhenPossible:!0,reuseFragment:!1,closeButton:!0,closeButtonImage:"close.png",closeButtonCorner:"tr",clickOverlayCloses:!0,preloadLoadingImage:"",preloadGalleryControlsSprite:"",galleryControlWidth:49,galleryControlHeight:85,galleryMode:"rel",galleryContainers:"",galleryLoops:!1,captionMode:"title",preloadNextGalleryImage:!0,zoomFromClicked:!1,callbackPreOpen:null,callbackPreResize:null,callbackPostResize:null,callbackPostOpen:null,callbackPreClose:null,callbackPostClose:null,treatAsImage:!1},jQuery.butterfly.conf={overlayOpacity:".7",lightboxClass:"lightbox",lightboxLinkSelector:"a.lightbox"},jQuery.butterfly.linkCount=0,DOM_VK_END=35,DOM_VK_HOME=36,DOM_VK_LEFT=37,DOM_VK_UP=38,DOM_VK_RIGHT=39,DOM_VK_DOWN=40,DOM_VK_ESCAPE=27,function(e,t){"use strict";function i(e){return e=e||window.event,e.keyCode?e.keyCode:e.which?e.which:null}var n,a,o,l,s,r,d,c,h,b,p,u,f;e.fn.accessibleText=function(){return this.is("img")?this.attr("alt"):this.is("input")?this.attr("value"):e.map(this.contents(),function(t){if(3===t.nodeType)return t.data;if(1===t.nodeType){var i=e(t);return i.is("img, input")||i.find("img[alt], input[value]").length>0?i.accessibleText():i.text()}}).join("")},e(function(){"undefined"!=typeof t&&e(this).each(function(){t.bind("x-text-resize x-window-resize",n)}),e(document.body).append('<div id="jb-overlay"></div><div id="jb-window"><div id="jb-window-inner"><div id="jb-window-content" style="width: auto; height: auto;" tabindex="0"></div></div></div>').bind("keydown",r),e("#jb-overlay").fadeTo(0,e.butterfly.conf.overlayOpacity,function(){e(this).hide()}),e("#jb-window").hide().click(d),e("#jb-window-inner").centre(),e("#jb-window-content").css({overflow:"hidden"}).hide(),e.history.init(function(t){""===t?a.apply():/^!/.test(t)&&(t=t.substring(1),e("#"+t).trigger("click",[!1]))},{unescape:",/"})}),e.fn.butterfly=function(t){return t="undefined"!=typeof t?t:{},t.closeButtonImage&&e('<img src="'+t.closeButtonImage+'" alt="" />'),t.preloadLoadingImage&&e('<img src="'+t.preloadLoadingImage+'" alt="" />'),t.preloadGalleryControlsSprite&&e('<img src="'+t.preloadGalleryControlsSprite+'" alt="" />'),this.each(function(){o.apply(this,[t])})},o=function(t){var i="undefined"!=typeof Number.prototype.pxToEm?!0:!1;t="undefined"==typeof t?e.butterfly.defaultOptions:e.extend({},e.butterfly.defaultOptions,t),null===t.lightBoxMargin&&(t.lightBoxMargin=i?"2em":"20px"),null===t.contentDefaultWidth&&(t.contentDefaultWidth=i?"50em":"700px"),("undefined"==typeof e(this).attr("id")||""===e(this).attr("id"))&&e(this).attr("id",e.butterfly.conf.lightboxClass+"-uid-"+e.butterfly.linkCount),t.linkID=e(this).attr("id"),e.butterfly.linkCount++,e(this).data("options",t),e(this).addClass(e.butterfly.conf.lightboxClass),e(this).click(l)},l=function(t,i){var n,o,l,r,d,h,p,u,f;if("undefined"!=typeof t&&t.preventDefault(),i="undefined"!=typeof i?i:!0)return void e.history.load("!"+e(this).attr("id"));switch(e("#jb-window-inner").css("overflow","hidden"),e("#jb-overlay").is(":visible")?(n=e("#jb-overlay").data("options"),"fragment"===n.linkType&&n.reuseFragment&&e(".jb-placeholder").remove(),o=n.originalTrigger):o=this,r=window.location.href.replace(/#.*$/,""),l=e(this).attr("href"),0===l.indexOf(r)&&(l=l.substring(r.length)),d=e(this).attr("title"),h=e(this).accessibleText(),n=e(this).data("options"),n.href=l,n.title=d,n.linkText=h,n.trigger=this,n.originalTrigger=o,document.getElementById("jb-window-inner").className=n.className||"",n.treatAsImage||b(l)?n.linkType="image":"#"===l.substring(0,1)?n.linkType="fragment":n.useIframe===!0||n.useIframe!==!1&&this.hostname!==window.location.hostname?(n.linkType="iframe",n.useIframe=!0,n.contentDefaultWidth="100%",n.contentDefaultHeight="100%"):n.linkType="ajax",null!==n.callbackPreOpen&&"function"==typeof n.callbackPreOpen&&n.callbackPreOpen.apply(this),n.closeButton?0===e("#jb-close-button").length&&(e("#jb-window").prepend('<a href="#" id="jb-close-button"><img src="'+n.closeButtonImage+'" alt="Close lightbox" /></a>'),e("#jb-close-button").click(a)):e("#jb-close-button").remove(),n.clickOverlayCloses?e("#jb-window").addClass("reactive"):e("#jb-window").removeClass("reactive"),p=e(this),""!==n.galleryContainers&&(n.galleryMode="container"),n.gallerySelector="",n.galleryMode){case"all":n.gallerySelector=e.butterfly.conf.lightboxLinkSelector;break;case"container":e.each(n.galleryContainers.split(","),function(){return u=this+" "+e.butterfly.conf.lightboxLinkSelector,p.is(u)?(n.gallerySelector=u,!1):void 0})}""===n.gallerySelector&&""!==e(this).attr("rel")&&(n.gallerySelector=e.butterfly.conf.lightboxLinkSelector+'[rel="'+e(this).attr("rel")+'"]'),f=e("#jb-overlay").data("options")||{},e(this).data("options",n),e("#jb-overlay").data("options",n),e("#jb-window").append('<p id="jb-loading">Loading...</p>'),e("#jb-loading").attr("tabindex","0").focus(),e("#jb-overlay").is(":visible")?("fragment"===f.linkType&&f.reuseFragment&&(e(".jb-placeholder").after(e(f.href)),e(".jb-placeholder").remove(),e(f.href).disableFocussableElements()),e("#jb-window-content").hide().empty(),e("#jb-window").addClass("loading"),s.apply(this,[c])):(e(document.body).disableFocussableElements("#jb-window *"),e("#jb-close-button").hide(),e("#jb-gallery-controls").hide(),e("#jb-overlay").fadeIn(n.animationSpeed).centre(),e("#jb-window").addClass("loading").show(),n.zoomFromClicked?e("#jb-window-inner").css({top:e(this).offset().top,left:e(this).offset().left,width:e(this).width(),height:e(this).height()}):e("#jb-window-inner").css({width:"100px",height:"100px"}).centre(),s.apply(this,[c]))},c=function(){var t=e("#jb-overlay").data("options");e("#jb-window").restoreFocussableElements(),e("#jb-window").removeClass("loading"),setTimeout(function(){switch(e("#jb-window").removeClass("type-media type-image type-fragment type-ajax"),t.linkType){case"image":e("#jb-window").addClass("type-image type-media"),e("#jb-window-inner").css("overflow","hidden");break;case"fragment":e("#jb-window").addClass("type-fragment"),e("#jb-window-inner").css("overflow","auto");break;case"iframe":e("#jb-window").addClass("type-iframe"),e("#jb-window-inner").css("overflow","hidden");break;case"ajax":e("#jb-window").addClass("type-ajax"),e("#jb-window-inner").css("overflow","auto")}t.treatAsMedia&&e("#jb-window").addClass("type-media"),n.apply(this,[function(){var i;"iframe"===t.linkType&&e("#jb-window-content").css("visibility","visible"),e("#jb-window-content").fadeIn(t.animationSpeed,function(){e("#jb-window-content").focus(),e("#jb-loading").remove(),null!==t.callbackPostOpen&&"function"==typeof t.callbackPostOpen&&t.callbackPostOpen.apply(this),i=e("#jb-gallery-next"),t.preloadNextGalleryImage&&i.length>0&&i.is(":visible")&&"#"!==i.attr("href")&&b(i.attr("href"))&&e('<img src="'+i.attr("href")+'" alt="" />')})}])},0)},n=function(t){var i,n,a,o,l,s,r,d,c,h,b,f,w,g,y,j,m,v,k,x,C,I=e("#jb-overlay").data("options");"undefined"!=typeof I&&(i=parseInt(p(I.lightBoxMargin),10),n=e("#jb-window").width()-2*i,a=e("#jb-window").height()-2*i,o=p(I.contentDefaultWidth,n),l=p(I.contentDefaultHeight,a),s=p(I.mediaMaxWidth,n),r=p(I.mediaMaxHeight,a),null!==I.callbackPreResize&&"function"==typeof I.callbackPreResize&&I.callbackPreResize.apply(e("#jb-window"),[n,a,o,l,s,r]),"image"===I.linkType||I.treatAsMedia?(d=e("#jb-window-content").lightBoxContentWidth(),c=e("#jb-window-content").lightBoxContentHeight(),d>s&&(h=d/s,d=s,c/=h),c>r&&(h=c/r,c=r,d/=h),d>n&&(h=d/n,d=n,c*=h),c>a&&(h=c/a,c=a,d*=h)):"iframe"===I.linkType?(d=o,c=l):(d=e("#jb-window-content").lightBoxContentWidth(),d=""===o||"100%"===o||o>n?n:o,I.collapseHeightWhenPossible?(b=e("#jb-window-inner").width(),e("#jb-window-inner").animate({width:d},0),c=e("#jb-window-content").lightBoxContentHeight(!1),e("#jb-window-inner").width(b),c>a&&(c=a)):(c=e("#jb-window-content").lightBoxContentHeight(),c=""===l||"100%"===l||l>a?a:l)),f=u(d,c),w=I.animateResize?I.animationSpeed:0,e("#jb-close-button").hide(),e("#jb-gallery-controls").hide(),"iframe"===I.linkType&&e("#jb-window-inner iframe").css("visibility","hidden"),e("#jb-window-inner").animate({width:d,height:c,left:f[1],top:f[0]},w,0,function(){if(I=e("#jb-overlay").data("options"),d=e("#jb-window-inner").width(),c=e("#jb-window-inner").height(),"iframe"===I.linkType&&(e("#jb-window-inner iframe").width(d).height(c),e("#jb-window-inner iframe").css("visibility","visible")),e("#jb-close-button").length>0){switch(g=parseInt(e("#jb-close-button").width(),10),y=parseInt(e("#jb-close-button").height(),10),I.closeButtonCorner){case"tr":j=f[1]+d-g/2,m=f[0]-y/2;break;case"br":j=f[1]+d-g/2,m=f[0]+c-y/2;break;case"bl":j=f[1]-g/2,m=f[0]+c-y/2;break;default:j=f[1]-g/2,m=f[0]-y/2}e("#jb-close-button").css({position:"absolute","z-index":"999999",left:j,top:m}).show()}e("#jb-gallery-controls").is(".active")&&(v=f[0]+c/2-I.galleryControlHeight/2,k=f[1]-I.galleryControlWidth,e("#jb-gallery-prev").css({top:v,left:k}),x=f[0]+c/2-I.galleryControlHeight/2,C=f[1]+d,e("#jb-gallery-next").css({top:x,left:C}),e("#jb-gallery-controls").show()),null!==I.callbackPostResize&&"function"==typeof I.callbackPostResize&&I.callbackPostResize.apply(e("#jb-window"),[n,a,o,l,s,r]),"undefined"!=typeof t&&"undefined"!=typeof t.apply&&t.apply()}))},s=function(t){var i,n,a,o,l,s,r,d,c,b,u,w,g=e("#jb-overlay").data("options"),y=g.href;switch(g.captionMode){case"title":i=g.title?"<p class='jb-caption'><span>"+g.title+"</span></p>":"";break;case"text":i=g.linkText?"<p class='jb-caption'><span>"+g.linkText+"</span></p>":"";break;default:i=""}switch(e("#jb-window").removeClass("error-no-content"),n=e(g.gallerySelector),e("#jb-gallery-controls").removeClass("active"),n.length>1&&n.isInSet("#"+g.linkID)?(0===e("#jb-gallery-controls").length?(e("#jb-window").append('<div id="jb-gallery-controls"></div>'),a=e('<a id="jb-gallery-prev" href="#">Previous</a>').click(h),o=e('<a id="jb-gallery-next" href="#">Next</a>').click(h),e("#jb-gallery-controls").append(a).append(o),a.add(o).css({position:"absolute","z-index":"99999",display:"block",overflow:"hidden"})):(a=e("#jb-gallery-prev"),o=e("#jb-gallery-next"),a.add(o).removeClass("disabled").attr("tabindex","0").attr("title","").show()),e("#jb-gallery-controls").hide(),e("#jb-gallery-controls").addClass("active"),l=n.prevInSet("#"+g.linkID),l===!1&&(g.galleryLoops?l=n.lastInSet():(l=e('<a href="#" id=""></a>'),a.addClass("disabled").attr("tabindex","-1").hide())),a.attr("href",l.attr("href")).data("linkID",l.attr("id")).attr("title",e.trim(l.accessibleText())),s=n.nextInSet("#"+g.linkID),s===!1&&(g.galleryLoops?s=n.firstInSet():(s=e('<a href="#" id=""></a>'),o.addClass("disabled").attr("tabindex","-1").hide())),o.attr("href",s.attr("href")).data("linkID",s.attr("id")).attr("title",e.trim(s.accessibleText()))):e("#jb-gallery-controls").hide(),g.linkType){case"fragment":g.reuseFragment?(e(y).after('<span class="jb-placeholder"></span>'),e("#jb-window-content").empty().append(e(y))):e("#jb-window-content").empty().append(e(y).clone(!0)),f.apply(this,[g.linkType,y]),t.apply(this);break;case"image":e("#jb-window-content").empty().append('<img src="'+y+'" alt="" style="max-width: 100%; max-height: 100%; float: left;" />'+i),e("#jb-window-content img").error(function(){f.apply(this,[g.linkType,y,t])}).data("full-width","").data("full-height","").load(t);break;case"iframe":e("#jb-window-content").show().css("visibility","hidden"),e("#jb-window-content").empty().append('<iframe src="'+y+'" title="'+i+'" width="100%" height="1000" />'),e("#jb-window-content").css("visibility","hidden"),r=parseInt(p(g.lightBoxMargin),10),d=e("#jb-window").width()-2*r,c=e("#jb-window").height()-2*r,b=p(g.contentDefaultWidth,d),u=p(g.contentDefaultHeight,c),e("#jb-window-content > iframe").width(b).height(u).error(function(){f.apply(this,[g.linkType,y,t])}).load(t);break;default:e.ajaxSetup({cache:!0}),w=-1!==y.indexOf("#")?y.split("#").join(" #"):y,e("#jb-window-content").empty().load(w,function(){f.apply(this,[g.linkType,y]),t.apply(this)})}},f=function(t,i,n){var a,o=!1;("image"===t||0===e("#jb-window-content").children().length)&&(o=!0),o&&(a=e("#jb-overlay").data("options"),a.linkType="fragment",a.treatAsMedia=!1,e("#jb-overlay").data("options",a),e("#jb-window").removeClass("type-image type-media").addClass("type-fragment error-no-content"),e("#jb-window-content").empty().append("<p>There was an error loading lightbox content. <strong>"+e(a.trigger).text()+"</strong> (<samp>"+i+"</samp>) could not be found.</p>")),"undefined"!=typeof n&&n.apply(this)},a=function(t){var i,n,a;t&&t.preventDefault(),e("#jb-window:hidden").length||(i=e("#jb-overlay").data("options"),n=i.href,null!==i.callbackPreClose&&"function"==typeof i.callbackPreClose&&i.callbackPreClose.apply(i.trigger),"fragment"===i.linkType&&i.reuseFragment&&(e(".jb-placeholder").after(e(n)),e(".jb-placeholder").remove()),e(document.body).restoreFocussableElements(),e("#jb-overlay").fadeOut(i.animationSpeed),e("#jb-window").hide(),e("#jb-window-content").hide(),a=e(i.originalTrigger),"undefined"==typeof a.attr("tabindex")&&a.attr("tabindex",0),a.focus(),e("#jb-loading").remove(),null!==i.callbackPostClose&&"function"==typeof i.callbackPostClose&&i.callbackPostClose.apply(i.trigger),e.history.load(""))},e.fn.lightBoxContentWidth=function(){var t,i=this.closest("#jb-window"),n=e("#jb-window-inner"),a=i.hasClass("type-media")?!0:!1,o=i.hasClass("media-image")?!0:!1,l=n.width(),s=n.height(),r=n.css("left"),d=n.css("top");return n.css(e.browser.msie&&7===e.browser.version&&a&&o&&0===this.find("img").outerWidth(!0)?{width:"100%",height:"100%",left:0,top:0}:{width:"auto",height:"auto",left:0,top:0}),"none"===this.css("display")?(this.css("display","block"),t=a?this.find("img").outerWidth(!0):this.outerWidth(!0),this.css("display","none")):t=this.outerWidth(!0),n.css({left:r,top:d}),n.animate({width:l,height:s},0),t},e.fn.lightBoxContentHeight=function(t){var i,n=this.closest("#jb-window"),a=n.find("#jb-window-inner"),o=n.hasClass("type-media")?!0:!1,l=n.hasClass("media-image")?!0:!1,s=a.width(),r=a.height(),d=a.css("left"),c=a.css("top");return t="undefined"!=typeof t?t:!0,e.browser.msie&&7===e.browser.version&&o&&l&&0===this.find("img").outerWidth(!0)?(e("#jb-window-inner").height("100%"),t&&e("#jb-window-inner").width("100%").css({left:0,top:0})):(e("#jb-window-inner").height("auto"),t&&e("#jb-window-inner").width("auto").css({left:0,top:0})),"none"===this.css("display")?(this.css("display","block"),i=this.outerHeight(!0),this.css("display","none")):i=e(this).outerHeight(!0),e("#jb-window-inner").width(s).height(r).css({left:d,top:c}),i},d=function(t){var i=e("#jb-overlay").data("options");t.target===e("#jb-window").get(0)&&i.clickOverlayCloses&&a.apply()},r=function(t){var n;if(!e("#jb-overlay").is(":visible")||t.ctrlKey||t.altKey||t.shiftKey||t.metaKey)return!0;switch(n=i(t)){case DOM_VK_UP:case DOM_VK_LEFT:e("#jb-gallery-prev").click();break;case DOM_VK_DOWN:case DOM_VK_RIGHT:e("#jb-gallery-next").click();break;case DOM_VK_HOME:e(e("#jb-overlay").data("options").gallerySelector).firstInSet().click();break;case DOM_VK_END:e(e("#jb-overlay").data("options").gallerySelector).lastInSet().click();break;case DOM_VK_ESCAPE:a.apply();break;default:return!0}t.preventDefault()},h=function(t){var i,n=e(this);return t.preventDefault(),""!==n.data("linkID")?(e("#jb-gallery-controls").hide(),i=e("#"+n.data("linkID")),i.click()):void 0},e.fn.centre=function(){return this.css({position:"fixed",top:(e(window).height()-this.outerHeight())/2+"px",left:(e(window).width()-this.outerWidth())/2+"px"})},u=function(t,i){var n=(e(window).height()-i)/2,a=(e(window).width()-t)/2;return[n,a]},e.fn.isInSet=function(t){return-1!==this.index(e(t))},e.fn.nextInSet=function(t){var i=this.index(e(t));return this.length>i+1?this.eq(i+1):!1},e.fn.prevInSet=function(t){var i=this.index(e(t));return i>0?this.eq(i-1):!1},e.fn.firstInSet=function(){return this.length>0?this.eq(0):!1},e.fn.lastInSet=function(){return this.length>0?this.eq(-1):!1},b=function(e){if("undefined"==typeof e||""===e)return!1;var t=String(e).lastIndexOf(".");return-1===t?!1:/^\.(jpg|png|gif|bmp|jpeg)$/i.test(e.substring(t))},e.fn.disableFocussableElements=function(t){t=t||"";var i=this.find("a, input, button, area, frame, iframe, [tabindex]").not(t).not('*[tabindex="-1"]');i.each(function(){var t=e(this),i=t.attr("tabindex");i="undefined"==typeof i||""===i?"":i,t.data("prevTabIndex",i).addClass("jb-unfocussed").attr("tabindex","-1")})},e.fn.restoreFocussableElements=function(){var t=this.find(".jb-unfocussed");t.each(function(){var t=e(this),i=t.data("prevTabIndex");switch(i){case"":t.removeAttr("tabindex");break;default:t.attr("tabindex",i)}t.removeClass("jb-unfocussed")})},p=function(t,i){return i="undefined"!=typeof i?i:e(document.body).width(),t=t.replace("px","").replace(/^\s+|\s+$/g,""),isNaN(t)?"%"===t.substr(t.length-1)?"undefined"!=typeof i?(t=parseInt(t.substr(0,t.length-1).replace(/^\s+|\s+$/g,""),10),t/100*parseInt(i,10)):(e.debug("Warning: percentage unit was supplied to parsePixels() but could not be calculated because centDimension was not supplied."),parseInt(t,10)):"em"===t.substr(t.length-2)?"undefined"!=typeof Number.prototype.pxToEm?(t=parseInt(t.substr(0,t.length-2).replace(/^\s+|\s+$/g,""),10),t=t.pxToEm({reverse:!0}),t.substr(0,t.length-2)):(e.debug("Warning: em unit was supplied to parsePixels() but could not be calulated because pxToEm plugin was not found."),parseInt(t,10)):(e.debug("Warning: unknown unit was supplied. parsePixels() can support px, em or % units only."),parseInt(t,10)):parseInt(t,10)}}(jQuery,ResizeEvents); diff --git a/public/opac/js/butterfly/jquery.history.js b/public/opac/js/butterfly/jquery.history.js new file mode 100644 index 00000000000..7f91079d4a9 --- /dev/null +++ b/public/opac/js/butterfly/jquery.history.js @@ -0,0 +1,194 @@ +/* + * jQuery history plugin + * + * The MIT License + * + * Copyright (c) 2006-2009 Taku Sano (Mikage Sawatari) + * Copyright (c) 2010 Takayuki Miwa + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +(function($) { + var locationWrapper = { + put: function(hash, win) { + (win || window).location.hash = this.encoder(hash); + }, + get: function(win) { + var hash = ((win || window).location.hash).replace(/^#/, ''); + try { + return $.browser.mozilla ? hash : decodeURIComponent(hash); + } + catch (error) { + return hash; + } + }, + encoder: encodeURIComponent + }; + + var iframeWrapper = { + id: "__jQuery_history", + init: function() { + var html = '<iframe id="'+ this.id +'" style="display:none" src="javascript:false;" />'; + $("body").prepend(html); + return this; + }, + _document: function() { + return $("#"+ this.id)[0].contentWindow.document; + }, + put: function(hash) { + var doc = this._document(); + doc.open(); + doc.close(); + locationWrapper.put(hash, doc); + }, + get: function() { + return locationWrapper.get(this._document()); + } + }; + + function initObjects(options) { + options = $.extend({ + unescape: false + }, options || {}); + + locationWrapper.encoder = encoder(options.unescape); + + function encoder(unescape_) { + if(unescape_ === true) { + return function(hash){ return hash; }; + } + if(typeof unescape_ == "string" && + (unescape_ = partialDecoder(unescape_.split(""))) + || typeof unescape_ == "function") { + return function(hash) { return unescape_(encodeURIComponent(hash)); }; + } + return encodeURIComponent; + } + + function partialDecoder(chars) { + var re = new RegExp($.map(chars, encodeURIComponent).join("|"), "ig"); + return function(enc) { return enc.replace(re, decodeURIComponent); }; + } + } + + var implementations = {}; + + implementations.base = { + callback: undefined, + type: undefined, + + check: function() {}, + load: function(hash) {}, + init: function(callback, options) { + initObjects(options); + self.callback = callback; + self._options = options; + self._init(); + }, + + _init: function() {}, + _options: {} + }; + + implementations.timer = { + _appState: undefined, + _init: function() { + var current_hash = locationWrapper.get(); + self._appState = current_hash; + self.callback(current_hash); + setInterval(self.check, 100); + }, + check: function() { + var current_hash = locationWrapper.get(); + if(current_hash != self._appState) { + self._appState = current_hash; + self.callback(current_hash); + } + }, + load: function(hash) { + if(hash != self._appState) { + locationWrapper.put(hash); + self._appState = hash; + self.callback(hash); + } + } + }; + + implementations.iframeTimer = { + _appState: undefined, + _init: function() { + var current_hash = locationWrapper.get(); + self._appState = current_hash; + iframeWrapper.init().put(current_hash); + self.callback(current_hash); + setInterval(self.check, 100); + }, + check: function() { + var iframe_hash = iframeWrapper.get(), + location_hash = locationWrapper.get(); + + if (location_hash != iframe_hash) { + if (location_hash == self._appState) { // user used Back or Forward button + self._appState = iframe_hash; + locationWrapper.put(iframe_hash); + self.callback(iframe_hash); + } else { // user loaded new bookmark + self._appState = location_hash; + iframeWrapper.put(location_hash); + self.callback(location_hash); + } + } + }, + load: function(hash) { + if(hash != self._appState) { + locationWrapper.put(hash); + iframeWrapper.put(hash); + self._appState = hash; + self.callback(hash); + } + } + }; + + implementations.hashchangeEvent = { + _init: function() { + self.callback(locationWrapper.get()); + $(window).bind('hashchange', self.check); + }, + check: function() { + self.callback(locationWrapper.get()); + }, + load: function(hash) { + locationWrapper.put(hash); + } + }; + + var self = $.extend({}, implementations.base); + + if($.browser.msie && ($.browser.version < 8 || document.documentMode < 8)) { + self.type = 'iframeTimer'; + } else if("onhashchange" in window) { + self.type = 'hashchangeEvent'; + } else { + self.type = 'timer'; + } + + $.extend(self, implementations[self.type]); + $.history = self; +})(jQuery); diff --git a/public/opac/js/butterfly/jquery.pxToEm.js b/public/opac/js/butterfly/jquery.pxToEm.js new file mode 100644 index 00000000000..50bb9f41144 --- /dev/null +++ b/public/opac/js/butterfly/jquery.pxToEm.js @@ -0,0 +1,56 @@ +/*-------------------------------------------------------------------- + * javascript method: "pxToEm" + * by: + Scott Jehl (scott@filamentgroup.com) + Maggie Wachs (maggie@filamentgroup.com) + http://www.filamentgroup.com + * + * Copyright (c) 2008 Filament Group + * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses. + * + * Description: Extends the native Number and String objects with pxToEm method. pxToEm converts a pixel value to ems depending on inherited font size. + * Article: http://www.filamentgroup.com/lab/retaining_scalable_interfaces_with_pixel_to_em_conversion/ + * Demo: http://www.filamentgroup.com/examples/pxToEm/ + * + * Options: + scope: string or jQuery selector for font-size scoping + reverse: Boolean, true reverses the conversion to em-px + * Dependencies: jQuery library + * Usage Example: myPixelValue.pxToEm(); or myPixelValue.pxToEm({'scope':'#navigation', reverse: true}); + * + * Version: 2.0, 08.01.2008 + * Changelog: + * 08.02.2007 initial Version 1.0 + * 08.01.2008 - fixed font-size calculation for IE +--------------------------------------------------------------------*/ + +Number.prototype.pxToEm = String.prototype.pxToEm = function(settings){ + //set defaults + settings = jQuery.extend({ + scope: 'body', + reverse: false + }, settings); + + var pxVal = (this == '') ? 0 : parseFloat(this); + var scopeVal; + var getWindowWidth = function(){ + var de = document.documentElement; + return self.innerWidth || (de && de.clientWidth) || document.body.clientWidth; + }; + + /* When a percentage-based font-size is set on the body, IE returns that percent of the window width as the font-size. + For example, if the body font-size is 62.5% and the window width is 1000px, IE will return 625px as the font-size. + When this happens, we calculate the correct body font-size (%) and multiply it by 16 (the standard browser font size) + to get an accurate em value. */ + + if (settings.scope == 'body' && jQuery.browser.msie && (parseFloat(jQuery('body').css('font-size')) / getWindowWidth()).toFixed(1) > 0.0) { + var calcFontSize = function(){ + return (parseFloat(jQuery('body').css('font-size'))/getWindowWidth()).toFixed(3) * 16; + }; + scopeVal = calcFontSize(); + } + else { scopeVal = parseFloat(jQuery(settings.scope).css("font-size")); }; + + var result = (settings.reverse == true) ? (pxVal * scopeVal).toFixed(2) + 'px' : (pxVal / scopeVal).toFixed(2) + 'em'; + return result; +}; \ No newline at end of file diff --git a/public/opac/js/butterfly/jquery.resize-events.js b/public/opac/js/butterfly/jquery.resize-events.js new file mode 100644 index 00000000000..2c9cae82a20 --- /dev/null +++ b/public/opac/js/butterfly/jquery.resize-events.js @@ -0,0 +1,173 @@ +/** + * Resize Events + * @version 0.7 + * Changelog: + * * 0.5 Added API bind() function to make it easier to add listeners. + * * 0.6 Added support for window height changes + * * 0.7 Clean up outstanding bugs (duplicate event firing) and refactor. + * + * There is no standard event for when a user resizes the text in their browser. + * There is also no consistency between browser implementations of the window resize event + * (some trigger as the window is resized, some only trigger as the user drops the resize handle). + * This extension polls to detect these changes, and reports them immediately as custom events + * ('x-text-resize' and 'x-window-resize') that other code can listen for and react to accordingly. + * Resize Events also send an 'x-initial-size' event on load. + * + * The custom events triggered are sent with emPixels, textHeight and windowWidth variables. + * emPixels is a unit that estimates much space you have to work with but is resolution, text size + * and zoom level independant. Use this value to base layout decisions on, and the layout will + * always fit. + * + * This extension is based on the 'text resize' events work of Lawrence Carvalho <http://www.alistapart.com/articles/fontresizing/>. + * + * @author Lawrence Carvalho <carvalho@uk.yahoo-inc.com> + * @author Andrew Ramsden <http://irama.org/> + * + * @see http://irama.org/web/dhtml/resize-events/ + * @license GNU GENERAL PUBLIC LICENSE (GPL) <http://www.gnu.org/licenses/gpl.html> + * @requires jQuery (tested with 1.4.2) <http://jquery.com/> + */ +var ResizeEvents = { + baseTextHeight : null, + currentTextHeight : null, + baseWindowWidth : null, + baseWindowHeight : null, + currentWindowWidth : null, + currentWindowHeight : null, + initialised : false, + intervalReference : null, + textSizeTestElement : null, + eventElement : jQuery(document), + conf : { + textResizeEvent : 'x-text-resize', + windowResizeEvent : 'x-window-resize', + windowWidthResizeEvent : 'x-window-width-resize', + windowHeightResizeEvent : 'x-window-height-resize', + initialResizeEvent : 'x-initial-sizes', + pollFrequency : 500, + textSizeTestElId : 'text-resize' + } +}; + + // start closure (protects variables from global scope) +(function($){ + + + /** + * A simple way to add a listener for resize events. + * + * @param String events A space delimited list of events that should trigger this handler. + * @param function handler The handler function to be called when an event occurs. + */ + ResizeEvents.bind = function (events, handler) { + + // on DOMReady + $(function(){ + // initialise if it hasn't happened already + if (ResizeEvents.initialised !== true) { + ResizeEvents.initialise(); + } + }); + + ResizeEvents.eventElement.bind( + events, + handler + ); + }; + + /** + * Initialisation + */ + ResizeEvents.initialise = function () { + + if (ResizeEvents.initialised === true) { + return; // already initialised + } + + // create text resize control element, and push it offscreen + ResizeEvents.textSizeTestElement = $( + '<span id="'+ResizeEvents.conf.textSizeTestElId+'" style="position: absolute; left: -9999px; '+ + 'font-size: 100%; font-family: Courier New, mono; margin: 0; padding: 0;"> </span>' + ).get(0); + + // append control element + $('body').append(ResizeEvents.textSizeTestElement); + + // initialise variables + windowWidthNow = $(window).width(); + windowHeightNow = $(window).height(); + textHeightNow = getTextHeight(); + ResizeEvents.baseTextHeight = textHeightNow; + ResizeEvents.currentTextHeight = textHeightNow; + ResizeEvents.baseWindowWidth = windowWidthNow; + ResizeEvents.currentWindowWidth = windowWidthNow; + ResizeEvents.baseWindowHeight = windowHeightNow; + ResizeEvents.currentWindowHeight = windowHeightNow; + + // start polling + if (ResizeEvents.intervalReference == null) { + ResizeEventsPoll(); + ResizeEvents.intervalReference = window.setInterval('ResizeEventsPoll()', ResizeEvents.conf.pollFrequency); + } + + // trigger onload + ResizeEvents.eventElement.trigger(ResizeEvents.conf.initialResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]); + + // flag initialisation complete + ResizeEvents.initialised = true; + + + }; + + /** + * This function is called a number of times each second to check if text size + * or window size has changed + */ + ResizeEventsPoll = function () { + + // get current values + windowWidthNow = $(window).width(); + windowHeightNow = $(window).height(); + textHeightNow = getTextHeight(); + emPixelNow = windowWidthNow/textHeightNow; + widthChanged = false; + + // test for window width change + if (ResizeEvents.currentWindowWidth != windowWidthNow) { + // Send custom event + ResizeEvents.eventElement.trigger(ResizeEvents.conf.windowWidthResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]); + ResizeEvents.eventElement.trigger(ResizeEvents.conf.windowResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]); + // update current height + ResizeEvents.currentWindowWidth = windowWidthNow; + widthChanged = true; + } + + // test for window height change + if (ResizeEvents.currentWindowHeight != windowHeightNow) { + // Send custom event + ResizeEvents.eventElement.trigger(ResizeEvents.conf.windowHeightResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]); + if (!widthChanged) { // don't send window-resize event twice + ResizeEvents.eventElement.trigger(ResizeEvents.conf.windowResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]); + } + // update current height + ResizeEvents.currentWindowHeight = windowHeightNow; + } + + + // test for text size change + if (ResizeEvents.currentTextHeight != textHeightNow) { + // Send custom event (with new text size) + ResizeEvents.eventElement.trigger(ResizeEvents.conf.textResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]); + // update current height + ResizeEvents.currentTextHeight = textHeightNow; + } + }; + + /** + * @return The current text height in pixels + */ + getTextHeight = function () { + return ResizeEvents.textSizeTestElement.offsetHeight+''; + }; + +})(jQuery); /* end closure */ \ No newline at end of file diff --git a/public/opac/js/butterfly/loading-black-on-white.gif b/public/opac/js/butterfly/loading-black-on-white.gif new file mode 100644 index 0000000000000000000000000000000000000000..b50e9f9bb214b0ce18d12110a9f9bda61a9ad46e GIT binary patch literal 5559 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 MLTsGI1&USw33@~)(f|Me literal 0 HcmV?d00001 diff --git a/public/opac/js/butterfly/reactive-overlay.png b/public/opac/js/butterfly/reactive-overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..0b89c400208e949e869970cbb6152c2f657c3283 GIT binary patch literal 962 zcmV;z13mnSP)<h;3K|Lk000e1NJLTq001`t001@!1^@s6V}}9b0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#WJyFpRCwC#na^($Q4q%$Xpodzpom%! z6e}u;J*lV01L0sKT)fqzcTD&Tdf>_*z!5`gjU38>9=tT1xS-fTDx~VA#fnuF3rdkv z=nOuR4S@pPef)TKk_pQ$n|+_WneWUj67HWp1ebG+nUs7UaSYmj0e8qU+}|^}F@-Cg z!Hp^0Z`R>ztish;+&wAp_y@~yd72MeT3WgtjYb!JKHvRb@3GlzYP=^L4nI;T6q0_Q zDdQbumoi5S4xkpzX7e4ed9c#z>grB6us|U2Ot079Fquqqxm+$CkH_~<yK`mm0xh^N zV9jHP!|`}|dHF#%Fr`wdX)LT<E^KUU<b{MK+BaHoPNy@pwYBxG8(=#yx7+QD#bQOF zaJ#hNV3BoL_=|Kp{k9WeC$L~JxObXo%38i-k7=MaxK^uGZe?X<6QHy@olcMEEEbCu zb1<LJ7sLcZYo|ar!Ee!2PE@}2_4OxKtMy*<T%}Se$>s7%vB27eB^s(&ohBTHsNHUV z$q!Mn!8*aAYVL8A4FNqK&ua+P3jaK);u|r*+T|R_n-Z?lghTQ0`~5Bm(JB6UqtST1 zmpUi}4tH+`TuBS8RXj48%m<A|bBQl9LII^GT>CgEFwC)qg@xykgRx!<y-+x8q<;<q z40DW#%quYgrCqM42LaZiqM`xHx?Dd1$Aq623b(el_Ef9Y8oJ3nDfI6FN&|)7(9FSX zHoKWfB#L7099oJK;k{-Ntk*i$x`P0Gm`o=3`+a7wGtxEic_DBrl}hGvx#m)-R6Z06 zeeboC@p`>?K{Y=`B9ULT;P7`C_o{K4#ASW_7S;1gpZAOnT!nNldKTdtx`3$wu4WMq z4aMLx_&FBg>SSub8Z^NgT%+`m_brA|78oH5tMC+5${JjAG}<Q$Dq#%{?GKqAW=CxY z#mbihl7q9OBr;-(0lpT@g5xwTXAO=c)59(qk(8{#p&b!G{Lk;gFolL@jY5&hfnOX} z9?~wrC^Vl*tEOTNt{J9Z$u6n~*^>^kb;4cTA)+%gh?+Qzz7YRJ+$Ih9G|e>(tLd$g zFx@6ixQfPFMx`H|ApI#e;ab+<_=c0diHuWItikb3N$RAQxSS=pRzm^8*YW4UCkgx% kD{v=4OL)hPGIK1z0KEN??=fJuM*si-07*qoM6N<$g7P%D00000 literal 0 HcmV?d00001 diff --git a/public/opac/js/butterfly/reactive-overlay.psd b/public/opac/js/butterfly/reactive-overlay.psd new file mode 100644 index 0000000000000000000000000000000000000000..1d574af2f46064a4c617a7f4945904b32cfcbd36 GIT binary patch literal 162454 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 literal 0 HcmV?d00001 -- GitLab