From 64882fc513b23683fcd3154ef4c49edffce7f2a6 Mon Sep 17 00:00:00 2001 From: nau Date: Sat, 16 Jul 2016 18:53:37 +0200 Subject: [PATCH] get token for user, post users, get all users, post thought, get all thoughts. runs ok --- README.md | 4 + config.js | 6 + controllers/userController.js | 51 +- models/userModel.js | 4 +- .../node_modules/iconv-lite/package.json | 3 +- .../express/node_modules/fresh/package.json | 5 +- node_modules/jsonwebtoken/.jshintrc | 22 + node_modules/jsonwebtoken/.npmignore | 2 + node_modules/jsonwebtoken/.travis.yml | 6 + node_modules/jsonwebtoken/CHANGELOG.md | 266 + node_modules/jsonwebtoken/LICENSE | 21 + node_modules/jsonwebtoken/README.md | 260 + node_modules/jsonwebtoken/bin/changelog | 28 + node_modules/jsonwebtoken/decode.js | 30 + node_modules/jsonwebtoken/index.js | 8 + .../jsonwebtoken/lib/JsonWebTokenError.js | 12 + .../jsonwebtoken/lib/NotBeforeError.js | 13 + .../jsonwebtoken/lib/TokenExpiredError.js | 13 + node_modules/jsonwebtoken/lib/timespan.js | 18 + .../jsonwebtoken/node_modules/cb/.npmignore | 2 + .../jsonwebtoken/node_modules/cb/Makefile | 6 + .../jsonwebtoken/node_modules/cb/README.md | 95 + .../jsonwebtoken/node_modules/cb/lib/cb.js | 39 + .../jsonwebtoken/node_modules/cb/package.json | 46 + .../node_modules/cb/test/tests.js | 125 + .../node_modules/joi/.eslintignore | 2 + .../jsonwebtoken/node_modules/joi/.npmignore | 21 + .../jsonwebtoken/node_modules/joi/.travis.yml | 9 + .../jsonwebtoken/node_modules/joi/API.md | 1515 ++ .../node_modules/joi/CONTRIBUTING.md | 14 + .../jsonwebtoken/node_modules/joi/LICENSE | 28 + .../jsonwebtoken/node_modules/joi/README.md | 90 + .../joi/examples/conditionalRequire.js | 43 + .../joi/examples/customMessage.js | 22 + .../node_modules/joi/examples/multipleWhen.js | 17 + .../node_modules/joi/generate-readme-toc.js | 21 + .../node_modules/joi/images/joi.png | Bin 0 -> 30662 bytes .../node_modules/joi/images/validation.png | Bin 0 -> 117266 bytes .../node_modules/joi/lib/alternatives.js | 152 + .../jsonwebtoken/node_modules/joi/lib/any.js | 899 ++ .../node_modules/joi/lib/array.js | 517 + .../node_modules/joi/lib/binary.js | 98 + .../node_modules/joi/lib/boolean.js | 41 + .../jsonwebtoken/node_modules/joi/lib/cast.js | 75 + .../jsonwebtoken/node_modules/joi/lib/date.js | 168 + .../node_modules/joi/lib/errors.js | 297 + .../node_modules/joi/lib/index.js | 152 + .../node_modules/joi/lib/language.js | 125 + .../node_modules/joi/lib/number.js | 184 + .../node_modules/joi/lib/object.js | 754 + .../jsonwebtoken/node_modules/joi/lib/ref.js | 51 + .../node_modules/joi/lib/string.js | 468 + .../node_modules/joi/lib/string/ip.js | 32 + .../node_modules/joi/lib/string/rfc3986.js | 174 + .../node_modules/joi/lib/string/uri.js | 24 + .../joi/node_modules/hoek/.npmignore | 18 + .../joi/node_modules/hoek/.travis.yml | 7 + .../joi/node_modules/hoek/CONTRIBUTING.md | 1 + .../joi/node_modules/hoek/LICENSE | 31 + .../joi/node_modules/hoek/README.md | 584 + .../joi/node_modules/hoek/images/hoek.png | Bin 0 -> 37939 bytes .../joi/node_modules/hoek/lib/escape.js | 132 + .../joi/node_modules/hoek/lib/index.js | 993 ++ .../joi/node_modules/hoek/package.json | 61 + .../joi/node_modules/hoek/test/escaper.js | 88 + .../joi/node_modules/hoek/test/index.js | 2513 ++++ .../node_modules/hoek/test/modules/ignore.txt | 0 .../node_modules/hoek/test/modules/test1.js | 1 + .../node_modules/hoek/test/modules/test2.js | 1 + .../node_modules/hoek/test/modules/test3.js | 1 + .../joi/node_modules/isemail/.npmignore | 3 + .../joi/node_modules/isemail/.travis.yml | 5 + .../joi/node_modules/isemail/LICENSE | 13 + .../joi/node_modules/isemail/Makefile | 4 + .../joi/node_modules/isemail/README.md | 95 + .../joi/node_modules/isemail/index.js | 1 + .../joi/node_modules/isemail/lib/isemail.js | 1394 ++ .../joi/node_modules/isemail/package.json | 62 + .../joi/node_modules/isemail/test/isemail.js | 175 + .../joi/node_modules/isemail/test/mocha.opts | 2 + .../joi/node_modules/isemail/test/tests.json | 187 + .../joi/node_modules/moment/.npmignore | 2 + .../joi/node_modules/moment/CHANGELOG.md | 563 + .../joi/node_modules/moment/LICENSE | 22 + .../joi/node_modules/moment/README.md | 58 + .../joi/node_modules/moment/ender.js | 1 + .../joi/node_modules/moment/locale/af.js | 73 + .../joi/node_modules/moment/locale/ar-ma.js | 60 + .../joi/node_modules/moment/locale/ar-sa.js | 104 + .../joi/node_modules/moment/locale/ar-tn.js | 58 + .../joi/node_modules/moment/locale/ar.js | 137 + .../joi/node_modules/moment/locale/az.js | 105 + .../joi/node_modules/moment/locale/be.js | 134 + .../joi/node_modules/moment/locale/bg.js | 90 + .../joi/node_modules/moment/locale/bn.js | 119 + .../joi/node_modules/moment/locale/bo.js | 119 + .../joi/node_modules/moment/locale/br.js | 108 + .../joi/node_modules/moment/locale/bs.js | 143 + .../joi/node_modules/moment/locale/ca.js | 81 + .../joi/node_modules/moment/locale/cs.js | 172 + .../joi/node_modules/moment/locale/cv.js | 63 + .../joi/node_modules/moment/locale/cy.js | 80 + .../joi/node_modules/moment/locale/da.js | 60 + .../joi/node_modules/moment/locale/de-at.js | 79 + .../joi/node_modules/moment/locale/de.js | 78 + .../joi/node_modules/moment/locale/dv.js | 99 + .../joi/node_modules/moment/locale/el.js | 98 + .../joi/node_modules/moment/locale/en-au.js | 66 + .../joi/node_modules/moment/locale/en-ca.js | 63 + .../joi/node_modules/moment/locale/en-gb.js | 67 + .../joi/node_modules/moment/locale/en-ie.js | 67 + .../joi/node_modules/moment/locale/en-nz.js | 66 + .../joi/node_modules/moment/locale/eo.js | 73 + .../joi/node_modules/moment/locale/es-do.js | 80 + .../joi/node_modules/moment/locale/es.js | 81 + .../joi/node_modules/moment/locale/et.js | 80 + .../joi/node_modules/moment/locale/eu.js | 66 + .../joi/node_modules/moment/locale/fa.js | 106 + .../joi/node_modules/moment/locale/fi.js | 107 + .../joi/node_modules/moment/locale/fo.js | 60 + .../joi/node_modules/moment/locale/fr-ca.js | 60 + .../joi/node_modules/moment/locale/fr-ch.js | 64 + .../joi/node_modules/moment/locale/fr.js | 64 + .../joi/node_modules/moment/locale/fy.js | 73 + .../joi/node_modules/moment/locale/gd.js | 76 + .../joi/node_modules/moment/locale/gl.js | 77 + .../joi/node_modules/moment/locale/he.js | 99 + .../joi/node_modules/moment/locale/hi.js | 124 + .../joi/node_modules/moment/locale/hr.js | 145 + .../joi/node_modules/moment/locale/hu.js | 109 + .../joi/node_modules/moment/locale/hy-am.js | 95 + .../joi/node_modules/moment/locale/id.js | 83 + .../joi/node_modules/moment/locale/is.js | 127 + .../joi/node_modules/moment/locale/it.js | 70 + .../joi/node_modules/moment/locale/ja.js | 76 + .../joi/node_modules/moment/locale/jv.js | 83 + .../joi/node_modules/moment/locale/ka.js | 89 + .../joi/node_modules/moment/locale/kk.js | 87 + .../joi/node_modules/moment/locale/km.js | 58 + .../joi/node_modules/moment/locale/ko.js | 68 + .../joi/node_modules/moment/locale/ky.js | 88 + .../joi/node_modules/moment/locale/lb.js | 136 + .../joi/node_modules/moment/locale/lo.js | 70 + .../joi/node_modules/moment/locale/lt.js | 117 + .../joi/node_modules/moment/locale/lv.js | 97 + .../joi/node_modules/moment/locale/me.js | 111 + .../joi/node_modules/moment/locale/mk.js | 90 + .../joi/node_modules/moment/locale/ml.js | 81 + .../joi/node_modules/moment/locale/mr.js | 159 + .../joi/node_modules/moment/locale/ms-my.js | 83 + .../joi/node_modules/moment/locale/ms.js | 82 + .../joi/node_modules/moment/locale/my.js | 93 + .../joi/node_modules/moment/locale/nb.js | 63 + .../joi/node_modules/moment/locale/ne.js | 123 + .../joi/node_modules/moment/locale/nl.js | 73 + .../joi/node_modules/moment/locale/nn.js | 60 + .../joi/node_modules/moment/locale/pa-in.js | 124 + .../joi/node_modules/moment/locale/pl.js | 105 + .../joi/node_modules/moment/locale/pt-br.js | 61 + .../joi/node_modules/moment/locale/pt.js | 65 + .../joi/node_modules/moment/locale/ro.js | 75 + .../joi/node_modules/moment/locale/ru.js | 183 + .../joi/node_modules/moment/locale/se.js | 61 + .../joi/node_modules/moment/locale/si.js | 71 + .../joi/node_modules/moment/locale/sk.js | 150 + .../joi/node_modules/moment/locale/sl.js | 162 + .../joi/node_modules/moment/locale/sq.js | 70 + .../joi/node_modules/moment/locale/sr-cyrl.js | 110 + .../joi/node_modules/moment/locale/sr.js | 110 + .../joi/node_modules/moment/locale/ss.js | 89 + .../joi/node_modules/moment/locale/sv.js | 69 + .../joi/node_modules/moment/locale/sw.js | 59 + .../joi/node_modules/moment/locale/ta.js | 129 + .../joi/node_modules/moment/locale/te.js | 89 + .../joi/node_modules/moment/locale/th.js | 67 + .../joi/node_modules/moment/locale/tl-ph.js | 62 + .../joi/node_modules/moment/locale/tlh.js | 120 + .../joi/node_modules/moment/locale/tr.js | 90 + .../joi/node_modules/moment/locale/tzl.js | 91 + .../node_modules/moment/locale/tzm-latn.js | 58 + .../joi/node_modules/moment/locale/tzm.js | 58 + .../joi/node_modules/moment/locale/uk.js | 146 + .../joi/node_modules/moment/locale/uz.js | 58 + .../joi/node_modules/moment/locale/vi.js | 79 + .../node_modules/moment/locale/x-pseudo.js | 68 + .../joi/node_modules/moment/locale/zh-cn.js | 127 + .../joi/node_modules/moment/locale/zh-tw.js | 104 + .../joi/node_modules/moment/min/locales.js | 8104 +++++++++++ .../node_modules/moment/min/locales.min.js | 253 + .../moment/min/moment-with-locales.js | 11954 ++++++++++++++++ .../moment/min/moment-with-locales.min.js | 673 + .../joi/node_modules/moment/min/moment.min.js | 492 + .../joi/node_modules/moment/moment.d.ts | 536 + .../joi/node_modules/moment/moment.js | 4195 ++++++ .../joi/node_modules/moment/package.js | 11 + .../joi/node_modules/moment/package.json | 148 + .../moment/src/lib/create/check-overflow.js | 34 + .../moment/src/lib/create/date-from-array.js | 21 + .../moment/src/lib/create/from-anything.js | 108 + .../moment/src/lib/create/from-array.js | 136 + .../moment/src/lib/create/from-object.js | 16 + .../src/lib/create/from-string-and-array.js | 50 + .../src/lib/create/from-string-and-format.js | 107 + .../moment/src/lib/create/from-string.js | 120 + .../moment/src/lib/create/local.js | 5 + .../moment/src/lib/create/parsing-flags.js | 24 + .../node_modules/moment/src/lib/create/utc.js | 5 + .../moment/src/lib/create/valid.js | 42 + .../moment/src/lib/duration/abs.js | 18 + .../moment/src/lib/duration/add-subtract.js | 21 + .../moment/src/lib/duration/as.js | 55 + .../moment/src/lib/duration/bubble.js | 61 + .../moment/src/lib/duration/constructor.js | 41 + .../moment/src/lib/duration/create.js | 118 + .../moment/src/lib/duration/duration.js | 16 + .../moment/src/lib/duration/get.js | 25 + .../moment/src/lib/duration/humanize.js | 76 + .../moment/src/lib/duration/iso-string.js | 52 + .../moment/src/lib/duration/prototype.js | 48 + .../moment/src/lib/format/format.js | 91 + .../moment/src/lib/locale/base-config.js | 44 + .../moment/src/lib/locale/calendar.js | 15 + .../moment/src/lib/locale/constructor.js | 5 + .../node_modules/moment/src/lib/locale/en.js | 15 + .../moment/src/lib/locale/formats.js | 23 + .../moment/src/lib/locale/invalid.js | 5 + .../moment/src/lib/locale/lists.js | 92 + .../moment/src/lib/locale/locale.js | 39 + .../moment/src/lib/locale/locales.js | 171 + .../moment/src/lib/locale/ordinal.js | 7 + .../moment/src/lib/locale/pre-post-format.js | 3 + .../moment/src/lib/locale/prototype.js | 69 + .../moment/src/lib/locale/relative.js | 29 + .../node_modules/moment/src/lib/locale/set.js | 46 + .../moment/src/lib/moment/add-subtract.js | 55 + .../moment/src/lib/moment/calendar.js | 26 + .../moment/src/lib/moment/clone.js | 5 + .../moment/src/lib/moment/compare.js | 59 + .../moment/src/lib/moment/constructor.js | 74 + .../moment/src/lib/moment/creation-data.js | 9 + .../moment/src/lib/moment/diff.js | 62 + .../moment/src/lib/moment/format.js | 32 + .../moment/src/lib/moment/from.js | 17 + .../moment/src/lib/moment/get-set.js | 55 + .../moment/src/lib/moment/locale.js | 34 + .../moment/src/lib/moment/min-max.js | 63 + .../moment/src/lib/moment/moment.js | 28 + .../node_modules/moment/src/lib/moment/now.js | 3 + .../moment/src/lib/moment/prototype.js | 149 + .../moment/src/lib/moment/start-end-of.js | 59 + .../moment/src/lib/moment/to-type.js | 34 + .../node_modules/moment/src/lib/moment/to.js | 17 + .../moment/src/lib/moment/valid.js | 15 + .../moment/src/lib/parse/regex.js | 54 + .../moment/src/lib/parse/token.js | 32 + .../moment/src/lib/units/aliases.js | 30 + .../moment/src/lib/units/constants.js | 9 + .../moment/src/lib/units/day-of-month.js | 36 + .../moment/src/lib/units/day-of-week.js | 360 + .../moment/src/lib/units/day-of-year.js | 36 + .../node_modules/moment/src/lib/units/hour.js | 138 + .../moment/src/lib/units/millisecond.js | 69 + .../moment/src/lib/units/minute.js | 29 + .../moment/src/lib/units/month.js | 274 + .../moment/src/lib/units/offset.js | 219 + .../moment/src/lib/units/priorities.js | 16 + .../moment/src/lib/units/quarter.js | 32 + .../moment/src/lib/units/second.js | 29 + .../moment/src/lib/units/timestamp.js | 20 + .../moment/src/lib/units/timezone.js | 16 + .../moment/src/lib/units/units.js | 20 + .../src/lib/units/week-calendar-utils.js | 65 + .../moment/src/lib/units/week-year.js | 107 + .../node_modules/moment/src/lib/units/week.js | 67 + .../node_modules/moment/src/lib/units/year.js | 75 + .../moment/src/lib/utils/abs-ceil.js | 7 + .../moment/src/lib/utils/abs-floor.js | 8 + .../moment/src/lib/utils/abs-round.js | 7 + .../moment/src/lib/utils/compare-arrays.js | 16 + .../moment/src/lib/utils/defaults.js | 10 + .../moment/src/lib/utils/deprecate.js | 40 + .../moment/src/lib/utils/extend.js | 19 + .../moment/src/lib/utils/has-own-prop.js | 3 + .../moment/src/lib/utils/hooks.js | 13 + .../moment/src/lib/utils/index-of.js | 18 + .../moment/src/lib/utils/is-array.js | 3 + .../moment/src/lib/utils/is-date.js | 3 + .../moment/src/lib/utils/is-function.js | 3 + .../moment/src/lib/utils/is-object-empty.js | 8 + .../moment/src/lib/utils/is-object.js | 3 + .../moment/src/lib/utils/is-undefined.js | 3 + .../node_modules/moment/src/lib/utils/keys.js | 19 + .../node_modules/moment/src/lib/utils/map.js | 7 + .../node_modules/moment/src/lib/utils/some.js | 19 + .../moment/src/lib/utils/to-int.js | 12 + .../moment/src/lib/utils/zero-fill.js | 7 + .../joi/node_modules/moment/src/locale/af.js | 63 + .../node_modules/moment/src/locale/ar-ma.js | 51 + .../node_modules/moment/src/locale/ar-sa.js | 95 + .../node_modules/moment/src/locale/ar-tn.js | 49 + .../joi/node_modules/moment/src/locale/ar.js | 128 + .../joi/node_modules/moment/src/locale/az.js | 96 + .../joi/node_modules/moment/src/locale/be.js | 125 + .../joi/node_modules/moment/src/locale/bg.js | 81 + .../joi/node_modules/moment/src/locale/bn.js | 110 + .../joi/node_modules/moment/src/locale/bo.js | 110 + .../joi/node_modules/moment/src/locale/br.js | 99 + .../joi/node_modules/moment/src/locale/bs.js | 134 + .../joi/node_modules/moment/src/locale/ca.js | 72 + .../joi/node_modules/moment/src/locale/cs.js | 163 + .../joi/node_modules/moment/src/locale/cv.js | 53 + .../joi/node_modules/moment/src/locale/cy.js | 71 + .../joi/node_modules/moment/src/locale/da.js | 51 + .../node_modules/moment/src/locale/de-at.js | 69 + .../joi/node_modules/moment/src/locale/de.js | 68 + .../joi/node_modules/moment/src/locale/dv.js | 89 + .../joi/node_modules/moment/src/locale/el.js | 86 + .../node_modules/moment/src/locale/en-au.js | 57 + .../node_modules/moment/src/locale/en-ca.js | 53 + .../node_modules/moment/src/locale/en-gb.js | 58 + .../node_modules/moment/src/locale/en-ie.js | 58 + .../node_modules/moment/src/locale/en-nz.js | 56 + .../joi/node_modules/moment/src/locale/eo.js | 64 + .../node_modules/moment/src/locale/es-do.js | 71 + .../joi/node_modules/moment/src/locale/es.js | 72 + .../joi/node_modules/moment/src/locale/et.js | 71 + .../joi/node_modules/moment/src/locale/eu.js | 57 + .../joi/node_modules/moment/src/locale/fa.js | 97 + .../joi/node_modules/moment/src/locale/fi.js | 98 + .../joi/node_modules/moment/src/locale/fo.js | 51 + .../node_modules/moment/src/locale/fr-ca.js | 51 + .../node_modules/moment/src/locale/fr-ch.js | 55 + .../joi/node_modules/moment/src/locale/fr.js | 55 + .../joi/node_modules/moment/src/locale/fy.js | 64 + .../joi/node_modules/moment/src/locale/gd.js | 67 + .../joi/node_modules/moment/src/locale/gl.js | 68 + .../joi/node_modules/moment/src/locale/he.js | 90 + .../joi/node_modules/moment/src/locale/hi.js | 115 + .../joi/node_modules/moment/src/locale/hr.js | 136 + .../joi/node_modules/moment/src/locale/hu.js | 100 + .../node_modules/moment/src/locale/hy-am.js | 86 + .../joi/node_modules/moment/src/locale/id.js | 74 + .../joi/node_modules/moment/src/locale/is.js | 118 + .../joi/node_modules/moment/src/locale/it.js | 61 + .../joi/node_modules/moment/src/locale/ja.js | 67 + .../joi/node_modules/moment/src/locale/jv.js | 73 + .../joi/node_modules/moment/src/locale/ka.js | 80 + .../joi/node_modules/moment/src/locale/kk.js | 77 + .../joi/node_modules/moment/src/locale/km.js | 49 + .../joi/node_modules/moment/src/locale/ko.js | 59 + .../joi/node_modules/moment/src/locale/ky.js | 78 + .../joi/node_modules/moment/src/locale/lb.js | 127 + .../joi/node_modules/moment/src/locale/lo.js | 61 + .../joi/node_modules/moment/src/locale/lt.js | 108 + .../joi/node_modules/moment/src/locale/lv.js | 88 + .../joi/node_modules/moment/src/locale/me.js | 101 + .../joi/node_modules/moment/src/locale/mk.js | 81 + .../joi/node_modules/moment/src/locale/ml.js | 72 + .../joi/node_modules/moment/src/locale/mr.js | 150 + .../node_modules/moment/src/locale/ms-my.js | 74 + .../joi/node_modules/moment/src/locale/ms.js | 73 + .../joi/node_modules/moment/src/locale/my.js | 84 + .../joi/node_modules/moment/src/locale/nb.js | 54 + .../joi/node_modules/moment/src/locale/ne.js | 114 + .../joi/node_modules/moment/src/locale/nl.js | 64 + .../joi/node_modules/moment/src/locale/nn.js | 51 + .../node_modules/moment/src/locale/pa-in.js | 115 + .../joi/node_modules/moment/src/locale/pl.js | 95 + .../node_modules/moment/src/locale/pt-br.js | 52 + .../joi/node_modules/moment/src/locale/pt.js | 56 + .../joi/node_modules/moment/src/locale/ro.js | 66 + .../joi/node_modules/moment/src/locale/ru.js | 173 + .../joi/node_modules/moment/src/locale/se.js | 51 + .../joi/node_modules/moment/src/locale/si.js | 61 + .../joi/node_modules/moment/src/locale/sk.js | 141 + .../joi/node_modules/moment/src/locale/sl.js | 152 + .../joi/node_modules/moment/src/locale/sq.js | 61 + .../node_modules/moment/src/locale/sr-cyrl.js | 101 + .../joi/node_modules/moment/src/locale/sr.js | 101 + .../joi/node_modules/moment/src/locale/ss.js | 80 + .../joi/node_modules/moment/src/locale/sv.js | 60 + .../joi/node_modules/moment/src/locale/sw.js | 50 + .../joi/node_modules/moment/src/locale/ta.js | 120 + .../joi/node_modules/moment/src/locale/te.js | 79 + .../joi/node_modules/moment/src/locale/th.js | 57 + .../node_modules/moment/src/locale/tl-ph.js | 53 + .../joi/node_modules/moment/src/locale/tlh.js | 110 + .../joi/node_modules/moment/src/locale/tr.js | 81 + .../joi/node_modules/moment/src/locale/tzl.js | 82 + .../moment/src/locale/tzm-latn.js | 49 + .../joi/node_modules/moment/src/locale/tzm.js | 49 + .../joi/node_modules/moment/src/locale/uk.js | 137 + .../joi/node_modules/moment/src/locale/uz.js | 49 + .../joi/node_modules/moment/src/locale/vi.js | 70 + .../moment/src/locale/x-pseudo.js | 58 + .../node_modules/moment/src/locale/zh-cn.js | 118 + .../node_modules/moment/src/locale/zh-tw.js | 94 + .../joi/node_modules/moment/src/moment.js | 82 + .../joi/node_modules/topo/.npmignore | 18 + .../joi/node_modules/topo/.travis.yml | 9 + .../node_modules/joi/node_modules/topo/API.md | 32 + .../joi/node_modules/topo/CONTRIBUTING.md | 16 + .../joi/node_modules/topo/LICENSE | 28 + .../joi/node_modules/topo/README.md | 29 + .../joi/node_modules/topo/lib/index.js | 231 + .../joi/node_modules/topo/package.json | 60 + .../joi/node_modules/topo/test/index.js | 266 + .../node_modules/joi/package.json | 67 + .../node_modules/joi/test/alternatives.js | 488 + .../jsonwebtoken/node_modules/joi/test/any.js | 1595 +++ .../node_modules/joi/test/array.js | 1049 ++ .../node_modules/joi/test/binary.js | 188 + .../node_modules/joi/test/boolean.js | 129 + .../node_modules/joi/test/date.js | 338 + .../node_modules/joi/test/errors.js | 459 + .../node_modules/joi/test/function.js | 113 + .../node_modules/joi/test/helper.js | 63 + .../node_modules/joi/test/index.js | 1692 +++ .../node_modules/joi/test/number.js | 834 ++ .../node_modules/joi/test/object.js | 1309 ++ .../jsonwebtoken/node_modules/joi/test/ref.js | 387 + .../node_modules/joi/test/string.js | 3035 ++++ .../jsonwebtoken/node_modules/jws/.jshintrc | 11 + .../jsonwebtoken/node_modules/jws/.npmignore | 4 + .../jsonwebtoken/node_modules/jws/.travis.yml | 6 + .../node_modules/jws/CHANGELOG.md | 34 + .../jsonwebtoken/node_modules/jws/LICENSE | 17 + .../jsonwebtoken/node_modules/jws/Makefile | 32 + .../jsonwebtoken/node_modules/jws/index.js | 21 + .../node_modules/jws/lib/data-stream.js | 55 + .../node_modules/jws/lib/sign-stream.js | 69 + .../node_modules/jws/lib/tostring.js | 10 + .../node_modules/jws/lib/verify-stream.js | 120 + .../jws/node_modules/.bin/base64url | 1 + .../jws/node_modules/base64url/.npmignore | 1 + .../jws/node_modules/base64url/.travis.yml | 3 + .../jws/node_modules/base64url/LICENSE | 20 + .../jws/node_modules/base64url/bin/base64url | 105 + .../jws/node_modules/base64url/index.js | 54 + .../node_modules/concat-stream/LICENSE | 24 + .../node_modules/concat-stream/index.js | 136 + .../node_modules/inherits/LICENSE | 16 + .../node_modules/inherits/README.md | 42 + .../node_modules/inherits/inherits.js | 1 + .../node_modules/inherits/inherits_browser.js | 23 + .../node_modules/inherits/package.json | 50 + .../node_modules/inherits/test.js | 25 + .../node_modules/readable-stream/.npmignore | 5 + .../node_modules/readable-stream/LICENSE | 18 + .../node_modules/readable-stream/README.md | 15 + .../node_modules/readable-stream/duplex.js | 1 + .../node_modules/readable-stream/float.patch | 923 ++ .../readable-stream/lib/_stream_duplex.js | 89 + .../lib/_stream_passthrough.js | 46 + .../readable-stream/lib/_stream_readable.js | 951 ++ .../readable-stream/lib/_stream_transform.js | 209 + .../readable-stream/lib/_stream_writable.js | 477 + .../node_modules/core-util-is/LICENSE | 19 + .../node_modules/core-util-is/README.md | 3 + .../node_modules/core-util-is/float.patch | 604 + .../node_modules/core-util-is/lib/util.js | 107 + .../node_modules/core-util-is/package.json | 60 + .../node_modules/core-util-is/test.js | 68 + .../node_modules/isarray/README.md | 54 + .../node_modules/isarray/build/build.js | 209 + .../node_modules/isarray/component.json | 19 + .../node_modules/isarray/index.js | 3 + .../node_modules/isarray/package.json | 53 + .../node_modules/string_decoder/.npmignore | 2 + .../node_modules/string_decoder/LICENSE | 20 + .../node_modules/string_decoder/README.md | 7 + .../node_modules/string_decoder/index.js | 221 + .../node_modules/string_decoder/package.json | 54 + .../node_modules/readable-stream/package.json | 79 + .../readable-stream/passthrough.js | 1 + .../node_modules/readable-stream/readable.js | 10 + .../node_modules/readable-stream/transform.js | 1 + .../node_modules/readable-stream/writable.js | 1 + .../node_modules/typedarray/.travis.yml | 4 + .../node_modules/typedarray/LICENSE | 35 + .../node_modules/typedarray/example/tarray.js | 4 + .../node_modules/typedarray/index.js | 630 + .../node_modules/typedarray/package.json | 79 + .../node_modules/typedarray/readme.markdown | 61 + .../typedarray/test/server/undef_globals.js | 19 + .../node_modules/typedarray/test/tarray.js | 10 + .../node_modules/concat-stream/package.json | 81 + .../node_modules/concat-stream/readme.md | 94 + .../base64url/node_modules/meow/index.js | 45 + .../meow/node_modules/.bin/indent-string | 1 + .../meow/node_modules/camelcase-keys/index.js | 9 + .../node_modules/camelcase/index.js | 27 + .../node_modules/camelcase/license | 21 + .../node_modules/camelcase/package.json | 67 + .../node_modules/camelcase/readme.md | 56 + .../node_modules/map-obj/index.js | 13 + .../node_modules/map-obj/license | 21 + .../node_modules/map-obj/package.json | 65 + .../node_modules/map-obj/readme.md | 29 + .../node_modules/camelcase-keys/package.json | 80 + .../node_modules/camelcase-keys/readme.md | 32 + .../meow/node_modules/indent-string/cli.js | 48 + .../meow/node_modules/indent-string/index.js | 20 + .../meow/node_modules/indent-string/license | 21 + .../indent-string/node_modules/.bin/repeating | 1 + .../node_modules/get-stdin/index.js | 49 + .../node_modules/get-stdin/package.json | 63 + .../node_modules/get-stdin/readme.md | 44 + .../node_modules/repeating/cli.js | 36 + .../node_modules/repeating/index.js | 24 + .../node_modules/repeating/license | 21 + .../repeating/node_modules/is-finite/index.js | 6 + .../repeating/node_modules/is-finite/license | 21 + .../node_modules/number-is-nan/index.js | 4 + .../node_modules/number-is-nan/license | 21 + .../node_modules/number-is-nan/package.json | 67 + .../node_modules/number-is-nan/readme.md | 30 + .../node_modules/is-finite/package.json | 68 + .../node_modules/is-finite/readme.md | 30 + .../node_modules/repeating/package.json | 72 + .../node_modules/repeating/readme.md | 40 + .../node_modules/indent-string/package.json | 72 + .../meow/node_modules/indent-string/readme.md | 77 + .../meow/node_modules/minimist/.travis.yml | 8 + .../meow/node_modules/minimist/LICENSE | 18 + .../node_modules/minimist/example/parse.js | 2 + .../meow/node_modules/minimist/index.js | 236 + .../meow/node_modules/minimist/package.json | 71 + .../node_modules/minimist/readme.markdown | 91 + .../node_modules/minimist/test/all_bool.js | 32 + .../meow/node_modules/minimist/test/bool.js | 166 + .../meow/node_modules/minimist/test/dash.js | 31 + .../minimist/test/default_bool.js | 35 + .../meow/node_modules/minimist/test/dotted.js | 22 + .../node_modules/minimist/test/kv_short.js | 16 + .../meow/node_modules/minimist/test/long.js | 31 + .../meow/node_modules/minimist/test/num.js | 36 + .../meow/node_modules/minimist/test/parse.js | 197 + .../minimist/test/parse_modified.js | 9 + .../meow/node_modules/minimist/test/short.js | 67 + .../node_modules/minimist/test/stop_early.js | 15 + .../node_modules/minimist/test/unknown.js | 102 + .../node_modules/minimist/test/whitespace.js | 8 + .../meow/node_modules/object-assign/index.js | 37 + .../node_modules/object-assign/package.json | 66 + .../meow/node_modules/object-assign/readme.md | 47 + .../base64url/node_modules/meow/package.json | 67 + .../base64url/node_modules/meow/readme.md | 97 + .../jws/node_modules/base64url/package.json | 61 + .../jws/node_modules/base64url/readme.md | 126 + .../base64url/test/base64url.test.js | 56 + .../jws/node_modules/base64url/test/test.jpg | Bin 0 -> 88981 bytes .../jws/node_modules/jwa/.npmignore | 4 + .../jws/node_modules/jwa/.travis.yml | 11 + .../node_modules/jws/node_modules/jwa/LICENSE | 17 + .../jws/node_modules/jwa/Makefile | 32 + .../jws/node_modules/jwa/README.md | 145 + .../jws/node_modules/jwa/index.js | 124 + .../buffer-equal-constant-time/.npmignore | 2 + .../buffer-equal-constant-time/.travis.yml | 4 + .../buffer-equal-constant-time/LICENSE.txt | 12 + .../buffer-equal-constant-time/README.md | 50 + .../buffer-equal-constant-time/index.js | 41 + .../buffer-equal-constant-time/package.json | 51 + .../buffer-equal-constant-time/test.js | 42 + .../node_modules/ecdsa-sig-formatter/LICENSE | 201 + .../ecdsa-sig-formatter/README.md | 65 + .../node_modules/base64-url/LICENSE | 15 + .../node_modules/base64-url/README.md | 50 + .../node_modules/base64-url/index.js | 23 + .../node_modules/base64-url/package.json | 73 + .../ecdsa-sig-formatter/package.json | 73 + .../src/ecdsa-sig-formatter.js | 180 + .../src/param-bytes-for-alg.js | 23 + .../jws/node_modules/jwa/package.json | 74 + .../jws/node_modules/jwa/test/jwa.test.js | 305 + .../node_modules/jws/package.json | 71 + .../jsonwebtoken/node_modules/jws/readme.md | 248 + .../node_modules/jws/test/data.txt | 1 + .../node_modules/jws/test/jws.test.js | 321 + .../jsonwebtoken/node_modules/ms/.npmignore | 5 + .../jsonwebtoken/node_modules/ms/History.md | 66 + .../jsonwebtoken/node_modules/ms/LICENSE | 20 + .../jsonwebtoken/node_modules/ms/README.md | 35 + .../jsonwebtoken/node_modules/ms/index.js | 125 + .../jsonwebtoken/node_modules/ms/package.json | 48 + .../jsonwebtoken/node_modules/xtend/.jshintrc | 30 + .../node_modules/xtend/.npmignore | 1 + .../jsonwebtoken/node_modules/xtend/LICENCE | 19 + .../jsonwebtoken/node_modules/xtend/Makefile | 4 + .../jsonwebtoken/node_modules/xtend/README.md | 32 + .../node_modules/xtend/immutable.js | 19 + .../node_modules/xtend/mutable.js | 17 + .../node_modules/xtend/package.json | 84 + .../jsonwebtoken/node_modules/xtend/test.js | 83 + node_modules/jsonwebtoken/package.json | 92 + node_modules/jsonwebtoken/sign.js | 146 + .../jsonwebtoken/test/async_sign.tests.js | 60 + .../jsonwebtoken/test/buffer.tests.js | 10 + .../jsonwebtoken/test/encoding.tests.js | 37 + .../jsonwebtoken/test/expires_format.tests.js | 53 + node_modules/jsonwebtoken/test/iat.tests.js | 22 + .../jsonwebtoken/test/invalid_exp.tests.js | 58 + .../jsonwebtoken/test/invalid_pub.pem | 19 + .../jsonwebtoken/test/issue_147.tests.js | 12 + .../jsonwebtoken/test/issue_196.tests.js | 15 + .../jsonwebtoken/test/issue_70.tests.js | 15 + .../jsonwebtoken/test/jwt.hs.tests.js | 82 + .../jsonwebtoken/test/jwt.rs.tests.js | 423 + .../jsonwebtoken/test/noTimestamp.tests.js | 12 + .../test/non_object_values.tests.js | 33 + node_modules/jsonwebtoken/test/priv.pem | 27 + node_modules/jsonwebtoken/test/pub.pem | 22 + .../jsonwebtoken/test/rsa-private.pem | 27 + .../jsonwebtoken/test/rsa-public-key.pem | 8 + .../jsonwebtoken/test/rsa-public-key.tests.js | 15 + node_modules/jsonwebtoken/test/rsa-public.pem | 9 + .../jsonwebtoken/test/set_headers.tests.js | 18 + .../test/undefined_secretOrPublickey.tests.js | 20 + .../jsonwebtoken/test/util/fakeDate.js | 32 + .../jsonwebtoken/test/verify.tests.js | 194 + .../jsonwebtoken/test/wrong_alg.tests.js | 42 + node_modules/jsonwebtoken/verify.js | 168 + .../mongodb/node_modules/bson/package.json | 4 +- .../node_modules/mongodb/package.json | 5 +- node_modules/morgan/HISTORY.md | 158 + node_modules/morgan/LICENSE | 23 + node_modules/morgan/README.md | 324 + node_modules/morgan/index.js | 501 + .../morgan/node_modules/basic-auth/HISTORY.md | 35 + .../morgan/node_modules/basic-auth/LICENSE | 24 + .../morgan/node_modules/basic-auth/README.md | 78 + .../morgan/node_modules/basic-auth/index.js | 108 + .../node_modules/basic-auth/package.json | 75 + .../morgan/node_modules/debug/.jshintrc | 3 + .../morgan/node_modules/debug/.npmignore | 6 + .../morgan/node_modules/debug/History.md | 195 + .../morgan/node_modules/debug/Makefile | 36 + .../morgan/node_modules/debug/Readme.md | 188 + .../morgan/node_modules/debug/bower.json | 28 + .../morgan/node_modules/debug/browser.js | 168 + .../morgan/node_modules/debug/component.json | 19 + .../morgan/node_modules/debug/debug.js | 197 + .../morgan/node_modules/debug/node.js | 209 + .../debug/node_modules/ms/.npmignore | 5 + .../debug/node_modules/ms/History.md | 66 + .../debug/node_modules/ms/LICENSE | 20 + .../debug/node_modules/ms/README.md | 35 + .../debug/node_modules/ms/index.js | 125 + .../debug/node_modules/ms/package.json | 48 + .../morgan/node_modules/debug/package.json | 73 + .../morgan/node_modules/depd/History.md | 84 + node_modules/morgan/node_modules/depd/LICENSE | 22 + .../morgan/node_modules/depd/Readme.md | 281 + .../morgan/node_modules/depd/index.js | 521 + .../node_modules/depd/lib/browser/index.js | 79 + .../depd/lib/compat/buffer-concat.js | 35 + .../depd/lib/compat/callsite-tostring.js | 103 + .../depd/lib/compat/event-listener-count.js | 22 + .../node_modules/depd/lib/compat/index.js | 84 + .../morgan/node_modules/depd/package.json | 67 + .../node_modules/on-finished/HISTORY.md | 88 + .../morgan/node_modules/on-finished/LICENSE | 23 + .../morgan/node_modules/on-finished/README.md | 154 + .../morgan/node_modules/on-finished/index.js | 196 + .../on-finished/node_modules/ee-first/LICENSE | 22 + .../node_modules/ee-first/README.md | 80 + .../node_modules/ee-first/index.js | 95 + .../node_modules/ee-first/package.json | 64 + .../node_modules/on-finished/package.json | 71 + .../morgan/node_modules/on-headers/HISTORY.md | 16 + .../morgan/node_modules/on-headers/LICENSE | 22 + .../morgan/node_modules/on-headers/README.md | 76 + .../morgan/node_modules/on-headers/index.js | 93 + .../node_modules/on-headers/package.json | 70 + node_modules/morgan/package.json | 97 + package.json | 4 +- server.js | 31 +- 678 files changed, 94094 insertions(+), 22 deletions(-) create mode 100644 config.js create mode 100644 node_modules/jsonwebtoken/.jshintrc create mode 100644 node_modules/jsonwebtoken/.npmignore create mode 100644 node_modules/jsonwebtoken/.travis.yml create mode 100644 node_modules/jsonwebtoken/CHANGELOG.md create mode 100644 node_modules/jsonwebtoken/LICENSE create mode 100644 node_modules/jsonwebtoken/README.md create mode 100755 node_modules/jsonwebtoken/bin/changelog create mode 100644 node_modules/jsonwebtoken/decode.js create mode 100644 node_modules/jsonwebtoken/index.js create mode 100644 node_modules/jsonwebtoken/lib/JsonWebTokenError.js create mode 100644 node_modules/jsonwebtoken/lib/NotBeforeError.js create mode 100644 node_modules/jsonwebtoken/lib/TokenExpiredError.js create mode 100644 node_modules/jsonwebtoken/lib/timespan.js create mode 100644 node_modules/jsonwebtoken/node_modules/cb/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/cb/Makefile create mode 100644 node_modules/jsonwebtoken/node_modules/cb/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/cb/lib/cb.js create mode 100644 node_modules/jsonwebtoken/node_modules/cb/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/cb/test/tests.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/.eslintignore create mode 100644 node_modules/jsonwebtoken/node_modules/joi/.npmignore create mode 100755 node_modules/jsonwebtoken/node_modules/joi/.travis.yml create mode 100755 node_modules/jsonwebtoken/node_modules/joi/API.md create mode 100755 node_modules/jsonwebtoken/node_modules/joi/CONTRIBUTING.md create mode 100755 node_modules/jsonwebtoken/node_modules/joi/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/joi/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/joi/examples/conditionalRequire.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/examples/customMessage.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/examples/multipleWhen.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/generate-readme-toc.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/images/joi.png create mode 100755 node_modules/jsonwebtoken/node_modules/joi/images/validation.png create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/alternatives.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/any.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/array.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/binary.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/boolean.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/cast.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/date.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/errors.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/index.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/language.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/number.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/object.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/ref.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/lib/string.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/lib/string/ip.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/lib/string/rfc3986.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/lib/string/uri.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/.travis.yml create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/CONTRIBUTING.md create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/images/hoek.png create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/lib/escape.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/lib/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/test/escaper.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/test/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/test/modules/ignore.txt create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/test/modules/test1.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/test/modules/test2.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/test/modules/test3.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/isemail/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/isemail/.travis.yml create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/isemail/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/isemail/Makefile create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/isemail/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/isemail/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/isemail/lib/isemail.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/isemail/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/isemail/test/isemail.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/isemail/test/mocha.opts create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/isemail/test/tests.json create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/CHANGELOG.md create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/ender.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/af.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ar-ma.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ar-sa.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ar-tn.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ar.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/az.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/be.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/bg.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/bn.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/bo.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/br.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/bs.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ca.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/cs.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/cv.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/cy.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/da.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/de-at.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/de.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/dv.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/el.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/en-au.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/en-ca.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/en-gb.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/en-ie.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/en-nz.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/eo.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/es-do.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/es.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/et.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/eu.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/fa.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/fi.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/fo.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/fr-ca.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/fr-ch.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/fr.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/fy.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/gd.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/gl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/he.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/hi.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/hr.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/hu.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/hy-am.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/id.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/is.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/it.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ja.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/jv.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ka.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/kk.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/km.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ko.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ky.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/lb.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/lo.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/lt.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/lv.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/me.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/mk.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ml.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/mr.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ms-my.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ms.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/my.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/nb.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ne.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/nl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/nn.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/pa-in.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/pl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/pt-br.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/pt.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ro.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ru.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/se.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/si.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/sk.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/sl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/sq.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/sr-cyrl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/sr.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ss.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/sv.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/sw.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/ta.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/te.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/th.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/tl-ph.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/tlh.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/tr.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/tzl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/tzm-latn.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/tzm.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/uk.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/uz.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/vi.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/x-pseudo.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/zh-cn.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/locale/zh-tw.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/min/locales.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/min/locales.min.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/min/moment-with-locales.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/min/moment.min.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/moment.d.ts create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/moment.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/package.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/check-overflow.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/date-from-array.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/from-anything.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/from-array.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/from-object.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/from-string-and-array.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/from-string-and-format.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/from-string.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/local.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/parsing-flags.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/utc.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/create/valid.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/duration/abs.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/duration/add-subtract.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/duration/as.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/duration/bubble.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/duration/constructor.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/duration/create.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/duration/duration.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/duration/get.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/duration/humanize.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/duration/iso-string.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/duration/prototype.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/format/format.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/base-config.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/calendar.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/constructor.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/en.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/formats.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/invalid.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/lists.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/locale.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/locales.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/ordinal.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/pre-post-format.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/prototype.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/relative.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/locale/set.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/add-subtract.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/calendar.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/clone.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/compare.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/constructor.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/creation-data.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/diff.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/format.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/from.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/get-set.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/locale.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/min-max.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/moment.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/now.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/prototype.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/start-end-of.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/to-type.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/to.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/moment/valid.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/parse/regex.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/parse/token.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/aliases.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/constants.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/day-of-month.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/day-of-week.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/day-of-year.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/hour.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/millisecond.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/minute.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/month.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/offset.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/priorities.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/quarter.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/second.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/timestamp.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/timezone.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/units.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/week-calendar-utils.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/week-year.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/week.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/units/year.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/abs-ceil.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/abs-floor.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/abs-round.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/compare-arrays.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/defaults.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/deprecate.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/extend.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/has-own-prop.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/hooks.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/index-of.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/is-array.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/is-date.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/is-function.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/is-object-empty.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/is-object.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/is-undefined.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/keys.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/map.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/some.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/to-int.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/lib/utils/zero-fill.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/af.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ar-ma.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ar-sa.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ar-tn.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ar.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/az.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/be.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/bg.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/bn.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/bo.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/br.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/bs.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ca.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/cs.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/cv.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/cy.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/da.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/de-at.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/de.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/dv.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/el.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/en-au.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/en-ca.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/en-gb.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/en-ie.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/en-nz.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/eo.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/es-do.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/es.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/et.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/eu.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/fa.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/fi.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/fo.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/fr-ca.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/fr-ch.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/fr.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/fy.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/gd.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/gl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/he.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/hi.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/hr.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/hu.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/hy-am.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/id.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/is.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/it.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ja.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/jv.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ka.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/kk.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/km.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ko.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ky.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/lb.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/lo.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/lt.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/lv.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/me.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/mk.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ml.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/mr.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ms-my.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ms.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/my.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/nb.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ne.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/nl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/nn.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/pa-in.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/pl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/pt-br.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/pt.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ro.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ru.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/se.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/si.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/sk.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/sl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/sq.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/sr-cyrl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/sr.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ss.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/sv.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/sw.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/ta.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/te.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/th.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/tl-ph.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/tlh.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/tr.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/tzl.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/tzm-latn.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/tzm.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/uk.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/uz.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/vi.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/x-pseudo.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/zh-cn.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/locale/zh-tw.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/moment/src/moment.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/topo/.npmignore create mode 100755 node_modules/jsonwebtoken/node_modules/joi/node_modules/topo/.travis.yml create mode 100755 node_modules/jsonwebtoken/node_modules/joi/node_modules/topo/API.md create mode 100755 node_modules/jsonwebtoken/node_modules/joi/node_modules/topo/CONTRIBUTING.md create mode 100755 node_modules/jsonwebtoken/node_modules/joi/node_modules/topo/LICENSE create mode 100755 node_modules/jsonwebtoken/node_modules/joi/node_modules/topo/README.md create mode 100755 node_modules/jsonwebtoken/node_modules/joi/node_modules/topo/lib/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/node_modules/topo/package.json create mode 100755 node_modules/jsonwebtoken/node_modules/joi/node_modules/topo/test/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/package.json create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/alternatives.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/any.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/array.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/binary.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/boolean.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/date.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/errors.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/function.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/helper.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/index.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/number.js create mode 100644 node_modules/jsonwebtoken/node_modules/joi/test/object.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/ref.js create mode 100755 node_modules/jsonwebtoken/node_modules/joi/test/string.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/.jshintrc create mode 100644 node_modules/jsonwebtoken/node_modules/jws/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/jws/.travis.yml create mode 100644 node_modules/jsonwebtoken/node_modules/jws/CHANGELOG.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/jws/Makefile create mode 100644 node_modules/jsonwebtoken/node_modules/jws/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/lib/data-stream.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/lib/sign-stream.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/lib/tostring.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/lib/verify-stream.js create mode 120000 node_modules/jsonwebtoken/node_modules/jws/node_modules/.bin/base64url create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/.travis.yml create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/LICENSE create mode 100755 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/bin/base64url create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/inherits/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/inherits/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/inherits/inherits.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/inherits/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/inherits/test.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/duplex.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/float.patch create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/float.patch create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/lib/util.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/test.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/isarray/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/isarray/build/build.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/isarray/component.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/isarray/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/isarray/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/readable.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/transform.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/writable.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/typedarray/.travis.yml create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/typedarray/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/typedarray/example/tarray.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/typedarray/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/typedarray/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/typedarray/readme.markdown create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/typedarray/test/server/undef_globals.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/typedarray/test/tarray.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/readme.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/index.js create mode 120000 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/.bin/indent-string create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/camelcase-keys/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/camelcase-keys/node_modules/camelcase/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/camelcase-keys/node_modules/camelcase/license create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/camelcase-keys/node_modules/camelcase/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/camelcase-keys/node_modules/camelcase/readme.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/camelcase-keys/node_modules/map-obj/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/camelcase-keys/node_modules/map-obj/license create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/camelcase-keys/node_modules/map-obj/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/camelcase-keys/node_modules/map-obj/readme.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/camelcase-keys/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/camelcase-keys/readme.md create mode 100755 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/cli.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/license create mode 120000 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/.bin/repeating create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/get-stdin/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/get-stdin/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/get-stdin/readme.md create mode 100755 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/cli.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/license create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/node_modules/is-finite/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/node_modules/is-finite/license create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/node_modules/is-finite/node_modules/number-is-nan/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/node_modules/is-finite/node_modules/number-is-nan/license create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/node_modules/is-finite/node_modules/number-is-nan/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/node_modules/is-finite/node_modules/number-is-nan/readme.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/node_modules/is-finite/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/node_modules/is-finite/readme.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/node_modules/repeating/readme.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/indent-string/readme.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/.travis.yml create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/example/parse.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/readme.markdown create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/all_bool.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/bool.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/dash.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/default_bool.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/dotted.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/kv_short.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/long.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/num.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/parse.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/parse_modified.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/short.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/stop_early.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/unknown.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/minimist/test/whitespace.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/object-assign/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/object-assign/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/node_modules/object-assign/readme.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/meow/readme.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/readme.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/test/base64url.test.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/test/test.jpg create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/.travis.yml create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/Makefile create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/buffer-equal-constant-time/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/buffer-equal-constant-time/.travis.yml create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/buffer-equal-constant-time/LICENSE.txt create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/buffer-equal-constant-time/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/buffer-equal-constant-time/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/buffer-equal-constant-time/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/buffer-equal-constant-time/test.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/ecdsa-sig-formatter/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/ecdsa-sig-formatter/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/ecdsa-sig-formatter/node_modules/base64-url/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/ecdsa-sig-formatter/node_modules/base64-url/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/ecdsa-sig-formatter/node_modules/base64-url/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/ecdsa-sig-formatter/node_modules/base64-url/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/ecdsa-sig-formatter/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/node_modules/jwa/test/jwa.test.js create mode 100644 node_modules/jsonwebtoken/node_modules/jws/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/jws/readme.md create mode 100644 node_modules/jsonwebtoken/node_modules/jws/test/data.txt create mode 100644 node_modules/jsonwebtoken/node_modules/jws/test/jws.test.js create mode 100644 node_modules/jsonwebtoken/node_modules/ms/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/ms/History.md create mode 100644 node_modules/jsonwebtoken/node_modules/ms/LICENSE create mode 100644 node_modules/jsonwebtoken/node_modules/ms/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/ms/index.js create mode 100644 node_modules/jsonwebtoken/node_modules/ms/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/xtend/.jshintrc create mode 100644 node_modules/jsonwebtoken/node_modules/xtend/.npmignore create mode 100644 node_modules/jsonwebtoken/node_modules/xtend/LICENCE create mode 100644 node_modules/jsonwebtoken/node_modules/xtend/Makefile create mode 100644 node_modules/jsonwebtoken/node_modules/xtend/README.md create mode 100644 node_modules/jsonwebtoken/node_modules/xtend/immutable.js create mode 100644 node_modules/jsonwebtoken/node_modules/xtend/mutable.js create mode 100644 node_modules/jsonwebtoken/node_modules/xtend/package.json create mode 100644 node_modules/jsonwebtoken/node_modules/xtend/test.js create mode 100644 node_modules/jsonwebtoken/package.json create mode 100644 node_modules/jsonwebtoken/sign.js create mode 100644 node_modules/jsonwebtoken/test/async_sign.tests.js create mode 100644 node_modules/jsonwebtoken/test/buffer.tests.js create mode 100644 node_modules/jsonwebtoken/test/encoding.tests.js create mode 100644 node_modules/jsonwebtoken/test/expires_format.tests.js create mode 100644 node_modules/jsonwebtoken/test/iat.tests.js create mode 100644 node_modules/jsonwebtoken/test/invalid_exp.tests.js create mode 100644 node_modules/jsonwebtoken/test/invalid_pub.pem create mode 100644 node_modules/jsonwebtoken/test/issue_147.tests.js create mode 100644 node_modules/jsonwebtoken/test/issue_196.tests.js create mode 100644 node_modules/jsonwebtoken/test/issue_70.tests.js create mode 100644 node_modules/jsonwebtoken/test/jwt.hs.tests.js create mode 100644 node_modules/jsonwebtoken/test/jwt.rs.tests.js create mode 100644 node_modules/jsonwebtoken/test/noTimestamp.tests.js create mode 100644 node_modules/jsonwebtoken/test/non_object_values.tests.js create mode 100644 node_modules/jsonwebtoken/test/priv.pem create mode 100644 node_modules/jsonwebtoken/test/pub.pem create mode 100644 node_modules/jsonwebtoken/test/rsa-private.pem create mode 100644 node_modules/jsonwebtoken/test/rsa-public-key.pem create mode 100644 node_modules/jsonwebtoken/test/rsa-public-key.tests.js create mode 100644 node_modules/jsonwebtoken/test/rsa-public.pem create mode 100644 node_modules/jsonwebtoken/test/set_headers.tests.js create mode 100644 node_modules/jsonwebtoken/test/undefined_secretOrPublickey.tests.js create mode 100644 node_modules/jsonwebtoken/test/util/fakeDate.js create mode 100644 node_modules/jsonwebtoken/test/verify.tests.js create mode 100644 node_modules/jsonwebtoken/test/wrong_alg.tests.js create mode 100644 node_modules/jsonwebtoken/verify.js create mode 100644 node_modules/morgan/HISTORY.md create mode 100644 node_modules/morgan/LICENSE create mode 100644 node_modules/morgan/README.md create mode 100644 node_modules/morgan/index.js create mode 100644 node_modules/morgan/node_modules/basic-auth/HISTORY.md create mode 100644 node_modules/morgan/node_modules/basic-auth/LICENSE create mode 100644 node_modules/morgan/node_modules/basic-auth/README.md create mode 100644 node_modules/morgan/node_modules/basic-auth/index.js create mode 100644 node_modules/morgan/node_modules/basic-auth/package.json create mode 100644 node_modules/morgan/node_modules/debug/.jshintrc create mode 100644 node_modules/morgan/node_modules/debug/.npmignore create mode 100644 node_modules/morgan/node_modules/debug/History.md create mode 100644 node_modules/morgan/node_modules/debug/Makefile create mode 100644 node_modules/morgan/node_modules/debug/Readme.md create mode 100644 node_modules/morgan/node_modules/debug/bower.json create mode 100644 node_modules/morgan/node_modules/debug/browser.js create mode 100644 node_modules/morgan/node_modules/debug/component.json create mode 100644 node_modules/morgan/node_modules/debug/debug.js create mode 100644 node_modules/morgan/node_modules/debug/node.js create mode 100644 node_modules/morgan/node_modules/debug/node_modules/ms/.npmignore create mode 100644 node_modules/morgan/node_modules/debug/node_modules/ms/History.md create mode 100644 node_modules/morgan/node_modules/debug/node_modules/ms/LICENSE create mode 100644 node_modules/morgan/node_modules/debug/node_modules/ms/README.md create mode 100644 node_modules/morgan/node_modules/debug/node_modules/ms/index.js create mode 100644 node_modules/morgan/node_modules/debug/node_modules/ms/package.json create mode 100644 node_modules/morgan/node_modules/debug/package.json create mode 100644 node_modules/morgan/node_modules/depd/History.md create mode 100644 node_modules/morgan/node_modules/depd/LICENSE create mode 100644 node_modules/morgan/node_modules/depd/Readme.md create mode 100644 node_modules/morgan/node_modules/depd/index.js create mode 100644 node_modules/morgan/node_modules/depd/lib/browser/index.js create mode 100644 node_modules/morgan/node_modules/depd/lib/compat/buffer-concat.js create mode 100644 node_modules/morgan/node_modules/depd/lib/compat/callsite-tostring.js create mode 100644 node_modules/morgan/node_modules/depd/lib/compat/event-listener-count.js create mode 100644 node_modules/morgan/node_modules/depd/lib/compat/index.js create mode 100644 node_modules/morgan/node_modules/depd/package.json create mode 100644 node_modules/morgan/node_modules/on-finished/HISTORY.md create mode 100644 node_modules/morgan/node_modules/on-finished/LICENSE create mode 100644 node_modules/morgan/node_modules/on-finished/README.md create mode 100644 node_modules/morgan/node_modules/on-finished/index.js create mode 100644 node_modules/morgan/node_modules/on-finished/node_modules/ee-first/LICENSE create mode 100644 node_modules/morgan/node_modules/on-finished/node_modules/ee-first/README.md create mode 100644 node_modules/morgan/node_modules/on-finished/node_modules/ee-first/index.js create mode 100644 node_modules/morgan/node_modules/on-finished/node_modules/ee-first/package.json create mode 100644 node_modules/morgan/node_modules/on-finished/package.json create mode 100644 node_modules/morgan/node_modules/on-headers/HISTORY.md create mode 100644 node_modules/morgan/node_modules/on-headers/LICENSE create mode 100644 node_modules/morgan/node_modules/on-headers/README.md create mode 100644 node_modules/morgan/node_modules/on-headers/index.js create mode 100644 node_modules/morgan/node_modules/on-headers/package.json create mode 100644 node_modules/morgan/package.json diff --git a/README.md b/README.md index 1c853f2..13db749 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ # thoughts micro blogging platform (server api + client side) fullstack + +MEAN fullstack +backend: nodejs + express + mongodb +frontend: javascript + angular + bootstrap diff --git a/config.js b/config.js new file mode 100644 index 0000000..f4acdd6 --- /dev/null +++ b/config.js @@ -0,0 +1,6 @@ +module.exports = { + + 'secret': 'secretfortoken', + 'database': 'mongodb://localhost/thoughts' + +}; diff --git a/controllers/userController.js b/controllers/userController.js index 1e8ae03..c48db23 100644 --- a/controllers/userController.js +++ b/controllers/userController.js @@ -2,6 +2,14 @@ var mongoose = require('mongoose'); var userModel = mongoose.model('userModel'); +/* */ +var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens +var express = require("express"); +var app = express(); +var config = require('../config'); // get our config file +app.set('superSecret', config.secret); // secret variable +/* */ + //GET - Return all tvshows in the DB exports.findAllUsers = function(req, res) { userModel.find(function(err, users) { @@ -29,9 +37,11 @@ exports.addUser = function(req, res) { var user = new userModel({ username: req.body.username, + password: req.body.password, description: req.body.description, icon: req.body.icon, - mail: req.body.mail + mail: req.body.mail, + admin: req.body.admin }); user.save(function(err, user) { @@ -68,3 +78,42 @@ exports.deleteActivity = function(req, res) { }) }); }; + + +//POST - auth user +exports.login = function(req, res) { + // find the user + userModel.findOne({ + username: req.body.username + }, function(err, user) { + + if (err) throw err; + + if (!user) { + res.json({ success: false, message: 'Authentication failed. User not found.' }); + } else if (user) { + + // check if password matches + if (user.password != req.body.password) { + res.json({ success: false, message: 'Authentication failed. Wrong password.' }); + } else { + + // if user is found and password is right + // create a token + var token = jwt.sign(user, app.get('superSecret'), { + //expiresInMinutes: 1440 // expires in 24 hours + expiresIn: '10m' + }); + + // return the information including token as JSON + res.json({ + success: true, + message: 'Enjoy your token!', + token: token + }); + } + + } + + }); +}; diff --git a/models/userModel.js b/models/userModel.js index cf961f1..d66979d 100644 --- a/models/userModel.js +++ b/models/userModel.js @@ -15,8 +15,10 @@ var mongoose = require('mongoose'), var userSchema = new Schema({ username: { type: String }, + password: { type: String }, description: { type: String }, icon: { type: String }, - mail: { type: String } + mail: { type: String }, + admin: { type: Boolean } }) module.exports = mongoose.model('userModel', userSchema); diff --git a/node_modules/body-parser/node_modules/iconv-lite/package.json b/node_modules/body-parser/node_modules/iconv-lite/package.json index fd96413..6e72175 100644 --- a/node_modules/body-parser/node_modules/iconv-lite/package.json +++ b/node_modules/body-parser/node_modules/iconv-lite/package.json @@ -114,6 +114,5 @@ "tarball": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" } diff --git a/node_modules/express/node_modules/fresh/package.json b/node_modules/express/node_modules/fresh/package.json index f0e476b..c0fc622 100644 --- a/node_modules/express/node_modules/fresh/package.json +++ b/node_modules/express/node_modules/fresh/package.json @@ -27,7 +27,7 @@ ], "repository": { "type": "git", - "url": "https://github.com/jshttp/fresh" + "url": "git+https://github.com/jshttp/fresh.git" }, "devDependencies": { "istanbul": "0.3.9", @@ -82,5 +82,6 @@ "tarball": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" + "_resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/jsonwebtoken/.jshintrc b/node_modules/jsonwebtoken/.jshintrc new file mode 100644 index 0000000..2c03a0a --- /dev/null +++ b/node_modules/jsonwebtoken/.jshintrc @@ -0,0 +1,22 @@ +{ + "evil": true, + "regexdash": true, + "browser": true, + "wsh": true, + "trailing": true, + "sub": true, + "unused": true, + "undef": true, + "laxcomma": true, + "node": true, + "browser": false, + "esnext": true, + "globals": { + "describe": true, + "it": true, + "require": true, + "atob": false, + "escape": true, + "before": true + } +} \ No newline at end of file diff --git a/node_modules/jsonwebtoken/.npmignore b/node_modules/jsonwebtoken/.npmignore new file mode 100644 index 0000000..28f1ba7 --- /dev/null +++ b/node_modules/jsonwebtoken/.npmignore @@ -0,0 +1,2 @@ +node_modules +.DS_Store \ No newline at end of file diff --git a/node_modules/jsonwebtoken/.travis.yml b/node_modules/jsonwebtoken/.travis.yml new file mode 100644 index 0000000..86099fb --- /dev/null +++ b/node_modules/jsonwebtoken/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +before_install: npm i -g npm@1.4.28 +node_js: + - "5" + - "4" + - "0.12" diff --git a/node_modules/jsonwebtoken/CHANGELOG.md b/node_modules/jsonwebtoken/CHANGELOG.md new file mode 100644 index 0000000..d175213 --- /dev/null +++ b/node_modules/jsonwebtoken/CHANGELOG.md @@ -0,0 +1,266 @@ +# Change Log + + +All notable changes to this project will be documented in this file starting from version **v4.0.0**. +This project adheres to [Semantic Versioning](http://semver.org/). + +## 7.1.2 - 2016-07-12 + + - do not stringify the payload when signing async - closes #224 ([084f537d3dfbcef2bea411cc0a1515899cc8aa21](https://github.com/auth0/node-jsonwebtoken/commit/084f537d3dfbcef2bea411cc0a1515899cc8aa21)), closes [#224](https://github.com/auth0/node-jsonwebtoken/issues/224) + +## 7.1.1 - 2016-07-12 + + - do not mutate options in jwt.verify, closes #227 ([63263a28a268624dab0927b9ad86fffa44a10f84](https://github.com/auth0/node-jsonwebtoken/commit/63263a28a268624dab0927b9ad86fffa44a10f84)), closes [#227](https://github.com/auth0/node-jsonwebtoken/issues/227) + - refactor into multiple files ([e11d505207fa33501298300c9accbfb809d8748d](https://github.com/auth0/node-jsonwebtoken/commit/e11d505207fa33501298300c9accbfb809d8748d)) + +## 7.1.0 - 2016-07-12 + + - Exp calculated based on iat. fix #217 ([757a16e0e35ad19f9e456820f55d5d9f3fc76aee](https://github.com/auth0/node-jsonwebtoken/commit/757a16e0e35ad19f9e456820f55d5d9f3fc76aee)), closes [#217](https://github.com/auth0/node-jsonwebtoken/issues/217) + +## 7.0.0 - 2016-05-19 + + - change jwt.sign to return errors on callback instead of throwing errors ([1e46c5a42aa3dab8478efa4081d8f8f5c5485d56](https://github.com/auth0/node-jsonwebtoken/commit/1e46c5a42aa3dab8478efa4081d8f8f5c5485d56)) + +## 6.2.0 - 2016-04-29 + + - add support for `options.clockTolerance` to `jwt.verify` ([65ddea934f226bf06bc9d6a55be9587515cfc38d](https://github.com/auth0/node-jsonwebtoken/commit/65ddea934f226bf06bc9d6a55be9587515cfc38d)) + +## 6.1.2 - 2016-04-29 + + - fix sign method for node.js 0.12. closes #193 ([9c38374142d3929be3c9314b5e9bc5d963c5955f](https://github.com/auth0/node-jsonwebtoken/commit/9c38374142d3929be3c9314b5e9bc5d963c5955f)), closes [#193](https://github.com/auth0/node-jsonwebtoken/issues/193) + - improve async test ([7b0981380ddc40a5f1208df520631785b5ffb85a](https://github.com/auth0/node-jsonwebtoken/commit/7b0981380ddc40a5f1208df520631785b5ffb85a)) + +## 6.1.0 - 2016-04-27 + + - verify unsigned tokens ([ec880791c10ed5ef7c8df7bf28ebb95c810479ed](https://github.com/auth0/node-jsonwebtoken/commit/ec880791c10ed5ef7c8df7bf28ebb95c810479ed)) + +## 6.0.1 - 2016-04-27 + +This was an immediate change after publishing 6.0.0. + + - throw error on invalid options when the payload is not an object ([304f1b33075f79ed66f784e27dc4f5307aa39e27](https://github.com/auth0/node-jsonwebtoken/commit/304f1b33075f79ed66f784e27dc4f5307aa39e27)) + +## 6.0.0 - 2016-04-27 + + - Change .sign to standard async callback ([50873c7d45d2733244d5da8afef3d1872e657a60](https://github.com/auth0/node-jsonwebtoken/commit/50873c7d45d2733244d5da8afef3d1872e657a60)) + - Improved the options for the `sign` method ([53c3987b3cc34e95eb396b26fc9b051276e2f6f9](https://github.com/auth0/node-jsonwebtoken/commit/53c3987b3cc34e95eb396b26fc9b051276e2f6f9)) + + - throw error on invalid options like `expiresIn` when the payload is not an object ([304f1b33075f79ed66f784e27dc4f5307aa39e27](https://github.com/auth0/node-jsonwebtoken/commit/304f1b33075f79ed66f784e27dc4f5307aa39e27)) + - `expiresInMinutes` and `expiresInSeconds` are deprecated and no longer supported. + - `notBeforeInMinutes` and `notBeforeInSeconds` are deprecated and no longer supported. + - `options` are strongly validated. + - `options.expiresIn`, `options.notBefore`, `options.audience`, `options.issuer`, `options.subject` and `options.jwtid` are mutually exclusive with `payload.exp`, `payload.nbf`, `payload.aud`, `payload.iss` + - `options.algorithm` is properly validated. + - `options.headers` is renamed to `options.header`. + + - update CHANGELOG to reflect most of the changes. closes #136 ([b87a1a8d2e2533fbfab518765a54f00077918eb7](https://github.com/auth0/node-jsonwebtoken/commit/b87a1a8d2e2533fbfab518765a54f00077918eb7)), closes [#136](https://github.com/auth0/node-jsonwebtoken/issues/136) + - update readme ([53a88ecf4494e30e1d62a1cf3cc354650349f486](https://github.com/auth0/node-jsonwebtoken/commit/53a88ecf4494e30e1d62a1cf3cc354650349f486)) + +## 5.7.0 - 2016-02-16 + + + - add support for validating multiples issuers. closes #163 ([39d9309ae05648dbd72e5fd1993df064ad0e8fa5](https://github.com/auth0/node-jsonwebtoken/commit/39d9309ae05648dbd72e5fd1993df064ad0e8fa5)), closes [#163](https://github.com/auth0/node-jsonwebtoken/issues/163) + + +## 5.6.1 - 2016-02-16 + + + - 5.6.1 ([06d8209d499dbc9a8dd978ab6cbb9c6818fde203](https://github.com/auth0/node-jsonwebtoken/commit/06d8209d499dbc9a8dd978ab6cbb9c6818fde203)) + - fix wrong error when setting expiration on non-object payload. closes #153 ([7f7d76edfd918d6afc7c7cead888caa42ccaceb4](https://github.com/auth0/node-jsonwebtoken/commit/7f7d76edfd918d6afc7c7cead888caa42ccaceb4)), closes [#153](https://github.com/auth0/node-jsonwebtoken/issues/153) + + + +## 5.6.0 - 2016-02-16 + + + - added missing validations of sub and jti ([a1affe960d0fc52e9042bcbdedb65734f8855580](https://github.com/auth0/node-jsonwebtoken/commit/a1affe960d0fc52e9042bcbdedb65734f8855580)) + - Fix tests in jwt.rs.tests.js which causes 4 to fail ([8aedf2b1f575b0d9575c1fc9f2ac7bc868f75ff1](https://github.com/auth0/node-jsonwebtoken/commit/8aedf2b1f575b0d9575c1fc9f2ac7bc868f75ff1)) + - Update README.md ([349b7cd00229789b138928ca060d3ef015aedaf9](https://github.com/auth0/node-jsonwebtoken/commit/349b7cd00229789b138928ca060d3ef015aedaf9)) + + + +## 5.5.4 - 2016-01-04 + + + - minor ([46552e7c45025c76e3f647680d7539a66bfac612](https://github.com/auth0/node-jsonwebtoken/commit/46552e7c45025c76e3f647680d7539a66bfac612)) + + + +## 5.5.3 - 2016-01-04 + + + - add a console.warn on invalid options for string payloads ([71200f14deba0533d3261266348338fac2d14661](https://github.com/auth0/node-jsonwebtoken/commit/71200f14deba0533d3261266348338fac2d14661)) + - minor ([65b1f580382dc58dd3da6f47a52713776fd7cdf2](https://github.com/auth0/node-jsonwebtoken/commit/65b1f580382dc58dd3da6f47a52713776fd7cdf2)) + + + +## 5.5.2 - 2016-01-04 + + + - fix signing method with sealed objects, do not modify the params object. closes #147 ([be9c09af83b09c9e72da8b2c6166fa51d92aeab6](https://github.com/auth0/node-jsonwebtoken/commit/be9c09af83b09c9e72da8b2c6166fa51d92aeab6)), closes [#147](https://github.com/auth0/node-jsonwebtoken/issues/147) + + + +## 5.5.1 - 2016-01-04 + + + - fix nbf verification. fix #152 ([786d37b299c67771b5e71a2ca476666ab0f97d98](https://github.com/auth0/node-jsonwebtoken/commit/786d37b299c67771b5e71a2ca476666ab0f97d98)), closes [#152](https://github.com/auth0/node-jsonwebtoken/issues/152) + + + +## 5.5.0 - 2015-12-28 + + + - improvements to nbf and jti claims ([46372e928f6d2e7398f9b88022ca617d2a3b0699](https://github.com/auth0/node-jsonwebtoken/commit/46372e928f6d2e7398f9b88022ca617d2a3b0699)) + - Remove duplicate payload line (fix bug in IE strict mode) ([8163d698e0c5ad8c44817a5dcd42a15d7e9c6bc8](https://github.com/auth0/node-jsonwebtoken/commit/8163d698e0c5ad8c44817a5dcd42a15d7e9c6bc8)) + - Remove duplicate require('ms') line ([7c00bcbcbf8f7503a1070b394a165eccd41de66f](https://github.com/auth0/node-jsonwebtoken/commit/7c00bcbcbf8f7503a1070b394a165eccd41de66f)) + - Update README to reflect addition of async sign ([d661d4b6f68eb417834c99b36769444723041ccf](https://github.com/auth0/node-jsonwebtoken/commit/d661d4b6f68eb417834c99b36769444723041ccf)) + + + +## 5.4.0 - 2015-10-02 + + + - deprecate expireInMinutes and expireInSeconds - in favor of expiresIn ([39ecc6f8f310f8462e082f1d53de0b4222b29b6f](https://github.com/auth0/node-jsonwebtoken/commit/39ecc6f8f310f8462e082f1d53de0b4222b29b6f)) + + +## 5.3.0 - 2015-10-02 + + + - 5.3.0 ([5d559ced3fbf10c1adae2e5792deda06ea89bcd3](https://github.com/auth0/node-jsonwebtoken/commit/5d559ced3fbf10c1adae2e5792deda06ea89bcd3)) + - minor ([6e81ff87a3799b0e56db09cbae42a97e784716c4](https://github.com/auth0/node-jsonwebtoken/commit/6e81ff87a3799b0e56db09cbae42a97e784716c4)) + + + +## 5.1.0 - 2015-10-02 + + + - added async signing ([9414fbcb15a1f9cf4fe147d070e9424c547dabba](https://github.com/auth0/node-jsonwebtoken/commit/9414fbcb15a1f9cf4fe147d070e9424c547dabba)) + - Update README.md ([40b2aaaa843442dfb8ee7b574f0a788177e7c904](https://github.com/auth0/node-jsonwebtoken/commit/40b2aaaa843442dfb8ee7b574f0a788177e7c904)) + + + +## 5.0.5 - 2015-08-19 + + + - add ms dep to package.json ([f13b3fb7f29dff787e7c91ebe2eb5adeeb05f251](https://github.com/auth0/node-jsonwebtoken/commit/f13b3fb7f29dff787e7c91ebe2eb5adeeb05f251)) + - add note to explain, related to #96 #101 #6 ([dd8969e0e6ed0bcb9cae905d2b1a96476bd85da3](https://github.com/auth0/node-jsonwebtoken/commit/dd8969e0e6ed0bcb9cae905d2b1a96476bd85da3)) + - add tests for options.headers ([7787dd74e705787c39a871ca29c75a2e0a3948ac](https://github.com/auth0/node-jsonwebtoken/commit/7787dd74e705787c39a871ca29c75a2e0a3948ac)) + - add tests for verify expires ([d7c5793d98c300603440ab460c11665f661ad3a0](https://github.com/auth0/node-jsonwebtoken/commit/d7c5793d98c300603440ab460c11665f661ad3a0)) + - add verify option maxAge (with tests) ([49d54e54f7e70b1c53a2e4ee67e116c907d75319](https://github.com/auth0/node-jsonwebtoken/commit/49d54e54f7e70b1c53a2e4ee67e116c907d75319)) + - fix spelling error in error message ([8078b11b224fa05ac9003ca5aa2c85e9f0128cfb](https://github.com/auth0/node-jsonwebtoken/commit/8078b11b224fa05ac9003ca5aa2c85e9f0128cfb)) + - Fix typo options.header is not a documented option + ([5feaa5b962ccbddeff054817a410f7b0c1e6ce7f](https://github.com/auth0/node-jsonwebtoken/commit/5feaa5b962ccbddeff054817a410f7b0c1e6ce7f)) + - update JWT spec link. closes #112 ([f5fa50f797456a12240589161835c7ea30807195](https://github.com/auth0/node-jsonwebtoken/commit/f5fa50f797456a12240589161835c7ea30807195)), closes [#112](https://github.com/auth0/node-jsonwebtoken/issues/112) + + +## 5.0.3 - 2015-07-15 + + - Added nbf support ([f26ba4e2fa197a20497632b63ffcd13ae93aacc4](https://github.com/auth0/node-jsonwebtoken/commit/f26ba4e2fa197a20497632b63ffcd13ae93aacc4)) + - Added support for subject and jwt id ([ab76ec5bc554e2d1e25376ddb7cea711d86af651](https://github.com/auth0/node-jsonwebtoken/commit/ab76ec5bc554e2d1e25376ddb7cea711d86af651)) + - Fix `this` referring to the global object instead of `module.exports` in `verify()` ([93f554312e37129027fcf4916f48cb8d1b53588c](https://github.com/auth0/node-jsonwebtoken/commit/93f554312e37129027fcf4916f48cb8d1b53588c)) + - Fix typo, line 139 README, complete option for .decode. ([59c110aeb8c7c1847ef2ffd77702d13627c89e10](https://github.com/auth0/node-jsonwebtoken/commit/59c110aeb8c7c1847ef2ffd77702d13627c89e10)) + - minor ([61ff1172272b582902313e958058ff22413494af](https://github.com/auth0/node-jsonwebtoken/commit/61ff1172272b582902313e958058ff22413494af)) + + + +## 5.0.2 - 2015-06-15 + + + - fix typo in docs . closes #86 ([3d3413221f36acef4dfd1cbed87f1f3565cd6f84](https://github.com/auth0/node-jsonwebtoken/commit/3d3413221f36acef4dfd1cbed87f1f3565cd6f84)), closes [#86](https://github.com/auth0/node-jsonwebtoken/issues/86) + + + +## 5.0.1 - 2015-05-15 + + + - Add option to return header and payload when decoding. ([7254e011b59f892d1947e6c11819281adac7069d](https://github.com/auth0/node-jsonwebtoken/commit/7254e011b59f892d1947e6c11819281adac7069d)) + - Avoid uncaught "SyntaxError: Unexpected token ͧ" error. ([0dc59cd6ee15d83a606acffa7909ee76176ae186](https://github.com/auth0/node-jsonwebtoken/commit/0dc59cd6ee15d83a606acffa7909ee76176ae186)) + - Document complete option in README. ([ec32b20241a74d9681ea26e1a7024b4642468c00](https://github.com/auth0/node-jsonwebtoken/commit/ec32b20241a74d9681ea26e1a7024b4642468c00)) + - Fix example in README, silence verbose logging. ([ba3174d10033c41e9c211a38f1cc67f74fbd7f69](https://github.com/auth0/node-jsonwebtoken/commit/ba3174d10033c41e9c211a38f1cc67f74fbd7f69)) + - Fix link to auth0.com in README ([1b3c5ff72c9bc25e9271646e679f3080f2a042a0](https://github.com/auth0/node-jsonwebtoken/commit/1b3c5ff72c9bc25e9271646e679f3080f2a042a0)) + - Immediate return if not decoded. ([851bda2b10168f3269c3da6e74d310742f31a193](https://github.com/auth0/node-jsonwebtoken/commit/851bda2b10168f3269c3da6e74d310742f31a193)) + - Prevent throw on undefined/null secret ([0fdf78d4dbf609455f3277d6169a987aef0384d4](https://github.com/auth0/node-jsonwebtoken/commit/0fdf78d4dbf609455f3277d6169a987aef0384d4)) + - Removed path from test ([d6240e24186732d368bffe21143becf44c38f0d6](https://github.com/auth0/node-jsonwebtoken/commit/d6240e24186732d368bffe21143becf44c38f0d6)) + - Simplified checking for missing key ([f1cffd033bffc44f20558eda4a797c3fa2f4ee05](https://github.com/auth0/node-jsonwebtoken/commit/f1cffd033bffc44f20558eda4a797c3fa2f4ee05)) + - Typo ([ffe68dbe0219bab535c1018448eb4c0b22f1f902](https://github.com/auth0/node-jsonwebtoken/commit/ffe68dbe0219bab535c1018448eb4c0b22f1f902)) + - Update CHANGELOG.md ([927cce0dad1bc9aad75aeef53e276cf4cfc0d776](https://github.com/auth0/node-jsonwebtoken/commit/927cce0dad1bc9aad75aeef53e276cf4cfc0d776)) + - Update CHANGELOG.md ([6879e0fdde222995c70a3a69a4af94993d9c667e](https://github.com/auth0/node-jsonwebtoken/commit/6879e0fdde222995c70a3a69a4af94993d9c667e)) + - Update CHANGELOG.md ([c5596c10e8705727fa13e0394184a606083078bc](https://github.com/auth0/node-jsonwebtoken/commit/c5596c10e8705727fa13e0394184a606083078bc)) + - Update CHANGELOG.md ([07541f0315f26d179e1cde92732b6124d6869b6f](https://github.com/auth0/node-jsonwebtoken/commit/07541f0315f26d179e1cde92732b6124d6869b6f)) + - Update CHANGELOG.md ([e6465d48ddd1dc2c3297229b28c78fd5490a2ba9](https://github.com/auth0/node-jsonwebtoken/commit/e6465d48ddd1dc2c3297229b28c78fd5490a2ba9)) + +## [5.0.0] - 2015-04-11 + +### Changed + + - [sign] Only set defautl `iat` if the user does not specify that argument. + + https://github.com/auth0/node-jsonwebtoken/commit/e900282a8d2dff1d4dec815f7e6aa7782e867d91 + https://github.com/auth0/node-jsonwebtoken/commit/35036b188b4ee6b42df553bbb93bc8a6b19eae9d + https://github.com/auth0/node-jsonwebtoken/commit/954bd7a312934f03036b6bb6f00edd41f29e54d9 + https://github.com/auth0/node-jsonwebtoken/commit/24a370080e0b75f11d4717cd2b11b2949d95fc2e + https://github.com/auth0/node-jsonwebtoken/commit/a77df6d49d4ec688dfd0a1cc723586bffe753516 + +### Security + + - [verify] Update to jws@^3.0.0 and renaming `header.alg` mismatch exception to `invalid algorithm` and adding more mismatch tests. + + As `jws@3.0.0` changed the verify method signature to be `jws.verify(signature, algorithm, secretOrKey)`, the token header must be decoded first in order to make sure that the `alg` field matches one of the allowed `options.algorithms`. After that, the now validated `header.alg` is passed to `jws.verify` + + As the order of steps has changed, the error that was thrown when the JWT was invalid is no longer the `jws` one: + ``` + { [Error: Invalid token: no header in signature 'a.b.c'] code: 'MISSING_HEADER', signature: 'a.b.c' } + ``` + + That old error (removed from jws) has been replaced by a `JsonWebTokenError` with message `invalid token`. + + > Important: versions >= 4.2.2 this library are safe to use but we decided to deprecate everything `< 5.0.0` to prevent security warnings from library `node-jws` when doing `npm install`. + + https://github.com/auth0/node-jsonwebtoken/commit/634b8ed0ff5267dc25da5c808634208af109824e + https://github.com/auth0/node-jsonwebtoken/commit/9f24ffd5791febb449d4d03ff58d7807da9b9b7e + https://github.com/auth0/node-jsonwebtoken/commit/19e6cc6a1f2fd90356f89b074223b9665f2aa8a2 + https://github.com/auth0/node-jsonwebtoken/commit/1e4623420159c6410616f02a44ed240f176287a9 + https://github.com/auth0/node-jsonwebtoken/commit/954bd7a312934f03036b6bb6f00edd41f29e54d9 + https://github.com/auth0/node-jsonwebtoken/commit/24a370080e0b75f11d4717cd2b11b2949d95fc2e + https://github.com/auth0/node-jsonwebtoken/commit/a77df6d49d4ec688dfd0a1cc723586bffe753516 + +## [4.2.2] - 2015-03-26 +### Fixed + + - [asymmetric-keys] Fix verify for RSAPublicKey formated keys (`jfromaniello - awlayton`) + https://github.com/auth0/node-jsonwebtoken/commit/402794663b9521bf602fcc6f2e811e7d3912f9dc + https://github.com/auth0/node-jsonwebtoken/commit/8df6aabbc7e1114c8fb3917931078254eb52c222 + +## [4.2.1] - 2015-03-17 +### Fixed + + - [asymmetric-keys] Fixed issue when public key starts with BEING PUBLIC KEY (https://github.com/auth0/node-jsonwebtoken/issues/70) (`jfromaniello`) + https://github.com/auth0/node-jsonwebtoken/commit/7017e74db9b194448ff488b3e16468ada60c4ee5 + +## [4.2.0] - 2015-03-16 +### Security + + - [asymmetric-keys] Making sure a token signed with an asymmetric key will be verified using a asymmetric key. + When the verification part was expecting a token digitally signed with an asymmetric key (RS/ES family) of algorithms an attacker could send a token signed with a symmetric algorithm (HS* family). + + The issue was caused because the same signature was used to verify both type of tokens (`verify` method parameter: `secretOrPublicKey`). + + This change adds a new parameter to the verify called `algorithms`. This can be used to specify a list of supported algorithms, but the default value depends on the secret used: if the secretOrPublicKey contains the string `BEGIN CERTIFICATE` the default is `[ 'RS256','RS384','RS512','ES256','ES384','ES512' ]` otherwise is `[ 'HS256','HS384','HS512' ]`. (`jfromaniello`) + https://github.com/auth0/node-jsonwebtoken/commit/c2bf7b2cd7e8daf66298c2d168a008690bc4bdd3 + https://github.com/auth0/node-jsonwebtoken/commit/1bb584bc382295eeb7ee8c4452a673a77a68b687 + +## [4.1.0] - 2015-03-10 +### Changed +- Assume the payload is JSON even when there is no `typ` property. [5290db1](https://github.com/auth0/node-jsonwebtoken/commit/5290db1bd74f74cd38c90b19e2355ef223a4d931) + +## [4.0.0] - 2015-03-06 +### Changed +- The default encoding is now utf8 instead of binary. [92d33bd](https://github.com/auth0/node-jsonwebtoken/commit/92d33bd99a3416e9e5a8897d9ad8ff7d70a00bfd) +- Add `encoding` as a new option to `sign`. [1fc385e](https://github.com/auth0/node-jsonwebtoken/commit/1fc385ee10bd0018cd1441552dce6c2e5a16375f) +- Add `ignoreExpiration` to `verify`. [8d4da27](https://github.com/auth0/node-jsonwebtoken/commit/8d4da279e1b351ac71ace276285c9255186d549f) +- Add `expiresInSeconds` to `sign`. [dd156cc](https://github.com/auth0/node-jsonwebtoken/commit/dd156cc30f17028744e60aec0502897e34609329) + +### Fixed +- Fix wrong error message when the audience doesn't match. [44e3c8d](https://github.com/auth0/node-jsonwebtoken/commit/44e3c8d757e6b4e2a57a69a035f26b4abec3e327) +- Fix wrong error message when the issuer doesn't match. [44e3c8d](https://github.com/auth0/node-jsonwebtoken/commit/44e3c8d757e6b4e2a57a69a035f26b4abec3e327) +- Fix wrong `iat` and `exp` values when signing with `noTimestamp`. [331b7bc](https://github.com/auth0/node-jsonwebtoken/commit/331b7bc9cc335561f8806f2c4558e105cb53e0a6) diff --git a/node_modules/jsonwebtoken/LICENSE b/node_modules/jsonwebtoken/LICENSE new file mode 100644 index 0000000..bcd1854 --- /dev/null +++ b/node_modules/jsonwebtoken/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Auth0, Inc. (http://auth0.com) + +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. diff --git a/node_modules/jsonwebtoken/README.md b/node_modules/jsonwebtoken/README.md new file mode 100644 index 0000000..d597665 --- /dev/null +++ b/node_modules/jsonwebtoken/README.md @@ -0,0 +1,260 @@ +# jsonwebtoken [![Build Status](https://secure.travis-ci.org/auth0/node-jsonwebtoken.svg?branch=master)](http://travis-ci.org/auth0/node-jsonwebtoken)[![Dependency Status](https://david-dm.org/auth0/node-jsonwebtoken.svg)](https://david-dm.org/auth0/node-jsonwebtoken) + + +An implementation of [JSON Web Tokens](https://tools.ietf.org/html/rfc7519). + +This was developed against `draft-ietf-oauth-json-web-token-08`. It makes use of [node-jws](https://github.com/brianloveswords/node-jws) + +# Install + +```bash +$ npm install jsonwebtoken +``` + +# Usage + +### jwt.sign(payload, secretOrPrivateKey, options, [callback]) + +(Asynchronous) If a callback is supplied, callback is called with the `err` or the JWT. + +(Synchronous) Returns the JsonWebToken as string + +`payload` could be an object literal, buffer or string. *Please note that* `exp` is only set if the payload is an object literal. + +`secretOrPrivateKey` is a string or buffer containing either the secret for HMAC algorithms, or the PEM +encoded private key for RSA and ECDSA. + +`options`: + +* `algorithm` (default: `HS256`) +* `expiresIn`: expressed in seconds or a string describing a time span [rauchg/ms](https://github.com/rauchg/ms.js). Eg: `60`, `"2 days"`, `"10h"`, `"7d"` +* `notBefore`: expressed in seconds or a string describing a time span [rauchg/ms](https://github.com/rauchg/ms.js). Eg: `60`, `"2 days"`, `"10h"`, `"7d"` +* `audience` +* `issuer` +* `jwtid` +* `subject` +* `noTimestamp` +* `header` + +If `payload` is not a buffer or a string, it will be coerced into a string using `JSON.stringify`. + +There are no default values for `expiresIn`, `notBefore`, `audience`, `subject`, `issuer`. These claims can also be provided in the payload directly with `exp`, `nbf`, `aud` and `sub` respectively, but you can't include in both places. + + +The header can be customized via the `option.header` object. + +Generated jwts will include an `iat` (issued at) claim by default unless `noTimestamp` is specified. If `iat` is inserted in the payload, it will be used instead of the real timestamp for calculating other things like `exp` given a timespan in `options.expiresIn`. + +Example + +```js +// sign with default (HMAC SHA256) +var jwt = require('jsonwebtoken'); +var token = jwt.sign({ foo: 'bar' }, 'shhhhh'); +//backdate a jwt 30 seconds +var older_token = jwt.sign({ foo: 'bar', iat: Math.floor(Date.now() / 1000) - 30 }, 'shhhhh'); + +// sign with RSA SHA256 +var cert = fs.readFileSync('private.key'); // get private key +var token = jwt.sign({ foo: 'bar' }, cert, { algorithm: 'RS256'}); + +// sign asynchronously +jwt.sign({ foo: 'bar' }, cert, { algorithm: 'RS256' }, function(err, token) { + console.log(token); +}); +``` + +### jwt.verify(token, secretOrPublicKey, [options, callback]) + +(Asynchronous) If a callback is supplied, function acts asynchronously. Callback passed the payload decoded if the signature (and optionally expiration, audience, issuer) are valid. If not, it will be passed the error. + +(Synchronous) If a callback is not supplied, function acts synchronously. Returns the payload decoded if the signature (and optionally expiration, audience, issuer) are valid. If not, it will throw the error. + +`token` is the JsonWebToken string + +`secretOrPublicKey` is a string or buffer containing either the secret for HMAC algorithms, or the PEM +encoded public key for RSA and ECDSA. + +`options` + +* `algorithms`: List of strings with the names of the allowed algorithms. For instance, `["HS256", "HS384"]`. +* `audience`: if you want to check audience (`aud`), provide a value here +* `issuer` (optional): string or array of strings of valid values for the `iss` field. +* `ignoreExpiration`: if `true` do not validate the expiration of the token. +* `ignoreNotBefore`... +* `subject`: if you want to check subject (`sub`), provide a value here +* `clockTolerance`: number of second to tolerate when checking the `nbf` and `exp` claims, to deal with small clock differences among different servers + + +```js +// verify a token symmetric - synchronous +var decoded = jwt.verify(token, 'shhhhh'); +console.log(decoded.foo) // bar + +// verify a token symmetric +jwt.verify(token, 'shhhhh', function(err, decoded) { + console.log(decoded.foo) // bar +}); + +// invalid token - synchronous +try { + var decoded = jwt.verify(token, 'wrong-secret'); +} catch(err) { + // err +} + +// invalid token +jwt.verify(token, 'wrong-secret', function(err, decoded) { + // err + // decoded undefined +}); + +// verify a token asymmetric +var cert = fs.readFileSync('public.pem'); // get public key +jwt.verify(token, cert, function(err, decoded) { + console.log(decoded.foo) // bar +}); + +// verify audience +var cert = fs.readFileSync('public.pem'); // get public key +jwt.verify(token, cert, { audience: 'urn:foo' }, function(err, decoded) { + // if audience mismatch, err == invalid audience +}); + +// verify issuer +var cert = fs.readFileSync('public.pem'); // get public key +jwt.verify(token, cert, { audience: 'urn:foo', issuer: 'urn:issuer' }, function(err, decoded) { + // if issuer mismatch, err == invalid issuer +}); + +// verify jwt id +var cert = fs.readFileSync('public.pem'); // get public key +jwt.verify(token, cert, { audience: 'urn:foo', issuer: 'urn:issuer', jwtid: 'jwtid' }, function(err, decoded) { + // if jwt id mismatch, err == invalid jwt id +}); + +// verify subject +var cert = fs.readFileSync('public.pem'); // get public key +jwt.verify(token, cert, { audience: 'urn:foo', issuer: 'urn:issuer', jwtid: 'jwtid', subject: 'subject' }, function(err, decoded) { + // if subject mismatch, err == invalid subject +}); + +// alg mismatch +var cert = fs.readFileSync('public.pem'); // get public key +jwt.verify(token, cert, { algorithms: ['RS256'] }, function (err, payload) { + // if token alg != RS256, err == invalid signature +}); + +``` + +### jwt.decode(token [, options]) + +(Synchronous) Returns the decoded payload without verifying if the signature is valid. + +__Warning:__ This will __not__ verify whether the signature is valid. You should __not__ use this for untrusted messages. You most likely want to use `jwt.verify` instead. + +`token` is the JsonWebToken string + +`options`: + +* `json`: force JSON.parse on the payload even if the header doesn't contain `"typ":"JWT"`. +* `complete`: return an object with the decoded payload and header. + +Example + +```js +// get the decoded payload ignoring signature, no secretOrPrivateKey needed +var decoded = jwt.decode(token); + +// get the decoded payload and header +var decoded = jwt.decode(token, {complete: true}); +console.log(decoded.header); +console.log(decoded.payload) +``` + +## Errors & Codes +Possible thrown errors during verification. +Error is the first argument of the verification callback. + +### TokenExpiredError + +Thrown error if the token is expired. + +Error object: + +* name: 'TokenExpiredError' +* message: 'jwt expired' +* expiredAt: [ExpDate] + +```js +jwt.verify(token, 'shhhhh', function(err, decoded) { + if (err) { + /* + err = { + name: 'TokenExpiredError', + message: 'jwt expired', + expiredAt: 1408621000 + } + */ + } +}); +``` + +### JsonWebTokenError +Error object: + +* name: 'JsonWebTokenError' +* message: + * 'jwt malformed' + * 'jwt signature is required' + * 'invalid signature' + * 'jwt audience invalid. expected: [OPTIONS AUDIENCE]' + * 'jwt issuer invalid. expected: [OPTIONS ISSUER]' + * 'jwt id invalid. expected: [OPTIONS JWT ID]' + * 'jwt subject invalid. expected: [OPTIONS SUBJECT]' + +```js +jwt.verify(token, 'shhhhh', function(err, decoded) { + if (err) { + /* + err = { + name: 'JsonWebTokenError', + message: 'jwt malformed' + } + */ + } +}); +``` + +## Algorithms supported + +Array of supported algorithms. The following algorithms are currently supported. + +alg Parameter Value | Digital Signature or MAC Algorithm +----------------|---------------------------- +HS256 | HMAC using SHA-256 hash algorithm +HS384 | HMAC using SHA-384 hash algorithm +HS512 | HMAC using SHA-512 hash algorithm +RS256 | RSASSA using SHA-256 hash algorithm +RS384 | RSASSA using SHA-384 hash algorithm +RS512 | RSASSA using SHA-512 hash algorithm +ES256 | ECDSA using P-256 curve and SHA-256 hash algorithm +ES384 | ECDSA using P-384 curve and SHA-384 hash algorithm +ES512 | ECDSA using P-521 curve and SHA-512 hash algorithm +none | No digital signature or MAC value included + +# TODO + +* X.509 certificate chain is not checked + +## Issue Reporting + +If you have found a bug or if you have a feature request, please report them at this repository issues section. Please do not report security vulnerabilities on the public GitHub issue tracker. The [Responsible Disclosure Program](https://auth0.com/whitehat) details the procedure for disclosing security issues. + +## Author + +[Auth0](https://auth0.com) + +## License + +This project is licensed under the MIT license. See the [LICENSE](LICENSE) file for more info. diff --git a/node_modules/jsonwebtoken/bin/changelog b/node_modules/jsonwebtoken/bin/changelog new file mode 100755 index 0000000..32bd741 --- /dev/null +++ b/node_modules/jsonwebtoken/bin/changelog @@ -0,0 +1,28 @@ +#!/usr/bin/env node + +var changelog = require('conventional-changelog'); +var semver_regex = /\bv?(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)(?:-[\da-z\-]+(?:\.[\da-z\-]+)*)?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?\b/ig; + +const commitPartial = ` - {{header}} + +{{~!-- commit hash --}} {{#if @root.linkReferences}}([{{hash}}]({{#if @root.host}}{{@root.host}}/{{/if}}{{#if @root.owner}}{{@root.owner}}/{{/if}}{{@root.repository}}/{{@root.commit}}/{{hash}})){{else}}{{hash~}}{{/if}} + +{{~!-- commit references --}}{{#if references}}, closes{{~#each references}} {{#if @root.linkReferences}}[{{#if this.owner}}{{this.owner}}/{{/if}}{{this.repository}}#{{this.issue}}]({{#if @root.host}}{{@root.host}}/{{/if}}{{#if this.repository}}{{#if this.owner}}{{this.owner}}/{{/if}}{{this.repository}}{{else}}{{#if @root.owner}}{{@root.owner}}/{{/if}}{{@root.repository}}{{/if}}/{{@root.issue}}/{{this.issue}}){{else}}{{#if this.owner}}{{this.owner}}/{{/if}}{{this.repository}}#{{this.issue}}{{/if}}{{/each}}{{/if}} +`; + +const headerPartial = `## {{version}}{{#if title}} "{{title}}"{{/if}}{{#if date}} - {{date}}{{/if}} +`; + +changelog({ + releaseCount: 19, + // preset: 'jshint' +}, null, null, null, { + transform: function (commit) { + if (commit.header && semver_regex.exec(commit.header)) { + return null; + } + return commit; + }, + commitPartial: commitPartial, + headerPartial: headerPartial +}).pipe(process.stdout); diff --git a/node_modules/jsonwebtoken/decode.js b/node_modules/jsonwebtoken/decode.js new file mode 100644 index 0000000..783e6e7 --- /dev/null +++ b/node_modules/jsonwebtoken/decode.js @@ -0,0 +1,30 @@ +var jws = require('jws'); + +module.exports = function (jwt, options) { + options = options || {}; + var decoded = jws.decode(jwt, options); + if (!decoded) { return null; } + var payload = decoded.payload; + + //try parse the payload + if(typeof payload === 'string') { + try { + var obj = JSON.parse(payload); + if(typeof obj === 'object') { + payload = obj; + } + } catch (e) { } + } + + //return header if `complete` option is enabled. header includes claims + //such as `kid` and `alg` used to select the key within a JWKS needed to + //verify the signature + if (options.complete === true) { + return { + header: decoded.header, + payload: payload, + signature: decoded.signature + }; + } + return payload; +}; diff --git a/node_modules/jsonwebtoken/index.js b/node_modules/jsonwebtoken/index.js new file mode 100644 index 0000000..161eb2d --- /dev/null +++ b/node_modules/jsonwebtoken/index.js @@ -0,0 +1,8 @@ +module.exports = { + decode: require('./decode'), + verify: require('./verify'), + sign: require('./sign'), + JsonWebTokenError: require('./lib/JsonWebTokenError'), + NotBeforeError: require('./lib/NotBeforeError'), + TokenExpiredError: require('./lib/TokenExpiredError'), +}; diff --git a/node_modules/jsonwebtoken/lib/JsonWebTokenError.js b/node_modules/jsonwebtoken/lib/JsonWebTokenError.js new file mode 100644 index 0000000..7c4ea0f --- /dev/null +++ b/node_modules/jsonwebtoken/lib/JsonWebTokenError.js @@ -0,0 +1,12 @@ +var JsonWebTokenError = function (message, error) { + Error.call(this, message); + Error.captureStackTrace(this, this.constructor); + this.name = 'JsonWebTokenError'; + this.message = message; + if (error) this.inner = error; +}; + +JsonWebTokenError.prototype = Object.create(Error.prototype); +JsonWebTokenError.prototype.constructor = JsonWebTokenError; + +module.exports = JsonWebTokenError; \ No newline at end of file diff --git a/node_modules/jsonwebtoken/lib/NotBeforeError.js b/node_modules/jsonwebtoken/lib/NotBeforeError.js new file mode 100644 index 0000000..7b30084 --- /dev/null +++ b/node_modules/jsonwebtoken/lib/NotBeforeError.js @@ -0,0 +1,13 @@ +var JsonWebTokenError = require('./JsonWebTokenError'); + +var NotBeforeError = function (message, date) { + JsonWebTokenError.call(this, message); + this.name = 'NotBeforeError'; + this.date = date; +}; + +NotBeforeError.prototype = Object.create(JsonWebTokenError.prototype); + +NotBeforeError.prototype.constructor = NotBeforeError; + +module.exports = NotBeforeError; \ No newline at end of file diff --git a/node_modules/jsonwebtoken/lib/TokenExpiredError.js b/node_modules/jsonwebtoken/lib/TokenExpiredError.js new file mode 100644 index 0000000..abb704f --- /dev/null +++ b/node_modules/jsonwebtoken/lib/TokenExpiredError.js @@ -0,0 +1,13 @@ +var JsonWebTokenError = require('./JsonWebTokenError'); + +var TokenExpiredError = function (message, expiredAt) { + JsonWebTokenError.call(this, message); + this.name = 'TokenExpiredError'; + this.expiredAt = expiredAt; +}; + +TokenExpiredError.prototype = Object.create(JsonWebTokenError.prototype); + +TokenExpiredError.prototype.constructor = TokenExpiredError; + +module.exports = TokenExpiredError; \ No newline at end of file diff --git a/node_modules/jsonwebtoken/lib/timespan.js b/node_modules/jsonwebtoken/lib/timespan.js new file mode 100644 index 0000000..e509869 --- /dev/null +++ b/node_modules/jsonwebtoken/lib/timespan.js @@ -0,0 +1,18 @@ +var ms = require('ms'); + +module.exports = function (time, iat) { + var timestamp = iat || Math.floor(Date.now() / 1000); + + if (typeof time === 'string') { + var milliseconds = ms(time); + if (typeof milliseconds === 'undefined') { + return; + } + return Math.floor(timestamp + milliseconds / 1000); + } else if (typeof time === 'number') { + return timestamp + time; + } else { + return; + } + +}; \ No newline at end of file diff --git a/node_modules/jsonwebtoken/node_modules/cb/.npmignore b/node_modules/jsonwebtoken/node_modules/cb/.npmignore new file mode 100644 index 0000000..496fe9b --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/cb/.npmignore @@ -0,0 +1,2 @@ +*.DS_Store +node_modules \ No newline at end of file diff --git a/node_modules/jsonwebtoken/node_modules/cb/Makefile b/node_modules/jsonwebtoken/node_modules/cb/Makefile new file mode 100644 index 0000000..745ab2c --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/cb/Makefile @@ -0,0 +1,6 @@ +.PHONY: test + +MOCHA = ./node_modules/mocha/bin/mocha + +test: + $(MOCHA) -R list \ No newline at end of file diff --git a/node_modules/jsonwebtoken/node_modules/cb/README.md b/node_modules/jsonwebtoken/node_modules/cb/README.md new file mode 100644 index 0000000..a6ff558 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/cb/README.md @@ -0,0 +1,95 @@ +# cb() + +A minimal node.js utility for handling common (but often overlooked) callback scenarios. + +##Features + + * `.timeout()`: Simple callback timeouts + * `.error()`: Explicit error handling + * `.once()`: Once-and-only-once callback semantics + * Guaranteed asynchronous callback execution (protects against code that breaks this assumption) + +## Installation + + $ npm install cb + +## Usage + +### Basic Usage + +The most basic usage of `cb` consists of passing in your own function reference. In this example, `cb` will do nothing other +than insure the once-and-only-once, asynchronous invocation of the callback. + + doAsync(cb(function(err, res) { + console.log(res); + })); + +### Timeout Handling + +Timeouts are specified through the `.timeout()` method, and are specified in milliseconds. If a timeout does occur, the error +passed to the callback will be an instance of `cb.TimeoutError`. + + doReallySlowAsync(cb(function(err, res) { + assert(err instanceof cb.TimeoutError); + }).timeout(50)); + +*Note: once a timeout has occured, any tardy attempts to invoke the callback will be ignored.* + +### Explicit Error Handling + +In situations where it is convenient to separate the code that runs on success or failure, this can easily be accomplished +with `.error()`. If an 'errback' handler has been provided to `.error()`, then it is assumed that the error-first parameter +to the success handler is no longer required. To illustrate, + + doAsync(cb(function(err, res) { + if (err) { + console.error(err); + } else { + console.log(res); + } + })); + +Can be rewritten as: + + doAsync(cb(console.log).error(console.error)); + +### Force Once-and-only-once Callback Execution + +Sometimes it's necessary to ensure that a callback is invoked once, and no more. Once-and-only-once execution semantics can be +enforced by using `.once()`. + + function runTwice(callback) { + process.nextTick(function() { + callback(); + callback(); + }); + } + + runTwice(cb(function() { + console.log('I will only run once'); + }).once()); + +*Note: technically, `.once()` simply enforces at-most-once semantics. However, when combined with `.timeout()`, once-and-only-once +is achieved.* + +### Combining Features + +The `cb` API is fully chainable, and any arrangement of the features is valid. For example: + + doAsync(cb(console.log).error(console.error).timeout(50).once()); + +## Running the Tests + + $ make test + +## License + +The MIT License (MIT) + +Copyright (c) 2012 Jeremy Martin + +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. diff --git a/node_modules/jsonwebtoken/node_modules/cb/lib/cb.js b/node_modules/jsonwebtoken/node_modules/cb/lib/cb.js new file mode 100644 index 0000000..001522a --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/cb/lib/cb.js @@ -0,0 +1,39 @@ +module.exports = function(callback) { + + var cb = function() { + if (timedout || (once && count)) return; + count += 1; + tid && clearTimeout(tid); + + var args = Array.prototype.slice.call(arguments); + process.nextTick(function() { + if (!errback) return callback.apply(this, args); + args[0] ? errback(args[0]) : callback.apply(this, args.slice(1)); + }); + + }, count = 0, once = false, timedout = false, errback, tid; + + cb.timeout = function(ms) { + tid && clearTimeout(tid); + tid = setTimeout(function() { + cb(new TimeoutError(ms)); + timedout = true; + }, ms); + return cb; + }; + + cb.error = function(func) { errback = func; return cb; }; + + cb.once = function() { once = true; return cb; }; + + return cb; + +}; + +var TimeoutError = module.exports.TimeoutError = function TimeoutError(ms) { + this.message = 'Specified timeout of ' + ms + 'ms was reached'; + Error.captureStackTrace(this, this.constructor); +}; +TimeoutError.prototype = new Error; +TimeoutError.prototype.constructor = TimeoutError; +TimeoutError.prototype.name = 'TimeoutError'; \ No newline at end of file diff --git a/node_modules/jsonwebtoken/node_modules/cb/package.json b/node_modules/jsonwebtoken/node_modules/cb/package.json new file mode 100644 index 0000000..61d3812 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/cb/package.json @@ -0,0 +1,46 @@ +{ + "author": { + "name": "Jeremy Martin", + "email": "jmar777@gmail.com", + "url": "http://twitter.com/jmar777" + }, + "name": "cb", + "description": "Super simple callback mechanism with support for timeouts and explicit error handling", + "version": "0.1.0", + "repository": { + "type": "git", + "url": "git://github.com/jmar777/cb.git" + }, + "main": "lib/cb.js", + "devDependencies": { + "mocha": ">=0.3.6" + }, + "engines": { + "node": ">=0.6.0" + }, + "_npmUser": { + "name": "jmar777", + "email": "jmar777@gmail.com" + }, + "_id": "cb@0.1.0", + "dependencies": {}, + "optionalDependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.1.0-2", + "_nodeVersion": "v0.6.8", + "_defaultsLoaded": true, + "dist": { + "shasum": "26f7e740f2808facc83cef7b20392e4d881b5203", + "tarball": "https://registry.npmjs.org/cb/-/cb-0.1.0.tgz" + }, + "maintainers": [ + { + "name": "jmar777", + "email": "jmar777@gmail.com" + } + ], + "directories": {}, + "_shasum": "26f7e740f2808facc83cef7b20392e4d881b5203", + "_resolved": "https://registry.npmjs.org/cb/-/cb-0.1.0.tgz", + "_from": "cb@>=0.1.0 <0.2.0" +} diff --git a/node_modules/jsonwebtoken/node_modules/cb/test/tests.js b/node_modules/jsonwebtoken/node_modules/cb/test/tests.js new file mode 100644 index 0000000..b4ac904 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/cb/test/tests.js @@ -0,0 +1,125 @@ +var assert = require('assert'), + cb = require('../'); + +function invokeAsync(callback) { + setTimeout(function() { + callback(null, 'foo'); + }, 100); +} + +function invokeAsyncError(callback) { + setTimeout(function() { + callback(new Error()); + }, 100); +} + +function invokeAsyncTwice(callback) { + setTimeout(function() { + callback(null, 'foo'); + callback(null, 'foo'); + }, 100); +} + +describe('cb(callback)', function() { + + it('should invoke the provided callback', function(done) { + invokeAsync(cb(function(err, res) { + assert.strictEqual(res, 'foo'); + done(); + })); + }); + + it('shouldn\'t mess with errors', function(done) { + invokeAsyncError(cb(function(err, res) { + assert(err); + done(); + })); + }); + + it('should allow multiple executions', function(done) { + var count = 0; + invokeAsyncTwice(cb(function(err, res) { + count++; + if (count === 2) done(); + })); + }); + +}); + +describe('cb(callback).timeout(ms)', function() { + + it('should complete successfully within timeout period', function(done) { + invokeAsync(cb(function(err, res) { + assert.strictEqual(res, 'foo'); + done(); + }).timeout(200)); + }); + + it('should complete with an error after timeout period', function(done) { + invokeAsync(cb(function(err, res) { + assert(err); + done(); + }).timeout(50)); + }); + + it('error resulting from a timeout should be instanceof cb.TimeoutError', function(done) { + invokeAsync(cb(function(err, res) { + assert(err instanceof cb.TimeoutError); + done(); + }).timeout(50)); + }); + +}); + +describe('cb(callback).error(errback)', function() { + + it('should skip the err argument when invoking callback', function(done) { + invokeAsync(cb(function(res) { + assert.strictEqual(res, 'foo'); + done(); + }).error(assert.ifError)); + }); + + it('should pass errors to provided errback', function(done) { + invokeAsyncError(cb(function(res) { + throw new Error('should not be invoked'); + }).error(function(err) { + assert(err); + done(); + })); + }); + +}); + +describe('cb(callback).error(errback).timeout(ms)', function() { + + it('should skip the err argument when invoking callback', function(done) { + invokeAsync(cb(function(res) { + assert.strictEqual(res, 'foo'); + done(); + }).error(assert.ifError).timeout(200)); + }); + + it('should pass timeout error to provided errback', function(done) { + invokeAsyncError(cb(function(res) { + throw new Error('should not be invoked'); + }).error(function(err) { + assert(err); + done(); + }).timeout(50)); + }); + +}); + +describe('cb(callback).once()', function() { + + it('should allow multiple executions', function(done) { + var count = 0; + invokeAsyncTwice(cb(function(err, res) { + count++; + assert.notEqual(count, 2); + setTimeout(done, 100); + }).once()); + }); + +}); diff --git a/node_modules/jsonwebtoken/node_modules/joi/.eslintignore b/node_modules/jsonwebtoken/node_modules/joi/.eslintignore new file mode 100644 index 0000000..e4acc6a --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/.eslintignore @@ -0,0 +1,2 @@ +examples +sandbox.js diff --git a/node_modules/jsonwebtoken/node_modules/joi/.npmignore b/node_modules/jsonwebtoken/node_modules/joi/.npmignore new file mode 100644 index 0000000..20fb4d8 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/.npmignore @@ -0,0 +1,21 @@ +.c9 +.idea +.project +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov +complexity.md +sandbox.js diff --git a/node_modules/jsonwebtoken/node_modules/joi/.travis.yml b/node_modules/jsonwebtoken/node_modules/joi/.travis.yml new file mode 100755 index 0000000..009a025 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/.travis.yml @@ -0,0 +1,9 @@ +language: node_js + +node_js: + - "0.10" + - "4.0" + - "4" + - "5" + +sudo: false diff --git a/node_modules/jsonwebtoken/node_modules/joi/API.md b/node_modules/jsonwebtoken/node_modules/joi/API.md new file mode 100755 index 0000000..994c17e --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/API.md @@ -0,0 +1,1515 @@ + +# 6.10.1 API Reference + + + + + + +- [Joi](#joi) + - [`validate(value, schema, [options], [callback])`](#validatevalue-schema-options-callback) + - [`compile(schema)`](#compileschema) + - [`assert(value, schema, [message])`](#assertvalue-schema-message) + - [`attempt(value, schema, [message])`](#attemptvalue-schema-message) + - [`isRef(ref)`](#isrefref) + - [`any`](#any) + - [`any.allow(value)`](#anyallowvalue) + - [`any.valid(value)` - aliases: `only`, `equal`](#anyvalidvalue---aliases-only-equal) + - [`any.invalid(value)` - aliases: `disallow`, `not`](#anyinvalidvalue---aliases-disallow-not) + - [`any.required()`](#anyrequired) + - [`any.optional()`](#anyoptional) + - [`any.forbidden()`](#anyforbidden) + - [`any.strip()`](#anystrip) + - [`any.description(desc)`](#anydescriptiondesc) + - [`any.notes(notes)`](#anynotesnotes) + - [`any.tags(tags)`](#anytagstags) + - [`any.meta(meta)`](#anymetameta) + - [`any.example(value)`](#anyexamplevalue) + - [`any.unit(name)`](#anyunitname) + - [`any.options(options)`](#anyoptionsoptions) + - [`any.strict(isStrict)`](#anystrictisstrict) + - [`any.default([value, [description]])`](#anydefaultvalue-description) + - [`any.concat(schema)`](#anyconcatschema) + - [`any.when(ref, options)`](#anywhenref-options) + - [`any.label(name)`](#anylabelname) + - [`any.raw(isRaw)`](#anyrawisraw) + - [`any.empty(schema)`](#anyemptyschema) + - [`array`](#array) + - [`array.sparse(enabled)`](#arraysparseenabled) + - [`array.single(enabled)`](#arraysingleenabled) + - [`array.items(type)`](#arrayitemstype) + - [`array.ordered(type)`](#arrayorderedtype) + - [`array.min(limit)`](#arrayminlimit) + - [`array.max(limit)`](#arraymaxlimit) + - [`array.length(limit)`](#arraylengthlimit) + - [`array.unique()`](#arrayunique) + - [`boolean`](#boolean) + - [`binary`](#binary) + - [`binary.encoding(encoding)`](#binaryencodingencoding) + - [`binary.min(limit)`](#binaryminlimit) + - [`binary.max(limit)`](#binarymaxlimit) + - [`binary.length(limit)`](#binarylengthlimit) + - [`date`](#date) + - [`date.min(date)`](#datemindate) + - [`date.max(date)`](#datemaxdate) + - [`date.format(format)`](#dateformatformat) + - [`date.iso()`](#dateiso) + - [`func`](#func) + - [`number`](#number) + - [`number.min(limit)`](#numberminlimit) + - [`number.max(limit)`](#numbermaxlimit) + - [`number.greater(limit)`](#numbergreaterlimit) + - [`number.less(limit)`](#numberlesslimit) + - [`number.integer()`](#numberinteger) + - [`number.precision(limit)`](#numberprecisionlimit) + - [`number.multiple(base)`](#numbermultiplebase) + - [`number.positive()`](#numberpositive) + - [`number.negative()`](#numbernegative) + - [`object`](#object) + - [`object.keys([schema])`](#objectkeysschema) + - [`{} notation`](#-notation) + - [`Joi.object([schema]) notation`](#joiobjectschema-notation) + - [`Joi.object().keys([schema]) notation`](#joiobjectkeysschema-notation) + - [`object.min(limit)`](#objectminlimit) + - [`object.max(limit)`](#objectmaxlimit) + - [`object.length(limit)`](#objectlengthlimit) + - [`object.pattern(regex, schema)`](#objectpatternregex-schema) + - [`object.and(peers)`](#objectandpeers) + - [`object.nand(peers)`](#objectnandpeers) + - [`object.or(peers)`](#objectorpeers) + - [`object.xor(peers)`](#objectxorpeers) + - [`object.with(key, peers)`](#objectwithkey-peers) + - [`object.without(key, peers)`](#objectwithoutkey-peers) + - [`object.rename(from, to, [options])`](#objectrenamefrom-to-options) + - [`object.assert(ref, schema, [message])`](#objectassertref-schema-message) + - [`object.unknown([allow])`](#objectunknownallow) + - [`object.type(constructor, [name])`](#objecttypeconstructor-name) + - [`object.requiredKeys(children)`](#objectrequiredkeyschildren) + - [`object.optionalKeys(children)`](#objectoptionalkeyschildren) + - [`string`](#string) + - [`string.insensitive()`](#stringinsensitive) + - [`string.min(limit, [encoding])`](#stringminlimit-encoding) + - [`string.max(limit, [encoding])`](#stringmaxlimit-encoding) + - [`string.creditCard()`](#stringcreditcard) + - [`string.length(limit, [encoding])`](#stringlengthlimit-encoding) + - [`string.regex(pattern, [name])`](#stringregexpattern-name) + - [`string.replace(pattern, replacement)`](#stringreplacepattern-replacement) + - [`string.alphanum()`](#stringalphanum) + - [`string.token()`](#stringtoken) + - [`string.email([options])`](#stringemailoptions) + - [`string.ip([options])`](#stringipoptions) + - [`string.uri([options])`](#stringurioptions) + - [`string.guid()`](#stringguid) + - [`string.hex()`](#stringhex) + - [`string.hostname()`](#stringhostname) + - [`string.lowercase()`](#stringlowercase) + - [`string.uppercase()`](#stringuppercase) + - [`string.trim()`](#stringtrim) + - [`string.isoDate()`](#stringisodate) + - [`alternatives`](#alternatives) + - [`alternatives.try(schemas)`](#alternativestryschemas) + - [`alternatives.when(ref, options)`](#alternativeswhenref-options) + - [`ref(key, [options])`](#refkey-options) +- [Errors](#errors) + + + +## Joi + +### `validate(value, schema, [options], [callback])` + +Validates a value using the given schema and options where: +- `value` - the value being validated. +- `schema` - the validation schema. Can be a **joi** type object or a plain object where every key is assigned a **joi** type object. +- `options` - an optional object with the following optional keys: + - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`. + - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`. + - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`. + - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`. + - `stripUnknown` - when `true`, unknown keys are deleted (only when value is an object or an array). Defaults to `false`. + - `language` - overrides individual error messages, when `'label'` is set, it overrides the key name in the error message. Defaults to no override (`{}`). + - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`. + Defaults to `'optional'`. + - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to + `validate()` and not using `any.options()`. + - `noDefaults` - when `true`, do not apply default values. Defaults to `false`. +- `callback` - the optional synchronous callback method using the signature `function(err, value)` where: + - `err` - if validation failed, the [error](#errors) reason, otherwise `null`. + - `value` - the validated value with any type conversions and other modifiers applied (the input is left unchanged). `value` can be + incomplete if validation failed and `abortEarly` is `true`. If callback is not provided, then returns an object with [error](#errors) + and value properties. + +```javascript +var schema = { + a: Joi.number() +}; + +var value = { + a: '123' +}; + +Joi.validate(value, schema, function (err, value) { }); +// err -> null +// value.a -> 123 (number, not string) + +// or +var result = Joi.validate(value, schema); +// result.error -> null +// result.value -> { "a" : 123 } +``` + +### `compile(schema)` + +Converts literal schema definition to **joi** schema object (or returns the same back if already a **joi** schema object) where: +- `schema` - the schema definition to compile. + +```javascript +var definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; +var schema = Joi.compile(definition); + +// Same as: + +var schema = Joi.alternatives().try([ + Joi.string().valid('key'), + Joi.number().valid(5), + Joi.object().keys({ + a: Joi.boolean().valid(true), + b: Joi.alternatives().try([ + Joi.string().regex(/^a/), + Joi.string().valid('boom') + ]) + }) +]); +``` + +### `assert(value, schema, [message])` + +Validates a value against a schema and [throws](#errors) if validation fails where: +- `value` - the value to validate. +- `schema` - the schema object. +- `message` - optional message string prefix added in front of the error message. may also be an Error object. + +```javascript +Joi.assert('x', Joi.number()); +``` + +### `attempt(value, schema, [message])` + +Validates a value against a schema, returns valid object, and [throws](#errors) if validation fails where: +- `value` - the value to validate. +- `schema` - the schema object. +- `message` - optional message string prefix added in front of the error message. may also be an Error object. + +```javascript +Joi.attempt('x', Joi.number()); // throws error +var result = Joi.attempt('4', Joi.number()); // result -> 4 +``` + +### `isRef(ref)` + +Checks whether or not the provided argument is a reference. +It's especially useful if you want to post-process error messages. + +```js +var ref = Joi.ref('a'); +Joi.isRef(ref); // returns true +``` + +### `any` + +Generates a schema object that matches any data type. + +```javascript +var any = Joi.any(); +any.validate('a', function (err, value) { }); +``` + +#### `any.allow(value)` + +Whitelists a value where: +- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +Note that this whitelist of allowed values is in *addition* to any other permitted values. +To create an exclusive whitelist of values, see [`any.valid(value)`](#anyvalidvalue). + +```javascript +var schema = { + a: Joi.any().allow('a'), + b: Joi.any().allow('b', 'B'), + c: Joi.any().allow(['c', 'C']) +}; +``` + +#### `any.valid(value)` - aliases: `only`, `equal` + +Adds the provided values into the allowed whitelist and marks them as the only valid values allowed where: +- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +```javascript +var schema = { + a: Joi.any().valid('a'), + b: Joi.any().valid('b', 'B'), + c: Joi.any().valid(['c', 'C']) +}; +``` + +#### `any.invalid(value)` - aliases: `disallow`, `not` + +Blacklists a value where: +- `value` - the forbidden value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +```javascript +var schema = { + a: Joi.any().invalid('a'), + b: Joi.any().invalid('b', 'B'), + c: Joi.any().invalid(['c', 'C']) +}; +``` + +#### `any.required()` + +Marks a key as required which will not allow `undefined` as value. All keys are optional by default. + +```javascript +var schema = Joi.any().required(); +``` + +#### `any.optional()` + +Marks a key as optional which will allow `undefined` as values. Used to annotate the schema for readability as all keys are optional by default. + +```javascript +var schema = Joi.any().optional(); +``` + +#### `any.forbidden()` + +Marks a key as forbidden which will not allow any value except `undefined`. Used to explicitly forbid keys. + +```javascript +var schema = { + a: Joi.any().forbidden() +}; +``` + +#### `any.strip()` + +Marks a key to be removed from a resulting object or array after validation. Used to sanitize output. + +```javascript +var schema = { + username: Joi.string(), + password: Joi.string().strip() +}; + +schema.validate({ username: 'test', password: 'hunter2' }, function (err, value) { + // value = { username: 'test' } +}); + +var schema = Joi.array().items(Joi.string(), Joi.any().strip()); + +schema.validate(['one', 'two', true, false, 1, 2], function (err, value) { + // value = ['one', 'two'] +}); +``` + +#### `any.description(desc)` + +Annotates the key where: +- `desc` - the description string. + +```javascript +var schema = Joi.any().description('this key will match anything you give it'); +``` + +#### `any.notes(notes)` + +Annotates the key where: +- `notes` - the notes string or array of strings. + +```javascript +var schema = Joi.any().notes(['this is special', 'this is important']); +``` + +#### `any.tags(tags)` + +Annotates the key where: +- `tags` - the tag string or array of strings. + +```javascript +var schema = Joi.any().tags(['api', 'user']); +``` + +#### `any.meta(meta)` + +Attaches metadata to the key where: +- `meta` - the meta object to attach. + +```javascript +var schema = Joi.any().meta({ index: true }); +``` + +#### `any.example(value)` + +Annotates the key where: +- `value` - an example value. + +If the example fails to pass validation, the function will throw. + +```javascript +var schema = Joi.string().min(4).example('abcd'); +``` + +#### `any.unit(name)` + +Annotates the key where: +- `name` - the unit name of the value. + +```javascript +var schema = Joi.number().unit('milliseconds'); +``` + +#### `any.options(options)` + +Overrides the global `validate()` options for the current key and any sub-key where: +- `options` - an object with the same optional keys as [`Joi.validate(value, schema, options, callback)`](#validatevalue-schema-options-callback). + +```javascript +var schema = Joi.any().options({ convert: false }); +``` + +#### `any.strict(isStrict)` + +Strict mode sets the `options.convert` options to `false` which prevent type casting for the current key and any child keys. +- `isStrict` - whether strict mode is enabled or not. Defaults to true. + +```javascript +var schema = Joi.any().strict(); +``` + +#### `any.default([value, [description]])` + +Sets a default value if the original value is undefined where: +- `value` - the value. + - `value` supports [references](#refkey-options). + - `value` may also be a function which returns the default value. If `value` is specified as a function that accepts a single parameter, that parameter will be a context object that can be used to derive the resulting value. **This clones the object however, which incurs some overhead so if you don't need access to the context define your method so that it does not accept any parameters**. + - without any `value`, `default` has no effect, except for `object` that will then create nested defaults (applying inner defaults of that object). + +Note that if `value` is an object, any changes to the object after `default()` is called will change the reference +and any future assignment. + +Additionally, when specifying a method you must either have a `description` property on your method or the second parameter is required. + +```javascript +var generateUsername = function (context) { + + return context.firstname.toLowerCase() + '-' + context.lastname.toLowerCase(); +}; +generateUsername.description = 'generated username'; + +var schema = { + username: Joi.string().default(generateUsername), + firstname: Joi.string(), + lastname: Joi.string(), + created: Joi.date().default(Date.now, 'time of creation'), + status: Joi.string().default('registered') +}; + +Joi.validate({ + firstname: 'Jane', + lastname: 'Doe' +}, schema, function (err, value) { + + // value.status === 'registered' + // value.username === 'jane-doe' + // value.created will be the time of validation +}); +``` + +#### `any.concat(schema)` + +Returns a new type that is the result of adding the rules of one type to another where: +- `schema` - a **joi** type to merge into the current schema. Can only be of the same type as the context type or `any`. If applied to an `any` type, the schema can be any other schema. + +```javascript +var a = Joi.string().valid('a'); +var b = Joi.string().valid('b'); +var ab = a.concat(b); +``` + +#### `any.when(ref, options)` + +Converts the type into an [`alternatives`](#alternatives) type where the conditions are merged into the type definition where: +- `ref` - the key name or [reference](#refkey-options). +- `options` - an object with: + - `is` - the required condition **joi** type. + - `then` - the alternative schema type if the condition is true. Required if `otherwise` is missing. + - `otherwise` - the alternative schema type if the condition is false. Required if `then` is missing. + +```javascript +var schema = { + a: Joi.any().valid('x').when('b', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }), + b: Joi.any() +}; +``` + +Alternatively, if you want to specify a specific type such as `string`, `array`, etc, you can do so like this: + +```javascript +var schema = { + a: Joi.valid('a', 'b', 'other'), + other: Joi.string() + .when('a', { is: 'other', then: Joi.required() }), +}; +``` + +#### `any.label(name)` + +Overrides the key name in error messages. +- `name` - the name of the key. + +```javascript +var schema = { + first_name: Joi.string().label('First Name') +}; +``` + +#### `any.raw(isRaw)` + +Outputs the original untouched value instead of the casted value. +- `isRaw` - whether to enable raw mode or not. Defaults to true. + +```javascript +var schema = { + timestamp: Joi.date().format('YYYYMMDD').raw() +}; +``` + +#### `any.empty(schema)` + +Considers anything that matches the schema to be empty (`undefined`). +- `schema` - any object or joi schema to match. An undefined schema unsets that rule. + +```js +var schema = Joi.string().empty(''); +schema.validate(''); // returns { error: null, value: undefined } +schema = schema.empty(); +schema.validate(''); // returns { error: "value" is not allowed to be empty, value: '' } +``` + +### `array` + +Generates a schema object that matches an array data type. Note that undefined values inside arrays are not allowed by default but can be by using `sparse()`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var array = Joi.array().items(Joi.string().valid('a', 'b')); +array.validate(['a', 'b', 'a'], function (err, value) { }); +``` + +#### `array.sparse(enabled)` + +Allow this array to be sparse. `enabled` can be used with a falsy value to go back to the default behavior. + +```javascript +var schema = Joi.array().sparse(); // undefined values are now allowed +schema = schema.sparse(false); // undefined values are now denied +``` + +#### `array.single(enabled)` + +Allow single values to be checked against rules as if it were provided as an array. + +`enabled` can be used with a falsy value to go back to the default behavior. + +```javascript +var schema = Joi.array().items(Joi.number()).single(); +schema.validate([4]); // returns `{ error: null, value: [ 4 ] }` +schema.validate(4); // returns `{ error: null, value: [ 4 ] }` +``` + +#### `array.items(type)` + +List the types allowed for the array values where: +- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments. + +If a given type is `.required()` then there must be a matching item in the array. +If a type is `.forbidden()` then it cannot appear in the array. +Required items can be added multiple times to signify that multiple items must be found. +Errors will contain the number of items that didn't match. Any unmatched item having a [label](#anylabelname) will be mentioned explicitly. + +```javascript +var schema = Joi.array().items(Joi.string(), Joi.number()); // array may contain strings and numbers +var schema = Joi.array().items(Joi.string().required(), Joi.string().required()); // array must contain at least two strings +var schema = Joi.array().items(Joi.string().valid('not allowed').forbidden(), Joi.string()); // array may contain strings, but none of those strings can match 'not allowed' +var schema = Joi.array().items(Joi.string().label('My string').required(), Joi.number().required()); // If this fails it can result in `[ValidationError: "value" does not contain [My string] and 1 other required value(s)]` +``` + +#### `array.ordered(type)` + +List the types in sequence order for the array values where: +- `type` - a **joi** schema object to validate against each array item in sequence order. `type` can be an array of values, or multiple values can be passed as individual arguments. + +If a given type is `.required()` then there must be a matching item with the same index position in the array. +Errors will contain the number of items that didn't match. Any unmatched item having a [label](#anylabelname) will be mentioned explicitly. + +```javascript +var schema = Joi.array().ordered(Joi.string().required(), Joi.number().required()); // array must have first item as string and second item as number +var schema = Joi.array().ordered(Joi.string().required()).items(Joi.number().required()); // array must have first item as string and 1 or more subsequent items as number +var schema = Joi.array().ordered(Joi.string().required(), Joi.number()); // array must have first item as string and optionally second item as number +``` + +#### `array.min(limit)` + +Specifies the minimum number of items in the array where: +- `limit` - the lowest number of array items allowed. + +```javascript +var schema = Joi.array().min(2); +``` + +#### `array.max(limit)` + +Specifies the maximum number of items in the array where: +- `limit` - the highest number of array items allowed. + +```javascript +var schema = Joi.array().max(10); +``` + +#### `array.length(limit)` + +Specifies the exact number of items in the array where: +- `limit` - the number of array items allowed. + +```javascript +var schema = Joi.array().length(5); +``` + +#### `array.unique()` + +Requires the array values to be unique. + +Be aware that a deep equality is performed on elements of the array having a type of `object`, a performance penalty is to be expected for this kind of operation. + +```javascript +var schema = Joi.array().unique(); +``` + +### `boolean` + +Generates a schema object that matches a boolean data type (as well as the strings 'true', 'false', 'yes', 'no', 'on' or 'off'). Can also be called via `bool()`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var boolean = Joi.boolean(); +boolean.validate(true, function (err, value) { }); +``` + +### `binary` + +Generates a schema object that matches a Buffer data type (as well as the strings which will be converted to Buffers). + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var schema = Joi.binary(); +``` + +#### `binary.encoding(encoding)` + +Sets the string encoding format if a string input is converted to a buffer where: +- `encoding` - the encoding scheme. + +```javascript +var schema = Joi.binary().encoding('base64'); +``` + +#### `binary.min(limit)` + +Specifies the minimum length of the buffer where: +- `limit` - the lowest size of the buffer. + +```javascript +var schema = Joi.binary().min(2); +``` + +#### `binary.max(limit)` + +Specifies the maximum length of the buffer where: +- `limit` - the highest size of the buffer. + +```javascript +var schema = Joi.binary().max(10); +``` + +#### `binary.length(limit)` + +Specifies the exact length of the buffer: +- `limit` - the size of buffer allowed. + +```javascript +var schema = Joi.binary().length(5); +``` + +### `date` + +Generates a schema object that matches a date type (as well as a JavaScript date string or number of milliseconds). + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var date = Joi.date(); +date.validate('12-21-2012', function (err, value) { }); +``` + +#### `date.min(date)` + +Specifies the oldest date allowed where: +- `date` - the oldest date allowed. + +```javascript +var schema = Joi.date().min('1-1-1974'); +``` + +Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. + +```javascript +var schema = Joi.date().min('now'); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + from: Joi.date().required(), + to: Joi.date().min(Joi.ref('from')).required() +}); +``` + +#### `date.max(date)` + +Specifies the latest date allowed where: +- `date` - the latest date allowed. + +```javascript +var schema = Joi.date().max('12-31-2020'); +``` + +Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. + +```javascript +var schema = Joi.date().max('now'); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + from: Joi.date().max(Joi.ref('to')).required(), + to: Joi.date().required() +}); +``` + +#### `date.format(format)` + +Specifies the allowed date format: +- `format` - string or array of strings that follow the `moment.js` [format](http://momentjs.com/docs/#/parsing/string-format/). + +```javascript +var schema = Joi.date().format('YYYY/MM/DD'); +``` + +#### `date.iso()` + +Requires the string value to be in valid ISO 8601 date format. + +```javascript +var schema = Joi.date().iso(); +``` + +### `func` + +Generates a schema object that matches a function type. + +Supports the same methods of the [`object()`](#object) type. Note that validating a function keys will cause the function +to be cloned. While the function will retain its prototype and closure, it will lose its `length` property value (will be +set to `0`). + +```javascript +var func = Joi.func(); +func.validate(function () {}, function (err, value) { }); +``` + +### `number` + +Generates a schema object that matches a number data type (as well as strings that can be converted to numbers). + +`Infinity` and `-Infinity` are invalid by default, you can change that behavior by calling `allow(Infinity, -Infinity)`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var number = Joi.number(); +number.validate(5, function (err, value) { }); +``` + +#### `number.min(limit)` + +Specifies the minimum value where: +- `limit` - the minimum value allowed. + +```javascript +var schema = Joi.number().min(2); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + min: Joi.number().required(), + max: Joi.number().min(Joi.ref('min')).required() +}); +``` + +#### `number.max(limit)` + +Specifies the maximum value where: +- `limit` - the maximum value allowed. + +```javascript +var schema = Joi.number().max(10); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + min: Joi.number().max(Joi.ref('max')).required(), + max: Joi.number().required() +}); +``` + +#### `number.greater(limit)` + +Specifies that the value must be greater than `limit`. + +```javascript +var schema = Joi.number().greater(5); +``` + +```javascript +var schema = Joi.object({ + min: Joi.number().required(), + max: Joi.number().greater(Joi.ref('min')).required() +}); +``` + +#### `number.less(limit)` + +Specifies that the value must be less than `limit`. + +```javascript +var schema = Joi.number().less(10); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + min: Joi.number().less(Joi.ref('max')).required(), + max: Joi.number().required() +}); +``` + +#### `number.integer()` + +Requires the number to be an integer (no floating point). + +```javascript +var schema = Joi.number().integer(); +``` + +#### `number.precision(limit)` + +Specifies the maximum number of decimal places where: +- `limit` - the maximum number of decimal places allowed. + +```javascript +var schema = Joi.number().precision(2); +``` + +#### `number.multiple(base)` + +Specifies that the value must be a multiple of `base`: + +```javascript +var schema = Joi.number().multiple(3); +``` + +#### `number.positive()` + +Requires the number to be positive. + +```javascript +var schema = Joi.number().positive(); +``` + +#### `number.negative()` + +Requires the number to be negative. + +```javascript +var schema = Joi.number().negative(); +``` + +### `object` + +Generates a schema object that matches an object data type (as well as JSON strings that parsed into objects). Defaults +to allowing any child key. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var object = Joi.object().keys({ + a: Joi.number().min(1).max(10).integer(), + b: 'some string' +}); + +object.validate({ a: 5 }, function (err, value) { }); +``` + +#### `object.keys([schema])` + +Sets or extends the allowed object keys where: +- `schema` - optional object where each key is assigned a **joi** type object. If `schema` is `{}` no keys allowed. + If `schema` is `null` or `undefined`, any key allowed. If `schema` is an object with keys, the keys are added to any + previously defined keys (but narrows the selection if all keys previously allowed). Defaults to 'undefined' which + allows any child key. + +```javascript +var base = Joi.object().keys({ + a: Joi.number(), + b: Joi.string() +}); +// Validate keys a, b and c. +var extended = base.keys({ + c: Joi.boolean() +}); +``` + +Notes: We have three different ways to define a schema for performing a validation + +- Using the plain JS object notation: +```javascript +var schema = { + a: Joi.string(), + b: Joi.number() +}; +``` +- Using the `Joi.object([schema])` notation +```javascript +var schema = Joi.object({ + a: Joi.string(), + b: Joi.number() +}); +``` +- Using the `Joi.object().keys([schema])` notation +```javascript +var schema = Joi.object().keys({ + a: Joi.string(), + b: Joi.number() +}); +``` + +While all these three objects defined above will result in the same validation object, there are some differences in using one or another: + +##### `{} notation` + +When using the `{}` notation, you are just defining a plain JS object, which isn't a schema object. +You can pass it to the validation method but you can't call `validate()` method of the object because it's just a plain JS object. + +Besides, passing the `{}` object to the `validate()` method each time, will perform an expensive schema compilation operation on every validation. + +##### `Joi.object([schema]) notation` + +Using `Joi.object([schema])` will return a schema object, so you can call the `validate()` method directly, e.g: + +```javascript +var schema = Joi.object({ + a: Joi.boolean() +}); + +schema.validate(true, function (err, value) { + console.log('err: ', err); +}); +``` + +When you use `Joi.object([schema])`, it gets compiled the first time, so you can pass it to the `validate()` method multiple times and no overhead is added. + +Another benefits of using `Joi.object([schema])` instead of a plain JS object is that you can set any options on the object like allowing unknown keys, e.g: + +```javascript +var schema = Joi.object({ + arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'), + value: Joi.string(), +}).pattern(/firstname|lastname/, Joi.string().min(2)); +``` + +##### `Joi.object().keys([schema]) notation` + +This is basically the same as `Joi.object([schema])`, but using `Joi.object().keys([schema])` is more useful when you want to add more keys (e.g. call `keys()` multiple times). If you are only adding one set of keys, you can skip the `keys()` method and just use `object()` directly. + +Some people like to use `keys()` to make the code more explicit (this is style only). + + +#### `object.min(limit)` + +Specifies the minimum number of keys in the object where: +- `limit` - the lowest number of keys allowed. + +```javascript +var schema = Joi.object().min(2); +``` + +#### `object.max(limit)` + +Specifies the maximum number of keys in the object where: +- `limit` - the highest number of object keys allowed. + +```javascript +var schema = Joi.object().max(10); +``` + +#### `object.length(limit)` + +Specifies the exact number of keys in the object where: +- `limit` - the number of object keys allowed. + +```javascript +var schema = Joi.object().length(5); +``` + +#### `object.pattern(regex, schema)` + +Specify validation rules for unknown keys matching a pattern where: +- `regex` - a regular expression tested against the unknown key names. +- `schema` - the schema object matching keys much validate against. + +```javascrip +var schema = Joi.object({ + a: Joi.string() +}).pattern(/\w\d/, Joi.boolean()); +``` + +#### `object.and(peers)` + +Defines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as +well where: +- `peers` - the key names of which if one present, all are required. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).and('a', 'b'); +``` + +#### `object.nand(peers)` + +Defines a relationship between keys where not all peers can be present at the +same time where: +- `peers` - the key names of which if one present, the others may not all be present. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).nand('a', 'b'); +``` + +#### `object.or(peers)` + +Defines a relationship between keys where one of the peers is required (and more than one is allowed) where: +- `peers` - the key names of which at least one must appear. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).or('a', 'b'); +``` + +#### `object.xor(peers)` + +Defines an exclusive relationship between a set of keys where one of them is required but not at the same time where: +- `peers` - the exclusive key names that must not appear together but where one of them is required. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).xor('a', 'b'); +``` + +#### `object.with(key, peers)` + +Requires the presence of other keys whenever the specified key is present where: +- `key` - the reference key. +- `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values. + +Note that unlike [`object.and()`](#objectandpeers), `with()` creates a dependency only between the `key` and each of the `peers`, not +between the `peers` themselves. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).with('a', 'b'); +``` + +#### `object.without(key, peers)` + +Forbids the presence of other keys whenever the specified is present where: +- `key` - the reference key. +- `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).without('a', ['b']); +``` + +#### `object.rename(from, to, [options])` + +Renames a key to another name (deletes the renamed key) where: +- `from` - the original key name. +- `to` - the new key name. +- `options` - an optional object with the following optional keys: + - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`. + - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`. + - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`. + - `ignoreUndefined` - if `true`, skip renaming of a key if it's undefined. Defaults to `false`. + +Keys are renamed before any other validation rules are applied. + +```javascript +var object = Joi.object().keys({ + a: Joi.number() +}).rename('b', 'a'); + +object.validate({ b: 5 }, function (err, value) { }); +``` + +#### `object.assert(ref, schema, [message])` + +Verifies an assertion where: +- `ref` - the key name or [reference](#refkey-options). +- `schema` - the validation rules required to satisfy the assertion. If the `schema` includes references, they are resolved against + the object value, not the value of the `ref` target. +- `message` - optional human-readable message used when the assertion fails. Defaults to 'failed to pass the assertion test'. + +```javascript +var schema = Joi.object().keys({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } +}).assert('d.e', Joi.ref('a.c'), 'equal to a.c'); +``` + +#### `object.unknown([allow])` + +Overrides the handling of unknown keys for the scope of the current object only (does not apply to children) where: +- `allow` - if `false`, unknown keys are not allowed, otherwise unknown keys are ignored. + +```javascript +var schema = Joi.object({ a: Joi.any() }).unknown(); +``` + +#### `object.type(constructor, [name])` + +Requires the object to be an instance of a given constructor where: +- `constructor` - the constructor function that the object must be an instance of. +- `name` - an alternate name to use in validation errors. This is useful when the constructor function does not have a name. + +```javascript +var schema = Joi.object().type(RegExp); +``` + +#### `object.requiredKeys(children)` + +Sets the specified children to required. +- `children` - can be a single string value, an array of string values, or each child provided as an argument. + +```javascript +var schema = Joi.object().keys({ a: { b: Joi.number() }, c: { d: Joi.string() } }); +var requiredSchema = schema.requiredKeys('', 'a.b', 'c', 'c.d'); +``` + +Note that in this example `''` means the current object, `a` is not required but `b` is, as well as `c` and `d`. + +#### `object.optionalKeys(children)` + +Sets the specified children to optional. +- `children` - can be a single string value, an array of string values, or each child provided as an argument. + +```javascript +var schema = Joi.object().keys({ a: { b: Joi.number().required() }, c: { d: Joi.string().required() } }); +var requiredSchema = schema.optionalKeys('a.b', 'c.d'); +``` + +The behavior is exactly the same as `requiredKeys`. + +### `string` + +Generates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with `allow('')`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var schema = Joi.string().min(1).max(10); +schema.validate('12345', function (err, value) { }); +``` + +#### `string.insensitive()` + +Allows the value to match any whitelist of blacklist item in a case insensitive comparison. + +```javascript +var schema = Joi.string().valid('a').insensitive(); +``` + +#### `string.min(limit, [encoding])` + +Specifies the minimum number string characters where: +- `limit` - the minimum number of string characters required. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().min(2); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + min: Joi.string().required(), + value: Joi.string().min(Joi.ref('min'), 'utf8').required() +}); +``` + +#### `string.max(limit, [encoding])` + +Specifies the maximum number of string characters where: +- `limit` - the maximum number of string characters allowed. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().max(10); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + max: Joi.string().required(), + value: Joi.string().max(Joi.ref('max'), 'utf8').required() +}); +``` + +#### `string.creditCard()` + +Requires the number to be a credit card number (Using [Lunh +Algorithm](http://en.wikipedia.org/wiki/Luhn_algorithm)). + +```javascript +var schema = Joi.string().creditCard(); +``` + +#### `string.length(limit, [encoding])` + +Specifies the exact string length required where: +- `limit` - the required string length. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().length(5); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + length: Joi.string().required(), + value: Joi.string().length(Joi.ref('length'), 'utf8').required() +}); +``` + +#### `string.regex(pattern, [name])` + +Defines a regular expression rule where: +- `pattern` - a regular expression object the string value must match against. +- `name` - optional name for patterns (useful with multiple patterns). Defaults to 'required'. + +```javascript +var schema = Joi.string().regex(/^[abc]+$/); +``` + +#### `string.replace(pattern, replacement)` + +Replace characters matching the given _pattern_ with the specified +_replacement_ string where: +- `pattern` - a regular expression object to match against, or a string of which _all_ occurrences will be replaced. +- `replacement` - the string that will replace the pattern. + + +```javascript +var schema = Joi.string().replace(/b/gi, 'x'); +schema.validate('abBc', function (err, value) { + // here value will be 'axxc' +}); +``` + +When `pattern` is a _string_ all its occurrences will be replaced. + +#### `string.alphanum()` + +Requires the string value to only contain a-z, A-Z, and 0-9. + +```javascript +var schema = Joi.string().alphanum(); +``` + +#### `string.token()` + +Requires the string value to only contain a-z, A-Z, 0-9, and underscore _. + +```javascript +var schema = Joi.string().token(); +``` + +#### `string.email([options])` + +Requires the string value to be a valid email address. + +- `options` - optional settings: + - `errorLevel` - Numerical threshold at which an email address is considered invalid. + - `tldWhitelist` - Specifies a list of acceptable TLDs. + - `minDomainAtoms` - Number of atoms required for the domain. Be careful since some domains, such as `io`, directly allow email. + +```javascript +var schema = Joi.string().email(); +``` + +#### `string.ip([options])` + +Requires the string value to be a valid ip address. + +- `options` - optional settings: + - `version` - One or more IP address versions to validate against. Valid values: `ipv4`, `ipv6`, `ipvfuture` + - `cidr` - Used to determine if a CIDR is allowed or not. Valid values: `optional`, `required`, `forbidden` + +```javascript +// Accept only ipv4 and ipv6 addresses with a CIDR +var schema = Joi.string().ip({ + version: [ + 'ipv4', + 'ipv6' + ], + cidr: 'required' +}); +``` + +#### `string.uri([options])` + +Requires the string value to be a valid [RFC 3986](http://tools.ietf.org/html/rfc3986) URI. + +- `options` - optional settings: + - `scheme` - Specifies one or more acceptable Schemes, should only include the scheme name. Can be an Array or String (strings are automatically escaped for use in a Regular Expression). + +```javascript +// Accept git or git http/https +var schema = Joi.string().uri({ + scheme: [ + 'git', + /git\+https?/ + ] +}); +``` + +#### `string.guid()` + +Requires the string value to be a valid GUID. + +```javascript +var schema = Joi.string().guid(); +``` + +#### `string.hex()` + +Requires the string value to be a valid hexadecimal string. + +```javascript +var schema = Joi.string().hex(); +``` + +#### `string.hostname()` + +Requires the string value to be a valid hostname as per [RFC1123](http://tools.ietf.org/html/rfc1123). + +```javascript +var schema = Joi.string().hostname(); +``` + +#### `string.lowercase()` + +Requires the string value to be all lowercase. If the validation `convert` option is on (enabled by default), the string +will be forced to lowercase. + +```javascript +var schema = Joi.string().lowercase(); +``` + +#### `string.uppercase()` + +Requires the string value to be all uppercase. If the validation `convert` option is on (enabled by default), the string +will be forced to uppercase. + +```javascript +var schema = Joi.string().uppercase(); +``` + +#### `string.trim()` + +Requires the string value to contain no whitespace before or after. If the validation `convert` option is on (enabled by +default), the string will be trimmed. + +```javascript +var schema = Joi.string().trim(); +``` + +#### `string.isoDate()` + +Requires the string value to be in valid ISO 8601 date format. + +```js +var schema = Joi.string().isoDate(); +``` + +### `alternatives` + +Generates a type that will match one of the provided alternative schemas via the [`try()`](#alternativestryschemas) +method. If no schemas are added, the type will not match any value except for `undefined`. + +Supports the same methods of the [`any()`](#any) type. + +Alternatives can be expressed using the shorter `[]` notation. + +```javascript +var alt = Joi.alternatives().try(Joi.number(), Joi.string()); +// Same as [Joi.number(), Joi.string()] +``` + +#### `alternatives.try(schemas)` + +Adds an alternative schema type for attempting to match against the validated value where: +- `schema` - an array of alternative **joi** types. Also supports providing each type as a separate argument. + +```javascript +var alt = Joi.alternatives().try(Joi.number(), Joi.string()); +alt.validate('a', function (err, value) { }); +``` + +#### `alternatives.when(ref, options)` + +Adds a conditional alternative schema type based on another key (not the same as `any.when()`) value where: +- `ref` - the key name or [reference](#refkey-options). +- `options` - an object with: + - `is` - the required condition **joi** type. + - `then` - the alternative schema type to **try** if the condition is true. Required if `otherwise` is missing. + - `otherwise` - the alternative schema type to **try** if the condition is false. Required if `then` is missing. + +```javascript +var schema = { + a: Joi.alternatives().when('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }), + b: Joi.any() +}; +``` + +Note that `when()` only adds additional alternatives to try and does not impact the overall type. Setting +a `required()` rule on a single alternative will not apply to the overall key. For example, +this definition of `a`: + +```javascript +var schema = { + a: Joi.alternatives().when('b', { is: true, then: Joi.required() }), + b: Joi.boolean() +}; +``` + +Does not turn `a` into a required key when `b` is `true`. Instead, it tells the validator to try and match the +value to anything that's not `undefined`. However, since `Joi.alternatives()` by itself allows `undefined`, the rule +does not accomplish turning `a` to a required value. This rule is the same as `Joi.alternatives([Joi.required()])` +when `b` is `true` which will allow any value including `undefined`. + +To accomplish the desired result above use: + +```javascript +var schema = { + a: Joi.when('b', { is: true, then: Joi.required() }), + b: Joi.boolean() +}; +``` + +### `ref(key, [options])` + +Generates a reference to the value of the named key. References are resolved at validation time and in order of dependency +so that if one key validation depends on another, the dependent key is validated second after the reference is validated. +References support the following arguments: +- `key` - the reference target. References cannot point up the object tree, only to sibling keys, but they can point to + their siblings' children (e.g. 'a.b.c') using the `.` separator. If a `key` starts with `$` is signifies a context reference + which is looked up in the `context` option object. +- `options` - optional settings: + - `separator` - overrides the default `.` hierarchy separator. + - `contextPrefix` - overrides the default `$` context prefix signifier. + +Note that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards +(parents) references are needed, use [`object.assert()`](#objectassertref-schema-message). + +```javascript +var schema = Joi.object().keys({ + a: Joi.ref('b.c'), + b: { + c: Joi.any() + }, + c: Joi.ref('$x') +}); + +Joi.validate({ a: 5, b: { c: 5 } }, schema, { context: { x: 5 } }, function (err, value) {}); +``` + +## Errors + +Joi throws classical javascript `Error`s containing : +- `name` - `ValidationError`. +- `details` - an array of errors : + - `message` - string with a description of the error. + - `path` - dotted path to the key where the error happened. + - `type` - type of the error. + - `context` - object providing context of the error. +- `annotate` - function that returns a string with an annotated version of the object pointing at the places where errors occured. +- `_object` - the original object to validate. \ No newline at end of file diff --git a/node_modules/jsonwebtoken/node_modules/joi/CONTRIBUTING.md b/node_modules/jsonwebtoken/node_modules/joi/CONTRIBUTING.md new file mode 100755 index 0000000..713d376 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/CONTRIBUTING.md @@ -0,0 +1,14 @@ +# How to contribute +We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. + +## Logging Issues +All issues should be created using the [new issue form](https://github.com/hapijs/joi/issues/new). Clearly describe the issue including steps to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. + +## Patching Code +Code changes are welcome and should follow the guidelines below. + +* Fork the repository on GitHub. +* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/contrib/blob/master/Style.md). +* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). + * Run `npm test` to generate a report of test coverage +* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/joi/tree/master). diff --git a/node_modules/jsonwebtoken/node_modules/joi/LICENSE b/node_modules/jsonwebtoken/node_modules/joi/LICENSE new file mode 100755 index 0000000..03afbde --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors \ No newline at end of file diff --git a/node_modules/jsonwebtoken/node_modules/joi/README.md b/node_modules/jsonwebtoken/node_modules/joi/README.md new file mode 100644 index 0000000..21d603b --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/README.md @@ -0,0 +1,90 @@ +![joi Logo](https://raw.github.com/hapijs/joi/master/images/joi.png) + +Object schema description language and validator for JavaScript objects. + +[![npm version](https://badge.fury.io/js/joi.svg)](http://badge.fury.io/js/joi) +[![Build Status](https://secure.travis-ci.org/hapijs/joi.svg)](http://travis-ci.org/hapijs/joi) +[![Dependencies Status](https://david-dm.org/hapijs/joi.svg)](https://david-dm.org/hapijs/joi) +[![DevDependencies Status](https://david-dm.org/hapijs/joi/dev-status.svg)](https://david-dm.org/hapijs/joi#info=devDependencies) + +[![Join the chat at https://gitter.im/hapijs/joi](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/hapijs/joi?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +Lead Maintainer: [Nicolas Morel](https://github.com/marsup) + +# Example + +```javascript +var Joi = require('joi'); + +var schema = Joi.object().keys({ + username: Joi.string().alphanum().min(3).max(30).required(), + password: Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/), + access_token: [Joi.string(), Joi.number()], + birthyear: Joi.number().integer().min(1900).max(2013), + email: Joi.string().email() +}).with('username', 'birthyear').without('password', 'access_token'); + +Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid +``` + +The above schema defines the following constraints: +* `username` + * a required string + * must contain only alphanumeric characters + * at least 3 characters long but no more than 30 + * must be accompanied by `birthyear` +* `password` + * an optional string + * must satisfy the custom regex + * cannot appear together with `access_token` +* `access_token` + * an optional, unconstrained string or number +* `birthyear` + * an integer between 1900 and 2013 +* `email` + * a valid email address string + +# Usage + +Usage is a two steps process. First, a schema is constructed using the provided types and constraints: + +```javascript +var schema = { + a: Joi.string() +}; +``` + +Note that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a +new schema object. + +Then the value is validated against the schema: + +```javascript +Joi.validate({ a: 'a string' }, schema, function (err, value) { }); +``` + +If the value is valid, `null` is returned, otherwise an `Error` object. + +The schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly: + +```javascript +var schema = Joi.string().min(10); +``` + +If the schema is a **joi** type, the `schema.validate(value, callback)` can be called directly on the type. When passing a non-type schema object, +the module converts it internally to an object() type equivalent to: + +```javascript +var schema = Joi.object().keys({ + a: Joi.string() +}); +``` + +When validating a schema: + +* Keys are optional by default. +* Strings are utf-8 encoded by default. +* Rules are defined in an additive fashion and evaluated in order after whitelist and blacklist checks. + +# API +See the [API Reference](API.md). \ No newline at end of file diff --git a/node_modules/jsonwebtoken/node_modules/joi/examples/conditionalRequire.js b/node_modules/jsonwebtoken/node_modules/joi/examples/conditionalRequire.js new file mode 100644 index 0000000..d17f849 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/examples/conditionalRequire.js @@ -0,0 +1,43 @@ +// This is an example of a survey to obtain the reputation of Parisians +// It contains examples of how to conditionally require keys based on values of other keys + +var Joi = require('../'); + +// This is a valid value for integer rating 1 - 5 +var intRating = Joi.number().integer().min(1).max(5); + +var schema = Joi.object().keys({ + // Do you know any French people? yes or no (required) + q1: Joi.boolean().required(), + // Do you know any Parisians? yes or no (required if answered yes in q1) + q2: Joi.boolean() + .when('q1', { is: true, then: Joi.required() }), + // How many french in paris do you know? 1-6, 6-10, 11-50 or 50+ (required if answered yes in q2) + q3: Joi.string() + .when('q2', { is: true, then: Joi.valid('1-5', '6-10', '11-50', '50+').required() }), + // Rate 20% of most friendly Parisians, from how many people you know answered in q3, individually on 1-5 rating + q4: Joi.array() + .when('q3', {is: '1-5', then: Joi.array().min(0).max(1).items(intRating).required() }) + .when('q3', {is: '6-10', then: Joi.array().min(1).max(2).items(intRating).required() }) + .when('q3', {is: '11-50', then: Joi.array().min(2).max(10).items(intRating).required() }) + .when('q3', {is: '50+', then: Joi.array().min(10).items(intRating).required() }), + // Rate remaining 80% of Parisians, from how many people you know answered in q3, individually on 1-5 rating + q5: Joi.array() + .when('q3', {is: '1-5', then: Joi.array().min(1).max(4).items(intRating).required() }) + .when('q3', {is: '6-10', then: Joi.array().min(4).max(8).items(intRating).required() }) + .when('q3', {is: '11-50', then: Joi.array().min(8).max(40).items(intRating).required() }) + .when('q3', {is: '50+', then: Joi.array().min(40).items(intRating).required().required() }), + // Rate the reputation of Parisians in general, 1-5 rating + q6: intRating.required() +}); + +var response = { + q1: true, + q2: true, + q3: '1-5', + q4: [5], + q5: [1], + q6: 2 +}; + +Joi.assert(response, schema); diff --git a/node_modules/jsonwebtoken/node_modules/joi/examples/customMessage.js b/node_modules/jsonwebtoken/node_modules/joi/examples/customMessage.js new file mode 100755 index 0000000..38cd28a --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/examples/customMessage.js @@ -0,0 +1,22 @@ +var Joi = require('../'); + + +var schema = Joi.object().options({ abortEarly: false }).keys({ + email: Joi.string().email().required().label('User Email'), + password: Joi.string().min(8).required(), + password_confirmation: Joi.any().valid(Joi.ref('password')).required().options({ language: { any: { allowOnly: 'must match password' }, label: 'Password Confirmation' } }).label('This label is not used because language.label takes precedence'), + first_name: Joi.string().required(), + last_name: Joi.string().required(), + company: Joi.string().optional() +}); + + +var data = { + email: 'not_a_valid_email_to_show_custom_label', + password: 'abcd1234', + password_confirmation: 'abc1', + first_name: 'Joe', + last_name: 'Doe' +}; + +Joi.assert(data, schema); diff --git a/node_modules/jsonwebtoken/node_modules/joi/examples/multipleWhen.js b/node_modules/jsonwebtoken/node_modules/joi/examples/multipleWhen.js new file mode 100755 index 0000000..b13cba9 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/examples/multipleWhen.js @@ -0,0 +1,17 @@ +var Joi = require('../'); + + +var schema = { + type: Joi.string().required(), + subtype: Joi.alternatives() + .when('type', {is: 'video', then: Joi.valid('mp4', 'wav')}) + .when('type', {is: 'audio', then: Joi.valid('mp3')}) + .when('type', {is: 'image', then: Joi.valid('jpg', 'png')}) + .when('type', {is: 'pdf' , then: Joi.valid('document')}) +}; + + +Joi.assert({ type: 'video', subtype: 'mp4' }, schema); // Pass +Joi.assert({ type: 'video', subtype: 'wav' }, schema); // Pass +Joi.assert({ type: 'other', subtype: 'something' }, schema); // Fail +Joi.assert({ type: 'audio', subtype: 'mp4' }, schema); // Fail diff --git a/node_modules/jsonwebtoken/node_modules/joi/generate-readme-toc.js b/node_modules/jsonwebtoken/node_modules/joi/generate-readme-toc.js new file mode 100644 index 0000000..c2db5d3 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/generate-readme-toc.js @@ -0,0 +1,21 @@ +var Toc = require('markdown-toc'); +var Fs = require('fs'); +var Package = require('./package.json'); + +var filename = './API.md'; + +var api = Fs.readFileSync(filename, 'utf8'); +var tocOptions = { + bullets: '-', + slugify: function (text) { + + return text.toLowerCase() + .replace(/\s/g, '-') + .replace(/[^\w-]/g, ''); + } +}; + +var output = Toc.insert(api, tocOptions) + .replace(/(.|\n)*/, '\n# ' + Package.version + ' API Reference\n'); + +Fs.writeFileSync(filename, output); diff --git a/node_modules/jsonwebtoken/node_modules/joi/images/joi.png b/node_modules/jsonwebtoken/node_modules/joi/images/joi.png new file mode 100755 index 0000000000000000000000000000000000000000..d240833802bcd4e4e0becde614466a3f36f09480 GIT binary patch literal 30662 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�bm z^(;!GU@@RU9*Gv=OpPj^ak=7>V*2|n!*(HyBhi4c$QebK-_}%g{h{C;l zok0FY5gMWsNNB@Rw@k5&JYg9vDbZ%}wqN7gYkcSBt0*s;xdDH9r+w+RSCZo@dKAGA zGVLGH%7O4}{ZfDY?Mn}P`@OdigDc0ZFT{Zmc1qjntYYy3a$9h1^WDxMBd%!jpuJUM zk-qN1$ajY&pTRiEBR?Iow(W(BORgd)I7O?(!NJAG+cqmRGt(QAg4P@U&9DtoBE%sE zV-|NITzt_vy(|_YlBO2q?JU@FRjrbTN-$mb+*bE21wj;LH=67$zMCPWgp({Zq!WQ1 zR?jGP2^&iWOVq=$!?HtpNM=bpbbUMXFrH{cU5_dxB_!g}fh4`xHH)vpWj}WAx;M#f zl*at(s#~>2uw?(7t@r_F-wRCOCGa~peV4o=-rkh?!KDAjgJl5~sX=BN~`6rdJ)~i0SXQzjD zdVPG_tF~nlKD}z0LY8MGt7^m*JZK<_F7wgD5R#(!;=h3!)gs*=x{2Y&QOT$2T&5_y zy!#QuwPwHJVxdguX1)MyS)fv%O38xThYTm&-?irtHc#BAwzAoK=P2C0*Dg+$Z>w|I zm9B@+e3pVpLJl!37}R=cTPI{l5hfkajMJ@r_(-n5vcAz5GB~HA?nVry@z)C6a?T+R z?|<>2rpCE-g@lmr?4scuXn)(R-^SlRYH%>KuMl3g-yG#)Z0{eAZawG_+h-m=Vd1fb zffvlog)x?)1=Q0;1&=31mY1f*#+QgTZ&MZNyc2qQ`T&bEqraslvr3$XSB!Y_-%FQb z@*7rcOi^sk%i_iC@}d$Fqi0rZ>=f#tT4Vl9aC`t|wN-!o^85D3rIV+@e(5D@OdXDL z>C?j|ySD@(Pp+tOf!b)td9Kck$M*&A6K=CGAB8qbcy_o~d%|TIIrtv=3dB!m6-S@B zYmDh?j7TY_xm=qMj9#)Fc}2klag56pM=@%^g$~qcQzH3OR*x6j;T@bQfg0!bL`+JTsK<}GOeABN%&peQi)YPG2{v?Bi(I6vf+*wTo!$o zBF>cPwndvWd3qq<-WkvHce_1+o*^&KU!_RAi4Uh|JVSl9gll>&PnFv0Es)g)($12d z@_fGT9-e!Ru;;#+-v*& z;9qa6Blh5B-6uHQ-lVPwew{HU1s*OiC`UV38f8WSuzL@l_rZH1zMRDlIloZ`9Qs$s z5+f56I&%o~!J76pd;7Ek2As2-B(XbmYDz;hW6MS zaGG&@Ym#Eucipn@?EKSu0txRX=UlP}tfvC^j!y)nrI9agMvH=SQq%QmDU~3N-j^x8 zMe<5iN@YKF5$=y!`oA>HYmlNd+nIs^)6|4onq zA2^7^y2hy0ly0qN;EW637A4G_@Q3ecV9cYf-utVbo}F53V!B(%a9!%r_d0|;DX2MHm;~*|HMkim8#6TMviyj6Q3k-WQmM2&2J* z-gqEZ*jlgD9N=hyo$KLvyibZ+>esB!~-N3J)YyEJT3uJ#SGK&+3lp7{p^7`51j zZZh{TcANktELO(RuxuiCV*mKq`Y}q#Ea)=L(+iob#kPeMVf0r2=#g?QUzf>rR9fnn zZ>PgHoX#T$EPSknJI1(89F7nx>gy-c(pX*W>=fpbzp{^V%WC|_U|#Fx^wBv%>KnuN z12nA4a^_YM&SuHfC}77!CxXWJ+N@L(=i&8B%dRckedLTKWpw_zNd*IS^}9y(?qY^- z|0h%{3+pSfFvDWcAXg_60|@hbQO{Ex0RcZjbLMPK7>GcTFN==XQ0^>kJ->DYMhc)xjQ)n~OoHA&_g#&+r>f({SMXLS& z5Hz|ZAgBmLp`okqRcwE5&>pSN3Ya{;DB~gMk@ej^$K&vwQL8V>u6tTpnK98T(Gm1^ zq3-~L8ymzozePI6Yuc46Ogpl?oD6G&A03yLO>q@04|FBGr#CGlGk=px6DR;9GNe8h z3}|R-MeA+X2HdA#NEw4EyJNdFJZ1&mZZUJXFJenbjDY)pkL$!GnmbOr@99I%>*rmB z6?Fm!doD|Tgq%l~CdnhM4Qb4CT)@Xiw%cikUq`84&}3VCUVzZ3&p9MmBuVl?uq|Hv zrO~7|x@czq1mE4?+dDZi68u8af`{YqUqvV<{mqoC&@;$8ziL;m_3%ujr!Ra1minez z(t4~Ur6GB#=#eJq=0|chf)&h2S+0wis4d-FPLjUsStHg$U8F0;H(R8nN~Ho3R9^qZ z7RWN?PdC(M^r|--S6jX=v?BYIsPTr|kbNhfJf20luWvDAgEvVE1$J=}6Bl1Ht}Bf% z3Ti`V0t(BhgfToDfee)ePhWP1^P-C=|*-(C)Ie&ONTQsWQ?Ya7CSh( z=2y0*T_Fv0%SwOf>e~qFD~JeM8%F@qQhi<@s{hMvMH$tAk`~gma(9eE7t2E_FlxNc zdfGQwAbYCE#vXR)VfkmygWJy{u@jwHF%?d?i7bQu-jr$~mZ}Z7Zg)!Ou~4gb-^9Du z2_5Q=AJ5cc8MLVd8&8eGXP=o6Higt|)cOtY?Nf(P!_-g$w;J;)`D=Tr>BpebSajIbUx4VqTvS^wQ9? zCT*TEW7IUu4OnOb;fDi4h{X0%8s4&*p{WWuUV{~lSd*VhctXzBMV@}qqkN206vH>R z%Bu@JbwNtZI2g^v{Jaw?KyEqG!YzW~nrd3~PYcc-OCj$p-Q!}<9Bj}1hSI2!4gx}a zqYL|rX5HY=E`!yjEoAz7V(fS;aL0;$3sR-H?#~*mqXOEld)3i-tCREdPZZ-G;p{oH zf3aM*yhuI86FOlF`&5;t8`c~Ygg@jv1)VHH9+K@)hhe`IM6P}sp*dEw!;aT5TO3o| z4`7b~A3D@3Ciam*@evsx5U>EUAklQVmconVkCczi%rsUj!m}OiaWk{E!+U|wo&5(& zMMqA!@ZLl+HkqX_E=sOdhCUpY6 zJ+0EX_wLqk(f;^Tp*^<7I!t}~xz+h|dR66o|# zn!Ixe1V1y0?TfD?9mN*+sKk=ZERFKF9pl6L#*oDfl~K;3KQ9OUb>Mae0`G$Pl1Bp3 zHr2{`twsUwX^x7oYg1Yye8)U z)Lo$nF)Q_~(va3p<&D0Z#wbI?6g#OGGfArdu2`-q;B8D2Z6~uUlyo?b6qoL%8vevt zkDPT(OUM=u-bNdo8zSrHYxFI)2Q|H2oSBpjXs^3yZgKI~%?(H<@RV;4`&#O1BJ45x zsnK>W*F2!t{~Fq_Bf6KA#Xybqk8(pw(Gf5H?MJ5pl6tx^+GIY(nZ*l+Nl?cSO?cJE z`)hP!15%_1B85Qp+t@Mi!$S|7BVekP2KfH|ltF*9*KdwjJDxgF0XzI1QHRow%AY@j z(B|>t?G_#CfWDpgq3cS@;_>Y1W-W=3prRU`v3h`V5Jr^jMpJd=gyg`mPUAbr-Q7%- zGXCBDnYSmwT@K2z$F#mwNv}c&F$1L?Z=vLoicAo3sfOj6_<^uO80X z^6jS&g~T$C7x%&L`%6XYRC?u^KXG*!rzo^oNx!|I-Oj(K=L~rYND36dxzR&O)T-}N*hw4Xb=5qeLjkmX>)+&baCV6jP4=FmieVjj91wCHxLk3h zO;gLXte#jHXCZ~?mXRNLif8#E9NgBOCQ3<=V0`1`vRSxMx)5E&!;vBC($p|`hd5Y@ zF|LbqXt*(IeH!eaM^-H$9nlDGfQW%I}cf` zVt1q#s~&q?*vYMZbCj`AHLZlR%VFdFt(|wreXL4u@Vb|X`SiqxW^(I<89J7ctX`Ri zBRfA-Q`=JoN8dWKzMdEz7+nbXGuUt3ZrN*m7`I0h75uTWmpYmC*!8SX#OmtzjqiUq zh4ffkLywP~XgB~Zr_h*oR_&cp5zd9Yn-(mCazwB(W6(r}F~p$zhoddwyw{{xrS1Tg z^x5i(^i8po>%tu6>+5)Y<*B<|f$U*^0jc4gp1P-M8I)qBiCgetRQ7w6C(Jv2Fctz* zDlh_1t){&9)grta4uL91mI8*9!5_J6w_R%|f0vr}9+weKS%K}MCzSu!(OJgR z`TlWSPIDYN-As4KbTg(M%}j3EbjMM{Fbo^Rbem?5HqK0LrhA&{`d`2Q15Z5gy508` z-|O@JeBKurLZpWBnJj|8gmq<(X^?VX18?)&>F0{S{C-d`6-*(Cd0!G=?)1Ki3e;cY zFFagtl5}Ri4%lmVhA*C0DXlIQpvjKxKJ&JqqoHBR9eWGr2n*C+a3Y9)_RJQ|*bXgA zK)ZpFOz5kCH7{|Iu$~%cx`NRZQr7=r?Qp)s!A?PMeNxhX6Wz^?XRcYZ6}B?@aH&kV zM}NH-9;y1!+1`FL+T=Vv-n4!sO*CIWyk4)Rqw^EAv>Tt!-1|fou>DjFVfGcnR?@gT zWQFsG-uNib{mOO%h6*N>04Cz$UinJJKt>9Ech7UAh|fBn!MB;EWG@Dp26)Y@7C$U;jq8blAQgv|?2HS{fSgmM-etqwM$2#&-IsPh)v01S3+j=FuTmHF`*d z+UeB^n`@I<@iT5S z(SB+tcVSe7mxdKEadxx>;k5e?LqVFL+0Avnw~*N=sJk00{uF?pQOobnAr9W zPIUgudR@m&hgyffTOSzp-pZk_5UZ!Lna!Is%h&-`AA`}k<10<=LC042V{-iBw;c>a^j5#W-tG!Le@@U_ z=EY9Z;;#4vaV9O;3KM1@@)))k+FNW&KgiD?b$SSpIa+!D&L{1KRsR*|mT6+>-1_<( zMyR3M;~sWC&0ab=4>Z<%qtac;m`}hy5U*4yZ$0b7jAl-r=_Vi|qHYlen@&nA7|iFcCvr#g4Da3$TjaAp*mRRgd<%$c;Tu^GY6csLWJw_*k9uDHe+oT z{E||~tJu&>8a~&hZmB%Co9(uyio=V@9$5+5a0=ua4gz8^N!3|hO(8-b7ZJDHMj8Jy zEzIrLmvX8x!V`2eGc(@Ou*sm!%#p3DyHGdJqr&4S%h-BiKe&`Lzf67+331Ino%75u z2qwOa&Vn>|HnDn!TZnP`U!Zdj4tmmPY~U7Bl4-mwr!rrDjxqkC;ZixFC|0GRD~$FcJJn9=p&oP(6P_iV1}oU6@K}f!fAutAml@B7QOO29>Blk z)O$Fb!;}tv?wYyGi(=@ z0>8tNsD73`US3Le3R`%5x+aE`N78(YDfvwDO3P}WYQb1V;03wP_WN3JPCF~cC>y?e z6ux^k?<%TE8I=>ddbtS>rppeJ*7l}s_=-Boy7hiYRD1b9i<7^uq8FsBlpy^tUsXCs zc?4Qf#(c?%Dd$X*X+FG(({C&wQ%*HtQv@lFJ*(2v5|gF?f`bau*!DyZ-YkEwbiW$h zSE%T!}vv!w5HjTC7s{csl|XF*;tuvT3F} zE6~v(#aE>8X0GGRQ+GG}`4wB8RCiLYn#9-E77n&1kJqoUm5u1gSj*DX9ao8IWM4Ev zo3?SnAY|S{aA>;tcsHD>Ys-cO>TxtGpGg+9gz$g?>oK1gUWFx7mcMqoR}EDt+U?C7 zw7}Da->j&?Ju8#gfqUB%Lv2)#a1fx`Oc}3KWHpr#&k1MB0lr3`-(g#mu$Qxl(_q*V z;#j)8q)bi!cz_^xhAn`?r-(ztpa+uPBn$Pl^~@$STy3XzSEq9& z1AII53fk@dpoz^j0%d$AL{ zJnhf*`{qHHKuh%QXIMH19HfC|t(N=h^hWFVZW5KQYsDO&HbRIxB&S^=raPcftwKQ@ z5q8+xlCSFG!es+lZl!DOmmu6*(seYR<>HLLCH9EV&CouLw2~yUnZ|6>`_L6F%!8+G zSVTz9`dc?9%*lM}yP1JEpN5CKXnjvkHM6?D($pNNz91XQn4jdW=Y6j`f3!MVJILi! zi%JIT>|3!`mLvX6;Xh9ovKzMlJ0J0s0aw9JNtY7CKSVsXr`M?=?3Q0C&U~9iZ}})3 z{j>fP*ep9fT1iPs%T=a16|G8Es=0Ild9yc;MUxn(I}0Z&Z9B%&)-N0>&l48?4l5CF zT2S8_fJ8k5AvWqJ8Zd_m#o+uXf(Z%E4O zI{E?(FWauhL63!fltPyLnNaF{m1PK0P9)mey~2tC_p&-cL@1I0Tl%yweH%Ukd={i9 zZ#;Q;J_|V+C?~mdc0HIm6IFokr+qbe6^`>rgFi8?89@pFQIe5|!ZAJUSESC=!uILsgHTW4V(WI_(`;|u=c=BeUo zYy^+?V#1pimAq|;$txZ^FhVWk;VdFd&Fk{zZ5K_U*|xCW*cq;6`+1L7d>&tv=O7%9 zX-_k#oIeOB+|ZEKjb-TbWR%jnJ}D;ZlT2BkuME+encO?dvrREmTC{20&#SUO(Byu8 z%STJXdiAAnh|w#~j8CyLT^u`t<7ne%c^ZcXXGp!2m=ZhsQ8+qskX?!4H~MT<4F|lX z3;FM#FvxJCyv$Jn+A9T#KdMKW21!acp_(K?5N1p6m$7|VTdyGhQ-jVk-@=&NKdf!z z2dA*vAZAu<1y#zJ=QV$od-;KH>@(!InOUksygg_C(2$z2wFby7FaG>Boxgi<@br08 zOjEg7on{(1LE8a$z_jOC&z`G|k|CL}h2kuMu(op2#tXCuEwtFEvrw!F`?G;7Ovc~n z3D81PWHT9qbW#ta>~V->J}nm<8o{v|%P7>)prxao=O=!)8&#XtAbLo7^gwJ#V)4>2 z0SkX%kRtvh z?D9%ERoQh=&hCMVUqS-$W5p(u*Sz^_ag*?KUgb8uVq1Z7OQ^B|4`=w4@P4Cj8^gix zY|Uj*XYAj|7cp~a+{GoqD<6f&qnk2bu4rPJsk;A*cx1w7=(O69^~6+8oh9nr+3-5J zPhOl8|i$SeXMXHV?L^;*7)q5*uzdEde0nB+^h)|RYz|HiQ$ zrE@1<{$lQ#?y>44_v`Yg&K*_QXusL&Kddf|P$;~rXm&~+ZL(!)>`%5^nn`oX(7b}$ zF|Tp|-Dk`iRgtG3WW-i1DLKU_pk+-Trqw6&3H?aTl88Y|oA>mcag||(0Vml=F|^n= z-m^@p>VJmgE&>9F(57+0vR>Jk&o4f;o?5NJXg7^?AwF zS<==$C8Uvq7oBQHActrc&qn+X&Zq4bzopX++!7k znVFdsHyV$rvSeqj*(AH2L~zVyHST3i-}mL-(Z5T zXP4%0_S5p!+kT{%ak7@;-JP|%`fzyDe~_;%eSCx%f-5xX4^++o>_LBUupVAPxlJQ= zqn|e=KNGF24FZU=IEnNfPjRlZmbTnPK zzJ1t1*N63d;^Yjd&@nfcvY{ks0`hPjwMCTyv&=@znrh~T3VK%|N75G`nYUykD^5n2 zKDIVUzpS&c6!g$Ds?;VbtoN396t`igfB*OK@$oN3SfL;z*a~~$>YA9EO01%y5(R!;txQ|>aKZDc^PXMQqSNS=%jilA zFPioIc$ti~NecF0pe3mB$PARfc~}gnu=#Ihch2PJDK4FN9{Hg!NzKgsQm@jtQ(v-m z9WBwXs$Uu5q9*>+iUD{#Px3Q))uDwfdF4?|eLghK)1abd39?M)d7al&y*oZp{BweU z*3htMHw9-83l%Y#%sXW(sWBxhLT}&lHY^Pl|Md6wfIHP?#hQt+!dSfLiQ@EKn(t&K zsqX{A(JWAQd-?wmG5GoV0^|7b*{l^&&)%MEWRIevB58uMq?8n33O&v#iNE^w%f(On zbO_mTwl8LDs$+NWLg{HHe5vK3v_yohg*DnpjInJx^-XH=P0`}7>>FL8#fv>Mc-k#r z{@VTzA6mV*i0AQ2XnJXu`jLP5sjEl-jOVw3#Oq^IupfG@o0)|}W_`-0oeA(@yctja z3pS8(PqN76vIF1!6a5B$TeR+R<~~QW+$C1336HYlS2ZhJUTI%`y9`%IBOR>}7qw_} zL<}F0`&{G+_(VirN6Ye$u&@|OXK3hU{rv*jxoTQG35>?NmP6i3uILcJjMP|2Xeen2 zyU&YnV#>)L6cYm4>DAasv~;y6rzaI1{lxC0GqDHqR2-ouX$~xU@QM#g4CQjk*fe8= zoLM99aFu~)B-3eCT+b_{->g>ukLh>~YY-zP)5x^N%Z?+|LZ)*~%mTH4w@n{p&$(-K zW}V~Iu$N(Y$EQ7^rXP17UQ@;tbbRFS5Y62HWTaK_19zV+d2>V(dKHhAA8^vnRo&s7 z=Pxj3?zl+9J^HPlhMaGQeDS7Bj38*Og6KYDH$ZOV<{O=QbtuO#b(9eFsWZRl>hAxuPJVm3nN%S$VQ=Xg0#KGdn0Jj z(yrc~BRZXht@70?u35O6H_6oN!AH{>+XU@hMee9;7Vk-}zV zNq^GT-fmjwNk%Q|W`Ej@Nk;vFua}(nvdqgR`tzb9^So)PHh0 zEWo0!0&0VO1I*O&@+9d^P2Zl~*#mBJ7g?LQ-GG-l5iFzcxI}(FL6=Vx(2o6ak^1?| zJs);&136O^<9m@@YWLq-Rn7~Zhkgauqhwsh_ifyxr@Xhc8Eh(tPq5K~<_GGyzqJ2I zOJq?snp0yTKhad{j)}UIo#;E$g+=t2bPOa|ta9T8M&-6gQXNy6ue$TUA?#>qWy4LYU$4)J z?|cS1tIrLkc_10z*z73a{TS)vL32^5l;)5fZm2ojbZ{LFInGrgX`mqGW2}7@Nvi-u zJ!2;I4ru-ILh9%SFDO{k_SI@r+Vxx?mu~B=*!T|vNi1kqRPCT{VyYGk7{V`eNGVv~ zzkg9B&!nEF%luj}o3oPAr0KM*^k6ra_l*{vWSl{Ei5S^YKG?(dpo0S=d-D#b{vXpV z8sj#&ZcIA^p3v?;h7C$pE$Bcnq3V&PbW7tGT{r$AzfKJ41rn!HXA84~c*809i7G4~ zMPXh>`oB8wCZ9{6!`Smr!oJBjzVr+IUQA&jMeQvQ2|)1EWUv~RJ}VcLNLR%W)&@=e zw^~%&IVzMf;($q#ZNQ0^#xglMX(8_E`bYBU*1cMT{MV1Qx)3KKw^ob>2WoZv);DhC zOR>X+V@KYp7B~4T?SbcY$2k?hnjN%-O~)Hk9dJOQh>FAP&?2aVO=Rflq z!@V8V$n=&?ZPCIuC;Fm=5;}O>d^^@38k~gfawNFM%Zu_bv>_&4Nl%$!jE`?^J^?eH zZx(P7(I89D{>72`sSJ16Ubt@jhX{kctE<5{#mPu$SJz~>6T=e+5-P)a$NHDda0muk zHCZZ8-m{iAT^qMjM1pEU(5|^(gCmkSWOeWrW4b86b~?T65ovzb;(f#6!>jJoX}(;qgx3LK`(r$H2@w5Xv$0Hf8Y!p5Au#7Vy_`}^kTQwV0ML8s4jy*u-qd8+5I z<%waITG~dj%#z-aIzxt_|7a$uF}KSG$;IAk;KfkK!&YcwVE2WhitanzkY$Sd(ZSI3 zt?sMwyk?kRD1OkCiEBhUIOW)_`^qxr@{0EMh9bG)pH=VnJ_uiwlaI)<;;X(Yb z{gxk%^H7Qvv>Y>CY@r@4+4Xk)T%J)NA-|%RJ0k)+W?-Py9hXsUz!{ZMjj3X2sGNnx z0>|;cuVzhDBy(u$ri*D)^QEvXJg1jHVVgV?pe=A!*hK%zw>p`!w<)!xQx|%uE_+Tv z{}5?dVHE1(?M=FLy0f!mb9J)Ou`w=HrdSKIavh1Y-*HiX`MA=| zyF=EF2k8{`NP&>Db9m@D{a2*YtTQJ(9JQ^TVq&`JQ)xZd;nl6xIq#uU|8WG~30>4B z$Y$5Ki4D$I*IqX8Ed`z+?+>kRf0+Ymn@gV3q+dbcZx%tJ`-dK306-fb*ZHqt$~|a7 zA8dY1Pro&E#1FPz8X3>1<6{r*QH4y0e1;_++-X)CtC(Q<@(QZ9D%aJ`7 zGF#RUrF52jy$pn9p zKzd=l%oE=H6jj9-#=7h7I2Nub8;-y5qZz5|;=ude{e&ku_n5})F;5jzzevc2zCotS z%m0^=gPd`L$#f1cU&b*b5Q&M2&#DZVIvp%j^?3hG-ptl;tJ#N=9Q8`)?TV7iT2-NS zYrT8qoV(>Er(qBqh~#SY9JNck7o-rCACJE%3l-EwZI`rU$zg4Ot2X-cL-32>M-{Zj zAu8)hxKA+T+5XYEioNs1ovqo~f10U;eTT<)kHw;HjXV~VO3pm+`?LIX`_~tE;wQ(q zEZO>H-!HmD`Ic^H#E2o=7E_}GNz|>Izg=3+f4ls8z4556tqtXiQN@&VQ_I#2qD(SM zUJV%Y*GjZq+c&9ziv+Mo)&^6Aq=oyAen7y{0)+elR}OLqwUaG+k;N3Z1|c&Gis4W` zHShWPM)G3pm>5d7BS)~u`d24AQ6??`D@J}QN)CcGbinZQb=$MR<5x<-t%#b*ecf*E z{5p8A#3ApI%$`X;D^o2-;X5bI&ozf5e_JeH>!q6;s9Trpogg}egvjP^O2VEU(^4=V zlxFmOk$#qG@416t$YN(oP9%5Be-ZRRhtek5HdkwdK5Oa6GYj(~pcZqt*E?ilQFn&S zT?F6ulu{w%riGKZs#_u|YLdI=6+ZREuMJ9oQXDKvAH+jGfQSfX3;`P7YtEgsWoW^E zlPu0Hdg}W3*wvxKpr;J_Guzt zf1#H0;w+(t@mo3QJxx{4ryn_;dbX0=Gs);71-n(~B8oU<#HK@gQF+1#l%iH|D!sJh z;DXYEkQgkw00_2|i<8~m^_gq?3+h=5KU!)rH~XER#Y6RpPB{h@(=R;(A)=LaEb5i8 zrW^ueOPmN0##rq;UIX>%f8XbLZ7@48o6$d5t0RyHzAIB0amj~TVOw$2poA#orTBnx zpRJa&*~jYNsku^8^%fz-!Tvq|64y~W;O)5c&s?#KEi;lFt^O0sb}2FdLC2P1^WU>CG-tR} zcg9rIbmeS}W)+olW;!Ti_{v1^zl2a)zX_FdnXOVJRp!jVEh;Lac}%x?5ZKiYp}!3( z(d4WV5FmsWhs$bAd0kgunmka!G-Z>oLu3e@-`u|ZWc6(PBkU3?w=ty)GwE{j`1_nb z7&#&}{}b16bSpwy6*VoVFPKl~^sAisby*JeZS!kFz0D&UcIa+?7=LV!{-4jh!*Tjk zDr@h$X;m$VDm8^Iq97A)Q|V+Ym*;E9z|rqIpY(@Or%>J zeLFTE6`(t>NEm&1Z3K-iHIucKvjA|NSyf2oORZQArcuGNsAS4r83I~5+pUE5%fZlV zRc}MbjggH1zxbNY%>Upq&S#wZ!vd!4quA*PRs}!hVTr6qgu!==bi0Q|WKAJC=yapMJf>rxntZ zEeMv1?D=};$97F>+H;0DJrTi|H&%{dSf9AVeCSVI{TfEw`?v;biDDDo01;0t!Y#$7 zS@tI^v=%eCXH{pj`J$!|PHc}KKX!P1gi>(#$5D?pgAARkCE#=#=C|PEy3m#(;xY@k zK2%;W*Zlv$h2mPDSiaPj~rpQ74|bPArfbs>4BpXDktxXY|A-+jF zaFNHd<3S4&!XZ2Z0^?bj4;TMEkl9>=sca$IXC6(j>l`0V{Zt3sajRz^Ine@j4Jc_U zg7EwqJ2*7`SI93FF1|SiF1)^nBl#Ykro!LEdiJf|!mr1B zn*HV;M$tC?_W?CUEbEZkgNQn2qQ_1LC$K<%xkB>iZ@5V36K*l_(ll#Il~fzPs4XIj z($VD5S=j1_SM=A;m9LNfo`1W5ts?KH-?7OeZ^xzGR?oJfu^^(!@Y*c(^98r_gjt}O z2#im>MzwO7DH=XHPEx!T78~sa+0sJ8IaOOuz_CZQTK>6lKZE)zBs#Pm%U{Y`B6JEngzX_i=~yo$q)h`c!~+RYI!SnKO2ewwKb?eR*pU)_LjO+ zB4Y^!L}dDx!x6JQZt0WMnI*@!M<4p3X((yfQYo2Ne@RGgxcM%rmd9BKTbVi?Z{GN4 zs# zJtMNSoz^1hFEcJ&_i`qFPvVw%oxeEakBZ{;5`1-fM^UP?NxLP~b8MVbFF_Gc@wVpz zN+6q46SG&WG!l6jN~XjEReu%I+-i`E@)j?eDc&AU4}y(=m>PjjXcI=ot38dFSvQly zq6(&Dzk?S(7Q_jFvw{+;eE(N zKAFRAe3nLR5|(E(m3Ws`BP!a%HR~3TuO_rJv3cUU${MxM?kEN-8vX_jI zx-6bPwG_va7+1C)R~)!r;ua2%hpi3!6ScjC6QaHrn_wu%${nqXKZW{E4iISRBKf6q z9bH}V_0py?Gyk|5Z`~FL(>`hry#G_dghP{CX>)bo&{y@PSAu)9|Lvth?c9G<*oZV#;v_}?Ae%2h-~Q81$vNUCZ2x$oQpb69nnZN|r%JK@ zCvn+$InnUvIU&2|?tAJ_pmP)-rCh%-J$J}T+mNN_o5LIU1wZFwM?Oe(fbcLHPb9=Hvjt=-OAh5#q?}wSZe0qw%+5VH`kU3h=J+H7lHoyH~2O6+WTiu zm%Umi04w|lgosYEXKq-JGsA44Iy0nNY@@V6JsWRZPZiR076dODoSv_K19}@{E=p$` z&M{V&6057@$DU%*4b!v*x~Y)~EtzaN{?p{X4_z`G3(MC>_>B}q6PV0TX3#)YpEU`PPe0x4T}2~ zd?W6^&5%w)BBzhxZZ^lpyH6*Y2fX}a7YkNhHio|Hn)=_)d98;GDao`*olz0f+3~EC z&v){b6GqCssRo;$kmDL~8P;dh%vyyqe_aZ}>N*4<@oztV*gU#8Tw4y01iU)f42Eoa zBZdC=2|(OYnbVStE`GC{Wsl&YCTC~Wi{qr{?Xv|})VLDR&3AfT$Pk6L{G6HTJ=wUc zG;NOo9Jz+ZniMUz$lU^ zl$VWdqjO){e#16zqM?~@1#)8>bNVw6KK^ko&1ZGe$>Sy)WeR5!%7&W78qs;}zIDMj zz6`*RSnqn}2_SI5DPI8;YzZD7p8pe+fw}6V%Oh$r%l@WW7*<5j_wT~0$@pH@uiv6$ zJ(37m$L>1h!wxrPK>H6@Mcf=ZO|`SW(s}r2rXUs4b87XM5YJR{eNd?b)M7CK<*ejxhLaxabd<+1f8#| zAXH@|)35F_xiyP$4jfWk%w#&5-f;9t;C4Z#uGr8Fnm*(DuAJ7gLn!7kj9oEoi~MP{ zUmi|}j>OZcc=ApORlpku<4KM!#ejnrBS)Ir@CnBhnr>QB&ofZm^_ZD~x<)pZ8(BwYXyn0+QTd5pUqg7?Jad~VPb=Yb1m?uWE3fQM&rn>AtsRGpyvWsdTtdR8Zfyd@d*#Mjy@@_pI$}Zplm%_$tjN4=5CC3a~a#`#TZ_RPirWw5K%H_ z;mkxB7f27kYrK?Y<@r;^_OsUx!Q9={5$JnmF6O(8LHwB2R3C!jHT{?DlbeJ|rgD>6 zk$xF~CVrWAE+rOcQA#BxHFf&$Eb{e(k)Y6;B?Uo1=^+qP6EwR?^i) z793fp7iz=wdkF~-D7aJBqRp1E7}KibXsCDuU_UQdrGy?v%QNy@JrQOlY^BX@U0*xy zV{x>5eP9CV{3FTx#Q$**Z7Cn+3q+ukWLg*%vn$pafK zYAR03b??fMS`1>(-x8FSU1T`=6p1DN=EUBMRrvUtVejr@k=+@7i`a_6rEl?i&dxfy zG4V~|?Ow-;ydrV_6Ju`ot{s()ehS}aKL?FZ)EE(Jq$0ASrYq&zvj++W99ao-&C!Q} zz!Gd~L>k>Jnv|Su6u|(T4$dO!8XMkdSn{voJ%wSFBT2oMa!1EOSTH z?38qp-|z2kB>az1nAvmejB{JGaB?+DZ+C*OwuQ9}v`R-k&|j3lE)-|0+P6|-%d@ff z-fK=p+#C$Ko3U-f6E_0zlgw#yGLkz=YYx>BYS0+Q5+{&k1%xdy>$yjJeS$H*sX_{e zw?N1R@T31TZscV_<~%-3Vspns(>OjUdsGfZpUXH;<4$Wx$ksqH>xJ_a%KDNiESG;d z7ATWq07mEC-5tbY?EQUv0HCQ6ZCk+ZCF~b|5m|55!z3Orlv?$V`8az|4kIB z=2UrU!|3EoD?}}|!@k@^lMvkx(C*LHSiW0*2)PjFBQ+armo$HnloJxM%N(UQsr+tv zb8~2}>8Rqcq!!=qm#x^pp0i}$;5j^NF({vAFRVStk8faz1wxGfr&g!xmqj_4Vw_p0 zbM&P!6;k5hOX?^sx8Ye-&D6TZG91}OQs*=2(CiEv+p+nr*Lys|HTK@%`UL$mz_KxfqWw&W$S1eQ=iI*fFJ)#K2$PJU_Rc zmB07gLRW%*`+|;^-?u_S7h)=8)2Eb|PJ?>+6H^%23a1!qOLnj$fH#bFWCPk{w(o$= z%>dV%Z`o~o|6&1c7ASyo&D#8>Cr{$6YIK$Zc;`+#1`esnO{P~}h>u`j^}g5H@8}x= zgm?M09%or+rwr#NN7j?|Q()@n9^H;f{*NW3C!m_wqli$P%bW&CGQ2}5USSkHMwu(G zjHL*Vme{v?!i<7>PC;|gofZ$)JX3$f!0*u zZh%1eZt6CWoJcT2nBN*AF)PksuOZ6?#qSjjMVvGHR}iT;)R#+4scN7jP-bd5oyR-l z%2+l0{hfv6Bs6$mf?KS|I~ZC%B!qRk5;@q&ZtT8yx0JJG2;6Yak|~F}%<&*)n5ss} zl8z&+9f%X|Hs4#X)yofJQwD|ze*F4h#h~T4+Xg`Y{zR}sv#QlMyj}Fd+^?BZLD)dq z=;x_`_O39+Z(;4A2XC~5dN`D%B_Ge%?WWN-nd5D-odh9(Fm4_F04nH3`*z!S;i9Ec zHEj6rw97U5CSlOqnS=Slg;`Z-7)0b;Kh7O*I)%P z-@XfUtx0Jf3fG*?$F0lD4xZoW^4Fd zv^0Yy&xTaf|7^td$jB^!3I}89qRhx8NzJ=h|C`4L@eER8@%j^-wl>M5JCxCSKxZU? z=9XLuwpwGp;SEQpNBV4$dc_S1gcB?4=xFf^iVj2)Nrx43c>DU++ggX2zv}90EzB`7 z0XHn;UV^y|oqF86W!=9t{^?l5eZxoa0NveQ_A zZai%N?&q;|jlAWc$5RxGS&#!E4hNoeUyh85@8jeUjAzr&F+}lcl~dP(9p~l(Gc}aq z{R+&%MY~|br2Th(4on~bOyb$9Rc8{1<659%ZD`1!I3v+dBMKIVL|CmVWmgcdzq^3y zbn_Pg@>ZQTi9<`D6atqhh#Eg9$zs@M!S+w42=hFM<{7xf8wz5>6lsEzfzX8t#(x%$OmJlpT7gEfQY*}L-N$F)V^vi~e!e^SG{R#loMkXxyZLjcR%_){ zC%3VQ#l_!4m<67nDhw*vs&`>e1!4i{y~Iqy@c$9hf`6GAXRJ?sN>&Qz{507h?8W!a=2aNE37o$-FPS&R&4e!11v6xlW*q8z( z)1jZdMaTM77)>)xxb%Hw%ljf<=JZ5Q)N9W?fq0=4};ogd|^lbr4edf zspso!X|a|rtj;BTpn>@m`xKa;JlsJ}!4+J}wEC+_5KKKSN=h7bV4mJm30xNP`lcrk z8&j>S=OPaQMCq*v?a7WF+hj8YVC+Z*$n^#29PehhY;3}vZEbj5NnbK94qh!mFuHu~ z>jT`j$PxyPt4##$&B+;`@n)@hYc*yW7&hstvy6H&M?dGI`_ahZptx`cO#G02n_c8_ z@PjbkUK?*cx9aEbN*KNt6!Z0ET4NxP0cZI{9ne7pd@vS+PtbBp)Op6cXS}|Z8KeQG zxRL%YeReQlj PX(;N-I!e_F))D^$)aC-*dvSLSTHK|<-Mv6@cY+poc=P%G{(*O9cQ%vE zWOwg#<=lJD6Q!ywgN96m3;+Po z0kU%mAU~`FrQOHS1P&m0bTH4rI003UAKn*KR4KSY2!{)8HLS#^? zf}=VvB89qmOb|{IEyHIdO!>&qg)6vfeOOXbu*9PUkudS`L9w`MjHuDb%Lx0Qi{e9z zBcsP(c6^I%7dsygr`~@r2_IG80GnnIdJ$36WjWNif>0~O$*{IVM+S#?_L)V4k*S>k zn21g0pIzUmpa72nf`VTudl9+;P+s#Wh=5+DoL*Lvh!2bt@hk(Vpr25^Zb`ffh(S02 zQJ;A6Qh=y5R1h$eRs&D~3ow~5`@RQIWdfMc1s=`=f`E@%zEA-D)X%t31xWykPZp7q z0BZq2^^A736hN01fMcmJ$Ol+v0sbGCXCT9d49cD86X*v9_INYYtrrDy*{oYxG z?7^HE+c%Q{KtU2Nyr$7>r>D8&LFmRzCq3{Vl;6May&ud}If()QJ8l89?~E)> zL_q@ZLH6%OG#9YeMkodD4>6XF7^1%c1>jYk8>jzlBUPB#wz6`tzrQR$D6VfhuH*l1 z)o2Fx^BI@ z4*(HGU&yP!yH<2Pf(QUe76dcYixJ=U z5is_`lk~x@_o2L+aQ_si9_$y#6h}4>B5^VKQXL{rA3jx2%3#9sSCo{qSIs&+#R;9c zU#k^e$O+@w6fv)lzB3pJR%{gUlj-NxNT~18x>WIq_*r3(pZjECv16zy#v*alC>4^p zWZBfCH7T@YNw0-mp!p&Uq}!7OMgi<0ui>3CY^lMGYC?Zee@nEL^AP=%E<*WZ?#7m# zfLD<7$EBG_D3-hM=uee3#%hAF#0YEeF#!U{pdBmo@PK#&FC$Wl*+c_nHEPu`QN4CG zOh?q6*-V2cEOxL|FA_Jbr#OWvnV77uqOS6?Y&iu9H7C|85)Ts0PqltJ%9L`2X4-bF zr$K`6>}(ObvW!%V*a@FlFnuE>26?Elqa@hr+7hAV8h&ZcVb4j=IjB>C87p!)Wr?U# z##YU38ximvidi#q>$)Yzq0AO9gwcz}7pc>r&b$u6c< zoUOi5UZ{!1mGDixrVylFrxsEEiPJrsZz>c|PNAfxC~cm|8sGZCrta9S9cv?vOgZC^ z&fEl8<~ZXR=GGGxEgUy=B+`nWFoytvz>3h5pe|FflyE+Va72@phwU`;C<`OYQA?Kr z#NdaUG>)7mpGKQT%)p{qQCV8KS&5=`qcx$KP+_FuUn{M}p|Mwi^f$dqs}iVsszIz_ zRUuFwQE64~s44O*K<_OIUT;8gKtPxNFbLfTdkh9eOXp=wc)CbOv-XRteK^z$1+njg2zoGCUkpRU*J?rb zAb(S<@Ay_NL$w1JDP1Z4?f!9ZLI`LPE9h0E-$(;on_Y1DwfQ%*r*khv{D*GS!7Ns~ zGng~W9DATo6JG{xfEqdTGFJFjZLXm=kugyUArs6Q!pu3u!yBVr`|@sg&W1Zab9ca; zrkwus^0m4P?hBiXi1qwQ&ipTVdK|8Q21X^e)edGwQ1a7QZMUieR3ub_t$rU-v6!(W z>C`OMx0HBRKA2wO3*QU7g7u+a9)0{i_r#0vuUXtTuAGa-7PN`siY0{9gdFtMe6}7vORV|)aFjWn zG;M<(rW$a(_y@uC&@^Ts0F^E*B1|V-B;F}fmuQwPgUfSvUBY!s@>w!nax=$@O@*(H zNuG;AxRUvY;3`i$XS>KSv!&kTf-X>3&Q5`ZkC~yC+rh4T>-GF5Vi&lJvgeDR$uer_ zK}ZKg3jJ+$a}bOU&FQGs|8!5K@9c_ zDplt?8MOgjv_49j>zYjM`_ zGjIc!>DRpuh$9@wd$QJ3n=7gY+stPy=Pbd8n@oB7=;@UihZ*P&Xe+DDXj|IN=Xdu~ zYb+U4^lKfVAc?l(9>La5i?XrlDFG49Uz)d?&zjs9a~r=+mmVEvFNl3R?>WyF*7Q3c z-h{`x*R-Itlol)(EMDYZnjS=Iqbk9V=`Z$%HOltR=OZw4FmDJ{=%A&xzYC;uLYnFc zi(gM=&_~F--+`B&OlaI_T5-90*)RIv_1je@g=ZH}Hho@Y*2pn(IR*8+~{Y*xV`^C?!>GqJ!lpnm}K)4Iu8 z5yrH>C!JQE>^gp9`xCbl!S|GTm649z zj_let1KYL>pRV7&mJeX!Jf7)|+b-`bypP3&JU*d~t{Wf6hoOhNExe5Y7rM9UiH;Rd zx{I1ll}_VZ(Q~mCiH(Q_5&ie|<;(TJAHALhH?!+95Ab23Gw(@v2^bP^30Vmf;b`Hf zdA!1We7hnpZ{XK5i5c@5+C2RCqW6hfd_0zb$A#0S>DkQL!i?*TlpcG(lDCuIQ^LBn z;r?N=?lCV8HlthZm-9Z)bx+dE;w=o7eLspo`VZ@;hC7WvWiKg&DJdVYFqt>6W*kgw z5WGoYCabOl0Qk@V070Puz|#lh3I+h&Spk3(699le69B+>Og0{p20--)$w`W7daa%T z-BS&g8tww|b4-0Q3$U%{(LQ2E<5cnvw&>d^TViSs=E=Qn{@ib-JtxA$*8ERWx?D3FbWKvHhi} zw#737d?uGKH&`*dyIa^?PxxfXQjeA_0beaKa;V6wOW1%JpTla(+}b3la0d%I7|@m* zUTfQGz?>WfO9$)>QRE+5)=dQpc&h6X?EWmFW9MX*WJnWV;`}~KA8wzdY~@7H9=&Vg zWP+JLGcc-~nKf_quluyNxUC|psOURc;4KzIRps%;x!Fz#-0j_6vOH}Pb<#b^ts|}v6pT8jS2|r6_d*xDnc7<_QTCkOc}*x9XYPkBKcm7ecRgrWvS12 z3C`D*8aB4J#br&O1{y0WYx~dL*f<3x>2dn^t{N>S@Jf|(;;E6FTUs=9H6sC|$>P3N z0%>V!kwudHSw*JbVEC9u@_-%x5JDIQz|_OiGIC|}UY%s^?Y^?K$+=Fu*gowYSI@7% zlI4hqPR0&7*|ShL3=I`?gn^!2FG8xgwlGoQo%w+V-Uqn9=4?F9m&M!|hu7h5qDG1`ONX>{jN{hMrRSR~ z=5NrlspWWcl>_dY@~_sj7YsaRr5FuCxrbd!&7h0o>Y|V^6nqX|&fZu(jz4Z_QtDni zZTN_Ap@>Djo29gP%m$;q+W>o}8XSE5*-lRum>o9dZ|$)$EL}ehXeSnxa@dsOigv$8 z%ga|()s1j6i9VKfzm$pGfO+64G`KD5tUe8GK_eCgQOn8}MKa2bMx%yAQXoe{huCCy zOEO+4mCegDWXZ0j6OtTX=5z4#lB`$TGZ3RhRI!6o9aceUlNK2m@nKfb0lf_$GrW>W z8=youC_T*jpy_U-UstR?58bq{=m-lmQjv|4%qbE$QganJ0}X6;+xNbg8z0UqKqX)O zAZ_B^wH62Bd8Q`fi3?CycdAY1jw0;_^Tc&d#$)QQu!8$YHLk{Biytm(<;%*F~t zb4ZMy#TA89eucQV;{0GElidXKggJYR%Zi;DB~cBgMH_cTN!q@3JC3#8562t7H-W9| zxDFBc0_YIHZA65VfF`ssOS%oazceXs+CgeMp2jz$=%u~>y*pKHqmWWCeRS-|o+TqT z%v%4^-RBAH%F11*%5rpEIh1jQ@wqBS)(=X(s(TF*AXXwO&$xL=gxVR2nZe2<^VcdG@XkysT?FO>Yh#^7r z@+SHkGh?YrP@|AE^p$oW!%|N=-2!#~AIAMd{?_KEvn4No?H}H9Ur1u!}k- zvby#+&VXKI#1Q(hXmQOY&Dmw$(5=gn(}!IQuLh=nFM^LS0n~cXYQ5Zw_4bWzB+1mK z-|)gscU5skMVH*|>=@_!n;9AB2SH-DKK1s*YB=Q;6_V*RuwtU=7Lsz*Ib+yJBZx9o zzfuS}l_ZuppPwU+&yEYLY96>njn2_*psj0nJrGt3d*`cBS)pbnhDA#w-eq!YyZOsK*ph+W!L6Qjva0|I$y+pVYnt{HJkl}zv?Z6rF82AIC zNr|eLP-{U9snZRbwHIg=4W0A97ukyhHi`k{(lI4*BL>8nbM72BTEYE`)A63D zVKOXm|2lFRjRX^Jm<4mfP>xj9w3JOvF{RY%?NFG?%=Gap6yfJtXI+V4{6i5wXo&6B z-s{MUK=vt9hohFR5w9eoIIysCl4`io3dj`|wcDvF8I)hx!)rgq3=@(NnL?g6FE1eb zz8RA=rq$!pq1N91vJ!WDE`D?KjXZ~pjPwH4t22jb-tTYoB!Uo`3O`UjX`VBlOj8+B z?jXMQ7EuTTrMVDXS!q7k@HFrS;}~Vd5!2KTLPksv3o&?^{>leVwV2drjd^bWL9Ire zq?n{!LU2sp-)OgqNY<$*^be^Lsa`3@fL4Y%g-Y%^=pm?@J~bmv)mUe$QfmT>21!3? zrwzufy9wA8=>;DlL@a(^dJY`T0_$Y3gMZYG%L zjEa>4pMyt0cCc!^$ErX{g@{`4akjEx-Zrk7I#k(&n7=<)G-H$96E?M+89fnfT` zlX#}JTE`#uPm&BdKs7z}N$;cl=_op2Z!*mdB-8f)L6es0cWd^9>W5V&K_pArK#whT zSs`hIv0)SF(dH;!a^6L{!K8_5kc}-BViI)w*n2&{eDM0_(=LMQw|wa)gcBp>sH){I z>dr4)qM;EZV4(qEw{V26^M3s(qA%jlrQVBrctC4;?`^ITPnhp36AmCHf7}-M!ou=7 zV;(Vr%KK0K4Z^x{Ab{?(?S{r%Y`FX=Qb#F@Ey7Mgkfck4Q{B8vU5f$vJB-K94BpO#eF_&L3- zRylRxyT~@57h~Gq2bS3VeMtSgV9snEBydI)RIuJxh8Mp0#>q-y!lG^z^aLUXt!B%2 z-!7_Kwzl0a^}k>OHS_6EoQ?i|52!0Fs! z@aX>@7?T=BAB|Xqc>+FJP34}tZkpB|dkFZ4OGIQ#KuBhBndcu_#0f>Faes;MDX5`= zzPQ+|b)8w*YoMd`8L0CwLu7qiCE!+I_uIuQ0=Zv(M|bJ{&HT~iQ{g;VJegWj&K!BA z?7vmE>u+3PT=>oP=m#Yo9-*dnS02zkuv1W0bvln^_|>@E4a;-go$5+AH@#Hb?wVgn zLDT6_5HpTc6c(YDN>U1I6OULn3sr0FMaH=vAg@d8w1e!@oZbqm=YZPnOZLU z+G2}SlrmAi)W#P4tDJuDA@CJ<^ZGu<`)tRm^=%pfdZ*zSW3k5QEl-j%pmu4G4B|qS zy0+t`0Q2$dCwK`SRot+ZCaXP{qu-_R;ZJV?+I2>6+GyiCz{cF0X@R)f+Rcjcy{ShM zMCfD+R=jvjB$-UM;^6r}KlV$X%eBX2G-H#Ad&3(egC@(D=ugV6Zqw`Drx6k1Wkgv2 zvmE1=LLrz)IV04BHL{TSB!0AArrT@UK!1h_Qdrt|S8eq1AC?P@h zcR|bf!9Q@{jQkloLHNnB;ZCYP^c!l8A^zTtI$$7*Z2)f=C9OBWI3^Z3f6L z{GL44$?!jZG-{3(kB0dVNKD{Q<_>!wDJz@InP!szUwNpuB%YBGf)TllTVX?)#)Ic(wABo=l8LSJ9k`8=q)kr(jO4SoUr_}}mUnL|?#`xoo=5pZNB{56#+eBFMqCB9Vg6y*7tL7 zBQ9ML1AD2BvW-3|o#@=$`tVv^H_im;@s_S<{N{8qAaE~zN<{$2BE}uIxy+QH)xaSH z4$hoCt3v8OP{GHHjsVLzA(<@cHgC>I@~$K7kc~Q-!xLIvsuVop3=3I>+0D(Nm(4(~ z;Glfltrt1F0YA@G&X)Z$!ESUffLL8dh^jRM9ru4m=*+UoE=NabvYMgInNTBO@RJ}m z)Y2-NwRXC>x3{1f3e#NDPEsx{!@K8&O)BkTGH|=ntLC>LWa)0+xlT#X{YN;oQ*Xr5 z@_B;Y-{1e&ybTHZ$lveE|2eXwvn+oaq++Ee7kv+hN7zzj9^7%G{N@3ps;zA#UQQuO zD(3ZHJ#U_Rz&Lr5&RW&U1vYUU~ zrbk*KQgV{%2UmAl(dz$|(|A4(RG5fLbrObxRti})XSVda1dFfhWElF~cF5403)+Q8 zoUnbCbCb#SH{QSci=dHXqL0Dgy(F1D)0ueMX!#i4^H|);+}YmaV}dKM-Aw$9N%O{3 zt<>FXUgyzT!u;p6kHjf+3~%jDBbJSgjrG8fx8vu&Y-O-7iNzAhSNs&=;DcKuhu%%4kM%9ey{6+oB5j0Srk=?KZk% z3f5jQy2QkAqROz*lqI8)CH9-;*!9;ykj!wBEq~GVq9*+D>WL*F7Sex{<}WD;=22rQ6dZ68)VW~8Lg}RsW7rUuO+>Aoi)-W9 z*}+a&25yB}=t&l{%~gEZ^@VV~Z@e0@NSHN@3;Et_6NPX3Z@W@PQ-Un!=jM_FOJPkz zGO;DGTGpmC5=7iLo~MXER9Q#Fo+`zQrsM)gT)Va~dF=9>pAK}oiPd_uu^s#dXcNix z?Z1tvblX7uCW~WMdWkC?*i2%$G|PGJ{)?hZ8nrmAXbOh@VD4bchTkU4ZceGd4D@NL_X$hTT-hTr@M z_Eg={RWLI{lY%s^MM3jm$tCyQE9wx6#HqvMle5C#C80op99Gnn;+3%-Drz(m>%raLHO*v4J5*cs%w5oVtm8%`BF zXjb$ocO^=h%`iJlasH8+f{&c$<0DzK& zg2Gh1p(s*jSCS4NF#ei-RD4J!_0yM1)+Xy0ofH^1fS){L<==Yv>DTdbvcH_?k=ITd z_t6qodfZ8m1mQLm$Rh}GTyPY1!DL1ByJJ<`3@Zi~xfw=YS4FuFu;O8T5w^r9WKJFH zSujqABDXcyTU8V|-)Cw!5Y+S|ZaiGF4`E0kU8OfRl&q;KRL}dl(qNG@HARsv4njz% zh45BQlhxE}4KK+7hRE}BT3|c4kA|hYKI&A&4R`Blr;LyQ^=6-{Y6Vo21xjaLbllAD z>6xjWuH)MFtkl%baOuBZi3|~Sc7`l;3C%yO;mvS%ktlTUj$GA{_qQZ^f)dvwvkm0sy32>^S>W zn*Wk2(RswQPfCHVqOWD3$x^7FZ%DdE32lC}*#E9H!Bk#dy`CgrQW_sk)y0#pq$bBU zRr6A>c+xN>woB<&~mZxQaKA4+Jn`A~p8F zb@vH>z)$h8EDdF&tDa!h9hLCs7e3P`b#a;@bGN-UWvTZ^i3H*2rWyYotKG>h9j7Y` zD>mPEw`t)Ib6D8M>~Q;mKil+44Fpm{5b#ThrNYk6EA8ux!KXB^=Yfs-oMetwHZcZ= zpFb=Uq(toDvP7EDFW;_s=}f2f0}G~gr>)- zpC1LzmYZLi$4@Fr+xch$U8rfJDI2^{hmx!~;^{<`1G+-p8X=$oGLf=7o2$ub5l-j6 z9dcM0Tif)dEbH#d4#5s{${#iq*)(cBTq(sz@R7L?yvdz^Upl>N&isbH!I@}|q@^|D z%LHq#H?32hiB~Bhovx*+HN*)=f{v@Fl_-f-HXl{VFd7}3#bM++{o6usd6`ikgesSO z<+UE+pFaRLudl14+*}cJw!tc*AmMpK|A_4N*`Ku{L`}f@=kqDB_o$mSGSit(&tH4s-1`71r|0MFhG9?B0+>Z_$Cd-DHOA39XChS`rLL&pO%FTC62g zM(fGphIvsE;R>{`8XC<2LG~^1&`^|SSdbB0-Nh;!%7!IaXumSVP@hBn$tWf;% zf6lV|yd#XMQ| z3qI4a zzqa!eiAeMgg_#8y%@b=HRpZF<*Qj2s2{O(!>ReBU<1nygU0HkLvog(`@sbNj$wmx{ zj?plhS`Kmd>bFrH5(OICUCN0xN{FZ_{h(vOO^%Ax?iJ013UB};-za*TVAhEy+AvJv zXZ>Qr0m*hUu{__6q0Y@&jp6#;-bMz93&ZF~T=ae3A}BH_GHwIP!{cRB=mwzI55{Vk z9ox~?%B>73%rXCj$L{bfBLfb+cybiES-%-5s}sDF>FW>44?{+AH=LhsUKiWaT5^N1 zC1te+W7DJ^h`8bCa@PDn=KJ$CI@DNnHGK^!+7zJ+{Xalv1gZhk`wNHCQRDiR=IWP# zhqbNmdU$Y!m_S3IIcZB3W^6{`lP9r02w?nduL1b zQ?=77R=3ciB5^>pfqn~(Oh3s5iSvA$F1P)%~x8HGGVd9 z>pE%tNfiG1nRX%0gFpB7&O?CAe;1sPfrERU)`6cw6OUu0m}W+_%-wiQ%g8;S;~({2 z2+Q0vNVBBla>%9Sb}`O6mxlGsA0g482DI)Wl$Yj6U3~shq4kB{L&M;c=#pXx4TD3z zBC|!&(RGKzFP^E@7k=-PT7R0E8of7|ZQC2GsW%%j(|;Ypbv$=J>J_N574x}L-ru2~ zUtX@f(9?NlIf04{z`M3woS)Fg?E$Y_5@r95@71%Xn}?(A2Vg?aSa`Iw5N?hp4+cLe zn}e?pBKMk28Pm7x0-tZ_^7U`#X6^&0yQe*%$!5y8j@}+CIaGT5UqJRNAdt2=+-C^C zwsIAatw<|DnI)NG;ig2DF~!c$9*yQff!XT#^o4Hg$cf)luoRpS(yA| zbiwZfA%Ew?|6;_zbKuCUs5IGT{uF#k{+e;~`QD3~DGD0<&+H~15fTQeTc&Ncw3-^5 z)`6Dw^H+Z{Q$1h}r=R_z$IbKFz(sC; z7bjRoId+E@fh`lhv5v(DjT8u_)eHiusvG#N8}8Xc%W7!c{Ayo;3Jkhqsp}z`e4hE( z(Ue!2DXwhEr-tl=^MBPk+ zq?g>)QS3F2PzGva~K@Osiv~CYZ`uQ3x zX`zMo3?;gwN{Skf+F&^!9!jr7teOav;u4mW%B5#%wnNFtooOQc0^|8Rx(ahqs3pLH z5$na3HYY1l#JMe(`V-Q+5sL+`1;X3Lm~}EWR>BD4V@T`z#ojd$B+lG~c(M%O8dq>$ z?%ldNKn;;?N4!zLNK-2hj;Y7=oRg)=@!<71VuK>>qehi;L{+84#YZTUI9c6c%EDQ?jND>b!)93gYx;7fO~>K!Y-3f;c6OYGBDHiu-Lyex zt8KpO-pJXtN(q)SEPfOE+S?BVzoZosbCFAHI4Un`i!LSb)@4JGOT{Uu3&)i~B1zQj z1!{BjY8`*#stIDzEa({?C?XT(2u)V@5Wkx(6Mc549Xb(Yw^x0N%d5)>b$|jBvEE`r8+5T8te=d| zkK?kOtdfpJ8}*(RC-ivdCV2z3c%5F=;p>a9 zSXFiCEAnUz{|t{5K^0jvibTh}pG4<)5WhygUG?z-b2NOumiKfp6X2n-cMHDEkep>; zse|y8NytZE*rl}CP+`=tZv-FSUqce>1_=oX3rkD6pYN;c_#ZNQp6^bK-%k$5t2SM} z03J495OoaQ*%}!?CK^vl9kw65uV6dP=bzmoPI@_wo)jk2l$^}vjbB0kz4OfA2> zyYIl6Dv6{wZfmSJ0v;S$f=#rUFICAVK6hz5J_iF)roe&wd>GZw?o$$oT?^6eNfepj2I(hBW2Of~& zEh22Ff$zDm&C?uyupa{dJ_ZvNp2AVe>4*qE6Gad(;|9Qcv+fFiG@TyidTtabBS9He2Hk54lfHZ6l@4K8S({;Dz%u!k>L0t+2M=)&K^n{E|-> zr?yUt>|g_2A`PJ)j$A2w=$OGcw~UgQ3nD?p?0bt{j%Z1~@a{XLX_}m}XbNr6jV&!L z^}E>fDw8ieL;S+1kuMlyGESZRr7SunJ4?9H1DlXoERpq`q#YMc~Eprw1OxmWCZh5 zMuw1dYT{31QKZcZDh8@HfK$1SE=!&~l@419%W!F>t2m0UsmyiFzGsJ2ComI~cVR&) zv|-EAb)0;loblCW?P-%lN(~Y3CjlYhe}p&|t5S?Cbw7kT;1nc}b2-#q`{9 zR}|CT7{b=hOEr^yBVLBvUyKo#@bXR(c2w(DWHWIX?|0p+?7W=cV&l{OXE=ZVR@YS@ zpBsv~hEDyDKmpd&q*!9%NEO!kvTon`ICVKQQm3z|(a^g4R3 zGs937GgBlGYGcEYmjwOw9RPOo=^WF5WKReX6JA`|df-1PhfZdkU0)xc)I(eM-O6t} zsU$wW0O!mvtX!3g;OHKZIqo+r#@KO()}FTJDiaZxu?Y%JZVGkiwq4^$ikZK)bCp+$ z8#}TzSx!B<_ky3j7;~;BvqWMl$6dlBWZv)GA#ACHO#SDQqxFu5v%G>KMo49wx?ZfR zrOZ;qM8v^lM4a7PlicUReA3VRs8)L@* zMjN`dH+*`Rl*TSuMub`hFn{Rwhpg1uYv9ml zzVWlyuH!i%*K0S~Gc`T+-m}>gGhqY?4&~m!k+_*b`#1=irw?NZ+Y=7#Su+Wu*RK}ALp_uaH!tgtK|4WB#9$Wg7U?k zv6SVNq|D&kAR+$rPMb_ip!LrElSpM{<*{PPT+Jw3?J~lKN@Jlfi z&h?Ppe;75-``N}^udsk(u(y|@y^zEALQp%`XO8qi=(+dq>YfwstKa_Ia38Q56h|Sk zI!YNiHy0Lz&&IhdKS>fRV@=7|S0Kt9S}q*| z24?+#|K?(W#Djf;kgMZ-V=zdb`O%3f$th&yW3|tMJa787P0G&4C9%@RNciz>=$3Qj zX&?jCbU$lUt6v|f);E>887qOjt-*jqz%lk`yzR1TuTADb7AAB6pNa2k&^RGBcH4=! zJfAym*2x@NkXlY%X+HPdL%_MsfMEDai5!wQW)9Iy zT64rv~yqiv_Z)vmdlfV#a zKJQ0i7Th?$KU>THf&KHf6LqcepHFACVGq<4dnTJ1JPZsBL3otC1b>nXl;&cpN~Ga? z)dGLGsj9B7XgNKs$+AZ`|0D?um+)RShcj=kH-m!Ozvs?JKVhF2AHw6)p}mJQ)kMl- zVl%j~s*v8k_y{0On|#sPFX&ZrN1>yigZcQ`aJ2Kc~f0e#Y8(bO9 zgIL}D=g4Zkt#%(vZ;d{QO48;WnSe`8%?N``sE`=aYp4(@8z~B{l)`=4f0;d@LG*wv zV>_x*BYTrT9{hPu8(aHr?XMqpPIVH<3``PzCDp=9tc82&YYyum9ol}}Q%RxC--T9D@=Rn1VhW;+E>BjZCbD?A*zgi0(~O|{ zGrPh@YI3#fO`QTR{&vF0%(h!wQ-v?7)?7SG&-I&YGEXSxy&I}in7q^`+{13m{atlS zl@lmecX527Jee=x`|FQhy~Xj+Y}3i6Ui>k3ePdlwgJMj-6qFBH0uPrVUOT8IPr{B+zQHRA=11`(rm07)7CFg=q&n?W&VO!ReOx3V9 zfQAI^@%C$w39Gz~Lf&k54$Qe9wejrVb?jALr+ZVDReowV0>DIRlsZPH7??*wCi zI}ZH7`lMYKI^tm$L3dZW%jf(R>QCr`E?<(5`2J^D0Evop**uP$vi!hdup2wO zV2H8%=drnf-^Ludu{rZrD#i7zk~&s1&c>6r1n>|!hVAB^wszghC}i&YJZqtl@y;c@ zS(P|td3KXMLEj{qBx6>mufwW{!0Iq39^%^=(PQE zCxSfS2Pcss^mf`pttfr-TrO9Y9xz}P()KmHk2^iQ~RPJT&jzvCo=(lIzsBB>8<9y@=n|yBVu$q$p#-tF77IF3THX7ZTACWJ{ zZe*^AL9vU_f#3O|HhwmSB_Tx{X` zyybuE{{D3Izl518lJk#rmDOwbW68QQGFSfq_W$XAJ@E-OpE;tfh_ zz<2>xGh#N{yy_BKbV#(a;Cz|Vbp0{rUComxLEl`@nmT>&L6b6ujR=>;W{cNn@{a;; zdvAjT9U)1UU=0+%W>mcdi+Sn1>J!N8+OdHX_Daf4G zdrqvwPfB$E;QqkM&mT=6jf(ulKoK!7Mw?Q|iqlV^QktHg{*AfpCiPsvLvXdT>0|v7 zqtW0h3fz2&xOdI}*qeZ#6m2b=EV`g5GNk3u*e+H-8fq%lKuYzCl9FXT#eBZ0D~R>% z=2>4#EjJOSF4Gtyp@fV$Ao#hgtgOh>E3rL0T9A-W&OFM6k5n$*>jPo4Z+J>z`QP=# zWyjg|#8Py!piwXlHW>=l8aGvO@uV^9hl9h;T7uwp>VsMSD}XuUCh}NVE?JgNgY$fI z->t-re zWl4E9r{VMSe8NT+VCmVt?yJe+p{kVc7Bj|-50nGK*hs30r&25KJ#P3xrv9N4p^!w1 z5)#BXp+pfY=w_yI6~?1k=wo-Qxar8sg%T(`^htGWm=QVvzvKR*`|K5E=I#4l^ROla zKEy1KVMiCuZLLLc=LzDBesv)VH_h|i^ggOF?s;c92a;ZP-HiBppO#q`w<|3Q|BYEI z`@_m2%U{uS@Fb?VAx@D0jc$T6bOQ+_h)0z*sj8)S_r1KF^;5!#GruN;9IR@BG3zwY z(Z<z&zJ2XuX6I!cB(wtdH@7of_;0_*98Cd=IeB;eVaQ|;xZkH#EquGT8UrB>5ifDpTxruIWWy9aOWqBPjbYy{fJ?~eL zguJ!R`gncpdEe7wTc7Zo*a*I$p*?xVZ>JbiZ^Lfg?#K=#zFuldQn3M!R=H075Wg#? zOHzL^HZeVJr-k~$Ay=r@&lmsI+PFJoK_Sm%f5ofozJ@dIl4V3lf`+4LDc`nz(MV1IEp=&cgKFaX7g6Zf3GBLmnJJ9W zSuG|zzn~!-LGTHYWZoP7kK$))+I&-+ws1`-(%{uZml#8a7`Qmz2H{7_f%>EI?p<61 z5)xKbjn|^o*jcQ`w<|k2wEC zjoj2Q>2%}_xpRt(Ds!8rh2s`QHq}dQR;$}wkGci~7Fi)7Ay-hEpOppnZgc)` zRjP~+Np+0x!z&B#d+O?}08&Y9+x;AT51sS6Jq{c*f?e69`ksZvw2jniMtb9O2MVpb z<0we5oo=3Y-^mUteuhv$s@Iq~cERN3O@?kdu0n|hL?Q|i&h@F%FD$GnR8z&|u}6*; z-(uWhkxy>tUwmI7ZK~(WIZO1AJf(<1=Hr;yOfnoaEY{35Qe0Y8gYOT`uMgS*nq@&c z4Cd>q~zYWDomTMTkgoo$^Gnb zuvl|)p{smQKHv8KP9Zg#8M3GdJ^ekvH*}kYX)|!>Z)#*hk<*4q?-Iw%Y3XUzMlskM z*$EG4az4(pTrC~FZyQF)+8!PRem+~F=sDXkShLorlmzk0K%LMNjfob7QfkMS=f6khzKBbG=CpU&P!Pj}?2Nhe zO4&-U(a(sBi|fjjFNu_z3kS>SqccmTtYml^8D0CMP=i9~cTD5H3wr$(ivTe88vRl?Nw)9j_wyiC@W!v@MzxQ8wy1MS`ob&yB z&K(CEm;16jqw4*4i9!Ij5*T3o>y_7AxE)Qy4g63{v9?TocI5@{nRa-HCMM0>55&yd zse-{oWx)pQ4LVrc@FOijej6=8iYe98ckDBSl4&K$^E%c3raT!IKr=_E4bK87+l+jV z27x}j)2fz^?p5i>)9;&YT9V=-kfX+!A~0oN%qU1M+H((PP8A=w9{w2L_HM0LLL3KG z{Q7kO8fR(UZ3f!#cP}KqxwRp0AM64g5pvYc(^3xNf|TO zeYOHaE=mZart4yKVaVq~a&s_Q+|YS;n}6N~JD0v+%ikK6^5Bb4h%d>V$45o`$#0VF z1v&qUhv(BLl~I_`WKa?!mE&lS@lnZZ9NPMWtO{_Il1El05MOvmNU2k$$<6UO5r`BN z6!sQ|{{Yd#gaY|Gp(B*M{Cwvs2E~s$FW3UV`vjFE3))Ev2CClA;#hJr+*ReUhXq+> z{{G~YlA~d=B>s?At&b4W+%Pk?@ZkV@}QQLtSRPZ8i`)+d1e>aIn^of z8JH};d=Z02$ET<;5K>Wo|BW*VP%Ijs>#{9xc;gG7X-a?C!oA zV%>OL&B@j6e#4L`B&%QQW*IfhUNEDt4WV^aD3ba~1|e3sSe_U1{`A|l;of30kGT8x z8a4xJyr zoF3*hP-G}QcPGzOa;^$^4L`PW408NpWpm7rGiLc3f>G zZa&Uk>H(&E(`7d4xDjxlUoqj|MxjaC%;x_74cGJr#}q9sfLury9w$%$T&H~<^Shlz zGMu)yHt|7z&=e_Y$a7_)@arXK;0`7!89_X$N4(36hsl(i`sfj-O#=ATq4o8)Vt;x07_J(BX1v*N+x+#H6d5LIh?vw@ zEu-?5wSE}VitWAOXIm$i)<(b0E_{(h7gK>$p~IeKR!S1MM|?uW13@>`t+a;^!7POo zIVvD+O1x*aCrZyu{}x?lIL=r3JzpJk*NoI1zQo&7k`bH?gs&>)HKIENtAJD}UPa+4mAhLsea`o{Ro%EqPj6)jh<2Pam_h?4My}*_?_i zD=Xn0i0B}Id=5+dHHV7uo7PaD1q8rcT2JNIKfec@AFYCaRf0M@W9{O-q$p-B&hdGa zVrK(w0^DtF4=LT4!C&5o?UNm#%_sF$Y6Uawdi8}iuE>~^tr3jKEz2`mdD5VvAsy$3 zCiI^Cj$POg<|ml;y6hzqBqY4q?X#l3$uZ>&hy>q^LJN!Fu$V**pHLD+YZz;Lt$F|a zkc3zU+08S$X#D6vC?_LXG~fv%`&q@1M+|k&$(kiU83ETuC&?8nzLXfaF9i1sJ zAZm8@KvF9IJ}5XR(kJFk0WDsFo8G#KVg6`XmG4cQzvh1X=!QTB*N_H2tt7O zX_gv24jNnpf_sDYRN(VowPDTK;h}Z!>+&#BDDYjOf`<-+41J#Z+C_+9zlN2!Yg6Lz z1E!R=uJIMi8zN<#mm4ka4@($Nc!qiOXp+w#1y1kKpw&1f)gc3EMfA_Q@4nS%fj!u|0hodXA-GD}Hi=Ff0@Cr#)? zJ}>DinB6n4s83?e8Mif;=RH(mc+Xr8z)k4Ze5P;ak8$|vCCIH6{pgdfOb}M563dkb zmCKlKTsOGq{r{92lg32k4Tvs+jbkm+OLuX(ALL_)CSa zdO6WBjgcUOlH4)j0IP}07bJ4=ZS1s!eRXJC?da$X_Gd|>qpF=Wb{)WdwLcJ*q0mY5OJZpiS)9=D897 zGIM-1N{~De{`PY_3$UKfd?GHN&l0RFbm>M$Mc(#qx6NIUGgLegT~9u_^IxvF5Zt!? zmNXr*G)Y5NGL+)>36gY->g2s?*sjBqLG*j=uXc}@g@QLvAg%@d)mLb$44E@a*yjE{ zLJ%TQgtXn~OaUS@oxhOQi;1Q0J-|d@Qg&Hd9Mmu192r@oC&(|XSVtF{hmPm#jpZ~U ze!eP=OcP57x3Y74CGp^e0ez=Y9oK5O0%e}f)2!>#nS zbhI@V)uuHQg~gSFm_@o_|4UX@4gc)7NL8_sr=A}H2~`%oEq1KD#zU{B&w%u)^!v`- z(Gv&7b?O}n`)A~dt?-XO%A&)fY6#<1ur@~zctQK;)+BF|v<2_G8U#4d(I^Kf$HzQg zm*1(X>=BR75Ei}eJtwOH#LE4P>d4o0IocchN|j;4hsIMkzr$qpILCwrRY55E^x;wr z6ZZ1?(ViZ$tBC3x^}Ga06VVOk0x7WV`r_vq7u(jdBDG$rXb+YQi~U=>+`uvVk`#K0 zLS2effV!IBOBsgBvRF}KMkV83%=oDjQ?iN-EiZ;m+=5_)ryf3w>~{M@+TAB&pa#jl zUZR%+)&6@}a$}M(MtvFAIRPxluy2BRxk#=^YC*2pPykd)0ZZjbhOfB5?*z39g2REn z;g{_uZC(wh8UPeRS+FLJtSc3sZVb8umM<~ zcc;G$FOu%k+GuDa`|e9X7z8g<)~`#94r`|?fFwI>q{iYvG2F9xNUqdNBbXD*^%}f0j$uX>0~0&3TGT{WjAVv)^r2y@Lfz$a?y|$6md>g$7B9QOHxI zFg3Wn`A0;2hWCZii`>SB79W^#pNAY{7(6~IauHhSo%jrOjUh6_>ZU+32BACij?q$plUv27VF9E?;Ip; z#AlbBo1IQ7BPFT@BEb*}XvB(NwfzS- z^VFW5`zy<#cFS-*r^}pnjuiouP*Z2#4Yj3%glDHE9Uaj9T(oJK00&wOE1xp5;;*Z! zIxS9McI252y5`V`hHg~~j(7^*TF#gR`SlN#LLhSz%p|JA<9&Ty!w7X$>Zd+fh8|`9 zLWL}|Fq9mGkySzNvP|yPRHRJ~5vM4J-LHDI%F2Xkom- zWim-?MDJ0=mBD7|vlXly`&ZShDL!0KHUVw0KMN7Z*{JkY&n26rBdX@PQdlQcuxK>) zgL%%l;o*|N)V={JF;2}yCjmk>&n3euONmB#_;EyU733DM_UG@yF6tvXj4Pk9?BF;H z0}BlSp~wCl8eN915f%kciKg1lz*!pmaPjv*sn2C*#d}Ox8E|m6+0NG7XI_h9SkhAR z=JQ}DII*J|^Yq*ntb)bJ8e)M~#}HQe|I`}pEyN6SCo`trUD3Zj^{j{vd1KhokAajp zk}ZFRBxT*r%T5X1FzsADGD4&%Xc`&x-DWk=P)I-&Y^qX_)Y>1NW?py*=&^Fxw|PO|!R<%Sbx)w=r(I?>zy*H_NLX>W^l( z$)V<^bLTu_qf>F$C^@))LrU)bpU)X!Wu8edT=bKo?A!#*owz>Rs28i+46PE@H8|a_ z|M=~4eiUean=n$AZPzqy8*#7LJUpKP`(Ek$?-4f1tw9MV00D=ta@Dy{+v)F-mK~b@#gJmWQ?; zIj6`ScLma8&`O^wZAM;(8;g2+b%jg;6n80r9z`c#GEe{S$|K0t^P4Pb$d9=c4D0FK z=;;%|FDb-_Z8Fi_-_jU$IdDj*3F5n~i=01%ZVP*R(LzNJhq)%?@5FwgqF zLdgKD+|V!K$Ei_1mhwCYcmd=p=3KCKCow=+%{1Mz7+jOSN1G>Q>ay8cEnIENL-Bb^ z23BWkfP?9_5MUIrD9~f93U`x(Pm*qfU&kn9tFospM_k9y<&B#I&DC zfBmXypWD3>vcvPU+Oa^FgEn*LK6xL9xZYgC0_x>*%*g)e#gjp&*3pvrs4zJyAsHYO zQD#>(a!t6e0|SlJe<_brKf8NZw>=s>Mj&)*z$sBNHh7DPAUDtm@3KKst_U!t-02~{ zmeOF3-3D=#hc|5L-ap&`Tp`faYIW@tBiY|Su;XT}k~1|*TTMoiXnrVARR!ee0F?gf zDF`d$N7w#mOlfra6g2b`7&0v_wn|GS$DV_m>xpw*_OD`OEj~;bc@>RwjYKNtu|q>L zRlk1G2A^N~j#z_)UjAv4Lh~J*YDX2Zk&n9lR`&(CPvwJ1^Uw7|TB> z*t3g4zhC#W8mx^ARLVVKOlg33l-D?pk@KQ;sIMl%0}^gnzl+ZJ`07cM6!Tfv+ojFV!Htx037rNGyE=`V|_E5g&&0Y~tvJpqIIHU(ZGLg=EO z7mYF-vpt3bC$q$YH(aH?U^YS%?-#&s#P7U1{j4z*S)Mx4v?<5PqDB)Q4;Op1i!ME% zM0|GLiBgoL#+B(BRlcpIPsq7+%?CVB;1hO|u-3BdHaV&N4NMzqyDF6E`=uv7f||e5 zL90ET9oRV*8lMBm{5< z<81PAx}RdIqLM*TX9}3X^x_?ilef=97gO27CyM;aK>vf&X@$%F%XabM8)8*~? z&al|2esB(xJ!a~fJPMO`>sNJ{Y4U!;?v*M1o?oR;1JjlbB z{hI4dQIP*g)noZ`)|w>bH4Aw4p-y9>wKJ~@lr0G2#Max+7Ri@?2{wX&lj!1L${A<# zc{f6k_+FAqKUWzzdYVk~sfaE`$Ai0GZ>ssz|*J{=> zyWM;Fs4yuTO+0jZBU9b>sXcdPDr?l+cu8OoWzdc?&-QMnP}J}%cB+P@jGJrg=83+t zq6A!jMLHLr!esXE7L>v3MCVcAXFtnDt7ho~P;EB<>$)mE4@@K74J?j-NI(nFmE9EtuOtP6bjNyB8!5ZP;87!XX(%gtLr8VtweA z8rQ>&aN2V7AGtsB-RFm!bj4Wabyqh$>6#`OswbDAgJ?5Ln%t|XtTy9VfFRO!N_`Pl zuANrZ_TsiEF8($=oY|Gno0UP4G_rS^hK&q^r7Z~1`G;A$6w#7HeF``fDEGe;Ak=j9 zy~lfIdZb#f-lx6zhz54p^ZnjiLyohv4Gr|_1Nr+NPh%E2fpN2qt}b=YEk1IK(NrMz z6cu~o;$;5%3my@^#q8P>RGD4!_&&|Kv?tRTV5D+w%f+0vV@cf}JTQHv=xN^!z>dY4 zEG_Ol$vn#$4RIp$=s+FNKD2Z-#$rUqHF0}Kt?jr5ZRh8kU`0YPXGo?~BlYJe(T^qK z%k8=g$WHMetPSQF8$VoZG`w&esKD^kB@=S1y>g^mlR}deDN4m2Ke4x@ggUKMz;M*K z!&*-bEjSTr1iNY*#gfBw#8iCA!5P{5<;B^^y0YckI=+^|<;ygIR6lIx;ck#%#1c7Q zsRB8|P8u6Gu0KqHZYe+3ppqVM*Li@Ix zCcR13yD-W=u@FD;Y^iJar=$rQw2(8e@=JEK6vfA%JKG3xDgw$hx%~hElY=jsT4_og z!ni*xS`IT)DL!=bV1ZbLp&>5B4K9oC({01Fxu>P2QQ<<*jHlyxALxdmfts3{i<>*I z%WC-kCO4+9Y0<oC*uz{*S<7= zIYrX$0o#>tCv=#&c{H?mNT{!n3{Q?QQ`FKETtDS@mX6?J;`h(@CsIsd-wQsy2Wn#S z@b6EVJ`OK8?Ef>bKOBH`(Z{i}vU1!2Wfg93ha8cwcUW<1m+s+x^f0DcX4x|B!vg)^ zE!S+L;a@!nlz|TFn=5}|yoj$<^4}!LojcFKs*oKg zE6w#^dL6TK3=*GnuRmgZI=W#-?98N)h$^zCrp}dEGK5Fq0fM!x%=#5lbiPcPGFc8S zUM5)zUVCy{NA%=3XRzm{Bl_;Byi_3SZI%R>I$7w~0CyzRL zjrE0sOp$`Mb~BV2P8s1-74DiB3dcGD+@~;mO8ifP!AsH0Wk~5T3ab%1sFR?dGrGqm z|8mLl?NmU;0{yImZi{?s9T*8oF*|8&p#7Fh%16fQ0NEcULjY7bb3;=Q#SlXgE%j-g zjmj*8O@{_5c}pn!4EFx=nO{ZYQ3SaCT^6Ua=JnYl=}PjY*3#Jdwpo zobFaJ=E{&}z8{yxrIK?$#uR&{s;QkO#bNg~w9@ct#QGIE#gJ^(49#I&%~a>r#%AQj zYOr`GsU*k1Utlw}%_*q}MkIF+r4D-TB}Fb6UG{ri?QC>y@As@pRo2EIuRbdcL6J8L zIW9Cfv7MER`r~`Hx$NOXNAqSH(J;z55d5y1@jk?|#po%~SOB8eV$2ceLk^3GaCkx@ zQeUwo*)JhlskNiMb%j9pq-ZH1$bJ5H<}C(S;C@^wDvRaXDvX&AOtiN*Ud}CU+4@T% zwA5cKpu2%_EqXrB)-DZK=LYvJ3et=q+a;3%@EI*MnvKau~2IS!V2etw}fd3XwJYy^X9 zOZUWhoOX(H!yctaL0$dwR#68FUpD^+gF(E3Io~@Uxk>fJaG=u*8pFiMT$k1&n8yFP z^P2>2`{^=eNb*kZa{LB65$dPIW8-Yy_>JswQ6%%3evBphUX>yPN9|zNj?-EwYo5ze zy7$Q4EQ_Yv$qAE#xA#jDV7AER#UTDA==X$y!;-7~i04Ek)ImwUS)K26pqvC6s{RWMA@!eJFU}opgZJ9i@uJC5z1%8 zs3CK_i0_*Rv;>LF;is=wHo6u?ZeI$1C~u6zxWYhxj$kHfapT3XKgeBf2o{*x6cyKu zE{d|k`yIl+=@k5BGXjPWdRu52++~p#kSx-Kw%uXRq~7zqawr5-^)`ipx{PY24|&<&nlA0lsONR9VTc^CAaG242{LHvO0JVJ_eAdo1Z+R81c zRTt0JYd)XDYq}P}E;H`@PNf$vO*${{kEKjL9PIrG@RJ;OWv#T}ybCCgwp_ZHa4DgL zvb_YmoXaJWV^K!n3^S3X&S`Y=L?cLPv9Y=?71Lz1>Z#D}f8}fqntwga%{E zm>w{45=37vioU^*bD`!C;Yy?Tvnho3_~GVB+u5NrzpNxy#uUA+bYG|5lJe@xn1$>qC@@zVFlE9MIlD6`6{E@%m ztR=nvfr|!>M?xTg{}WIK_H!lV90LExRO(X1>H6z&Qez=Y2wTNqB=~Y!rSNL+oc4A`mF$m~S zx6Eo+$3q%OExTvR%>EUiHcyA|B-uIG4PQJYigKnJitFX)W-xEvJ>%gM?7RnDEO zSbcl$MJF`duHOI~;>v2bsFz+W<$0i8YxCas9hO)M=nb4Ytnh+sJCO+qZ}_rh$;o~ae#TCt_H)JKsbj)K zq@!n9Fd~^2e*%&S^-PG}qGCe%d=-}xXwY*YKiK z`Z~rbu|$$Y1JC{$WnzcES@dhp1#V(>G&%;B{U4eto#!Ny4>cj}o=p*R=*}p9Ps7(PGOUt@5 z5a!{Rd~n`uJc_&T>N2JG%_V(Zz(AVIY;#>I$sA|pSgNVN84O+n*%?^OvE_dib{SB_Q{?=TfMG6 zG1ega)hm?y9N$4bel0Tr29WYbBF4sy5UY(gch~(auFiAh5o8w(-tm$*=i|XcVnHF} zr;fW?J}i=?TCXV-^IvbnefX{a(#IDBQ$^9>IEav|av(LBLH3WhQcp+)$jNLy@G@sN zZ$&t@d%s#;F4N76XeqEbtNF_$oe#^{uKc~7%6>k!dC%!oik1pn_SgrR?~MWzJMMnU zeqiE7gc~FQSYM#Ev`w6i`wni%M<^(Z`@PP92)EJ0&JZVt^*+`3LMPeHo@m}w$DT@C z68`51}f?Yfq{_wwxi6a^Q3-M2$C&vnoBhxhlx=RgORj>DonT+={!i)6ay z_cxbY)Z2p_p)j$Y3tBWdG$d$9;9qom79H%o97Enfd zsTXo!XmJ!R%4---ZKm0CSw5&$>2tsuy_z<5?XWD(e-V5Lp0*kbJ)GV!G*B+?v(VY? z{KpEo_U0LE7@@)<+5piiF(5cBeI+EiZ9Ln|A3+pW|C#x5D1h-xHfaD?kH^&x{09_k>EnWZa)t7{W1dU2)pnDt^w#5=! z@V1kf>pz5`BIpG3l5IGQNSEM5#jYGHMy6W5!v1xlLSEmD&AV@|)IcCjAZjX=3f_3p zZn@bd(4@n2#sN^KF~o41IXsPO?KZW9L2Brb%Tzgx?<+67|9g6`ph;6Hq+_5ir9Slk zERLoJ@`VS~v3Z$jK%NWwx69kBZnuBq8SC4`yE(J3lY$Nm{tEU(R@+tj*x0q{J8w~v z5{)96Rw(llm1d=omk_oektu|^Mezs%N@RG+7YjU^EG6r!!^@Gdg#DU9N{j8ZdPhfg zvadZUm?y2rHy)Yw6k=|rF=28mO0$9(P>O-bk-{I6#NpQf<~!mkP)?O1uThDF5-AZN zE2t{+_NTW{v_)&RYxr~b;~REe6_Gp5eY(1D4eDy8&~Lk;GgIfS5(h{R2#3wKXpw*X^yP@Y@fg%Ku5H{vcf2^7v`e%5j5_+(dftdu;zi9DEbT+ zMbTzgWG9fu{rB}2xBF*xXHZzmT8Pie>grQpMwjo%=JWny*HGVg#O2Na+!!WIBpkI? zOZbQykNf3=-}2>i-Cb|z?IQkvwRtZWyIz|KXpd>|&`h8Kwx>Yd$D*Jb+c zhgSS$L9YAGi(pvEMN~l^{tOjTjIaNBuVb(+R`j&(^tT60(4+_{Et2q5)Nzuu3+BZUH&zH5ot4Db8B8M~Y(k=(gn9QpWD zZo{Juw!p`+MB^jNUP2sg#tUj3WVH7C_~=Eljvr8U3y=X!f8 zKc5pR&i<$QN3Vv-{_Y>n1I~{>9A$ZEC1!=Nk;B#e zy7XNgnasVsz?kteSN@$;ns#%w{v&yC-RN~0h!=VBt~%IAW#kp+o687g-_Mh}{HPRK zhj%vaa(F(+#7Y85rj($(gu4$0-#=O$90EfDHBWp%`n|Y^ z^zeB^R>XY@XkHkQ1YU}h1RT@v)K@^{!o@-4ZM)+64STz{B|xW;MSVDsag8kb#DedB zqg3`+TPhn950;jC3P00%dEE(Jj}#jPjt+Kww4Kbl>u-3SHIc4%IxKn!=G<=tO}2{+ zy=;157kpgPR#aCPwYNVc1@_c8h?*3h#(j%U=dP%!I=g9Gqlz04pKfCsr`mzxg*4}# zpvTm=l*z_2$_!TNr~Ec;GxR(+!qmz)A443fi{^f}+Q!d8Zt_z5p=AyJ&{f+hdPm*5~7@s*38G zvXGx4xzjlKu`)}o9<*o7FRp$8ysqE6mLs?k@!&-ZoE)tWH~~A@A_W z@!Xz1#J|X{6~sev{<6>G6kjDP1#tdD$x6?1nYi^8j*M4=R-cHD+G<3vL)Ei_Oq?J6 zDPoW89O8t-(?mVY+jZ|nbdW2_;ALwnYiCEVD)hXh7_e$squN+Xj}s*4jINuUTCX+M zZ8dKVd+G8J;i*|()R8imq5*`m_>KFs$9(>~BA0QT6A9IJe6wZMA-?*&pr=XaHg>+Nrm994nToYI1 zhm8kX>j~R0U%nh>*0iC+pbw_Y)9zlqL++xfnk;f5NRW4kY?80o0WA}Xe^LXvcxc41 z9icxF2a4^ie<*uQh}!jjJ74-$Fz!h6-|H!gw%Y~OFR_37izCw<)YG+xRGr69T4k*t z`(MPx&o|c*%@032%m2$ooF1O>6j)tRr`>i;+{F>QC;cAWT`;0o68sjS{L90?<~qe8 z{qo}-gjb$oMTJR8h#PfCWT5VWRirkK6;+C9^s$Ry0UFp0X+5u24!9TgxE>v^VPauP zc20F)M0*XEmlzReKzYV3*TWTOkth4TvG?8&X92|4>12hVr4 z#;7azmz051&hvveye4I%%ja^vujxac4u?hGM}bDImh|@1K|YY=gvXxwxfM8WPQo?~ zjy4w*rH<)lbKDLTYZ(Ct6*M|I2!=fhIrf4JIQd&V4uA?0fb)MHo}X`ANNeIDB+oZm zjcRFNO1rHBhPAS?T~`6%k}2WDFPqMNy6RL`_GUJp)8!*du+aFSp?(bj zE9sORNqa!^($2tZ|0u3gp+H$3YbP2SpzcPldxyUsyP^@tw|G0Rp1ERIWVUhF7yiCt zD7EFP^7LvX)glO#gZS`=ppD4{pQS*MGXeyij0`2_E$l+ zW4&^$76rewA+ZYt1>7f-+DLHvg64wL+9TZ7$3XMcPLOGhjZ`8V#}^6(m(Ub}x&CPo zJ)P^051-r-e_ye_Q5To#^PrIZ!PDbCvTFWQ-%69&I7svlU-fn(rKF_QveJI>aTvw7 zW^M^8SaR6=eD>d)rxJ7z340vR(=!Q5bmy-(Q>A59$D|2*cTaCZPfM782Pl{fgbI}Q zC)sm)Kui+fVM;XgYXUaQ@!=EQHuP=QucK9ipWm*0fi5MmkidNM`40AdWeX~7#F(c8 zIaYNA$83B*rzp@2AE)`CQ~kGH^fS9oBdr(En9bg@VDDj5rOFdkDFAV?YM1t7%xU45)0CzYp6b9;z%YFp zb8~cj%I{s2bd?O#Pw6+tIiEUMIhINB;(fXloEg3`baubv+H&o|j}nKX1$$&!#vqA8 zU7;k$D94h#_EUxC_b#GBco-Q45lv$=6QX>It!>5dp1V2TzFDXWdFtpb&)K>ni1)kG zvYviUuAQbf7Evz0!-83HPO(`Em4yM0u`w|mh>Kj8!|FpEVwqKR+mkPu>Zn2y6_Bz{ zpIF_L#UF^a``=l>bU|!(egvxU&C9zuVlgulA(6;BkQ(sxn!^SxB!Kp2A#sciM&%jD zqD$ww;*mUNVHGo*cL;(#`w8ss+Pp&af_LDhy{yu<^N6d1hYbmD8q?Bn|AIo=pwydZ zVu?iSy=f9{H4^CHMv5{EFdk4B{%|1y8&Sf6KHM*gw5bky6u`to$HellpY)Ze{T^KB zy3t`H;<|o!0jf)e2KFq9-cyJ?-_EIalC9E1`12$d3Op#yyTAXrky`&?Oh+mq;u=*Z!Qq1 z@at?#AUn#3wIJMCy-#Hni626ta1y~LzI;SL5JmNHh^QK^0q{a>b*|;uk4LnrzpkvZFBu3H{6z!>9 z%%9ZV1m)9StiL*8yKfAU^^IDwrGGcay-yWh%89JYNJqAV8Z{+7+5`$$M_)h6BhP2A zPE&C-Hs<-%5lb9D?C(lEv9~mr>B{3JHDwWo&RvlK=K(+3vR67cU-x;Z=RL#qs1)?2 z@%e}xH|uxNBBdIuMfG@W-o>$M!Ay_EPFIwx*)8+D2o!=_tV{O-L%mR27Nk#bfF-IC z+_ZD&OMi=X-M;yD4mLdV!RavGBF8=r^(+ zs|=I-2SJza-5b{Gbv~E%mC4_F^_l1AT^2M5^^S;%yrN0+oKArvHq8vuyxiwe@D(R3S@s)FRODT%Nb=0xOc4j#i*u* zt)6o4gQB_|f*}SJ^JvidLHqijdLaPmWbJrl7y9L;e`jNJllw>mDYEG(T~1qG(N#}*Yl#tB>n*XqGOg$+Y8|v(!r8enrB*H zT`|xyHk9_$hhIJoY5ukda#T==IkdmnXEc2hfmrN%SvSR|UM4y|lUCPi6A-AZuH-Ly z^$^9THe3i`QrEks70>l*a`L$M#j%BWj3CQgTBt=8N)UNYPQ09Q*ceS!6@mZsBQ1S? zagj9edX%>I<-WP=?H;fJX0HRIjxsxlge%+SFK^Gt9UW$zWtFNkETyHTKQb~tDvR4s z%0piJH}%1R2wH~>Uoe@IN0DNJSh~-QCfsgu^CL(-rncr{f$N}xWajz z$&-RSsl>BaKLqQz5e1znORYebl+A0e%^`Z`jATjNbG0ucaIhV`fAa>vhHhS*0HQrv z?S-Hac~_xivhqDO;wgC{lw)NGvKQ2Vc`kZZMvH}0eW^Z+NG|F(P8}VcA!47kJL0WB zq-z1_ic@NbB+&$@Sq56*kT(0Kk;q-#Wg9f-MbU# zd-H%;rhe39E|g9o;@9NYj?tq}_xo?MfGZOwqO4dz3$%<>YGoyKeMrgsBR!pGI*<3_ zD;Uh9G%uBI#j(r;qOdUF*-kcdZ(S4LYqRL5oXBQ>Yo1gN5WO1EWc?%h@Mri~`0QK@UIl(7UbO%m0};Z0B+zhK0JRSs#)xxx&qAX2^3$(P{<-C77*J z9`L|uOsWigiDF`6uJ(r{X}MIEL-54zHCX_6B2_9pAO?2?4nUUDegP1tla>~G?di91 zTx)xZ{dj3dS!N>%7|?2Ik7Kha$& zi}4UvS)M}YuyjlaM@1b<-3oeMbU$PcI0V2k*!cRmo zn#6~Am(}CHQGvh0?tzi-JB$x~j1-?x%=n)9{>1W=d_)nj=L+z~P|1%Weh}9=4-O8t z`f@yFv|qGe5T59`Z1o{dP0;Em!soAvL^(6k!42ZF8V`wue3(HF$XI$>{zHR6mqw4A zZ>_Ph33=%`-;U6b@EaQ)$rxJIi$g&MG%)UZ{?lAaKtd`OhdCFGIH-xA2nA!*(snYt ziO&HGdUYtqVCjqZ-5tqY()6boiSIzL1hjmrHTX9N21qEA6Ojzga03fY3f1UTU7}qk z!t0!JfYIaDR_Mh!?D<=N<-x>G3}MxwD$0Qe$p<8X!LF~!qleBev04|}eGj3-?Iu1}t6YNE&*!hL^UR8`yt-eWZYa}5*1Om8_T zkqB8r0YQM<+X;N-feMF;LGbCvinz_{mb>7rJHh7Tb0Q>Y^JBwjQ&&%~XAV;})7Mnl zi~B+N7A+v>p5)#`OZ?T9z|5Z*r@N8ay$2TteH{GsiRWOIXH_}8LF!0Y@JlQmoM`tm zvF^D?XXCY=H%&|9aLwr@~ocu{aPD;V%9IDGSwUvisXU^Cq#g2(&IVui~+tW z8qrvwBBj7c0N#9k->UB6HSxEDO1AwJIq&!9=`lnRIxLij#flQL&8|`Sc}5bGKnwO0 zoR}|HT-i~i8nD^$XH}J1%ya&PNoOw}yEqIz*;cK`+`>witFtF0Ndf5@TVqp^zzkRX znPGG1K4%szi8wZTlF+9x2C_C7Dz``4Z7ad<)t+tCjs-+#O)cx{sv z>3dM3`V(S?F^N>MKX=B6DW|*DO+)|sJp?OC; z^c=RKshFxzUS7f_}!OjXgc^hH5%$1yBnVh&Ki1q9?~%%zcx@n_lK{W5xEy}9SYs2 z^Cl(hz6S@J$)}r6-c8-h_<}%-yVY+0XwUw|&2eJUR+szDE>GB;wuO(wEFY1ZWEa4# zd;m~hzk)n1xoZ6^_v{w`^NtcA-98-b*$xfk8m3E|nVA`SN$+X4=Kv@6Wlm;F*av%k zz0<|N_Af~}IwVn;m~KD-S&jnn0y#TUcvzoASRq+KN6^h+s|oS2 z68tEonx}h`+{qV7EA72i){e&_!Ds&$6n$KP!vS8f0p1tAXKthm$w)X@b!KO649J-3 z8E8gZzt!0mG=0bHegTU~Vknj!@9EAQz5;Kw;gizZTHNkw!S4_*I1pJa^1FX}mTWV3 zcFcuHF3>ZE<%_=k9ud0TqNMdkX$;=MO*9oZOICRZji!3D;jJbUqsT3;TN_*?F&=!_ z1gG1Oo=d;{A$S!P#{aeS{bZPNH29i2t|j3n!fz=X-UP3v&L|+S0Kg7KF=$IJt`HX-F ztF4_=>8}RPi_$IvBy<(%!h5sT63868BB>lJ4I`bNmyl-@=e7qc5zj>fXJ~@2iJ`lR zZQyrapI6Z3o2Xy=ZKY~RCb^8?3+?7u>te37pB=qv+c_b!>C5%v`{V76YOcPvIuJGk zu=P5#ei<$8!j_7txg8CO?@z51Pxee-i;5_!?5jSWcMINbbK5WclWwL&k=3yhA>~~H zD6-{%eJJx@$2)_HDA8gNJ6C*&IIQM>kIGY`Xi@w+i$E!>AHk~|8O<&<^Ev&UGm$u) zbi&MXNgn2I)%Hro5{CY-rNSqp7rJK1-sQJEnjgQr6IrKD1;c^Yc>7?@Y3@HSpV`NaD+e zOO=LPxyGMFJaKjT(QaeIlMm{okiDXmI5Gsf7#LF%$hMlZ<`$7(&j30t)o-@(vQ-Q_ z)#=U9kZ?V_je4$Y@KJ73M1^*!xXs*n9jkkw=Kq%<-|q`;Jt^~G(57P?hTuYgO}Nl+ zj32Y)N#c2%afBy0x?MN3u0jc~*tb7`Z7K6yfR+Vp&~^PO!wO&fZ;bn6$UCFjfUv*9 z-X67)+nzFX7`k)E`7@)XevDUR^982sx-+lhMgZz0SAEb>lP9Dd77e9x>O7ilavHf- z=U$yAs>oqP1FOwKRzoWV#(|)V%Z_{x^2p!5%%|9Q1<3D61F-V;_)7HA*ZZd`i!K33Rt&FS_L3 zgp4{&HseFce7RF^8|A?6x8mYo@I5+a)Hx&OwM{!>Wlg{O8Lua|tZug@jn1ObGb5fp ztVut{;h`fUkDaQap~M-g7_OcJ15~{WaK&Jh@wmo-H zVIWsju!K9D7pT~Ur?%Ic$o`w~xqP)}*pJgVj1yP-ZqK_v=gslX6{YY$iq0{h&bN=_ z|K+x9+qP}nEuYL~w`$pTEiBt^%UC>_%eHlT?&oDM>cxG!uXFwI{d}IiRQX%@rca5L z0%5J%i|7DFtxomVsM1pt`9Wtrr<|6;``yZJCm=$)QvF~ePll}Q@pkUadNZ%d`fap& z<#Ce#tX|jaadBih^ru^7M36FpKKK(wg zrmnU3Pv(od5M;5g15&-E@%qLA`V{ySs);x09b)&xz!IjXne*qp*jF)LuA3YG-237b zpS@_=+K!t}Qjw;vUui&x6^KBfB1DFKmu{$cdqwH&@&oFw$bn%cSlF;!*Av?|;kzqR zlc1BRXQ8W+EwZ~0XL!<2!AcBE@viCm*N@cED8f&PQ40$TjJpMYPCS9ScBMPZNYHEN zEtZTmdPjx0iFF~J8T0OI0lRSGuf0s6P7}hNNonUT5v#W&-CBV@yqK? zuR;Tx+64 zC1VD_&GFXwGnoFT5xepLJHX>K(zqM%Q5EGorrmFHi{U1`IA`O8kH311FR7?&iP%IV)j+FZE{hPT0qP^HJDrU28q$J*h z;%)^U7uLE#RSga3>S%0_Z|vf{NGSQjU&_GJ*4DH-RoMFJ6?Jun?WTXKPV@b?Tj;m? zt_-<&7CHF%?)n0viLG>&hxLB4iubZ!?%npj=A{+Ln2X0>sv8*%{fNSJV?I>n`l<{r z`T3LV{Y9~^r^{^r;MQ(cAyLt?`DgGp7(YN8d!lYd`)R6Q+G`INE0;88=%IoS{vFWU zZYT0bTnOL!bI6QFOX#}khS7)aVa;mNG|CPeJJGgsd-@9DyjIv|LxO%e(jhFo@DwUtH5n&bS<~YDeba>mA+5Jw>+ z*=eidVuBnNVgHM-XDGC{1=&G1<4QAph51YjyaoP(r=sh_ajfr&`oA#IxCk+z=sBZI zPDkk56QvNDt7aRTFjX6JehiFDI&Y0x${P7iQR{vc@R&-KtQCCNvw*1U7(`Qjh6yF- zG8(XJ(a`uh*y(Zl&>x_vsL1a=MV=sX|7Z<)`nzRvP%G$c=HhY`CX?Y|CW9pCvjaO!*^78cRQ%Ve0(K*Q9hd9a z)rOmj2Zqi`Y;HZRJ{jqnT3`Qku{r=dLuR)_BcwrpFW(`Bta+ct8viyQ!zWFF`sV5v zk6mXsX3eTMx@W7M%ZGMdF_5J{IMX6(!82--s$QZa#6cuupw*AN6jc%pL&GKhqen`G zxxj*@84oU_Lu=lTGfvS0D)~Wk_3Z3yy;k>?)H0HQlLKIZb~SwUF!y~o#WwlG$M=uF z$kT|zRL?yUL#5*JynxyqPjyjV3EBvA7djGpjO3p!?ENJB{JlB&sgYw3iczS?zI#Gr z-<^fwHqwBPGWS$7OHB#h>xD3&jLXm)K~-_q`Mcy4SOi6?$9Q)6o` zxHWb9ooBxv@X`TLu%~weD&)oumu|ObQpcO3(LrLEGa3ZaoI>tB#CLHd>{d$JjtgQp znil}l!Td8+mTCw2>NyG!TaNAwF$&9k77iSs+VCZD3=AdN4Tf@$%Y<|Cfv5D(zZV|>J8SJ)&Jq~OMFSS zQfV>kvk75tP#Tr_5e@S@x*b8@`t@vKwZDPc$mx0a^$kb-)2z)f$=4s4g78Ed6E~GexJ!VS-zm;Zvc|0bX7OzNLD zsHgu5Z%4Z2u|#Ak{Gz94p-GoRiy9gQan3K!mjG>)=2w!yz1glHPw?dv*upE(BvF

Z#vb3LQJDkjUEbD(OdPh@NDNAX6;L)koi(2Tcb6OzL zC$~;|9VncdNd+mw*%!y+@Qe<-6LEWXvoPjOI$A&lLmovdVz3j2=osj?FIl_A)a4Pc zmq+C4ZlXVL8a&BB6u%g^2#&1Qr_+_dYbkArHR!Viv+oWkH2Oh%`0VMTcXC zo2|SmON7Q`bQvm-K zTSQlG2dBJ*9+701nW$1GH;8ff@Q|nu)~o)^(sugAnxK&>MUE=^KMsBFk>W%uq=6@y z641jJrP3%Sc`mNSM&AXQDWP48qHC#}n-~@m>l1M>Zkx0me#a`K(QU{TE9s^4#hIsSv|e9Ig-$5zLD z8t_P%ZR~}PQ7*K#69%j1j#Kgq1=lT0>IWi1tBXdGolqP%$1C5soHg(Ad#{48Lujm_J}BH(?;h3~CGKV3%M4E@mm zm53<*eX;Q+WF)XDkZueP{xm)@-mu~jOTtNzv!Ftg_blNh-nF5k>g;T5?M#Xz zzgafEj5*V*u+VV$Qt$|jFxG*`hpoLYIc*IG= zR+B^)4_SAC)O5ezMa;)n^dHpUJZ|;;#q9IW@1|gVtb0SIpELcOSt_2fs*t4-r#l*f zMCBeQB>O4hZI@(acvh$aE zJ~V_gc+eP#gUIdgtWqvl@KG5b`7`V@h~q?Yda5AE%SLxl(-PLj#?RHdLiwii@b!2IJLrqR04x0|FW2_`7uEsSjzUdMP1O>4*ugC8c3mQL(C-Z;6>(>`IE*bV>%jekrRKn~5SOO4 zq`iZROdi9LOjewu-?_k(>`GLi^E`BkMmkB4Nk-QiK5Piqx_spfus}mDy1(>3QUYYZHUuc7=TNzuk7cDnG<8XWUR#y3 z=b6SDpNnl-60@3$nlXO@lAKAatKZ4NJT|MS>5cAf+CJ zr3yvuYD?S-6BAKVyP!sbtU3gJRqOc=aO+@r;jU{({feW5UdzJs_FC2SO$5Bv^J_%& z6fv}~5-RV1!OT@&EZ3`>$XW{-&dml6%sM&dZ(T`QAAewyLlx3falqYxmE5^Fp)*HAu+`OE zON9sa+s)`ev212FajvKC3=W(}O3XC&H2ATZL;y#wYAbhejn%nb6U;rk?XuZGn?x`` z`zn0iBP>Wqg!1i*yosKf*>Ws`H1Y7kA95y@o-+0iE!;NHB4;n9ETc1=plBAa?_&~L z2$FG#cLkrx75G*_tCH(tCPYGu129@UMceGKV1nHRq@^wSxjnc|GG_pklOk>%!reWJ zsVP|$2Kx?IY}NL$$>ibhQpsxq>4~5>Fd)7=j^Jemz+!`Wmpc_ksO-JANYGF8HLU#% zhA!hM8V1o~e34Y+eoH^8M)}dj9KYA&6pd@d7~Ui+7~0r5h>fMl^j@vM4J7d2k4pdf zS6|5mg-NSiSkxV&#;2rf%^N}N`IOX^lVf6hwJJzkHa&f{M0+WT2Kxpb{1J$O4g<1% zVk)wNaq zNRmd54%oZ)nWqgXDZ+wuXvs^JsI?#YcCVm0l9$2*N~Ko=*6$VP{*2KJ6cEoRXrOuPzeAd zA!A>ue&*mS!Q`5wC)-e0m7zNzMz1@8r24bC3Qa#tyJP&l7^F{2q~+DH!I$-Vk(@(> zjbR>UH4#9&R!ZSLbbbryT}!+77J5_|fa593#6)}p1%kPdb2d~gEQBWjZDh`Qlj?ag z6Xp%-9blae$PX}4!=&Bd_4S@wy+PNf+0&*6h%};l?;wuYvFG4@e_{aa6U~v^`?=Qmq9N6K0afF zuSt+@5`on5e4sA|>tbWLQ2ShX?C3ag+{Oe$*;94wZdngN0 zZ`X59`vL>MQ*Pb2tJKc$m-FDl8D0_Gw2zG}Ni>*hoiDJk&)rR?&wnSGbGDwYDdBym zdTn5YufOhJD<6NAZxo}*qMpeDoitdEBD^w<*QE$?Q6eLxu9fa+p0FWjHT!X!3I8bw z>Pf<`dvsY$kmbBB`P?6vR*esARKivL`=y4jtnkR0x}ie#Plf@}?erEtSyNSo(OB=};n*Y=CC zffy6X8lz8RnSopxcwTqG|KLnno$2oE;x8zTD_OFCezGU+d#N3k?`@Zzojqd2fFE>P zW#w|Uj#KBe^;0|<1PG4Bh-;nfYZ~%3!zn?-DHaXI{tyd#PYm zgS#`%>E7p1i#oxV?R~G?*$GCUbJR=Mzv~vpf;Z*G<~eOnf98>867XBLr>Y?CNBw2E z-)7Gb-IlkTY`=H`LM7>13FCkZWs;9E@Ldb4nx4+@%gw&D&Lr+15@u*WM-4{b`rbnG zjRL;93_r?SYPloj4xx;nPE1%&<;GP8#XbP}531d7{o8B^P|0*ja#U(f1QFADeopzU z&MU8qqW)Jik}CVdgmrs66Mc#l`9J%d(bO?MEF4pX9Z|ov|Do)lR+=0f4Ow7L(mgga zjp<`+WMRra==~zY>wzV2_BM#fmp2s_~^F5!Z!9RqLDbmzRnJVH(>_5d)O|UQA z%Vq^r9ajS1nF|m-@_$e>#$rdtluu78G2=$krY1@F&`pE>yDdx}Ie<+LWdC6kmSP5u zM~TrQ{FI>7jMRr-FIn+hTxJPXiQjq{;yYcC9CKcNt7U#=kARYe)fWy$)C0lFr;dWO z8-1e-rFgqMtA`Ek_D^V04{Mt?+aT9TvRfSNwC!InrnDID`*Owp_Po!#ko~z03V7!k zONSgc9HxJpb*5D}AfFY&6JzW1iDQ)HZCG~AY4Nat!NoaKiIS2UI7xN!#fBkES(G2* zM%s9b-J?k4-o>ITrfZF*&2^N$;klj7W`47o;?R)KFS34n+HIwhUt|CN02~h{#bm>}O#kgS`2lzf;&Z;voOgN!NNWNmP_Pa1v zm6s<1PucvMFJ3jbB>WJo^&#JB<)V4pWp$SOyg=ak$)5zUH|celGxNSbEmf~|hla0q z(kA5cK4!4Al~Dun$x{QTfS@onx(NlANJJ=mow}l0mP3A)NQ^MpFhFTOkrhf;RoTf4 zd_Us@2eD}9cBSS;&n;v`#WnBIk=dTDGjJYL_p8SWD$q#_3zMe8KvWUloj3W#ImRq# z=n46kP3e^XwiYJ3`@fdph$-f7;%U_KZxo&};aCIVgaDDuz#w1%VqBs$-%*BO8 zjrKl_oYNwSSoBiWqk84#RX?lx+#Zsp6%`b!6yZep(MX8yz$=?c;1~=%t1fGKz)42L zy+f|ardzAu^YCmK_)Yg+(3y2R-Y;A@*a~mE(7Dg>>V~4)clYn2MnbF!0OpUl`ppR*cbahwwB5wRJdrLW+{uF zJ*wpi*Pz#$3@_Gtr$4j*S1_TRza%NpQ}?qHAi9~41%8^jXKI{`wzBh6_3w20XIGyx zG{}{C+`PQ04nA%+Z#WC9x|DZnWTK3w0J8D2a>%fVFi?E!EZxRiK{Ze-p&{-axj+aP zLw+GknE;kXqO#AT+-5RanbPZWwI+-r$q^fyTNoRA|F|_Br`2g|+=TS?HLsSTWH*p6 z9*A!y+geHtZF|=YQO%=8gJiK_C@TKzOd6{7b}{f@#zqxxFhaUVQWGx9Y;wx$hu$){ zFzR(*xVO#=cu7MSe;Qu(-Le6sd(d4Q@k8bof0|+rWGuEti39Z2-|T!JM6>apKs6}%;gx`DbfGY_v)*oe6;{Oo3U+!+!qCK&&h+Lnl?Ugl`>&)!4 z6BTIi+3jEo#Uf3~zH>PErtW?p907=Z;9zNWIe+BVS~I+52c62QQ#^vtuI~v>+t+mt1b^qJRLQBhJr_;>R)^uXf zcR4BveR12XzqhJEoF8&)lU`r1-~(OH>g0q9N-8T-*QR?ihNC>z-*yrbYd9>dc)o$z z+iq7)wsz)j``~rFPr`6*R#vA_6M7N@i!(Uv8g_r1s{>NUQtYK2qf-wPqjVIyO2#7NFBVCcCe zLYM@~(h~wePoIeAy>aY&LkdqiHk_b8%?g{(%Xt|a8{44T3-O-uT%n@4zGRgZ>!k&( z_5pjq#A{yhTfKf6y7U?kESf7U?9GA_TxkbC<>4>r=vg<)lr6Jq8uU_UEr$Pjb|HpI zlxHCo(e1eN9TDSwy?V*{QunzgemiG-)q1an7RllMGfzZh5?iHa6xEniNOCfepaY%LWb9G8J`jv5GuyU*hbByS^ebzgdb|bZ-;<{VcET6yT{IMi07M^;G6uD1MqiSF zP#lY@zap^cnB3Q*%eAQRLF4P9KZUJmg#%X3g1FF6b1%kG3@>hz=DIBx=D<**~c{ znV-l6$w-zrmi4YAqi-xFVdKDbqVu6b*zBWVB=#}B&jUhLI!Q-kGkA0t!H%p(g&(1( zw2EM1zV|lS_vbTJ4maOhE`b4WxX)f`T(u$B@8hL-^FN`JOoq$Q-<8udIqH5?LA=R+ zaeGPxP()Lu@JQgjp4Owiuv&*SwN|uWYdz;bAVuG>18j#!D zCKnXQN=ga~p9l08kofP_*eCQfKa5APnjZ~r-Bxj4j@L*_@7%!mjQA!c zlKgS*d;CvO=d!f9HB&b5jkh=8)|Ly0X9mMbR{d<5im?}pwKD75YR$t-D5{9J%@L*? z^#B{tcM->e-3+{CE{eyy5H8A)U|EUaFpKB20~A{PcQbvWZ&w4VZwFqeQ@;EAyxwQ5 zk8Dn zHRFRTYU(J7K40FFC{B#)HJP7t{kKKO>nk&TU4@n8ZTK0Monb9CZC1~n6;T}xMx%mC znNkJ_jAgnUZASns@diCWK#L}gxil%HH12T7f7 z;9c;DiM-tGE(%{yWarp(dkhm_w`YX1r-t4cWz`_!v&EfbTpE)v;E)hZKR$%A3T(+s zYKoSB;si+541_~m?iwq2f^QR1rO@BwnHUfvk%rffV_L`%F?3c?BIR(Bw6r9_h2_87 z48ZqN6j(3o(GJr9xIzO6=uk{7pFIRwK%xIOYs0)NyMFw^!bHd{P@Wz+W%}R4tq5L^`$BY_ zq-3E9H}~Qu;7DS7ggYeiGgciof+K~=+bBIy^Y6215gm= zoqO2JtEQYlNjJj`9?QAZ+XS2Ppw7n5uaItk=`3G^X(KOy7bfLt z&AT%mc|ba_NBkkjkt_!xB(fq~&+bn$Yf4l(DQ+7aLZVTxxergiJo#rRl@$r595Z)K zOrQr;ZP4)9Bp($Z#+&U?SyOBy5b8P#$TbH8tv!EVS5Z0jsY zV7jRk0>xaj;8pv^*=kElG{9wziSAPqJTp-si>WdEM)r!9ic86Fv;5E6?|Q$_oYo`>fg!R$Zy0*$fA7a?D$Z|;uE-N%YN zjdY`WRJec6P>Kw2e=SyU38+$~I?^PrjK%ko*p;pLxE?kLxfwE|ZoK`O_H4ZnDywLP z^y@d>q}yZ%n;n&C+D1pml-HC~CCLH#rp6+)YgBFM`32qLfZ(O*LP9+U9J`##<&NU8 z36}13FC12QJ-36gvV3i@+EQo08jpDc-r`$`s--mMr%(Dx>e^{q3}GXu)Kv#Cq}&5! zL@3~u6~vJ1Zwoh;gx-2JD^@K@3Kb43t(fx3<<-^w9Mzw2;-%>58A@AAL3xVXMU*Lx%|BUE z&8j8hE5MGHXaSp{XiDw_Vv>jdQmk**7wSlsRu;b*>P*5i4w;)B#uJ~dH>5nY;sDJB zX>g=^wQ&!Q(GqY%44SiphC;}q2Y1=$j=73Q;sY2+5^9Y)?e3#Vzj`zs7Q&Mpj_`gY z?y6+UdRe1JdEXF9+pQ3LwqDx&QN=0%htLxsSUJhS^PAgz?s-@wtR)q7dTWmhce=Ux za_e(C$y;7o4V)+daFWmEB=~Qxa858J5D1_Yx-743YzS{~4u|X|jfS@*6cii5#3q9% zw38PauZ2xeBL;Fkhw-&^b&IVymWfeT*H*o6uKU!qHNz(Mt)68k>J@Gbhn}VFUv-{Q z>4HSVy;?(+OmH-D(Tt#yjVMBO40TNeD+&wEECKcHWTjq>&Z@zhivTfMq)A7eb2g1< z1TmV!m&3lG=ZknFT0#5REanv!`jqj+2XKvp8?#P|M9z}V)yoh0UES3)p1A_?M6Tfe zB8hZX1L1(Q)`!JrysGo-$B&xQ#_KWDplYlA&V5|2$tyN<8FprSzw*0SOVBlvyQJj2 zR6o9`&RB4sf9IM3U0s9AmCt>3U;})NWKkb=aM?^WmEuvSINeGF6$2k=Y10~5vk^i} zRB8>JhyUFiTH33wVbGY7RFI>1AO>IP64{$?4D9-`x%v~UWA!x?r1U}Px1@AHM4p0# z*~PFpWsp~kTDlj=Y({MVsn!vyETXKmKP(T7CMC(_0bE@_ZA^O57TYYF*yK@cw$Aqr z$`twI_U_NeCGmy$SULh~V7Pb3sO^-|{M%pug+x*4A=*vih07xwFZMPGd)+3mQ0Gqm zv_Du9^T#s+o;oX^4Q_jM4IVm6xNC6>ze$?zS>MoTg}i z+Xs2+dL;H-uCBVhxp^=M1yr7jx_n8TId7c5u=v@xsK@0Y5nfQNiUs%>f0*3!8UUXje_BlH`?F(+blP?(uu=Bp{ z!4G2am!!WTPs(8Fljlvr3V3BftE02W5#1#=zwp$5O;>Kf$hQ5`$ntt6HJRiM#5nn%H`mHBW1c;k;#co+4;I^dd*7#Tvf+% zjj>L9<0R@>0OQu(%Zq(xYoyyEUS`6IzOH<``_lh($!o(8NPV!Pa(we84xunTAzOv{ z%8dfYJN$H7Kq_e1pr><@^+`utyV#DP2{k{C?gI4^xYbK8ja8m(J{;9YpkTP}hUnt5 zeABkykJy+WTn?Q;2O)Q5s{W)jTImvYcY2Ng^nY<}0pLF9vVSW66_Y(>2wTa>E*n=;3YsP*T*K7Tf{I@KKj0PMLXU+5|Fyd02+P?jQM+lBn zw#!i*o-r}yqLOA|p*y~`E3qmJ+0^)xJIsxRBgoZ_7MGvyV+3HLwM)tu$I_{x&-AcB zH&4(P#DaG7omv8MBgaxeUhfzSA}&gNe%>JoAt@;%JKIMMu#j}e#8e-@mwy*#|Mpz8 z(UHb(nhlAf`xWjwMOxp(_;vWCf@Ch;LD(A`RNlzbwMNn7vRddrv{Qb|_td1xQN{iT|6j3+=q?Na zf!#{4lsq|DTHKmRMErahvI zHlG5E6az(vN?GW|6br{Om$2}LQWi%TA|_3u9L=}ob9XNfi|pa6Caw=^Py}5xaDyj9 zkfKD_;+{BCw_rmGmE#H-Io%E`GkKfhWEFiKRL>ykj|+N3r=Wn$pe56p+0cZS26-kd zybbEGtxT9KyA>b}{I+ZR*Whz>aZ*@Y8JA89g$NT$I?3mgR=gA^Z)x_*L~^wDo?HGU!o%qbOGp zO-D;dOIs_oE^5deSk%l_5rm>K&{^~QKpyyger>AGfa6R)S+H&`^WU|xLvqK1;6r+c3IZ)G9P(S%MNnd#?7QZ&tldY~7tAw>6* zW9JwEB+Zi}Aw>L#jSEK8lx|kpKygP)h;&+|5zaG0VxN!n)cBMZH2K6M%1heB80for+)u8l6$%nwP3BTzn#gw@08$;8OQ+5-PL%CO)Y!B$WZ!4H`|S*K39@f~@v`e^Q#z%__x)~6r<~uv zznT82+c?*lwo&?}UoyhV2KZ^*@z>i!kzdDSNJJF+VUgmr^_*>SnX&h^WnFfqytL)e zRnPm~j6eijv`i6@!#E*40b1IrIM|$4fANsOWNcVJYg*F6hlhuBjo$~d2ds(x1GLR% zr??5*I4-X^S9(2YEk+UsxnhI#|C=^fw{f0eA2X7k`r1eoD7I3sGJ8!zv%ZW#w&6D- zta`TGU{N}K*c6@oW5G&No#`k$9=u=lldJ&1Np;@aJ4crmgJlESkRGuZSN_o=2EkpF ze*JfBcg*LK&?v!%W;zD1C|AXRqgcCd*R%!ewDN5U9r$ zI50C;2DuvPt44ho99eTj;fO*K7B)iGPev}MAn75o@5Bo-!E0L+7XWE!ol`BR?fhD6 zRr{K!y1pt+wjx{D6zwm|Uqps-S(vc&O(5U$fuGy-_o{B!@ftDha$f&Q;sbnrBot3u z?11&33-w5Njx%F?&})Qb_tk0KAiPI>uGb!HGR5h6p3&KQN9e)EBoa!fB%pIgiGWs5 zhE%lB2H`X5HqfP}VS~GCYL1I72_dd?s3%r=0dCOyzjWX%zHxkW+ajq&^j$1*O3i2` zMz0n1ycSs!+U~ml>iYq_T2a+@{w&$!$Le(71bi-QR1UUU;u@Nw%Zc_2opLjF?BKIf zA*#-e!0XmGGeusedwoLLrT_7VOqNtb^*a^@)G6=7?X9M0Q5W~rr0S&U+YbqW*W#^2 z$)aE?y(B6|M2qk7^Ie1Y>{y1wn#Y-OoQ5*GA9f05Qcs4b?AATnaH~eE{Yshd=Yoch1wolK(bD3HRDmB|@Sob>b`+8ONVZugwVvPw_=LMUs1Ka9@~0-T zBdDxjW=0x<%IxeYfN~T!Cb46f(C1_=YU@bo%J{(ePc$%)_X8);|DtBZ#P#}@Aq!+v zI$|Nd;uaMJ#XL|Z$4Rx0FHK?J_Y8*-sOx?eH>IE#%WS)LAizLrY3ckLQO$Kf`~*hn zZtCz^Vz29dcxf6TxpkbzR9&B5FFu@ET~DeyfsFY%W}AW{)YbBZnOC^Yb`+uufupJ0$S9^nooLe0> z_!cS?eV7g)6K)ln`Bo~`gjKa!#K zsMZ2u-5ls7hvZl@MA`EmA?p(5yz(@^kVjS$cJr$dN;C-^2_^L$Il`UT=CgnSz%oRg zw4t}!XDaLPZ?@OodfHm6gB2Yf8Q$mZYwtuVep$QumLOYRMbVGvY0+EJeBT>qU<*V^ z)2sLPq*0NFtIqFWZcCNu+oU7r=qecL1&pV^%^6xbL{W51Go-DOO|#EwXCR^(Pe)BM z-gvSRh$37QJtshWTmr%8L`o^*fY*unYouGdvsty67->mg;W696Df2BYv@+=;h(0(I zPLBu!*3#41uQ?36?mp4u*ug+#v>>P>3BJxqm8;|?w5!x*irV4`aqvS}0u+LcnNq$f zt?)?sMaMr~rdxq~)+PGK^5kF1TfP&)l;sDr(OyTxSJ2^t!#Y z;khE=hz4xkW;8pWsEvMvD#gUsyP?lTIqBGhe^Ie zpc`!+Z>DP2F3%8ORGA90M~)1uW|WbIU+B4#KP^h&_vrq#UQ_$#=;*jsGM2(qYuu8& z(Uom$;{aNSPUAE-syDUZOUvcL`y9KuvG|hr&-CAaRSP%1+REC)PEAcu?~jPEP%o|A zYb>gk9Qlouw@FMCrB+4M$U>OsSh06#r_u4KkJ2m`D;r*(44Jb@VSwp~@ah#_of99} zgklR;5|9)k0n&OFP%0Ui5fk!4`8fdx`>&9OZwu*QLocMgu3Jabkh;+@u;s{K1wBgu zy2F-wMwTDDt5byrlQJHvJWOItU$jhe3OMe8Ib!XhR$ zt#dM=MDmnV#TIcLp{1B0w(t2{2@A+Ywi~SXh#_JOwd$+?tp5Iyeo{F1{_J?v z*)iQVj+5jrQRXB4{Xv=B*Haq*L}8{;Ky2%Qk3+#(+3Y@NTh2yGh$N#%M^Oz625dh0 zNtj6?{uDFj&>;SXZO=H}5-OO?sg1B~AlSUYWw5)$gf;l?@iFD__WFplz?-=i+1O{z zZDd)sr#^g2EfGYuRQpnWUsKU>Qs`R(pQBj#b3MLoMnSzL#bNlTrA6c}iw#*{zsdn7 zB9(5uxOP+oBp*hX=naLmXLT}Hvx@J{u!T>E1HRy^JUCTI<2s1howYfj)tT)qf?bWCbEan6{Tpb zQDN15zi@%Sh^8wu7Q&z7*)*<)m@+Fq|7fu2&Jz{}6A;>E3O@epA*AG$OG~24GWoc1 z5)kmiTUl<`2Dcmn#m?2UKQPLGgNI*k{)Rb3{fjChK*+p-4*&-P7$iW;9kXFIz!n?C z9}IXpxtJBDEvX^Bg*y=!fk)GIeb1{Vo~^tl&zm`y0hgh?qM5U6D<-*D570 znmu*1D7xAEZ^>)Db~c| zGik!C=vCMgR^Umcz**Xh`KHrmjJP$u4u`87#@zYpSYzq49?Sx+XL6roqU-gsUS3{+ zj8S_Y3zyM|U6UD9uozklMX^1>wi=8&24a{bQQ-1+=m-E}x@GNoyYbrecWdZrCrjv% zog&XuNs_NJan_+j04(JPAMe@*f`S$NwFvC0zyD^whEQr@N_|@5BYcMUqsu-m_Vy(4 z%!v)Mo)Jbvh$BUKK^-G7(7#6yi-mY_ch;sLpCA-0)?ofO`}?3_?%nEp4Pool$%#{t zK$g-VI*g~oTHu%=knErOoj78wCqG#+lxdb{L?|e8VYBHGr<{2EIr=kC%~m`6rs#~9 zx2)F)cDhDX^zN64V3hAHKkaFzl6c1B8A`6uNX_GP@Ft`Z5*}pgHd}ljJ2o6QT5S5| zgeOM3=iW%>+h!k9*taS@*oCa6o;=UXHxYExaf1(tiNrqHG*I`7lx{t z5Jaf{F?5)y(8}b1q9}An6`sw5*@Xu6(>T?oy&y`*@|DLzt5jRweA|x|Zca6IhSN{~ z=EGc0j~ruET0ItLn<@2Zk>Bb?(KOg<{jk@znVa+gu$n`IawLBUjb>ZP(q}RZ9VWw+EBD4lC`aU4Lp_ ze${3@<5W@W>8KNAP)Dip<=S(Ok1wf^6|D8Uc7A2jZ@$Yd!4bR}T6C+Z<*^|~3cenC z(GL0VI5oa*aJbn*L0uCr8OEq~>7a}}k0LG1X|eij_oWyY^Gg-cZIAB> z?ScANTkE$oiuGrlUPU(PKiMH2*6#SFAYLLuWxBqH90nBebk8iLxzLQ2`1xjDsy zZfY|@lqTG|Em2PHjWF})KN^{_42IRL@`mM>#<(7tsSX?tE4SjU-f}6N_#ibg5pZuE z3dM~~5t<)TU*sC-eo&xy3b=j^<+j%;IJ@&59xZA|{@LE1X~QJLMkJnY33{$F{1LdJ zYLy8G1c~_aP)NFW3+;8BjXjovX_e7xA+urLUjh_f7vnqQ6nPeq&mIa|u8MVicH_c` zc~&|_h!S{8YND=1eQ(UCgf6k>O2^gczB65PfsmC)wq1cY%u@N6(A!@RrE<~{G;yX~ zkP6?99OU|)_i2T_Z~I)dZ{#kejKgYCuCw*N{^|J_6(&8)+hiNR%PI&?qr;CO)6_hX zZTG1eN(;F(;eQmJ1y>x+7Dc}#cyJ4@gS)#0cXxMp_YmA+aM$4OPH+Yd5Zv7%xWnuB z2Ux6`>8`3<=j@$56cb+B*x;?cQK7lGxztecHVjQ?01`;oZ}8PUjTWq}9b$KfpvLrd zy>=04W4wv0|H4%U|KZ3fEHnXd1^+G+;aKEB$|iu6i-6tU=fxekQ;c}I?EP4`t$8sQ zk@Q93dc8$3)275h3^c#*7%D`K9K<=A%#hC5vD~$SlKwrBY4$86K`G4`bTS@I&D}5A zp)P*=U(}DH4H*k5@o4-Ps`%|RJa#9!I@XJ88&09W+OHR@m)-iR>Q^3~nh&_!at$(2 zlm@D@S3Cwy#eGZV9La&{`TO-ms}1h9HTu2Q%pCB{qFN1} zph}1QoffBz0!OSD8P$)Mm1m#L64f2$F44dNZxb;6tefzs1~M{8dvLc`p|A!QyayHh z9Y{)o^-O0~wbR#r+8y85_m4+@$Ht944oAZ=jbr3)t+%&#Jwdkqnyv0z3Nl09H}*K8 z3+~I)uiq|S-(%-wYdZW9tKW^Ll#gx2P?V=cDE+-PTB`AO3Tzh}_sNA6?Syip5*hoy zSOedhNm7}cuh)U1?&I69O4J|>CR>xUGcsB{y_j^cqy~r7aI<4mtQj6~2<^YnIC6|e z!&Ry01<~TI4~RYndR{+P!II@?(ctV zIVm9`@~MzIL76SRBxrSCV$y0NohLYTVZG`6j6UGCPe|xA(~9pbtk(c?7Rl!F=E~mX zm5?9>Hv3JmQ`DL^)7comQ(;mvoh4IW`J+HC!HxAM zo}@@gN-(%0Z!y;=9QvV0eD%NsZ+OvVbeS#Pb-_*oP>U+UEbZ>w;|=JTS$X~P8%vg< z|Cv&UCfr!TErw4^`z1q!vvz50*pmz62yVZPCG$IN`q*vjy=6+(Tk{Pg|HCkvsbsSx zISWX6@Yt>1VqOMFD2a&-{x%xu0EE@^&VNK;uO9P0UKLz@SJ%pusICXuP>dRNj!ut1 zWQfQ;I%DNH$B$im6*U|3fZDo$WeuBT7#u>%15VzjbIa z0@$Wf`S_IOzf_W_a6?4*m&MykmZVTDSQ<&Rers3+g-B0t{&eeFg2l#=EQrl?Oxw=d zC1Fc`>-TCLSyyZLI_iKX@(ryzA6DMuwLWP>T=|;5=HWz=OOFL0F`hp&!-)YynzS_2 zbeI_{#L|IJVM=ZzmzT?hYM^M#oY{~nYHE$dSs1F^?{rc6V@P#KpE!P@w8}1_D3SUh zht9CeS9#zrlU>+{TB_h>b~uVB27{xQ)>+G&BrY$g3u-XMn-xwsiZDODArh5j$34MH8*-(akg}Q6aAV*-Gtq%w5rr?GMiaKEA~7!lTacF=K(BHHv~8So@*)okS?($Nlj#Lc4LBQF<|0 zJIqHFQ)3TjK{xd=L!biOH!Fs$7(2)o@38-nR#Rx)6)!qfR$|c=BWTirqL&+1z2&nlm&0TI;;Fasa}2I6aPWqQ z5+tJjx_9PmEGzkNR*_pzKfcGug60E_G~tP_DU1OYW5x&hO2 z5I;1LSmp1oBIKg$G8Z?u&ml?>6*C49y;uaOaI`R)ycn?nekU$0-3zg-MbV6N=<9U-{;NiICrvF0@)yLj&mSkFL zT8m|)c7Gysh8&(UDlicP63hMDfA%~#?Vkc3?in3Rg!CCdRW3U2%>wTuNa;msS=)af zTWR>}G*K~u)KVby0cA?EcJaSW?;Q7{3V||;I4}Nh<2wEA2qNSkUMLvXrx8_hDqd}{ zhd8!zT}x@IhS85eh-qU$1F+Hqul%{>d0|xIlJYtE(rwM@8iRBvI<9NH!f= zITJ$2S??EkqmbbmuO0})FV|MO#N;cBR5IL@FvS74s6%TOhJs)sO%l~^9iKDz`MVhz z%l?ee`@W;&TftLZgS18kK7y3EdbYO)Nc(q+WkKCa(6}Y;a18 z30#@Af3Iadli}ioIts#V>(KEUc8R|!9D{M)*)lRRZ&B3p;a{{9c~d-?eobx+oUry* z9T`iErCr<#x{CB=t;uZZ&zs%M{VjyLk6W?xQ@_5p1b9xKaBS-L+PgjknNq#=sh;>u z9Nxf)DL)=I)fI0aKW+&l!cQAyUzO?-<~51FRoM&^)QGXq=ldjwS5R_2=+$Ss$qXE; zF15HtFc3dkFQXan1wBphG-h^@0dNdu@F^h-8!>EH;5g!r=_r#`-kZ}0Vehw3gjkcK zBxK}p=!NOBM80BY^gr=~>DP}@u4s{#K*V9$#fvfZ{{C_LCvJQ$V%3W38ezsxf4g}2 zKh{3mHH5~L00PC*9{1<+QbHb+!O`Zow{9S|wYn>@*a+ml{ zv+w5uqqZ*hy8YWP3OQSC=kX|PrC!*44V_+|$KfHJK89IxC99 zTz}}mfNP>IL6rKXZ?fR=sPFW6R3e|VC`~IQ6tLffRCo{3MH>WyZL^U!5x*^$NmLk4 zLQ4Hk{J$3d$Ow_+jkcP8Gvq8cmI(h6`_Ft*+1PR3j3FV?PJXtRI>b8DY@QzS&JL#D zxoan~vvq{0WTQn-fIjO3=t5LEG6fcDJ6AYB@ms((p6~3R7_+;bq~!<)-Qsz=Ed!Kd zeaL`$-*$`YLb~L9dKUo?RvoXIm^LtBh?`_cj65~uIq=gdlEoBmlA;f2Nl_CX*l$rX z*zG$}FOxaA8mnzZ10?2W9HwxdR8Jj>^CfLZvFBuKv+;A_@PVD8CFOy#ep~{tNrC_; z_iQX%!5v7aLAhSL(Z1vIm}6u4**=?v;>Rvg<#}z2@ZYKqM5DzMR5k^=!GmNes=IFD zcQ)CQY3_Rbj>r-`cDdV`M!u;6%Y}an7}aZmlPle)Q~N6E&UVn`CHuRRt*kG5E@shE zteJ1ENVOl;cOljn`&wt)ly%eo7=I=ZSv~YrpouKupW;}>3f-(L;ZXKtxaIqVQO)eY z@gW=0B-C0A8i@KNDSsYz+K|?l9NAEAQCJ->`s6bBbKOt5*xr6S+pVONZ<)-hpl2|l$@vlmZb738cBJ}r8)<`RoxCMp@;rg z$X5exr<=j6-FFpr-A;%7%#_{~KMC#gf_d&6{i6;Adl4G0Y){;gSYA9KQU1;=ii3{} zV)j~V(iEvA#Nu+=vS*{=nZ}waCi){yy86Aot`B?F(;QsxDECv5 zl%~*!n=YKN@@AA3ilNa(nkWm1xFV8gSI4iN%|G=Y2z#)fdy)F27RIP{h&M6KO4_Lcn z5Jj0-@#2!kb}m64GfdN&EeR+%#FOXKj9j%KW5z`+nhI$w8XJNXr5afuB5-0l zhWpl|vMN}jYuGw&oOo9D{bv;_MX|@$V#{0#!!RLz;l#{fde~KVV0_*?ok`bgB?JBY zzu@rS)It}JyMg!37^4wr@>yJVE2!FU3bmdK#}snu1`#DCGYv1%Q5lp=`mE^^4nLa0 zznT1;Bqfhh5}J(;07Jr=JlQVSc)|5+Tac3kXCGJGn&L5t$Vf_ome@|>$Ls5MRz~Fy z5)tP_3=UgVgkm9zU7!g!7f~XXb7?eY$MIt{?9Tu7sfGeaoDUcrCb77URy>a|SoC!$ zx~%NNP)p|tylSWe74=~jN#e1NyQ~@a*wa8a!FVCwyp+?$T-a<_<~Hju8qzyQjTbFG^-59aTkfEyFE7) z!0a?&vr&@)3CWIVUE;PJE~0?63;Qq0KC%mGDVkMfSz3#`|2j7EIQ>sp(X8wphfLCd zA+|8~zOb_R_KBTJ*2hI<^wdU%o#08AuEJqemf~<8-U`0(`p>LL6aHpis*vg#<{bZBJxgM3OL#EV&k z9@BCFJlS>sPq*w7gW3_ptJ7IJ3tv=e>P4Iw8J|TCA76+4Dd$&8d4BvY-|YX)oRElIvkxLZa1mFi6T>KGsKL@#xHMWZP}$?qJ*FaFAJ_@f(;r31S9d zReU$As3QSnwwwO1hK?@(=NN0xNnW!ReZaK`sOn5kc49Uza_3+cQ3y;Cd?xR$N*jF| z!b_|vnre`C80)qe8WN+-9-`7@q9TUKNOhoD;d63xSWJQ@Hn7{vgHz|xpn^`|1*h7) z`DOD?Nr=?zwJ2_5;sz?6HuRHd%3U#z6mHz7|CU&r)Q>M^qen&vR|zf7OCQntpE#g; zZaF&wh@K!TC4;OHcP8Sg+Iauq{c%oxEq%=!%ltQ6iiEMK>zln{^-LY-NcNBWBA)TLh9L zoDz}hOXeuM`L34(4Wh^8$||i!qEV-QXe916Z1hAX%8Te^YhAL-@*+xwOaFzng2{(cH%`hQ5mnS+NLZhuE{>;Qk0~TXt zsI}^d%b9fe^~6_C=S=}%3Z7Kka6x?f6!0iRpG#1(z9}HqCiH#!{?qM`E;PgsAdydYIoowN47G0$t0`_G^JCRd>ZAk%)Kva>~&Wl z%a!^!+^^~Vk;27u($-Gk`oWCz{X7+GT;tX3P?tf|t>%~pA^f{p zVWxq$-rHfLBk$WuQM>>rN5HF?fzOq=&x;QYBMney1$%DzL=&#I{6D$Mn`3;NUY}Jm zmF=N)v!Ks}_$si#E(|4&#v+C^z&@jfkvAkmg1%kNwRspt*Za{9Kgcd`CQZgY0ec-& zXS(9TywnXVhyg`GmH6(Buxo8)OS99DTaJOw|5V7f3)7@d^N}SI~T?4JLI2rcI2{EWklKqsA%D= zI{H$vf~x`=iRIbq+Cd;~Vc<`Lh(?*0GDI3enB8)$CDolCBj=&WX=Z7VI%P#P#N;Lj z#5B2jNrxW-kN;5opqlQ#Ui5t&$;Tm*{+?(LYBgZZ8zJ(B zaYWO5Tumf+%bD53T8Rw(Ydkajb|}*>OiHHP^Gft<&YCp?(R1_WtByx&qZP!a#liX@ z+mU#@AY7gzNkhBQ=4+t;nfQti%)^U!+R)hF$X)76`l8;_yh&Y;e;bmg-j_vpe>JgO z|FVR$INZXu*lqs$74D@_PkYfn+g~-XEz?=(vRU6)(!=Aj79kGYnP$yP@aB~C2L2Ex z5mqziG8R*l=H5pXMS|N%Ne+I#l9o3A>*pbXPB;OV<)0`ikHT1_}$S3unbZ zYDJA-{`3HuH>(r=iCk?_a|9m`A5uY^C>2uG!lbK%>H=3U1)9)4%=Q*{)SPZ%sC9f< z|ExgK^WIq~trcIdFu;9g~OG>gRbD%L=U?MqLT1|XbQ z5pHgDN91un9=z@XJ&9ZxcpxvOoF3(!mLYw z1bTm3=LtMHCr`N znRq+f%-Aex!cZckxa3IVuRyalG&B^r>jMH3N15+K-Y!cRR78pia)UJWDG3~E$myKN z8!KTIchTP%-o~R2J5FBDomJ`)?2zFZOpP9BLF9PlUf2W7@OMMn9~N9XT2Z{!QwHkl z)nVz3s_yfYy2ca6zi>W3@?l^mFPG=0hqq2B@D?OS+VZ@>4Ls`XqLfbe3tMKF))*?* z(KUaAricH`nD#||96X~=0F6%RgN&0OS>_xpH({nW7eNKoJURW&u{CUEzdEG(TC02C zoy!_*yv0wH3JFgc2CmFpw=XJ(`CeC@d`e~_ zG^YBh)^ohU>@hugDQ5mLOh&T8Glm)7Hh>oVPm0PtN|r#+`{UE=*o^rhr`FY46&#&L!C>cw zuGZYNOaB}vS$>mNZXb5}Mqh-r4zjTVa+KVM(yOEqhN_BkQleNiM3}l|m)?;Jr-Zb; z`1#Bvc>tb}9tOE8CHVN$wlFi@%H^4?cNbmharCpsajmX=Z$6OT%jrszICq%&?zd$# z869O|Rl(?=nfaNz&h8Yf(*?b*e|MpijTVy~RRsmk%5z6yIg_2b3F?s-ahw{}I-;fn zHZAt65}uadCObXRqDGXVKB+FkflQ##S$JQb6M{A_h|V;|lf`)bWro>Heb*HvxaR9k zed(n258F(U5BWBQqI)*pryZZ*J_99sma5?Sn_S{K8zpyX(&I82&cY<32{62s6+GeK z8$+`EC(Q5|68KR@G`Ua8FutMCwgupq%tX_Mtjx$VI4K2q2IB-P#eyMsus-hJx?J04 z9cZ)85UV8As&=SkcQD?;3z9GV1oP-jTd-=OZXpJtP! zxwE2p-$V%c}b7yj1RbdRR%^N&*0b4&e^n(NG?dc85F{xL@m18>B9WdtB zDtBRcI;{YrpRzIup+C3D*AWPAET)9y?4;ORMAZ3Xxo7((ib!WuWuzSzRPB z`FqBSP`L&LJ2yB$^Gc}vy3S%EKnZ;h4h<&|dix$tc87%gJY+y`UXq}lGWAJ)MUW!dV!l;M^%{&%5xbfW@PiH&C4DO3gwUEpHxfPFP*Djb>NG8 z3W$DK!xFm9-P{=Bz3p8tpT768vnf<kh_D!M+~NyEK^}y94m_Ip)OGpSSXHVVQlWL}Kvy5Ykqqc~d0R)#U~N zwE;%_xd@$faw?{>q2c6Od*jnasHN*cM%wJm@}&0&@y8Ot0G^D+UznSjQJ}{fVTWRl z)g#sd*HL4idGK}AkVlfKtIrqD(kSrWJ)TC%T)%AenhxQ1e+kC2R@sN%Hz06;oiQR1 z!AfXMO%qTU`wYrsF%xyeoWGtKInWi_6WX zu(Cq05o)xNplE7&)&iyUiyB6LqUk?DY$!M`K5P81TfyI^K1RmlKgU>C9MqAQsH&?< z1O$DHUk#;30432tL9yDT0=1BcL&Jbt>vuY)Zr!8n9^XM_*FYg==0^in(e4WrC|m@n z(K1?w$w|A-=IE-LZOmWs_D11o+&_Pmovg&Gh6VW3ri>*8k)z}cH)UXWAD)|ss7fmc zJmFmUZY_$DEB}?dzv&hYtDIM2P7c1+!PMEr`F#r);gDpfHS$LeDmsGu^&6=qE#{!! zsuVLsdozkmXKXZR94X0-BzlO-lmT3KKsSnvJ4BusdpyWFEbV4F`q-F`H%bIATM(1` z2ZCrJ{iv$thrk`?4VYCRq$adRQJ=#s67WXB7izdVgp?SZbtbq?2rltq<%srCoOq1u zl%3)YVPTzrZdj9;to5WBwN2{bJP2FeEhS*ll`9>w;yr^eA? zbJ-j9%~7zFWXD@C&GhWhYvXtDxZHT-@SlT*f4_nfw!~~Vp}$(?rLkZ^KjJ?g+Xgi)L8N5^#vJzq7jQ`RCr0CO8)W;zcjS1(%D z50++%vMMWSSN~R7*sXVkDw9hh1UY%xcw3wAhhH)Y`Hwuu9$Gm^5(}|L=BoWCK=;0C z-1q^})R>=9iyW9PC&h(a?=iKy%pJ?NwffQYe8;yL&NsCL*Uv@ca8yTVu{L^g_moa- z#A`NM&Y&#j?<}?%gXy=4;f$Jf(s@q*Ll!c@PSf)t`blEctQ|3gj`;ND_5ta_o;bjV z%{o(p9giG6a%OIQBm(Vj&GVy{`)Tj;>Y$$sg~M(4UWr?bw}{o}3`dWVX+{dCb098t zUg{SZ5%Cr*LwS683Yc_)PfqZvuq&M>oJTgCZzfyU>P;qPWLIlig1>f!?tk6XN#ig7m?JQbU}Up zUG{coOL5E4XM%F30R2{3MP+eeL&(6vq@H^Xc?k;?JyM{`;t z!-T`Duxo!olV23K_qV9g5-tKC@x&Pzb8VE?I70u)P{rEsgd`yk9eey)JUo1|#BQkU z4zD+ra5-FW1w)GA!^sUtr8akwYAjr`N#ds^-I&EWYfPP^BQ($;@L;ym_lhTXIgGzz zsap$h%f(^z<44+r(UQX_&4t|Nv*nmRlq2;{UfJBX=UyYLiP@hc6;j*`VP-OIb8CAj*^O5pw8JrJ~aYvjrn9Oek~pS z`zWg;WwfBU`8QVd zSM*(^!RNGVcYQnUzEj^djmcD%s1uT}AbxC$MV5A1VXha}Ub4$16)W>5(+12Z`x^-#21wU&t zm3-+44n#s4@f9Jp2gjcC2jYHST1S%@v~;(d_I;ruBtNDrw| z@|@?5DVhXD^s7te7YYx)v<>#e;Axt}V?zhiyVEaFFB}aO67EUSjgB~>AcR5m=MnhZ zuVC08qTu5dH1a3-_|V#9F%X*k9L~|hWvE|3mEj!=_WJ8!|Hcg<+8eZK+;;B_gQRI! zaq`X2V`-TsTCpBC@ezPjrSb6a00+0x>cY92x_Z6wt`G0ZigYPDAayx8#amimn~)^- zADkH>V2k;Qc65AVOwC>Vz7<7>4VdTWmKPPQwc%y4nGW84FTn$l5EWf@_1v^HAzJ3W zO9oon6-b} z6yy2Z?H{JJT`d%L9+M8Qw|CU(wI2I=stdL~g5n^mWo&7VO0kw<>HE?d_fKCi;*ZW;wf$BxwNILt?F42njvnQ7J6J7B{1~%VN%7Lb z#(2gI2B=Gzns%}j*CXC_i?mB))%jTw*okJcVKrP|;3$vBx*9siZ0Pc&L8j*nojTxM zN;$V*Y#GWwY2yB{o&-%+cOrjnrlhn!l7=te|1q;me3ydBj|z9twZy>@43dHa{}D8K zjqq45r>`ilG#+Z$ccD!rs-PSs7^_#|e;7|f$MNIC)Z>sJ78!zV5ujiq*(|jMgt?cYE zK=}d?3IP%lj!aWSu<)(1HtYcN=pOh#g;Lwq;;Y?Op6ppd7D1xQE&7 zp3)&@AU11$2d?=PEVwj*xxEfs_ifa)jAHVZI5@YB z7I!dBRT9$H@HzIEF01DcMK&;+Z(9wzj30d|Kz{-e5%FIiEb+hhmrIxThn{JrkN@l$ z7%(xv8MQ8>ihZh_4;wk1+`im(_Va$STWP}mFbdrN8W`yC+#gySdv-?XWQ*(W#!Qf1 zV@msDWn+Hd=JLd)X0r*cbBK3IZS$XH{K#9|;^C@(LSFphp=fG~e@5c~KSAfD1aS1h zU#!LNcIvC-YQA$1Ts2k&J}}o&3wDRM#mX#;crR68HGCozFy9Ikl5x@`5WZO!cxdm+o!tLL@g9ce9&M87Wl`6f z_S*k_2LjR-khSy;cL6Ng-1HjJ1s09v^OYL$XQxNqe!nk!^F5_UZFHGTv?h#~F-9fi zXc5LXrkHMXtXp--JxXKMC?hQ_>Urs%3GLH{ zh{#BZGQa9p=-b_;9qfn0&Vx*6aKenOG&;?@OWTb6i%PGy&Di~q7w%RA2LJ0Tuv;UI zQYjkW(d9C|f7C@331mWxRZ&(Bvc};_oSwE))vg9~QqO74TP~4rQxDNlDnp)CykzaX z5URQP5s>q)Su~|aMM_lxaHkX%x|SX~Im-0z+XJ?~fctRq2yJBr??@bebOk_2sY|re zc+m-esx`Kz%eUpN_hKAJXb73)v~v)8wVeJ!O;4X+(h+6_nh2UJnQgG;vhU1@*H=L%FSX#Q2@8M*?j64TK?=^>^n(Tb8YY^qbmfXX?>totcGdxX&f*jl z(Y$t{^<424rQxek?LXlOpmw2IG9xD08b}>A70tw45l< zvwiWfsG3)|ySXxYQ|y z#90@A4fU^RAq5@Mcc+%bKL746d)`_Sr6`r{JP<{v%NdV&JB)!`Ktu?GZ~j3iG+4~F`B;dV_2#=GW$qxS9+Jl%s}sA8q4A1qYs0tW|B z5@g%|I2qS!4KWiEr2?}{6{^>O>g}8eVKwagMNF1{YU4fke5+_v4|xItZGJ0O$#EJ zC@}v(g5Qhwtp%W2o$FH}&b#US`~NY^^YX1Ydv|l6aWW&Sl(S!S@xKNLId)yoIAh&8 zj0D|8xt2E8x<6aiaxYWO(>(BrTMC7BWe^u#F(YDd*!xvEJyA%Df?ay3qQnPHu#_9| z#tjj!(z04+7qV3a-F57;D!x{3Tpc{EKq((ZNRW5KD&%k$H2<1Bz9b}Qws2mgk=u`#F zf+x(W&hljTU1(yGC(BDw64d`5=tnk=L=$*BpbNam*HWY@UkjYLGc>o7 zB;#>AyW86K?%Yoopqr|Og|O*yI3pXj?z~XNjW4q$P+f=?7+dkP=Hs3}OfRbj_GqU$ z-}zV_PBYifEE=7;;7Hp#b!WcQFuF&jwkYLq)MC;YG_~1&4+&{|pZuhuq6%cY2t4S{&p-X_WA^seemz>bv9>?odTSN3T%j@~>T;W`2u`cf4y7O0 zCrW#Hd(B>J{uwtjfBfLyPUQ11MdAxasyuNc^y zRv=nwZD(h(8#Z~od~Ddx2m_N@vVG^(c6)upy>le$eR;0vbpT0A7x2VwJY@Wm&n}cj zIsgM0p9YG9B~S-J(CuvqX%+x`TowM z7X+9i>dvAOaro`|2Uoy$U)-1*H?IKXk+HE)c3Q1*DV3U+grCtu-1yf_nhVPi0A1S1 z`4wvX$P5Qk9#gaw^O=p6UB=oOO04?|L86jbW1EZfx|(5}(}v?FFQ#LVf^YPDbvJRC zu~D-O_Zq8=OldW#L_R}gNy*2;l7Wy!9M&?~59(Xg@Ddy?dvxtk4?BfOH9aa^)z-}z zDtPYo)FxCN74pAWR6Ckl*Ussd0i7{oWC{)%8&p_WZvp4do!AzKd-*iHQ5C>Hhe4^J zXVYJxQ2^!cjKzhNr1JlRYRzb&e_9PX*rGHurJ?a$xjh@rZCmJR~TY~PsA)K(Ex&c_u}yScmVxU^f@S>xV4SsL;aMM_Fq z?yuMv4X2>RSCCZP67OzD`AR5rj(%5F#gxYOJhE@&xAxu_)&|~|O=*~#rXi39j`)E33=H*!EfT;%C8t)IVZGyu z?09{DINbE3k?{rh3SJ9e)9_BS0=tao!m@+{taCb@!qWN?U>W1F!WY9P8I?KvBk5$P zVyHq_%+WGi9?Nwx$Tlv#HXRzP!+uZOfkT6WX{ABnPWQfwsHl-s2^c+2d_dCva?CP9 z{4)3cHfEurss7g3UHwL=Pa-&cc(Z)wp~#weRyUd&0#<<%K|On)szHnN+6f6K^0M-? z)YO#j>}~u!dWlSih^I8>{VjX&QJUP!&d#*23u_`;uNV9q8*=3Xv<^X3R9OI9 zY3>-5A=O|uWCIMuX}q>*kTbYrOylzU(Ig26+rMQ4k#`D$xco9+EZ&j_ZSpo+YzEf906c#qXU|B!W&qQyOqv!b>?l-ipH8jDJd-R7vbX;onJDR#v6U zrCqN5WyPXfid~F2mbJD2FG*9M$Kf}FV=IyWCiM20RI%3eDrT)M?XTg1t^fYtJEKrV z$$bb^Cl}1H<{0z?Nf6u-3>3L>GDDX1AjWYNq4M|nrrFS&Z;Hgs!?|qUZn(h`sZN9K z=4~!!{EWExy!sG0hH4hG=vyr9UAM)mc}8PMa=E=85y@Icp|NPlLI?Fv>Mckrgt384 z7F|XUg!fk}1Pkn(688*8$Uq8k_%O|Rvv!Knd2{LU)lFS+m{%nE3+w$n=qe8))es+) zm!@NTIl5)lu!19m#Q6(R&*VtPHSjckX|YzP#@epbL*hb9bKNGiuf)0paS*{$Al91e z`(5kxd4)bd6xp-^_9S>*AM#@T%FNt_U$jN@?(;KmaF{BX7 z@Amy{Krlx+5a$m?HF!nv>8z0-x2w?18kpZmNtf^=WDfkMcG6`4VWqtC6H5~ChHaC> zvRF9hlK7YYKovrBiSRVTuOvUWcFGWi?PIIm)Ct@t95dOt66*hcb zf;HnirZ`9%$n<1r&mCUR25uNl{hXiBPVngb>f%q}z6S+FsgzWK#76RD7T)7)^soQa zQqr7P3Avnym#MZNV9S>4co>RE&sR7w#XqSlw_0Dj@}9>KabQNz|Ewq@FcqLzr6>Y6 zAaLRRRffGZge$8~0V;yM$`8ijvv+`OreE&Pj{2*@_d3s-R%lx%v4NkG#fN zdZT)+f1c3Mb{@7 zetnu1d=onzG+}8x?se9ueGdXgxyp?-Sla%bHY>?gd9h zy{8meOlRs-mn{glG3sDNKq1EgyeHc6=U)HYddW>HI1{6VL$)JC*xou)dznHcC3W{! zjEEBJwrmB77=p1v3c7!uFppR6-(2S70bY{g0rT736HmPq{m6FH%rQznjgGg20XDEm z62(W??}o8@X<_{brY6%h`y7O7tLb>~>u|$-qmVT92M(GW4^Gj9)%R=xNV8*V!fyPv`$ z$}<+FBI^^I=&;!xVQ5`?rcjiS=X9744k#WlTh<79t>MJ5)EP%wpA zUL0kI1)-_mb<$yGPfVSpIbgCeo?oLZWPyhF{r$74&gJ(OR?$dIm9>L|POroH$vr^V z;iAHbysw#J9589-R*6ENo*Yj(=X@y(TS=8oozxG6G_*6c|3|S;1QRz|)Ycz8M2U`a zWK}WTZyrmZm9#;c_AO0_HNWGUGJK#01eT`1dSpaFLW2%UE(CU>(jauJj=06$a)HM! z>1JIU+pEVeEqe3ly9xB*NSTq`+hr zf}W!O_B3SA_2W})EJKw+bDSEhH0`e)Hy#@5QS;F{n<@=D;E*BEIQ*bd)#IDt*Q#)M z8K$N}%C{OmaK5)iqq;!szK7;!5%T35llEAJI-RduwOsnrDHIu8zNH!U^WACqz&1&W zTtKys_?(-cL9NBWd`Ez@<IP5YfNCdOZzKN=Kh0gKm*&5GtVe{6DMrj(LN=d?kwWUBh8vgmBiL_Omm|cc=b7_> z&9^Dth!+0yl^LrvS)x)U46+`-)#%m`G@Xm%*T*j-gXC8?x;lJe6MnWgIJnVvjXF~0 zcoj89`KQ00ekm$s^Ix=_Wp~AKR4(S*;sM4lE}b-o`d&=nqXYJYX3@~%*pXD|0F#*h zEB7uVr^8Bm&#;UQfs!&$zL5D_6nv;htwrm9>|D*v<|iP*=SOitpFq4hp^V8U?dS|n zTNZZZiFa&c(3Q-{3z3jFq3f04 z^_`@-+5K2=kx^p@V5Rkr$M-gV{Q@9g2s|G9BEIXa3y$Y8Etg$Eu)HT9tjCsrRL ztct>bT?a}!y03lLec^_T=|WeDc~hky5d;!)kkb6#FUm0L9Ky2Glc-{>PhWz)w2HbJ zMeJ=uge6027Pz;Ou>v&_<>wOXIO6d5cN9a1ycK=di2^4}@Bq-Us`}@?|K#Q6Gb|*& zsH?Wp?4DA#d(nqgP#@l;VDIz9kd5U;csF(E(5$ zZq#riBBTmKsDE)x+96YEbmnxkSN;i+Cb524J-tCkgg!nySu3EUk0RsYS@tA!U)m zCmmj+j9yQn&C^4H^)`OT;C=_R(J;mP{@m&NAOf_cL^*W0M>bIlJ$yZfkuWovPXi=e zT(IE-K|-j%ckhbLD<52bMHZAo$O#ay_OqEFQ&W95tpz12GM)tb$zn?PAtEw)wwk4R zQ*n$?B4+=#Xy30Ne2=Xzzt6FoX_FDenE*?)k3K;2ztwXVkqV!WX)5;1A6Jyr9pQ|1 zD6|^h^`sJ$2H`~(P-iO72MW777))`JHeP&37ME5|)ED8$xKB23FZCP@i4>3^Szjd( zRlL0LG?N1oXxG;PhTQfGOkq?N4mFjIg8r)ZZ%8!~?T8`>l=I2>qRkL&SyvhOzny1O zV&=>Lyk-7J(p5%9*>zF68$=q!Ap}H3x{>ZiI)@JF4nd@I=q~A!k`4)J5Rh)^ZV(Xo zF7Nk~wOI4a+~?kN&pCUay;V#c{p_Q&3}ZW9B})HoK@bhbrk1}i)X6&~$#o#n&~SgX zQN51$3FfyNS=Xr{E0fDOX#bd%+5S6~#Mjgp@%8Hw4tLjIi&Nv2CTH;CrjD?%9;%ql zqJf^AiV8#(qH6QjZwYz8=Y$O_QyL=6MuHM~SQ><3j^G~CwdSJyVMYFM>vh1_+&k`% zb9L+3FN|un9QiX6E{_|=rklbL!$jC`Fiv$ZW?HayIEY_TL>tv>0q+Q1DQf3g-Ss{t z8sZ3itS?X*qPJN3nU^=)7yC0YAQ!52nqtzU;s)joqtR}FrIM@6v-Hj7Qzx5?`czJN zD}@+$|Imo(M2`&65d}h$_%ZISS68~Jb12@&KaN?+<>?>Y-y|fM2uZZT*(XQrW{(08 zFd)B>YHP;J`nKc702oXqjY(Nq3BP|Z;-jNZ8^H?0{%Cxpcm@7R2 zUycU*vG;9ajn3nws0$dw&nhsG18Kf)t{?||Ej1xYr5BqdeLJp;_SK>qmNiyZVy&d$ zq~k30?zoFYMQ)pJtU|UwM;rhawy7D@LrfomEkN{b%?@Gl;u0cXL=fa5GZW zwc*$0n#vcw81+87IU1v9%c-MAh6TlSLGTINB1Gg5g0^3T_569uHD%jrT+e1c`>kq( zkqry6Xfk)^x2?{^#FTcm+X#we6q&3=(aP{Uik$wzD|Y{7)ugJW&Q*Ag^k5uPc?j9P zVs`F6pZ1*gQ=}+is+r=zrk6+9Wquoq^|p}___kAEsiqiyg4h`@vb+o0JxsdEv|vqX z2y!0f?S;f3y6uwiP~s%9YNLx-X?IwCDWGe7xe_JPeAo1+nkN`8&a$Vq@#*sj@sPkg zz2RtP_b_QTz`8qn)#9YT!qVY2UmJ?i;B}eQr=TAqPS_-d_N@;~Gc%Ndk<^H(-<2A; zWX+0?56@g~TP(E}PbzxZ>E%<9YO0!EzO!Y(4;xpV5i#~Nj%hvP7T%5h*kHF~dyHmZ zJhx$EXrI^Jkw6N)d#4ck>XcV(BzZ8Cx49lY}=h|ULf zZ2fDYa5;iSr7pona%<3+x6h|ogeU{sIYX_UE9cSQ^~X$oAr{C84VqVXQIO)k(5J$1 zp~-Ej)9?4du8}xOtxU;MdIOU$4DBQ2x2welg6|CJGb?}L5P5FoI+_s@(JP{2daTOCI4Gk}1SB~)c*GtXojmYETf&aSl zk^{0meeG?zFq;dD_$S@R&mH(Od)6Jz{i|c6qZNVk8CMH-@{p*a8!>AUp@htu3;${3 z5@_19)MSh&$tu;TalY2CtgsS%pLz?Q*8&Nrtzo$&`52M$0v$^=d_I5VSqvRoy*o^v zKGrO?vXbW1BXDm|7URr0>;U@EW#2G9Hx4eMcBEhGdOEkm<)rVtnuj~aJkjz*9A#w8 zr$f4Zpb9BS6X`koeAQZ!dwbSk%6)&j;!d$eQiaHoj{*}p?MZmkwWusb5MDema3?z1T)H(t8wSr@P+4@R1X3@U_C{KIc)=A`&L>AdVeQ3 zt&NK~891n_<}-G+I^MSd>YT4REB3u&{M0^vG}x!QWEx__ehEHBMDM zZ(J+J(v&0ZXcRZN3+Z!Q)|z0ha*zj$BvT?WzkGo@c(z<}<)5$d(NGaH-dts9$n`iI z76!)o&EIv>^0JZw9`57%O}V5Xv9;Cfqil98uqVDr(`xE^QIu*=KkX|6lPGl!WYN_F z=doVn1`D_Sm8DQ(V&Xs7cft=RlUDIr9{-Rl+aB1bs}@2bKG!cKSc~FaIn!rVb(K2& zdTq-~%#Jd?4Bt87Pa!hz8fq&V*mD_Fp~?`bXhaz?MhfG-ABsFlqyr)-;Y;@2`>y%> zUOHkU`!9yJf2=#MJIp)sKADAGEaHb?%OtT~aPYbsqH0XJ-8B1b>(Zk2*95W1>{7%+ zUJS8Aw}SRXWHmx1)*%S!&}TElNLy#NtHJyAr0he zwpbkMhXqX<|6s$i<>Jpn^Yj0d`ffWuJ2_;^T2$pXC7EZ#(11nuuzb~*KY0zD`eNU; z+=n>dVj&`a-r6#km5Xq<8m>f-2LVp;tJ(KhGhRVLNLEg5n`yF`z?yPU_`^Lla%IPM zmarMM%ZUey<_91NdbM;}jWofFEhva*brKtJvHxK>*^m`*+Y;sPd~krP(dN0bR%}eK ziKq%ujq{T`b=SIM?*39#E&`B|Idb^p#HUj4g@>f4$gh};nLYM-%3MNCebN58wzfe{ zZLLEKrJ(Vfn7%K-_Q@pf7biA5l{{@0O`@u_yN>&|p$KgAg4e={GdMTjiVxv2{W4=z zPz$7?!@6%HU8sPB@2_VHxD~SWYDk}71O_ zQLgpVr%$MjKv(MSOy0C9-kCX`n-307&-VL6_i%gdZMA~z*sH~&XeJ>nD~nOQH1Vml za62o*W$-P9?=S%B8^35UPuDn_zAl@YI#~Pzg9s=x1g2!AY&*3$@KA>4Aq5BImG%&# zyC~#0HpYs6E~1ZQ65m%H=2cuXp|pay0%Q^R7*c2`@4qGxmF7*%kwQqYfR1!n?|N!U2uigj%lg|; z!52cHl|v_{4w` z#YJ0H{^H_z2!7GzKu5L*`lq)qB_Fti8A1xh5$3Fye3>=zK+FXC=c*+M|3A0By_C@4 zDO3b~qK&OTrylL@moQ@ztqLwcSj{fAvuwQS{jmI}hB|BPWbJeD!o*2E>lLM_hK3$1 z1CYBTd1o=2pWm${K>TtQmj(?%LIOD<@%m+|G(lAFL{>07C8d5HM*~3&!>`|U*K2P4 zVUngCT;Er5k?`TQiO{9ied7Q6c^74GGS3|SuI4M(92}JG9~%>ciMuT26cj`$vjvTq z_a3>dI?TRe8SXp!mcPqK6+<4uLWomDzEM--tM!_gMHADl<+YfAn~R1NH#iA3cvwJ= z&PoZHecKid0y?;&`1)NnKuXzb2+yks>YskQ@!({L#EJXH;n^hETRpGPi+$jGp22Ma{##urJU? zcW=2KH-$jMT3da%e%rEVn-S6n97Oy|EVc5`vp;j5Jhgj8_;H1@rDrgF&`i{Sb)1uv z+z*h&anCp6{eRjw9I^$sw~d8~n?Nl*c`tvPf+iYRBcwoMfZ08WghJWBjP29Lxx|Mu z$k3}n&2C6|8~}|Wha9B_V(dQK`ALgKk|k-UL{U{0Lsl|eICXA({*cS1JEv??NluP@ z+>(XTo`4QWRWw)Tzp`%b;f&KX#|fe3_|2_STg{c(&?%Di8r+X{;xK6zMfTMBSMSgG zG8-3JkyJp{rz-PBnk9I0O{9~CC@k+>xUKl;@rVT?+GAcH`yp1!K00QxRqr-2QCTk` z=FNf}durFA)0$gLaWPANxuGNOfZfdch35%s;Nn%;3Ot+DL{GMcx&}VZm#g845%ukx zdwuW79FX{!n4kiPzfsVBaPZEe3x3evw{yv!yC}==R?zkF+P_FCovUT1{=>@p8Fg0Q zyasvfM&|Wax*%OQWE#&on*Gz<8bJX|TB4=_h z$x1zVU*^oC^-+9yOxMT+Y z3rzaVp!o07qSiw2W~M`Ew7QQ{Qqh1I-hYRmH2KJBL7euK(`lD$pQ|O2AO=&Lb(G}p zA_Grj5(F`ET9x;?(uLxjGBhOg6ww42!C~V0;$6G=z|kmH*7d_HbS;*oiw!AwXhdY} z0D})FRb#$YuvHPO0=H&aVjuzo;NHmY%7iV!HuD(sc6IoKb8U>!EYq^+U#QTesw+PO zsO<|hS{TH*0eA-;7MF&PSak`h>$nr-vmQsLjOc}e=13M&z`zh;2M_x+k zjev_%N-_k0Njio|aa#_FNCNM#u`Lq9REe-vh`hq_%ZcR* z2@Up7^~6;`2A#K0R>QJ>Uf>O=$#Q(Tho`ZLhrRo!Pv3{#m<@>PvJ~;xyhXy&Ki;ir zSg^HhPRhD#C$C!K{t|P0ecbmGTlen|i5d8y82-JTb1u6|5K!irQI`5QzC+45m#9sj zY6$OMWYHN;u4&tzHJ78)5Iq73+3*M(*}KaY`=u>~u|>B9U-=BS@EYI}v`2Pz(_Lk? z`>*%PNhFWaq*j|P(q-q>(6$6YuM25;A)p({GU;ED$1s4)THNF*aL7cXFteX?0_L`cq zJOt~1Y#(LQnah$bX$!P86Wm>3`-|+K7L!-d3!-Pm;vkSA* z*x62S>Yh0URx!=%=l>j#PJG``db>A{y$Cl)`+rnHYg|+WM%L_NIadPWDzpSRZ|%GO z-jzFVDeAQQT<&)K>plKE({aR*wJWt_Bbl?%PfiMx**5%6xyFovK&<^0sK+$Na57+>z<@^~(2!5Xeik3Zb_0wLnhIAmi%Vfn>NdNVd+ z+NkU<`V7oN5exfUXG8X84}k?2Z&+`JN{WE&OVMOvlFn|4^g_!$i9yx#^rb9=p{>xj zPl3o&IxjT$Gvm?yPq|7@Z-o5?&(imr9YR=AWbkAXyNuO zZw}}-F3Mrc&R%rl&h}wP41siPIPm$M4KlyE#v5)AWDF1LdJ&96smNh6D#s0$F6$ji zuqacaNzVy>hRcMEc>cJr69tIe+1X=2kI%m2{-{OKu+?@dNBCh^#qYYs@SB^0LgD&c zt6`gQTfb)NU@3;5|FNOR(alU8(i&p+n76T<4W{d*YcVN$iZ8Onq~p9@B$Z%N3NJ;^ z(-CAN%C%D0#4$1*k<={Lsve7qf5R--v|8@$_jh8yYV@H`I18$L3CDW-Beh(=_6L^P zCCXVW9SUycA8LPpSjfW#ni*Zen=HRAtLJotGRxlEl;SG#?z_igfVjXIjymijL&(3I znwD&Yizj^@i6J99WO=Zj4W$*8km!9**caVGv6`fNWOCZI3C0|9O3gJ!+99|y1SKTD zvO}o-f)|cG;L>RXxr`5HBZ6Zn2EN60$3c1Xoou^;b^{I`H*)tI^;kI+igI&bRMghR zyg)-32^M_}54Yf(UkI_aFMgcT5WXe-*m??~qx-_a-9RI=r8>K?0sgN$7i89&0x-%CLXvssbiO~c2u=?S2Qdmp2Usq^Ou#? zVipYr1Q-+ZrtDm@z5aQ$d>DZco(C>9!Jj6Ek1o_wfHj6E{xh1?J#1)AOTgmjJyql5 zBjd4Qc(2LZM9ph5Pc$ql_Sj@la54LNFn^Kgm8)$0J3%NJMb$fd3YcV2#ypxltF3?7 zgoUV1BBGNM?8{VDMIWfLEBB!m7S4Zvce6hHU5_Ca`qy7OdiHSNxYazQ)!^kz?{9kK zbN!Wp$5NVeOz@hCd)WiEGuRZD|KA2CYjf!Iw5GTyO~Kcl6ZcqEqVv3`Wf6JLLTuXq zD>sr_I7^FV+9u}wTQ{yDAqLV|rr_hywV&&PFR*!W`149it=2CdY_o6?m(Qi5&sxtW zbQe9=DYfvPo8JgXkq6@K9qiB$-~bJ%w4|i;=fh6g;G9u-;Nh`5vw0Q4;~@ozvncvG zuH8K=pnLwCi>u9L?pedh&wV9_{seSet&V|&!{w!{lG3-9J0e>nx?M3o^bboHcs}1WZvDy-wGyH{sAM~61=XNpIeR6i z%F=ffvM!|4gwwvFlc3G&OwYWp$#1KLWXV3eN8f%dUG5f`9K zUJpx8?kh|qJ1=}HkFSNHD4OYst$_%t;S=xdDrfLBD?$B)SXv4uouLy!GXAOD?xUSx zd|dxJpZY$dVZ|@)U#s3cKc51@9QKBa!E(&icN|6DOZGI~d7i7#m!nOqsL$VM5`B3$ zDwOUapvXepU9YiR?tO5y@wv$MrEbTYxXjFvK5D=IF3>2j%RJ4O%$k^<<2*iW5GFfMUrBJdqvTf0w(K7k<37#o z7n|xI7@=o)lRm`S9#+6St(=m64&D3&FI-iz)OEJW>{VKGi;*HM7HGt&DrghvCbY8~GHDv^4DWIJ0-u zHSe;d?EP?nIXp9KTWX9@stkCiciiBl?ADr(LI}cuG34DwXPNyWD-xSjUpb=dJcoaXj4l=Pf-qgwAq->Iu7RC_v85=S&a+tI^I zRn^r$^&S2RANshNuVfBeck}17-8q>wA5D=E6GIgGsA;Z$(ME-3F-(M8Y)xmWu`=7;?nf-35kiqB%$IccJr;9gSz(Z5!;6U7(fOq4YAfV zw-cjcdiHGd?>#(g#|1s{Ykdh%;-#s;}PqzW8vOsPXt9z$=1Kx;6mY~^qOXR7G zubXSd1S+1qGZPF<%)2^NS~M%s{)q_!6kJlDDdwtnzJHTewYcr)GyZ@Y(3ttU-j&gu zBwwoBY3G}0xprFsCTnAG@K55JjL{FMxRg$nGy7o9HU$a}6CUA;Bn=;o<*nrj%^C3T zfe`pE<`Mu`0wCSaWmn3(ziyTN#{VGf`S~EzVB_uBD8XEIMuz zKY!M7yP53l*sNE$ZT$4*`BC*}z+ZLs^#INDtA95(Fz_QivDQJPqsEz=^LK~i+%xXe zA9ruqpq9^ct@m*m3C7j2fye#jDihT`D8*n@D7~|}-F^Zl8~q<%kK zKc6Ow8JcANIeRoMK|Ao5zlDU~?_YXiVxqe*m(5lih@hCuzQ??>vJsZHmO?aS*uXop zwH4`;;lsa%fA`c%2yA8(qT4NC$w3#5B=}XA{eP>C%~cj9LerTvKYu@(5}qf`Li~~l z+oZa`!*wtTos--~spSAh?)mV=A8dXR8#(?7zj;f`9h6X7F)1vQr8F|XfBD(9CR2QH zo1jYPcbxr|o9%l$z+klrKY0oA+0d|KpBHASS^|>3VuEfhzQWGsky&vK035&YQoNQu ztMkN6qVl{c;67i(e1venNgq{w^m{%!!GT>hBjzZBf82hF-mvV%pdWx&;CWM9G7hxeQXw3^0E2Nq(f;7ATpq9D*B&~XO@-kWg^6!ZM-SXY)g}evM7BMV}WSN=n{qQy;bkPd6eEZ=XGP8XBuI9@)F} zbrY_%+GQ&H7buYBeXBv`wVM5#lXKmf&jP!Y%tOc1Oae3lVX}pI!|eJXI;70LHVCBw z!9td4uEl59-E2P#KVv0!^%kS!@8 zH(sTI9D4+XiD^jXS$#}~ln(4`O{wsjWn{#g#w3eue{4(_%_Jg2KIrVPA?(kQ0#O4L z041dAx90+d>K~V8hvvmQU$n9XM0{-NSySM0J9u}U?LE8}l6|=wNm`Zde-z`nzhuGq znmMney8eSVZF8k*!$L_h)Ar}K(l zz-E2@*Ek`j9kFk3G-ou3Wa!j@jVLJh6J?F-bytd6Uf&OF{roAs;&PtZdNI)fP^qBz zYX;h>1^Xz#ygd(waMW`B@!#oK3|#E`r4YMYSEJ4PDN+E6u(r0)@GIH>AWtcyYMn3u zj;8ZJkLY#k%xIuN1FAiRR%n4D0#p{mDR2D&aZ*#rdo;OW@$s(1`H|XBp_P7oKNzpT zTNetN#f|%;As&C@EZ|7EO*ZP?iq_-A1p=D0WhPR<0h4|cl)Dc;Z)j6I={4$st1=OC z%hHbov7*IhkGYAs7=hcxak}0wdj9Lr$_-npXTIWsB+9&&-Q>6O!{5$s!3~wzc<+JY zYSV{Wvvc#j@nT+{q5qmF|5yd^u-IK@9Z;~T#94^>jjF!b?`T0W18JPbk)Io!9T#Qm zxXlRq4^spml0V@HTg9dhb{s{XK78N2M;QwZje%G7fU#b1U`F`c$0m*&ko^U#Z`!HTQsc?5= zYct1^Ntox_D~ZJrxibO8gzU-PR>9TlmjG_uU>oTEZ*6eIRYWE^y4LXAS|~T+7}u6a zIk@|PW6({PnsJB?ivowgiFZ!VYi>kv$)^#)#16$ zYI*EQ|0oEI%OO-s2Z_p>?lFpHW~BZPlcqi=KRDo+?h@}0K~d2G2o|J%v59Xgm40|8HlH z`kTGoh<%ghlBBmLE80|07q86?r28!S=0 zx86eXPkC0%`&!iIF*ThuDjZs3i<)1CED^BYd_GUqt%H=67wYbR`b}QFw?O+NGt6Q8WCYBqL)r zza9&5Q7{$Jcn0tPoZOl#c7j9Aapvh2xd{VUTH;GD1)nQZc%JP{XsUGnw;YEy8kvT+ z^B;Hqt@l^LCuhttYfijRe137NJVyI_Zje>fiNf?>|Yp{$~bqa_2bC8diZYhZey)4sJG!Ef(T824En7 zqku>OEcwQr7z_+7wM(Z=ZxPeRg?g&A_ZB}VB665D4!OU&NjA7$owG17{yn?)x7EJY zp8HhXq#;&1O<)nk@rSeIzQ4z1$1WX2VkwH>Y}Gf1k><1! zvE!CU>I}C%M+&zc$N>(yto4jsP7B=}os9SlHZiN-&t~9}Vo(JD%|vX@{r%@GDUX>! zl&(+Zo~nUL7+g<0`oAA=;d!f0%_4B|QvU%e+fj*?`HUDL@>yM!4SorlrJIQ8t#yv> z?>3%2spsnZSvPRR#>YpEZRbu>=aiSP`0KN}o9C?_N$?QRQsDdM6Yb;ao@_kwdRb^8-(gr+%L3nHIVVST?T^aKMu3fhbFJ8 zhBl3s|Iu-9*0U9R!I5)M6-H&!aM;h)NF3sDUYaq62Nv$CV^c`0h`x9b`DDb?a}xKm ze_-@Qd$Rd>C`_C^E{ClH4iWIL#PjjrW!Qj>^<%4Y4Kin<$-o3%O3Z-$Y;PcD=b95< z3`3}RzK1|1C4qFq!_>@ilsFqvVRZ>|$Wk=?SAyL!bP3veYTqmEYzAEPlUYihHv7^t z)Edu8NrYUyHHT2JGqFZ!s8;wV*;c6v6n9TMM8Ugn^}pL6B5v z^h0P4>emD7i1mOVl}R<5@gH%}3>koiuSW}K0bx-#B3e9*Jfob_y@ur#U(ZZzF{O{} z!<~VkiQ?XnNc9ESNR#q(jnZ0WeiGr1znSZYrtCF5)V% z34{pH*pl*=`pFZ@St5Ss?b>vV`MGePZ%rBK8F%OW_>6V~fHyHqYn_wohS{bgQl6!? zcj+Ut8X6jDMyjuX$Q-nND5`QFN$f?qtgKf-+;^P{P$HBThr$ME!IqCk<*n6KqzClf ziXKzPytrad<8}sHH-10=PGl(4H#Y+vsFXs`(q?CA>D7hL-xj`f5Oi)AIm3HQvB(5c z#AySBSBvuV5sMb4Y~1^o(wVy1&_cQe!{N=$%+x=8P*YRuPCnlz1T(0v)M#z%>f$O8 zs+gA%1Y#jrKh`fN=H{XyLn()_l@JlE^-oGf?sDEX;qO0uc;0NE@{FMcJ`K2qNut8@ z9C9H!UhAvL5KRVAE6{u*i0IYD>lJ#bWk!Nhn&+@%tj4=HYwEdQKZAz^FGFybu)VNE zM27JtRGgNGn8;xQoq-@s($dlvl7>&clpGVElKKd&1%Giy<#lz{h1k0Paccg>uHju; z3WlOo>Rnz0+XpwdXNq9SyyuB6V`6v2Pwx%vwHIT@60cqNY3ST^$=hvq-p|}WYBnP- zlb6y3l_DHh&#&LzxVV>Jv@e(V-5UD3!wcj}s5lsF`HwVT9ii%kaN zS&RcnLrE-j1Yv-7_PBj^EHNfF!_oDFra8+VPN6{6iqk^r*5l7O39)t|m=Rgbuzdmm zEs11gKdKUG{Ggu&$tD$xr{_*)CMvYm5HMu8n86-3i%9G~Ph7^CAzR>ee@`fZFQGE4RU43YNlqf@#*$W9K+bZFh!*&% z&Z#yGHnl43y`zW~#`?lG>J zCU)}@mK-nk#8+@Ju3cbLM+Aftv|yZ_S6^48X|OSgm3fU3V1<;*&->xZxyVbP;c1tg zfFkrtP`V#W|4`DDHm{JN3C_OCrXd{5-VUy&##sk6dw|(<+rvXs25VXxS;^eDfa1!p zWo1|0JYgy5Zwpml4Gs;xdVMJ6>q}W$IaaQItypP#d~7ty_k~j{6*1KT;9_#mUa59P5~rb3*jMEIJ=1W1-BERA|4a`a zc-?SmcVj-sJW5=~lMIz|Z$E zOTq+dzPx|yCK!|XrL>?A9zuW)QGuT1i1rg><`9NUzI9n=?)msl__(8kH^{8^{Fb?j z&Fq2^BLZU$?&Q6yEJo3!jCKcmUiA)6LAQcW3|st^teU>Q3PJwArrC^1TmDVv3_H z4lR#yqRNnTJHwfETr2W6Sdv47jw}X@_S8V~j>Ux|3$1p76`2xg$#9NqwyR%)k{&8! zZqy5h;pDV?a0Xh=@0^XGKHA#827{0MgrUYHpu-Jlo7uixQTfqA;aA_ez(5vJ&wWp0 zp+#Rnk&gzv?T~zrYm5TAy`um4NB`;Kh3dXB97?QqtIR2J|ZvzX&;M>d?q`x#^g8M zir@Bg?>mpBChMpqj9xe&194e!5dg$#io-{Unl&WT1N?gPYsON5NN#Lw{5dyMG0^;Z z_G}3MUf-i_ISaOm7%T$kBKTV0J`MtG8jBZNQ>A(2ja9~}NJncwJTFPH=X=MtV`)S8 zYbtE$P?8(VHoE<#1|TH|zW9{l7sU3!P2I{(JK1!gHm+|_gc#8qSXfXn^X21Q{V`Sm z8d|8+ymVcCgG636;~r~t^^!AAl?Vqh;FYYodQUWQ6E4uf?D;1Jxf*GNv*8g@@IWkP z__NcTRJj`77sddSP9g!#V0eQ!`I6B+hfZJ@&P*h;z8--pBcba&L6PQ5OiKs6Q)OP@pA#%s$;)@=kS8%NYrV z$xdusPtGrje=Cbf`blrgj9GnlM6GQcSNew z%J}*U;v|30SQO~WWs8$e0cUXVE_r->S`tEG{x=i|=;ND=GisJasWUarv=L~-fT49S z7~{%NM5R2;L_*A6!pkOR&yu}0#A#q&9T|Opge=<{$XKWmvhJv^F#@?&$p6kC+Qi@Y zEUNeW3o^pCNRjVNj?Gy~oZMKdOEQB74wG2Ted#)Juh|En2>LU>Tr-tv-~vBQSxfXM zv|e0p6hLI8Ya#*V(WDv-SJ%)TI?f()Z494eCnXX8R7jC#BruoLr@SA$jmu7!0-+*K z8ails{qMe(-4t$2V#ReG{QM_+DcE8IF zV>FUV$asF$3DDy>AiV8lyU3a&S%TC6FX=!U8aZ|tgb)KIOp>-Z9CrFXNWOb)`lq@7 zN|srdxD(&8=?))^5y0HQ-W)_+=L;1n=U+ci^LNR9h&aTI*)qO*wONpCKr+apoUl|! zI0l)W^hG8+9oC7IFn!NRG+)Gv2YS$uc&O)OK}H&5T8k+tXrOyrzb>od`ee_26BoXPFRg*OoAHV1!Lw(~R`yo8UcYDnrXtHiEV1xe zL#`Q&&+<+fl#d_2^D|`5v>F`p(J7?hp}^wW3vX5``^KRlK_nrIiCL{v@kp)*?dpM7 zpwT7&QWe|3>>&cuy+qj;;j~;fI&|mv*UM%%6Px`ti?uH~sizN>Ln~kELV?I!9?dtG z0fJ@kYszTeD=qMBjIU(|S3Qa6sGsZHU5epgEQd*h+}cT}?#PqxeT0-^tetedTM%nr!`SU+!WpD ziL9XzLANE+X%|Yt$+acQ7fk(cLg(~H1@}}AEi1xdK_ezF_=lv}6WN&qp1`Vi5L#JP zdd~{~s*|A3M-Eu?HXWFhv~|;MhJ4Tfq)a3+cqAHr{)O_2mEJq^`a-c!!88*Si;>;- zAQ#AGELlo3a_6A{kPbHLiPsWIs-lT@QU~XoONEgj6q@i<3Tg8ZI6&(WttR>x6%h1JN))Fdm_ngdh zeVVQgh%->8sYy9@pWl{Xug9tOkG&CBQSBj+5onJLFA(|Zfc_{KoqlZ}L;hZcNEFY? z&d&7r&Nz5;KU`euj?XM)VL?;ordJ1V=n()kaNe2KWy0K~~>IxWy= z$Q&9V!$AGI9SBi-wMfNaP!*DpcjWNe4wty>i&0Uw7DqIY%LPm!v{Y#GH@(Taw!%4j zv|YTVx)|XfD|2DpyR<}HA#qQX6K_J9hWWiKzK#~uhZGH_Hr!_8)o%-NbaC#>o*`ZT z5L8PxSgSw_qb<|UPN)oGTs^o;q3!k9-ko{RU4bo%r#w}cRt4g>iYjBUsHi5fX4w>R zOy9L^bGYpIr?rlsUJt6lPF8imtxareVckWMTurWy^1rCvd*?OTukeDbzv!pv} zpZmcEqh>D8*mk#lZN5z^ipY9;nTPw=o^&c+nwPp8b^^eO3;e7elj`G*0JQfy7+~;s z)rHUf_9LYtgMMbF&+WJr06PF{z&^P0={a4{*g6K2VzT?&L=($iVAe!CB#Eu{_{BkbLyhfV=b5SCY zk7%ek@~{XB(f}uo{+d>O()cW)DEalWQbzH7mFX&dDKTHl0gsI6QN{KQZrpU+xsqSj z>N0Q5|DrjapGnjI*)jp_jLi0aZhv!e#6WJ%>}=_QN_%A&*DIEYB;_H1agY*T+(w)DWUbWgQ)9j?#}aLpwNh zVJ3wLZzg|G0dE4vVN+#SI?U%4MxCD?0m5O|S&TEvlkDtYmal)iIWH~6z0o(2X zhu^d>ih&3NFtjbp%kn|SnJWS(p~A?*WO7&-4IdOb=$u z#M8s%d$ijv@js*Dq8RNNhg?#4GvXn20zU7hhozl$Zhc9Ck}&2w^I<3;ZQ3q3#);wb zXN(Eo2cd^hymwZc6ynWVEN2nAJ(Fu~X92WQOKVG$o}RFBJ8P&zQcUuJ+u|DATbcLI zk*G+8e*g*reft|fr~6ADeOAe6s_tEj?0Ws8+~Q)!wsS!3fD)8x{5<*wj{sCP;ACZi z!TloDb1(+yHN%Oh|3PM~`gt7WRfV5X94V(4W0_`^l*%(OR|jWT@%qN_{wyq>9@uGE zEi*nLWN*jQPlwV!nq4$j>p2Yc>OSh6d9_KS^_Zw+*gucQAsZ4!jmrQ2J?nKn_O7`= zc8C_skHJJ6kghP`D*+=3FvAfGL2u~$(zo8V>-g4o*63$6;3_#)!o(AN$rz%};Y0Q;0Lf#Luu#?-0QN4f}Bfa_i%k z)NtA<-OzNoTrHNBepzPbM%MZ{d$BcKFw4Yz3XV5)6N;_V$o7sFj+18dz11sJ%5E9)#&Gt*Dm{u}1e$0#PjfeeS2Upr2=AM%hdzn3 zf3YWlm^hN{>1ut4zQ!beV`g(Rn)=RSDRceO4#j}2s{IKrOWA2*MDjz|yZtBkW)q?D zHF0oExp`-&ldS9+*sukL+ApZ8FtOmp*w|bs6{gs`^RO-=b4 zD=d5WDYr;4tO~zdkt-POQ{^tCjwqIvKxU|kpMuNJXQ@eE$OUUm;D#PJEkB&z&W{LF z@#XB{ubR`CEz|#hJGD4~&FXg+qbzXbs`EO-_f{ptW6+rB**54q?;MP|?sBy!UTSY^qH<+vqT~7%7aJ;rL#cC1gHa{PNS~*5UtS>>U+yrwym8YX|~` z{{?iE_mM|d_I!5_>zDG%ycn6c7*FjTKOY~0G^{_N`zM>vZxOHvYRew(UZ=yn&Pg%U zyk`QdcIVTn{}EAqLu!}3kK4ANi8aKK3dPor2?xA2Ma9SNE3UFB^iCRT{{--#W>GPH zX8WpmazCdRpF=cHeu*i~5m#uPY9@8xKz1Q5U`Mngik}mt{LMOni>aEcJLT;Cb@)8X z9pU<6jb1Xk91szrMA$OMJLgYBd^lIC8MfvlK;(kunEO(qQnJJR1)Uf^mky%!mMP4$Q{VP5j_&Ri^nB(9T)y7{J(%OU`)hh=A;aYSgp7eG z@%6(I3Jw`}U{Yn}0JYz(45dScr|uK{*VB{LOBwM24D~4XELmiEL2w^78Nke!qOU&Y z0F+4(=bFEZEix-xaER8*#K!8VhmFI}_gW*v?`(}^Rj&@ZE7i%H>K=_^j~b2oGo@iM zD9rAO@O6NZrTfk2rq@%5`h%e}PKZ3En3VVPQx6Q41Aa9+IvEIFXsm3Bp7%O35%C5v z9;&K!TAF_}=g(-E`B)-Ik1mDqm)j0W3#}a99Pt=FYD@L$b)XaS$N0M=AwGY;Wq!V} zvLfyI`2M@C)laraAqgr$)<#A!PiIy9aqHkbMzluy-+uMu#Iu-tp_#RfE5nD3>F;i2 z`+Hh7mg7OdNQ98MLeCLhq=!&uc+AFr07AJ#+Sh|M;wDJ*F01 zIjM&~R#QdJPXeZ{;gt~HI;W=aC>w#LSv}r^;GrK6k7>bywhSb!IJ{;>4^b2kbRu5Y zk7Rg1I4(LIBE#vOc2ld?=AytAbq{!MKz^MF|;>cI;4N$b=3$Fq13RzGvS*lYyPy=xse@-{N6BN%qa$}l3JR~4gzvfL=Crjc&a$d9<}o*n>j$CR ze?1NitIp2KvX%9edkUk{NjS~r$E24oyrZbt;h*>qcXunbMn8O_c`lR*nv+_<%JFxm zf9lp#dAe{MJ71E9!ICq(XC2qy;OE|V$F#53&j^7KYMeb9@Kr_>u>C{aSF#3}tNa2d zkBn|3chzx<7lQ@b!>OvoXTT|@owOMFv(&KibKmXht?UBI^#MXom!2T~l~jt%#d3^Z z4q7qFPxyQGo)x4zc-Dz$BJ97AZQ(T$(yxD~X}3d9@x9E?fqCS|*yQA1d?`hvp{>Hh z(!DD;U_I&Q$A#@$A#i!23ny^V7Xswx`bP=z0AVVR(dn$DsK$JWZz+t|piN9Zt`e<=knis)!ckx!9&X(E)YX3nZD;evVim|AM;2mcz*7F% z%x7)QJ=ykQbZF2E(<8#A@0&_=JQ6Hve&2`{p&2htn~CFN=}v z28W51YGKp|OIARJ0n9HoM#SY?%iFr@mmyf2ff1}*;_=aA zu$VC)AHSug?^07O!AIX%RQ-zszn_O<|PQD?ztTZXaI%hir}RZxqgd@&E1p zkEO2+i?Zw5rW6naq@_VhX%LV`5MiX{rlh1qx;sXsyQE9$?(UG11}W)ohK7M*csI}Y z{g}fa;^Dim>8gAPqg=su_=O9N5Vj}WA1?D};-gbX;h&nNNo+sZaYXbeU+7Umk1vP1Xu7Bi=G+R|g83Ps8Tw;Gf(mye4QOSRAJ@2hxkK@Jok zuC<$yA@w4X>98Jz2!~H+9zJ}B)uRn}iR~MMGGR(cqt)+mXWnfj9eO#%{%zRMQfr&0 z=PQAhWt&&{;@@W0;r~W-iDhiy1Eqj@WU6q#As;E?0_589|9!Y4y+Xt7>{zV;I61+i z7(3PvmZ_PS33wEg|A0ja`C}(%f2>E}cOEm6faW@6m|^{*@#V|md;^F$xFZqYbzi-b z2YUIk5xT-3RniPRxBzx!*T043TNTXve16hPz^uzPsX5n@@&``zjtbFI%f%rD&gh+nEb?h8`J9AXebx}s~kW?J*#+jcc9G{nWc}SD}APVQz z)}~>c1EsqNTSA%HZme_3vWl{vG0rlC#3c1+T0gi=gb)SxR9^k$r>9lBU$5d6fXB+X zMLc#;mcqRi4aybratTJ=bW;~S?Md4*$}fTBi4wom+6|xMBLj!{8u`$MM`quUHeWrw zzNo0bO2OWqXZ-8mhbn+rbDw+D7JA2a2Wai}CwE1iM*{vKCb2+1SK0XGMNcjh(6M0T zPlBB?Pkv)#%o@tjM-3IVw6I9xw}mS z_ajBFhi#$F5vT~}?yt3T4eKK!jeAAKZg;iHZ`@8<)09L`+#D#^fN-QMOO!B#co6*h zt1apZnU&F6r%)JMg?u=5lDtnHk+%Py6sADf4P9HcHirzlQt7bwp?wM@;elQ>GB z?ajYn*J;f#EuJ}BJEL_teW@n2evqxA9&uS$W-SK{y}Yz(wnlYi^wcQV-$$+1Oe)P+ zH~+;A5k1|>{*my*VMff=j6<){;j+I|IudOwCFIs?G&WaaMatiSu7A?1V388SvX&|$mv z%I>If+cfWZ*Wd+;DseKPhh;)}Qm>Z16D`ZyQf{`kbo1$ZnRf4*knGZ4a?5`o(X2&U;L4SOKINPtWnl#xdt%C1)hS%#XQ zE=?+n50E62xAyI>q{WSV?yp$IKM6P!?Gl)y%Ee>j^qodHxPPXg6Bpd3y8#pLw!sn{pwoAnulUD3B>^a)yjr4O+rQ4(R^Xiec1HMrsd1aE7oJeb8itXlltW?D4f* z?x{|`opjz4j+4vkymp|Bx_84E9kN(8pq)Pc>j++irHe;f7C?*xsGF}| z-KJtph+qSyGst*Q{qzwC)A#xMmS(3OMXRM{Dg&!@N(+kunm5Omuv^$5m*YJ;KF~KM zaOyn3$)5WABOEA0X+nOzdCVw)0^njHyQpU&?9+uYJ!Q4>mq=+NZZzK!DMNMw-V%uL z9*s+lt9}}DP*Am7-wuL`sGW(q+K$07>_dLx%mJJf+KD1q>~u;O+@zScl}A{p)V}U0 z7}3#n2yC2q(>?i2j&^}0b`k2Sl_lXewIgl6gL#m$YY#`2BRO0bkS~~(Xa<5{P}B}M znf`Hlmvb{tN*+CgP+9EmH9tT95ONKqVkK~Smb7NCPZ+*>U!RICJ z2jY~)dzcb+yR2Q8-nRSP)!kmPX_f)kh}3=Cwva3Fn`m=BQWQHCbsA`!3Acc%nY27E zgm{+Hf<WpFz;d%-sowX6kz zr}jWar=M16xd}a#ek1);XD_^Aq_9u+|1?G_s)7R`D|EU~#xtpf^4#Hn% zSuHLn45q_Mvs(*UaGY6OaD>?=@mNkvaJ3$1VN2$lXWVx9vD-?#W5OotnVEY zO!99Ij=NE>cd|js)|Vk0?E2<*DD87T^?X<+R?@IeVI;ea2E*ezrbl z!DTwfxp${3s&8Aag|)b}yx86t#J@j%dOFCZ3EZ=e!Wthv>Kn+aS*BQuysW!h1K!)S zf*y4GnYQ(t*MN`3r-7C~*z;#|aChf)-Kp{B-I>y20*8rE+S#6kVCMAF^m`k98bCWL z(WwV+vIBwqmXpmJ&t9~BA>Ob5YyaEO{M7BHFkfh^VZ9F9_Anv6vdq{-&T^wbbtsK5 z2&jld=AjpC0@K!p01xK97%QZ5nEkIeoF>AM+{wiS5I5rRgoC3b;Qn)#{~Eu3;L*^Q zoSMu3BZ-D45H^&OKz@N_B_sr=-hbuV_=}9E<_Q4ia z+UTvy3SRYI5hD(UXKf#Um@5%Lph_H4AI?&b3}sZi-fwJf$0cUAzbq>HJ2eGNX#iOx ztOp2fTcj8B6j9FSl_KD^GkUVzgj`z_}N*X*zk#*>*4?_JPLW zskJjK2MKUEUHd8Zh3j?8Ym?q>cCD7AM`2`YpLDxUSTZ{Nv58pOIP%&Iajbt4%h0fl z=Vah99g3WVGh+K2nWG8qB^lS9?0KlA-5_u{R~B8DHzh!K*$yFlMF-g))7E5glav(e`a(nHCZ;Z`(3Z?sI2pqW!+EUqNVt z0GMh22DyX7w6tEqnRjd33tnf#D5Ce7+m}rzw-#_aK`@fPUN^Y!;)32;BJXCiTkemV zhn9*e_pa{sy3ga`RHCe@1M2!F*lUpZ&k9Vrhho{*G4Ie+fY;`NL6m=B*~jk1m8{EV$q!6lQstq7}| ztc>mU0y8feJY%+Ma)Vt%mCCs9B{iSSUl$TWz7|k4Pl>=kZMV?32 z_2|~ke%W>={{5u(j0)7%RAv+ZD#*;?fV6+H zgK6+Jzo6>JkAHv>_B&ScgWA5-)VS6Q30t>~5SB={lOD3FuqQZ44mWfD~DtI!zR^v01 zRAt2}l0_?vdqMx?r-g83&U@Cftlj2rKAy3sF)CCJgO0~0%hwP!8-d6-bBexK{0^(*SJ>1_VD4s)oS=GZrgH60c*cP9n>iOY~Grg zI|_fUvuE^91`j=K@xP7vLQbcZs!&knDHy%32Gj({r1+r`p&VeV>4BeK%hwO2Mie9XARj@68p z-D7JdZl#LSBqo!!Oij&fU%#A(_i*`izKvsmtpH zdWgyXGIY`^X0=h-CivquG%VWto!l^6hMViM6}>Wux&froXkXd5U{SODH6U(6IZf z<#CJqe;H(?|H`%LRd-`Oo~s-{8~6V%0X&h>9@B*|C}DqJ<)($6Kif`s)z3VU0zNC< z?q-?8Y~`&QPt*Jh|L2S<_ND5$VG%f-8ZIH=fTw3veNkqpCee?}`wx{y?Dnr(dU@;F zNapUU9DAX^oUY$y2@$p!zYoHuX^)KXF~3HA*-g^{}H<<>8AH| zs?#u>faE1fK@6v-4yO(P)c%>Bo!-)dIP|b;4SCnp3SMPfvZlUggdl)x$=XUv#AWCj z=jQTy__1?Fk1<1wjOyoEx!8KPFN|t02MRw!g^)?v2~Z@w1oV5W@UA8forar#mcSRw z$;k;g3@OXXVsf=3ctKHl4qMJ#SkMi8O8I`tl~rwVe&7lw#eCe}sST1Yznt%k&y!CB z>#J%zq*q%Ke;EGKeRN$J-j@=XN$-tPMlv=_1m~7nzQ#vA6GK(&BrFx9`Ya0y;IMm7 z;d`z@i2BB9@4rZq8**{v!DP3$wsszw5nvpNg}h_vT

Hr1>gKd}HOXUrnp$Jk^n( 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 0, key + ' should be one of ' + values.join(', ')); + } + } +}; + + +module.exports = internals.Any = function () { + + Cast = Cast || require('./cast'); + + this.isJoi = true; + this._type = 'any'; + this._settings = null; + this._valids = new internals.Set(); + this._invalids = new internals.Set(); + this._tests = []; + this._refs = []; + this._flags = { /* + presence: 'optional', // optional, required, forbidden, ignore + allowOnly: false, + allowUnknown: undefined, + default: undefined, + forbidden: false, + encoding: undefined, + insensitive: false, + trim: false, + case: undefined, // upper, lower + empty: undefined, + func: false + */ }; + + this._description = null; + this._unit = null; + this._notes = []; + this._tags = []; + this._examples = []; + this._meta = []; + + this._inner = {}; // Hash of arrays of immutable objects +}; + + +internals.Any.prototype.isImmutable = true; // Prevents Hoek from deep cloning schema objects + + +internals.Any.prototype.clone = function () { + + var obj = Object.create(Object.getPrototypeOf(this)); + + obj.isJoi = true; + obj._type = this._type; + obj._settings = internals.concatSettings(this._settings); + obj._valids = Hoek.clone(this._valids); + obj._invalids = Hoek.clone(this._invalids); + obj._tests = this._tests.slice(); + obj._refs = this._refs.slice(); + obj._flags = Hoek.clone(this._flags); + + obj._description = this._description; + obj._unit = this._unit; + obj._notes = this._notes.slice(); + obj._tags = this._tags.slice(); + obj._examples = this._examples.slice(); + obj._meta = this._meta.slice(); + + obj._inner = {}; + var inners = Object.keys(this._inner); + for (var i = 0, il = inners.length; i < il; ++i) { + var key = inners[i]; + obj._inner[key] = this._inner[key] ? this._inner[key].slice() : null; + } + + return obj; +}; + + +internals.Any.prototype.concat = function (schema) { + + Hoek.assert(schema && schema.isJoi, 'Invalid schema object'); + Hoek.assert(this._type === 'any' || schema._type === 'any' || schema._type === this._type, 'Cannot merge type', this._type, 'with another type:', schema._type); + + var obj = this.clone(); + + if (this._type === 'any' && schema._type !== 'any') { + + // Reset values as if we were "this" + var tmpObj = schema.clone(); + var keysToRestore = ['_settings', '_valids', '_invalids', '_tests', '_refs', '_flags', '_description', '_unit', + '_notes', '_tags', '_examples', '_meta', '_inner']; + + for (var j = 0, jl = keysToRestore.length; j < jl; ++j) { + tmpObj[keysToRestore[j]] = obj[keysToRestore[j]]; + } + + obj = tmpObj; + } + + obj._settings = obj._settings ? internals.concatSettings(obj._settings, schema._settings) : schema._settings; + obj._valids.merge(schema._valids, schema._invalids); + obj._invalids.merge(schema._invalids, schema._valids); + obj._tests = obj._tests.concat(schema._tests); + obj._refs = obj._refs.concat(schema._refs); + Hoek.merge(obj._flags, schema._flags); + + obj._description = schema._description || obj._description; + obj._unit = schema._unit || obj._unit; + obj._notes = obj._notes.concat(schema._notes); + obj._tags = obj._tags.concat(schema._tags); + obj._examples = obj._examples.concat(schema._examples); + obj._meta = obj._meta.concat(schema._meta); + + var inners = Object.keys(schema._inner); + var isObject = obj._type === 'object'; + for (var i = 0, il = inners.length; i < il; ++i) { + var key = inners[i]; + var source = schema._inner[key]; + if (source) { + var target = obj._inner[key]; + if (target) { + if (isObject && key === 'children') { + var keys = {}; + + for (var k = 0, kl = target.length; k < kl; ++k) { + keys[target[k].key] = k; + } + + for (k = 0, kl = source.length; k < kl; ++k) { + var sourceKey = source[k].key; + if (keys[sourceKey] >= 0) { + target[keys[sourceKey]] = { + key: sourceKey, + schema: target[keys[sourceKey]].schema.concat(source[k].schema) + }; + } + else { + target.push(source[k]); + } + } + } + else { + obj._inner[key] = obj._inner[key].concat(source); + } + } + else { + obj._inner[key] = source.slice(); + } + } + } + + return obj; +}; + + +internals.Any.prototype._test = function (name, arg, func) { + + Hoek.assert(!this._flags.allowOnly, 'Cannot define rules when valid values specified'); + + var obj = this.clone(); + obj._tests.push({ func: func, name: name, arg: arg }); + return obj; +}; + + +internals.Any.prototype.options = function (options) { + + Hoek.assert(!options.context, 'Cannot override context'); + internals.checkOptions(options); + + var obj = this.clone(); + obj._settings = internals.concatSettings(obj._settings, options); + return obj; +}; + + +internals.Any.prototype.strict = function (isStrict) { + + var obj = this.clone(); + obj._settings = obj._settings || {}; + obj._settings.convert = isStrict === undefined ? false : !isStrict; + return obj; +}; + + +internals.Any.prototype.raw = function (isRaw) { + + var obj = this.clone(); + obj._settings = obj._settings || {}; + obj._settings.raw = isRaw === undefined ? true : isRaw; + return obj; +}; + + +internals.Any.prototype._allow = function () { + + var values = Hoek.flatten(Array.prototype.slice.call(arguments)); + for (var i = 0, il = values.length; i < il; ++i) { + var value = values[i]; + + Hoek.assert(value !== undefined, 'Cannot call allow/valid/invalid with undefined'); + this._invalids.remove(value); + this._valids.add(value, this._refs); + } +}; + + +internals.Any.prototype.allow = function () { + + var obj = this.clone(); + obj._allow.apply(obj, arguments); + return obj; +}; + + +internals.Any.prototype.valid = internals.Any.prototype.only = internals.Any.prototype.equal = function () { + + Hoek.assert(!this._tests.length, 'Cannot set valid values when rules specified'); + + var obj = this.allow.apply(this, arguments); + obj._flags.allowOnly = true; + return obj; +}; + + +internals.Any.prototype.invalid = internals.Any.prototype.disallow = internals.Any.prototype.not = function (value) { + + var obj = this.clone(); + var values = Hoek.flatten(Array.prototype.slice.call(arguments)); + for (var i = 0, il = values.length; i < il; ++i) { + value = values[i]; + + Hoek.assert(value !== undefined, 'Cannot call allow/valid/invalid with undefined'); + obj._valids.remove(value); + obj._invalids.add(value, this._refs); + } + + return obj; +}; + + +internals.Any.prototype.required = internals.Any.prototype.exist = function () { + + var obj = this.clone(); + obj._flags.presence = 'required'; + return obj; +}; + + +internals.Any.prototype.optional = function () { + + var obj = this.clone(); + obj._flags.presence = 'optional'; + return obj; +}; + + +internals.Any.prototype.forbidden = function () { + + var obj = this.clone(); + obj._flags.presence = 'forbidden'; + return obj; +}; + + +internals.Any.prototype.strip = function () { + + var obj = this.clone(); + obj._flags.strip = true; + return obj; +}; + + +internals.Any.prototype.applyFunctionToChildren = function (children, fn, args, root) { + + children = [].concat(children); + + if (children.length !== 1 || children[0] !== '') { + root = root ? (root + '.') : ''; + + var extraChildren = (children[0] === '' ? children.slice(1) : children).map(function (child) { + + return root + child; + }); + + throw new Error('unknown key(s) ' + extraChildren.join(', ')); + } + + return this[fn].apply(this, args); +}; + + +internals.Any.prototype.default = function (value, description) { + + if (typeof value === 'function' && + !Ref.isRef(value)) { + + if (!value.description && + description) { + + value.description = description; + } + + if (!this._flags.func) { + Hoek.assert(typeof value.description === 'string' && value.description.length > 0, 'description must be provided when default value is a function'); + } + } + + var obj = this.clone(); + obj._flags.default = value; + Ref.push(obj._refs, value); + return obj; +}; + + +internals.Any.prototype.empty = function (schema) { + + var obj; + if (schema === undefined) { + obj = this.clone(); + obj._flags.empty = undefined; + } + else { + schema = Cast.schema(schema); + + obj = this.clone(); + obj._flags.empty = schema; + } + + return obj; +}; + + +internals.Any.prototype.when = function (ref, options) { + + Hoek.assert(options && typeof options === 'object', 'Invalid options'); + Hoek.assert(options.then !== undefined || options.otherwise !== undefined, 'options must have at least one of "then" or "otherwise"'); + + var then = options.then ? this.concat(Cast.schema(options.then)) : this; + var otherwise = options.otherwise ? this.concat(Cast.schema(options.otherwise)) : this; + + Alternatives = Alternatives || require('./alternatives'); + var obj = Alternatives.when(ref, { is: options.is, then: then, otherwise: otherwise }); + obj._flags.presence = 'ignore'; + return obj; +}; + + +internals.Any.prototype.description = function (desc) { + + Hoek.assert(desc && typeof desc === 'string', 'Description must be a non-empty string'); + + var obj = this.clone(); + obj._description = desc; + return obj; +}; + + +internals.Any.prototype.notes = function (notes) { + + Hoek.assert(notes && (typeof notes === 'string' || Array.isArray(notes)), 'Notes must be a non-empty string or array'); + + var obj = this.clone(); + obj._notes = obj._notes.concat(notes); + return obj; +}; + + +internals.Any.prototype.tags = function (tags) { + + Hoek.assert(tags && (typeof tags === 'string' || Array.isArray(tags)), 'Tags must be a non-empty string or array'); + + var obj = this.clone(); + obj._tags = obj._tags.concat(tags); + return obj; +}; + +internals.Any.prototype.meta = function (meta) { + + Hoek.assert(meta !== undefined, 'Meta cannot be undefined'); + + var obj = this.clone(); + obj._meta = obj._meta.concat(meta); + return obj; +}; + + +internals.Any.prototype.example = function (value) { + + Hoek.assert(arguments.length, 'Missing example'); + var result = this._validate(value, null, internals.defaults); + Hoek.assert(!result.errors, 'Bad example:', result.errors && Errors.process(result.errors, value)); + + var obj = this.clone(); + obj._examples = obj._examples.concat(value); + return obj; +}; + + +internals.Any.prototype.unit = function (name) { + + Hoek.assert(name && typeof name === 'string', 'Unit name must be a non-empty string'); + + var obj = this.clone(); + obj._unit = name; + return obj; +}; + + +internals._try = function (fn, arg) { + + var err; + var result; + + try { + result = fn.call(null, arg); + } catch (e) { + err = e; + } + + return { + value: result, + error: err + }; +}; + + +internals.Any.prototype._validate = function (value, state, options, reference) { + + var self = this; + var originalValue = value; + + // Setup state and settings + + state = state || { key: '', path: '', parent: null, reference: reference }; + + if (this._settings) { + options = internals.concatSettings(options, this._settings); + } + + var errors = []; + var finish = function () { + + var finalValue; + + if (!self._flags.strip) { + if (value !== undefined) { + finalValue = options.raw ? originalValue : value; + } + else if (options.noDefaults) { + finalValue = originalValue; + } + else if (Ref.isRef(self._flags.default)) { + finalValue = self._flags.default(state.parent, options); + } + else if (typeof self._flags.default === 'function' && + !(self._flags.func && !self._flags.default.description)) { + + var arg; + + if (state.parent !== null && + self._flags.default.length > 0) { + + arg = Hoek.clone(state.parent); + } + + var defaultValue = internals._try(self._flags.default, arg); + finalValue = defaultValue.value; + if (defaultValue.error) { + errors.push(Errors.create('any.default', defaultValue.error, state, options)); + } + } + else { + finalValue = Hoek.clone(self._flags.default); + } + } + + return { + value: finalValue, + errors: errors.length ? errors : null + }; + }; + + // Check presence requirements + + var presence = this._flags.presence || options.presence; + if (presence === 'optional') { + if (value === undefined) { + var isDeepDefault = this._flags.hasOwnProperty('default') && this._flags.default === undefined; + if (isDeepDefault && this._type === 'object') { + value = {}; + } + else { + return finish(); + } + } + } + else if (presence === 'required' && + value === undefined) { + + errors.push(Errors.create('any.required', null, state, options)); + return finish(); + } + else if (presence === 'forbidden') { + if (value === undefined) { + return finish(); + } + + errors.push(Errors.create('any.unknown', null, state, options)); + return finish(); + } + + if (this._flags.empty && !this._flags.empty._validate(value, null, internals.defaults).errors) { + value = undefined; + return finish(); + } + + // Check allowed and denied values using the original value + + if (this._valids.has(value, state, options, this._flags.insensitive)) { + return finish(); + } + + if (this._invalids.has(value, state, options, this._flags.insensitive)) { + errors.push(Errors.create(value === '' ? 'any.empty' : 'any.invalid', null, state, options)); + if (options.abortEarly || + value === undefined) { // No reason to keep validating missing value + + return finish(); + } + } + + // Convert value and validate type + + if (this._base) { + var base = this._base.call(this, value, state, options); + if (base.errors) { + value = base.value; + errors = errors.concat(base.errors); + return finish(); // Base error always aborts early + } + + if (base.value !== value) { + value = base.value; + + // Check allowed and denied values using the converted value + + if (this._valids.has(value, state, options, this._flags.insensitive)) { + return finish(); + } + + if (this._invalids.has(value, state, options, this._flags.insensitive)) { + errors.push(Errors.create('any.invalid', null, state, options)); + if (options.abortEarly) { + return finish(); + } + } + } + } + + // Required values did not match + + if (this._flags.allowOnly) { + errors.push(Errors.create('any.allowOnly', { valids: this._valids.values({ stripUndefined: true }) }, state, options)); + if (options.abortEarly) { + return finish(); + } + } + + // Helper.validate tests + + for (var i = 0, il = this._tests.length; i < il; ++i) { + var test = this._tests[i]; + var err = test.func.call(this, value, state, options); + if (err) { + errors.push(err); + if (options.abortEarly) { + return finish(); + } + } + } + + return finish(); +}; + + +internals.Any.prototype._validateWithOptions = function (value, options, callback) { + + if (options) { + internals.checkOptions(options); + } + + var settings = internals.concatSettings(internals.defaults, options); + var result = this._validate(value, null, settings); + var errors = Errors.process(result.errors, value); + + if (callback) { + return callback(errors, result.value); + } + + return { error: errors, value: result.value }; +}; + + +internals.Any.prototype.validate = function (value, callback) { + + var result = this._validate(value, null, internals.defaults); + var errors = Errors.process(result.errors, value); + + if (callback) { + return callback(errors, result.value); + } + + return { error: errors, value: result.value }; +}; + + +internals.Any.prototype.describe = function () { + + var description = { + type: this._type + }; + + var flags = Object.keys(this._flags); + if (flags.length) { + if (this._flags.empty) { + description.flags = {}; + for (var f = 0, fl = flags.length; f < fl; ++f) { + var flag = flags[f]; + description.flags[flag] = flag === 'empty' ? this._flags[flag].describe() : this._flags[flag]; + } + } + else { + description.flags = this._flags; + } + } + + if (this._description) { + description.description = this._description; + } + + if (this._notes.length) { + description.notes = this._notes; + } + + if (this._tags.length) { + description.tags = this._tags; + } + + if (this._meta.length) { + description.meta = this._meta; + } + + if (this._examples.length) { + description.examples = this._examples; + } + + if (this._unit) { + description.unit = this._unit; + } + + var valids = this._valids.values(); + if (valids.length) { + description.valids = valids; + } + + var invalids = this._invalids.values(); + if (invalids.length) { + description.invalids = invalids; + } + + description.rules = []; + + for (var i = 0, il = this._tests.length; i < il; ++i) { + var validator = this._tests[i]; + var item = { name: validator.name }; + if (validator.arg !== void 0) { + item.arg = validator.arg; + } + description.rules.push(item); + } + + if (!description.rules.length) { + delete description.rules; + } + + var label = Hoek.reach(this._settings, 'language.label'); + if (label) { + description.label = label; + } + + return description; +}; + +internals.Any.prototype.label = function (name) { + + Hoek.assert(name && typeof name === 'string', 'Label name must be a non-empty string'); + + var obj = this.clone(); + var options = { language: { label: name } }; + + // If language.label is set, it should override this label + obj._settings = internals.concatSettings(options, obj._settings); + return obj; +}; + + +// Set + +internals.Set = function () { + + this._set = []; +}; + + +internals.Set.prototype.add = function (value, refs) { + + Hoek.assert(value === null || value === undefined || value instanceof Date || Buffer.isBuffer(value) || Ref.isRef(value) || (typeof value !== 'function' && typeof value !== 'object'), 'Value cannot be an object or function'); + + if (typeof value !== 'function' && + this.has(value, null, null, false)) { + + return; + } + + Ref.push(refs, value); + this._set.push(value); +}; + + +internals.Set.prototype.merge = function (add, remove) { + + for (var i = 0, il = add._set.length; i < il; ++i) { + this.add(add._set[i]); + } + + for (i = 0, il = remove._set.length; i < il; ++i) { + this.remove(remove._set[i]); + } +}; + + +internals.Set.prototype.remove = function (value) { + + this._set = this._set.filter(function (item) { + + return value !== item; + }); +}; + + +internals.Set.prototype.has = function (value, state, options, insensitive) { + + for (var i = 0, il = this._set.length; i < il; ++i) { + var items = this._set[i]; + + if (Ref.isRef(items)) { + items = items(state.reference || state.parent, options); + } + + if (!Array.isArray(items)) { + items = [items]; + } + + for (var j = 0, jl = items.length; j < jl; ++j) { + var item = items[j]; + if (typeof value !== typeof item) { + continue; + } + + if (value === item || + (value instanceof Date && item instanceof Date && value.getTime() === item.getTime()) || + (insensitive && typeof value === 'string' && value.toLowerCase() === item.toLowerCase()) || + (Buffer.isBuffer(value) && Buffer.isBuffer(item) && value.length === item.length && value.toString('binary') === item.toString('binary'))) { + + return true; + } + } + } + + return false; +}; + + +internals.Set.prototype.values = function (options) { + + if (options && options.stripUndefined) { + var values = []; + + for (var i = 0, il = this._set.length; i < il; ++i) { + var item = this._set[i]; + if (item !== undefined) { + values.push(item); + } + } + + return values; + } + + return this._set.slice(); +}; + + +internals.concatSettings = function (target, source) { + + // Used to avoid cloning context + + if (!target && + !source) { + + return null; + } + + var key, obj = {}; + + if (target) { + var tKeys = Object.keys(target); + for (var i = 0, il = tKeys.length; i < il; ++i) { + key = tKeys[i]; + obj[key] = target[key]; + } + } + + if (source) { + var sKeys = Object.keys(source); + for (var j = 0, jl = sKeys.length; j < jl; ++j) { + key = sKeys[j]; + if (key !== 'language' || + !obj.hasOwnProperty(key)) { + + obj[key] = source[key]; + } + else { + obj[key] = Hoek.applyToDefaults(obj[key], source[key]); + } + } + } + + return obj; +}; diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/array.js b/node_modules/jsonwebtoken/node_modules/joi/lib/array.js new file mode 100755 index 0000000..9299cee --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/array.js @@ -0,0 +1,517 @@ +// Load modules + +var Any = require('./any'); +var Cast = require('./cast'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.fastSplice = function (arr, i) { + + var il = arr.length; + var pos = i; + + while (pos < il) { + arr[pos++] = arr[pos]; + } + + --arr.length; +}; + + +internals.Array = function () { + + Any.call(this); + this._type = 'array'; + this._inner.items = []; + this._inner.ordereds = []; + this._inner.inclusions = []; + this._inner.exclusions = []; + this._inner.requireds = []; + this._flags.sparse = false; +}; + +Hoek.inherits(internals.Array, Any); + + +internals.Array.prototype._base = function (value, state, options) { + + var result = { + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + try { + var converted = JSON.parse(value); + if (Array.isArray(converted)) { + result.value = converted; + } + } + catch (e) { } + } + + var isArray = Array.isArray(result.value); + var wasArray = isArray; + if (options.convert && this._flags.single && !isArray) { + result.value = [result.value]; + isArray = true; + } + + if (!isArray) { + result.errors = Errors.create('array.base', null, state, options); + return result; + } + + if (this._inner.inclusions.length || + this._inner.exclusions.length || + !this._flags.sparse) { + + // Clone the array so that we don't modify the original + if (wasArray) { + result.value = result.value.slice(0); + } + + result.errors = internals.checkItems.call(this, result.value, wasArray, state, options); + + if (result.errors && wasArray && options.convert && this._flags.single) { + + // Attempt a 2nd pass by putting the array inside one. + var previousErrors = result.errors; + + result.value = [result.value]; + result.errors = internals.checkItems.call(this, result.value, wasArray, state, options); + + if (result.errors) { + + // Restore previous errors and value since this didn't validate either. + result.errors = previousErrors; + result.value = result.value[0]; + } + } + } + + return result; +}; + + +internals.checkItems = function (items, wasArray, state, options) { + + var errors = []; + var errored; + + var requireds = this._inner.requireds.slice(); + var ordereds = this._inner.ordereds.slice(); + var inclusions = this._inner.inclusions.concat(requireds); + + for (var v = 0, vl = items.length; v < vl; ++v) { + errored = false; + var item = items[v]; + var isValid = false; + var localState = { key: v, path: (state.path ? state.path + '.' : '') + v, parent: items, reference: state.reference }; + var res; + + // Sparse + + if (!this._flags.sparse && item === undefined) { + errors.push(Errors.create('array.sparse', null, { key: state.key, path: localState.path }, options)); + + if (options.abortEarly) { + return errors; + } + + continue; + } + + // Exclusions + + for (var i = 0, il = this._inner.exclusions.length; i < il; ++i) { + res = this._inner.exclusions[i]._validate(item, localState, {}); // Not passing options to use defaults + + if (!res.errors) { + errors.push(Errors.create(wasArray ? 'array.excludes' : 'array.excludesSingle', { pos: v, value: item }, { key: state.key, path: localState.path }, options)); + errored = true; + + if (options.abortEarly) { + return errors; + } + + break; + } + } + + if (errored) { + continue; + } + + // Ordered + if (this._inner.ordereds.length) { + if (ordereds.length > 0) { + var ordered = ordereds.shift(); + res = ordered._validate(item, localState, options); + if (!res.errors) { + if (ordered._flags.strip) { + internals.fastSplice(items, v); + --v; + --vl; + } + else { + items[v] = res.value; + } + } + else { + errors.push(Errors.create('array.ordered', { pos: v, reason: res.errors, value: item }, { key: state.key, path: localState.path }, options)); + if (options.abortEarly) { + return errors; + } + } + continue; + } + else if (!this._inner.items.length) { + errors.push(Errors.create('array.orderedLength', { pos: v, limit: this._inner.ordereds.length }, { key: state.key, path: localState.path }, options)); + if (options.abortEarly) { + return errors; + } + continue; + } + } + + // Requireds + + var requiredChecks = []; + for (i = 0, il = requireds.length; i < il; ++i) { + res = requiredChecks[i] = requireds[i]._validate(item, localState, options); + if (!res.errors) { + items[v] = res.value; + isValid = true; + internals.fastSplice(requireds, i); + --i; + --il; + break; + } + } + + if (isValid) { + continue; + } + + // Inclusions + + for (i = 0, il = inclusions.length; i < il; ++i) { + var inclusion = inclusions[i]; + + // Avoid re-running requireds that already didn't match in the previous loop + var previousCheck = requireds.indexOf(inclusion); + if (previousCheck !== -1) { + res = requiredChecks[previousCheck]; + } + else { + res = inclusion._validate(item, localState, options); + + if (!res.errors) { + if (inclusion._flags.strip) { + internals.fastSplice(items, v); + --v; + --vl; + } + else { + items[v] = res.value; + } + isValid = true; + break; + } + } + + // Return the actual error if only one inclusion defined + if (il === 1) { + if (options.stripUnknown) { + internals.fastSplice(items, v); + --v; + --vl; + isValid = true; + break; + } + + errors.push(Errors.create(wasArray ? 'array.includesOne' : 'array.includesOneSingle', { pos: v, reason: res.errors, value: item }, { key: state.key, path: localState.path }, options)); + errored = true; + + if (options.abortEarly) { + return errors; + } + + break; + } + } + + if (errored) { + continue; + } + + if (this._inner.inclusions.length && !isValid) { + if (options.stripUnknown) { + internals.fastSplice(items, v); + --v; + --vl; + continue; + } + + errors.push(Errors.create(wasArray ? 'array.includes' : 'array.includesSingle', { pos: v, value: item }, { key: state.key, path: localState.path }, options)); + + if (options.abortEarly) { + return errors; + } + } + } + + if (requireds.length) { + internals.fillMissedErrors(errors, requireds, state, options); + } + + if (ordereds.length) { + internals.fillOrderedErrors(errors, ordereds, state, options); + } + + return errors.length ? errors : null; +}; + +internals.fillMissedErrors = function (errors, requireds, state, options) { + + var knownMisses = []; + var unknownMisses = 0; + for (var i = 0, il = requireds.length; i < il; ++i) { + var label = Hoek.reach(requireds[i], '_settings.language.label'); + if (label) { + knownMisses.push(label); + } + else { + ++unknownMisses; + } + } + + if (knownMisses.length) { + if (unknownMisses) { + errors.push(Errors.create('array.includesRequiredBoth', { knownMisses: knownMisses, unknownMisses: unknownMisses }, { key: state.key, path: state.patk }, options)); + } + else { + errors.push(Errors.create('array.includesRequiredKnowns', { knownMisses: knownMisses }, { key: state.key, path: state.path }, options)); + } + } + else { + errors.push(Errors.create('array.includesRequiredUnknowns', { unknownMisses: unknownMisses }, { key: state.key, path: state.path }, options)); + } +}; + +internals.fillOrderedErrors = function (errors, ordereds, state, options) { + + var requiredOrdereds = []; + + for (var i = 0, il = ordereds.length; i < il; ++i) { + var presence = Hoek.reach(ordereds[i], '_flags.presence'); + if (presence === 'required') { + requiredOrdereds.push(ordereds[i]); + } + } + + if (requiredOrdereds.length) { + internals.fillMissedErrors(errors, requiredOrdereds, state, options); + } +}; + +internals.Array.prototype.describe = function () { + + var description = Any.prototype.describe.call(this); + + if (this._inner.ordereds.length) { + description.orderedItems = []; + + for (var o = 0, ol = this._inner.ordereds.length; o < ol; ++o) { + description.orderedItems.push(this._inner.ordereds[o].describe()); + } + } + + if (this._inner.items.length) { + description.items = []; + + for (var i = 0, il = this._inner.items.length; i < il; ++i) { + description.items.push(this._inner.items[i].describe()); + } + } + + return description; +}; + + +internals.Array.prototype.items = function () { + + var obj = this.clone(); + + Hoek.flatten(Array.prototype.slice.call(arguments)).forEach(function (type, index) { + + try { + type = Cast.schema(type); + } + catch (castErr) { + if (castErr.hasOwnProperty('path')) { + castErr.path = index + '.' + castErr.path; + } + else { + castErr.path = index; + } + castErr.message += '(' + castErr.path + ')'; + throw castErr; + } + + obj._inner.items.push(type); + + if (type._flags.presence === 'required') { + obj._inner.requireds.push(type); + } + else if (type._flags.presence === 'forbidden') { + obj._inner.exclusions.push(type.optional()); + } + else { + obj._inner.inclusions.push(type); + } + }); + + return obj; +}; + + +internals.Array.prototype.ordered = function () { + + var obj = this.clone(); + + Hoek.flatten(Array.prototype.slice.call(arguments)).forEach(function (type, index) { + + try { + type = Cast.schema(type); + } + catch (castErr) { + if (castErr.hasOwnProperty('path')) { + castErr.path = index + '.' + castErr.path; + } + else { + castErr.path = index; + } + castErr.message += '(' + castErr.path + ')'; + throw castErr; + } + obj._inner.ordereds.push(type); + }); + + return obj; +}; + + +internals.Array.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (value.length >= limit) { + return null; + } + + return Errors.create('array.min', { limit: limit, value: value }, state, options); + }); +}; + + +internals.Array.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (value.length <= limit) { + return null; + } + + return Errors.create('array.max', { limit: limit, value: value }, state, options); + }); +}; + + +internals.Array.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (value.length === limit) { + return null; + } + + return Errors.create('array.length', { limit: limit, value: value }, state, options); + }); +}; + + +internals.Array.prototype.unique = function () { + + return this._test('unique', undefined, function (value, state, options) { + + var found = { + string: {}, + number: {}, + undefined: {}, + boolean: {}, + object: [], + function: [] + }; + + for (var i = 0, il = value.length; i < il; ++i) { + var item = value[i]; + var type = typeof item; + var records = found[type]; + + // All available types are supported, so it's not possible to reach 100% coverage without ignoring this line. + // I still want to keep the test for future js versions with new types (eg. Symbol). + if (/* $lab:coverage:off$ */ records /* $lab:coverage:on$ */) { + if (Array.isArray(records)) { + for (var r = 0, rl = records.length; r < rl; ++r) { + if (Hoek.deepEqual(records[r], item)) { + return Errors.create('array.unique', { pos: i, value: item }, state, options); + } + } + + records.push(item); + } + else { + if (records[item]) { + return Errors.create('array.unique', { pos: i, value: item }, state, options); + } + + records[item] = true; + } + } + } + }); +}; + + +internals.Array.prototype.sparse = function (enabled) { + + var obj = this.clone(); + obj._flags.sparse = enabled === undefined ? true : !!enabled; + return obj; +}; + + +internals.Array.prototype.single = function (enabled) { + + var obj = this.clone(); + obj._flags.single = enabled === undefined ? true : !!enabled; + return obj; +}; + + +module.exports = new internals.Array(); diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/binary.js b/node_modules/jsonwebtoken/node_modules/joi/lib/binary.js new file mode 100755 index 0000000..ee8b1e2 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/binary.js @@ -0,0 +1,98 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Binary = function () { + + Any.call(this); + this._type = 'binary'; +}; + +Hoek.inherits(internals.Binary, Any); + + +internals.Binary.prototype._base = function (value, state, options) { + + var result = { + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + try { + var converted = new Buffer(value, this._flags.encoding); + result.value = converted; + } + catch (e) { } + } + + result.errors = Buffer.isBuffer(result.value) ? null : Errors.create('binary.base', null, state, options); + return result; +}; + + +internals.Binary.prototype.encoding = function (encoding) { + + Hoek.assert(Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + var obj = this.clone(); + obj._flags.encoding = encoding; + return obj; +}; + + +internals.Binary.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (value.length >= limit) { + return null; + } + + return Errors.create('binary.min', { limit: limit, value: value }, state, options); + }); +}; + + +internals.Binary.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (value.length <= limit) { + return null; + } + + return Errors.create('binary.max', { limit: limit, value: value }, state, options); + }); +}; + + +internals.Binary.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (value.length === limit) { + return null; + } + + return Errors.create('binary.length', { limit: limit, value: value }, state, options); + }); +}; + + +module.exports = new internals.Binary(); diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/boolean.js b/node_modules/jsonwebtoken/node_modules/joi/lib/boolean.js new file mode 100755 index 0000000..9e4f4b7 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/boolean.js @@ -0,0 +1,41 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Boolean = function () { + + Any.call(this); + this._type = 'boolean'; +}; + +Hoek.inherits(internals.Boolean, Any); + + +internals.Boolean.prototype._base = function (value, state, options) { + + var result = { + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + var lower = value.toLowerCase(); + result.value = (lower === 'true' || lower === 'yes' || lower === 'on' ? true + : (lower === 'false' || lower === 'no' || lower === 'off' ? false : value)); + } + + result.errors = (typeof result.value === 'boolean') ? null : Errors.create('boolean.base', null, state, options); + return result; +}; + + +module.exports = new internals.Boolean(); diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/cast.js b/node_modules/jsonwebtoken/node_modules/joi/lib/cast.js new file mode 100755 index 0000000..88f7e14 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/cast.js @@ -0,0 +1,75 @@ +// Load modules + +var Hoek = require('hoek'); +var Ref = require('./ref'); + +// Type modules are delay-loaded to prevent circular dependencies + + +// Declare internals + +var internals = { + any: null, + date: require('./date'), + string: require('./string'), + number: require('./number'), + boolean: require('./boolean'), + alt: null, + object: null +}; + + +exports.schema = function (config) { + + internals.any = internals.any || new (require('./any'))(); + internals.alt = internals.alt || require('./alternatives'); + internals.object = internals.object || require('./object'); + + if (config && + typeof config === 'object') { + + if (config.isJoi) { + return config; + } + + if (Array.isArray(config)) { + return internals.alt.try(config); + } + + if (config instanceof RegExp) { + return internals.string.regex(config); + } + + if (config instanceof Date) { + return internals.date.valid(config); + } + + return internals.object.keys(config); + } + + if (typeof config === 'string') { + return internals.string.valid(config); + } + + if (typeof config === 'number') { + return internals.number.valid(config); + } + + if (typeof config === 'boolean') { + return internals.boolean.valid(config); + } + + if (Ref.isRef(config)) { + return internals.any.valid(config); + } + + Hoek.assert(config === null, 'Invalid schema content:', config); + + return internals.any.valid(null); +}; + + +exports.ref = function (id) { + + return Ref.isRef(id) ? id : Ref.create(id); +}; diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/date.js b/node_modules/jsonwebtoken/node_modules/joi/lib/date.js new file mode 100755 index 0000000..79957fd --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/date.js @@ -0,0 +1,168 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Ref = require('./ref'); +var Hoek = require('hoek'); +var Moment = require('moment'); + + +// Declare internals + +var internals = {}; + +internals.isoDate = /^(?:\d{4}(?!\d{2}\b))(?:(-?)(?:(?:0[1-9]|1[0-2])(?:\1(?:[12]\d|0[1-9]|3[01]))?|W(?:[0-4]\d|5[0-2])(?:-?[1-7])?|(?:00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[1-6])))(?![T]$|[T][\d]+Z$)(?:[T\s](?:(?:(?:[01]\d|2[0-3])(?:(:?)[0-5]\d)?|24\:?00)(?:[.,]\d+(?!:))?)(?:\2[0-5]\d(?:[.,]\d+)?)?(?:[Z]|(?:[+-])(?:[01]\d|2[0-3])(?::?[0-5]\d)?)?)?)?$/; +internals.invalidDate = new Date(''); +internals.isIsoDate = (function () { + + var isoString = internals.isoDate.toString(); + + return function (date) { + + return date && (date.toString() === isoString); + }; +})(); + +internals.Date = function () { + + Any.call(this); + this._type = 'date'; +}; + +Hoek.inherits(internals.Date, Any); + + +internals.Date.prototype._base = function (value, state, options) { + + var result = { + value: (options.convert && internals.toDate(value, this._flags.format)) || value + }; + + if (result.value instanceof Date && !isNaN(result.value.getTime())) { + result.errors = null; + } + else { + result.errors = Errors.create(internals.isIsoDate(this._flags.format) ? 'date.isoDate' : 'date.base', null, state, options); + } + + return result; +}; + + +internals.toDate = function (value, format) { + + if (value instanceof Date) { + return value; + } + + if (typeof value === 'string' || + Hoek.isInteger(value)) { + + if (typeof value === 'string' && + /^[+-]?\d+$/.test(value)) { + + value = parseInt(value, 10); + } + + var date; + if (format) { + if (internals.isIsoDate(format)) { + date = format.test(value) ? new Date(value) : internals.invalidDate; + } + else { + date = Moment(value, format, true); + date = date.isValid() ? date.toDate() : internals.invalidDate; + } + } + else { + date = new Date(value); + } + + if (!isNaN(date.getTime())) { + return date; + } + } + + return null; +}; + + +internals.compare = function (type, compare) { + + return function (date) { + + var isNow = date === 'now'; + var isRef = Ref.isRef(date); + + if (!isNow && !isRef) { + date = internals.toDate(date); + } + + Hoek.assert(date, 'Invalid date format'); + + return this._test(type, date, function (value, state, options) { + + var compareTo; + if (isNow) { + compareTo = Date.now(); + } + else if (isRef) { + compareTo = internals.toDate(date(state.parent, options)); + + if (!compareTo) { + return Errors.create('date.ref', { ref: date.key }, state, options); + } + + compareTo = compareTo.getTime(); + } + else { + compareTo = date.getTime(); + } + + if (compare(value.getTime(), compareTo)) { + return null; + } + + return Errors.create('date.' + type, { limit: new Date(compareTo) }, state, options); + }); + }; +}; + + +internals.Date.prototype.min = internals.compare('min', function (value, date) { + + return value >= date; +}); + + +internals.Date.prototype.max = internals.compare('max', function (value, date) { + + return value <= date; +}); + + +internals.Date.prototype.format = function (format) { + + Hoek.assert(typeof format === 'string' || (Array.isArray(format) && format.every(function (f) { + + return typeof f === 'string'; + })), 'Invalid format.'); + + var obj = this.clone(); + obj._flags.format = format; + return obj; +}; + +internals.Date.prototype.iso = function () { + + var obj = this.clone(); + obj._flags.format = internals.isoDate; + return obj; +}; + +internals.Date.prototype._isIsoDate = function (value) { + + return internals.isoDate.test(value); +}; + +module.exports = new internals.Date(); diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/errors.js b/node_modules/jsonwebtoken/node_modules/joi/lib/errors.js new file mode 100755 index 0000000..566bfc6 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/errors.js @@ -0,0 +1,297 @@ +// Load modules + +var Hoek = require('hoek'); +var Language = require('./language'); + + +// Declare internals + +var internals = {}; + +internals.stringify = function (value, wrapArrays) { + + var type = typeof value; + + if (value === null) { + return 'null'; + } + + if (type === 'string') { + return value; + } + + if (value instanceof internals.Err || type === 'function') { + return value.toString(); + } + + if (type === 'object') { + if (Array.isArray(value)) { + var partial = ''; + + for (var i = 0, il = value.length; i < il; ++i) { + partial += (partial.length ? ', ' : '') + internals.stringify(value[i], wrapArrays); + } + + return wrapArrays ? '[' + partial + ']' : partial; + } + + return value.toString(); + } + + return JSON.stringify(value); +}; + +internals.Err = function (type, context, state, options) { + + this.type = type; + this.context = context || {}; + this.context.key = state.key; + this.path = state.path; + this.options = options; +}; + + +internals.Err.prototype.toString = function () { + + var self = this; + + var localized = this.options.language; + + if (localized.label) { + this.context.key = localized.label; + } + else if (this.context.key === '' || this.context.key === null) { + this.context.key = localized.root || Language.errors.root; + } + + var format = Hoek.reach(localized, this.type) || Hoek.reach(Language.errors, this.type); + var hasKey = /\{\{\!?key\}\}/.test(format); + var skipKey = format.length > 2 && format[0] === '!' && format[1] === '!'; + + if (skipKey) { + format = format.slice(2); + } + + if (!hasKey && !skipKey) { + format = (Hoek.reach(localized, 'key') || Hoek.reach(Language.errors, 'key')) + format; + } + + var wrapArrays = Hoek.reach(localized, 'messages.wrapArrays'); + if (typeof wrapArrays !== 'boolean') { + wrapArrays = Language.errors.messages.wrapArrays; + } + + var message = format.replace(/\{\{(\!?)([^}]+)\}\}/g, function ($0, isSecure, name) { + + var value = Hoek.reach(self.context, name); + var normalized = internals.stringify(value, wrapArrays); + return (isSecure ? Hoek.escapeHtml(normalized) : normalized); + }); + + return message; +}; + + +exports.create = function (type, context, state, options) { + + return new internals.Err(type, context, state, options); +}; + + +exports.process = function (errors, object) { + + if (!errors || !errors.length) { + return null; + } + + // Construct error + + var message = ''; + var details = []; + + var processErrors = function (localErrors, parent) { + + for (var i = 0, il = localErrors.length; i < il; ++i) { + var item = localErrors[i]; + + var detail = { + message: item.toString(), + path: internals.getPath(item), + type: item.type, + context: item.context + }; + + if (!parent) { + message += (message ? '. ' : '') + detail.message; + } + + // Do not push intermediate errors, we're only interested in leafs + if (item.context.reason && item.context.reason.length) { + processErrors(item.context.reason, item.path); + } + else { + details.push(detail); + } + } + }; + + processErrors(errors); + + var error = new Error(message); + error.name = 'ValidationError'; + error.details = details; + error._object = object; + error.annotate = internals.annotate; + return error; +}; + + +internals.getPath = function (item) { + + var recursePath = function (it) { + + var reachedItem = Hoek.reach(it, 'context.reason.0'); + if (reachedItem && reachedItem.context) { + return recursePath(reachedItem); + } + + return it.path; + }; + + return recursePath(item) || item.context.key; +}; + + +// Inspired by json-stringify-safe +internals.safeStringify = function (obj, spaces) { + + return JSON.stringify(obj, internals.serializer(), spaces); +}; + +internals.serializer = function () { + + var cycleReplacer = function (key, value) { + + if (stack[0] === value) { + return '[Circular ~]'; + } + + return '[Circular ~.' + keys.slice(0, stack.indexOf(value)).join('.') + ']'; + }; + + var keys = [], stack = []; + + return function (key, value) { + + if (stack.length > 0) { + var thisPos = stack.indexOf(this); + if (~thisPos) { + stack.length = thisPos + 1; + keys.length = thisPos + 1; + keys[thisPos] = key; + } + else { + stack.push(this); + keys.push(key); + } + + if (~stack.indexOf(value)) { + value = cycleReplacer.call(this, key, value); + } + } + else { + stack.push(value); + } + + if (Array.isArray(value) && value.placeholders) { + var placeholders = value.placeholders; + var arrWithPlaceholders = []; + for (var i = 0, il = value.length; i < il; ++i) { + if (placeholders[i]) { + arrWithPlaceholders.push(placeholders[i]); + } + arrWithPlaceholders.push(value[i]); + } + + value = arrWithPlaceholders; + } + + return value; + }; +}; + + +internals.annotate = function () { + + var obj = Hoek.clone(this._object || {}); + + var lookup = {}; + var el = this.details.length; + for (var e = el - 1; e >= 0; --e) { // Reverse order to process deepest child first + var pos = el - e; + var error = this.details[e]; + var path = error.path.split('.'); + var ref = obj; + for (var i = 0, il = path.length; i < il && ref; ++i) { + var seg = path[i]; + if (i + 1 < il) { + ref = ref[seg]; + } + else { + var value = ref[seg]; + if (Array.isArray(ref)) { + var arrayLabel = '_$idx$_' + (e + 1) + '_$end$_'; + if (!ref.placeholders) { + ref.placeholders = {}; + } + + if (ref.placeholders[seg]) { + ref.placeholders[seg] = ref.placeholders[seg].replace('_$end$_', ', ' + (e + 1) + '_$end$_'); + } + else { + ref.placeholders[seg] = arrayLabel; + } + } else { + if (value !== undefined) { + delete ref[seg]; + var objectLabel = seg + '_$key$_' + pos + '_$end$_'; + ref[objectLabel] = value; + lookup[error.path] = objectLabel; + } + else if (lookup[error.path]) { + var replacement = lookup[error.path]; + var appended = replacement.replace('_$end$_', ', ' + pos + '_$end$_'); + ref[appended] = ref[replacement]; + lookup[error.path] = appended; + delete ref[replacement]; + } + else { + ref['_$miss$_' + seg + '|' + pos + '_$end$_'] = '__missing__'; + } + } + } + } + } + + var message = internals.safeStringify(obj, 2) + .replace(/_\$key\$_([, \d]+)_\$end\$_\"/g, function ($0, $1) { + + return '" \u001b[31m[' + $1 + ']\u001b[0m'; + }).replace(/\"_\$miss\$_([^\|]+)\|(\d+)_\$end\$_\"\: \"__missing__\"/g, function ($0, $1, $2) { + + return '\u001b[41m"' + $1 + '"\u001b[0m\u001b[31m [' + $2 + ']: -- missing --\u001b[0m'; + }).replace(/\s*\"_\$idx\$_([, \d]+)_\$end\$_\",?\n(.*)/g, function ($0, $1, $2) { + + return '\n' + $2 + ' \u001b[31m[' + $1 + ']\u001b[0m'; + }); + + message += '\n\u001b[31m'; + + for (e = 0; e < el; ++e) { + message += '\n[' + (e + 1) + '] ' + this.details[e].message; + } + + message += '\u001b[0m'; + + return message; +}; diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/index.js b/node_modules/jsonwebtoken/node_modules/joi/lib/index.js new file mode 100755 index 0000000..50f87b4 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/index.js @@ -0,0 +1,152 @@ +// Load modules + +var Any = require('./any'); +var Cast = require('./cast'); +var Ref = require('./ref'); + + +// Declare internals + +var internals = { + alternatives: require('./alternatives'), + array: require('./array'), + boolean: require('./boolean'), + binary: require('./binary'), + date: require('./date'), + number: require('./number'), + object: require('./object'), + string: require('./string') +}; + + +internals.root = function () { + + var any = new Any(); + + var root = any.clone(); + root.any = function () { + + return any; + }; + + root.alternatives = root.alt = function () { + + return arguments.length ? internals.alternatives.try.apply(internals.alternatives, arguments) : internals.alternatives; + }; + + root.array = function () { + + return internals.array; + }; + + root.boolean = root.bool = function () { + + return internals.boolean; + }; + + root.binary = function () { + + return internals.binary; + }; + + root.date = function () { + + return internals.date; + }; + + root.func = function () { + + return internals.object._func(); + }; + + root.number = function () { + + return internals.number; + }; + + root.object = function () { + + return arguments.length ? internals.object.keys.apply(internals.object, arguments) : internals.object; + }; + + root.string = function () { + + return internals.string; + }; + + root.ref = function () { + + return Ref.create.apply(null, arguments); + }; + + root.isRef = function (ref) { + + return Ref.isRef(ref); + }; + + root.validate = function (value /*, [schema], [options], callback */) { + + var last = arguments[arguments.length - 1]; + var callback = typeof last === 'function' ? last : null; + + var count = arguments.length - (callback ? 1 : 0); + if (count === 1) { + return any.validate(value, callback); + } + + var options = count === 3 ? arguments[2] : {}; + var schema = root.compile(arguments[1]); + + return schema._validateWithOptions(value, options, callback); + }; + + root.describe = function () { + + var schema = arguments.length ? root.compile(arguments[0]) : any; + return schema.describe(); + }; + + root.compile = function (schema) { + + try { + return Cast.schema(schema); + } + catch (err) { + if (err.hasOwnProperty('path')) { + err.message += '(' + err.path + ')'; + } + throw err; + } + }; + + root.assert = function (value, schema, message) { + + root.attempt(value, schema, message); + }; + + root.attempt = function (value, schema, message) { + + var result = root.validate(value, schema); + var error = result.error; + if (error) { + if (!message) { + error.message = error.annotate(); + throw error; + } + + if (!(message instanceof Error)) { + error.message = message + ' ' + error.annotate(); + throw error; + } + + throw message; + } + + return result.value; + }; + + return root; +}; + + +module.exports = internals.root(); diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/language.js b/node_modules/jsonwebtoken/node_modules/joi/lib/language.js new file mode 100755 index 0000000..110e3c1 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/language.js @@ -0,0 +1,125 @@ +// Load modules + + +// Declare internals + +var internals = {}; + + +exports.errors = { + root: 'value', + key: '"{{!key}}" ', + messages: { + wrapArrays: true + }, + any: { + unknown: 'is not allowed', + invalid: 'contains an invalid value', + empty: 'is not allowed to be empty', + required: 'is required', + allowOnly: 'must be one of {{valids}}', + default: 'threw an error when running default method' + }, + alternatives: { + base: 'not matching any of the allowed alternatives' + }, + array: { + base: 'must be an array', + includes: 'at position {{pos}} does not match any of the allowed types', + includesSingle: 'single value of "{{!key}}" does not match any of the allowed types', + includesOne: 'at position {{pos}} fails because {{reason}}', + includesOneSingle: 'single value of "{{!key}}" fails because {{reason}}', + includesRequiredUnknowns: 'does not contain {{unknownMisses}} required value(s)', + includesRequiredKnowns: 'does not contain {{knownMisses}}', + includesRequiredBoth: 'does not contain {{knownMisses}} and {{unknownMisses}} other required value(s)', + excludes: 'at position {{pos}} contains an excluded value', + excludesSingle: 'single value of "{{!key}}" contains an excluded value', + min: 'must contain at least {{limit}} items', + max: 'must contain less than or equal to {{limit}} items', + length: 'must contain {{limit}} items', + ordered: 'at position {{pos}} fails because {{reason}}', + orderedLength: 'at position {{pos}} fails because array must contain at most {{limit}} items', + sparse: 'must not be a sparse array', + unique: 'position {{pos}} contains a duplicate value' + }, + boolean: { + base: 'must be a boolean' + }, + binary: { + base: 'must be a buffer or a string', + min: 'must be at least {{limit}} bytes', + max: 'must be less than or equal to {{limit}} bytes', + length: 'must be {{limit}} bytes' + }, + date: { + base: 'must be a number of milliseconds or valid date string', + min: 'must be larger than or equal to "{{limit}}"', + max: 'must be less than or equal to "{{limit}}"', + isoDate: 'must be a valid ISO 8601 date', + ref: 'references "{{ref}}" which is not a date' + }, + function: { + base: 'must be a Function' + }, + object: { + base: 'must be an object', + child: 'child "{{!key}}" fails because {{reason}}', + min: 'must have at least {{limit}} children', + max: 'must have less than or equal to {{limit}} children', + length: 'must have {{limit}} children', + allowUnknown: 'is not allowed', + with: 'missing required peer "{{peer}}"', + without: 'conflict with forbidden peer "{{peer}}"', + missing: 'must contain at least one of {{peers}}', + xor: 'contains a conflict between exclusive peers {{peers}}', + or: 'must contain at least one of {{peers}}', + and: 'contains {{present}} without its required peers {{missing}}', + nand: '!!"{{main}}" must not exist simultaneously with {{peers}}', + assert: '!!"{{ref}}" validation failed because "{{ref}}" failed to {{message}}', + rename: { + multiple: 'cannot rename child "{{from}}" because multiple renames are disabled and another key was already renamed to "{{to}}"', + override: 'cannot rename child "{{from}}" because override is disabled and target "{{to}}" exists' + }, + type: 'must be an instance of "{{type}}"' + }, + number: { + base: 'must be a number', + min: 'must be larger than or equal to {{limit}}', + max: 'must be less than or equal to {{limit}}', + less: 'must be less than {{limit}}', + greater: 'must be greater than {{limit}}', + float: 'must be a float or double', + integer: 'must be an integer', + negative: 'must be a negative number', + positive: 'must be a positive number', + precision: 'must have no more than {{limit}} decimal places', + ref: 'references "{{ref}}" which is not a number', + multiple: 'must be a multiple of {{multiple}}' + }, + string: { + base: 'must be a string', + min: 'length must be at least {{limit}} characters long', + max: 'length must be less than or equal to {{limit}} characters long', + length: 'length must be {{limit}} characters long', + alphanum: 'must only contain alpha-numeric characters', + token: 'must only contain alpha-numeric and underscore characters', + regex: { + base: 'with value "{{!value}}" fails to match the required pattern: {{pattern}}', + name: 'with value "{{!value}}" fails to match the {{name}} pattern' + }, + email: 'must be a valid email', + uri: 'must be a valid uri', + uriCustomScheme: 'must be a valid uri with a scheme matching the {{scheme}} pattern', + isoDate: 'must be a valid ISO 8601 date', + guid: 'must be a valid GUID', + hex: 'must only contain hexadecimal characters', + hostname: 'must be a valid hostname', + lowercase: 'must only contain lowercase characters', + uppercase: 'must only contain uppercase characters', + trim: 'must not have leading or trailing whitespace', + creditCard: 'must be a credit card', + ref: 'references "{{ref}}" which is not a number', + ip: 'must be a valid ip address with a {{cidr}} CIDR', + ipVersion: 'must be a valid ip address of one of the following versions {{version}} with a {{cidr}} CIDR' + } +}; diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/number.js b/node_modules/jsonwebtoken/node_modules/joi/lib/number.js new file mode 100755 index 0000000..b2a8be3 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/number.js @@ -0,0 +1,184 @@ +// Load modules + +var Any = require('./any'); +var Ref = require('./ref'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Number = function () { + + Any.call(this); + this._type = 'number'; + this._invalids.add(Infinity); + this._invalids.add(-Infinity); +}; + +Hoek.inherits(internals.Number, Any); + +internals.compare = function (type, compare) { + + return function (limit) { + + var isRef = Ref.isRef(limit); + var isNumber = typeof limit === 'number' && !isNaN(limit); + + Hoek.assert(isNumber || isRef, 'limit must be a number or reference'); + + return this._test(type, limit, function (value, state, options) { + + var compareTo; + if (isRef) { + compareTo = limit(state.parent, options); + + if (!(typeof compareTo === 'number' && !isNaN(compareTo))) { + return Errors.create('number.ref', { ref: limit.key }, state, options); + } + } + else { + compareTo = limit; + } + + if (compare(value, compareTo)) { + return null; + } + + return Errors.create('number.' + type, { limit: compareTo, value: value }, state, options); + }); + }; +}; + + +internals.Number.prototype._base = function (value, state, options) { + + var result = { + errors: null, + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + var number = parseFloat(value); + result.value = (isNaN(number) || !isFinite(value)) ? NaN : number; + } + + var isNumber = typeof result.value === 'number' && !isNaN(result.value); + + if (options.convert && 'precision' in this._flags && isNumber) { + + // This is conceptually equivalent to using toFixed but it should be much faster + var precision = Math.pow(10, this._flags.precision); + result.value = Math.round(result.value * precision) / precision; + } + + result.errors = isNumber ? null : Errors.create('number.base', null, state, options); + return result; +}; + + +internals.Number.prototype.min = internals.compare('min', function (value, limit) { + + return value >= limit; +}); + + +internals.Number.prototype.max = internals.compare('max', function (value, limit) { + + return value <= limit; +}); + + +internals.Number.prototype.greater = internals.compare('greater', function (value, limit) { + + return value > limit; +}); + + +internals.Number.prototype.less = internals.compare('less', function (value, limit) { + + return value < limit; +}); + + +internals.Number.prototype.multiple = function (base) { + + Hoek.assert(Hoek.isInteger(base), 'multiple must be an integer'); + Hoek.assert(base > 0, 'multiple must be greater than 0'); + + return this._test('multiple', base, function (value, state, options) { + + if (value % base === 0) { + return null; + } + + return Errors.create('number.multiple', { multiple: base, value: value }, state, options); + }); +}; + + +internals.Number.prototype.integer = function () { + + return this._test('integer', undefined, function (value, state, options) { + + return Hoek.isInteger(value) ? null : Errors.create('number.integer', { value: value }, state, options); + }); +}; + + +internals.Number.prototype.negative = function () { + + return this._test('negative', undefined, function (value, state, options) { + + if (value < 0) { + return null; + } + + return Errors.create('number.negative', { value: value }, state, options); + }); +}; + + +internals.Number.prototype.positive = function () { + + return this._test('positive', undefined, function (value, state, options) { + + if (value > 0) { + return null; + } + + return Errors.create('number.positive', { value: value }, state, options); + }); +}; + + +internals.precisionRx = /(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/; + + +internals.Number.prototype.precision = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + Hoek.assert(!('precision' in this._flags), 'precision already set'); + + var obj = this._test('precision', limit, function (value, state, options){ + + var places = value.toString().match(internals.precisionRx); + var decimals = Math.max((places[1] ? places[1].length : 0) - (places[2] ? parseInt(places[2], 10) : 0), 0); + if (decimals <= limit) { + return null; + } + + return Errors.create('number.precision', { limit: limit, value: value }, state, options); + }); + + obj._flags.precision = limit; + return obj; +}; + + +module.exports = new internals.Number(); diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/object.js b/node_modules/jsonwebtoken/node_modules/joi/lib/object.js new file mode 100755 index 0000000..1e15c98 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/object.js @@ -0,0 +1,754 @@ +// Load modules + +var Hoek = require('hoek'); +var Topo = require('topo'); +var Any = require('./any'); +var Cast = require('./cast'); +var Errors = require('./errors'); + + +// Declare internals + +var internals = {}; + + +internals.Object = function () { + + Any.call(this); + this._type = 'object'; + this._inner.children = null; + this._inner.renames = []; + this._inner.dependencies = []; + this._inner.patterns = []; +}; + +Hoek.inherits(internals.Object, Any); + + +internals.Object.prototype._base = function (value, state, options) { + + var item, key, localState, result; + var target = value; + var errors = []; + var finish = function () { + + return { + value: target, + errors: errors.length ? errors : null + }; + }; + + if (typeof value === 'string' && + options.convert) { + + try { + value = JSON.parse(value); + } + catch (parseErr) { } + } + + var type = this._flags.func ? 'function' : 'object'; + if (!value || + typeof value !== type || + Array.isArray(value)) { + + errors.push(Errors.create(type + '.base', null, state, options)); + return finish(); + } + + // Skip if there are no other rules to test + + if (!this._inner.renames.length && + !this._inner.dependencies.length && + !this._inner.children && // null allows any keys + !this._inner.patterns.length) { + + target = value; + return finish(); + } + + // Ensure target is a local copy (parsed) or shallow copy + + if (target === value) { + if (type === 'object') { + target = Object.create(Object.getPrototypeOf(value)); + } + else { + target = function () { + + return value.apply(this, arguments); + }; + + target.prototype = Hoek.clone(value.prototype); + } + + var valueKeys = Object.keys(value); + for (var t = 0, tl = valueKeys.length; t < tl; ++t) { + target[valueKeys[t]] = value[valueKeys[t]]; + } + } + else { + target = value; + } + + // Rename keys + + var renamed = {}; + for (var r = 0, rl = this._inner.renames.length; r < rl; ++r) { + item = this._inner.renames[r]; + + if (item.options.ignoreUndefined && target[item.from] === undefined) { + continue; + } + + if (!item.options.multiple && + renamed[item.to]) { + + errors.push(Errors.create('object.rename.multiple', { from: item.from, to: item.to }, state, options)); + if (options.abortEarly) { + return finish(); + } + } + + if (Object.prototype.hasOwnProperty.call(target, item.to) && + !item.options.override && + !renamed[item.to]) { + + errors.push(Errors.create('object.rename.override', { from: item.from, to: item.to }, state, options)); + if (options.abortEarly) { + return finish(); + } + } + + if (target[item.from] === undefined) { + delete target[item.to]; + } + else { + target[item.to] = target[item.from]; + } + + renamed[item.to] = true; + + if (!item.options.alias) { + delete target[item.from]; + } + } + + // Validate schema + + if (!this._inner.children && // null allows any keys + !this._inner.patterns.length && + !this._inner.dependencies.length) { + + return finish(); + } + + var unprocessed = Hoek.mapToObject(Object.keys(target)); + + if (this._inner.children) { + for (var i = 0, il = this._inner.children.length; i < il; ++i) { + var child = this._inner.children[i]; + key = child.key; + item = target[key]; + + delete unprocessed[key]; + + localState = { key: key, path: (state.path || '') + (state.path && key ? '.' : '') + key, parent: target, reference: state.reference }; + result = child.schema._validate(item, localState, options); + if (result.errors) { + errors.push(Errors.create('object.child', { key: key, reason: result.errors }, localState, options)); + + if (options.abortEarly) { + return finish(); + } + } + + if (child.schema._flags.strip || (result.value === undefined && result.value !== item)) { + delete target[key]; + } + else if (result.value !== undefined) { + target[key] = result.value; + } + } + } + + // Unknown keys + + var unprocessedKeys = Object.keys(unprocessed); + if (unprocessedKeys.length && + this._inner.patterns.length) { + + for (i = 0, il = unprocessedKeys.length; i < il; ++i) { + key = unprocessedKeys[i]; + + for (var p = 0, pl = this._inner.patterns.length; p < pl; ++p) { + var pattern = this._inner.patterns[p]; + + if (pattern.regex.test(key)) { + delete unprocessed[key]; + + item = target[key]; + localState = { key: key, path: (state.path ? state.path + '.' : '') + key, parent: target, reference: state.reference }; + result = pattern.rule._validate(item, localState, options); + if (result.errors) { + errors.push(Errors.create('object.child', { key: key, reason: result.errors }, localState, options)); + + if (options.abortEarly) { + return finish(); + } + } + + if (result.value !== undefined) { + target[key] = result.value; + } + } + } + } + + unprocessedKeys = Object.keys(unprocessed); + } + + if ((this._inner.children || this._inner.patterns.length) && unprocessedKeys.length) { + if (options.stripUnknown || + options.skipFunctions) { + + for (var k = 0, kl = unprocessedKeys.length; k < kl; ++k) { + key = unprocessedKeys[k]; + + if (options.stripUnknown) { + delete target[key]; + delete unprocessed[key]; + } + else if (typeof target[key] === 'function') { + delete unprocessed[key]; + } + } + + unprocessedKeys = Object.keys(unprocessed); + } + + if (unprocessedKeys.length && + (this._flags.allowUnknown !== undefined ? !this._flags.allowUnknown : !options.allowUnknown)) { + + for (var e = 0, el = unprocessedKeys.length; e < el; ++e) { + errors.push(Errors.create('object.allowUnknown', null, { key: unprocessedKeys[e], path: state.path + (state.path ? '.' : '') + unprocessedKeys[e] }, options)); + } + } + } + + // Validate dependencies + + for (var d = 0, dl = this._inner.dependencies.length; d < dl; ++d) { + var dep = this._inner.dependencies[d]; + var err = internals[dep.type](dep.key !== null && value[dep.key], dep.peers, target, { key: dep.key, path: (state.path || '') + (dep.key ? '.' + dep.key : '') }, options); + if (err) { + errors.push(err); + if (options.abortEarly) { + return finish(); + } + } + } + + return finish(); +}; + + +internals.Object.prototype._func = function () { + + var obj = this.clone(); + obj._flags.func = true; + return obj; +}; + + +internals.Object.prototype.keys = function (schema) { + + Hoek.assert(schema === null || schema === undefined || typeof schema === 'object', 'Object schema must be a valid object'); + Hoek.assert(!schema || !schema.isJoi, 'Object schema cannot be a joi schema'); + + var obj = this.clone(); + + if (!schema) { + obj._inner.children = null; + return obj; + } + + var children = Object.keys(schema); + + if (!children.length) { + obj._inner.children = []; + return obj; + } + + var topo = new Topo(); + var child; + if (obj._inner.children) { + for (var i = 0, il = obj._inner.children.length; i < il; ++i) { + child = obj._inner.children[i]; + + // Only add the key if we are not going to replace it later + if (children.indexOf(child.key) === -1) { + topo.add(child, { after: child._refs, group: child.key }); + } + } + } + + for (var c = 0, cl = children.length; c < cl; ++c) { + var key = children[c]; + child = schema[key]; + try { + var cast = Cast.schema(child); + topo.add({ key: key, schema: cast }, { after: cast._refs, group: key }); + } + catch (castErr) { + if (castErr.hasOwnProperty('path')) { + castErr.path = key + '.' + castErr.path; + } + else { + castErr.path = key; + } + throw castErr; + } + } + + obj._inner.children = topo.nodes; + + return obj; +}; + + +internals.Object.prototype.unknown = function (allow) { + + var obj = this.clone(); + obj._flags.allowUnknown = (allow !== false); + return obj; +}; + + +internals.Object.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (Object.keys(value).length === limit) { + return null; + } + + return Errors.create('object.length', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (Object.keys(value).length >= limit) { + return null; + } + + return Errors.create('object.min', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (Object.keys(value).length <= limit) { + return null; + } + + return Errors.create('object.max', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.pattern = function (pattern, schema) { + + Hoek.assert(pattern instanceof RegExp, 'Invalid regular expression'); + Hoek.assert(schema !== undefined, 'Invalid rule'); + + pattern = new RegExp(pattern.source, pattern.ignoreCase ? 'i' : undefined); // Future version should break this and forbid unsupported regex flags + + try { + schema = Cast.schema(schema); + } + catch (castErr) { + if (castErr.hasOwnProperty('path')) { + castErr.message += '(' + castErr.path + ')'; + } + + throw castErr; + } + + + var obj = this.clone(); + obj._inner.patterns.push({ regex: pattern, rule: schema }); + return obj; +}; + + +internals.Object.prototype.with = function (key, peers) { + + return this._dependency('with', key, peers); +}; + + +internals.Object.prototype.without = function (key, peers) { + + return this._dependency('without', key, peers); +}; + + +internals.Object.prototype.xor = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('xor', null, peers); +}; + + +internals.Object.prototype.or = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('or', null, peers); +}; + + +internals.Object.prototype.and = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('and', null, peers); +}; + + +internals.Object.prototype.nand = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('nand', null, peers); +}; + + +internals.Object.prototype.requiredKeys = function (children) { + + children = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this.applyFunctionToChildren(children, 'required'); +}; + + +internals.Object.prototype.optionalKeys = function (children) { + + children = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this.applyFunctionToChildren(children, 'optional'); +}; + + +internals.renameDefaults = { + alias: false, // Keep old value in place + multiple: false, // Allow renaming multiple keys into the same target + override: false // Overrides an existing key +}; + + +internals.Object.prototype.rename = function (from, to, options) { + + Hoek.assert(typeof from === 'string', 'Rename missing the from argument'); + Hoek.assert(typeof to === 'string', 'Rename missing the to argument'); + Hoek.assert(to !== from, 'Cannot rename key to same name:', from); + + for (var i = 0, il = this._inner.renames.length; i < il; ++i) { + Hoek.assert(this._inner.renames[i].from !== from, 'Cannot rename the same key multiple times'); + } + + var obj = this.clone(); + + obj._inner.renames.push({ + from: from, + to: to, + options: Hoek.applyToDefaults(internals.renameDefaults, options || {}) + }); + + return obj; +}; + + +internals.groupChildren = function (children) { + + children.sort(); + + var grouped = {}; + + for (var c = 0, lc = children.length; c < lc; c++) { + var child = children[c]; + Hoek.assert(typeof child === 'string', 'children must be strings'); + var group = child.split('.')[0]; + var childGroup = grouped[group] = (grouped[group] || []); + childGroup.push(child.substring(group.length + 1)); + } + + return grouped; +}; + + +internals.Object.prototype.applyFunctionToChildren = function (children, fn, args, root) { + + children = [].concat(children); + Hoek.assert(children.length > 0, 'expected at least one children'); + + var groupedChildren = internals.groupChildren(children); + var obj; + + if ('' in groupedChildren) { + obj = this[fn].apply(this, args); + delete groupedChildren['']; + } + else { + obj = this.clone(); + } + + if (obj._inner.children) { + root = root ? (root + '.') : ''; + + for (var i = 0, il = obj._inner.children.length; i < il; ++i) { + var child = obj._inner.children[i]; + var group = groupedChildren[child.key]; + + if (group) { + obj._inner.children[i] = { + key: child.key, + _refs: child._refs, + schema: child.schema.applyFunctionToChildren(group, fn, args, root + child.key) + }; + + delete groupedChildren[child.key]; + } + } + } + + var remaining = Object.keys(groupedChildren); + Hoek.assert(remaining.length === 0, 'unknown key(s)', remaining.join(', ')); + + return obj; +}; + + +internals.Object.prototype._dependency = function (type, key, peers) { + + peers = [].concat(peers); + for (var i = 0, li = peers.length; i < li; i++) { + Hoek.assert(typeof peers[i] === 'string', type, 'peers must be a string or array of strings'); + } + + var obj = this.clone(); + obj._inner.dependencies.push({ type: type, key: key, peers: peers }); + return obj; +}; + + +internals.with = function (value, peers, parent, state, options) { + + if (value === undefined) { + return null; + } + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (!Object.prototype.hasOwnProperty.call(parent, peer) || + parent[peer] === undefined) { + + return Errors.create('object.with', { peer: peer }, state, options); + } + } + + return null; +}; + + +internals.without = function (value, peers, parent, state, options) { + + if (value === undefined) { + return null; + } + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (Object.prototype.hasOwnProperty.call(parent, peer) && + parent[peer] !== undefined) { + + return Errors.create('object.without', { peer: peer }, state, options); + } + } + + return null; +}; + + +internals.xor = function (value, peers, parent, state, options) { + + var present = []; + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (Object.prototype.hasOwnProperty.call(parent, peer) && + parent[peer] !== undefined) { + + present.push(peer); + } + } + + if (present.length === 1) { + return null; + } + + if (present.length === 0) { + return Errors.create('object.missing', { peers: peers }, state, options); + } + + return Errors.create('object.xor', { peers: peers }, state, options); +}; + + +internals.or = function (value, peers, parent, state, options) { + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (Object.prototype.hasOwnProperty.call(parent, peer) && + parent[peer] !== undefined) { + return null; + } + } + + return Errors.create('object.missing', { peers: peers }, state, options); +}; + + +internals.and = function (value, peers, parent, state, options) { + + var missing = []; + var present = []; + var count = peers.length; + for (var i = 0; i < count; ++i) { + var peer = peers[i]; + if (!Object.prototype.hasOwnProperty.call(parent, peer) || + parent[peer] === undefined) { + + missing.push(peer); + } + else { + present.push(peer); + } + } + + var aon = (missing.length === count || present.length === count); + return !aon ? Errors.create('object.and', { present: present, missing: missing }, state, options) : null; +}; + + +internals.nand = function (value, peers, parent, state, options) { + + var present = []; + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (Object.prototype.hasOwnProperty.call(parent, peer) && + parent[peer] !== undefined) { + + present.push(peer); + } + } + + var values = Hoek.clone(peers); + var main = values.splice(0, 1)[0]; + var allPresent = (present.length === peers.length); + return allPresent ? Errors.create('object.nand', { main: main, peers: values }, state, options) : null; +}; + + +internals.Object.prototype.describe = function (shallow) { + + var description = Any.prototype.describe.call(this); + + if (this._inner.children && + !shallow) { + + description.children = {}; + for (var i = 0, il = this._inner.children.length; i < il; ++i) { + var child = this._inner.children[i]; + description.children[child.key] = child.schema.describe(); + } + } + + if (this._inner.dependencies.length) { + description.dependencies = Hoek.clone(this._inner.dependencies); + } + + if (this._inner.patterns.length) { + description.patterns = []; + + for (var p = 0, pl = this._inner.patterns.length; p < pl; ++p) { + var pattern = this._inner.patterns[p]; + description.patterns.push({ regex: pattern.regex.toString(), rule: pattern.rule.describe() }); + } + } + + return description; +}; + + +internals.Object.prototype.assert = function (ref, schema, message) { + + ref = Cast.ref(ref); + Hoek.assert(ref.isContext || ref.depth > 1, 'Cannot use assertions for root level references - use direct key rules instead'); + message = message || 'pass the assertion test'; + + var cast; + try { + cast = Cast.schema(schema); + } + catch (castErr) { + if (castErr.hasOwnProperty('path')) { + castErr.message += '(' + castErr.path + ')'; + } + + throw castErr; + } + + var key = ref.path[ref.path.length - 1]; + var path = ref.path.join('.'); + + return this._test('assert', { cast: cast, ref: ref }, function (value, state, options) { + + var result = cast._validate(ref(value), null, options, value); + if (!result.errors) { + return null; + } + + var localState = Hoek.merge({}, state); + localState.key = key; + localState.path = path; + return Errors.create('object.assert', { ref: localState.path, message: message }, localState, options); + }); +}; + + +internals.Object.prototype.type = function (constructor, name) { + + Hoek.assert(typeof constructor === 'function', 'type must be a constructor function'); + name = name || constructor.name; + + return this._test('type', name, function (value, state, options) { + + if (value instanceof constructor) { + return null; + } + + return Errors.create('object.type', { type: name }, state, options); + }); +}; + + +module.exports = new internals.Object(); diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/ref.js b/node_modules/jsonwebtoken/node_modules/joi/lib/ref.js new file mode 100755 index 0000000..c87c483 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/ref.js @@ -0,0 +1,51 @@ +// Load modules + +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +exports.create = function (key, options) { + + Hoek.assert(typeof key === 'string', 'Invalid reference key:', key); + + var settings = Hoek.clone(options); // options can be reused and modified + + var ref = function (value, validationOptions) { + + return Hoek.reach(ref.isContext ? validationOptions.context : value, ref.key, settings); + }; + + ref.isContext = (key[0] === ((settings && settings.contextPrefix) || '$')); + ref.key = (ref.isContext ? key.slice(1) : key); + ref.path = ref.key.split((settings && settings.separator) || '.'); + ref.depth = ref.path.length; + ref.root = ref.path[0]; + ref.isJoi = true; + + ref.toString = function () { + + return (ref.isContext ? 'context:' : 'ref:') + ref.key; + }; + + return ref; +}; + + +exports.isRef = function (ref) { + + return typeof ref === 'function' && ref.isJoi; +}; + + +exports.push = function (array, ref) { + + if (exports.isRef(ref) && + !ref.isContext) { + + array.push(ref.root); + } +}; diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/string.js b/node_modules/jsonwebtoken/node_modules/joi/lib/string.js new file mode 100755 index 0000000..68edef9 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/string.js @@ -0,0 +1,468 @@ +// Load modules + +var Net = require('net'); +var Hoek = require('hoek'); +var Isemail = require('isemail'); +var Any = require('./any'); +var Ref = require('./ref'); +var JoiDate = require('./date'); +var Errors = require('./errors'); +var Uri = require('./string/uri'); +var Ip = require('./string/ip'); + +// Declare internals + +var internals = { + uriRegex: Uri.createUriRegex(), + ipRegex: Ip.createIpRegex(['ipv4', 'ipv6', 'ipvfuture'], 'optional') +}; + +internals.String = function () { + + Any.call(this); + this._type = 'string'; + this._invalids.add(''); +}; + +Hoek.inherits(internals.String, Any); + +internals.compare = function (type, compare) { + + return function (limit, encoding) { + + var isRef = Ref.isRef(limit); + + Hoek.assert((Hoek.isInteger(limit) && limit >= 0) || isRef, 'limit must be a positive integer or reference'); + Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + return this._test(type, limit, function (value, state, options) { + + var compareTo; + if (isRef) { + compareTo = limit(state.parent, options); + + if (!Hoek.isInteger(compareTo)) { + return Errors.create('string.ref', { ref: limit.key }, state, options); + } + } + else { + compareTo = limit; + } + + if (compare(value, compareTo, encoding)) { + return null; + } + + return Errors.create('string.' + type, { limit: compareTo, value: value, encoding: encoding }, state, options); + }); + }; +}; + +internals.String.prototype._base = function (value, state, options) { + + if (typeof value === 'string' && + options.convert) { + + if (this._flags.case) { + value = (this._flags.case === 'upper' ? value.toLocaleUpperCase() : value.toLocaleLowerCase()); + } + + if (this._flags.trim) { + value = value.trim(); + } + + if (this._inner.replacements) { + + for (var r = 0, rl = this._inner.replacements.length; r < rl; ++r) { + var replacement = this._inner.replacements[r]; + value = value.replace(replacement.pattern, replacement.replacement); + } + } + } + + return { + value: value, + errors: (typeof value === 'string') ? null : Errors.create('string.base', { value: value }, state, options) + }; +}; + + +internals.String.prototype.insensitive = function () { + + var obj = this.clone(); + obj._flags.insensitive = true; + return obj; +}; + + +internals.String.prototype.min = internals.compare('min', function (value, limit, encoding) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + return length >= limit; +}); + + +internals.String.prototype.max = internals.compare('max', function (value, limit, encoding) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + return length <= limit; +}); + + +internals.String.prototype.creditCard = function () { + + return this._test('creditCard', undefined, function (value, state, options) { + + var i = value.length; + var sum = 0; + var mul = 1; + var char; + + while (i--) { + char = value.charAt(i) * mul; + sum += char - (char > 9) * 9; + mul ^= 3; + } + + var check = (sum % 10 === 0) && (sum > 0); + return check ? null : Errors.create('string.creditCard', { value: value }, state, options); + }); +}; + +internals.String.prototype.length = internals.compare('length', function (value, limit, encoding) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + return length === limit; +}); + + +internals.String.prototype.regex = function (pattern, name) { + + Hoek.assert(pattern instanceof RegExp, 'pattern must be a RegExp'); + + pattern = new RegExp(pattern.source, pattern.ignoreCase ? 'i' : undefined); // Future version should break this and forbid unsupported regex flags + + return this._test('regex', pattern, function (value, state, options) { + + if (pattern.test(value)) { + return null; + } + + return Errors.create((name ? 'string.regex.name' : 'string.regex.base'), { name: name, pattern: pattern, value: value }, state, options); + }); +}; + + +internals.String.prototype.alphanum = function () { + + return this._test('alphanum', undefined, function (value, state, options) { + + if (/^[a-zA-Z0-9]+$/.test(value)) { + return null; + } + + return Errors.create('string.alphanum', { value: value }, state, options); + }); +}; + + +internals.String.prototype.token = function () { + + return this._test('token', undefined, function (value, state, options) { + + if (/^\w+$/.test(value)) { + return null; + } + + return Errors.create('string.token', { value: value }, state, options); + }); +}; + + +internals.String.prototype.email = function (isEmailOptions) { + + if (isEmailOptions) { + Hoek.assert(typeof isEmailOptions === 'object', 'email options must be an object'); + Hoek.assert(typeof isEmailOptions.checkDNS === 'undefined', 'checkDNS option is not supported'); + Hoek.assert(typeof isEmailOptions.tldWhitelist === 'undefined' || + typeof isEmailOptions.tldWhitelist === 'object', 'tldWhitelist must be an array or object'); + Hoek.assert(typeof isEmailOptions.minDomainAtoms === 'undefined' || + Hoek.isInteger(isEmailOptions.minDomainAtoms) && isEmailOptions.minDomainAtoms > 0, + 'minDomainAtoms must be a positive integer'); + Hoek.assert(typeof isEmailOptions.errorLevel === 'undefined' || typeof isEmailOptions.errorLevel === 'boolean' || + (Hoek.isInteger(isEmailOptions.errorLevel) && isEmailOptions.errorLevel >= 0), + 'errorLevel must be a non-negative integer or boolean'); + } + + return this._test('email', isEmailOptions, function (value, state, options) { + + try { + var result = Isemail(value, isEmailOptions); + if (result === true || result === 0) { + return null; + } + } + catch (e) {} + + return Errors.create('string.email', { value: value }, state, options); + }); +}; + + +internals.String.prototype.ip = function (ipOptions) { + + var regex = internals.ipRegex; + ipOptions = ipOptions || {}; + Hoek.assert(typeof ipOptions === 'object', 'options must be an object'); + + if (ipOptions.cidr) { + Hoek.assert(typeof ipOptions.cidr === 'string', 'cidr must be a string'); + ipOptions.cidr = ipOptions.cidr.toLowerCase(); + + Hoek.assert(ipOptions.cidr in Ip.cidrs, 'cidr must be one of ' + Object.keys(Ip.cidrs).join(', ')); + + // If we only received a `cidr` setting, create a regex for it. But we don't need to create one if `cidr` is "optional" since that is the default + if (!ipOptions.version && ipOptions.cidr !== 'optional') { + regex = Ip.createIpRegex(['ipv4', 'ipv6', 'ipvfuture'], ipOptions.cidr); + } + } + else { + + // Set our default cidr strategy + ipOptions.cidr = 'optional'; + } + + if (ipOptions.version) { + if (!Array.isArray(ipOptions.version)) { + ipOptions.version = [ipOptions.version]; + } + + Hoek.assert(ipOptions.version.length >= 1, 'version must have at least 1 version specified'); + + var versions = []; + for (var i = 0, il = ipOptions.version.length; i < il; ++i) { + var version = ipOptions.version[i]; + Hoek.assert(typeof version === 'string', 'version at position ' + i + ' must be a string'); + version = version.toLowerCase(); + Hoek.assert(Ip.versions[version], 'version at position ' + i + ' must be one of ' + Object.keys(Ip.versions).join(', ')); + versions.push(version); + } + + // Make sure we have a set of versions + versions = Hoek.unique(versions); + + regex = Ip.createIpRegex(versions, ipOptions.cidr); + } + + return this._test('ip', ipOptions, function (value, state, options) { + + if (regex.test(value)) { + return null; + } + + if (versions) { + return Errors.create('string.ipVersion', { value: value, cidr: ipOptions.cidr, version: versions }, state, options); + } + + return Errors.create('string.ip', { value: value, cidr: ipOptions.cidr }, state, options); + }); +}; + + +internals.String.prototype.uri = function (uriOptions) { + + var customScheme = '', + regex = internals.uriRegex; + + if (uriOptions) { + Hoek.assert(typeof uriOptions === 'object', 'options must be an object'); + + if (uriOptions.scheme) { + Hoek.assert(uriOptions.scheme instanceof RegExp || typeof uriOptions.scheme === 'string' || Array.isArray(uriOptions.scheme), 'scheme must be a RegExp, String, or Array'); + + if (!Array.isArray(uriOptions.scheme)) { + uriOptions.scheme = [uriOptions.scheme]; + } + + Hoek.assert(uriOptions.scheme.length >= 1, 'scheme must have at least 1 scheme specified'); + + // Flatten the array into a string to be used to match the schemes. + for (var i = 0, il = uriOptions.scheme.length; i < il; ++i) { + var scheme = uriOptions.scheme[i]; + Hoek.assert(scheme instanceof RegExp || typeof scheme === 'string', 'scheme at position ' + i + ' must be a RegExp or String'); + + // Add OR separators if a value already exists + customScheme += customScheme ? '|' : ''; + + // If someone wants to match HTTP or HTTPS for example then we need to support both RegExp and String so we don't escape their pattern unknowingly. + if (scheme instanceof RegExp) { + customScheme += scheme.source; + } + else { + Hoek.assert(/[a-zA-Z][a-zA-Z0-9+-\.]*/.test(scheme), 'scheme at position ' + i + ' must be a valid scheme'); + customScheme += Hoek.escapeRegex(scheme); + } + } + } + } + + if (customScheme) { + regex = Uri.createUriRegex(customScheme); + } + + return this._test('uri', uriOptions, function (value, state, options) { + + if (regex.test(value)) { + return null; + } + + if (customScheme) { + return Errors.create('string.uriCustomScheme', { scheme: customScheme, value: value }, state, options); + } + + return Errors.create('string.uri', { value: value }, state, options); + }); +}; + + +internals.String.prototype.isoDate = function () { + + return this._test('isoDate', undefined, function (value, state, options) { + + if (JoiDate._isIsoDate(value)) { + return null; + } + + return Errors.create('string.isoDate', { value: value }, state, options); + }); +}; + + +internals.String.prototype.guid = function () { + + var regex = /^[A-F0-9]{8}(?:-?[A-F0-9]{4}){3}-?[A-F0-9]{12}$/i; + var regex2 = /^\{[A-F0-9]{8}(?:-?[A-F0-9]{4}){3}-?[A-F0-9]{12}\}$/i; + + return this._test('guid', undefined, function (value, state, options) { + + if (regex.test(value) || regex2.test(value)) { + return null; + } + + return Errors.create('string.guid', { value: value }, state, options); + }); +}; + + +internals.String.prototype.hex = function () { + + var regex = /^[a-f0-9]+$/i; + + return this._test('hex', regex, function (value, state, options) { + + if (regex.test(value)) { + return null; + } + + return Errors.create('string.hex', { value: value }, state, options); + }); +}; + + +internals.String.prototype.hostname = function () { + + var regex = /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/; + + return this._test('hostname', undefined, function (value, state, options) { + + if ((value.length <= 255 && regex.test(value)) || + Net.isIPv6(value)) { + + return null; + } + + return Errors.create('string.hostname', { value: value }, state, options); + }); +}; + + +internals.String.prototype.lowercase = function () { + + var obj = this._test('lowercase', undefined, function (value, state, options) { + + if (options.convert || + value === value.toLocaleLowerCase()) { + + return null; + } + + return Errors.create('string.lowercase', { value: value }, state, options); + }); + + obj._flags.case = 'lower'; + return obj; +}; + + +internals.String.prototype.uppercase = function () { + + var obj = this._test('uppercase', undefined, function (value, state, options) { + + if (options.convert || + value === value.toLocaleUpperCase()) { + + return null; + } + + return Errors.create('string.uppercase', { value: value }, state, options); + }); + + obj._flags.case = 'upper'; + return obj; +}; + + +internals.String.prototype.trim = function () { + + var obj = this._test('trim', undefined, function (value, state, options) { + + if (options.convert || + value === value.trim()) { + + return null; + } + + return Errors.create('string.trim', { value: value }, state, options); + }); + + obj._flags.trim = true; + return obj; +}; + + +internals.String.prototype.replace = function (pattern, replacement) { + + if (typeof pattern === 'string') { + pattern = new RegExp(Hoek.escapeRegex(pattern), 'g'); + } + + Hoek.assert(pattern instanceof RegExp, 'pattern must be a RegExp'); + Hoek.assert(typeof replacement === 'string', 'replacement must be a String'); + + // This can not be considere a test like trim, we can't "reject" + // anything from this rule, so just clone the current object + var obj = this.clone(); + + if (!obj._inner.replacements) { + obj._inner.replacements = []; + } + + obj._inner.replacements.push({ + pattern: pattern, + replacement: replacement + }); + + return obj; +}; + +module.exports = new internals.String(); diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/string/ip.js b/node_modules/jsonwebtoken/node_modules/joi/lib/string/ip.js new file mode 100644 index 0000000..f086c5b --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/string/ip.js @@ -0,0 +1,32 @@ +var RFC3986 = require('./rfc3986'); + +var internals = { + Ip: { + cidrs: { + required: '\\/(?:' + RFC3986.cidr + ')', + optional: '(?:\\/(?:' + RFC3986.cidr + '))?', + forbidden: '' + }, + versions: { + ipv4: RFC3986.IPv4address, + ipv6: RFC3986.IPv6address, + ipvfuture: RFC3986.IPvFuture + } + } +}; + +internals.Ip.createIpRegex = function (versions, cidr) { + + var regex; + for (var i = 0, il = versions.length; i < il; ++i) { + var version = versions[i]; + if (!regex) { + regex = '^(?:' + internals.Ip.versions[version]; + } + regex += '|' + internals.Ip.versions[version]; + } + + return new RegExp(regex + ')' + internals.Ip.cidrs[cidr] + '$'); +}; + +module.exports = internals.Ip; diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/string/rfc3986.js b/node_modules/jsonwebtoken/node_modules/joi/lib/string/rfc3986.js new file mode 100644 index 0000000..b5ca375 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/string/rfc3986.js @@ -0,0 +1,174 @@ +var internals = { + rfc3986: {} +}; + +/** + * elements separated by forward slash ("/") are alternatives. + */ +var or = '|'; + +/** + * DIGIT = %x30-39 ; 0-9 + */ +var digit = '0-9'; +var digitOnly = '[' + digit + ']'; + +/** + * ALPHA = %x41-5A / %x61-7A ; A-Z / a-z + */ +var alpha = 'a-zA-Z'; +var alphaOnly = '[' + alpha + ']'; + +/** + * cidr = DIGIT ; 0-9 + * / %x31-32 DIGIT ; 10-29 + * / "3" %x30-32 ; 30-32 + */ +internals.rfc3986.cidr = digitOnly + or + '[1-2]' + digitOnly + or + '3' + '[0-2]'; + +/** + * HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" + */ +var hexDigit = digit + 'A-Fa-f', + hexDigitOnly = '[' + hexDigit + ']'; + +/** + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + */ +var unreserved = alpha + digit + '-\\._~'; + +/** + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" + */ +var subDelims = '!\\$&\'\\(\\)\\*\\+,;='; + +/** + * pct-encoded = "%" HEXDIG HEXDIG + */ +var pctEncoded = '%' + hexDigit; + +/** + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + */ +var pchar = unreserved + pctEncoded + subDelims + ':@'; +var pcharOnly = '[' + pchar + ']'; + +/** + * Rule to support zero-padded addresses. + */ +var zeroPad = '0?'; + +/** + * dec-octet = DIGIT ; 0-9 + * / %x31-39 DIGIT ; 10-99 + * / "1" 2DIGIT ; 100-199 + * / "2" %x30-34 DIGIT ; 200-249 + * / "25" %x30-35 ; 250-255 + */ +var decOctect = '(?:' + zeroPad + zeroPad + digitOnly + or + zeroPad + '[1-9]' + digitOnly + or + '1' + digitOnly + digitOnly + or + '2' + '[0-4]' + digitOnly + or + '25' + '[0-5])'; + +/** + * IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet + */ +internals.rfc3986.IPv4address = '(?:' + decOctect + '\\.){3}' + decOctect; + +/** + * h16 = 1*4HEXDIG ; 16 bits of address represented in hexadecimal + * ls32 = ( h16 ":" h16 ) / IPv4address ; least-significant 32 bits of address + * IPv6address = 6( h16 ":" ) ls32 + * / "::" 5( h16 ":" ) ls32 + * / [ h16 ] "::" 4( h16 ":" ) ls32 + * / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + * / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + * / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + * / [ *4( h16 ":" ) h16 ] "::" ls32 + * / [ *5( h16 ":" ) h16 ] "::" h16 + * / [ *6( h16 ":" ) h16 ] "::" + */ +var h16 = hexDigitOnly + '{1,4}'; +var ls32 = '(?:' + h16 + ':' + h16 + '|' + internals.rfc3986.IPv4address + ')'; +var IPv6SixHex = '(?:' + h16 + ':){6}' + ls32; +var IPv6FiveHex = '::(?:' + h16 + ':){5}' + ls32; +var IPv6FourHex = h16 + '::(?:' + h16 + ':){4}' + ls32; +var IPv6ThreeHex = '(?:' + h16 + ':){0,1}' + h16 + '::(?:' + h16 + ':){3}' + ls32; +var IPv6TwoHex = '(?:' + h16 + ':){0,2}' + h16 + '::(?:' + h16 + ':){2}' + ls32; +var IPv6OneHex = '(?:' + h16 + ':){0,3}' + h16 + '::' + h16 + ':' + ls32; +var IPv6NoneHex = '(?:' + h16 + ':){0,4}' + h16 + '::' + ls32; +var IPv6NoneHex2 = '(?:' + h16 + ':){0,5}' + h16 + '::' + h16; +var IPv6NoneHex3 = '(?:' + h16 + ':){0,6}' + h16 + '::'; +internals.rfc3986.IPv6address = '(?:' + IPv6SixHex + or + IPv6FiveHex + or + IPv6FourHex + or + IPv6ThreeHex + or + IPv6TwoHex + or + IPv6OneHex + or + IPv6NoneHex + or + IPv6NoneHex2 + or + IPv6NoneHex3 + ')'; + +/** + * IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) + */ +internals.rfc3986.IPvFuture = 'v' + hexDigitOnly + '+\\.[' + unreserved + subDelims + ':]+'; + +/** + * scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) + */ +internals.rfc3986.scheme = alphaOnly + '[' + alpha + digit + '+-\\.]*'; + +/** + * userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) + */ +var userinfo = '[' + unreserved + pctEncoded + subDelims + ':]*'; + +/** + * IP-literal = "[" ( IPv6address / IPvFuture ) "]" + */ +var IPLiteral = '\\[(?:' + internals.rfc3986.IPv6address + or + internals.rfc3986.IPvFuture + ')\\]'; + +/** + * reg-name = *( unreserved / pct-encoded / sub-delims ) + */ +var regName = '[' + unreserved + pctEncoded + subDelims + ']{0,255}'; + +/** + * host = IP-literal / IPv4address / reg-name + */ +var host = '(?:' + IPLiteral + or + internals.rfc3986.IPv4address + or + regName + ')'; + +/** + * port = *DIGIT + */ +var port = digitOnly + '*'; + +/** + * authority = [ userinfo "@" ] host [ ":" port ] + */ +var authority = '(?:' + userinfo + '@)?' + host + '(?::' + port + ')?'; + +/** + * segment = *pchar + * segment-nz = 1*pchar + * path = path-abempty ; begins with "/" or is empty + * / path-absolute ; begins with "/" but not "//" + * / path-noscheme ; begins with a non-colon segment + * / path-rootless ; begins with a segment + * / path-empty ; zero characters + * path-abempty = *( "/" segment ) + * path-absolute = "/" [ segment-nz *( "/" segment ) ] + * path-rootless = segment-nz *( "/" segment ) + */ +var segment = pcharOnly + '*'; +var segmentNz = pcharOnly + '+'; +var pathAbEmpty = '(?:\\/' + segment + ')*'; +var pathAbsolute = '\\/(?:' + segmentNz + pathAbEmpty + ')?'; +var pathRootless = segmentNz + pathAbEmpty; + +/** + * hier-part = "//" authority path + */ +internals.rfc3986.hierPart = '(?:\\/\\/' + authority + pathAbEmpty + or + pathAbsolute + or + pathRootless + ')'; + +/** + * query = *( pchar / "/" / "?" ) + */ +internals.rfc3986.query = '[' + pchar + '\\/\\?]*(?=#|$)'; //Finish matching either at the fragment part or end of the line. + +/** + * fragment = *( pchar / "/" / "?" ) + */ +internals.rfc3986.fragment = '[' + pchar + '\\/\\?]*'; + +module.exports = internals.rfc3986; diff --git a/node_modules/jsonwebtoken/node_modules/joi/lib/string/uri.js b/node_modules/jsonwebtoken/node_modules/joi/lib/string/uri.js new file mode 100644 index 0000000..abb9d11 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/lib/string/uri.js @@ -0,0 +1,24 @@ +var RFC3986 = require('./rfc3986'); + +var internals = { + Uri: { + createUriRegex: function (optionalScheme) { + + var scheme = RFC3986.scheme; + + // If we were passed a scheme, use it instead of the generic one + if (optionalScheme) { + + // Have to put this in a non-capturing group to handle the OR statements + scheme = '(?:' + optionalScheme + ')'; + } + + /** + * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + */ + return new RegExp('^' + scheme + ':' + RFC3986.hierPart + '(?:\\?' + RFC3986.query + ')?' + '(?:#' + RFC3986.fragment + ')?$'); + } + } +}; + +module.exports = internals.Uri; diff --git a/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/.npmignore b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/.npmignore new file mode 100644 index 0000000..7e1574d --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov +complexity.md diff --git a/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/.travis.yml b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/.travis.yml new file mode 100644 index 0000000..7a64dd2 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/.travis.yml @@ -0,0 +1,7 @@ +language: node_js + +node_js: + - 0.10 + - 4.0 + +sudo: false diff --git a/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/CONTRIBUTING.md b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/CONTRIBUTING.md new file mode 100644 index 0000000..8928361 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/CONTRIBUTING.md @@ -0,0 +1 @@ +Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md). diff --git a/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/LICENSE b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/LICENSE new file mode 100644 index 0000000..5530904 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2011-2014, Walmart and other contributors. +Copyright (c) 2011, Yahoo Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors +Portions of this project were initially based on the Yahoo! Inc. Postmile project, +published at https://github.com/yahoo/postmile. diff --git a/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/README.md b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/README.md new file mode 100644 index 0000000..92c4912 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/README.md @@ -0,0 +1,584 @@ +![hoek Logo](https://raw.github.com/hapijs/hoek/master/images/hoek.png) + +Utility methods for the hapi ecosystem. This module is not intended to solve every problem for everyone, but rather as a central place to store hapi-specific methods. If you're looking for a general purpose utility module, check out [lodash](https://github.com/lodash/lodash) or [underscore](https://github.com/jashkenas/underscore). + +[![Build Status](https://secure.travis-ci.org/hapijs/hoek.svg)](http://travis-ci.org/hapijs/hoek) + +Lead Maintainer: [Nathan LaFreniere](https://github.com/nlf) + +# Table of Contents + +* [Introduction](#introduction "Introduction") +* [Object](#object "Object") + * [clone](#cloneobj "clone") + * [cloneWithShallow](#clonewithshallowobj-keys "cloneWithShallow") + * [merge](#mergetarget-source-isnulloverride-ismergearrays "merge") + * [applyToDefaults](#applytodefaultsdefaults-options-isnulloverride "applyToDefaults") + * [applyToDefaultsWithShallow](#applytodefaultswithshallowdefaults-options-keys "applyToDefaultsWithShallow") + * [deepEqual](#deepequala-b "deepEqual") + * [unique](#uniquearray-key "unique") + * [mapToObject](#maptoobjectarray-key "mapToObject") + * [intersect](#intersectarray1-array2 "intersect") + * [contain](#containref-values-options "contain") + * [flatten](#flattenarray-target "flatten") + * [reach](#reachobj-chain-options "reach") + * [reachTemplate](#reachtemplateobj-template-options "reachTemplate") + * [transform](#transformobj-transform-options "transform") + * [shallow](#shallowobj "shallow") + * [stringify](#stringifyobj "stringify") +* [Timer](#timer "Timer") +* [Bench](#bench "Bench") +* [Binary Encoding/Decoding](#binary-encodingdecoding "Binary Encoding/Decoding") + * [base64urlEncode](#base64urlencodevalue "binary64urlEncode") + * [base64urlDecode](#base64urldecodevalue "binary64urlDecode") +* [Escaping Characters](#escaping-characters "Escaping Characters") + * [escapeHtml](#escapehtmlstring "escapeHtml") + * [escapeHeaderAttribute](#escapeheaderattributeattribute "escapeHeaderAttribute") + * [escapeRegex](#escaperegexstring "escapeRegex") +* [Errors](#errors "Errors") + * [assert](#assertcondition-message "assert") + * [abort](#abortmessage "abort") + * [displayStack](#displaystackslice "displayStack") + * [callStack](#callstackslice "callStack") +* [Function](#function "Function") + * [nextTick](#nexttickfn "nextTick") + * [once](#oncefn "once") + * [ignore](#ignore "ignore") +* [Miscellaneous](#miscellaneous "Miscellaneous") + * [uniqueFilename](#uniquefilenamepath-extension "uniqueFilename") + * [isAbsolutePath](#isabsolutepathpath-platform "isAbsolutePath") + * [isInteger](#isintegervalue "isInteger") + + + +# Introduction + +The *Hoek* library contains some common functions used within the hapi ecosystem. It comes with useful methods for Arrays (clone, merge, applyToDefaults), Objects (removeKeys, copy), Asserting and more. + +For example, to use Hoek to set configuration with default options: +```javascript +var Hoek = require('hoek'); + +var default = {url : "www.github.com", port : "8000", debug : true}; + +var config = Hoek.applyToDefaults(default, {port : "3000", admin : true}); + +// In this case, config would be { url: 'www.github.com', port: '3000', debug: true, admin: true } +``` + +Under each of the sections (such as Array), there are subsections which correspond to Hoek methods. Each subsection will explain how to use the corresponding method. In each js excerpt below, the `var Hoek = require('hoek');` is omitted for brevity. + +## Object + +Hoek provides several helpful methods for objects and arrays. + +### clone(obj) + +This method is used to clone an object or an array. A *deep copy* is made (duplicates everything, including values that are objects, as well as non-enumerable properties). + +```javascript + +var nestedObj = { + w: /^something$/ig, + x: { + a: [1, 2, 3], + b: 123456, + c: new Date() + }, + y: 'y', + z: new Date() + }; + +var copy = Hoek.clone(nestedObj); + +copy.x.b = 100; + +console.log(copy.y); // results in 'y' +console.log(nestedObj.x.b); // results in 123456 +console.log(copy.x.b); // results in 100 +``` + +### cloneWithShallow(obj, keys) +keys is an array of key names to shallow copy + +This method is also used to clone an object or array, however any keys listed in the `keys` array are shallow copied while those not listed are deep copied. + +```javascript + +var nestedObj = { + w: /^something$/ig, + x: { + a: [1, 2, 3], + b: 123456, + c: new Date() + }, + y: 'y', + z: new Date() + }; + +var copy = Hoek.cloneWithShallow(nestedObj, ['x']); + +copy.x.b = 100; + +console.log(copy.y); // results in 'y' +console.log(nestedObj.x.b); // results in 100 +console.log(copy.x.b); // results in 100 +``` + +### merge(target, source, isNullOverride, isMergeArrays) +isNullOverride, isMergeArrays default to true + +Merge all the properties of source into target, source wins in conflict, and by default null and undefined from source are applied. +Merge is destructive where the target is modified. For non destructive merge, use `applyToDefaults`. + + +```javascript + +var target = {a: 1, b : 2}; +var source = {a: 0, c: 5}; +var source2 = {a: null, c: 5}; + +Hoek.merge(target, source); // results in {a: 0, b: 2, c: 5} +Hoek.merge(target, source2); // results in {a: null, b: 2, c: 5} +Hoek.merge(target, source2, false); // results in {a: 1, b: 2, c: 5} + +var targetArray = [1, 2, 3]; +var sourceArray = [4, 5]; + +Hoek.merge(targetArray, sourceArray); // results in [1, 2, 3, 4, 5] +Hoek.merge(targetArray, sourceArray, true, false); // results in [4, 5] +``` + +### applyToDefaults(defaults, options, isNullOverride) +isNullOverride defaults to false + +Apply options to a copy of the defaults + +```javascript + +var defaults = { host: "localhost", port: 8000 }; +var options = { port: 8080 }; + +var config = Hoek.applyToDefaults(defaults, options); // results in { host: "localhost", port: 8080 } +``` + +Apply options with a null value to a copy of the defaults + +```javascript + +var defaults = { host: "localhost", port: 8000 }; +var options = { host: null, port: 8080 }; + +var config = Hoek.applyToDefaults(defaults, options, true); // results in { host: null, port: 8080 } +``` + +### applyToDefaultsWithShallow(defaults, options, keys) +keys is an array of key names to shallow copy + +Apply options to a copy of the defaults. Keys specified in the last parameter are shallow copied from options instead of merged. + +```javascript + +var defaults = { + server: { + host: "localhost", + port: 8000 + }, + name: 'example' + }; + +var options = { server: { port: 8080 } }; + +var config = Hoek.applyToDefaultsWithShallow(defaults, options, ['server']); // results in { server: { port: 8080 }, name: 'example' } +``` + +### deepEqual(b, a, [options]) + +Performs a deep comparison of the two values including support for circular dependencies, prototype, and properties. To skip prototype comparisons, use `options.prototype = false` + +```javascript +Hoek.deepEqual({ a: [1, 2], b: 'string', c: { d: true } }, { a: [1, 2], b: 'string', c: { d: true } }); //results in true +Hoek.deepEqual(Object.create(null), {}, { prototype: false }); //results in true +Hoek.deepEqual(Object.create(null), {}); //results in false +``` + +### unique(array, key) + +Remove duplicate items from Array + +```javascript + +var array = [1, 2, 2, 3, 3, 4, 5, 6]; + +var newArray = Hoek.unique(array); // results in [1,2,3,4,5,6] + +array = [{id: 1}, {id: 1}, {id: 2}]; + +newArray = Hoek.unique(array, "id"); // results in [{id: 1}, {id: 2}] +``` + +### mapToObject(array, key) + +Convert an Array into an Object + +```javascript + +var array = [1,2,3]; +var newObject = Hoek.mapToObject(array); // results in [{"1": true}, {"2": true}, {"3": true}] + +array = [{id: 1}, {id: 2}]; +newObject = Hoek.mapToObject(array, "id"); // results in [{"id": 1}, {"id": 2}] +``` + +### intersect(array1, array2) + +Find the common unique items in two arrays + +```javascript + +var array1 = [1, 2, 3]; +var array2 = [1, 4, 5]; + +var newArray = Hoek.intersect(array1, array2); // results in [1] +``` + +### contain(ref, values, [options]) + +Tests if the reference value contains the provided values where: +- `ref` - the reference string, array, or object. +- `values` - a single or array of values to find within the `ref` value. If `ref` is an object, `values` can be a key name, + an array of key names, or an object with key-value pairs to compare. +- `options` - an optional object with the following optional settings: + - `deep` - if `true`, performed a deep comparison of the values. + - `once` - if `true`, allows only one occurrence of each value. + - `only` - if `true`, does not allow values not explicitly listed. + - `part` - if `true`, allows partial match of the values (at least one must always match). + +Note: comparing a string to overlapping values will result in failed comparison (e.g. `contain('abc', ['ab', 'bc'])`). +Also, if an object key's value does not match the provided value, `false` is returned even when `part` is specified. + +```javascript +Hoek.contain('aaa', 'a', { only: true }); // true +Hoek.contain([{ a: 1 }], [{ a: 1 }], { deep: true }); // true +Hoek.contain([1, 2, 2], [1, 2], { once: true }); // false +Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 4 }, { part: true }); // true +``` + +### flatten(array, [target]) + +Flatten an array + +```javascript + +var array = [1, [2, 3]]; + +var flattenedArray = Hoek.flatten(array); // results in [1, 2, 3] + +array = [1, [2, 3]]; +target = [4, [5]]; + +flattenedArray = Hoek.flatten(array, target); // results in [4, [5], 1, 2, 3] +``` + +### reach(obj, chain, [options]) + +Converts an object key chain string to reference + +- `options` - optional settings + - `separator` - string to split chain path on, defaults to '.' + - `default` - value to return if the path or value is not present, default is `undefined` + - `strict` - if `true`, will throw an error on missing member, default is `false` + - `functions` - if `true` allow traversing functions for properties. `false` will throw an error if a function is part of the chain. + +A chain including negative numbers will work like negative indices on an +array. + +If chain is `null`, `undefined` or `false`, the object itself will be returned. + +```javascript + +var chain = 'a.b.c'; +var obj = {a : {b : { c : 1}}}; + +Hoek.reach(obj, chain); // returns 1 + +var chain = 'a.b.-1'; +var obj = {a : {b : [2,3,6]}}; + +Hoek.reach(obj, chain); // returns 6 +``` + +### reachTemplate(obj, template, [options]) + +Replaces string parameters (`{name}`) with their corresponding object key values by applying the +(`reach()`)[#reachobj-chain-options] method where: + +- `obj` - the context object used for key lookup. +- `template` - a string containing `{}` parameters. +- `options` - optional (`reach()`)[#reachobj-chain-options] options. + +```javascript + +var chain = 'a.b.c'; +var obj = {a : {b : { c : 1}}}; + +Hoek.reachTemplate(obj, '1+{a.b.c}=2'); // returns '1+1=2' +``` + +### transform(obj, transform, [options]) + +Transforms an existing object into a new one based on the supplied `obj` and `transform` map. `options` are the same as the `reach` options. The first argument can also be an array of objects. In that case the method will return an array of transformed objects. + +```javascript +var source = { + address: { + one: '123 main street', + two: 'PO Box 1234' + }, + title: 'Warehouse', + state: 'CA' +}; + +var result = Hoek.transform(source, { + 'person.address.lineOne': 'address.one', + 'person.address.lineTwo': 'address.two', + 'title': 'title', + 'person.address.region': 'state' +}); +// Results in +// { +// person: { +// address: { +// lineOne: '123 main street', +// lineTwo: 'PO Box 1234', +// region: 'CA' +// } +// }, +// title: 'Warehouse' +// } +``` + +### shallow(obj) + +Performs a shallow copy by copying the references of all the top level children where: +- `obj` - the object to be copied. + +```javascript +var shallow = Hoek.shallow({ a: { b: 1 } }); +``` + +### stringify(obj) + +Converts an object to string using the built-in `JSON.stringify()` method with the difference that any errors are caught +and reported back in the form of the returned string. Used as a shortcut for displaying information to the console (e.g. in +error message) without the need to worry about invalid conversion. + +```javascript +var a = {}; +a.b = a; +Hoek.stringify(a); // Returns '[Cannot display object: Converting circular structure to JSON]' +``` + +# Timer + +A Timer object. Initializing a new timer object sets the ts to the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC. + +```javascript + +var timerObj = new Hoek.Timer(); +console.log("Time is now: " + timerObj.ts); +console.log("Elapsed time from initialization: " + timerObj.elapsed() + 'milliseconds'); +``` + + +# Bench + +Same as Timer with the exception that `ts` stores the internal node clock which is not related to `Date.now()` and cannot be used to display +human-readable timestamps. More accurate for benchmarking or internal timers. + +# Binary Encoding/Decoding + +### base64urlEncode(value) + +Encodes value in Base64 or URL encoding + +### base64urlDecode(value) + +Decodes data in Base64 or URL encoding. +# Escaping Characters + +Hoek provides convenient methods for escaping html characters. The escaped characters are as followed: + +```javascript + +internals.htmlEscaped = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' +}; +``` + +### escapeHtml(string) + +```javascript + +var string = ' hey '; +var escapedString = Hoek.escapeHtml(string); // returns <html> hey </html> +``` + +### escapeHeaderAttribute(attribute) + +Escape attribute value for use in HTTP header + +```javascript + +var a = Hoek.escapeHeaderAttribute('I said "go w\\o me"'); //returns I said \"go w\\o me\" +``` + + +### escapeRegex(string) + +Escape string for Regex construction + +```javascript + +var a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\/`"(>)[<]d{}s,'); // returns 4\^f\$s\.4\*5\+\-_\?%\=#\!\:@\|~\\\/`"\(>\)\[<\]d\{\}s\, +``` + +# Errors + +### assert(condition, message) + +```javascript + +var a = 1, b = 2; + +Hoek.assert(a === b, 'a should equal b'); // Throws 'a should equal b' +``` + +Note that you may also pass an already created Error object as the second parameter, and `assert` will throw that object. + +```javascript + +var a = 1, b = 2; + +Hoek.assert(a === b, new Error('a should equal b')); // Throws the given error object +``` + +### abort(message) + +First checks if `process.env.NODE_ENV === 'test'`, and if so, throws error message. Otherwise, +displays most recent stack and then exits process. + + + +### displayStack(slice) + +Displays the trace stack + +```javascript + +var stack = Hoek.displayStack(); +console.log(stack); // returns something like: + +[ 'null (/Users/user/Desktop/hoek/test.js:4:18)', + 'Module._compile (module.js:449:26)', + 'Module._extensions..js (module.js:467:10)', + 'Module.load (module.js:356:32)', + 'Module._load (module.js:312:12)', + 'Module.runMain (module.js:492:10)', + 'startup.processNextTick.process._tickCallback (node.js:244:9)' ] +``` + +### callStack(slice) + +Returns a trace stack array. + +```javascript + +var stack = Hoek.callStack(); +console.log(stack); // returns something like: + +[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ], + [ 'module.js', 449, 26, 'Module._compile', false ], + [ 'module.js', 467, 10, 'Module._extensions..js', false ], + [ 'module.js', 356, 32, 'Module.load', false ], + [ 'module.js', 312, 12, 'Module._load', false ], + [ 'module.js', 492, 10, 'Module.runMain', false ], + [ 'node.js', + 244, + 9, + 'startup.processNextTick.process._tickCallback', + false ] ] +``` + +## Function + +### nextTick(fn) + +Returns a new function that wraps `fn` in `process.nextTick`. + +```javascript + +var myFn = function () { + console.log('Do this later'); +}; + +var nextFn = Hoek.nextTick(myFn); + +nextFn(); +console.log('Do this first'); + +// Results in: +// +// Do this first +// Do this later +``` + +### once(fn) + +Returns a new function that can be run multiple times, but makes sure `fn` is only run once. + +```javascript + +var myFn = function () { + console.log('Ran myFn'); +}; + +var onceFn = Hoek.once(myFn); +onceFn(); // results in "Ran myFn" +onceFn(); // results in undefined +``` + +### ignore + +A simple no-op function. It does nothing at all. + +## Miscellaneous + +### uniqueFilename(path, extension) +`path` to prepend with the randomly generated file name. `extension` is the optional file extension, defaults to `''`. + +Returns a randomly generated file name at the specified `path`. The result is a fully resolved path to a file. + +```javascript +var result = Hoek.uniqueFilename('./test/modules', 'txt'); // results in "full/path/test/modules/{random}.txt" +``` + +### isAbsolutePath(path, [platform]) + +Determines whether `path` is an absolute path. Returns `true` or `false`. + +- `path` - A file path to test for whether it is absolute or not. +- `platform` - An optional parameter used for specifying the platform. Defaults to `process.platform`. + +### isInteger(value) + +Check `value` to see if it is an integer. Returns true/false. + +```javascript +var result = Hoek.isInteger('23') +``` diff --git a/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/images/hoek.png b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/images/hoek.png new file mode 100644 index 0000000000000000000000000000000000000000..6ccfcb12be76a7a8331428c87337b20b901e869c GIT binary patch literal 37939 zcmXuJ1ymdT^F17jyA*c`5FCoTJAqQ5Kyi2X;_eoTTcHJtySuv=x8m;ZZ=T=x|K^;{ zW|K{Fc6Mg&oqIo#pOt0NQHW6h006qYoYWTp045Up+7}4{`m9-;``-@PQBK6y?0yZu#AO=sB87&HB5pjnq zKQ8!JMAXRhruQ$K`L_GL@wfT~k^Qpk?Al4hE+n)RIZjpX0JLHWa_oP>gM9;=JFH@X zC_qO57E-M#mCGv)4B){}NQjBL3$X(L<2j3p1n2^1cCnL&zhfRrr0c>2guryUCh{pF z1>ge2zQ;)v0>ors00EVL`#@m3;EC54#|Gim2K=wnrHw-}M2NfR7&qM&_ zN3#eifTbXyZ1QWAG(d|TfNQSU#}8O!0kF$!n#%#I8UbAsSg17sBs2iKYD6dl0L~j= zI7CC^2?$9C;L2QS3SBZ)VC^$PBb8nw)C}a84%9(naYEG8WF-ep$P+N(@)&(E$`E7i z@k%H96v&17?|KXX_?d_Yz1r(n&k2l*i3y`Gq1qfUf(YGdQ=x82E7M==0k)75YK zjhU^MI6x2~!0s)d_6*KaAN8l(eYANErdU1T=i##Ewc~%WkaQwJM(V3wZZ%hE3&~2sInG;@lIsb z<=VA%4**=XI&}X9A;AV%25(M!yq}A{%KoGU1enW1oB#lQDIlx*NUi7~5&$6eGmx=L zoaCmPkhu$iv>Sf48}-GICqx3+*CT-?fnpj!>TJkR79;@*8?Pc`G-UfLM#j~pY8jT~ zh{4*U(S#xFi1}oMl+z7r3q*z!A42+QM710NV;rSL6Nf~Q9{NDlEeD4a4Wt~7z*VJI zOyrj1_!6Z~sUb&pCG7lxKU`O)B~fq)@G0metWB2VM_`Sr@L#lg$>u-2#33^Is8gn{ z92xQWKQpJC>xhM8c=GnAN-Z&$<3%I~*}D!15jp#8*;xmAC93(Dk&{eDtEtP-N(YFm zzLvqZM&6oCR(rtV1WI=y^T2sXP#Teo%V{ZTDKEU zE2mCr&Ws+)9;6h_E7Oz;iDsjT2G!YlIgZoz(=pQ> zG_)8S7=7>(M^KU#lIfC37}?Z|OA1TYOHehgHAdCri}lrfD`Ye{)wYX~|E82`lw^NC zRwGffC>Hz^USjdbL0$B>pZ04cf_AS`uZrYv)t}V{+ie4ss3t_Up3GD>=%rz9f!uv` z)#FP(?u@NzuVk&!!X?Fd{F0msoSL;?u78+|B5tQSJ!H8mBkzNXQm_4@)^X1nwirkX zxs;kY%yex^Qc_d2O65vbOJ$GSc`8nevJ2a#TeY79F~kQI=ymC3E#fEOv-j1O)Yghn zitxe00=E^cB{l^ld96|&o%Tg%X*nJG0Xa$zMeAPe`%k34Y_ICCc27mOvS?ZewP-+u z6|@OLp?+>B2O%=H!Ieu@Nxfb%$pWKfqtwli#O7(CUvo0CGMF(|1G?M5ZMy-xfnRh8 zbX0VT;3M!^#uspNAw!{{lAzMy_}F;<_N)IMuyvk(2ouU(*}@lCH*raZfxcD}W|wFtYYSvg6$G-uwTx9YNCxS_a_sA_i+ zVWpzMuEE#H!kECKvA?4CEU7)ox5YR1RTvRHd>HV%OPw>Wz*m9wjESr>QQ!WX zltVTPtx2rOMb7PpkE0BIR@rKqv$7Th7R@ff*AdZ?ib12SsUobIBm-+h?K=vtw@!MS z-)C;KGix(@PXDY_p7ESnorSOFj&bEO){!`tZ7DdfXX1CcW^HY&j3ACu+ zr(rW;OVli1sA??mD7iN}ClI+4an9Wq*%snm|Fo`cFvi=}IMg_*((9085V|4hPxEg2 z{{4L#P!vE5V*wi(C?2Tu;rZda4^?NJsKAQZUCq*|c+AgcaXj((pz@&I?s6*2p_7Di zs{8%4iNpyjjL^@12lG>iMterly?$u)q2ZyLVWM%45n9C49I4zM)2os$8&XeFDN^g1 z791-4l`IO}j3Onh)H|B(`yT0sA=%n0K2)=!+BDl+cydG6iz*Gu$cdJ_!r7a|A;Y6PzSU zsK7}L7DpC)=I*0qW}!82{r1s~Y~;y^!#1@EW$@Z8C=C*Y2kPHI3yg?07G|2}o#T-s z{3)e5Oyj3xwIeGDyjkbD@25CDIGd1$f-pr*7Ba29_A+b!8X+gI6_jl}c&4zg2xUS| zQ4NfCb1J2$nyD3j?R4M4Hi7!xBSGEuFgC}i8YsJ=zQ?Nzr+O+{Y}y<3Mo(ecBqDf` zQ5Co=1gUubi=b7{U6OEzkDpd+RJYIv6P>se7py_UKE?b?6&k z>rQX)q*vHd$3ZKt!3~nlzdD7Q+RTcEC&mRu)qktss6VOmoXxD&8!bH8PoI%^x7~4_ z%&q9O-M@+qcdTf@Xn^O;=ggkvpKI?$DBwHVU6i<-h$=2IV1fZy)W1%IH7yhQ%@HtVPx7Ee-Re$R)kDu4mtFre9p}~`HiMR2XlJN2A z@uOkrVaGXqBK-VYqRy{}FGZ4*rjv9z1aJ9oqZI`BY<>@O#|snFY14VBSE)&zc0L8K zM_tE6l`8{11LPgUo}3)|H(#GmyFFGt$j*OlV5;o+Q2K-3Eg!3I)uxJ`lZcX%-r-== zu3t$s=d-CA)Ax)e2jm;d1LTQmK~fVa+8PYdmu?6f?>R& zG8O*6Lz>9{|84pI_wkcl{{Nl!G$o7k-|0`#Qz8Fvf0HQnf5$g@@xcGyhknHXYe-g5 z3@e02#DCjuf$Y*ta#ntF$Z$M^n~R$#5dx8LQAEYtHTz3eCaZ?`;wPG(PIOXQLB+(B z&{B;}hrXG*_%6p8|+gPbRF`ktA7k=ccu|vEbYCFVa?iL%Ys>7(8_$7(DKE zZmwbTOJs4HTP0Wa->gv*9Ycb8d>ZW6Cc55Ut?XI z_GGO!Rf{XCck_31LFior4+7f3WL!x$U$!y?0vQ?^$Y0TT|u;pJHXsYf~da29rN9>3%;FMSxr;Tn_SKjef=NdliNVf zITaAj{#?J!K^#L2h3JpfRp$J>2vJ_qS%alcK1FnCMFQqE_OrRh)Q!5<79%io#hW~D zOe3u}%Do=l|J_izEtjycdGqSL`Xx2>&wP@R(hg+nY$hWy9Flz;k|TubUjsl9mMwus zgqC4(z=#-fbp;y>UbfE0sCy5JpJiS=EEX4clX?e(gu!>_LhngCR~3;Zf-LpUDXmeaU=>B+=c(;Iq;G}3<8|DTcXC@ z-CJpq5YL?597>XUM3juKt!O`kI!@TlYTGbxGz6e%&PUHgPL&S$5qn~}- zplVRTBhkwf)4t0BEZb#jxB)#e#_ZB!Pk`T2mfterKn!6R%x~Ie4z%8CGmr6${S7^C zpSO|mJUphaJl|K(>_jTh*=p7rq_E)I&%Ye~S5&e%xj6Io%anjGM*4o{x~gH^JiPI8 zU}XmM@SgPMLxwvs5QMX?&TvZ9|5Afv_?Qki@~VRqR`Gd(cF==UN{-2~s(n4fzcO zTyP{AqlomE;?H&6;_k-_jz`~b`fPTOdF-=NGjreb^{{f}72M0P!NgCj#sAkKfKE7+ zNFOx3-6Nq}b2MsHVTtui39!-EQISt;`S0J&3}G+eKA0rf=-_2Hva#t}$AFr4SXL7h z)XS>2vZySRkxP5rFpY<{UA5w6vxLB-uHkal=e<~wztH|f%-2yI7(BekP_M^pTZrdf2*)e^_YLpZn-4T2E`(ZXU^ibu%=Y>eLq3^< z6TaTjYwap8ie7~pq7}AKkJO6Yc5aQ6MSm=VsQA*#v_XCsy3IT9$HU5ZR$JXp-=X*l zQSYG|7VirE8v8+e+X=+p#Kmax##+@Bpp<-22dT{eF7AM6UH>8nusHkWOEj%^M@K=y z?(%U3AI)`!;(m?wIFJ4NDJ&XjWcO{QQ|asXPx+vW^HlsPY$T`gX3hf?8H~=>tA6j-Y4#Lq^znN~Boh{5UR3r)O3bUV0o|hKk0OmP z7b?s;t;wBlFUMyrtu|qzcgy*mtQ$4wgW%IOm9GnP?dSL3KT&TU=*vS=4!;|q{Q5sI zlJ}u5v9U4j%1ux4Dp$m}R{%R}l(Yoj+^FNTZH)2ScZMI*AYT4s>lCk<1cQis+0pdB zRYmDkhzyo|o#B!a@7k>5@ZY6d*KSU?naCLEY6D7~j{gRFJ#-h$!UW1Gb?-Y>xhits zx3^_Qo1+ym^JZ(NI&44t`)8j%XEqtF^L4nN!L4GDyrO=>l1_|m#dKbQb#NYcBXGXf zu-I01&O->6>dAJ6%SS4VvkEfGSbe;%beZKn-&yf^2^M{Q7+t;1w)taYJ?dq5xqL42 z(9^n6UT$afG9;eYUXSjvx3l*K^ZA*z^M9pw33IaAC=1Z_%k?i49lq~P|MfiCwiP4q z>}7;OcX7J$8m*aHW+vuDe*eB>{skiB8czM2*4yi5?w(<6*l;z$SzTjr+npM~jhN|q z`dY6SY*Mu60lYQc$ZB4Eu z?|wGuObrW;`>_^Zax!H!`DAn``zk4Px-{)Of-2X1u%{dF1&)Zjr?A(}3Vvm4*C1wB1^<{iH8J$>KUAun~*Q&EEUfaI= zv9pi=QdmQIyu0CZ+QZ-3dCTbK`R@1op}o%Cb#{IU>?O`B+I05es^-f9hHTY}SxYZR zirwPy((E8*B(>l@#m?g+(;u!hHOzvfjD$}ojQvpr| z8Crk+CXOZg!vHJ5(3?{~H>q>&8dhJgEoYac!6eB{phd#8h~8z1NNusnj7{`;So2{- zqqY*=9r3OF&-X&0{QEKQ$Y(>23*3Zx3*M&->Gh8=y&prWP!>^N@ClK3UM9ceU<%*; z0eGUKqR`6(uXQ%>)NRsqx(^eXTKvX|W|G==%6AGCe7i*34pTSGp!*o6frTbp?g#;! zpEmfW(Z!H{matPJ!EC!=6{#c{pK3Oqkg7=MPiqM-hL!?5I|o`cnVBjOf8pWO1T|t{ zJFQS&IU{%V1}M<->+6gTC*jwO-pUHW;PCZtz3~*D!OMjh6B(aEO2!2rE+^l{;yeAw zSsP)cr$t2WnUM@ZA+V=EZrS!^8+H2)$o&#wUauTmR$bwHad!%5wKn?J$)1~bGgFgt zll+D!&-{M>t}fm!92+YGFTZQ$NMMEF{#)o8@1iQ?dODG#=nzW?5bpvSesFxk9-=(1 zeWFz^p}+js`OX56w<@-pRco(!et&2$mGyg$s`Wfu)6n&OZhzTc@_-`hR(o=$6W<9M zhy}>9B%84joktShi=F9lTEtFI);SqHxci%rjYPYl)_0J+ZsNPZ%8Jzin(7Lv7*1%f zy*gy2yVs#Ij}vEqhO=;Loou^eaKohgN%)~%*;KxV9lTYdEK`%oWFGf#l_9wKKD0pS zdi^_H>TZ?&ir?GCzsyA-a(HjpW8&vXpnUi=3p_*2i(5=AI5Cf0 zy~ADtq)r$f*n3z_vVNVR*Ib%NNjTNdpFO|J+YjWvU!0CAunN1NsI)czFa!mGkf4+f z4AE*aLfj75sPWR|hLUD6EUB>&?60ob8DU?eTxK~qoCHl-bGf6`TL)G-3Z#BH`CShA zbi54`c%Ed}^O5nu!9d#WQ|#9!gKk@iMA>tx@T7%&_8Xhr*G=Ef5APp4i#7)7qWMm6 zT8w^z1Rf9lSVislcyokv!q;_s=i3n<=e<69`R`)9Jyh~KE!r*GeJVue(e7bYglp-w zUGfUx*14;;J#|khU+Q}HC`2 zHyDg5$_#kx2@2vbSSt2!d0t7iNX6fqT3#QI;RyEJ%f{O={e4+KI`O-tCGKetV*v9w zKA@`$;$wW-WTq~KEjb$@`-_iExlS&iBJ4Y9nvdDKmTNC1soIe8?KB&GELB1CK}+PQ z{ja?8Oz&KSk*OM?sM;?>?x4TiTrRuP*Mz)fK{|f#ppEzE<5j0#T_~h!2o2xN~IqVK&~tjps5OCi~(Lis=zNLi15`j@+YdS)FgsTk1yOk!ny z)<-)U17i5SPIWnCqu8`p7TFgIvScjG3&=C3#4)O545W zCkF8%)Byd;1zv%*{kJ)X4kxF(t{Dk|U@F(OpTF6|Db^gxaS-&ich~Sp4pVcbEi@zi z9<`hFSeLh{;Kaq^2NV9D12A&aC%D;V-%&5?1DjTpnlEHpCy z@P0o={pFQh=Ewf0!kUES70io~tHv}wb3%fNoG}^?pJ1J{H{OlTcMZS$xmuR|&+53~ z!P7dY$1x)~8mF`G&Q$(ScaK@ZMwFr*`$SpFf)-w5>tNqe=PK%68^6qDi`tWKK*=lcp zvX9|EurLv)srAw>K`l7aRncRFssoMhPdNV0qpOa4T3>v4s5#&@c-hfDwlb@x zHg@b}{^Dzo1@8*`?b|W~1LHrN)XCj5`h7Lkgjj20P>Bp5>3~@ycI*H)nZ88!ny&LE z^Hz!T0H)vNq%2wz6HxvLOZxH;t#xjaV^U-IVE@yJ0<^;)j9Uh_u`$boM*M+M`{&yl_Ne_he;O_g%Z2(Cry9oT}ky4wS}|gf0;=8#Ja1 zsc@`~BYwu?78j$AGXI>AK9*c7dp)Fcyja(m1MSj=>e4X!jj%AK=`6S!T51}j!44G? zv*3wrp$OGo_#eB4I8g)5J_Db_Qg;)wk7#)3WVQo+A7-u}`gtpNWbcJWRLDJ(ygQs& zd9)?wT-EgksT5Yf536^$oh!aPHut|gg?TYAx21+1(On5)`1!1usqYm1vPN(M(?SkL z*}<^#4zwq(j+;bkOEt9_xgrk;dL_ylZo*Od?8cvwAD0;5dQa0TOnayjODp&?KeG$$ zH~Ra&!APrCxHe}^vki^U{3ptw@{$qRcftDXg=LZP%1aqjv{bfZgqt{u%Us27JkAJZ z+7mNtcYf?=m#Zde!kEathry_&$w*Yx>(l-=mjb?K=9ZW{Nvlhc$P&$&W#o!-X&d zBl(eN^{pWNWv67em|1S{(6P3tF!3{A(By8{aox7l(k0(%6DiM0O^8(n6uy!W@toFH zRdqSMx$4JZcutDxOF(>N?g+SMPH#WD{|nTwk!$VR_P99>#HRgb>7o2S$oR9D`Lwy; z-T9-dEbb~RVzpsF%Cc_+^~>G7&7#lGB>&E82(a<`;y$`mz^wUDm)`;xv$H(~I+4(G zE=3m-N#Ws9iDN-5Z(SpT0%lojTRXCI-(UI3eciA{D&zh550yx?`mQUPi>jNG7`73w zN<~Em-(RoMg)m6mIim^>2{Q)p_9rOu(I!eu9WHpexv#6^2k5@7EI(wSiCo=YG=2VG z_||Te{phz*iR>X#iJBWedVnv`2VE>9TbfJv*kvCcUO{WNZTNtjMU40lsjZT*5^G#D zAa-nV*^(2W66*KCgoE>;5ZHdpfnPUuu@r3ju`tp4=-v0wBtl7X-=5{yrzouarF@#W0tMEHsm!Z3F8F_Ho$ z8riZ%UXxFvWh0hZ9*zbj%&5xt)EtVxYk45vaiZ}nJMNdw$ATDA?Fr3_jB%RD4iz0) z0*`ff_(H?{Lxc<%2>1*Gp|w}P@wwCAbykWOOue@D0P)EU&+K2ZV0*d{jpF&f4t`A^ zQ_T9)S5G!{-LzU%R# zDQ;K|UQgdSjQLY*F>bLGDe7s$4+u-c%~4Bo(ef}!;WOa-T!^D7F}eVBxNdZy7Ff3PG$=oimfquru`g6 zw-NANF58G+&W7P%uAfsWBR{lQQKx@^CmN2aU^blWc0cpBBImR;FR@Uk<* ztE^a@_)GQ5=YNDXfXUdmU1#Dk^s*b;uSE7$!WojuNssnBpE6jG!k}yPbWPWL2`$Id z54myU7OwMg7#sl!Dfz>f9T#^x_k6=?p7Unp2RNxwvhhYt9NMQdn^uDy9Mv-TJ_O|z z5CAXJ%NzylA)W`-gHm0&i8&lJ#IZ^uQ;XC)1iL>4N$U`UaLp}L({e+%z*KBZ+47It zzs-LqXead7+|OUk*qnbvb-Ny|)Q=IR4IMQ@q@xbA!aBgfMw0$xV_Q^FojeX5iv9XO ztnwsw_ov4cGn*c!_%bgyrS`;_BHWKE1LMG4Xi#)x8Z<)r6FD>Al#d-*ifd8iIDC_r zf;RLIr)QI0!Gz49u`)*r~4YUvC3EneH#%k zPdZu3qcMrAGkhWC+|ba8hi23zovSIrY{mMI!`Tim?*uKeX2byZ)9&xfREOM2y?B;? z#i^+->*?EGkFj{GPLpacTN65#cBoh}j6DSedZrlz;mM55lQM<1rOzhb>LUA_bhVR( zP`Va2{~ujDN#-MmU;(_1{KQ3P+5NK;cbX0|Q*$@Vm?!AZ+%HFSebTjr;v^fWfibgP_eMOR?PWwhWJCz8|R__de4$79Q0yTDog`jEdn5x>s zKxv!C%bt>UxO~QQhsD@gx}*%Q#F{qO770~#Fnz^0c?Ws?hhs%1$0f6h3}IsNswbui z;suJ25&asb@_n>_nnL(yWiYnbCOd{tIFcV$F{H$Qc5sXR6pSI(9Fo7k8taK2Bh-#7 zIh5KaP724}c3tF~`YSH4%-CXt6;-{*K=nlzon7H* z(B~eOfq)coqw^Z9G|5mA^VJe#cpQlGgwy@8$K!9&5n7w4zp2mFKAfuqM7WV zFo1G+@f2eq*^J$8NLz|4sU*Xk=d{fHFpTVFE761BM4jJ4nJ{4RkP=7Dagp|`y=d2R z$u|kr(B^G~grpE52hw+3-HuPT(juV+cV?L@?{VQ$< zNI^YCG`~1MGZtJ~x$`m{>?C*!Rn$$GuG9Fc0_1f2_nogAHNOTJI(RaDJP8fRgUqf+hOfMr*WnxDoM?WY z{Z?pfW8TRl3VU43U)>=oR+<;ZKHOaC)jNeR0$zVtHuey z-*PS*F3e_0QOMtHMu(-mYpC>CG%kgGx1Fiq=s2=f<-+|C3syf}1e=G20~=#-G#^zW zwE2YmyRB+xXUOxLo1_0qV9LA8-SHv!<6^-n%>o7cW!Z5gv81AE)uwMGTP*|MxqxYZ zth4S4Wo(_9Aidoe`CJ2j*C^}S^`WigUXh%GJkH};95JBL?RW!Gf+D>Svwi1IIFZLf z9ga+ul}p22RCq6kXDfs}zj3+XrB$6Q3aMLkZA!1CUS|*jbaK!8QFAAO+h7>Gj zE@0Z)eLi}KzM(W4h$MH@@-LdDm%xtuoI6xHo~D}+@m57Rs&}(0;&)5oacRin!YO{2 z;*IE6@A!Tul|hj{S<2MNY4O6Yu3_@jlqYmMF_O8wBKVfLbA5&xYW_^o@7C}ORvTD#<0z1k(fT0AOMH7 ziMpAHdut4HDj*;oen@uk~ zF8Qj|ygF1m?SrqOy$>kg$Ew)YVGQ*(Izx9>ZT;?#9oYR=4gVVQ=H1Dlv4o8t{wx<5 zqB!@CqR{n+A(F@VW_?ecMi=oZpP43tM=Cs;lO9v@ht!$>8~E&PB)x1yZ~R@jHUhN> zb3cr85Id%C$}K62i=wm59s^pz!BMqHGTV!0*sWkXQZ+1eD5=dEIcvecQp>iS#^MPN zKc37yd+%zr#_DcSl@kBMFXN(=({=3P*OkBU)RvRnqdG#)88V}wKBXe9WJ$2Qd zu&&-i+S(fPWMgG|sl7LVEUM%bN2>Z&4MXqt2k;4J!S}&{E>fv%y?*kqZn6m#GUjJ! zspL4l^(h3A*+m42N$Nz{ubF<97KzIDjUdDl!)5k5b>tdoSVLqO9WQFJ<~1{kju@Eh zrNV6mOW?xMp)pITx{U@zQFBPsVnrqHxc_rsOrVWSnZSzXJvH%{M5JN5O5^(z;RsYx z8;8;&mxn?SmCPpWLC&`zX_WQZxUxXVlN!r4N^bR&&2R6{Hi!Ym^=2ha^&G`KZijyS$R+E#rg zq$YCs5B( zXLosFmuauxTFnNJC;5;sKnj>NbS;F-?T?rOPkRZ_ z+YejtKT1vCXg_^ur$xq=QJIs)p#r9@vAZ@N|8P#FdR1$Z^q?aRR4JEI?c#!m+5$!8OiF$&xvQ=e5D<05#n8&J zr^hR~c^vb$cd9ZyY3%krU-RZzb)9P%XjD;Bm0M~Ug`u9849LKp{cPVEXybpSsju6X z{uY{ES4ur8;zM6tEYf2Kc6E2vfmM-a`n&7Suhm$ep}C_p73XW| zZs-YPub+zuYHAxoTT(byUGKDxR$47jQ8-KdVHAKpAJ5z670h`IGI*C>d!O|mj@DE5 zf|K!Hi{x9r_aUw!fWBa9|OUC9gs{S?P%&5@GWkTBVUc*HjF&X%ykYLMD zQdm@1=aF2w+~R#S>%h_pW&wTw#4UWkeH#ks}qK`07QEOrLOG zwNx}gJUz)8^#KB$B8shTt&bk9Ac-ll`VI7k_P?M!B)x9XxSiffu@w+U#P7F}l3GdR&smw2NeCR}{ur4&c4o_eK5ZqQVQQd} zF*3crZs_ktaTalu)kMr^tfh59Sh)Xkxm~0Zq<;Es&`@AmdV~a#5+cs)%9YS|g3&n7Iik1OD4h6 zeh4ep84t6w=aA%-9!3A=?5(liwd&GDPJ4?{QMH9J_+el1f6BI~_GE)pljVR>=4r?^ zwSI`uPx3MC!RW53TwSJ$<8ZR2adqrmX^p^@x`tlq3rOE{7_Mu^{r!@%sigC=%kH9%J^%2Tm^|| zmirf9R^sKBp&ReZXWc#xbXDA@mz%^fV!iG^Q9h$rd}Nkk;-C_0L+VjzE0e@2=j$vy zM9P=?T^bw}gyt$<$W3S><%AH8UukY?MhBIW6l3JM!AYi_sYM2Q%4)v!3%>sN*{7#} z6wtz%U2acQ+p0`acfAgqvfXjV#Zt;9qnH@o#f$R!;>(}!IURZ^8%`Xy@*3yaeLacx z!NfypZ}3@yUhKQgDZjl+CdX4JbGp{Ucm~vWOlpVQ8vS@P@8)N*V<4$#`>DKRw6o{5 z{Z#C3H-?pi&8=613)#`OjBq*_#wDu6%O99m>vCshG$3alzYY-~K*}g;6}Hte!DDwP zD0@(%_^QN(kH8s1d_+xZ*_#dNb|aW5WaoA1v%43$-T4ujw9l+pU3Ld&kky{JbMW!u zxVI>fqf5BUwCpmUekDl`Zp}L+DY2~s*Arm#XF)WeYnU3D{&NBZ^1WNzM4`=USf83B zbZ-JnasGVsO3}i(JGRr}wNNiDLtI~(ku@`Rm5Tz_1>(eS`<1@V{vUR9x=8+sBzkX# zkzo>TMXq4j?g}Qmmm~JDJ^_ccGysJ&iD6Wc1~>A0b!%LGuEF{3w|Gp+*dV)7OYeNZ z&$2q8y^srq3v_;&{rz07N+1S=( zygi_tv^v8yK1uu62*W5?5({oCBhD~GiDW+huva00HgKSU)qSphW*%>E_@3wDG`f)8 z#+1L%Xlm};WQe$Q+rv7ezNZZgtV@#RA==fzk=|c765BOR)SxbIi0^?#hyBv11gSXEs2d@lc( zPI7=QeoIoJ&Rls`)TnV7aMuT7l-n6Z@ zEx~fGne4|<$bpCvnW1Y#=rHr`Ww{S|0&@+xqw~vf+gJsc7(^gK%5aHNts%%Ch9FW( zs*!!_QqzpE!Z-Tb#Ud4ac7z-nqDokRs1hTfocZ&c%yKXXxsNa2FGkiL`=li`{{%5U z1w9*rX6VTo!cm5NQEQnaXJEl0dH1B`t$``^0gat%$6>mGSdgS#mUR5eFwG>}0PAuZ zw-;{S89+wJ*%S8XAAz6?3R<*bx@#z;Y1g<>EM#+p)x4nT_94Udf=UK%u+3ZtaS?FM zRUt_-?8J>vG8p&KVq8>M2QGqIZC(`a+FLagMsu8r)g#M3QR5&WcT@iA5WF zikj>(G{U(|70rnT+1@-hUzxXaJ6{I8X!* zCVYJ2EV!K6&zIIfz=n7~hbLuD$9>$-yZ6l|Kr}ZWN@$@If@v4>3!sV2(PyXmOl9-h zTM~zUCW#N-6QRoYpF<8UQGSZImJhvg_kUzd%2c1T+r2}0%GdTxuRe(8E zP?3Rw7z!mC8ueTr2-Pd5r7DzErDSUAFZ#Uv#qy?wo)_L(X@!ybhbdXo>hD_bV_Zs5 zVXRmLv-N11&;JTbN)=dP30+5G{1ov?poK<>P+du>-n31+H9L6x)V8F=d^QIK0pI-7 zAFgot%==m^S#*=IA3rULv-OPhJxyq#;EUcUnO|QJE9LlpvEO>aBPC8rs>y){n+YD+ zcAdhDqe1y_x`r*JEJ#O}6o$)L2P6px*NnKq!>HCF;1p*#rGacAa+IXoOQD(R>~$3B z4CE;e#e0T|0b6CJcf8PMZTn-l0FrEKq0%>6cRgV?l+ZnvE*!nOs%t)x(J$Qj20w>x zcQXp6Ctes*y1aT-EX0l(fT9_dyJv!0&@FtR?7FtBh8`fcuZ?=Lv2YpH3i*u+W_p_up7peHdK|$u!a4k^U@p zNJ3y%*2yYU5#|sBk$$2qU&%kGB@VQ}h6=1qoy`Bth}T#$S6Sl_lM)T1;D8mY-edQz zx=}vU^ae334NksAVoKcD*-rLouFlNrS5zYPENSI$IOM75vvqBVU|x*-&j(?FK!q$0 zcR+He_86IFWWM!5A=Gr-t|97WnYEG7Rjm@tc9r3pw_A&y+}~N>Pq~1~OYx(uoK9je z4xNoT$TTBP%VuvcQ#x{CW2;ubkhm7K^+Q0kXr;Rj(54?R#y4lQ)%ALE{Pbc^ zht4XqfNq^3FeG>N&uJOj%gBq!v}=AC6O?WAaw;}B&O+xr(VrKNR+W>d|0?6zD9bE8 z*D!Q>NbHNU$+*XNik_QqJ5sUX5_1hWqu)Xg)2!)gl|^G4=D)7{J=+zkBCgzH9MMfZ6H4f+!I<3LHW2=)xAWPnGU*s$?O|wkA*@bruWfG)hJG}JnM@Hy)-{V6Pf$WtGz;v+C_7A6B&zQ(c7AW&3#h7R zTdqP*BT5B=6>Er8a}>EMjML~o;0O9#bYh#%xS%|~CZU3cZ=Cn~I9@K!9oYR(Sy{7q zLSUq|+uBN^vbn*gg-@P$b9gULI-0)*gZhGC9>l_HR*Xy>d`UVV?gja>-5IYrH!w3a^KNDpd#8Ir6Ix#cnaqhh zPFEvWr)}-#1PhZSgKq=MSv-;XS?Uc7Tux7aoJo1o&;CgG>JUgOUZ=e;2XLTsU01SZvcF(9+<9%4L#W=7 zb2cnF;piUg_{`K%oRN)X*>e~fh-{GCe$-nOBj434dqFM|p(2U0H;enogosbxADkL! z0Hc`&g2=&)$fla_#g;JtGt}Y5?5GZl`~0IMLk8*(b2vGQ-tjhY`md3P;aXhBUeiNo zMoM{V9(f?CTJwFgblHY?0XHLDBtD)ZWtYfWRV=e6eeCHK{mt0Jv z;I*}Ot3>uq;%iCj)rmT}zY~$3-kK62Pk<_Hlx4|MEC|I@SD8zXzCIb^2_Gu6Mway9hWZidyV8F1`rwd|^Bu=mUy34*0O!Kx-{6hU(OwZ1{45ECk6a}m z$&*6vyt_J;R;V0I9|T+#`&zg`E3-x1>1~Y-0kM~SN`;NJ!!-wTR`|oPu`S6IZYWB6 z6DWtHXEIaCf2e^DJ?a^Pk_TbpHk1xVtwAP4zonf*flq9apm7k$=^@Q;lAl$al!Yqds%PNq0~T# z)Dj)W^Bsp)-TPgQosxm^y$YtVg@$gCY#Z(YN}Z`aWu`r>Qb=` z2QL)5R5iqP(|np%$7}8FJ`?sHVgng24yoEM)n-q_DwYY#;2y;FdHD^0C3R0%#d{nh zSBqRQqi3UuJab&VYAK^6D@0aqjRE?Arf;nhL#8dZpBza+fE)!+?Dp;=Rp#l;3LBN4 zy}Oh)=Ro)ypO)+ZjYGG+NJ?a)s)a_x*!>h+yftN#ZG@d!Ho@4UIrJZUg{n}`{NhR% z%0Hbi>!v-kdC&|W=V5`~dT5}re;x+uvXr)S@6W=@u9DEHoBlVul&*3lGHkS$!>Rq- z-Hdb2!&352!E>=a)NG;cI(y>zdMX4RDxV3pevF5R!~fW~NZ50sLHZC?NCkMiu@z7! zF?idhAk@wp_>ort<;+bdJXfQ(o^lmT}r2*h{R z$H7CrOfO3!n$fESDHt$s)rx5r4@t>e?n{YbQ2t@rhHpZtMZCmp`OfnLOsEp^55lDq z63Z6lZxE6qy}da+jn(T_;{gni;Y6AOl<(CvR)nU=W$ASIV4SmP4GvuiZAHm&ReTFh zsw(NR&6fk>JS7m&%Hymw+R=+LC6}+j_Te2jLjTl#e*W?wNh!myVo^&+tYAfMa0Upg zYM5Hy9kJVz^uJ{lffJv9G+F1!1!unyEl=NWMn|T1%?huI=b}Ik>?HNbtBME)Eev-l z6}%t$UEsyjtTXl?+qB3Z*;8!Gr`MEQ`P!Jn^JtrYKdnXtMNDo}7h39ydN3Orr<%FW z{%gK(yx8f9{q3o{`ks9)f5msEKrg%J#W?rh281Td5v+!f5PCpR+!%B zrJBx2x7Oq0Ar(ngx2qWl;peR3i460%%Vox(M36ohu<9K&X>r4MCJv z6_vut2hHH2L2?q6y~lnwGzV{;a6w@TTK1w%J_wn2+>q2wS?FpF@F45xiNlfMYsL4% zco5WkmcpU^CJ-d&{v7$^;2;V4oCp#iuBE{q8Yv5tkb(4ANavn@HRx$5UN%y7hbi2&t?{Ffefm6>-! zPe|G;V#2MLP{@xkN;_x?1WBl?IxU)g69|T*;fVT_^fAcgtM+l8zo(vimOIHDdUjiL z3ksO`LcrGNwk=ZE=?O&c<;{YT8S9|Wj@&pq@Gsw1U%NSb;p^GIk#w3!8)ENc7Pjrc z1x=bLAY-1A^Q;fleO3BuzcNYVP`>NII|(IH7fmNWOp89b8&diES}~+fW_N=L#`A0I zvAJ=iu*#4fQzr-qXdEg{AE`5eQWz+}d%v%?RlDHC*AxMZlVOxzY3F1m?)AglC z^XtegG||eA@NG}!Z ze)0vm461)?CyI&!<5-I)V>~E*XXwl%**NHb2Hi+ zs5NrSbpL>!B`~KALl`!9DM(bRTm3+|ar`+67nzztw5J-z&}6F`M(c&24uiyz!g1EA zLuIt6YJS~MMnzJ_{vUT4#+6CGlsMJ|5BR!%n+h2{V#$o*%uUdz##CbtDIZWc*F*JL z_`k@E6JqVGcl_mPs!OHQXTUByR7FUP=5?UCphuX$ESWPyesbtf65lSR+YDtv# z;)-`B1_`R_3nK&J)BDt8YueCq{QWtT!Z5e)Ds`p)lm=T`j2b1CS_=e6*FLFM&A@P(!i^VxoKD67aX;Ox_!Oz*pn=5;z`qcGd*GDg6)po#u~ ze!5n+;gawtA4&`}XI9mp2+Y6yNDi7c+BdWz==3uc*?3)kM5|y1PECW~M?ToM81uxp z*QMnZ@XO@~*lTSYNOHh0oe8z+&vI2S+5Uelon=^5UE78gP(r$;!J(1vMslP?y1TnU zN|2C-LFq<8x|Hse1`+8Px?$+%ThDuZ|NQAO?7h}~UvcgkN^A|yqQ?ZdgTWPxDtn;t zKMJ%x*|fmh)F_Ji76dY>R&sn~FBT$JG1)+AhoK~JGhs9&F@VKR-HfgGWQ8V!e7TBe4gg+?;{Zn}tW zV{3R*9F1Ygz*p;7>(OsgqBoml4@Y}jt6ycoX<5^p7rh*KBrGFMzmSbK=Jfk%^yjNQC&ht~$g2!`W>j|PL#8T5D=5|V0H-j5cT4&qZBVXT=>(6R+()Rx&hHHPJ82bPJ{zALG)&oD_(Y4TDp{?Jz4>!X|w^7To! zV4{zEA4P(0r~T<;8?o7%oJNsx1dT)800*Tr0{ejiGp0LC>fCm|D1Z zNR8}~RL$rey#1r>4;>qJY{=2jOOrlapzAH;u84}~?HeA#V;L3cuu~>GN9VNWnhP@d zTfTtgI+7IY(b~@eUJsO6&H1i%+Iw7u-zsQyV77ie6-#L#>PX5XpKL<)}RJxOP3R{#h5TD`GQbdC`pff`};JVen%mGE;9uh(DR z)4oAUifuG*4;vx(v8=&_6aO0SyDwizT&4sb6f~6y=o@VpPWSOE8co=dqugzUs!$_r z=w|k{UQj=J7P2Cp4Sq%p4AiNSy^4hHT&vz?xb#-M3zAjZ{uT~F{r3mgb7@_7sgo*9n z4XV4dlf_qB2W6~H_fctGKjGhp$pxM)az?Te7faNeyeirE4V0g{pk%x%JVZz8zZTlj zA>(V+Jp1xdA`1mZit10@@G(2OIm=FvV6XLwV#TW3N>0bWu>@2EF(;h#H(a-D=_6&4 z$)a7C`@v3Yf+wNholVz|9HthWmH<&W1A0|6g;%FjQfj-GfCvt6lH1TT$nC<9rnoOQ zOE=TxrL(TNY2g>RDJs+<%E>l67`63nu^R0WAYndI^~b^Ai4i+PiLGL#WtO*EuWnXHi+qg%Q&c@@s z$>fyA6$0y0vVh8H@^vMW%7(ohP7}|p*E;&fhii8BIWLnZfOoO{{3q(0mZlFl_qC$K z6zVFR6!NOP>j6wlh2&t2Z3}=CHg&17oJ`uHhx(qh#%d5+)R+em%;Wq#-Ym%iQ(Vli zwG;>)LNMt$5m-)?Mei>3SUFaICMB+K6ydZ8Jst7RUafXs#gh+aGc4ab4 zU-!Rqt}btigl`C;NUIUbaP#oY{4_-#6FvXAG(P^$x^{lq&el1@nY1sk%&qxQCUqQJ z$$=C;`6(Sil`D}e7_Xk#XykRn$+^Rypf}eKi zTr#^=eDV4(qWPC<$=&0BDBicQJGJ_-fGa76X{iDITDkKFkqiU00YG%t@nld!nLbt;^2OatLop&roe_#OdQec=o0)ioW zd}BA)^oF+%m6>%61T5MU%6OL}&{jFQY=s{nIM%}yy-7zE)(ah{wx6HBdxlz?%wgU+ z@9b$`cx~pVy)r9f&`6I*HNKfGKJQ>>+j(@#9G%R8WlnFWAN;SPLNWq=%6E_W%GYgV z*vMKyH+_UAN65eL>^M3+aDPx(uJ7e$M$jZS0u7D(L_<7rYO%~{dguxZMZTif`V~7& z@;eyW2*1yA>mK(LjhUmJN@DRfNyh0WG)*=J%1$RU!Gc(DBktcD)mkylO_eq>Jg zt0g7#7Emg+#Qss_awTe`!MUto`=!qEYMR{Y!1^=nj4DCKJWP>w`hee5vF0@gdZ%N- zn@^_B4;+@%* z85-hZkdjwk^8pc2ss278GVezy9hY!(*Q2Ek{Qz0m%?#_%OR)x+ap0Ppj7O93oUY-# ztevU&gHLGt!$awU=g}#JgYIaob*%h^C+|VKyI_e^!oF*b&1vAj!xHn&ZEjH&av(;z zjD8EYY3ghX_X@lipa1D0&*_l_0^+%>gd2UnYoA$J+5`6uD_U%XC2lsu2-m*_?Kk20 z5=`i1z8E9zKjq-CynSGxz$UjBaO$mYZW{UWt$A*K&Zs}#jEIcirphVB5-Au*-Z31D z%xrUOLvA_sQN^(fw;ttFr=H2}g-_YOi8q_3`Y#4Ub>pRb$LEgwe2bE1&-Oz9n{;#Hlp-xtFNseT&7F7{o7=(2Akfs{g6|ar_e!W%91f zY9b(S8hE8uQ3HM}u*KR3ll@D=K0@`YqnGUXd*Itw8mvR;+^MEOWmDSe%@Ec9HDyPLkmxPUt@?;Ogkk0~k;B}F; zZkrd!<5lnUu@FR$jNB(smS{~iyG z|Khg};qX@aB3f|q?J(Lj_S>zDDd2{tJW?w4m!RE}C*NHRWGahO*h{`sefP`&t4t(v zFR_YYZZVy6A^O8r(~^gwH3OYsgjdP(^T2?7^bo2GhVySvd!O*CCuqn{f>MVjk4|Gj zxQkLAJ#Jy!Ym<$q9+dUn;ghuLi+=}3f_$=zh@DnpFS~uVQBzLhkBo+mof|(g27MrE zza11})2YvBN@j^XsL4kp@aH<69y4!c^3k9dsNy+<#G_TU6WOad_1R?^;cc-?iPb<@h@_E%D-KECsj5t)SaAB<3a8V5X3#9z+U_JotOZNzces zXJpFmVXTsmvsb_?6;7#-d$xb~kJb(B=>DrXmfV=?Nk2=n53Syz<$8(cAZbjo*cxMUA7^M8o<{#ow9yRF&=-Z+ z^kTEpyoI>he1`xkRR8EF{#|;g@iLD5dgPLQEoM^gr1Z$BtBw+NMsu-eFt)k4*dB!X zsBhOwOXQ@ySZbuLrrIv9qY4*MJ>tlDMio?)dpTpeyTZljW1wq&lcue>)3TUj73Gbm|0)9$FKq2B`61_<_=G55}ugL zfVmUP$lRild2E4=6tpg(9FG+ltEuYBR$IaGpXtWbvY;Qb9m|*}w^q^=U`&wD#Bj*; zw3&^|(TACXZE1MzRA9wzZb0dx##CDjtK9Hze|L7qA~DVcg^!B_X%cpFh$)xK)e;K) zsf=4=z0nuZ^==bCO$|iN1^Jtm!k44-O9(9>U^@HWR-Tb(Db&*JMDmLDw3FB8p!M8m zAr5C&AP5%GE`EX?opQMHkh7%J^kVoOc_qi<+xnrgm00G}PmT5{(FJE}P%k&yaQ|l} zgD`_~mQ>q^u~P@lS^%a@KvA4ilWKx!RogxmNzbF(+pk+Mi!2wv59_%I&=D3YGL$c zYkaNlCGiyzYWLU9dmFcW=O{kOKa|t1w<%U2NEx5ySst42YK6(Vu{`$r z8xL-uY3-(U5#-j#9&SYy=!O?`_2BtUnD=jm)sj(TRtb%P8{*~NLGV_?c^?n+UWy`w z?D5?fd0Z4T*JnBXozg*f&!>W!SnH^AUy*KjtG@omE06`-*O1d(M~u#8Eqr(^1$C(! z2P|SYA&a_w$MvE1pt#P0o74UKWm6Yf@!$%RF7>BUgxk9qr@!pSO#ZICU(&0>la45F zw!;g>$-!151T}(Ns(=jNf?J+8HuFF0=t)Js3+xN*j4Bbx^+RE-69Q`QG-TRg`1{x* zM)6ypw&?t2f`v;gB;yBc~~PkO0;OT#G>yq%$J z6hY7Ea?kA|RP|gZe9Gn;%J1gQvE1C6(jQbFVOp1s-!s+!A^z+O#0)z^EHg2^r-|~{ zjOBHeYb*(vp{(m~)Gq#1Q3_K#=RGm*BL9mhmBn>sk{=B{=7_8JP(39uv z0)aDb>-{HzSC`Xh{e;{}Vvz&3$ttiR({9Topn);)%yy?!dS*&^lKR<^>Hab$af<)+ z4I*GKaI|sJoV{|vVXV+*EVE~4*_obI<{0PNOJt2`UY6*Y+EO)H_>6&MD6euRw~9ff z3!=|MVqk$G7&%+zwY_aylalE zr9Kgf!E*+QaO2@@ipPob88zO#;{AGK?)f7KU$1(dNkt>c7{i79T@vRHv57Zx(?er6 zBC=a+4QTmAkh~|I3ZhHNUv~wBKbhKPAPXLxz$Kk{E8t$gLA;A*dYE#gW7WYRBAWzd zpFb@n*JjJWI=1XJYX`EG`jSVGG zr^c^0bBwwPS&!1m6p*T@}8a03J@9zF7>a+&p{6d|dHJ%>M z!>pU%$ZaeBWc;wBJDS6tdiN9ZJY|!H9Kq#xsbx(m_-?3Q%+3zGs(tebD$YNG_+C}d zQs?)e=M4eqjO-`R1J{rIs!os$8D}~u53Y005t8xygA&2clxutK{fyql-i&XQ{8T%H z6+gC{5xFhM9({29pol+Gv?59&AO&84Rmqh6AC!oO5}emV*1dIPXFUo^(P#>oPyT@D zFQ{5!E-Sm%r_LC@5*m`}CYA zVsiH1FwYACwemTk)3TjA#8|v5JQL6Vd{@XLAOzJFWbW2IPq%_vrCM5(ChlMOcug?$ zVX;937FBD;x(!v^#$I2x4iX$WS(unI)EkN;Px3Zi)T?rP&M5@m#hylbL=b${&bceV zKmrAPr5x_i)6E#mhgD_XdT%^{j%XxuLiJvJp-HR#(&VQw3Rke_2hZrITt+oL)lBDaz>w4`5`U?=vdG6jS1YSEY!_8 z!54+2t7Dg6eCcqfTE}w8ugc2AFAgqtadvX0I-ev+ivrqU?}8I(a54Kd3TkMOD~CGg zN}9U!@T%||YAo)9q_nt8y(n_aSz`>7fdL0rZv6|s6;Bc7;kTVA#11n<#>PgSz|3GI zjZ8|}+=?(3&bl?y>$^y|0@4tjN&QeulbOi5qah~CXdxR%miNEIZ@i3OBc&A^4-Of3 z>})o?jm2N6g<|>bUc)7fi|VRl1&oY`ah$}X6-U!#tZB|7;UrRo3J5=+!|(Jhk4t(^ z!a!;F`+#?yHb7``!wh=Yq>&SIM15Oc_?m>gixxKR6i$Nf6ou%}Kn`15XwOvkd01K@ zv_WK8lSH|ol(p+{S1#Z6nQBRV{j&a8NH6*I?z1E)LU;lT8Hx|RX!I}12Mf%pv z*n@v5qNVT6uQhvVR|Yw(W(ZR*i#uGR=^Ai86oI2mBxMok2u1!V+%x3ToL(*2O%-a2 z0eTSq?3R_JlyFqxBvD+ggFV*$3m&F1Rck}d*Y>5@oPJ95O{Q+Mw%t0v)}Bm;>z;l$ zj~dLr;lHCIS%i~@+x{Vn<2ILJ{xw4Bf7zzp@c1vf!Re4R{LAL}%NY32f#0y-Kpqxt zH6c)sNU3qZd>VD{bl70Zu987d@TZ+KDaU{(f?DE?L84(tv~ZM6Hn(C5CivKJ(E5ZK z>SPq;$M@)e<{0RD|5CK}cl!N1SVqY72F>hR4<~$jdX%BiZvETMI98U}x#Leyc|qqv zTq^%F%03(p%hm0-O-=FQLoy(8=^7idz+2H~L&nkeE9wsTm0FZ5`VxMhdE~S?ZC$uZ zoN_Z5oHAmb)G0uAHR%!Cd63SNgr??Cpv=e=xZ7E@l+Yue#uxusp@(iZ;GmuL?VQS1 zUbh3WbMaXDrZ1gL0JGHL%%_`d>~a`HQk*msc8|3yLbk6YVY`zQr6JAa?}Bjqtw z_vnlkODkSqX4p5bAub!N{xN~amxAHnFsjs(4CPIrd_*z}dq3WK4o1~B>_q8$ct(s% z^dN`v=Ou0-f)5gM|g2b+=yq9l9jZ!{w5nV6% zFUf$n`LewxieA6;8jzU=-dCW;+5|+qm%RO=&$< zZfK^V1Tjkzd(=B4)o6FP{#_BgPu@xTs#5!9bZ<3OH9VtOI2&m;gp~|91G}b zQ*;plnw+?Wf%=`1R>f?mSWrNuvjJxqIFfwNvOF=_M!Ogk!KA}Dc~tGj9zNPke(^pv zQOVVdJD-NLj5noll%}M_6&?e>gBOS09ZXy=T>Nt1*~Xxy>SWSCp~YuUNfID-$Sq)% zdCX_4$mEOa?A5(8#HMp4>i+9G>*x_--f#c|8SK>@K~uJM zAZx?rwWUIe0{GW8LfTmkmNjVH<}1!@M3Mz(^2!LEK9ro|U5$kLHaX$OmfmeEf?r$q zdTxx0MuPFHE|1*!?7uLFB*gVX3wO}#poe+Z1+N{A3;v(~BOh?J!BU7F;a$bj0I*RY zLeafeb2>JyUF~rDG?PE=$Vl|-)83c5SwF-Bfh0`ctDzztKsUH zCNKV1E)_{)Y8S_$Z@BidL9gs&M2&?yA4q?JB(%m9+4YC>%n5(n!rfYp zdrczEgTKj-a@{z|)#X>!uqo;uW&bY8FRFO=xBGXlYbtEe7YArEC$2up1>Wm8 zst)Yzn>~EF0l0`BzN;r<)Al!ls;lm@K+A}ft_b9<_|d6gFa(pa|7*$Xbgu9@zau}^ z?>|xfCqy9pX}ImX?3~fb7yMkgOwl=pe9<71HOU*v!s04h(A1XoPJ@;rdhJx$XSbE| z?k>?=;k4=cGM-&t(&S1~*a#Kpg;e#+J@GA3yEOb!YD7kaR%9i$6{&&_cMa6n9 zdk-P16y%idzPeoos~9Fl-d|}R&kKOFEj!B$x)G~UagZn=uHedoeOcm`Tmt*T|G=efPVxQH_shO4CP{V@B;h}-H|SZlgLE1qikD9%_^P*?wZ zuNKiC`@YQfqiSH+sksFFNFK(J6E&3<&- zQT&V9y-0?(>PDDvC!Fqtug;6XeHTNmF`TbFHB4m~+)q!S?HN_0u2a*PuC2YFTSG&c zGY<_6&ndH@4g_J8WzG~3Dh9VRdbl}g{c}5ll;I+tM|a0T)x=*svw>tgkZ(eOXyimY z&8I^bOo9YUyzbCjV_hk8d0fNE#`}^qv=9^e;%bj?zyogv)9TjaI&DSEIfv+Z%F*#C zESC4MbStOcsOK=8|KVa6qY(SG)nEd?9ujSo+xuCgNefLDbX;xCHrEFWuvb`A5_EH7 z#|vqCW&w?uPxE$0ZF)EbXkRZX%h#((h}}=8YSr-FR#YNlCQXaJw?;D>>y8HCv_sp^ zAQh=R>G{JJgQtIXQnCiSu>5olH5I*T;5oE%TFIKUvjwwQ2t|lE)awSwLlEOj`k$_7)BHmx_gqU`dsMP zE}m5FqO=`FVhf0Q*Pw$v%M|rJ#_6ebZ_}Kcz=3TCp$rIy{YN+;dtT!7E;~ien`tnk z)Z1-oJs8yV*rI@sVQKIADl9EfulWsy%?{1T7A?n!s%)U}hOaG3fh+hGf@Rb0&USUd zN#>-7e@iykc)KGD&h6C-j-1FLb^^3}Ysq-i)EUdfhi7TLKT%z097vlYY3_=Sq;P2p zfA|;xK-M{6&b&H89OT?3*;~i2#!(w|?Phu2U58oze@_HNv^GFC!wYJ$)7QH1Y*QpE z@#!6J9Mi{T$NF!r1llDuXpqJ%Q08*$H$US3VDYR`w>XB?`9UYM|h5ayr@X8i}FQkZdm_ z?BXI?}3MJr!!k1^>xu(AZYKt#p};w*hU%gEwj|Afts# z87h*@78@C0lZTrIeuiL&eE=@eK_?pJBA#6GR;`ycW&P443w!hMILx7ioe_1u$p)vt zN{ABFH7%O=?{+e_;O;{2Jl3ir=+KbzZG73ty{6o6KRLrR6FO5yGnC|_;tT88sr;<) zkXcWd*?wDG-x%(fJN3NN2v4@+DPxP@{|N!lJ@cSa9xJ}JyfOiDR1E+ow4Fq3H3lw$ z!m>qI2Oa;u@NY`h*Gs;+#lC;PpeNDw+pWo}eXHg9$Trkt=2~}jv!2+#>DojQLgTQy z&5}*M&>B#M;wfC!kV5@3*V{KCepQ&waynibi?Q7w5%f&kRI@VRtp2f~%FHtaw?a9T z>NacTR}XxfY_3{D&1`8%0uBt-=&{pkBsJ6VSqAdvXQT$ z62DhV=g=^HW@+%IbZ-1Cun`8U39zdiX516#=j}*^T4G8^bGi}+>0n6 zZ^kA3*k?=HotIeTBAa3orFk)Y(F(9jvK-9E$v@psP=%>;C0!}tQ{&yZEKGo8`ou|lAdT>n&MG9Sg+tS#k{I@$XRn*DkY1r&Q zS#b$HSZx#2WnlAw=eLb1NBSP7ETaZ8D=*b>nSLMtx39HxNtz~8s|na*h3bL@E!}B+ zf-#PrY+TSivaF#R?+et?Hz5CA^@d>ZNeE)DDC*m&@LD*w;VwT#&L<*cEF zFhzhw3tI&qhWz#AC0{S?-o>!;bu*jaW=XHa3m@F^2ZT8|^sv4th3}mM;L1&#)xl64IN|zLV zR#4oU@oevs)7v2EjtbRUWjo$B9WXCJPE^+HFF$H3Utx%*2=0?V##C6^S97wElk0Gej+{(pWG| z`Bq=y!gn0&RQiKT#2Y;TPf6dWf5nHcJelaoO;t&7M>RJOvLBwDW+q%9xa-0jmv0jR zm7C;^I{jn2H*5(XWJz{h?1#Mu1D<-YZ7PMs&T3e%{yVHsb&{X|J6TpU2|;XV2UGUH z0Z3UL)hHz^y$^d1NyB7Hs=*oQ|( zj?e0-sPSaQeZ_T%k$HtRLYc=cRb_X%tlypjt|o8?!uDNZJe=rITsCP|o$q!DVoivH~VkukN?a1?NVt(mg@OUZ(8K{UL8lq@0 z0ElhhD=oQ>-N@G&IYZ#Ubae%PNxwd0r@OpH6G*c^29ZE1bu>p54O;X0z{H*rWCDMB zg(Lj3*1t1W*8wu0Y(HyW!wIPvHDdNv=KA}YwU>e(C75p8Xk+E@+DHlHdg@;L+=$ET zp~!yT74b5V3<~}Y6_3DS{MUZUvwN^{wt9t%j}kbd7Dt|jCba0sqOdxSvphqIacIAL z60^IF;b)->AhOuJo}3LcWZUNp`LAW@)Er=;=pG*O+fjW9D3N7lgs^)fj2AUN_MSvu z89gg72S9$50wn`{%1$O%S!qHPdv6X&Q1k^wgTr?*i=O37CE;V1jI6!#dawu~bCy|+ z#or)vi>vf>GBi_zBj{#RC^dXQ+PMNgdnurvoHIJCMnq@{luJcMvUqj%={LS={81$j z+V2-oTAWZP8U~HQ@z3g9*+-wc{{8C5@G$|}?A5F@6@5Kt^t_XJd{p49M}!%hL1Wgn zVqMjTZl@?%tN-JloqgxSmG83pv!D(DvQkhZ#^rVgVbCs$>(y;=rH*fF#cm(#{TyYG ziH*)V097@cs@R+>j0>lJ8k=J1A8DH{ITQ%<%#367a4k`wa|zx0M}LTXWZg3(Q(gF@ z)eV2i&$VlNA?uh;g}18}^ZXp8nV{#GlaVXZ4{3Z(5oUwp)cIa~RBW)iy^pL>FNj5f z4&$$Vx>v6L1eneEQ{pK#fTt_%lulhauj0)lXK(#^f5Br;q!~?q?W)D;o~4=r#N#TH2~1f=x7hr%a;m7g%%QF*wi zo2y^hK&|~UhsiYKl!<3S#`_E+uoH-*d>|G0ct!`{6sbZbF{}H8zG26>x`GU3EJm7ovmX+RrY%;h;V~iLS$Ylm|vIdje`*EOZRf7HV-Q)r^ zxr8qA8X!LamQiFRewvm+l|n+wxZ3Xfhq6|@93}i5sOp=o_2L$)c*Z>XF5;9xIkZ(w zmHq9}_%~3}qUU9WeFTx8s88$7x%Po{c-n3jTgP|3Ur_HG$xxQ?m{MKHLxtWJ%IG># zOoJ}g`H^qJ$HCdty~;->%qfGv1x1smY_YXpN-8`jkX~pwl{3jiFnol;Jc%AfO>iO7 z!i>*Dlh_)ud3P>&z#ZlEZuw7d7*F`|ZjIx<^S*_SEwv%%o&VG$>3# z)h&;l0UXklk=zDQLQv+j!3ou^vy_+x1ma9#6cnIb7eN@Y7OUP`p`H&}jU?L<%J#ym z@&Y8QrvUoBv?;N2;lg_plX-J!O9@g@(!)ooIa$u`px&|b6R|jC#rX{qaddyL85Qvr z@kw#>Pdg3xKM!8qD{Bbo6*$UkY$7g7SpM8OmA;}NfZ`@tBnAo<10e$HCNksO(G(8A za&!X+G`(92PEHO~;<;sJkJ*OJ*A#Fa){G0JYW1I+<7(MKyF733wR0>&u4oSXU{Hy~ zDIV(S%*l*v%;3=eW9<(Tw1>60PP@!=*JGJq1*%|^@-IXTKTpLz^hN5qs3yr;by1dK zqae*^gdqBMZ?rtRB_};)q&tnG<{0!SA+Eyd~d85a}(h^jxZqkvGw zs^a$R*C49%$+^sG{^9uzNuhqFHZQ-nz{yhhqQio^s!BFE-a`cRQRjmA0 zOoHv4D*5ZQ~4W94ng3Z*JF(1FQ7q&iGfn13tK;YN+mP+4djl6#gL z0;=tTmo7JE!Bs-kUSy#EbFoNuBD+6+k}A%bHrfxQ$CWY)@W~z=ansA7va1G`%D4$|aj?&Sj9)!9 zfBi%)`1T=7X3frQ3yZyo5(S^9<{5C%O>5se%s0_FfTfUAsm*`XXUVWRqlm--EJo%D z^oa^ew4e|^PPH!SjtWSlGK;w%f{?*A{W<^R#|=u+$2pc^h0v4Lx7o%uFDH2c%@^3g z1+4hy|F+!#J`()xZFSTS7O+L!`!Bb?Zp_av&kO*RghkN@JQPrNl_kup;RHlF2DwWP zNnDW91saAVlbn|wK4@wZ5L6BUMK->!0?qTFQ{k=EQnH8EUQRXy#EqdLZxaGp6>`nKp3dGfgXU=3`{=lIQmim@ zB??0+dF#(4B#v;{WO&k{_hdU$G{D)pB4SK^2zZD*7HRkfMs^Cyx&JKuglLT9*3ow? z-FW4@#sU~ZREP&y@qta!5glE3d{R@MDPW0)oe@()j`q>90frfnKYbe^XC9vR0W!Z$^rGQ&F$?;=G+0{yz!nSw=g_nq zD&YXm2aE#lAI8|<8;jAnO^ig83fz+S){mDpwO_j~)k z(8bZy7yLBMNjZyEzLRs6K^v^{;vz_B{WKguT?U}hdKC7^f33M}@1^dTG1h#db8R+4$)61XO~4qP_xCD$h4IRC;{#{%m1Ur+!AePiPc>u(*USVy-hlEcs9INju%;YipX=H!5q|Hl!mTd4FEle4T&Uu) zC_{)cn!}GGh3n&rAYLtrn{-l42>rfhfl=jk8ffI>_zXwvfeHtd5sQrV275YX1u6f9 z%i%wR44mjOV6t0T_)-x)+W{a~NYsoadeLI|q^UFyCJ>N$`ZU}|dxCuov5Cv(yOWNb zzBN^UD*Fqm;ei2W0?<75m!hAzY8DiT!~lH_f)~M7YpVTv9>?pieUldl?xbhdE3tey zQ*hjq;L#;96}mV+MlfCE7f~*$t<@asyWUWd_lzILmgE8fA3)`3O&gjl(qQypn4lgtK@ZgbaUJ2Pj9uwfVfZ}aFQx$Mt z0K=walZbe!E?{f4-7s)Mwz?qe6*M`rf3>wKnMVOS-5KJ=wp`SLE}qPl9ejx2zajY6{?mGO35DM+ox?r${r+TnEQJhcW%i;sGyT`N5xfL_LJ86hKFd z2vDp;%)C&1siFI^VuwbOt%3%FF1>J)G7cZBx6DmD{slo&O{T^!xv-Dx1o3D(Zvq}s z;~B>=4Q|}T5)lK1COB%LJH6|ckODh0=gK*#V2R7Wp5PhFo#Pl(JWdZ}bLcd`X=!~1pk=MPe*Us_o=q{S+J(2XKEn;RET2AS}J-H zl$7uU_%NfUBk}(7ex*p)`QuFmQ@&ZQop3nHYf4iTg27X67ZJx)242tSzSigL`}{9c z47)Zwsw&$k+vjCVmPcwv{9Ky?qU(mf`xmNoXX=sW1JL~y6ama^ z6xG#)>Ly~=+4MW+@}mxB1~fr8`46hc(FHC2Qe{53Lh>|QtXKQPq(a1JR>FpBc-a{_ zoDTw28)AVGQ;P1x>WH{7NQ{huqcks>GWzFy#|SUV`LXq#1<_t|DM77+OU9qA>avH|EUK2t%j$v+l5ksWQ>HGpP8SlWJs2b z$<|C;mZ-rUbM3pfxi$fzR3e-PGgF1}{w>?ax;kh2nMG)Z%J(x_XLDyy^iSu)jPmbS z3(x|ekM1CFSKZ2lu;ja!<0bK*EO+g4YhU^QcX$+N{s|zlXZPvEi-RgB?DF+Dt(a>D z$Cyv?&3D18h-2kGMHMQS9H5b4vn$nOu?+&nXNag)E|0-$gF17M#zYgv_CK6hE)!Yj zkFGt|Qd}b>XT0E>`ndPU>x}iJLFj|h+ zi%}&n4S2z9*DRwkq2MNxD$pjOiK^!lv?dM;zpn;QenU@bBar}QRjrVfRCZXolUIpw ziiYuZBp_^I9Z0=(Q`c=T$|j5_0Pt?&XAD@c>sYEV3GhuTDqJ%8Krx(YWUI?}4Hv~` z53SnWS#1770RP4GT8(bf?rPLq-in0eRS+#!)E>4`d8-lt@0uuxYj973>@;-0VZ`fy zANOm6u;Nlj!+QDc!jGUk!hhBxy<6%?Z{rZZ;GtVnNiWVF%b*?w;_&Mb6g7XN*2ub^ zqj7@z_G_jwZ${C`g0QTLzFk(|$4Lk}L8(O*#%HqdiHW(Te}vJu&-p!jS@;j_*+*4e z=XsI>v@{b+3VsN~btvM8&?O;cMI!i&g+Bx>(4omdN0oN9AuMy_dc#r&@ZVJ>g{iYkyt&`GFhzZc z3e161G@GoY5YX;s&n3^tn_V6Dz;2dYq5@x_YCYKTyX>; zKx_|WL{fGw^@W(nO&F;gFsF*A?=Wns{X7Pl+hG@ zM8zwU{;s!lOMFvK-bO&q=$l^b>>v9no(}gzE_J_JGf_?WJ*+x$JFHT+Y7_yO~1 zY6%&J_Q##JCp$Fj#$5TLc?~?NPb!-BPp-^WC8iP@26lrb&CLsDDyx{7d$%f5#q+)XnZCjTi8VBEjpe^gM(`>p=>U4Ot7#GhFh~GFp=J{HA4iM&XQyr zy!$26Xg5j<1a~#r`>`q86q^^J|B)B~QF59Wc!5AW0BvSs^&d_a>3C#=l#G4w>PHEx8{Idm`=Q_X=h;-G%JU14H>qSC&{Bscw?4vaFl@gUb#&kPh3 znGnL!x1sIgA0{bFnN01wY^c#&i&u74LQjd$On6QSTfx_pXh}{#({>MYb<4{UK&q*9 z^q2oOI89}5UH}mB?;07U32bc%=BCkq0kIAXlOMBF#3mzTEQS^Zn@MW1+Z5D$oOB`-v&DrJjB0YpM9AK;v_-hC1ltFU_A*4xDr#B zr^h4FV<;AIk{)B!?`KLm6AitE5BAG#O}a0_DHDD6jX%;w(!n72)5yVN$Wjz9pqabA zSd3<&8_ORXGh2#37(ZuG>2!7{PXOJPg%|z@f-&Bd^4huQCQw`Fj;Lnp$~TqdthNuT zWp7K*(NCyH`nPc7H1oeRX5=kl%j>10F;l))x~N}bzX(0>!CZTs6**lI9J`4NTJm0Q z^*9`ad3oxcI4X*-Qb1H3KD&D+`=Y~?$s{hNkeWIp2>Nc{uzF5^Zu{OSD~nT#t1==8@B$NK39A8h4g5H z&Rl1YD1WseX{-Jkl-Up!Kk1M9BFQHipISw4o1NGcwPYxT#pt9tlTCc+oJxNVW`}o+ z6=2F2`tEE$K^n)3Cc!>GnK_MknXR-s@vZE7cp2^4(DiYEKy6tdIzcs|>Y+&Aq+!u- z60AXgC(OzG!au4^I#Mdrx>N5XOm%EZ-dYGNE?@DIPuHs%8p^2&SdXYQ@_u#TAFEjG z=lL3(&XKiqM1FG`A7F6hFU~H?+dQ_)0)Ow0FHdsizhys)VE03v^L#csfhF4cHEY$2 z*4xGQns{hw@o`FY|FGShW2UwmojFhdeP5aw-~ai{(}i%QhI-m9OVs^Wq5IcYXz%xI z+8q~iezq3&;XfQ2@HxIMb|K3s;G$05;JKus-&}5TnZ$g9HaK)oqd56IxWa;4H;*Oi zb_dzIZozx4rp7W>@i&R5Ms6d!WSdRG;3lHU(z%Q0HZEz97~#Xaqic|mIzr@;%=fp- z{8rBE;Am4{^=PYgo`2kcBsWM@MZY1Oubeh2d{}5Z912O!uNhWtGciderW)xjr*tHY z67~$PaTf|n%W54KYG~ZsoZ1(k>Ao0Y_5JRbDxbY;Hs7~VW=z$$rZw9j8sntnwU!-* zi?L|#nq28*HT&m-P^b;@i@Xwyz{-gJ>_fUVZK@q{_cPmXfg?v@sUFhu0%t-{X9IdU zvpliL>xFw9B>luWp~sFpEe20I#tN|x%fD?Yzn`z;=D(kgL_2=EsUz!-CmxpBer$rC zbN;k`zF)u7AcE{G-3S*62fbqiB#38dt1ae>4hORVf93r9A$a2*uFoUQ+9DZ__cktQnZqa%7^9z1GS>M zn#_MLSgh&0K5j>@H+`!MenWP3PBsO@TjBz0Dw->!vA=kGI+Ny1I`?sh)81vrA7O?{6$`Jlu3Xf3jo8jI{VMU{C+ZL>DSYx{eR#kDM7r0FAX(bhL*# z*fYY;-G^zd5Awe48>tPHQ|9v!Pf0283zu8B<|2|v(R((+otu~Q@SPi&&gA%I*GZmx zrHAQsfpVYJMKUcxb6qv-me$MMg(Ylh4Fy$EFFL=|w50aa`W20w8HtiB=ybG&_{4*^ zvZb?)-q9#O*!3ze9PA~LE?`*-qlp~rRy9)Y_nzwwxfqI~P+9Kd#Hm4kwdeSR+wcEu zI-MTd@$UDS$z+mLDs}EiCX-|`8H7E@`_1^?qmL?sLqiHI4mU$l6z?T^se*YBBD)+% z_zD<_8BQRj7(NK}&*S$tAS-~LLB`DIizRl5=gATceZ&r5Jj9g~A1vC2;$Ih$fiRi- zNZV4vO_w9hUP{>MllEp~VT^=rC@kBBKL+gCd#rC)BAa{uxx+(efBfQWgwNP_BeAF8Ubq{`1jTh?*s4a(&5)ZdwR|9fA@(_eu}XAMC-jjmCwz6a}}Yk}v2Kbps*56c(q4 zCrRguJh-KUJ2td4I38o??!$cd*#ku4NtzpKaH%R@kA~Z=p=tKa2>Z}97k;lBx8`E+ zffGFXWY@SMw7>1`JJa?4_dcvE_I&U+J7(j>efumH&t$GkO&|_XnpF4I5Nf)Z5&99b zqUEo-w65FPxF0#6;YFk}X#E_&ryZ%ab%xR^nTo)_ArtA3y+w=i=k2i5*dlnwyO{f2 z@lwJ~p=DUd0dW*kL`kb7u@$C6MeJiw*-v#wI;2!C?Ga8lRWZ+T{Jb;($Z8%xUPy| zbp;+xLs8`&$rp?C4^7f_sMi=AnLcG9{%LZ2=y@)4i2X-C^dTXHn3KTYA_+BJD@p58 z7S{hjHa~p~S>N6|Pv5=GK7_r)?XtbIllBfj&FgjdexM0hflRXBjhty+s=<34+3?o4 z0Qc$_z*=Ok=hMu+!S8bU`DOfWDb-DvYY1n;PM?~^%hi}glS{kOSMvQ2KWzN?i6^4= z13CoM74>4{L}X%(*X!MUXvn)wh*Qm5H@4&TxG)Th`ap#(pPeOCQ^~2p2*=Kham%_^ zmWG35@&y_y{O7_is;V%R%wbuAworifh9DF1G^d9q={hllfsUP9wspf&S8J$7R{eN1;^{1nb=6EIvZV7xb|30x$2&IRaci>w zKmoVg#o?Y24xJvQvdqi0YyFv7F@PvQ5v3D;CnUsFk- z!Vk8f-$X3QWIRnYnI)4i^3aw}Zd~2OR5Fb~p3hBdnlVkOH&t#Ytxpa`$QBH`hax<9 z`#M&)hEQEFI2Py8=MI`Fojqs9dd3h+7KNcgv2XxcIyVO7?%MYDYt2B+CERqaC9O-v zK#JZyYKLt;2K*VNm0!M9j3ILr|HJ&ulbBCN?1k{}kkwxALds<{UjYNzYwx^w+2OV6 zD`+J0m-+oOWbJ3_MPAQW4kPnBCFfJLxAKnu?4Lg=zWBr4#^IBvl0XkoG)*%bnTk&9 zmbq!_xB8~Ht*j5+vaXe;`T(QR6l+@QS=CyH+pQ9;EW_{B2vqnH`&&`@J9pRpow~>jT_< z(<1+>i!-^)(PEAu?=Ev`KlP~HF zj!*H-fzw6BU-8}8G}GKxSK%9*oMt+cCs6L=##POjmW3q*t>Ga1j`mR~8n`u$ z^~=I^9Ur2pu9}A0YL4`bain*Ir42Q7wuh-I^I%#6pIf7|JxpV5HIwl)58N&X4k;+8 zE?Mnlm=?8xa-!>&@{`?1_`uzpX|AgxS1>Rw!AnQ`XsD^;ME@9}U3BFk8EOV zvKPFW`u`1A;JwxDo#k$1EPD@c(ywzBF=!vNh2<8~i=X@hMq<7fh%eX%@2ku~AW~b% zJNb!^ezfq&cfK<^V<_^4{Aj+A?@wnl9lF)fmeb9ZlhYZ0W!QUePJ?Ml>2A}O+-R(= zWJy&S+cz)A>(Q`Gi*lcvGQWrJ;YnKS0|Y9(SVCagMj#ST5vcUz^SaNKs|x*fNpr&z zY+2ui&#Up%7mu;y&W$wGRFW?mG}cyAG%Pl*Y@)VWYD}fFMY>+==1~7c-sLTOIbA6H zcQTdS3qMNm|kEVs)YUWeB~;-wub$#l+x|HkkaA~vwIR3@)9x$-?Nxb zbWv<=H>~Xxt5>fq?EKkJ$Lt;E1YnLvW5H}*uYUZ6BcaarkQ%C~#I0!5P zV+k+~!QtK!QrQC0WR~}A?Zh-KLcvPhZWT+YcEg(NgjP|ogdkHWa&|JoXk?n~(}kkGH<3*K*7h7CKyLfCZ6cp9Fcpnn&o97*Mq(fEH$sTt zE%14b+s5IWENt_hgTu@Mu^%b(eQL3u=wc0$&xi!-mSqj)^0|Y#e6G&raxJl^znQNM zoDDaJ!uNL%jn}t?*O1H>m`>$n-ePG;`U64=@Ksg#DD!(*(^8Lan51(>4AWwGB93mD zn5Knpn56PLiA+IEO{c_UB4;Er`Gl#cJ-TUjB~!^hz@bb-%j7}*{CEv~=VyTjt-EbzI->OCxaBXR2uH;A`&wr9WcgZ~?_ zLr=$nD$_K5wgIUEZr7oG|B2z+8&;(R{JY(5PIsSn9`9LLKm&0CSvmDMPSV!FVO~&X)9zTrqcXk7 z_WQNSuF4>?lk&n77PhC5L57ZwB4gAAdm(Xrfr~Hp&P8x=aE!!NYa|q2ZyKsbPNi~P z#7N9|3Tb30spuF7$4EFhILw2QaBy&NaJYU^olD^0;Nalk7zqal2L}hoNH{n+I5;>) z!ok78!ND;S4h{|u4vvv= 256) { + return '\\u' + internals.padLeft('' + charCode, 4); + } + + var hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex'); + return '\\x' + internals.padLeft(hexValue, 2); +}; + + +internals.escapeHtmlChar = function (charCode) { + + var namedEscape = internals.namedHtml[charCode]; + if (typeof namedEscape !== 'undefined') { + return namedEscape; + } + + if (charCode >= 256) { + return '&#' + charCode + ';'; + } + + var hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex'); + return '&#x' + internals.padLeft(hexValue, 2) + ';'; +}; + + +internals.padLeft = function (str, len) { + + while (str.length < len) { + str = '0' + str; + } + + return str; +}; + + +internals.isSafe = function (charCode) { + + return (typeof internals.safeCharCodes[charCode] !== 'undefined'); +}; + + +internals.namedHtml = { + '38': '&', + '60': '<', + '62': '>', + '34': '"', + '160': ' ', + '162': '¢', + '163': '£', + '164': '¤', + '169': '©', + '174': '®' +}; + + +internals.safeCharCodes = (function () { + + var safe = {}; + + for (var i = 32; i < 123; ++i) { + + if ((i >= 97) || // a-z + (i >= 65 && i <= 90) || // A-Z + (i >= 48 && i <= 57) || // 0-9 + i === 32 || // space + i === 46 || // . + i === 44 || // , + i === 45 || // - + i === 58 || // : + i === 95) { // _ + + safe[i] = null; + } + } + + return safe; +}()); diff --git a/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/lib/index.js b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/lib/index.js new file mode 100644 index 0000000..9a5ffe1 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/lib/index.js @@ -0,0 +1,993 @@ +// Load modules + +var Crypto = require('crypto'); +var Path = require('path'); +var Util = require('util'); +var Escape = require('./escape'); + + +// Declare internals + +var internals = {}; + + +// Clone object or array + +exports.clone = function (obj, seen) { + + if (typeof obj !== 'object' || + obj === null) { + + return obj; + } + + seen = seen || { orig: [], copy: [] }; + + var lookup = seen.orig.indexOf(obj); + if (lookup !== -1) { + return seen.copy[lookup]; + } + + var newObj; + var cloneDeep = false; + + if (!Array.isArray(obj)) { + if (Buffer.isBuffer(obj)) { + newObj = new Buffer(obj); + } + else if (obj instanceof Date) { + newObj = new Date(obj.getTime()); + } + else if (obj instanceof RegExp) { + newObj = new RegExp(obj); + } + else { + var proto = Object.getPrototypeOf(obj); + if (proto && + proto.isImmutable) { + + newObj = obj; + } + else { + newObj = Object.create(proto); + cloneDeep = true; + } + } + } + else { + newObj = []; + cloneDeep = true; + } + + seen.orig.push(obj); + seen.copy.push(newObj); + + if (cloneDeep) { + var keys = Object.getOwnPropertyNames(obj); + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + var descriptor = Object.getOwnPropertyDescriptor(obj, key); + if (descriptor && + (descriptor.get || + descriptor.set)) { + + Object.defineProperty(newObj, key, descriptor); + } + else { + newObj[key] = exports.clone(obj[key], seen); + } + } + } + + return newObj; +}; + + +// Merge all the properties of source into target, source wins in conflict, and by default null and undefined from source are applied +/*eslint-disable */ +exports.merge = function (target, source, isNullOverride /* = true */, isMergeArrays /* = true */) { +/*eslint-enable */ + exports.assert(target && typeof target === 'object', 'Invalid target value: must be an object'); + exports.assert(source === null || source === undefined || typeof source === 'object', 'Invalid source value: must be null, undefined, or an object'); + + if (!source) { + return target; + } + + if (Array.isArray(source)) { + exports.assert(Array.isArray(target), 'Cannot merge array onto an object'); + if (isMergeArrays === false) { // isMergeArrays defaults to true + target.length = 0; // Must not change target assignment + } + + for (var i = 0, il = source.length; i < il; ++i) { + target.push(exports.clone(source[i])); + } + + return target; + } + + var keys = Object.keys(source); + for (var k = 0, kl = keys.length; k < kl; ++k) { + var key = keys[k]; + var value = source[key]; + if (value && + typeof value === 'object') { + + if (!target[key] || + typeof target[key] !== 'object' || + (Array.isArray(target[key]) ^ Array.isArray(value)) || + value instanceof Date || + Buffer.isBuffer(value) || + value instanceof RegExp) { + + target[key] = exports.clone(value); + } + else { + exports.merge(target[key], value, isNullOverride, isMergeArrays); + } + } + else { + if (value !== null && + value !== undefined) { // Explicit to preserve empty strings + + target[key] = value; + } + else if (isNullOverride !== false) { // Defaults to true + target[key] = value; + } + } + } + + return target; +}; + + +// Apply options to a copy of the defaults + +exports.applyToDefaults = function (defaults, options, isNullOverride) { + + exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object'); + exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object'); + + if (!options) { // If no options, return null + return null; + } + + var copy = exports.clone(defaults); + + if (options === true) { // If options is set to true, use defaults + return copy; + } + + return exports.merge(copy, options, isNullOverride === true, false); +}; + + +// Clone an object except for the listed keys which are shallow copied + +exports.cloneWithShallow = function (source, keys) { + + if (!source || + typeof source !== 'object') { + + return source; + } + + var storage = internals.store(source, keys); // Move shallow copy items to storage + var copy = exports.clone(source); // Deep copy the rest + internals.restore(copy, source, storage); // Shallow copy the stored items and restore + return copy; +}; + + +internals.store = function (source, keys) { + + var storage = {}; + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + var value = exports.reach(source, key); + if (value !== undefined) { + storage[key] = value; + internals.reachSet(source, key, undefined); + } + } + + return storage; +}; + + +internals.restore = function (copy, source, storage) { + + var keys = Object.keys(storage); + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + internals.reachSet(copy, key, storage[key]); + internals.reachSet(source, key, storage[key]); + } +}; + + +internals.reachSet = function (obj, key, value) { + + var path = key.split('.'); + var ref = obj; + for (var i = 0, il = path.length; i < il; ++i) { + var segment = path[i]; + if (i + 1 === il) { + ref[segment] = value; + } + + ref = ref[segment]; + } +}; + + +// Apply options to defaults except for the listed keys which are shallow copied from option without merging + +exports.applyToDefaultsWithShallow = function (defaults, options, keys) { + + exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object'); + exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object'); + exports.assert(keys && Array.isArray(keys), 'Invalid keys'); + + if (!options) { // If no options, return null + return null; + } + + var copy = exports.cloneWithShallow(defaults, keys); + + if (options === true) { // If options is set to true, use defaults + return copy; + } + + var storage = internals.store(options, keys); // Move shallow copy items to storage + exports.merge(copy, options, false, false); // Deep copy the rest + internals.restore(copy, options, storage); // Shallow copy the stored items and restore + return copy; +}; + + +// Deep object or array comparison + +exports.deepEqual = function (obj, ref, options, seen) { + + options = options || { prototype: true }; + + var type = typeof obj; + + if (type !== typeof ref) { + return false; + } + + if (type !== 'object' || + obj === null || + ref === null) { + + if (obj === ref) { // Copied from Deep-eql, copyright(c) 2013 Jake Luer, jake@alogicalparadox.com, MIT Licensed, https://github.com/chaijs/deep-eql + return obj !== 0 || 1 / obj === 1 / ref; // -0 / +0 + } + + return obj !== obj && ref !== ref; // NaN + } + + seen = seen || []; + if (seen.indexOf(obj) !== -1) { + return true; // If previous comparison failed, it would have stopped execution + } + + seen.push(obj); + + if (Array.isArray(obj)) { + if (!Array.isArray(ref)) { + return false; + } + + if (!options.part && obj.length !== ref.length) { + return false; + } + + for (var i = 0, il = obj.length; i < il; ++i) { + if (options.part) { + var found = false; + for (var r = 0, rl = ref.length; r < rl; ++r) { + if (exports.deepEqual(obj[i], ref[r], options, seen)) { + found = true; + break; + } + } + + return found; + } + + if (!exports.deepEqual(obj[i], ref[i], options, seen)) { + return false; + } + } + + return true; + } + + if (Buffer.isBuffer(obj)) { + if (!Buffer.isBuffer(ref)) { + return false; + } + + if (obj.length !== ref.length) { + return false; + } + + for (var j = 0, jl = obj.length; j < jl; ++j) { + if (obj[j] !== ref[j]) { + return false; + } + } + + return true; + } + + if (obj instanceof Date) { + return (ref instanceof Date && obj.getTime() === ref.getTime()); + } + + if (obj instanceof RegExp) { + return (ref instanceof RegExp && obj.toString() === ref.toString()); + } + + if (options.prototype) { + if (Object.getPrototypeOf(obj) !== Object.getPrototypeOf(ref)) { + return false; + } + } + + var keys = Object.getOwnPropertyNames(obj); + + if (!options.part && keys.length !== Object.getOwnPropertyNames(ref).length) { + return false; + } + + for (var k = 0, kl = keys.length; k < kl; ++k) { + var key = keys[k]; + var descriptor = Object.getOwnPropertyDescriptor(obj, key); + if (descriptor.get) { + if (!exports.deepEqual(descriptor, Object.getOwnPropertyDescriptor(ref, key), options, seen)) { + return false; + } + } + else if (!exports.deepEqual(obj[key], ref[key], options, seen)) { + return false; + } + } + + return true; +}; + + +// Remove duplicate items from array + +exports.unique = function (array, key) { + + var index = {}; + var result = []; + + for (var i = 0, il = array.length; i < il; ++i) { + var id = (key ? array[i][key] : array[i]); + if (index[id] !== true) { + + result.push(array[i]); + index[id] = true; + } + } + + return result; +}; + + +// Convert array into object + +exports.mapToObject = function (array, key) { + + if (!array) { + return null; + } + + var obj = {}; + for (var i = 0, il = array.length; i < il; ++i) { + if (key) { + if (array[i][key]) { + obj[array[i][key]] = true; + } + } + else { + obj[array[i]] = true; + } + } + + return obj; +}; + + +// Find the common unique items in two arrays + +exports.intersect = function (array1, array2, justFirst) { + + if (!array1 || !array2) { + return []; + } + + var common = []; + var hash = (Array.isArray(array1) ? exports.mapToObject(array1) : array1); + var found = {}; + for (var i = 0, il = array2.length; i < il; ++i) { + if (hash[array2[i]] && !found[array2[i]]) { + if (justFirst) { + return array2[i]; + } + + common.push(array2[i]); + found[array2[i]] = true; + } + } + + return (justFirst ? null : common); +}; + + +// Test if the reference contains the values + +exports.contain = function (ref, values, options) { + + /* + string -> string(s) + array -> item(s) + object -> key(s) + object -> object (key:value) + */ + + var valuePairs = null; + if (typeof ref === 'object' && + typeof values === 'object' && + !Array.isArray(ref) && + !Array.isArray(values)) { + + valuePairs = values; + values = Object.keys(values); + } + else { + values = [].concat(values); + } + + options = options || {}; // deep, once, only, part + + exports.assert(arguments.length >= 2, 'Insufficient arguments'); + exports.assert(typeof ref === 'string' || typeof ref === 'object', 'Reference must be string or an object'); + exports.assert(values.length, 'Values array cannot be empty'); + + var compare, compareFlags; + if (options.deep) { + compare = exports.deepEqual; + + var hasOnly = options.hasOwnProperty('only'), hasPart = options.hasOwnProperty('part'); + + compareFlags = { + prototype: hasOnly ? options.only : hasPart ? !options.part : false, + part: hasOnly ? !options.only : hasPart ? options.part : true + }; + } + else { + compare = function (a, b) { + + return a === b; + }; + } + + var misses = false; + var matches = new Array(values.length); + for (var i = 0, il = matches.length; i < il; ++i) { + matches[i] = 0; + } + + if (typeof ref === 'string') { + var pattern = '('; + for (i = 0, il = values.length; i < il; ++i) { + var value = values[i]; + exports.assert(typeof value === 'string', 'Cannot compare string reference to non-string value'); + pattern += (i ? '|' : '') + exports.escapeRegex(value); + } + + var regex = new RegExp(pattern + ')', 'g'); + var leftovers = ref.replace(regex, function ($0, $1) { + + var index = values.indexOf($1); + ++matches[index]; + return ''; // Remove from string + }); + + misses = !!leftovers; + } + else if (Array.isArray(ref)) { + for (i = 0, il = ref.length; i < il; ++i) { + for (var j = 0, jl = values.length, matched = false; j < jl && matched === false; ++j) { + matched = compare(values[j], ref[i], compareFlags) && j; + } + + if (matched !== false) { + ++matches[matched]; + } + else { + misses = true; + } + } + } + else { + var keys = Object.keys(ref); + for (i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + var pos = values.indexOf(key); + if (pos !== -1) { + if (valuePairs && + !compare(valuePairs[key], ref[key], compareFlags)) { + + return false; + } + + ++matches[pos]; + } + else { + misses = true; + } + } + } + + var result = false; + for (i = 0, il = matches.length; i < il; ++i) { + result = result || !!matches[i]; + if ((options.once && matches[i] > 1) || + (!options.part && !matches[i])) { + + return false; + } + } + + if (options.only && + misses) { + + return false; + } + + return result; +}; + + +// Flatten array + +exports.flatten = function (array, target) { + + var result = target || []; + + for (var i = 0, il = array.length; i < il; ++i) { + if (Array.isArray(array[i])) { + exports.flatten(array[i], result); + } + else { + result.push(array[i]); + } + } + + return result; +}; + + +// Convert an object key chain string ('a.b.c') to reference (object[a][b][c]) + +exports.reach = function (obj, chain, options) { + + if (chain === false || + chain === null || + typeof chain === 'undefined') { + + return obj; + } + + options = options || {}; + if (typeof options === 'string') { + options = { separator: options }; + } + + var path = chain.split(options.separator || '.'); + var ref = obj; + for (var i = 0, il = path.length; i < il; ++i) { + var key = path[i]; + if (key[0] === '-' && Array.isArray(ref)) { + key = key.slice(1, key.length); + key = ref.length - key; + } + + if (!ref || + !ref.hasOwnProperty(key) || + (typeof ref !== 'object' && options.functions === false)) { // Only object and function can have properties + + exports.assert(!options.strict || i + 1 === il, 'Missing segment', key, 'in reach path ', chain); + exports.assert(typeof ref === 'object' || options.functions === true || typeof ref !== 'function', 'Invalid segment', key, 'in reach path ', chain); + ref = options.default; + break; + } + + ref = ref[key]; + } + + return ref; +}; + + +exports.reachTemplate = function (obj, template, options) { + + return template.replace(/{([^}]+)}/g, function ($0, chain) { + + var value = exports.reach(obj, chain, options); + return (value === undefined || value === null ? '' : value); + }); +}; + + +exports.formatStack = function (stack) { + + var trace = []; + for (var i = 0, il = stack.length; i < il; ++i) { + var item = stack[i]; + trace.push([item.getFileName(), item.getLineNumber(), item.getColumnNumber(), item.getFunctionName(), item.isConstructor()]); + } + + return trace; +}; + + +exports.formatTrace = function (trace) { + + var display = []; + + for (var i = 0, il = trace.length; i < il; ++i) { + var row = trace[i]; + display.push((row[4] ? 'new ' : '') + row[3] + ' (' + row[0] + ':' + row[1] + ':' + row[2] + ')'); + } + + return display; +}; + + +exports.callStack = function (slice) { + + // http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi + + var v8 = Error.prepareStackTrace; + Error.prepareStackTrace = function (err, stack) { + + return stack; + }; + + var capture = {}; + Error.captureStackTrace(capture, arguments.callee); /*eslint no-caller:0 */ + var stack = capture.stack; + + Error.prepareStackTrace = v8; + + var trace = exports.formatStack(stack); + + if (slice) { + return trace.slice(slice); + } + + return trace; +}; + + +exports.displayStack = function (slice) { + + var trace = exports.callStack(slice === undefined ? 1 : slice + 1); + + return exports.formatTrace(trace); +}; + + +exports.abortThrow = false; + + +exports.abort = function (message, hideStack) { + + if (process.env.NODE_ENV === 'test' || exports.abortThrow === true) { + throw new Error(message || 'Unknown error'); + } + + var stack = ''; + if (!hideStack) { + stack = exports.displayStack(1).join('\n\t'); + } + console.log('ABORT: ' + message + '\n\t' + stack); + process.exit(1); +}; + + +exports.assert = function (condition /*, msg1, msg2, msg3 */) { + + if (condition) { + return; + } + + if (arguments.length === 2 && arguments[1] instanceof Error) { + throw arguments[1]; + } + + var msgs = []; + for (var i = 1, il = arguments.length; i < il; ++i) { + if (arguments[i] !== '') { + msgs.push(arguments[i]); // Avoids Array.slice arguments leak, allowing for V8 optimizations + } + } + + msgs = msgs.map(function (msg) { + + return typeof msg === 'string' ? msg : msg instanceof Error ? msg.message : exports.stringify(msg); + }); + throw new Error(msgs.join(' ') || 'Unknown error'); +}; + + +exports.Timer = function () { + + this.ts = 0; + this.reset(); +}; + + +exports.Timer.prototype.reset = function () { + + this.ts = Date.now(); +}; + + +exports.Timer.prototype.elapsed = function () { + + return Date.now() - this.ts; +}; + + +exports.Bench = function () { + + this.ts = 0; + this.reset(); +}; + + +exports.Bench.prototype.reset = function () { + + this.ts = exports.Bench.now(); +}; + + +exports.Bench.prototype.elapsed = function () { + + return exports.Bench.now() - this.ts; +}; + + +exports.Bench.now = function () { + + var ts = process.hrtime(); + return (ts[0] * 1e3) + (ts[1] / 1e6); +}; + + +// Escape string for Regex construction + +exports.escapeRegex = function (string) { + + // Escape ^$.*+-?=!:|\/()[]{}, + return string.replace(/[\^\$\.\*\+\-\?\=\!\:\|\\\/\(\)\[\]\{\}\,]/g, '\\$&'); +}; + + +// Base64url (RFC 4648) encode + +exports.base64urlEncode = function (value, encoding) { + + var buf = (Buffer.isBuffer(value) ? value : new Buffer(value, encoding || 'binary')); + return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); +}; + + +// Base64url (RFC 4648) decode + +exports.base64urlDecode = function (value, encoding) { + + if (value && + !/^[\w\-]*$/.test(value)) { + + return new Error('Invalid character'); + } + + try { + var buf = new Buffer(value, 'base64'); + return (encoding === 'buffer' ? buf : buf.toString(encoding || 'binary')); + } + catch (err) { + return err; + } +}; + + +// Escape attribute value for use in HTTP header + +exports.escapeHeaderAttribute = function (attribute) { + + // Allowed value characters: !#$%&'()*+,-./:;<=>?@[]^_`{|}~ and space, a-z, A-Z, 0-9, \, " + + exports.assert(/^[ \w\!#\$%&'\(\)\*\+,\-\.\/\:;<\=>\?@\[\]\^`\{\|\}~\"\\]*$/.test(attribute), 'Bad attribute value (' + attribute + ')'); + + return attribute.replace(/\\/g, '\\\\').replace(/\"/g, '\\"'); // Escape quotes and slash +}; + + +exports.escapeHtml = function (string) { + + return Escape.escapeHtml(string); +}; + + +exports.escapeJavaScript = function (string) { + + return Escape.escapeJavaScript(string); +}; + + +exports.nextTick = function (callback) { + + return function () { + + var args = arguments; + process.nextTick(function () { + + callback.apply(null, args); + }); + }; +}; + + +exports.once = function (method) { + + if (method._hoekOnce) { + return method; + } + + var once = false; + var wrapped = function () { + + if (!once) { + once = true; + method.apply(null, arguments); + } + }; + + wrapped._hoekOnce = true; + + return wrapped; +}; + + +exports.isAbsolutePath = function (path, platform) { + + if (!path) { + return false; + } + + if (Path.isAbsolute) { // node >= 0.11 + return Path.isAbsolute(path); + } + + platform = platform || process.platform; + + // Unix + + if (platform !== 'win32') { + return path[0] === '/'; + } + + // Windows + + return !!/^(?:[a-zA-Z]:[\\\/])|(?:[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/])/.test(path); // C:\ or \\something\something +}; + + +exports.isInteger = function (value) { + + return (typeof value === 'number' && + parseFloat(value) === parseInt(value, 10) && + !isNaN(value)); +}; + + +exports.ignore = function () { }; + + +exports.inherits = Util.inherits; + + +exports.format = Util.format; + + +exports.transform = function (source, transform, options) { + + exports.assert(source === null || source === undefined || typeof source === 'object' || Array.isArray(source), 'Invalid source object: must be null, undefined, an object, or an array'); + + if (Array.isArray(source)) { + var results = []; + for (var i = 0, il = source.length; i < il; ++i) { + results.push(exports.transform(source[i], transform, options)); + } + return results; + } + + var result = {}; + var keys = Object.keys(transform); + + for (var k = 0, kl = keys.length; k < kl; ++k) { + var key = keys[k]; + var path = key.split('.'); + var sourcePath = transform[key]; + + exports.assert(typeof sourcePath === 'string', 'All mappings must be "." delineated strings'); + + var segment; + var res = result; + + while (path.length > 1) { + segment = path.shift(); + if (!res[segment]) { + res[segment] = {}; + } + res = res[segment]; + } + segment = path.shift(); + res[segment] = exports.reach(source, sourcePath, options); + } + + return result; +}; + + +exports.uniqueFilename = function (path, extension) { + + if (extension) { + extension = extension[0] !== '.' ? '.' + extension : extension; + } + else { + extension = ''; + } + + path = Path.resolve(path); + var name = [Date.now(), process.pid, Crypto.randomBytes(8).toString('hex')].join('-') + extension; + return Path.join(path, name); +}; + + +exports.stringify = function () { + + try { + return JSON.stringify.apply(null, arguments); + } + catch (err) { + return '[Cannot display object: ' + err.message + ']'; + } +}; + + +exports.shallow = function (source) { + + var target = {}; + var keys = Object.keys(source); + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + target[key] = source[key]; + } + + return target; +}; diff --git a/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/package.json b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/package.json new file mode 100644 index 0000000..ef22487 --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/package.json @@ -0,0 +1,61 @@ +{ + "name": "hoek", + "description": "General purpose node utilities", + "version": "2.16.3", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/hoek.git" + }, + "main": "lib/index.js", + "keywords": [ + "utilities" + ], + "engines": { + "node": ">=0.10.40" + }, + "dependencies": {}, + "devDependencies": { + "code": "1.x.x", + "lab": "5.x.x" + }, + "scripts": { + "test": "lab -a code -t 100 -L", + "test-cov-html": "lab -a code -t 100 -L -r html -o coverage.html" + }, + "license": "BSD-3-Clause", + "gitHead": "20f36e85616264d4b73a64a374803175213a9121", + "bugs": { + "url": "https://github.com/hapijs/hoek/issues" + }, + "homepage": "https://github.com/hapijs/hoek#readme", + "_id": "hoek@2.16.3", + "_shasum": "20bb7403d3cea398e91dc4710a8ff1b8274a25ed", + "_from": "hoek@>=2.0.0 <3.0.0", + "_npmVersion": "3.3.3", + "_nodeVersion": "4.1.0", + "_npmUser": { + "name": "nlf", + "email": "quitlahok@gmail.com" + }, + "dist": { + "shasum": "20bb7403d3cea398e91dc4710a8ff1b8274a25ed", + "tarball": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + }, + "maintainers": [ + { + "name": "hueniverse", + "email": "eran@hueniverse.com" + }, + { + "name": "wyatt", + "email": "wpreul@gmail.com" + }, + { + "name": "nlf", + "email": "quitlahok@gmail.com" + } + ], + "directories": {}, + "_resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/test/escaper.js b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/test/escaper.js new file mode 100644 index 0000000..a5d048f --- /dev/null +++ b/node_modules/jsonwebtoken/node_modules/joi/node_modules/hoek/test/escaper.js @@ -0,0 +1,88 @@ +// Load modules + +var Code = require('code'); +var Hoek = require('../lib'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.experiment; +var it = lab.test; +var expect = Code.expect; + + +describe('escapeJavaScript()', function () { + + it('encodes / characters', function (done) { + + var encoded = Hoek.escapeJavaScript(''); + expect(encoded).to.equal('\\x3cscript\\x3ealert\\x281\\x29\\x3c\\x2fscript\\x3e'); + done(); + }); + + it('encodes \' characters', function (done) { + + var encoded = Hoek.escapeJavaScript('something(\'param\')'); + expect(encoded).to.equal('something\\x28\\x27param\\x27\\x29'); + done(); + }); + + it('encodes large unicode characters with the correct padding', function (done) { + + var encoded = Hoek.escapeJavaScript(String.fromCharCode(500) + String.fromCharCode(1000)); + expect(encoded).to.equal('\\u0500\\u1000'); + done(); + }); + + it('doesn\'t throw an exception when passed null', function (done) { + + var encoded = Hoek.escapeJavaScript(null); + expect(encoded).to.equal(''); + done(); + }); +}); + +describe('escapeHtml()', function () { + + it('encodes / characters', function (done) { + + var encoded = Hoek.escapeHtml(''); + expect(encoded).to.equal('<script>alert(1)</script>'); + done(); + }); + + it('encodes < and > as named characters', function (done) { + + var encoded = Hoek.escapeHtml('