From 33cd24cfb1d2e986126cc3f2fad07eae50ccebdd Mon Sep 17 00:00:00 2001 From: Steve Sutton Date: Thu, 16 Nov 2017 10:34:17 -0500 Subject: [PATCH] Add smartbanner to site. Adding to pages Home, About, and Essentials --- assets/smartbanner/smartbanner.css | 76 +++++ assets/smartbanner/smartbanner.js | 531 +++++++++++++++++++++++++++++ assets/smartbanner/smartbanner.png | Bin 0 -> 7664 bytes parts/header-meta.php | 11 + 4 files changed, 618 insertions(+) create mode 100644 assets/smartbanner/smartbanner.css create mode 100644 assets/smartbanner/smartbanner.js create mode 100644 assets/smartbanner/smartbanner.png diff --git a/assets/smartbanner/smartbanner.css b/assets/smartbanner/smartbanner.css new file mode 100644 index 0000000..1378f23 --- /dev/null +++ b/assets/smartbanner/smartbanner.css @@ -0,0 +1,76 @@ +/*! + * smartbanner.js v1.5.0 + * Copyright © 2017 Ain Tohvri, contributors. Licensed under GPL-3.0. + */ +.smartbanner { + position: absolute; + top: 0; + left: 0; + overflow-x: hidden; + width: 100%; + height: 84px; + background: #f3f3f3; + font-family: Helvetica, sans, sans-serif; } + .smartbanner__exit { + position: absolute; + top: calc(50% - 6px); + left: 9px; + display: block; + margin: 0; + width: 12px; + height: 12px; + border: 0; + text-align: center; } + .smartbanner__exit::before, .smartbanner__exit::after { + position: absolute; + width: 1px; + height: 12px; + background: #767676; + content: ' '; } + .smartbanner__exit::before { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); } + .smartbanner__exit::after { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); } + .smartbanner__icon { + position: absolute; + top: 10px; + left: 30px; + width: 64px; + height: 64px; + border-radius: 15px; + background-size: 64px 64px; } + .smartbanner__info { + position: absolute; + top: 10px; + left: 104px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + overflow-y: hidden; + width: 60%; + height: 64px; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + .smartbanner__info__title { + font-size: 14px; } + .smartbanner__info__author, .smartbanner__info__price { + font-size: 12px; } + .smartbanner__button { + position: absolute; + top: 32px; + right: 10px; + z-index: 1; + display: block; + padding: 0 10px; + min-width: 10%; + border-radius: 5px; + background: #f3f3f3; + color: #1474fc; + font-size: 18px; + text-align: center; + text-decoration: none; } + .smartbanner__button__label { + text-align: center; } diff --git a/assets/smartbanner/smartbanner.js b/assets/smartbanner/smartbanner.js new file mode 100644 index 0000000..d495cc1 --- /dev/null +++ b/assets/smartbanner/smartbanner.js @@ -0,0 +1,531 @@ +/*! + * smartbanner.js v1.5.0 + * Copyright © 2017 Ain Tohvri, contributors. Licensed under GPL-3.0. + */ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0; +} + +function convertToCamelCase(name) { + var parts = name.split('-'); + parts.map(function (part, index) { + if (index > 0) { + parts[index] = part.charAt(0).toUpperCase() + part.substring(1); + } + }); + return parts.join(''); +} + +var OptionParser = function () { + function OptionParser() { + _classCallCheck(this, OptionParser); + } + + _createClass(OptionParser, [{ + key: 'parse', + value: function parse() { + var metas = document.getElementsByTagName('meta'); + var options = {}; + var optionName = null; + Array.from(metas).forEach(function (meta) { + var name = meta.getAttribute('name'); + var content = meta.getAttribute('content'); + if (name && content && valid(name) && content.length > 0) { + optionName = name.split(':')[1]; + if (Array.from(optionName).includes('-')) { + optionName = convertToCamelCase(optionName); + } + options[optionName] = content; + } + }); + return options; + } + }]); + + return OptionParser; +}(); + +exports.default = OptionParser; + +},{"./polyfills/array/from.js":5,"./polyfills/array/includes.js":6}],5:[function(require,module,exports){ +'use strict'; + +// Production steps of ECMA-262, Edition 6, 22.1.2.1 +// Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from +if (!Array.from) { + Array.from = function () { + var toStr = Object.prototype.toString; + var isCallable = function isCallable(fn) { + return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; + }; + var toInteger = function toInteger(value) { + var number = Number(value); + if (isNaN(number)) { + return 0; + } + if (number === 0 || !isFinite(number)) { + return number; + } + return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); + }; + var maxSafeInteger = Math.pow(2, 53) - 1; + var toLength = function toLength(value) { + var len = toInteger(value); + return Math.min(Math.max(len, 0), maxSafeInteger); + }; + + // The length property of the from method is 1. + return function from(arrayLike /*, mapFn, thisArg */) { + // 1. Let C be the this value. + var C = this; + + // 2. Let items be ToObject(arrayLike). + var items = Object(arrayLike); + + // 3. ReturnIfAbrupt(items). + if (arrayLike == null) { + throw new TypeError("Array.from requires an array-like object - not null or undefined"); + } + + // 4. If mapfn is undefined, then let mapping be false. + var mapFn = arguments.length > 1 ? arguments[1] : void undefined; + var T; + if (typeof mapFn !== 'undefined') { + // 5. else + // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. + if (!isCallable(mapFn)) { + throw new TypeError('Array.from: when provided, the second argument must be a function'); + } + + // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. + if (arguments.length > 2) { + T = arguments[2]; + } + } + + // 10. Let lenValue be Get(items, "length"). + // 11. Let len be ToLength(lenValue). + var len = toLength(items.length); + + // 13. If IsConstructor(C) is true, then + // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len. + // 14. a. Else, Let A be ArrayCreate(len). + var A = isCallable(C) ? Object(new C(len)) : new Array(len); + + // 16. Let k be 0. + var k = 0; + // 17. Repeat, while k < len… (also steps a - h) + var kValue; + while (k < len) { + kValue = items[k]; + if (mapFn) { + A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); + } else { + A[k] = kValue; + } + k += 1; + } + // 18. Let putStatus be Put(A, "length", len, true). + A.length = len; + // 20. Return A. + return A; + }; + }(); +} + +},{}],6:[function(require,module,exports){ +'use strict'; + +if (!Array.prototype.includes) { + Array.prototype.includes = function (searchElement /*, fromIndex*/) { + 'use strict'; + + if (this == null) { + throw new TypeError('Array.prototype.includes called on null or undefined'); + } + + var O = Object(this); + var len = parseInt(O.length, 10) || 0; + if (len === 0) { + return false; + } + var n = parseInt(arguments[1], 10) || 0; + var k; + if (n >= 0) { + k = n; + } else { + k = len + n; + if (k < 0) { + k = 0; + } + } + var currentElement; + while (k < len) { + currentElement = O[k]; + if (searchElement === currentElement || searchElement !== searchElement && currentElement !== currentElement) { + // NaN !== NaN + return true; + } + k++; + } + return false; + }; +} + +},{}],7:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _optionparser = require('./optionparser.js'); + +var _optionparser2 = _interopRequireDefault(_optionparser); + +var _detector = require('./detector.js'); + +var _detector2 = _interopRequireDefault(_detector); + +var _bakery = require('./bakery.js'); + +var _bakery2 = _interopRequireDefault(_bakery); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var DEFAULT_PLATFORMS = 'android,ios'; + +var datas = { + originalTop: 'data-smartbanner-original-top', + originalMarginTop: 'data-smartbanner-original-margin-top' +}; + +function handleExitClick(event, self) { + self.exit(); + event.preventDefault(); +} + +function handleJQueryMobilePageLoad(event) { + if (!this.positioningDisabled) { + setContentPosition(event.data.height); + } +} + +function addEventListeners(self) { + var closeIcon = document.querySelector('.js_smartbanner__exit'); + closeIcon.addEventListener('click', function (event) { + return handleExitClick(event, self); + }); + if (_detector2.default.jQueryMobilePage()) { + $(document).on('pagebeforeshow', self, handleJQueryMobilePageLoad); + } +} + +function removeEventListeners() { + if (_detector2.default.jQueryMobilePage()) { + $(document).off('pagebeforeshow', handleJQueryMobilePageLoad); + } +} + +function setContentPosition(value) { + var wrappers = _detector2.default.wrapperElement(); + for (var i = 0, l = wrappers.length, wrapper; i < l; i++) { + wrapper = wrappers[i]; + if (_detector2.default.jQueryMobilePage()) { + if (wrapper.getAttribute(datas.originalTop)) { + continue; + } + var top = parseFloat(getComputedStyle(wrapper).top); + wrapper.setAttribute(datas.originalTop, isNaN(top) ? 0 : top); + wrapper.style.top = value + 'px'; + } else { + if (wrapper.getAttribute(datas.originalMarginTop)) { + continue; + } + var margin = parseFloat(getComputedStyle(wrapper).marginTop); + wrapper.setAttribute(datas.originalMarginTop, isNaN(margin) ? 0 : margin); + wrapper.style.marginTop = value + 'px'; + } + } +} + +function restoreContentPosition() { + var wrappers = _detector2.default.wrapperElement(); + for (var i = 0, l = wrappers.length, wrapper; i < l; i++) { + wrapper = wrappers[i]; + if (_detector2.default.jQueryMobilePage() && wrapper.getAttribute(datas.originalTop)) { + wrapper.style.top = wrapper.getAttribute(datas.originalTop) + 'px'; + } else if (wrapper.getAttribute(datas.originalMarginTop)) { + wrapper.style.marginTop = wrapper.getAttribute(datas.originalMarginTop) + 'px'; + } + } +} + +var SmartBanner = function () { + function SmartBanner() { + _classCallCheck(this, SmartBanner); + + var parser = new _optionparser2.default(); + this.options = parser.parse(); + this.platform = _detector2.default.platform(); + } + + // DEPRECATED. Will be removed. + + + _createClass(SmartBanner, [{ + key: 'publish', + value: function publish() { + if (Object.keys(this.options).length === 0) { + throw new Error('No options detected. Please consult documentation.'); + } + + if (_bakery2.default.baked) { + return false; + } + + // User Agent was explicetely excluded by defined excludeUserAgentRegex + if (this.userAgentExcluded) { + return false; + } + + // User agent was neither included by platformEnabled, + // nor by defined includeUserAgentRegex + if (!(this.platformEnabled || this.userAgentIncluded)) { + return false; + } + + var bannerDiv = document.createElement('div'); + document.querySelector('body').appendChild(bannerDiv); + bannerDiv.outerHTML = this.html; + if (!this.positioningDisabled) { + setContentPosition(this.height); + } + addEventListeners(this); + } + }, { + key: 'exit', + value: function exit() { + removeEventListeners(); + if (!this.positioningDisabled) { + restoreContentPosition(); + } + var banner = document.querySelector('.js_smartbanner'); + document.querySelector('body').removeChild(banner); + _bakery2.default.bake(); + } + }, { + key: 'originalTop', + get: function get() { + var wrapper = _detector2.default.wrapperElement()[0]; + return parseFloat(wrapper.getAttribute(datas.originalTop)); + } + + // DEPRECATED. Will be removed. + + }, { + key: 'originalTopMargin', + get: function get() { + var wrapper = _detector2.default.wrapperElement()[0]; + return parseFloat(wrapper.getAttribute(datas.originalMarginTop)); + } + }, { + key: 'priceSuffix', + get: function get() { + if (this.platform === 'ios') { + return this.options.priceSuffixApple; + } else if (this.platform === 'android') { + return this.options.priceSuffixGoogle; + } + return ''; + } + }, { + key: 'icon', + get: function get() { + if (this.platform === 'android') { + return this.options.iconGoogle; + } else { + return this.options.iconApple; + } + } + }, { + key: 'buttonUrl', + get: function get() { + if (this.platform === 'android') { + return this.options.buttonUrlGoogle; + } else if (this.platform === 'ios') { + return this.options.buttonUrlApple; + } + return '#'; + } + }, { + key: 'html', + get: function get() { + return '
\n \n
\n
\n
\n
' + this.options.title + '
\n
' + this.options.author + '
\n
' + this.options.price + this.priceSuffix + '
\n
\n
\n ' + this.options.button + '\n
'; + } + }, { + key: 'height', + get: function get() { + var height = document.querySelector('.js_smartbanner').offsetHeight; + return height !== undefined ? height : 0; + } + }, { + key: 'platformEnabled', + get: function get() { + var enabledPlatforms = this.options.enabledPlatforms || DEFAULT_PLATFORMS; + return enabledPlatforms && enabledPlatforms.replace(/\s+/g, '').split(',').indexOf(this.platform) !== -1; + } + }, { + key: 'positioningDisabled', + get: function get() { + return this.options.disablePositioning === 'true'; + } + }, { + key: 'userAgentExcluded', + get: function get() { + if (!this.options.excludeUserAgentRegex) { + return false; + } + return _detector2.default.userAgentMatchesRegex(this.options.excludeUserAgentRegex); + } + }, { + key: 'userAgentIncluded', + get: function get() { + if (!this.options.includeUserAgentRegex) { + return false; + } + return _detector2.default.userAgentMatchesRegex(this.options.includeUserAgentRegex); + } + }]); + + return SmartBanner; +}(); + +exports.default = SmartBanner; + +},{"./bakery.js":1,"./detector.js":2,"./optionparser.js":4}]},{},[3]); diff --git a/assets/smartbanner/smartbanner.png b/assets/smartbanner/smartbanner.png new file mode 100644 index 0000000000000000000000000000000000000000..cabccd0e7766452e212facae8dd07f7edb2a460c GIT binary patch literal 7664 zcmV002t}1^@s6I8J)%00004XF*Lt006O% z3;baP0000WV@Og>004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x9cf8KK~#9!?VQ<82;zqTe(+P?^IzmIF!B;Oh!GpkfXESIShguz1I3V1D6&bhyV*l^*Ic*i z&i71v?>w9mBO{2}EjC35;Ceat;ohoqzP;Ao-&*TiN0yu4aC~kLWa_iNf&ZWEbFd!5 zJ_qX|>~pXl!afJToO`Ud`niPRV1BR=E)?l7Cr1}qWeAkIOnLcoaNCm)4c6*JlBhyE%Y5W0jl=iAXgJP=BoxvW#qviURnlbIS|vPviSWWx#OJRN^arRQIEmX& z7dZJ;(;X4Y`GWDyn~Z+&2Kmjm@$+q>W=7Jtgt6ea1s%f9J%=9(i>X6-LZ=TO-f(of zaOtW*4rXpKIh0FbF^jRu8Pu6yAbIi?lCu}lQT(ZT+Na}LBAB9J^ucuwzWplYt+#0C zLr$+4+Gl`NP^m&R=!Rl8b{GX4=V7>`n2ex(RybQZ(2iiB5aTeJMgp)UM8gcTxX%3E zhfMFh#`63tG@kz&@#)Km?|&+weF|U++2N4gZ~Y~+*Z+(LyQ~f@%{7QuK(8sBFW4MV zj%?^XEGWI3d(FkjSnCO)KXL3`jr!3)4y@OlcJSP(^8LUFiDHvCiaSARhD_&+9o z=BxP4E{{4aA01c%uCk1-U+3V@{tJ5RO-}VQ8mr(Xp#1u4cJ3eqX8;^72a`eMI~GIm z0thr5-FB372-;ANK!xC{`gh_iN`WMT_=49Kg1%$9b)WLXf6rv^2F;g$8~@ZLL>?WL zd^CHO2qrHWzVSMvZ~ieIZqwOtL<3L>m;$h%HK3r(Au~c*I-C(q1=d1d!gOALjzU2> zz<|P`HH0zvA*3r1^#!jb5C~|&mJYLY*pX#^4~%yi|ApTnyz(-leIA9EeR9tdp;|0C z_|`X>zxF2#(gV6@K(|0Qz$qZFiDof^*$5^xq4b2HCj?Ew>j-HR{8AAb@O{Xag6BCf zj$+}+7mm?^BRhupu4DC-qrKsXI-pt_@xe<3CyIu46bCoR-ukx`lPQfCzJ?0IPYl>6 z^DGg}a>>!F-yr|)pU`cOX`QWsavJ1>KNd4s915eMPy`Te2;B>{hYaue%tsn$gnTI| zI~G+qIz8yFL)3(zTc500C`T4EavbmW@t^-4 z8n68NCkE^jd6q2-#^3!W_Vxcnzd0sd1)YEsz<{k_IfBD2p$ru1lR}azX2(8dY0!Sf z{8&?!f>sUzwC8B_D_X0DsO8wd>C;>_?BDbe1^u%MQNrpoCE2Xv-ZjUa8?ZWXtekT6 zE(<}sK4twTbmfTY+y9ZN7tnm^S5e;2{>VS`FP*i_e)u}(dw)VJ9pN_tzdqJ&RxjXa zACAU~=)ACUQIXF*=EsWTEsyz76SobmwVcg&6xq^}&mFU=U~%Z15XO#1vn1>~lAc8= z&0?gO9V-?i&68hSuC_6~@;^sKBWb54mmLRMNZ?bf{vHb?-rc7>{z*|2|`8Oa2(zD**GVpost`` zTW($htsEUrY&@z*A#`vY^cemilkSO&kL@<uvN(3cdybQG(J6?J26t zQsouOf?Afy-jry6$a*;Dsh2A*y`Z>%EhcVRg2+)(aP2QGZGk6Va&*stN(H6B99oX9 zDMsnvWBs519zm!5(11NOShlR#|HgmAeCH2Yzq}-DfpK7g<)LtY6Q+@H`BxR9JZ^j^ zBJCUeq~QLYiXY!dne+z8r4=L%P+Adq8mt3rQKIlejVOh+jw=CzRgQeyvH4bt_vPPZ{U7`zl&2pG ztcMFj5#}G>pnU6purgQ@^+7@q1LIBM!w-Z>1dn}5Gam)aj}*Q0C3%_g-M`T6r>AjW zSjTI}1fIfIg0B_6r}31aMGz6Zz(Wv>b!2%-WgV3R>l~#LvMU3MQ!TD<9<%lOeV)F$ z?-Z6S02i{9vrL_J~jT% zt3<^PQ5!^4Gw>x$k6~=#@~;TC@EPxD{KPUk%z5*Tkny>5$i+TE=n)4Vp{MYbBJ@2% zU!#@aEEJ_BpOuVf1qZuh%K3ufIL8=^4FmdXEsQZNCJVwiAiZ>+*?Ze8W)rSF8<0(W z1{W0PUv_ML-!dCI;=V)a`hHs*Fx|h$-fORsojNx#JD@#mXkZ8xOu=oOZCyulcFo*@u7^b2)>NQzE-Q%52M;K1I^pvo7Gazai zR<0Hdw=IpXBOTP$qM!l&Qx(H^zt7~>SLi+UI1h@}1A}FXg5x*eATbA|E1=^#Ps^vU zb6+rh*mzdhde=j1hmH%r^G(g@?0Ni)J(AF)5&6WvCJlWeUt=oE^k~kz-@nQB%`F-} zggz{fES*?bT5uw?LZKZAod{yjkoYG@zgX_%(1+-+YtKl}iu2cRg5^DMGfl&+>z}2^$9SPkw3ZwB&dRYcB}H zyCKVo;`Fl_n>P%{ty2V7R!BmR)Ymj4pLP-wX~oXw5r6shAM(b3e}k(JI~B8sq` z&`x6pod9s$-<_d-pR0p5jgd9;Rilm+cLWEXr-WHkVt5q zg2}s^EbrVR-dKA?Ur@3cY7wG4`;P;3tN+{z{mxtdKNA zVo%YCeWWPad2fq@TiaC2oJnrEG|=E+&=5vTM^Qpv!O_g2fc=>zFCD9^DZl+sUgY$t zHV&wa;s9Lb@EXwT&Y0hQ zAN$fv50nNyfM*H$XiRzkHc7+bC4jCyYcUd}0a0JE|BkLZHetrS!vytm8*MD1R_Ll? z|Jof!ceV+{f(I?FIMq@pRrArp)E=Cdb%Y0=aJHps2H^aPY`P##1~_XGrHCSrWnr1- z6~>k1BIE+)YJ<_OK09}|Id|1EyyG*tps~JXb}aZ!hj$Wnaoe&u_z*Ljp}O6Vr4b*y zXNd@ly#w6wK8-f06qE*2!eSFwY%j+u65|7rIHNNzfCsl9AjaaJBAC(Mne(#4r45pfk9Kq3YaV$v0pEOtPFVaxr##oeAC};6~54*IO zrNPs+N4vbjl?G1)AHnk!y5D5DCp`U?lJ=UZ3xY<-rh*tp6oRr4_?BvPj58Mb7{2wl zgC$b8)w4NK>hL14rjG8a0ttjh-?DN(qbT6U4+TjR7PErm_wO^kv&VF4*jrcvPuOTG znxSyIqew%cD1}AgD60B|Gscmw4|wV;&#|`NrYa4~Wr3&a%7M~~qH-)3B_a@pK7kgL zr>UHyuoY40QB@ApNjch5#EptZUs#M_%fMs|QCt@&%N&Zr;bwE3v(y3liNergs~i%Evp=wYnm-ocDAFG-UC<0$VO{ zMG2K zS7dpKwT>k6C`tpNM`bNZpqX34Xi?Bi0`k&OS@3;Ll7y7Y3Wvgv97mN<&K#5qX9I$M zj0#hXJBDh8^}r9nio-oXe)#cVsd^6(CzK1Ia=1>LoAXoLKOVthkBxz$S{@Mg7X0EX z3H{4Wiph-eaKu}DY1=4BQ_a`jcDO<-WW^#&yVZhsyF=x;8Sc?og zn-auAtLGSn3V9UNL6k;<2xq}%U^2lq;b7~CYu~*?((ACPVe@9m+SN;(ZdWuKKDODU zxneo(9F16$WhKvPMKgAIt_H=7GR~}Y**LpG5O`FD!_%q;$X7V)VU3|GYdMlu8qo@+ zgt|{77$+Fx$nv@|xjY=s5B#w&60FBqB=N6bjeEU z=(iMMR1pSseXDYU-)JK0k$9FOUg@FkDRgA;JSc*?Lmc>u`QeDk;e=#ug_VsCo->rr zvT|-fI%slmeUstgA;VKGZoKw3i)G0Zzy2~e-``<+Z;x}&Ut+nlPiQl&(yTslfy1LE z%dH(Wjy!5{`tpGHzViW%wJy&-e~S11>K#r$dx5jhoMY$hn=D5&yuibZ*9o*Eq@kS?aScnj;tm1SFvvfGiM`@HXjyx;TO6aaM@O+K- z1Xq>3{mr+zbA6Y%5n+mo@xhp?G~gWbqX{<8@Iwzj^eL?)w+hv1lk}Pdo}iQvw^MrS z9kf>Xo)DUX@%ACkSqzHhG{cmJwA)0KVsgAdpHvU#qZ!6p#P_gSM!v|67#X|> zM#qj!cL-Mo546EQK=IGvcLr498si-(ryx>O2}fN3bl@>Nnqsm7KMaV{5J9k6&UgRp8t=WgPZVkb4LjGj_};f}lH~?t0q0l_YtS7q z8!y2*x~px1&}TMT);d&yVlqRN&{%0xWlO4Mju(0a9uy19d<>(Z;MyC6z5WAHhmQx# zIlM*_y>^*wt}zS1NF9;_&DAb`6fnGhNVdok5p>}3@^8GzGcR8vY{qCT<#bNmjA-`T z6w^6Ul_ag0Mz?{dg|rd!OMm}Ko_uN@=W4m+`r~K#%0GODW-G=b=w=F9qXaOP`DlT& zmif^bQQ>dQ@3KnH8Ws$PL-pF&jdWYZ@0H!*8Sy)a7}gva<36 z!b?w4s)RBJvy>AtEhOD0aVsGkj+h=!&{|N|Fuu3T(cN8?r%@tQd4b-8mm2wfwDA+@1dN*7Pgi_1x;FyKl#A=hX?zXKz#l&rtNcN^J~NwtW_ANiP{Yu zFx%6fv^M&PcZa+L6Q%^APZ)Ys%Q@fu`dg&u zPLn7hiahq-zs>IUh}8>g_<^Rk-hp1i?a>TlVVPB^DCEK`Pjma-yG#!!;CX~;$YP$O zl7zV5VO;q*Q_%@Rlr5=phggVDU!ZaB;sZhO;9xn2-|G`T{vzcMKOpvm)6bm8>-HF2 zSjRd?y1s(nN@=dN(56IysMn^|YjEXPo@bdGS{p00J28*_$}f-?hW^S5X%AX7(tz%%6@oyM^xCK-p?fYvVOhPjj!F|2;{~0KKF!9{ zjK>*qw?${A#ZzB>7Q4*oueZ^S8GfwEtdKnM1^jmBfg7z4-o6)M{^50w{^;M(I%WC6 z@+>#s*}>BarBCz(#^Ml^CwN+D4-y*PnElN$+EaAb8ywsl*BzN&jI9jI(UPMxT>Jz+gRilhrxmGv^5&|00X+@3Xga#I3hC@lOic zo(JlL1uG4KFC@`A(x@13Zqw{W#HSVW``bj#kp7i3luN_r|Juf#X|bFYRE1^r%vr*~ zaPLREG&&LOR*&O*JLuCb`s*o+dCB3eLt4+RQH+imA1>(kHfW}b&ErExdkZR4m#nRY zMQ$;5ib>!ro_?~6Atbo^C4$v6pHllCP+>^xrLS`I+78`f!P%?pDE*WF=cp<`z*@)Q z!JPN*Ry3vs3u)nkg#ATG(OIR^id**`N_))HRh$heeS^hua|`^yXVDm71CO9c$y#e1 z8jrwlagfcK#48MK1G^ScxEZ@y#QiP9u<$WnM0dS`rxl(jIBJnxS%K#%l4iovT&Dl@ zmr)NX0e@%}jWdShw_aoZ)_*06Cg?!wqG0KmPho!-?(S%ICFa(_g7Yt&e^Xd*%d^cjIUU**8ZObDGYg8Qj~^eSuw91qj|yYcXv4cV2`V( z8mvmjde_qJL$eEh1k*#vCV~pu^uP35^uF+=2V(6%vu6Q_=h1rVCEVtZNOu36R?DJ0 zwXVHXkj$al72L8*cy_?8_jf3Zil@GKk$ykL^A!q*r)tg|#{pW`8NaFQM*~n$mxlz0 zb5Kl{TO6mvs`BeRqM1VIRW5B%5>-xzW0$P%osa`)abuWgMu z_re)YU0xv$6v|ivEhJGuaKgH+wJ51m9aGu*;P4dIK~Y)q%8*x%XQx+VCS7J zI$H7M>6rC=hl}SXtX^=n9wU)DS>CQ|?(T_aX#Co5;-wEpLjNyE`I*(q&au4l7VeGT zr`g%UZwt17Y6|%TmQ&ceE9^}|=B;%ORl@DPIc4P2zq~?cqfMLyM1ejD&-w)Y30T(H zIss8a<)AQ*tTardkx)nWsD@dk8dclO%bxRmS zXYE8@6oD(jEgZ^Ur@ZoesPn&67x_L5umD_Dvb^>x?nnQDn0wTF@3kPiV$IgLX(i5t3|`rV2}#FMwko2dBZB=Ac0ZuoNJ-DM(P>JheX^=rTkq}X$vjt3d35p4E zoRO^5R7HD&?>j_8nA9hqlA46t=6Uq9{}MU(#ZL^>Bk`<{Jj@#AH{NFUtv|*;evekC zBI?xg9(qI`qWB2xkxhk((lj3b1$1+TgIB-K@sGbv=Ws&j z6hs^KfRavYRvowMCarD?!HOW(B9$TAg+x2VK+uACO;7=pi+XZQMc{>i7E}yOYr+|~ zz)t{iIKPb@d<}E@H*xW)NA-C1Gd}W3RuRhCjDt77$Kk7gO0>Mg;7mbdO$a)I*8r@m zg(Xgi*J>_hOPJqx6vq%m;CE`pPMHbC*kSWpl#&btFRZ<)96N#l{J^1oAKSb{b?%>H z`@dMP%p;yR{B*{CPul*I%}w^-_%_*%?~&LoI)j2n4|E{){%vdTa@JAKgypeAJJ4Yr zqRv5))!U6wkKl=4%bm1y#4-4d09t3TgI~t3ei@gZt{VlP!o2jSJ|k_4g4x!6M(_TB z?86@*qdNpl(VnRVCTZ;{TAfTDxRXsfpcZo!wQ$Z=P!+X;$5WcdYLoE%Mcl?qxZaDn zP8c>mlrOupYub2kRm1bFd!5J_qX| e>~pXl!u~e~#(B5Ro@l`U0000 + ID, array( 221, 228, 465 ) ) ) : ?> + + + + + + + + + + -- 2.17.1