aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKobi Leibovitch2022-02-07 11:10:06 -0600
committerKobi Leibovitch2022-02-07 11:10:06 -0600
commit258854f697f035830a1424d9ba13be213edf4873 (patch)
tree389ef7d497fb77c3ee2b8bb1ac7c2cbd8ffb57dd
parent1c7947ab7a4d3bba99c0330db64c7344b87ca3a5 (diff)
downloadsl_wifi_examples-258854f697f035830a1424d9ba13be213edf4873.tar.gz
sl_wifi_examples-258854f697f035830a1424d9ba13be213edf4873.tar.xz
sl_wifi_examples-258854f697f035830a1424d9ba13be213edf4873.zip
fixed a typo in the README file
-rw-r--r--mqtt_client_w_ota/src/README.html662
-rw-r--r--mqtt_client_w_ota/src/README.md2
2 files changed, 498 insertions, 166 deletions
diff --git a/mqtt_client_w_ota/src/README.html b/mqtt_client_w_ota/src/README.html
index 1ef79f4..38ad72e 100644
--- a/mqtt_client_w_ota/src/README.html
+++ b/mqtt_client_w_ota/src/README.html
@@ -1,55 +1,301 @@
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml"> 2<html>
3<head> 3<head>
4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 4<title>README</title>
5 <meta http-equiv="Content-Style-Type" content="text/css" /> 5<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6 <meta name="generator" content="pandoc" /> 6<style type="text/css">
7 <title>Mqtt Client</title> 7/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */
8 <style type="text/css">code{white-space: pre;}</style> 8/* Author: Nicolas Hery - http://nicolashery.com */
9 <link href="data:text/css;charset=utf-8,%0A%0A%0A%0A%40font%2Dface%20%7B%0Afont%2Dfamily%3A%20%27Open%20Sans%27%3B%0Afont%2Dstyle%3A%20normal%3B%0Afont%2Dweight%3A%20400%3B%0Asrc%3A%20url%28%27data%3Afont%2Fwoff2%3Bbase64%2Cd09GMgABAAAAADzUABIAAAAAhjgAADxwAAEZmgAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbDBx0BmAAgUwIgSIJjzQREAqBpESBjUIBNgIkA4ZsE70QC4M8AAQgBYIyB4QoDIIJG8J3CQg7WxX5j0PthLRbJVvedpUoKlTzFUWwcUCG52fZ%2F%2F%2F%2F%2F3lJxxAlWAMiaNd12%2F9PqJmJKW5iyEExieloQ9KxVuZAQ07T1g7vfgVloomBA%2FUEiuEMCGVsPBsLc9rD3dPKhTisOejgNULCLyjxoeYlBGuZsjRKads6GS6b8QRDIttvKSa68bAbLrwP31TZsuGVyrv7lPcTS4bG9tKpUh76wlIon84X%2FsDUs5lHxlTP%2Fif%2BNs2eosU%2Fnf%2FBfw%2FriGqqb%2BffLOvzVA9JiiYPkV3xr7qrZ%2Fbum4pAxULkIPkZgBBQJu%2F2AG2zs1GxcgYq2FMQpj1RETESsbAKmzJyopiJzNnDKkTX5pwurDm2%2Fl%2BkLvK%2F%2Bx%2FAP6A2ZgrZRvjS1KSQBer9XuGyk3Iw3zfX%2B1eWZFmG4CQDj7CYnr8CXBV4ueyfuup7tsiSJbYtuxH%2FjmfaSz7qPupZoCCZ%2BkF0QXRpQIvhcQTov6omea3KKY0pFP4oK73IomFDl%2BISgLSDg2T3m9LqWHnZhsdUX6Zbs2x9S8bARE7Ay%2By7Qf%2FnllVniRftubDauc4suapKNQPzE8citiadRhUeQAB2Or6gcE01zLrqvv3azJyYfdvFLJRBRNN%2BrORtiKb4r90jEQolkS9CXdeapUUtovJYdjvKac7KcpzMaA1l%2FuGrT4aVVrGvMVAuLrBgPpJTtAv0AsQv4mpVYhTdrISsR3HVOUDRuJh4nIdPy752XK3pgwsJHaOiCfRBCMYnBZa2NQIs0MJBCLKQcLAUFiLHsSb1NBwDuVM%2B%2BS0pbMpCb4wnNT80UzMTE9QxNEqUXUj%2BXtWyBRikfCGFLhWNnelMh67A%2Bx%2BBHyAogRS0C1I6L0lJt9RGUJGUzgZAjQekU04ENxHSBYHaRMdLMVd257vKTeW69pbnoi9NTzZ4puUyQp2QCOOWBcHlBVHZINQPsqpeQjArJqPxaQKweFrTR1P%2Fk%2BXq%2B%2FE66DKZ2KGI2ZjJZNOIfxEploB4nMfYbCEuPnLbpwkSihwCCsbniQTAguiPVErkU4mUNL%2BUgcJFiymBc06kZQAgwjK%2Bx5hwzplJMQDIJhWEDSTOGJKlWpoIMEUadBm6RwiOj8PFkZ74BMmB3NPHvuQZdmtwhPKxaCIC1O5pSECsQvXqWxLjy0SwLDAMtWW45JcEf9qVQU4AAOvKcpvthncBrrn3f6P2TFH5pL6ErAoIPAgbyH0bD2BVQtHJQvXeU9iytiHI6oIFw3FX7KYd%2Fws48OV6eVger6oIUYdoQXQh%2BhBbCAZCg0ws5P%2F%2F30%2BhOw99btm1DAYcrQBRhWi8jM0FaH419ud9hVS%2F0ut62vSv6Q%2FT11%2BiySYajVNbtUV%2Fb5%2FexPSeyXTDklT41IpZiv4R2m3Dfcp9KWoG9CMAOmZLgoOTwv9t%2FXjG7O9no%2FSNV51dlkUn2AXcpNQTLI0adKlSGjJgNWg3YlhoCCEQH%2BDv5%2Bvj7eXp4Y5zw7piXJyd0I6nHeztbG2srSxPIeDmZidNDQ30YVA9XR1tprpw1uhWsieLKhwIhGlDCFAphITMFTNSlJXCvFS7BnGYV1RMYWUSk86rwpJKpWQBZbBSCbm2Z1laCiZ6RfcBbuU87snz7Dx7R5L4WZIjvKrod%2BrtYCMx9O8mwhLRGcX3ibFESNJCqbD2cGBXU%2FncuJtPLlOhOxfmmcPUG5mPZuIouu1w9CKPimlUnXUEk4VEgpJLUlkHBxWtYuH7JsyXkXXj7AS4sDsaU8uIxeWw2Z6h9iA3uWnrBnnWSoOFDnWyWxohn666Da3a54egEGCM4tGe%2Fq6VLupikmKFCY7LkmodtkTc48IxKTyS9g%2BEon9%2FU0Gfmor%2F91YEWgYeaf9eEUU9e7fPaySLVll%2FZPSApEe2n04%2F31YHDfx09bMcma9lC2vvLpFPB%2FysabdbsZqgVGlqkCjKQZaCw9RL5J8Wfq78fbpRRBgkAAxoN%2B77EOTWB8wGH4agD%2FWBsmqI94A%2BFBiQym357qjcbDkjVNVS8mFxqGkbhEW5Q0rbxes%2B9DWsbK1TFiIP2X%2Fhky3m5JlDhoxIiRi5oUREAgQUJuwkwnKXsPYD82bP2nAFm5nLbZFniAVCw4pU%2Bqg9HOyqPE6GeWwEVpAL1OD4ReXMWGnlZg8RK1l6TAzjjnw3zNBtlCkyLGpSVg1rGp%2BrMhHlAiC6HaUwo4ZUViqrXkR1biihit4A5P8VJcWHBXYcMDHm%2BVEtaISkshedHnqp6MBKe1ILH2yAviHdNTbXS94mvwv%2FXjJusom6TmqUVBr6dCPYTMTqM4WFYrEPaeGMiEBczEg9JsYNFvESiiy%2BaBSdP6UREzNPxAMb5yCrnRydl5oLRghNYHpYqm5Mgj6bGcLtSEgUSpzEqZvZQFUoCd%2F491qYH9vIUigQkxnUr0rZ1DjE2gzGWOAk0qO4y%2BJrS01dMjSQ4BtaLQQN1jAHBNY3Z6by%2BicjUAwNoFPEHxGQX4a1QACbwPpnIaq0UdSymS9t3E1qlrFMKJ%2FBEWWA%2FWb4dE4kRd6bmY5kiLfD64zt8%2BWeHB%2BcZTDDLXesW9PnCSGUaC%2FE0%2Fg8RZElPKlHYd4R7O5c%2FqbimL%2BpNfRGnjFI1Yl%2BT0jLaWSclz9Gb1iMoXN8hCL0wWchLqS69sXHGrHBDM6USOEEjrLDEcJdS7xNCJA%2Fn3BSiMbMyQ2EY0xIu4G4X%2BP7uAO45rs8N8kzl2cvL4xlqOUwSd5HLl85EA942MMMthyFVM0aP%2BLaJViU0jrK0n3ILadidX5Df0hDFXwCIWJ0r4T58QM6uleTuOxYSd5zM7DK9LQcKM%2BQeJzGwd2LDM6BRtSKpoM5txsh5UZ5vkuBS74pKpYGVnlVvQ5o%2BQbwNE%2B9qX3yYO35Jmz%2Bn5HIpUfJ2vyfcGnkNDFvIWM3%2Bl0SAJ48tws8taOvAL%2BPojsDoRsZILghY5rGbIwyhURLrWp55YC9KERyteUrrJvBxgK83RyXPcVHMCoV1zkeyAymKLA4qBuCE17rUFLPeFWiZKX9NFIPkWfjuZHm4voKGHuz5gt7xXpTvCZPhpARHTMjea8%2FwnPKhOSEpZhhrY3kuKgm88Euz4ZRsxiLqrUUXDCM2Sh%2FKjJmOI83BylGUktaOGk4F61UfJ35fCC5yHDGsBjkhYxBFaw8KhGxVNLhVakk7yq4dSzlWFZijCc1zkeTkYwYnyJoLlobOWOUa2uxks1KRCtDLiVjk7zikMsiyxS%2FO%2BRxwCZCqTBKXOZTycx5EuMsI%2Fy25wHe4lzgXyOx2rgm%2FVNMKc6TRgCgiHfgRiM%2FFYcSvBA7nUJ2UqhAvL6znIECFAsKRIF0WBJkLQgKX9nAKe6KytVSyscM%2FYoBzpAcZ0LQDwAHwYTaxCTnK7Eg7dJpjEys%2BmX%2BymSpJybTABwIUK3FISB%2BvfEPpaYfX6dhYCS%2FArvbXpMxAOujddHcKCy9oAuosBwO%2Fd66aodBZ6D7bZbgOVjxhKzQcG9DNEl3hATNHPFDklxcc4NylfRkG88t2VfSoUwj1nL97IcKprRrU0xLaftUQLvKqBE0YCLFJ3XjQTVlx5kKoTYQIvTnMDpYqQumFfIquUaT3%2BTlFnBAUcDaS6Ykgm4D6mHZ3T5LS7ASqCHVNII69RkiqGYX8m%2BKFuRyLBfKpASn%2BovFuh8NjOEFNgt3km%2FK1AYKDnTQbKHVKfxpUg74CJVZ%2FQzVmPSrAGHPRrKIU8EQJywFPBHiZyoRp9ZiqatfCUYZAy10RUjDNhY0ApFk%2FRCyRru7v1GbH2EdpTUYrJNxdP9Ib3%2BKy%2BLdDlcvu7brITIlW20bGBWyvH0bbUTBXw42%2BLKEajBc93Xyvzg460i8KDqQpbI8P3hvRfdjuH3yYpVuP7ea3AJpxwwZtyHxnXa%2FnKVrKjEQL0ouoeIxVpsuMrmtKoWLpgAemjUmg13xepWbjuhaStVsQCvFIriQZRKfAWu5xpjxjqLR%2B92hNWoQUpec70wOSdjJSPAalndek2pgvd9VjXFyCq44wwNIpqzRTtwaEINuYuVywyQb9DmkDnaB%2BQq%2FKBrBntgVwLySNWNI3LTiTgU3U4wpJTHRMn%2BLtfsYleDP1XfFrU2cbdHOGW1GMxq7WE17UZzrbpJsXeX1zvkSyQmmvmRPyMTrQqFtbSYuvTlGSycJKvDElm2kcqatiRtM%2BXAOliz6XR6Ql9bpw5unABUyOZmgUjozRPHLFnqBm%2FwT1OcWK8qbpMEwmn6fkxQEFdGYoZxDwFdZbaHVC%2FztMekCVCMn9lawhkKL7TRk45pkUC%2B5tZSrFzs5CgqwTej3T7yWhaE5gLHwn%2B0h%2B1rVeqVTATVL7Tx7iWvUzv%2FJv4Af1N%2B6fX3rQ6vzx0zd7AM9pZGZ08pB7ixFyHMPMxRekmvk8%2B3fknvFVjbKAAscRdHPQn3bUdqk4DItx4uAP4uJoEdaEbR9%2BhVL1jrs8QEmOsah78uflhUlTGTIDO74%2BgLrewWOW3kkDAFWPFFoTSDBczNkV%2BTIpFW0FdcpU7qk8OkJ36V4143X8%2FRiB6b0k02n%2BPhuQfsjDBbaNp6O24mTETI5ypKMLGM%2BSlrrls1SDdfGMEMfrBVHTthLvtRiagZGJqAA2xWj%2FLQSS0wDnrjYqKDWY%2FRsARcIH4dVTFwMoU%2Bztku1jDMPKPHUi0CfPBUERXHmkBwha9YGGWoT4OvQAnlRhh0FcT9RN9eB9p2k9lUBEL4Kdj9SqUBb3XloMCJaYYQk4unEKTGtoGNjJ0UjPt%2BF0WKcKYdukt4QMO73z5xqVuff5E9rtA%2FfYyz%2FMnjX2wNnKQ6l27H9CWD%2BRO1%2B1pn9i7z%2FJfyrHBDGtR4e3FSyagyypIf%2BrO7UH43VZHiezC5WmiLqWU%2BxfgZqHdvoYE0uUczILmJXnvYQMuvrM9eFXgB8GyglGRDci42j%2F97nBN%2Fc2w9KTWDMBTid2ylcc0NoRoKMCdY%2B9XNfyvR1x19xfBrMibf6RUaTKowUrS5N7Dy3sl8q6yweBdOJHvfOYiQnu8iCUlX75Ez%2ByPPLUvSO5cXrlTFVGP2yqazi%2BDhaRUHVMTJzYyZcq0nRnU9ws8xROWtlaAxirS8Tbqt4mbE2nUu2ExdSdJ1Dt2%2FjOykL4PKLdSEIpa8QNypx84hVFSRca1604waGkUD0TyhAH%2FRT2vxpWMp0yEZk9toonGknwSgn97RBT1ampeL6tJ%2FCfGT4kdwVLcjyqvbqO67OKxmgbJzJWVBM5mqTNsYBERk3uj8adjIxDI%2BZHZM8eh835zUILIO2%2BSXKwJp9UIGbuKzbWJZ2NadauiyPJhjjgDOiMrQMWYVi8Vc2bUH2U%2BrnIASPySLy%2B6FkoLOAyxMMvE85z04IXu4pv%2BjPSofeKtXzYo3loMlVucEoR1aBZtgFt7Uk1A8CTZfhJlFQSN9GQQcIfRJ%2F0WFcWY1XK0BA4YkZuXRbkev7njNeq0XSet7ub29Cdc6t6TT5P6n%2FDEquLSQhlN6OtJJXVa7taVdntCPWBuVy2kThB89AhmQoY9JUclVtB3yZE%2F5EKRI%2FWR31zf0nq3wnRUu1XfBKJSb%2B87VxAAI%2FX7ErAZUgZgPNnfDmXeiVlaqbMzzlt6XPsvZ0nbW6A6D3zUKXbqGHxqvKtoc5crxS7qLwGAbJaLPtkpjrRpyNdM8fjceFhJSYMO9r6iLFvEKJGYZlsTIJ4YkyUMEx91H8UGDAEN59eGv0JettWx37%2BNmLtlctzWeP1eNg4%2B4jgYG%2BnMlx36HAQPeh7bEXxQc1sI6fag097394Tlss8Fq3N2tXtZetrm6FQcFnPOKL8d6J0UGhGVHi3LgvPV3c4QwXYohJghOdXYX9k1GzOZ8QGGkfo0ey6Vgbnh64wGlPreR2h3dUFDlzlGNHXDSrWo11Xy3N0knfiB38owN%2FfZ1biv5wcfbt5smBxuWm298%2Ft27VXO5rGe3a0JCEi7E3mof7ai61bn%2F%2B%2FvdtpXF5oGWq646GkbKicU19htpCodYv1%2FGIaVIvaTrii2uulsZCRYZxDdzwQKW7pnusdoxdw56oNYw4fq0WFwNCkYvUk9AIMFEOf5%2F1gSXXSXKxx9jYojEuTk6uNkjn06onF3i6SjzO5v9mKzjvPyn4SP959KOYUnxM%2Fv7xZyniS4Zju%2B4Qp03fzq4NyhlqhxjeHJBniFExDgfjwWSGcR0UttJ4hjE9m9lp1Yin11cVEwfs4nyCs7aGP955tz9Xe1bmcMfRGvTZ5PTLyLru2UZN0LTS6HzLns5vkrRl3TCTnkize%2FDoAiOJgabGlvHNjorUlrzi6FFkmis%2BMxT73o9x%2BGHVBdvv98Cv12%2Bz2STuyQz%2FQe7rRvF5kHlUz41qe92Dojegl5svIAL%2F%2FSr16XM13bFImFk9f84iJ6pHg2BpOc7vcofyKMq2tKxpnzEcGS3f6KUa9%2BEXVNIGnD7%2BceP58a2XfwjffSEe%2BH6zoXtutLn5fHNYu3tIKTbJd7YlCaMJe6Wp2XWbCUtAaEOZN2%2B8uzCUxpxtwc0Gtl8s4P17%2F8n7v29d%2FhtRW%2B2dw83qfX9ZjBaWy2F2tp%2BvzY8527GCbXNkshUGk4rqc%2BLD6WU9Tg122dXhCU3Z3s54bBiL5qLQ6KuW%2BPm7oYQF2DJgIYiy%2BuLN7sv%2FxHbbn7JyoB%2FMG88uDjU1DrUSWe7BJViS%2F2xLgpP51lyqzC6ofLfu9CHFj5U5JdVs7V11nZu%2B2stxYmfls3b479R2wimJUcOqB6ptdbpO6xknVcG%2FYCn09kLAeMFzlCAtlnS3jhh8JQVLDUhkZBT4tkOj4bYVl2PvXDu4NO6un%2BEZW5QeT0CTo3RmDX3DSy6bVMaDhuAPvaXJQfQkCT%2BQQVBbTGLHyK2ZWx%2F%2BW8aMq2KUVA%2BV55hE8r2JhVYZ2ZbZZ%2B5Lk0G%2FI5zczPd%2FJzCv4b%2BnNjUkCh%2B21z4F%2BD5cnhe6P%2Fy%2FtR05aylhNwUCo2XeNXph12N%2BdwIKu9yo9%2BMymzS6DiHoFipFGVLG123A7bxzekKTlxlNIzWqEl7WsHXQo4%2F%2FSQxiVLnnsioKptOW%2F8rUQ8zOVbVU8UouuSMXkF%2BU0SraYOs%2Fu9Ys2zutn7lEVpKej%2BBPL95%2FPY53az7vrU9gvEupKia3AyK8ZUJe3nyIlpbOiV9NO3CEseEf5jkbNe9k8iM7ItWZttSxj5eTSmRnpAVq9b8vm1ToJ1iPF7km%2FiUvKJj75v0Wwal9A78oaeKgbghBqLKadFfdbP0%2FA2MzgjMVGxjLEMwYQ0qeiQxrxip4xyXmkDOY2eDI1Wu7mu9uKK6zKh1IZh123N3yzDfeKnLRYLK1%2FbRFZEFSXXcHzqFTAhrfeSBNFO%2B%2FxqYGpK6AtF2lLfCfgVXE95sgGT7XkeBcXkbcvQ5Sl4JqufWaEZ8%2FiYpttneJrElOiKrC2MU04vaijf6x%2BPLtF8LY4Cf867dvDUNsOfip2Uf1Ccf63Qqg3192Pd9q7m%2B%2BUr91FVX5wa72O%2FW2E5H0S8M9hkcGRYmKvrquNksBt3d0YQl1TVsxUfDmd9zhhsbmsZIrT3BoHeaKCv%2BzcK3zUCjswCR5bPwM1cs%2BusG%2FGXkTN7XZP%2Frv5t5Dni%2Bqles5XtlJTfKyii73q4K%2F8p%2B4hKplu0vT3unEde5A%2Fdt5c3%2Bd1ASBINr%2FTI1dXNxcW72wub60BENv8BYhP3gjkA0eV0lozmZAp0uv36ZPPdwPGJGnHiiikRtCSmXm3XIvbo%2BoEnhcaWql%2BRWlLnUeako2Lo8rhyw1Z0NW5etRN6XjmFxox0oVo5HBffX3%2BoXLKc7pzgvr83r2D5kPl7TKSqwmzLWolRchjsdMeDnrc9e1s8dOLZMMly1A9K%2Bteh1A5JkORPI8T%2FdUKKZEEhYLSam%2B6KUEBK5%2FQo8dp3nAZlHfer9Vtem36ynrkUNAH2SgkbPXipVuamPIXK5CAOQsyD9xAJc%2FuDR81kte5oIIpjQjP796Am9R7GeyjIhZvzy5fPSFdnZmtCvuvOiG6FQaNSwtws34Zdj9j%2FrS0p%2BN76XO%2BNj5g3XrcgBRRU5%2BiVg8iDp4s2asffXNm67rY13tT%2Ffute9hEhQ%2BCkPBCiCTH77ndK5b1CWUalj4jG0P8PuqG21b0631bfpaxSmcV%2FyPMBmZTyb3nmX3S4n6CHld5bD8H6EyJnuMtXRH7x37%2BlgL%2B%2FnOftehc7HCN1UDMXFhq8d3Pkk%2FJX0TXl7aHJmdcG8LhnVDxNdelXePS3U6nKvl2Bm92FTZ5Gyue67ZObTFBNN0jcujtDCRoYU1bio2Loo40rbKnEmWW%2F%2Bja8uIYZIV4aS7cdjq3NX2Rp7eVVX%2B296W%2BJJmqlqLte8pe8dQjFGgbspwGpe%2Fej0Io6D1AwhtJ9bt3ShMDU3HsDbJRakig%2FbUUjrt29Gvn%2FSiooyejYq8MsZkz6V7Dkr8e3L4hBwJuA83jLZ14%2BruTWQQB8eZN7ShGRu2W1t3GBpn6xl%2FiBqpxCi4%2BOACg%2F%2FhfMZIukVsPJni4RPBsTHZG5f2H9K2GCKFqeyhzdghGysximUQ9%2FmUY%2F2ArbJMRvbZ1tkL8Zy3vzinu%2BnioSMHV6neDjLzHQtNEfC5AIITLsTlXFy6un8T28Dhid4L9zD0Fn6LIeTrm%2FkXIgKrCwNLmX5sfVFdIDAJljT%2B%2BFoagUKI7A8%2FGhwceXiwN3L%2F%2FOD5Q8NJBRdIS0YFrTXBBVWp3A5yDB31zXh4ZCRlI8XSL16MtF8Q2IZZREMNfa%2B2b%2Fc9dPTO5nTOCu%2FDXp%2FdGjWppx3W%2FcKau8dGklKfTt77PXdUXKW9jM8dnnMYL%2BEqReFgjDHh7meVu1ykUczL%2FH4vDq5afhtknzJONbZCmHS9OH%2FnYR6G7WPAPRnIqA0goDPC%2BhxY1mcCT6d6VjxgX50dcbOtGHKpyM5xdzK9HWdVj1rFVjVaytFM%2FcHZJRPJssanfevO%2BXVjXN9F%2F3e69DQzLoKEUlzHbQJzQM%2BlQ%2FQB1Sot4s1wCbQb16%2Fs3Ub1qQvj5j5U%2B76QcgEN0bxums8lLlVV8xsMY%2BQuyGBKM%2FLOmWV5Lm6K1J0xLeYBGoFzFW%2FQuGs0q3EFGgip23710YT8d5zpIrxQ%2BQpkUHvwEsfr1tAEv2xx6dSly7oAFDf3KcvnUD4StBrw81XBnCbtN9eli%2BwqL3dZZipmHHfN%2Fiw0%2FQQZFheEKH1TCn2BjTB5KJlII2YJ1F0R2BllmycXheTWlwpQidEWZ%2FnjvNpXIisG%2FKf64Hbmm2q9VqwHQML1yuKn15syWHkuUru0P9llEUMPKxWozy8KSTbvujV2RaAuw%2FU8TzSipOdkKZj63zhV7EzojEtrwmSdCIE5nYhRN7cscQzpSEhvwBVB3LQ9tENVoA%2FHB%2F8%2BnVxlnr0d9r011xk3G6Sro4n9zOfkUy0iN5h3trWXZf%2F6p9ZhonLIQ7AeIgqvLbdIn%2Bjff3C3Z3u4vt72tPH5raujePvyLq%2FGgsKCOgNOCedJPLryZeJrO1uk%2FpbZ92fXS67bzz27hVvcz3dPqaiNIFaUJ%2BEYJQm4qvJIIrPaPSu7zD2RUUEkVpUnYEsq4nAV5URieaV7ypmCrO5eGu1cD5nS20%2BhdQ9C3J7m35tSFxIULXEYc5gTgofA9iX2Y3mA2rzgXBBHt2lQ%2Fbd68XooaN4oiFDlDXU3wGcQ8u7UbET2aETroxgx%2BhXqXjSqLdo%2BH99lecGlvSM1zL%2FO3ZDl11L3jnX3YQm6zRu6YhpQUefpZvZnqg3FuB7JDHUiN8d4lyVz7AWrfDPxLZlL1i7ygXEuCgQyyhumn46yiNaHoQsRaz4YBbvhaVnd1SuqmGSPFPeXBRWaFn6LP4Fd3fl8f%2B%2Fxj2tn6HY29FQLy2bcjc2IiK3tGxGbWxHbGyuhETu7OxF3VkOTNyYnTU0nJqaMJqcMZ6YmjQynZvb%2BkxWr46KjgidG10VlxCYmdiUPidCEDJht8UkWxlFkKyajKjlvffpSfNYWFxEjlCmUaG3lr0%2FoyMZAIiCR2VhCR416cAcNoxWhFUnDBncYObeqyFQzrWtO7P%2BZ5hcdgPYkoCNSZiv9AvO9NI9rRu7EVMa2FYhw2KXOcnabee5EoBMVwSVgObHvrQzuAoOxwC0L9G9oxgcyuPMURgCN7O9HyXrelrOyAvAUsk6de3jyh1chBP9oiKclxhfjiIqBYRBOwYwMVnlLaZZfSEdL9eTQkp4B6o2ff6KL8rTZwJnFhhEW1aqgxaXgYKD5DT01JynWB%2BPg6%2BLinGlMwYQe1Z6KrOrOtlFt%2B%2FpvxrQ2elvJBD155VumAqFQ9L%2Fxnst3e4f5qtRaJDI4rzqCiRLi%2BD50P%2BjAOYUVEKYAojOHuScqci%2Fw%2Fvaffws%2F%2BPftSYPOfWcHjHViHnS%2BtqnMQ2JYpA7kjZRNO18%2FA0sTH1SabPBshiVlXh%2BqBOM1pjFdiCKhhPCKSOcoiMnLzKExXkfLyIX%2BwWFuJ2toQaA%2FPywvmUTMyy8g0klJ0jBbBrhxZmG1IrUiaJjgphJKl7WeuJi49zgy36M1Gp9LsvdQ9bKOL8vK92uHxZjbVqxHXb%2FKvzCG1U12DAnxj4wPRlMjtOeNK%2FPsHDDOaCes1WNacQJlf5pEsizwcU%2Fw%2Be6MyXneVieGr9mhqY7xWNm%2FupDtY4oGDoQbZlazO9idc%2F4F2Vwi2uaNcEFHwc%2BrscEgqiJhu86Kio2KiYhaXUwkMTI%2BdjUhKi4%2BOlYtvez90PqrqC7HJ7VrdiM9PfS41x0RXZHjS2q9tjWfIpveZSzEpfjPpIqODs3GovFdRgfTJNzIkBEHnwlya5V9YXasvZR%2B3qjHAL6a0h14rPLI862GofYr1du3LJ3avlY2UIJdrZx1IKNYa2%2BL2siE7oS%2BlbH5yykY9uuzZjg%2BzzMgJd212D8qP9ARQ8KiPKwdQ0%2F5VQaWKD7jcubmHl18eue3bjYKJSLM%2Bn%2FN%2FSu2mEzdIKn5OU0DeGSxu%2BF1VCxjKMgwEhU8FpWx%2FEbiaeoVsRpbYrcuXr%2BNAGuDJOgUvvUrXidVDC6NTnZEpYSENA%2BPsOPOiV4QG0yz27fIqzkvcU6su2Q4pj6QX%2FlYXaSa8MlfT5XBz1%2BLijx%2BHpdLtT68dVWajUt9W050iIBjaGdxCR7H1Z4pd7I7G4bqh1Va50e7%2FZOHp3gD0303PO75ZzOprmalxl%2FFfsIS1WNrM41E3fleyMgEoCY7E4Onkb0jGGc6gTTAI5vqic%2BmeUaXF3ei4H%2BOoxJ2mR4oSirg0HEwZBG3y8BakAcIkmec56NSGdcpZNQnhf%2FJRBL82fTe07w%2BMELMy%2FEmBwABnH2USKib%2BkjnosANo7N88xl%2B6%2B5pidTov65yRhYAdBXC3aKrUpKJTHRiqLJ0pzffoMNA3dtu%2FdyfANzACLD4lRUEoQdp4kOjFWGF7x2ou9nVzyThIHERkw9lt7IdyDaZ13KLt45Bz0kPxKo8Ivt0g%2FTbgvU7tb2%2F2hx0PhweZN3de8K%2Be57Txsdk3S9pGpQ8B%2BkpGyTIrn8urkwoSeaEppUXlqrkBFuWMyqZAUiqqsXhXGx%2BdmJCDi02NpcSn1CQnRph7WSPRM5lYW192QaFttdCYB6Z%2BEN9THFQXQuTx7HgXEoV0YwA9TZ1g0IQfx3HgXOzqqD%2B91nhLDm59fRlgCUniF9ZUAqNkbTKLXD6F%2FpTXoHAezU5Xy%2FfVUObL%2F99DCuvrO7liRVoUmwh4GijW74i9RcDg0OVsChxq7witTgnJDhcHTL4IS%2BrKI1ELSjIoZxJSSUzFPrxT1PXkNwyFKgb%2FuBZ03mN%2BRWmgFg45ejT8l8pWBWtsVN6DTq%2FvT7WzXLqaEaPH0PAJwFOKUvNVMCXVTqkL6ynd7w1FI2tOU8gP6T%2BKiUTF8Wi7ebtloRO51pkkfRahYiHZ%2Fbjx33DP%2BxHofEc2GOLtY8LsAxkAWVt0gCjPcD0EgZ2ShnA2vI7sNHdqjld1AQcfV%2FvSa0%2Bq%2FTR%2FgH0fc%2FYUenZog9aOt65r0ZAOB0zfJle%2BCrh%2FUisKEeusFHKQEjlFcFoZUPv%2FsWgod2Rwpf733uTyMvwUP5WP%2BJTneUhnB4S4cu44avYe5McylYe7FiE0%2B0w7EXYm4Ql21n5EbTLuoHzrTgLoW8QsvxhyOqzIaSvO1b%2Birpy1BnYqJtH26MUQj84ZPmvDtJ89Eo9PmXm7zyc3iHhy7PhvUmzxahfVL6F%2Ff4f4vyuCKEfbV82h6z%2B0kFawR%2F8Ic6vIIR%2BYcjy4h2k1aJE2BYHIdUzNZCJ7ARbgP%2B2NVMOYB1yRZ6XlFzCWrGEK4V7Fp7fh1rnw8qM%2BaO1dE2rD7IXBwyXtd1nTypsUPk%2B7MYlhv0SGJFdZbJpZdWx%2BL9vP%2Fw058WPYbhNLhAYD4pjIUsmkOvlGk9Ae6vxmAHaJ6pAHTCs1rbQ19IWHakImgdhbqKKZoq5027aAtS%2FbeYAH8yh7TKaK%2BpH7SrmAN60J8xFWm0OwKGVvJqoyK%2Bh3h50qLs9kQ8wnYk6U6y1GY6hpLxNaSpoB%2F0hIE6mI0YBZXOlz4M%2Bij6KrEJnBpB7%2Bka2cqyLteJNIMgQaJvSAkAEOSSiwALKzo6zPyLdR2qzPwsXC7H6izblK01ArjhoLwILdg%2FvBF5ub68UiQDi1pEq5siO2vsmdSbSLab049%2FvbP01kQZhA9pT2yXN1Pl4d3txEfcg0g9JUkONP5BVivDf%2Beg89HXrfNK7rnO3c9aATViSx2BsTnb%2FOP0N9jEuj%2FdsOipxwZ2UPhldJM%2BhqMYThuMeJzjimpC4o%2BIGDSKqRT2bZ%2B%2Ftq%2FKdUaKuwDr7qdaU7r2W%2FLASNVbDJAYkFFt37nzft%2B3Dn%2Bu6o4NIOIUDkwi8ASkf%2Bxyv%2Bk4nAVs26jy%2Fb916HDF%2BWShyA9AQx8nbdq1o%2Bwai9%2Fqg3zA%2BHEfF6C3xUNCHMaQisLUik74%2FxR%2FqulPCJyJId6%2B6TjNeW7BErLvRYnGzE7eWnjqkro7qweX2jt7WzbphgcF%2F3Uo6M0WVBS6c%2Fi6jU6hgTJeH483x0VJvmnHFnz7r5Eu6YLaP9C1pUbNBh8Os9TP%2BihmG%2F45Q81rRxt43MpiZWf5XlUWDoaL%2F6EbY11IZskC6vjxFZedYU3Eu%2BcnQ9ZnlKc5LEBGyf1x30PsBC2qh1pZNYuqA819OQlH9QLq9DmBx1drYkv0ETKKE7QE%2B3qVmfm7gWYFWOtInTlBABRTsFrgoFJDN%2BQe8ghZKvWLvUkCUOUyNhGN914OMiMeal6%2FhjPvtQ42Gyo4tacDkQIlKFTcjj3SALhlsfY%2BBogaDOmEzBJ3IaWjFayxLDm%2FA41m1xPrtEAJj4HWh6PMexarqvCZGsV5PXrNmYlybaAIaVPhsqv535p7wEIoxWHkuEjKRN3Bjk0cssmwm54t1LuNcGHQssiIifD6EenIAdCnl%2FMlLSusXaK2GGhfTDFw%2BnwPQEW3WMu8u3nKcuh0q4muKBmX9o5xRlvfOz%2BpxvoQoAlvi8BVEseIFQLzIKZpN8R0ac85xLAzdbqnbz2raa%2FZ7CfVkhWxguR8FGDgV%2B8FRWA%2FdQggAy6pt9STWF1qHXVGjPVhqFdKWfgbfH6%2FPybWUVqCKOrxHW4virYMPdNXNRDV134XcvmewdVqU6iQMJVF4BGhbi6%2FrsVQQ4En0JzjB6TVJgs33LaD1lj4nEQqoGhpZyead99yzOcBI46cdwMquJu9ZVVa8xGKlLPZN1Mubp%2FqHrBgC7At9Qy4v9fPn%2BMeZyx9%2BxHF6QpujH%2F0y35%2B6wMOjCyFPdUmkYBiLyWB0%2BEROuk6UIROcO%2FczqMD518X0AY%2BFOTZaiHVys8jMoeq8wpgO3fEV2kPcjxWQ9fOGcUV6xzXvaw8v8TiPdVcIQw0R1NXYIZgCUZ8hSLpFkln38GYKKjIJEklt0T9BKYWgn0gR6fJjTHyfuL9iCkg4EedSyTaNjGbinSqKrEnT7izD52MYvgSA1Dq%2BRGLd78dIQj1Lj3hCSCIKbTXxJ7JMc2RSsEmHjDGLX6jlKXW9M%2BTpgwVbIbSLHp%2BMhpJ5RYKXc7O%2FOZmOAByNgMfLeBY1HGZEY%2Bm6FtuuTMSIaDHuELcIfcTYy6R5nN48lr6HYfQ5sj4xmVgzoTFMUy8pTH16ZUGJhQxQ5%2FMIcyHwZ4SIZtMrGIodYeuHQmFiRQWAOd84IWXt%2BBKFbTYCYajnb8i0b%2BtUE6H6yPKczYOskSs0fEapwCxfFqESFJmb%2FeKdezIJElAHgh82coKqyha%2BvMLI21YBusHRhkSJObmx7GLYyoQwC%2BUulk2Ekc3eZUga4jiVdUDVUhKpJTGEmVruJjPYn6nZiOGg1Fr94AQiNwlGwiRbZGOqJSNajU9egUDxozGwBjX2DCVjFcBJWCfIEjaYkOSiEl9OEKWeZnS9BSgJCMk1cKSnWoxqfOavNZnaD9QR6DdMDntCmPEfxUUCtqQBErC1Ldd91kgonepcgrXZL7Lk%2BAthG%2Fxjs5hukeWXk6bxGXrYJGm5vOfMX7CU5kppyeAKqaDskrmPhZ5rEaMx9QJJvp4rqIt3wlGItBT99uIKWAf40K5eYvH9wsEgXjg6RKoo9rTgK1ch0Gs1phF0N1I3m%2FvSABKq7C7kAG5ReCNRxUZLLGoRc8SjQOfDmF%2BJEWjciXt5bQpYLHLJCinnNDVWXioBT00BpKbvCczwAS9SDP0Y1vHOQ7wzj2PzfC2nPyZ3IQkkfbkYTdeN%2BNnbyDypqleyH94jFtnBZLHeejik9%2Fz07s57wM5WN2o1bI7Qpt9J3bbO9%2F2xJ9aPtEzJsfIq1ppPHtuStwLAFzh3Zw%2FAax5FxCqqjYkGp9hHVNqTIuX%2FnPY9%2BCHPW0rHQWVfUF0kg1bLIFeFAdlflFgtcikpiiYZvQRYm2VsZUGm55B2HT03O9Y3YIYERKIBgoWw7rkpnfMZxx33S7Raj6qy9A1WRwcpmjY2GI5JJbnT%2FE%2FsfF%2B33VeMZAgFIAU7XpWSDzam7KtkIHJyAyiDnRpRmfjTLbJuZRh4%2F5iyybFZuvKZXyxxjr5frhjLTTqDkSvZzt5P0Dk7aE5qxxUaDBrbVB0MoxlPJpUKgcUBwSp4n5U1c%2BsFFPecw%2Bhz05AXkwTsh%2Fv%2Bu0w09dG7k0BdT7cUecveW3vjNbFFwXOfED5EEWy4R19MwxoWZB8%2B%2BEc4gHgJURKYrHkWZSVVG7LC6Lu%2Fyj1Jf%2BfDrwD3TDnJtalTH2x6ugD%2B3Lh8OJ7ESiuWJunkuUFagviyrgvk%2BRYjEaRfm35SSmXBSX9EVQt4jVihTdBqwwyK7adx0dqbUx8owyxySevNjnjNYJBHAGM7hKzwxSR8hzTOM%2FHuPkgpsyifAVj3c%2BSVREw%2BbWA81vpI0OW03FJEbZir1rOQOTRefgB5QyOuLVHYjmDrv7R%2FOUK1wRQLu%2FcDAKq%2FbbwDFi285lWmmLNgsDjj83FD0lmo8DBFiskRvrN%2Fls51y%2BYXxb4OXLVT5dJ8DWQylXVTv4M3TYBg3xBqIF%2B%2B3pi%2Fx3HRc6mNYKGhe95Py3LNYOu6dnQ7t3avWSmDJB6c606XLNZCd9bHySOYSxOmITVzjZPJQuXBu6CfTvos%2F4NI6UV%2Fzkxp5EG73IUraubALTXq5tzoTxDoYfK8aSaS4o7%2B5FyiHz4dPaJzPt%2FeMy%2B53Q%2FhoFzlOLcHmvutTuDrxqCFw%2Fbr0c4N24jMNp0W3OzJs%2BdUYjLySqaYrE8xNXl4XIZuiC2Y%2FT2okht7i9JIhyKhtR%2F%2FM6%2FnIyGmpgI0oJTbNIVz9%2F%2BH9fi%2BVR9izUG0o5%2FPUtylRen6qomwdW0nf9WUhKKp%2FISkIcw64Za66sA5j3kLdlbxOkX67Lm0FkDP2mfB%2BKlPYbYh9aHm1hIkV%2BVuFLNevIxedIV57pw3sOIPK2Ly4YO%2F69LBYiEmSTcD9tpr7TQms7lSS7w4akMUPE0EvV%2F7B%2BdXTvrGSfJ5GNIQssF8qrKbLyCRhzQsQ3%2FNlzmci%2FxKzJ0ai4nIaYAQiqyoIy1NMVRpuI5xH2c77%2Fn1dtiYEEAKDy7LlHuln%2FvKWhnPQaaAquw%2FQLAdA0W%2B6XQO6N9K7oN2LkMDtH8%2FmRX2J9ZTMOc6ytcULn0b5sv%2FwqO3JZ2Awh1ZB%2BlY%2BEf4ywOMD2TOJYAtZI9uwTiVmh9rOtVwfvLk98UqKPtfvSAvdVZMlsnIjJYF3h9gnEi%2BGLvNZvaejXX5S9yyR%2Fj07%2F8fWvOmPhZLNnB88rHUonwssp9qer%2BvPbmsvcCixgRSpYGQhRQ80PASi0YRSkVE%2Fagksk6JHoyzW7TIMRMOWlWPT%2B4GPoYKoUap%2FIPhTyW5CeXl4soyww0ImMqhKSiLd8XBsP%2FYb2L%2FsmfWpPfZTNyHV3Akyxidu5tWs6nsPw0M1NKo4Lx8U4Y7HXxz3yTmTE61JRzb%2F5puraZxgud11xMFgDdQK%2FdQTeaNmr%2FE%2BIwIDwrz2LCfolHhV%2Fybj%2F3ME57jGPwYgQV5qGIzNgJPqY%2Fhr9wuqeKqcQSKNSp81%2BGgV%2FGS44SVY9wq6fzz6v2BjJcQpcSFO5C7k%2FeHm5vNlRs4lGkUnzyVeAaIfZh0bZx8o8q7MlDnnw5WgWf95XqAlbvdpl%2Bs%2BLav6%2BltDvr3j4ePto%2BuNHf47p7nq63DuLvdVk8ynd5TaAuJPU5cuRlJy0aM%2Bm3i0McychfySsX2GxJ4N%2FAxiFYNRap3nMrHDfyXWeZUno8A6qbSLljKn3Z8eiVHq2u00R3nvC8SdD8oRVF9Rh%2F7Z%2F8GP8YkAnmggovybRkiC7ytcQkrIQacCg0I8kNIWGs0qwdH%2BB74lLZz%2FYDczXf%2BRNNRUYhRe9u9uR5o0fz6Kq%2F%2BvqtyXMyDsXTofuk6p66pYkaHhbWOutXSgxvKiiO%2FvMIrFDkxTzitx4HgK%2FAKjztUlSmPAPe9pmYOY1DjmJLrufFdJ21QSj%2Bi5mj2hj77FA%2FhmSTzOM0054UPvW3TTIe1WrdlOVpn%2BLfuuMt3D3QYYTyXKenK2xviclsvyOIKkLW9Eb9ffrzgjnQXiWEwuyWS3Ve7QXIB50Oqp7KP1%2FiCbrbYTcIN%2BrpxQCqW0vKkZv%2F7KzTs%2FMGnFdHXJKyvTf4SJDnklRZ02taSdrWev8WwJUzNZXCQcX0FTYraWryRyugVGdii5W9n9jXA%2FtfUR%2BGb2XxVqjbny2E85uCTJ19eG%2BFeP2F3lvcZB44hJlPCtj38aWQECQjatV%2B1IHMt3ABj55%2FGcVpVgzw1O60cFqdIt7s81vEdWU3Gk%2FFVPZ2YyXTSThDnw6QKw2IBb1iw8JLaZwgNTNLRbq30q2jGMcE7odKxOL70RUFyY9aLYabhrBOi3u%2BmRVoUSNsVmo2h7Q9pLd%2BmJ8fYeSDcopo%2FQo%2BmLpHGP7Wp8g2dy7WtAAQAYrl7ur8Qd39v7P8AiX9fXfbNrRC16qx%2BXFn5mz09nBuYxALMfZNNtQBMbpmOAOYe%2BqdtVmD9zXxHfZS3rYzmkoCSN7sGVj2F2Uwgs1XZ0CG58ZFjA7NECljkHDJFkN49OX5yLK0Ciw5W%2BUyxShKJvkzH05G0Cc2U6WU6WUqxHdThCDFHLbJmOjEi5DVZQNvEVgMraoehJDUnOkQfUG9OUPR6dL7rTQNto037AFpjpyj3BPW1IOOlZDp5ey8Xcw0wnuFE9gDl1YC8I35tACdWoiK8IzMIonb0f6QnqpMqMt%2BYqTuoiz2oWVRQeDQzlkG4Dc0UUQNFtDcnshidGclmdIk8tBVn7JWKcSV79dMOaFNzQykIGLajkggGCSJYnxNQQRwyOT4qEVdvnnMoyNUccUIXiNpmJXXEQj1xahgRXw5h618C7IFzVD1VAv%2F%2FxelKtE2IXNKpR%2F53M80Bmed07IHpcl4VAHZ37fUbEM%2BcNiPqnEtIvktRZvi%2Fvwkw%2F0YaaZvMObcEamqkEO8mgTH2G1v5lxmOS1Hb8ARThSIcUET7Q8UoyDzWHeUGMueWQO0JKcS7SQBw84DCzeYUq2isRs7LAeaKZJIOlIDDJ%2FnBEU4Nte3kbWporw5OgoYGLFbJFLCY6BcSsytzqQ0nL9PEKcomxZFOs62lOxQ7W0TM9015QkAAVr7ZpS21LADMD9cRAe3kxUtcS0as2Vw7incZj6nrw%2BQXuCFrEpKldNJlCtlypBAJEwWBiIH2QlaiyoGrCFU1dY2aVAvaOrp6%2BgaGRo46jqsTOHX25wYA3AAAAAAAAAAAAAAAAH%2FrgH3t1NJ7bPjslz%2BXQ742%2FGfH4OBq0ZwEMoVKs9mWc9uwY7c9H%2Bf6v2ucKYgCAIAFAAAAAAAAAPDZeoZMxu57fJ%2Fv1%2BlX0R%2FEma%2FdVA5sLGdbGouxcizGgjYW7dm6Tvf0TPq3axrD7HuLcTlr1%2B6II6cuV5EbkUoUCYKIgfasMrw%2BS7bXzz788sciiUyh0mxu7DFeRERERERERET829HX5puaxiSz73U%2BNuRAUAIRAxkOz0KqPRERERERfc6eCYex3lf6DL%2F8wT2bGNkFx3VZs0hKBoVKs9mWc9uwY7c9Hz9ioR%2Bzc8MwMzMzMzMzM%2FPn1vT%2Fhdn7Fnu9jvU3xlaiRCBiIMPtWShRi4iIiIiIDGwhIl2t6ffVTGF229ThHhn3PX6fpV%2F%2BxJmvxxYPz2eVnwSEbgJbshSVLmRkywWrgJDXMCnim4srQmgCEgUGWkSSJFOoNJuVbCvHXoVU1dQ1alrVgraOrp6%2BgaGRo45r1gmcOuscXaMb9FDLHimDlWfh62ka3%2Bx96whBCUQMZNj%2B38Ju09gwu0177G8K4x1hLMZiLPI45AO%2FQCFDCUiWQulCRrYcKiASJioJRAy0aJUEMoVKs1kpQGWoqKqpa2hqaevo6ukbGBo56jhYJ3DqzHU36NKbjL5timPYAAAAAAAAABQJ9UmSqvNLklRdLj1f%2BjyOa4sF8JEHG%2Fkkv0Ahw6bOHIvFscXieFNY%2FNacQyRYVBKIGGjRKglkCpVms1KYylBRVVPX0NTS1tHV0zcwNHK0STbwC6%2FdiAw8SzYdwBgzLJLIFCrN5rnupe%2Bf3zNHMEY%2FZquz4772CMOK%2BOYMztOLdfvy%2FOOTMEY%2FZgF%2FAAAAAHDeNw9j9DEKwzfoaxt7AsTY7WOHjx0ydjZERERExNidOuEdx%2BnqXNclShwQERFRdmNmZmbmL79vBz%2BzvsvrwXz8AoWsShVlSElZRVVNXUNTS1tHV0%2FfwNDIkZv06J6J8u1IXl4%2BVA8olORBob4n5BxKzkI%2BQila2AGGYRiGYbgiQyKFG5FSbxERERER6R8dHo%2FH4%2FF4fP%2B78SGXjKy877HPO%2FlEVBEEQVRVVRVRJBoeRc1QMxRFUTMzM0MNZUeSJEmSJEmSJNu2bdu2bdu2AQAAAACACgAAAAAAAAAAAACghQl%2Fi4GZIZm%2BSZJMr52nlqUVq611VGvjvsW%2FnLVrd8SRU5eryI1IJYoEQcRAe1YZXp8lk8KQSCIiIiIiAwMLIZHJZFVVVVXVgYGFkikUipmZmZnZwMDCKHhUKhUAAAAYGFiASqPRSJIkyYGBBWnOWlVVVVVVVVVV9XwfHzDeEdw9PL28ffrZ%2Fvlj42yMMcYYY4wfkyRJkmTbtm37uCztTrrJDwAAAAAAAAAAAEDAnyMU8SLee%2B%2B9VFBKaV3rtDHGWGutc8557z0QyT0AAEg3kiRJkgcAAAAAQEREREQkIiIiImJmZmZmFhERERFRVVVVVT3vsTRGP2bzZ2ZmZmZ9EwYz58595ty6COacc8455%2FzuLl363aV3nSTxM1MHBAA%2BU0N5YrdpQbLMhQNiYX%2F8umRyFLY6Q84RIA841ARJH7I4Vog9iF3YfKwIVeHHipJFuyClBSrnK0uCDBB4MTJQBUiQhC5NDAonVHEHJF7mKCBO5iUcNAjnA0KCPh4EAnwpBVmvoiLJtEshmGl5R%2F5AS0ZbHpnFlrk%2FJ2cmRlZO4gwkoZTLRJGEwTSkWGiqG5U5L%2B5cuPKBl5NPsmAG%2FgtSy3uiKpkNfQaIX2VaSJgIUWJAxEmQ%2FNb%2BO540GbLkyFOgSIkyFarUqDtBgyYt2iB06NIDBaPPgCEjxkycZMYcHIIFJJRTLFmxZsOWHXsOTnOE5sSZCwxXWG6%2FFnqd8%2BDJizcfvvz4C4AXiCBIsBChwhCFixApSrQYEwaVY7qiw1sVGtQ6Z9RQCKkJYROyO4yvvqnXqcqap77oMeaH734aMGnLpimx4jSJd1OCG7a9k%2BjArj3TknzW7J67DiX74Fi1FCSp0qXJ0CcTWVYTX3%2FpaLLleC9XvjwFihRa0q9EsTNKHfnoIr4Zs%2B574oE583gWreNasKHSuKuuuRwiPoVojDGJuV9fOJ%2BY2nHLbXcy49K0NDH6eSQ43AkjnnlZAoUal0lJEHa9lJJ50zDWGY5QZ2EBTjyfTqHSsxIopEzKmYzEIlCCiaehu1xnXwgBIqB1lDZOaM4NLQGZlXfRmp4IeR%2Bgr%2B3lidT2xMK09VGyBBgSSlBT%2BF%2FbhKMtCuU%2BuyO13fUOCkh5gohAPSqRjpTQTtRd6nQV2mdvNe0Pfq63hS5BA3mCoIxUIshZftSiyPu0RWQOWURwlUV2zh6LLNLXH0ogBNL5dz5QYtonwhO1KOM37OCTOOCf7qQWBMkoZo4SJA6awEeImlzJlQaij6aA0Ghqh%2FhuXr69gfO%2BBPM1DWufSXB7NW9%2Bn6uyyNy7FwSr9%2B4%2FCLLe%2B8GnLABej%2B9aBQA%3D%27%29%20format%28%27woff2%27%29%3B%0Aunicode%2Drange%3A%20U%2B0000%2D00FF%2C%20U%2B0131%2C%20U%2B0152%2D0153%2C%20U%2B02C6%2C%20U%2B02DA%2C%20U%2B02DC%2C%20U%2B2000%2D206F%2C%20U%2B2074%2C%20U%2B20AC%2C%20U%2B2212%2C%20U%2B2215%3B%0A%7D%0A%0A%40font%2Dface%20%7B%0Afont%2Dfamily%3A%20%27Open%20Sans%27%3B%0Afont%2Dstyle%3A%20normal%3B%0Afont%2Dweight%3A%20600%3B%0Asrc%3A%20url%28%27data%3Afont%2Fwoff2%3Bbase64%2Cd09GMgABAAAAAD8kABIAAAAAiowAAD7AAAEZmgAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbDBx0BmAAgUwIgSYJjzQRDAqBrFiBlGQBNgIkA4ZsE70QC4M8AAQgBYJoB4QoDIIYG6l7Z9BbO0QSerOUWMD9%2F1cTRZXq2KKIMQ6wzSjJ%2Fv%2F%2F%2F7TkRIYSYiG1VafTff%2BDiA2TMhx6R6GCiKKipNXRGIIlEUHG3ELP2MRhdzx4LfCiOw5RpfZw4irWRaVroe2CMIx3WUxkQNxk6z461hFuVKenMJLHnEzY2FGtGIcST7Sp1cxTYd8E50vso%2FyPErfe33BNR2HDauKu3AktsDKFzxgVf7HfsTCZGph8ip%2F4Uwt9iS3xxX%2Fjfik50%2BuSSvluohaoxGhW%2BQffZ0VxQ%2FGM8sOOfD3skKRo8vC8f%2F27ju6d9yKpcgWhygSeSCgqcvLLdBLvHsBtzrwRdYwKMEHBAIxCG6PBxMBITIzIX70341Y99elDvde3%2F30frfnvzA4t8N0FHiQ%2FnyhlhYpTFKZKttIVlLGFqAtdnOXCPfh%2Fppp%2F5s%2FMptmdsGE2YZeAAAIiCELEKsEJcKJwJ%2FKynfnO1bVyn4tOV3TO9YVUOtHOcq59RemitP%2BpqmCq3alMuiDl8%2F5IMr1QhE46pskVkHI%2B0pVKL2OFsw0Pdt%2ByZtn6Fo%2BZb26vHjKL5K9xJojdAa1M3xoi2sTMDYexavi4tFLAtdy6hn5NhRHIvdLOsRxnVwW7mrbd%2FdLaMceF1hxqKaWqy1M0wnGOUpUjcZlXCIOSPyiwgRYekEwk0wQSeYETiachON3GSksRmej5eOx5AgFckz8qFxU4sFuBDwh2aNMare3AjGQ4P3L7FXIFJNjEd3EIjsBrNet%2Fjg%2FqRyg6IBQYDvgdMlk3NkNNgB%2BqwG7TqarbF%2FI8LPB7hDBogrwqc%2B2nJJCrmTE6e%2FO3AQw9WXmJicB2G0w%2BCQKLMusyiTVt%2B7VeBVQSlulYqexUqapgXzGwx058eVSam5Ez%2F%2BqsWpG8bIipC1c0vuzbiq7kJ8HXR3gQZsaCScAk2ZMEttfCnh1JcHeCS9i7uQq5uxgQkxCzfoeYlIwvhVCl0IVcNN12t9cdPdngmZbLCHVCIoxbFgSXF0Rlg1A%2FyKp6CYHaWA%2Bi8bm1dBjU8NCvvWp%2Bi8tPihQN4Xy4MWSPrDmG2TSlyfUr8c9%2BGtZUM29n7LsMByrIY8kQ1PSvN5MwN7xjeYm%2BZ6Fjs63IOyxLAcXRh0WHA3Sqhv%2FAGHf0OMAboONkkhqh6SqMber2rJnbwoSAyHiIyrZsPBhdDfcIJb1nz97ZXbZD3r3ZFlX9JDujMWp3NHVAWo4OtbwMm74D8lx9V0Y15%2FoRyh%2B3InYAAFhd436DrdGmAGD5%2BNuJDlyQOSrMzssDFPcaaerubRRgeZJJFtd9djWV1yY2p3ObD5ylFJt2%2FadoQueV%2FDg%2FXT4TExATEQOJSYnpiZmJRYvdAHH8%2Fy%2BjtWSl2ZY9ZgB1bSrGJybUT%2FcDGJ8qjlexgDmei4II%2Ff%2FX39P%2FTz7C0c2jG0c9R51H5Uf5R14frfzfuZJeMY2qWxgvm6qGecX0LG078j3V3XHJBsQFAKcMC4MEe%2F7%2FyuP9kBhfhu4hm%2F7KaGIj0k6NG9SmfP41vG3Zrkm1SRWSNuu%2Fe%2Faao7dacorBO2u0EiaE6x12ujLc4K%2FPVqeL%2BfFsemsy7svMaJWUFIM3FSaHwOESCaBWCCiq1AtWXDTiiFS1TONIcT2HKAj3o0GLG41VDRcQOcGCtdgk52DWC7r180lc4Pl0QVx4gd6WCT%2BHaQMvW%2FrMvV1qCH3fTjJoJZ5UIggyI4IgoVpSWH1R2pWcPCfPJeJLXJvrm4iEiydOtD%2BeimF%2B5HD4kheX0rA65wh6RJWAyj1SxSz2W1qlMghMHDWRluntJCyhuxbhJUQk6uLtGl6EG%2F9mC7ysmM7DgVmeLW5rBOxijW1gxT4%2FOLkQI5yW%2FObPgeqSOYxzqjBW4pJspA5LVt3PxUNI%2BUz2D1Dz1r8%2FAZsLS%2F%2BdSkBLwEMdfCVknc3u7fMqU91qa2%2F4psvks3WTyec7tZBhX%2Befc8PvvTSw%2BvUC2bz05k2zneojGQqtjgapOpXFH7C442UOzsig8vzVuvWICkgAMIC5UhBAoCx6LLoXq2AO9IITTeQS8OHQgPTdvu9TSuN9JpJXzjmAxWZUWyeomrOsmF26aMN0IYo7XNkd%2B0j%2FywvbfIXOHjbZKBEUpnQJIQsgUMCQOo2gNUva6kX4jXdyX9qbSmUPnWUUMFmtWOU%2F8ouymnsMxRHWQylQjjU4PaS4EFZWuenDmRNFvkx2U05uhSl%2BhCIngoU45VV3VKcnecajWAPomTiDKaVTeVJWHwS16yrjlt6EOf8jaZBcnhMnwKQpF6Jc0whYyp7PzqOTy1mIfJ60DMAGaBvWc0bmFrHf6R8y%2BGJGTXYwprNRzlptfQYLfBOierCgUijOYy3tEVKIqh7S2xrbTSrq%2F0pQ%2FSBzcmGbRUT1rKkPNroDpXZicoG01xAZAQ7hXE1qLs0Cr40IwceagKo1ShLC79OButaQgQm%2B5DjaNhGpUpCZ9iSLVeM2FwBTuQeEAv2GbBSqEt%2BcNM%2Bx4ZLAtzRdEBrEYAIEYjcRU%2FXYlR6oMBkw8IhfQiAfhtVQApvE2nUkrrX%2BqG%2BjkGxUZqMWschJoQCpJkB%2Bc3ymIn8LXmsOZ7RA%2FRmKctblKy1ZKs8hmCKbs1aO6gsZgS2R38s3086QF5m3NZbEkSNInPQ%2BHzg%2B3B219WZWCPF4rJcIaSlPjBu8X6Q3hRB8x0swhhdeAUuhI5E3WmzkJgswT1jwF4rzVxsIn33RIIKffNmksyqRWdBdfzDOGT1Bf9Rn0JfkAK52V%2FpC3MO9PEApajj8TZdihx6CiDFYTmIKG64AG7k11kPjxlg%2B9ZghNsRaTqpVnbT1chLyoC2oREi%2BEnHkPgCnF2km0ayUFLwzpdWmpSlQdkj9TPKA8pIAHQCLZuGkE5dzCRIyuee97L%2FsDXORLLDs5VUbh5ZuAbdtxjo6YB9i73dps1tCohcGpb3N%2Fo2lChSykdkIjUYjvG9OTk8f6PeAeeZl4RsBoOwLyHOz%2FE0A5RAStnLRutoJ1uwgiYXLr%2BE0HccEPK%2FCdjBLBFKtnFrhVBQxFIHMI0VgGb0ci4Z3ZZbMgg9AZQaF9dd6qiT1BRASK6uXNStArgxCupzRTBgjKtNNyxe1MAojJoOOa6Kkt6kTKaP2VfKjQzFXSlVy5E3XjHlt%2Bip6X4dQBZNhk4sS%2BXzgfAY6h3jmZ3nMIfSZ77GwTWveLWWz3fuSCs6xVGy6lrA75Hw83W35lLf4yOfNDUanh7xnPst5ddz7IZonglh3LlIy9zwee55J3vPavK7JvI%2BDu6%2FissBTOysy5%2BmULZZbAVsOD9ilPSn%2FQWZz%2Fr8P7Ttkj9mdcGtYwrZodSLJQ%2B6QwW7EqQrd1qYCeIoNvJiJBj%2BHUloE21dP0OZOArKgmfeqoENgiIYReCWDTpT3sjOR42oe2bZzNvekQiDdTIY3kYWQzzZk2y20TNXjMTKEmU3WNYvOQe5npVEGnBXPzeRCNNRrmWtXTDiJ88ey%2BfTQkOtB3lcYBvue6kmMQ4aBJt%2B36ZyanpCTqW7MmpnJNc5EgRIBPME5l%2BLH0xqsAgYEiMWH66keclCIIam%2F%2FSlPGhZigOzVcLRjPnRSL1G9ypYipsukjrlHnZRQYQ%2F1l%2BnjnCxKkrKsdUYHsv5BhLzFBAtlZmmEeKFj0Mll2z0B%2BekC3QSnu183K1BOP4rN5ytSUDSVUl3jTyPDYKaLA4SqRMwyq0H8nLLp%2BgGD4ox9qVaOSYG%2Bzjm7njrpFQUJ%2B1SV0oMszjTQ8aQY%2F5N8fzYDLlAVQFoyilNy7kI2Wqb%2BlNg2s7D9sWSAdYnbu5Nl0Lo%2F9IDx8VOdA0hzsrzyuCbBM8yrFPJ548FJ5PEePHVGyIDEOssj1SnSiX7r2XDD%2FMqVq0%2BWU7QiW518PVzmZGrFAUh5cSzHbuepYnJUzfVe8vUXBJ0XGSUDJPQo2vZM%2Biz3MTpUq9oasCSV9WKB51W2UnR4SP%2BLPDnkaUDV1hS4xVK5iJaKlRJNiHSbJDYpy53lq%2FKmczRL4rQkS2MVqBGwD3NZZLSejKXO8HJsWS6lfDLy8oBVIgjXlM4zrUqIalKrbIJnWX7gxPZPoMZAU%2B56EbNGQMA5VPDU9ApfLcGKKov0G0MhorJE%2FbCv%2BDhndWCyI7k7jtgtazSSe8pCs9TCNmXeXxnj9WTbvB0ue9Nd0eJTUzdGVYzG7kHcuM5Xl%2FnaqlhZE8u2preKWGqL%2BgYmvy7HDm4F8EzYDNtKWM5Exps5DwBXl7Mqq9kQ7mXC%2B3ugpiQPEueMNhYXt3YjM9kucrbbT1q1vUaJlpLcXUBRpSOyfb%2FYss49aSU3Nhj43W0xAoqiwLaKx2l0uhuryEPut4BaROoDlOFSDDjXRmkjQrB8BEeRpRyMrBsDwoL8lZzd2K6QykvH%2BeSp0XwamLEbvLa1LkVft6S40qV1LFXOis34riXFSJmcOE6T7ZOXtrN2GrO2b9K1z4L5Fb4oE%2BVLSLHVl5YeJzWNaQKVjtwu8zyRiRpCAyQw%2BoFkpUUWDFbBlnWNHkqmL2VhxHShTTlPC922JexLPaXgzXpFJv5eCp14MTrbvUH%2BWI9gica0DOFbhQxEEMO4o21dAx87XIWKzBgCAbwYEcVYWqlY8z5XGhNt2uQVRdOkVn0qTGJPbuR%2Fp8XLm2LTW%2F7KJ0A1gxMNAFRuno%2BLh4l34i2hZ6DH%2FkAyplaVVm30WOpw60ZGug0V5yDJJfjtiFcQQosvxpncSRafyoaFXT5o1l01obLuYI3uMcZsQeGYfBIM4GhoUsbpJuoQs853zYBh6HTjaJ9TxoIB6aZQU7oCGxYrDRkpjM2O0UYx7CKjpM9JJTWgm6Q2wSgZiLNrtEy5IQIJWTBvwxmtkqURTNaCVU4cg5oirAdlYdnCdoMICCI9xaug%2Fh7myP0D%2Bd8Og5yRteexX3IbNBKgHWp1zHoa8p4Lu%2FPA5P0TpFPDDmCZ1V%2BnlYzBmrgTlgQNkJLp1lxS8wtycW6XtlgwGrw2%2FejN5HICJzHBUdH19Tx0A6vb9mMEyxBSFM%2BzGsR11sUN%2FkuOKndSCrsd9OyB8XJ01p4zD%2Bm%2FeLsjFuN9Av52cimX1Bgq71KNL7WnKRlazHD057DpoZFGEydpIXfh3A%2Bqvxi0oaq%2Bl31YMubDz6WeIxmqmhb12Hm9tGgWpnfCPkzjTplElR457RnWkMKJ1QJP0da7wnxblLCrHCkho1J3mX96gA6ITIfWkGIOSPM6BZY4bGuhJGbTjm69Txi2c2WDG4MNnQH0Doni%2Fpa%2BeVjXCYjsj4RYg4hvMQJjON4RJm3cyBjWEQJIoOxDO836oQNqX2gbM9LCZEiUlCIYyiDPBkAZdX7ANZzMv92vn3b0jTZFbY1kvrV0RsV5Kv2ktHK19mfBLbd09PIflDaaRshdSal4TSIvmLGT6QKCRa%2Bz1dBisAY2CVimm%2FGQ7deOsxOK%2B%2BbpXJFBzIQy0OR3JJFFI7wClRCkxAJ4w1b%2BZ9fDyCMlugBY0ogh5xqhXIFZsFcMuYek9fyILz3Nxgb1JM7eH0J7Jzazqp67Msis1by9KNuIHsf2KSgK0SEdCvBLQHiLuQn4pdbI6DJmJkJktySDcJJxbsWarFGROOsYd3ewtXnG%2BX3APWoJ0NQ8BQQknCSI4Kb6qUx%2FcXNw61pZI2BQuC0UikBZQG1sZXkejMqwVibDbxuKGt7DagmydCvbtgzhrlr0w1t%2BdQvqCNJ1S9p2DAf3h%2FZH67r%2Fy186PptJJlHL5HtTq9yHWfd%2BUDVC7znIHuu4ArE2kTajyv400sNbYxzdWR0btCNWsNF6w1rGULjQDIzccp6hZ2flAQIPCBy80rWAu0to2zKiLQPYo4EKXbJJprR0psn5sVgoPWk%2Faanu%2FPB8HdzQfSHqK1WhV2aSISuZYaJXvFB%2B0nHcVN118WIdUtt7zlF2XW1kdHH9ZeokpJEINomYjQS7hpsbO1rDbN3t6O3px9KCU%2BKDTG1jET4kQvpWBnGx09Mj3KwaVX0wMHZrvZeMy55ocHextgvW3PliLlgzpABSLi%2FxR56gCk5oDu0Z9FXLhVShr90m39wmTZXdvbwsW88d3yztqVkW1VK5VrtM7trMmyxdvfxWtkea3i7tr9kRlaPlkklODRE8CBA611oJ7kCWI7eCT7T8hUAHcSEyyYLv44uGiqqHq4uHiiuHFeoeKk8QJW6aMV8%2FPRWBzq9RrnFnJlnCrWESdhbCmm8YDI7kUzkeBdGMPgdxjwqZlj5Jvoz6c%2Fk7OSrjMvz3t9%2FEL1HyhP85OUlU0lJJtOf%2FbQgUMkzngz3XfAJMdGdrY8pvIu9c130xFE%2Fo7A0tUk2G%2BcZGBdnXG2LtUmoTsMcO6Vvf7g%2F7Wtwqne5t%2FvuNYVQVIoHNbxkvFaUb4B7oJ9%2BTfcP5tdNm311xV9Wrtys5M2YibJU4l%2BbxxSPBPw5doxRoimtbK2N49mPG1GIfvAw%2BBtePyC6tHI8v90bcoU%2BiEzTWxwSzwiTayM8ozjbeSdCyfMu3eWCnuK%2Fq2tRRmEdro5zHoR9oqL1%2BtS8rFiTpx6qHCXedCoez3YFz%2B52f%2F6bnZlKy63HGrz77un8ChM8bTiuTxP5%2BS0ivI6cQihMRRIhlpH5h9bwZICFxfLX7tV38G5ukRNb63ufZ5pfMmX0OJTMxI%2FSHrz%2FQbE4Rchfr4Fm2Ubcimn5OU%2FvZBJJxyWlFsVhkRlaWzlaGLp7Edg%2Fsl%2BDjoCGPRJv4KsVp%2BETbOBB8tE3xFoNuPR5ZTcvOfK4fzv5jZ9Jz6bSNXHz2%2Bd4xkDyvP61KxqglIa2xJDm%2BKDGupdDTxaw2cTfn42hjVTncsh3Cq7UyBe9PeD8T9Ob%2BJDVTtmeG7P0J1eHbpadOT5WkaH3Bt5duG6gWDy0NKXq23OSnTksPwMOPUb%2BUwBQk3Jbsax2LMQuA2Ue4BHm2aCIk0QMbkW%2FvHM%2F1wOWjnYNC7d1hRp5IxQujqjIY3AZWx9ccFAq3Mw559brY5aI1I8QWj%2BaEMqlYF1u7tk3u3975AbyMGBeA8nLv8TUH2rpvNvblU1Lkdz3QG%2BiwOABpaoOefXRp33f4gWso8qd5UVnw6Pch6vYkAmLscja2wC7B%2BOEIllrUg0CQK5SLKv6ANKep1047vrmFpxp9VQIEdXJGkra9%2BhweUmIamE3N6EnkZqgRKuktXeZ4%2Fo2N5avrSWWeBy6g3K1113H3X2U1LglXF9ZkqXb5b%2BdcnIL5FecjzE0JjNB2H%2BSxsVNm8JtOB%2F2RB0czGIcVS1C7hpSjz1mwcripAdroHUxG3G935vNdyV42mT%2F6f2z1NxBF0mvSmwjD%2FvdzTje6%2FvwYSOuo4vkFnmfIfREvRATkYr0rivyOt5zQK7eQQ%2B9YJf%2FLlzwn0RlCCcp69mLAJ1rLPubr7KNjq%2BMn9WtVPsZ862guoztXQMv7VLtJO7p%2FIYrcA%2FKNigKceKo2k95xXuGku2wpCx2zmgsTh7OQbVFdgcxlOjbWD6uHf7RIfr98WgGJfNS5%2B5N7YQwYDTrB6CUjZxVAUuGykI4awjxRe%2FXvJw6kcD%2BHlodRDPnviRpG7Zm%2FXz4U7pMbHOyXAbfwzTNfwLIc8jx8cMDJzvyQ%2B8Gjx9wysLI%2Fx%2FJfuavxaNvBwfbi4Iw43kfMTalJbOvM%2F8POsBGyYImJN%2BGESpfSVl%2BQiqWzqyKRkNQS0tbYDivrv4sGQdZ7D9kF8fXZbBioGWShcIn%2F2dVVA%2BKVr9KRpndRdogbKjFqwXrVrm23dIxq%2F8ndXTf44iKyJjrOD62rbBcGLdJrNqnAm5M1Jj%2Be9W%2FDt%2Fsl0SOjQ62kL7TpY2yKon%2F6PzWMdPX1o3zrJCGSo1diNKN%2FRI9Hv3NyFvJCNLeimOCaq6xyXl4ANWtG4JXyQ8smhc2XrOJ%2B1NNP5g4vmTntVba46hns5ffZISyvHd%2BzmrqCYqUuWIp0njJTob5AvnOGOUQ6AG%2B%2BLc8xIGXmJ4JybUlT8rWgSy21CJ6o%2FUlZBJ1DreDM06nEZbq9%2FaFbycz4SifS9BEgfj0aBNzWAMuxmGbvs6Ra6e%2FEgw8ePXs%2FEBXiETTtShBBdy26j6iNSGurguNy4tjlJQ7N1O%2Fe%2BcnNLmmePjLEz%2BmuVENn69cCI7aNDrT0%2Fb1JdW2WRj%2FYJzDQoU4Veh3e5aL0QMXz3sOx5TOaptTaojSvQpoOmkofrJWTnaXifezuiTwr25nS3l18JZtc%2BiDQcZ3jZK%2B1cDNEtNfPFSV1UiyxbRCHycmpy1MJEH%2FO39QSHLxs8pQD%2BRCL6XJdb9HkyaJJUkO%2B9fabIlEpIc7dU1TcO%2B3jqGYmtljzsovZ%2FyjjMiWMke21M%2BSMVorR6%2Fs5A%2BSkrLXJ8bR5CImTEqRAx8qsefHkL%2F0Z8SV1c9uNCp9uCS%2B5OQeZgev0S2uR2YVMOd8pcokFUEX1Zpbmi%2BbR8BEo7M7Y9ExSnIzhLUdBWzuYjy%2BMRd%2FsDSptGlR63V%2B373xpV7MLrgSWspD0XBibqSub1tyUfPW%2BqRybSsILvDZwVjUydzCTdZAI7owcfrV8VxnLVCni9w%2BRi0yanwpzg2ENCob8Yz1o0dDA4Ai%2FrcehftEB2EA8LuaiOxWbHFlOGtyTPGdSx%2FmejCGsyra9TrjSCvWyc9T5lQTYzBRiVDcBG5iZGUF%2BtbS0zoPN%2BSZN2aGVvffOX%2FcNDVAH%2BD53Y0qCZnZY%2B7JOPz6I5fJ5kxqUeIa46OwH4329sio%2B9DyIi16iZxI2N2VwR%2FocNS5WwqRo0%2B8Q9B%2FVbCrIW274leHV7f3zXqJXEjYvpfeWBZarK%2FIGdrP2UtVmzCGyqEIVeleelVv5qu59PpHmJjOn4u9PvBpqSFqiIB8xUaA8c0nmgFMJFBbmfJHlakuNZlP4opnCup4qSDPWd8psGZMFqW3D4srQS0LG6sRk%2BiwY01We2ntTcjvzdnlKxupU4uLU9qkCC8u5ym5gOwLiRMdfsoTE9cUDhWvesswB7RDFciz0kOexoFZh%2F1iZCWGfyyKLTFo%2Bg3hxnc%2F6rec3nj7LMtlcdOk%2BzJD7EabvLTlrmV0WW%2FSmfnnppg18cMiSMBms4QVtNcrVSHTSx2mY9jg6CNzyIvCY2HjZVwW2ONiekb%2FrD%2BnbOdjbGQ43uq0KYtgpen15dfPe%2B15iQEoE5zqSvkCptAuYoa6O0nVbGH3p6KAGM9dzwl8CfigZ9SIqfqSpHL0u8%2FXIUgpqTj%2FUpwIx5XXOYlp6mMz0hy5zylbzI4V1bToWgtbTIrELzkyUUYMGTojpd%2FrfdAa8ULYGA1sDawODOgo4wqllscXQZSvXH9f%2BEy4%2FTnVWtLFkm4Sb9ZrdkQlQz4eSQV%2BZmYe520E%2F1XW0RCYZ5nLSXTHa9Qelh6NR1FgUSnb1jRTTG%2FF1eZQ%2FGkcxdkKxUd1nLlzJNgz0n4e5djjrV8iPKcY8gCDGnTYhKIPAxfRGalUW5YoKox59sVjdL%2BqXgk6eS0y19ze3vK1G0N%2Ba8wmpMonhd5JI13LRSDKsmQ0MJxsniaBBKVqQ%2Bcx%2BKvWrYF%2FRsbKytnLvzyqW5nA0DIawkzEc%2FBCrR6JerF%2FbEVnl%2FfVvTXhbtLextYo63cB8iqwXWJo%2Fs7BYfIsEzxZ2lLCSl1xfHEbCR1osCNtPLgtvFI66GRNtFS53WZa8hTEZkePTN6aBZ1%2Fdc5i4GwYOyMyMj01P9TXC470hmenx0emZRr74OCPv1NTY2MxUHwNcirNBekrs88lgny68T06mh3dxPguR443JzdGTyBCGVF8W%2FXhdxV%2FLX8N%2F%2BfJSsEawVrDqKO%2FHdzeQvkEFhqeGhYYl6Dil7RDpMDkyqjrtMXnCreO6j6xpC141jt9wMUwrzCZHrd%2B0oj7sFsmZZFtcdN6%2Bdz%2FL4jZCek4NeZ4hX%2BGr6SVZoJXmbhA95qWobB5qmq8dCgmAJ2IbNTzNXK05HOKMTLRUNN9ra%2F5fqpjo5updqv5qaxkbqSefdSLa9xki4pqLykIaErWThe834tTilw8%2BPX%2F45PsdUo45pChIS7tFeW0Vg1nfWMOsrmM2lhdcMLt7u5idRRfCcm83SLyru1e8t1Osp7tbQqLr9VEX6%2BgTtwCpswh5PYzRhEZFBgYHdoV30QRTwcyg5q5x2pq4YvNCUl5S8hyFvgVFKFjV2cvNDYmS10Wq%2BA50Yfinxq3Ly7d%2Fgd9vFRUAon%2Bw%2BvXLmrIDQwmiQ%2FviSkuU5lZwc2MYTMfWtDqpr9rwouDenIur60wObX9Ljgm7PqY9x0CwXEztTOy099NyZhbzSTNzpPy56VznakenqmpnC%2F8AKyt%2FLBQR4A%2BDBQSIvq%2Fq35xbNVz1jVhIMbQ%2FpN1hic85PoqOgATpa3xTx4Q4YeJJsb25lRk4tFtlbgoptVBaxv413M7DRgrD5RFmTZzIu1meYNhQYpN8Oyd5FZ8VNJ6mYaato%2BslnYmO2ibr%2BWTXE3R52g%2F5dczj%2BxTYuQ125i00OEs7%2FjwuzbMNXYxdL2VWRhWhAwtsXKjlaW9JQEyhzbk%2BNIo6D%2BiIc%2BufW576vv3Bxs%2Ff1Id%2F35opZt711D87eHuYn6uahOdhzLWOFB2G%2BNAd1TJOtlwuHoqclpNAxlK7UpzHODtF8O11gRQu%2Fdr7ZxoqB2bbegYnaqoHpj92RFiHOTvLRkRZh%2B5dhUqacPBi%2B7u8BNwEMF0Y7MAiv%2F%2FV2fxu%2FP%2BR%2FAck6a%2FRkzLBwcgKf9tEb0NvuE0IJsS1SwspiRx6Era1ezrbYykb5RAQ5YKBG3rZKn4Aa3gCRvd1mAz0YSqAfOXVVMV3Of9R5Q39Iq41rk19BLmmMS3R%2F%2BHhO7w6CySnEsgRpWulxFm3jPjfbtRXdJfLY%2Bpr6p3NHFC6qAHD2l1z86QUqDmsGxBglmZQQhLM3PSTShLyNZs%2BKLPD5BZgvIunlhI8RZertUiX1EI3n%2FzFlb8RL21zJNpQXvr5XqOt5kv2U%2Bt0idsoN7380FGwQdyEzpKT7rX4V%2B5u1eUX%2FMevy0ysL47eZU31JRcQ6wg32i2g94%2BtEJnGai5mLkIii1keYDdDRw%2F5CGjHg76t2VDIanmLiul8laGZU7xlLCwg0R5sGmihYaUFtleHZdlFELNCggrPyQvAXz%2B%2BpOoypqV3DC4GN77cuLo2RYNYXC%2FsQFp2OCntqfh%2B9qmNq32185XpDXGN3lZ8vM82YPmA9l4PLzgINQnDJM1jyB2Tt7%2FW1nUmFZcQvbJpammKvfRM2CPTSXSkw%2FToMvwSrL8YoHe1eTnUf58Lsx6f0jA9fegYjjecbq%2F7WeGUuRnroGcnhybnG8XYneQ5pU5FVuU3Jn7kIVZWZFRltTXWlLXklWeN2IGe8IzXlF%2BhACqIkQXEEAwFg00tdQ1MLP5cixoeQNOSIB14aLYLMrqwlt4PcFcSZWTmm%2BNmHZJdpYYEciTQ2UqjTuHAttRGE8SQ6TJ2jny2xC4cv%2FqCgUOrTfDOqSIz21ul7Sfh5SzXoDRu6%2BeAD5z30%2BbJ8QkUpbYNSfoIhf%2FSZgmTxgye0XMGnqhBYGN%2FzjCIa25woFMWGI%2Fh0duAFAmuCW5CIBKaew%2B4mZnv8e6loUGALeLocsTFT1rIWGC64NWkZ2OX%2B5aw6W3smb5w9ey%2Ft8RXDG3lPbXYHglPuTm0dD8IXgqeSV8oLUyfnZ7PmCUXp84Yl2yFZ5MYSJ%2Bzk4sjNPwOCbDAYCw2AdHIP7tsFEhtFDY%2Fzy%2BjPjKNTU8JDSUmYf1TksICsxMz%2FdXGlZTH1YJDlEblVDIP5exA1nKWIBBSEEdgJKWTsfLIXxzMyVYAl8yYlVaphlyZdZ9l3w7HzAPnH5kSvTDCifLn14zqBf%2BvL3l5zEePNfYIzL1mYiL3eEdrflrBjEcaG0mcvWbSIltnN7kL3HgG4tVsTp8OcJ%2B7u2HGcv34FJT9UOtBPN0NYyrxz28HeFDh6FdZNv2clFFMSMgs0XjzcrLK4uOzSjhHD%2B6RAvRXDeXu4QF8GB4TM698Mt9GN8kandf8xaiA6uW%2Fwoe7hHvWah8JPeCprskBaysUVxhuphv0fzaa4t%2B3PcvlkqSAXFZbKflL9fHL2t1O6MkaeJR87jn%2F%2FZ%2FJD84P5hLzTabVkw2HvGl8NwrQLDsw6teCtbCAlB1R7swPsJrd3AmwKsJXKHqvFff%2FxywD%2FgzvO%2BefVFrZFX%2F4fin7bZZonTwL5FVJiG%2FaJt4k1FXoRG%2FolH7oHIoXjlkonRf3PmYadmtA7%2FTMgigj7RsLyFhtEDqNn%2BeOUYsqmXxDPtX7byMOoZMkHTo1GTpH%2F7ljm6K2gFUboRMfwqz5OHesWtRn%2BZyZaZ0rtrkd8AMmOw6YfjVgzmcDxr%2Bf8uK8MXONTk1%2BMaig5QEaMDl0wBQbJ8Zm6rjfgLQUOgm10Okwce54WIzZFeVdwYes2%2BaZqwGT4wZM5x4wJ04ZL%2BhzOmObJ6A2dfmCddMV6JTxaj63%2FpOLxi8BGEyDh%2ByQT1333%2Fnc1cBA%2FK7abqD%2Fzv4%2BmokH2rCS50s8gNVyKcx6F2HRp6o0k7L%2BnH%2B%2Fnv5Yh%2FIWsNlpACwtZKucxwDQbdBGKQG6bZ1HO3tEW0ePpW3f4xGABYyc6J0%2BcPFu27QAKP9xKoDXKNEuTFUS4qLdowqIj51tZNijXwFQ7kR9ljjXx1CpuxXo9PaH%2BB0m3wU7cNFwxQKgupzypGkXMQVI99NV9YB8gRDw3AOfE7qvlNINqBNpyBWTU8wdHwOGNsITVt4AUEBDagVkwHKxOKBe3onCf8bp%2FQn%2Bw4PdGi3iFyB91OPdBuTb4%2BQYoU%2FAQ9H4xN7IH3f3MiNx5Hyw4AZw3awHY8l2awYznN%2FZWyEyOTc0IcVRsb%2FEKeyWUO7sdv2g08yQVTyG2fcUvDojgu%2BGZxuJj8rD79ucZYGRMkyVJI5LmhWjzmO6ZwSOrORcVxFesHZYhuXR2GfsHkh8Bq2r3MRtA%2B5SDGXCbohCu92u12bYcny4R9uizqGMGeu2HZoPbTYGFPHR2snMjWYngrFcYG6A%2B1Hx9RkXu71mD67bJ%2FEUT06Em0mR%2F4DiXZs5127bdLBeGhjMUK6HsWAzratL%2FWyZGcNBrkCLtzEP09XJ8rTu8xkPoYe6n52civVZ%2B%2BM5mc9X%2BK2b%2FL9vu5T3Kzy1nmXlJO3fJGEHafb6N5itdVEejsDnh3h8urT5fCHG0CzzZrzgd4dZsjphp3Oclqhedae2Cx7r2B156Q6fMK9EA4ZJiaXndz4CImHHMdgEtq3DRkVOFA0icArejq8FGXOPuMixh2%2BfI9WQSWj%2FUTs1tO4nAN%2FdVAluu3YFxpgSeio5oMO%2FiTUlDmjFgCLCJLvN5qiBkHij7%2FOl%2FIeiphD%2FdYC5LCAkOfgN4Qq8BaZZSQAgzdFfgoZHaPmZZAR0DoSJ3ITdTi1b2xakKhzLIL8i8Kh1CiumGbJ0oQPzgRFzYsOgeABesW35qMndh15WU1rXho1aE14xHr0j5O4F0q1fGgvb0vrcwdep1wCwlf1ELOboytK9SFmG02l3xdQLe1tCIvKwLdc7Q35XnYBgTcaTcwZaU8Inp6Ct%2BPMlavaWWovKlMgUBrWa8RlYHDY0DPM%2F9UzhXY7%2BVrJuBOYKAN0V1QsUQuTfCAJ0tXdUNWYShgAy8HgWZklyepHjh3ul1P5AvbW8IiMfzfbGFIACTsgbHJD%2BDkV6QyUHkaBf1%2BVYbM65GY%2BXywjg%2BYuApbuoEaGPDSJByvbHqyZSwoMFMXF%2BLNWm%2BhdRira8uiL30P8h6EpIk2yjHFvDwSXZyyRatfgVr6yuI%2BmhKhstloF28aZiIQ0trU8%2Fbf369%2Fr3DSpwOQFkmh0a4Xf4ZD2l%2FxEjsAB8FlhmK%2BYBcfAsf2MEoW0UuZIX55PJMN0dBlDq3y%2Fbl0K4E0X3IuufYTFuG%2FAWSJaWLebMOQ3wXOvwMc2m3ctMU0CYtaKG5QewbeCT2Se84n5y6wyStVicic%2F%2BfvSNMZvy4UMWpXf9Bo%2BXsB6UThiKgF2VhZUvx10qeAYjRsfmc7OhFb0JaLwAT8nJ3OtVDqxg9a4y1kW6rhXzqfGziV9pXWFvpxXA4RKgdlfCq28Fi2e%2FSFShbVhXKVxKmdQb%2BQ%2BB69fLjlkAhm64vOHI5YZZIzElZ6AxIhi43ygaboRA5%2BSGIsYbYlsSgaEUANmQYsrHqbGJVB3O3BHHC6To%2BZY2WUlTn%2Fq7mIkUNNkWQFLql0RMdoS%2BmmnrPeDAZywBEQRy8XTj%2BxKV0M1a1pSR9Co1JLOakgJGS%2BCZnsa2IhmJI4lQogqc5CqcfL2VPEta1nbst1MRBEyRgJb9ZmxL22HaKKllhcB5EdVQaJdTG6AmI6j6aZbwqgWTA%2FUk6RowmnkPi0Xpe4DoPYlI4yKZf71sKSYIOFRBfknAqN1gyulcoCBho8CWRQzqtxeZTi%2B9xOOTATq4tOWMdAc6BNboJrYRV5fETIysCJzIBgZtnnUnz56SyuZMZym4T21Pc%2BYKG0BXrwHIa2SlL7OkSjYks8Pg6l3sIwmPllsH7OVMjjDPJeXhOcNA20zYdjBBE%2BYipeBxesh0w5BAy65t%2FBSGJpH3uFgToFR1qxo%2B9s5GGgCFkQPVEgiYaDoms5Z99AWBQxj0PONNG0vJvWx5N9K8xPA%2Bk4iRc2ZyRH6gBGoJhGhKzMkt1MfkS3Y0RFUscmP0q%2BEQ6g2YxYlRDCBoJKRZbFfk4HkHjo1TNBYR%2FHiOziN6%2FY509ibuuqnCQBEheEVpzTUGf%2FtNlykCEfopFysImA4eeGCejzOhWqUBqBNNCzDq2Z5tmKr5ALljdFCMkSI7%2FdDHFOU%2FgGv9zIuaj1aSc99MfX9tcDGnfC%2BPnkdK2UPu9AGnedt1vPAuY0bKawMPNwtKg%2FEpO0uJLke%2BEZAhbZBdAF00bRXFYaJrh9ijsrNjJD%2FRFSJKKWvQuWrvzLJdoV2AOddHTGq4KDAg8m0Tdfr%2BaSVRtlOFJXYNKQ4ctWV0IMvVhGosSxC6HUqYkfxYKbSgRvOLZiVpnGUedQS%2Bsi8wjwh9hggEV3LgZQq%2BG1qM3q8RrW2bx9OSzj7DtzPZb9LTCvhS9TPxxTPx%2Fa%2Bfx%2Fd3i%2Fa%2BUl9doNTVYvHZx9cWekmfs1TFuuuKhjITF4eO5hYAeyonGBBoJYQIcV%2BocEn5hVRHgHGD3bBT2YhNBPODK0NgQBw67r21R%2F%2BpJ%2FWD%2BpG9ZR%2Fb%2F2zIrmExuvMyqp4NC3vUT8OwEJndVcVe071e6xf11%2FWn%2Bkf67%2FqFpk%2Bo%2BwqqFoEGyFQsh0PGLdUZRZWaCd0nYrEoXSXemKNL4JoSW8tYfrSiwjwv7ICoyFCgsGqbFACbbo%2FxHmfTLA5HpB6m8hE3eKxwRgtq8TDIS2R4h0tgflEFIqx5DPM8BqMjBR6KbezYG%2BDBzoXquDLUqPousQgehNLh29rJeGY8wQhq1RWaMOghdg%2BNIlt2Zposk8OQ96C6Auu6CtVRTcZ141RfSGu9C1ZLiCopw%2FXb0ryQooJO001cnCZS73jj0GG32W2tkDYK4d6AGIXPBcD7HrKsekSm0f%2BpMWYdSC5TcglPfqFxMFfE6vu2UrV5QCkFI5A3MJghtbEneGAeMSaL%2FNUvcspnoGDjyQ%2FWh9hmPczUIl5AvUtG6WfmmsDWBF4P%2BCw9KkbgUst8q%2FdtGHCo%2B5b3HcR79LegYTgVfOeGn%2FIOxjH0PRaHMQGKWtJa3k2UGJtP25vbMAuZDwjAofEuZ1nuQ8uDJ%2F7mwYbdYD9RJwPieIi4n3yK%2B%2BlFzD9Ynai0NLEtb2nZYjcylDb6dz2lt%2BiX9HcSRPFQRaETgQNDQweX3pptsuVHFEmYAHr4BOnfRo1lLvEMgO%2FxqJdNo%2BofhE%2Frt%2Bpf1n%2Bvaes6ZTjTf6TBCLPrWuG%2BSAQNE70ChjY0oCH2ObB5XnEWO%2FEkmUJJgIZ2AujyRq%2B4p%2B2ajEZHNDRAGZciwyuzyLaX0ORk53Pf24FtllN3nA27TnMzpHxMUk2jNyup2eC7Z9cb%2BNnvzLqhj4ymvRjXfpT2KqVBT10p%2Bi4qq%2FJFfHUkER0rCyCl3tkWZdULbOkf6VyFybAbS7VdM0laACch1xIL6vD2IpAHLeX%2BnM%2BUdzawMhqw74E3G17eTlmA1zFKuZjjzL3SCZvalwBqS4%2Fh%2FtCSyjxMWv2Tp1rGTchXAGROCDIkeOyqkY5UhDl44pm1e4AiaLxN39PtfHjXHTdnYPimeoBAkvZVM%2FY%2F%2BQn8bpFtTkTn%2B%2B1nPjlN29rZA%2FPxJzj7ue1lOQVMqEqFWwDXscMPXxfVtZ%2B7QK2u5w8fAExtqbWNUPksf5Qx52dDw5a30sFK7evxM9iG7CJyGbvG84bD%2F1GmVRQtIwLAnVGuCzM6%2FOf6Zowx072rLBSxOKUQuCjXlsUjXEVhqtdz6wQITJGZ%2FrZmhHvmlpshzEULFiRthq7NWXdcCG2fRtGJB%2FcVwIzV6A01pvYb90ZONjU7mVBkRpyu7od%2FAIJBXZu9kooYFO4qHRTYvOoblrL0RVyD3NAnGVrGkZL2hVz%2FH%2Bn8LPzZnSVMTmkeBStdkJxpnpMjIE5vtcDcVeZAC9C0dCheTDFN%2B4z8bJ1lQT3uk%2BDSpKpf4A9C0dvncAhJyMUPyPOi8OvKRInuVbAVTUKdYsQVlunHgXi%2FHQIsIImGJtz7KpV%2BlcDVTBjJZeLoYZCCiGOKaOnWUzICSKbFSvX9lfy0VTV3XwIeZBnf0jqwnmUTzMkCPmHBqZF81yS4idq0IBVU0acAdaS0BWKpvk66MaOAHZC5GLQ2j5hF4izrpM35nfeQjhJ29%2B69S%2FU%2B%2Fx4ldt35vm0n0Hhp2kzw9oI5B41uaET3a8xs1r%2FMbJyn5sSbNR3jeTvv0Yofw%2FLePtD6yvz7SF8k9B4epzzHf4v9WqSpMWFS0QOLAOZueZ6F8U0Yona8pDURMoNUpJcIxPpCBA8oyUCCf02hC1oJSaeRPLInpJxHyeXPcd%2FEMP2iYMC6srrKhac31vM4hHFJgLx7dQPrMXv9jD%2F89Wx0vA9M40cg%2BD8U7jVCYsET2MkVXh8O4Li%2BHplbkFHhup5lbQZtCOJjkxdT1xU9G1fK%2BpyplMtYwCx0HIqbjtwjE73sPdI0nN%2FHOwD8rzLvEXso2jcG4vCKQtoXLzPsIfSAZgpBrXBlby9WI52w24FO%2BjbG0P9PZwbiXCWnK0jWfsXv3a1m5nyVny8uOAfjDpjBoKnns%2Bo9escAxu8DQ2ptADz1awOO%2Fre931%2FGqmCru0WxupfPAeJWr%2Fj2oRpPY%2FbheRh7Ht8tnuPu3Wlszg%2FEHgG7j3VXPmJ6%2B0A3LWA3LEOqquWwiOxe5Xa57D06w4nfxxe4%2BT9d%2Bh6J70YmKW2YLh5x7n4g2xYmArSnJb%2B9KCqTaO6UWhm%2By%2FMjgoD2GcEXj4Ll%2BO%2FZTu3MZEwDillsyajV7wOTeEee%2F92e7MNChwyIOxu1XnxM43TcOLMmZMT4HRoYhnI9rO0WG6vmdW3WQvZIU0xvJcHjxQM1joctFUUYI90%2BNTYTIlj%2BrsO%2B7IWcec1U61q8rtfmAQ7QDRZVDOtg1K9W0H%2FH%2FUMdOr6%2F9wJaF5MY2pKOSgE6Rmx8pOzLZRlTMjxDEb7gC%2BKykqTYdB3amioZqUWznp1i%2BnyVZdOztPO8pZ6yzXlMOX7IDshVu6IaVysWtrcDnLPC%2BEobanCPAGbovGy5gcHkGXXOVC7R9E9obwa%2Bg8ziJFMtLvwnANdN%2FWwTrHTrSphCwMGpbzdp4RysAwwrLmpcdzAOvk09f%2FFdoYEn%2BN7%2Bv9%2FTlKY%2F9OFa%2F%2FWa%2FCnWejOwp3%2BAIAwI1w3lVnayF4iZBA98PhFPtAJRZW%2Bsm%2Fr9Pq2BHKqq5BTf%2B9W9GIQkFe5KVBfPK%2Bs%2BayVPRsfGzK1GOlVQ%2FXu8AFe%2FFZPHET88c1gH17Ogbb2utFIA5APOpo3C8z7SOJ%2Fh78xmw8sREdXxiZenCML15uCUSkQAx6GXReGktYLOHehj5FHoZvLRvkv0ftdjw8NRNqOpt5iLUTd6CVSnvlt3v%2BxYQCcXlK58CYl7kqFz6WQCVyZemvSsafXJLg4HlcFfy%2BZLTnSvl5h8MlX%2F7kCeSps8IJiMh4CqoovVXDQMUjd4%2BCTxhjZAyQcMgzmtCMfCh4%2B4mOAoJvw4OC0W3qU0x6lHvhdAAACPxahdZ7c292Q1%2BEZH%2F4OS%2BRPiXTLN9RYR%2F9v%2B7ywDL51m4gcw81NTjRKjq%2F%2BvA2aX%2BRMcEs1%2FOvOat%2Bu2hZG6MCB3V20iqyS7bvKUK1lEd8y%2BXfBKX2TlPKiRYlh9WIUbeWVx4FwGltUjW0SxrVNn8tR6XD2OHmlPjMdDtIoJjtxc1gVOBxCwrsPSjK1XFtGsAG1bC41DQnsRiRrXcSabtV0JHaWbZL%2Fwa8KLqqNg73NyZ7YeIaFeAIXdYPnVHMLtk%2BH6C9BfjwnNqeuzgHoHk9yutlQA9%2BoVQbhExJ86nYJrO9f6R3f5DjsKF1ffMp8Sr3i8jUt31lcb%2BcipZX64u%2B8EQ8n6mit08xMFn6o%2B5lMkSeNQGysM0F2Oqwbir1aA8iqzwkuxBqbDfOWghkRz4GlnJ8L0Ejji2UrppLK0kl03v%2FyFbhkMxQeaw%2FXnqUD8KmHC5FPqnaBYR0kT1t0MRemcTZOAkGJfmGxOil3XzqDzKFFtzZm23uUo1%2B8Y%2F54DpL%2Be1rRDypqbIlfJMhzU3UAI9Le0jL1ujcuZYM%2BPTI16AL3pFHnqIW06rU9gNTcFfD2x17GqRspXK8DzAxx63pRKCX0%2FV73pdW1MXqS6qIDdR90lKR%2F%2FZlkSuChCUAbJF8q61IWy8qAOeTB2p6fhRvk1nGsGmAAaj%2FQRAwOCbXc7OcqPf3Si139duThdJdsiBxG7cxQkZF%2Fifll%2B%2FN5%2F46LRf%2FHIQiAvHUtMzFlCrNk8ew7iSsyTBDKFSiuZswyVzVzOyCsoKlWmKlBVU9fQ1NLW0atfVgMYGv1ZhIo2AAAAAAAAAAAAAADA3xqjh84Oz8Pw2idf7iB0h8EbYRib1uI5hFR6i5bJrWBt01bi3P33NIigCABgAAAAAAAAfC5nEUWu7%2FPA6%2Fs26ZPvCxrE7yjSGFvKuZbGYqyVYzEWY9GW666d0DvSv40HGB69pxh3EHdHUeMmoaa%2BGcK1CLEhlLVltRd9J9tdn3v45IvGhVR6iy09yyVJkiRJkuTfHm%2F90PMgssij97gbm3NAhAll7RPeCaV6ERERERH5vM7CHa57vtZr%2BOSLwRua0cgY32mcxgtIpbdomdwK1jZtJX6UYneOzZ4ZVVVVVVVVVVX9fB4M33h0n4ZXdKzcGLsWESaUtU97J7SizczMzMzMBl2YWf%2Br6ffvofdoX1Nn8IT7POi19cmXBvFrbtB44awIQqKvKcychbJ6NvYc2XIhIBokbp68ZSUSKRkphkpLRz7LLyAoJFKGW7b0ciSvoKhUmVUFqmrqGppa2jp69StrAEOjxmiOFmhTZVvqoMo742t5D3xeJEokkSlUWgfu%2F8%2BBw3sYPve5PT8vGK8Yi7EYi9CEcCCQ0ZFMYM6CrJ6NPQdyITFPkiVTqLR0Vj7wCwgKiTT0zNCC7biez89CKiCB5Obg7tl6wNPL2Rt9FX1%2FSmNcAQAAAAAAALKi%2B5EEAKH3AwAAhD4XP%2FjCRx6c%2F%2FULRPwQGka4RSCjIzt0xsPF4nD94vAFi9%2FkTUjMlmTJFCotnZUP%2FAKCQiJl8pSFnLyCopKyiqqauoamlraO3g6yEfEXdW1hOuCdbdcDLMsadD5%2BAUEhkTPvHL5%2FvtsoPNmfU3fIPS4IQG6evBHj9n7Tvjz%2FkDWe7M8pUo6IiIiIzvsS4cl%2BjBj4hv1y8wcBc%2B73ucfnHpl7GzMzMzNz7k9NfmNMO2TbtkjRQERERGqaqqqqqn75v01%2F2n23Fw3gCGQ0K4vPRjKycvIKikrKKqpq6hqaWto6ehbti3sn5HwdcXJyBuoAAoM8jB89geTA4CxKBIZoKQEEiUCQwLY%2FUAiAQBsAgroBAAAAAAAAdcXpdDodj06n63s%2FPngF197nw%2Bvd%2B4QQQgghhBBCCCGEUX6EEEIIIYQQQgghhBBCGGOMMcYYY4wxxhhjjDEhhBBCCCGEEEIIIYQQQimllFJKKaWUUkoppZQyxhhjjDHGGGOMMcYYY%2F3c469l1mo5tZq0pmmaptVE%2ByXUb%2BuPv%2F3rqf6N%2B3Tcwe6OVuMmoaa%2BGcK1CLEhlLVltRd9J5vn4ZxzzjnnnPNB2YJzIYQQQgghhBCDsoUQUkoppZRSSikHZQsplVJKKaWUUkoNyhZKAdfr9QAAAMCgbAG9hYUFSZIkSZIWZ%2FmAR%2BMVEGFCWXvun1OgZEmSJMm2bdu2iSciIiIiosNVlvZLOvZ%2BAAAAAAAAAAAAAAAAAAAAAAD0GKFhaBiqajRhmqZltUKWbdu24ziO67qu53kecx7cMzMzc5EmhBBCCCGklFJKKaVUSimllFJKa6211lprhwQAAAAAICIiIiISEREREZ3jYV18zi%2FLMTMzM3PZYxARERGp2VRVVVXVzMzMzDoHSdCxaDdS4H0kPJzQyOanzB2Qis8u%2F5ru7T%2Ffos5IVgbM5GzeGcb1xc7UrDV%2BfbO41Os7K6re03ntaZKtSP7CiUHzFg4%2Fd%2FIXJoiPCKH8oK7kADEmTMYxnjFfPvWzCo4YRbzcErIYk6kY5GVVKi1zTB%2FFCxKRmFGlFOSl%2BOkLVpQDRbdXR9Kj7ItTlHiL7KhvhPovKRFwArAsVFC5HrwTnjIES6bM2UDbiYrUKFG5MNxwYM2yzar3Aelia89QNZ3eyIxZv8HxjTev%2BcyPHQdOXLjx4MWHnwBBQoSJECXmOhBxEiRJkSZDlhx5ipQoU6FKjToNmrRo06FLjz4DhoyAQRgzYcqMOQvQiwB%2FzlmBQ7Bmw5YdJBQ0ew4cOXHmwpUbdxgePHnxdkObTFlmVHorW5F8DXq0JypXJGr7cd8wvviqUJVcS577rFGvby591%2Bqmdav6%2BfBVws8mf2s2nMG6Z8%2B%2BAQE%2BIXvovgcCnXsvT7AgIcKECtcsQpTIZ%2F3zN0a0WHHeiUeQIFGyJONaEKVIlebCB5MeGXTLgWcODblt1Jg7ho1YlqPPrDnTicaPiTb1aZRmfktlgaxt15ZtOzV8Ehp6LebYIBUVYzP6iFP8cXjfCJw%2FtfkEF7FptYWJiqqbQ40Je1wMDh8T6Y8LisBdiepw1qB8b2%2B8sf9FXw5HXzoi3Zf6QzcfHVHdrnvrhC9etP0LV01%2FdVH3x3f1l2bTQ1%2Bl%2F8%2BMRVCxg9vjtn980fTpYL%2FEEb%2FE5qJlj0ThDt9C%2BgvzhDlnlpqmWL%2Bw%2FSN09twFkYfJl9qh%2BVIx5F8yRH1JD7Hy7%2B%2BpzxZKffweCkWYEMK4N2fhHop78QW%2Foiq8vOztRA8%2F3ePRMMw2In4zxPY7wEdHjdp13Goj%2FDgkOGl3tEN8v%2Fjw9gaL%2BzPMjmqI%2FSbD9Z%2B22f2uLBLz9GkYTj199ixsgIk%2BhT0PdCtVpwAA%27%29%20format%28%27woff2%27%29%3B%0Aunicode%2Drange%3A%20U%2B0000%2D00FF%2C%20U%2B0131%2C%20U%2B0152%2D0153%2C%20U%2B02C6%2C%20U%2B02DA%2C%20U%2B02DC%2C%20U%2B2000%2D206F%2C%20U%2B2074%2C%20U%2B20AC%2C%20U%2B2212%2C%20U%2B2215%3B%0A%7D%0A%0Ahtml%2C%20body%2C%20div%2C%20span%2C%20applet%2C%20object%2C%20iframe%2C%20h1%2C%20h2%2C%20h3%2C%20h4%2C%20h5%2C%20h6%2C%20p%2C%20blockquote%2C%20pre%2C%20a%2C%20abbr%2C%20acronym%2C%20address%2C%20big%2C%20cite%2C%20code%2C%20del%2C%20dfn%2C%20em%2C%20img%2C%20ins%2C%20kbd%2C%20q%2C%20s%2C%20samp%2C%20small%2C%20strike%2C%20strong%2C%20sub%2C%20sup%2C%20tt%2C%20var%2C%20b%2C%20u%2C%20i%2C%20center%2C%20dl%2C%20dt%2C%20dd%2C%20ol%2C%20ul%2C%20li%2C%20fieldset%2C%20form%2C%20label%2C%20legend%2C%20table%2C%20caption%2C%20tbody%2C%20tfoot%2C%20thead%2C%20tr%2C%20th%2C%20td%2C%20article%2C%20aside%2C%20canvas%2C%20details%2C%20embed%2C%20figure%2C%20figcaption%2C%20footer%2C%20header%2C%20hgroup%2C%20menu%2C%20nav%2C%20output%2C%20ruby%2C%20section%2C%20summary%2C%20time%2C%20mark%2C%20audio%2C%20video%20%7B%0Amargin%3A%200%3B%0Apadding%3A%200%3B%0Aborder%3A%200%3B%0A%7D%0A%0A%23tiHeader%20ul%20%7B%0Alist%2Dstyle%2Dtype%3A%20none%3B%0A%7D%0A%23tiHeader%20%2Enav%20%7B%0Abackground%3A%20%23c00%3B%0Aheight%3A%2041%2E375px%3B%0A%7D%0A%23tiHeader%20%23top%5Flogo%20%7B%0Aheight%3A%2036px%3B%0A%7D%0A%23content%20%7B%0Apadding%3A%201em%3B%0Amax%2Dwidth%3A%201200px%3B%0Aoverflow%3A%20auto%3B%0Amargin%3A%200%20auto%3B%0A%7D%0A%23tiFooter%20%7B%0Aclear%3A%20both%3B%0Acolor%3A%20%23b0b0b0%3B%0Afont%2Dsize%3A%20%2E9em%3B%0Apadding%3A%201em%202em%3B%0Apadding%3A%201em%202rem%3B%0Aborder%2Dtop%3A%201px%20solid%20%23e0e0e0%3B%0Abackground%3A%20%23fff%3B%0A%7D%0A%23tiFooter%20p%20%7B%0Amax%2Dwidth%3A%2060em%3B%0A%7D%0A%23tiFooter%20a%20%7B%0Acolor%3A%20%23b0b0b0%3B%0A%7D%0A%23tiFooter%20a%3Ahover%20%7B%0Acolor%3A%20%23c00%3B%0A%7D%0A%0Abody%20%7B%0Afont%2Dfamily%3A%20%27Open%20Sans%27%2C%20sans%2Dserif%3B%0Afont%2Dsize%3A%2014px%3B%0Aline%2Dheight%3A%201%2E6%3B%0Acolor%3A%20%23555%3B%0Abackground%2Dcolor%3A%20%23fff%3B%0Amargin%3A%200%20auto%3B%0A%7D%0Abody%3E%2A%3Afirst%2Dchild%20%7B%0Amargin%2Dtop%3A%200%20%21important%3B%0A%7D%0Abody%3E%2A%3Alast%2Dchild%20%7B%0Amargin%2Dbottom%3A%200%20%21important%3B%0A%7D%0A%0Ap%2C%20blockquote%2C%20ul%2C%20ol%2C%20dl%2C%20table%2C%20pre%20%7B%0Amargin%3A%2015px%200%3B%0A%7D%0A%0Ah1%2C%20h2%2C%20h3%2C%20h4%2C%20h5%2C%20h6%20%7B%0Amargin%3A%200%200%20%2E5em%200%3B%0Apadding%3A%200%3B%0Afont%2Dweight%3A%20600%3B%0Acolor%3A%20%23333%3B%0A%2Dwebkit%2Dfont%2Dsmoothing%3A%20antialiased%3B%0A%7D%0Ah1%20tt%2C%20h1%20code%2C%20h2%20tt%2C%20h2%20code%2C%20h3%20tt%2C%20h3%20code%2C%20h4%20tt%2C%20h4%20code%2C%20h5%20tt%2C%20h5%20code%2C%20h6%20tt%2C%20h6%20code%20%7B%0Afont%2Dsize%3A%20inherit%3B%0A%7D%0Ah1%20%7B%0Afont%2Dsize%3A%202em%3B%0A%7D%0Ah2%20%7B%0Afont%2Dsize%3A%201%2E6em%3B%0Aborder%2Dbottom%3A%201px%20solid%20%23ccc%3B%0A%7D%0Ah3%20%7B%0Afont%2Dsize%3A%201%2E4em%3B%0A%7D%0Ah4%20%7B%0Afont%2Dsize%3A%201%2E2em%3B%0A%7D%0Ah5%20%7B%0Afont%2Dsize%3A%201em%3B%0A%7D%0Ah6%20%7B%0Afont%2Dsize%3A%201em%3B%0A%7D%0Abody%3Eh2%3Afirst%2Dchild%2C%20body%3Eh1%3Afirst%2Dchild%2C%20body%3Eh1%3Afirst%2Dchild%2Bh2%2C%20body%3Eh3%3Afirst%2Dchild%2C%20body%3Eh4%3Afirst%2Dchild%2C%20body%3Eh5%3Afirst%2Dchild%2C%20body%3Eh6%3Afirst%2Dchild%20%7B%0Amargin%2Dtop%3A%200%3B%0Apadding%2Dtop%3A%200%3B%0A%7D%0Aa%3Afirst%2Dchild%20h1%2C%20a%3Afirst%2Dchild%20h2%2C%20a%3Afirst%2Dchild%20h3%2C%20a%3Afirst%2Dchild%20h4%2C%20a%3Afirst%2Dchild%20h5%2C%20a%3Afirst%2Dchild%20h6%20%7B%0Amargin%2Dtop%3A%200%3B%0Apadding%2Dtop%3A%200%3B%0A%7D%0Ah1%2Bp%2C%20h2%2Bp%2C%20h3%2Bp%2C%20h4%2Bp%2C%20h5%2Bp%2C%20h6%2Bp%20%7B%0Amargin%2Dtop%3A%2010px%3B%0A%7D%0A%0Aa%20%7B%0Acolor%3A%20%23189%3B%0Atext%2Ddecoration%3A%20none%3B%0A%7D%0Aa%3Ahover%20%7B%0Atext%2Ddecoration%3A%20underline%3B%0A%7D%0A%0Aul%2C%20ol%20%7B%0Apadding%2Dleft%3A%2030px%3B%0A%7D%0Aul%20li%20%3E%20%3Afirst%2Dchild%2C%0Aol%20li%20%3E%20%3Afirst%2Dchild%2C%0Aul%20li%20ul%3Afirst%2Dof%2Dtype%2C%0Aol%20li%20ol%3Afirst%2Dof%2Dtype%2C%0Aul%20li%20ol%3Afirst%2Dof%2Dtype%2C%0Aol%20li%20ul%3Afirst%2Dof%2Dtype%20%7B%0Amargin%2Dtop%3A%200px%3B%0A%7D%0Aul%20ul%2C%20ul%20ol%2C%20ol%20ol%2C%20ol%20ul%20%7B%0Amargin%2Dbottom%3A%200%3B%0A%7D%0Adl%20%7B%0Apadding%3A%200%3B%0A%7D%0Adl%20dt%20%7B%0Afont%2Dsize%3A%2014px%3B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dstyle%3A%20italic%3B%0Apadding%3A%200%3B%0Amargin%3A%2015px%200%205px%3B%0A%7D%0Adl%20dt%3Afirst%2Dchild%20%7B%0Apadding%3A%200%3B%0A%7D%0Adl%20dt%3E%3Afirst%2Dchild%20%7B%0Amargin%2Dtop%3A%200px%3B%0A%7D%0Adl%20dt%3E%3Alast%2Dchild%20%7B%0Amargin%2Dbottom%3A%200px%3B%0A%7D%0Adl%20dd%20%7B%0Amargin%3A%200%200%2015px%3B%0Apadding%3A%200%2015px%3B%0A%7D%0Adl%20dd%3E%3Afirst%2Dchild%20%7B%0Amargin%2Dtop%3A%200px%3B%0A%7D%0Adl%20dd%3E%3Alast%2Dchild%20%7B%0Amargin%2Dbottom%3A%200px%3B%0A%7D%0A%0Apre%2C%20code%2C%20tt%20%7B%0Afont%2Dsize%3A%2012px%3B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Courier%2C%20monospace%3B%0A%7D%0Acode%2C%20tt%20%7B%0Amargin%3A%200%200px%3B%0Apadding%3A%200px%200px%3B%0Awhite%2Dspace%3A%20nowrap%3B%0Aborder%3A%201px%20solid%20%23eaeaea%3B%0Abackground%2Dcolor%3A%20%23f8f8f8%3B%0Aborder%2Dradius%3A%203px%3B%0A%7D%0Apre%3Ecode%20%7B%0Amargin%3A%200%3B%0Apadding%3A%200%3B%0Awhite%2Dspace%3A%20pre%3B%0Aborder%3A%20none%3B%0Abackground%3A%20transparent%3B%0A%7D%0Apre%20%7B%0Abackground%2Dcolor%3A%20%23f8f8f8%3B%0Aborder%3A%201px%20solid%20%23ccc%3B%0Afont%2Dsize%3A%2013px%3B%0Aline%2Dheight%3A%2019px%3B%0Aoverflow%3A%20auto%3B%0Apadding%3A%206px%2010px%3B%0Aborder%2Dradius%3A%203px%3B%0A%7D%0Apre%20code%2C%20pre%20tt%20%7B%0Abackground%2Dcolor%3A%20transparent%3B%0Aborder%3A%20none%3B%0A%7D%0Akbd%20%7B%0A%2Dmoz%2Dborder%2Dbottom%2Dcolors%3A%20none%3B%0A%2Dmoz%2Dborder%2Dleft%2Dcolors%3A%20none%3B%0A%2Dmoz%2Dborder%2Dright%2Dcolors%3A%20none%3B%0A%2Dmoz%2Dborder%2Dtop%2Dcolors%3A%20none%3B%0Abackground%2Dcolor%3A%20%23DDDDDD%3B%0Abackground%2Dimage%3A%20linear%2Dgradient%28%23F1F1F1%2C%20%23DDDDDD%29%3B%0Abackground%2Drepeat%3A%20repeat%2Dx%3B%0Aborder%2Dcolor%3A%20%23DDDDDD%20%23CCCCCC%20%23CCCCCC%20%23DDDDDD%3B%0Aborder%2Dimage%3A%20none%3B%0Aborder%2Dradius%3A%202px%202px%202px%202px%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dwidth%3A%201px%3B%0Afont%2Dfamily%3A%20%22Helvetica%20Neue%22%2CHelvetica%2CArial%2Csans%2Dserif%3B%0Aline%2Dheight%3A%2010px%3B%0Apadding%3A%201px%204px%3B%0A%7D%0A%0Ablockquote%20%7B%0Aborder%2Dleft%3A%204px%20solid%20%23DDD%3B%0Apadding%3A%200%2015px%3B%0Acolor%3A%20%23777%3B%0Afont%2Dsize%3A%201em%3B%0A%7D%0Ablockquote%3E%3Afirst%2Dchild%20%7B%0Amargin%2Dtop%3A%200px%3B%0A%7D%0Ablockquote%3E%3Alast%2Dchild%20%7B%0Amargin%2Dbottom%3A%200px%3B%0A%7D%0A%0Ahr%20%7B%0Aclear%3A%20both%3B%0Amargin%3A%2015px%200%3B%0Aheight%3A%200px%3B%0Aoverflow%3A%20hidden%3B%0Aborder%3A%20none%3B%0Abackground%3A%20transparent%3B%0Aborder%2Dbottom%3A%201px%20dotted%20silver%3B%0Apadding%3A%200%3B%0A%7D%0A%0Atable%20%7B%0Aborder%2Dcollapse%3A%20collapse%3B%0Afont%2Dsize%3A%201em%3B%0A%7D%0Atable%20th%20%7B%0Abackground%3A%20%23F0F0F0%3B%0Acolor%3A%20%23555%3B%0Atext%2Dalign%3A%20left%3B%0Avertical%2Dalign%3A%20middle%3B%0A%7D%0Atable%20th%2C%20table%20td%20%7B%0Aborder%3A%201px%20solid%20%23ccc%3B%0Apadding%3A%206px%2013px%3B%0A%7D%0Atable%20tr%20%7B%0Aborder%2Dtop%3A%201px%20solid%20%23ccc%3B%0Abackground%2Dcolor%3A%20%23fff%3B%0A%7D%0Atable%20tr%3Anth%2Dchild%282n%29%20%7B%0Abackground%2Dcolor%3A%20%23f8f8f8%3B%0A%7D%0A%0Aimg%20%7B%0Amax%2Dwidth%3A%20100%25%0A%7D%0A%2Eplatform%20%7B%0Abackground%3A%20%23cc0000%3B%0Atext%2Dalign%3A%20right%3B%0A%7D%0A" rel="stylesheet" type="text/css" /> 9/* Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff */
10 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 10/* Source: https://github.com/nicolahery/markdownpad-github */
11 <!--[if lt IE 9]> 11
12 <script> 12/* RESET
13 /** 13=============================================================================*/
14 * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 14
15 */ 15html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
16 !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); 16 margin: 0;
17 </script> 17 padding: 0;
18 <![endif]--> 18 border: 0;
19 <link href="data:image/x-icon;base64,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" id="favicon" rel="shortcut icon" type="image/x-icon"> 19}
20
21/* BODY
22=============================================================================*/
23
24body {
25 font-family: Helvetica, arial, freesans, clean, sans-serif;
26 font-size: 14px;
27 line-height: 1.6;
28 color: #333;
29 background-color: #fff;
30 padding: 20px;
31 max-width: 960px;
32 margin: 0 auto;
33}
34
35body>*:first-child {
36 margin-top: 0 !important;
37}
38
39body>*:last-child {
40 margin-bottom: 0 !important;
41}
42
43/* BLOCKS
44=============================================================================*/
45
46p, blockquote, ul, ol, dl, table, pre {
47 margin: 15px 0;
48}
49
50/* HEADERS
51=============================================================================*/
52
53h1, h2, h3, h4, h5, h6 {
54 margin: 20px 0 10px;
55 padding: 0;
56 font-weight: bold;
57 -webkit-font-smoothing: antialiased;
58}
59
60h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
61 font-size: inherit;
62}
63
64h1 {
65 font-size: 28px;
66 color: #000;
67}
68
69h2 {
70 font-size: 24px;
71 border-bottom: 1px solid #ccc;
72 color: #000;
73}
74
75h3 {
76 font-size: 18px;
77}
78
79h4 {
80 font-size: 16px;
81}
82
83h5 {
84 font-size: 14px;
85}
86
87h6 {
88 color: #777;
89 font-size: 14px;
90}
91
92body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
93 margin-top: 0;
94 padding-top: 0;
95}
96
97a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
98 margin-top: 0;
99 padding-top: 0;
100}
101
102h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
103 margin-top: 10px;
104}
105
106/* LINKS
107=============================================================================*/
108
109a {
110 color: #4183C4;
111 text-decoration: none;
112}
113
114a:hover {
115 text-decoration: underline;
116}
117
118/* LISTS
119=============================================================================*/
120
121ul, ol {
122 padding-left: 30px;
123}
124
125ul li > :first-child,
126ol li > :first-child,
127ul li ul:first-of-type,
128ol li ol:first-of-type,
129ul li ol:first-of-type,
130ol li ul:first-of-type {
131 margin-top: 0px;
132}
133
134ul ul, ul ol, ol ol, ol ul {
135 margin-bottom: 0;
136}
137
138dl {
139 padding: 0;
140}
141
142dl dt {
143 font-size: 14px;
144 font-weight: bold;
145 font-style: italic;
146 padding: 0;
147 margin: 15px 0 5px;
148}
149
150dl dt:first-child {
151 padding: 0;
152}
153
154dl dt>:first-child {
155 margin-top: 0px;
156}
157
158dl dt>:last-child {
159 margin-bottom: 0px;
160}
161
162dl dd {
163 margin: 0 0 15px;
164 padding: 0 15px;
165}
166
167dl dd>:first-child {
168 margin-top: 0px;
169}
170
171dl dd>:last-child {
172 margin-bottom: 0px;
173}
174
175/* CODE
176=============================================================================*/
177
178pre, code, tt {
179 font-size: 12px;
180 font-family: Consolas, "Liberation Mono", Courier, monospace;
181}
182
183code, tt {
184 margin: 0 0px;
185 padding: 0px 0px;
186 white-space: nowrap;
187 border: 1px solid #eaeaea;
188 background-color: #f8f8f8;
189 border-radius: 3px;
190}
191
192pre>code {
193 margin: 0;
194 padding: 0;
195 white-space: pre;
196 border: none;
197 background: transparent;
198}
199
200pre {
201 background-color: #f8f8f8;
202 border: 1px solid #ccc;
203 font-size: 13px;
204 line-height: 19px;
205 overflow: auto;
206 padding: 6px 10px;
207 border-radius: 3px;
208}
209
210pre code, pre tt {
211 background-color: transparent;
212 border: none;
213}
214
215kbd {
216 -moz-border-bottom-colors: none;
217 -moz-border-left-colors: none;
218 -moz-border-right-colors: none;
219 -moz-border-top-colors: none;
220 background-color: #DDDDDD;
221 background-image: linear-gradient(#F1F1F1, #DDDDDD);
222 background-repeat: repeat-x;
223 border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
224 border-image: none;
225 border-radius: 2px 2px 2px 2px;
226 border-style: solid;
227 border-width: 1px;
228 font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
229 line-height: 10px;
230 padding: 1px 4px;
231}
232
233/* QUOTES
234=============================================================================*/
235
236blockquote {
237 border-left: 4px solid #DDD;
238 padding: 0 15px;
239 color: #777;
240}
241
242blockquote>:first-child {
243 margin-top: 0px;
244}
245
246blockquote>:last-child {
247 margin-bottom: 0px;
248}
249
250/* HORIZONTAL RULES
251=============================================================================*/
252
253hr {
254 clear: both;
255 margin: 15px 0;
256 height: 0px;
257 overflow: hidden;
258 border: none;
259 background: transparent;
260 border-bottom: 4px solid #ddd;
261 padding: 0;
262}
263
264/* TABLES
265=============================================================================*/
266
267table th {
268 font-weight: bold;
269}
270
271table th, table td {
272 border: 1px solid #ccc;
273 padding: 6px 13px;
274}
275
276table tr {
277 border-top: 1px solid #ccc;
278 background-color: #fff;
279}
280
281table tr:nth-child(2n) {
282 background-color: #f8f8f8;
283}
284
285/* IMAGES
286=============================================================================*/
287
288img {
289 max-width: 100%
290}
291</style>
20</head> 292</head>
21<body> 293<body>
22<header id="tiHeader"> 294<h2>Example Summary</h2>
23 <div class="top"> 295<p>This example introduce the MQTT Client library API and usage, as well as </p>
24 <ul> 296<h2>Peripherals Exercised</h2>
25 <li id="top_logo">
26 <a href="https://www.ti.com">
27 <img src="data:image/png;base64,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" />
28 </a>
29 </li>
30 </ul>
31 </div>
32 <div class="nav">
33 </div>
34</header>
35<div id="content">
36 <h1>Mqtt Client</h1>
37 <h2>Table of Contents</h2>
38<div id="TOC">
39<ul> 297<ul>
40<li><a href="#example-summary">Example Summary</a></li> 298<li>The board LEDs are used for status indication. To distinguish similar indications, the user needs to be aware of the executed procedure. <br />
41<li><a href="#peripherals-exercised">Peripherals Exercised</a></li>
42<li><a href="#example-usage">Example Usage</a></li>
43<li><a href="#application-design-details">Application Design Details</a></li>
44<li><a href="#adding-in-over-the-air-ota-update-functionality-using-the-ota-interface-module">Adding in Over-the-Air (OTA) Update Functionality using the OTA Interface Module</a></li>
45<li><a href="#references">References</a></li>
46</ul>
47</div>
48<h2 id="example-summary">Example Summary</h2>
49<p>This example introduce the MQTT Client library API and usage, as well as</p>
50<h2 id="peripherals-exercised">Peripherals Exercised</h2>
51<ul>
52<li>The board LEDs are used for status indication. To distinguish similar indications, the user needs to be aware of the executed procedure.<br />
53The following table lists all options.</li> 299The following table lists all options.</li>
54</ul> 300</ul>
55<table> 301<table>
@@ -96,18 +342,23 @@ The following table lists all options.</li>
96 <td>Publish message received in cc32xx/ToggleLED3 topic</td> 342 <td>Publish message received in cc32xx/ToggleLED3 topic</td>
97 </tr> 343 </tr>
98</table> 344</table>
99<h2 id="example-usage">Example Usage</h2> 345<h2>Example Usage</h2>
100<ul> 346<ul>
101<li>Access Point (AP) Configuration 347<li>
348<p>Access Point (AP) Configuration</p>
102<ul> 349<ul>
103<li>AP information is set in ‘network_if.h’ file.</li> 350<li>AP information is set in 'network_if.h' file.</li>
104</ul></li> 351</ul>
105<li><p>Remote Broker Configuration</p> 352</li>
353<li>
354<p>Remote Broker Configuration</p>
106<ul> 355<ul>
107<li>Broker parameters can be configured in mqttConnParams parameter which can be found in ‘mqtt_client_app.c’</li> 356<li>Broker parameters can be configured in mqttConnParams parameter which can be found in 'mqtt_client_app.c'</li>
108<li>The broker parameters are: 357<li>
358The broker parameters are:
109<ul> 359<ul>
110<li>Connection types and security options 360<li>
361Connection types and security options
111<ul> 362<ul>
112<li>IPv4 connection</li> 363<li>IPv4 connection</li>
113<li>IPv6 connection</li> 364<li>IPv6 connection</li>
@@ -115,46 +366,67 @@ The following table lists all options.</li>
115<li>Secure connection</li> 366<li>Secure connection</li>
116<li>skip domain name verification in secure connection</li> 367<li>skip domain name verification in secure connection</li>
117<li>skip certificate catalog verification in secure connection</li> 368<li>skip certificate catalog verification in secure connection</li>
118</ul></li> 369</ul>
370</li>
119<li>Server Address: URL or IP</li> 371<li>Server Address: URL or IP</li>
120<li>Port number of MQTT server</li> 372<li>Port number of MQTT server</li>
121<li>Method to tcp secured socket</li> 373<li>Method to tcp secured socket</li>
122<li>Cipher to tcp secured socket</li> 374<li>Cipher to tcp secured socket</li>
123<li>Number of files for secure transfer</li> 375<li>Number of files for secure transfer</li>
124<li>The secure Files</li> 376<li>The secure Files
125</ul></li> 377</li>
126</ul></li> 378</ul>
127<li><p>Secured socket<br /> 379</li>
128In order to activate the secured example, SECURE_MQTT must be defined in ‘mqtt_client_app.c’ file ( certificates should be programmed ).</p></li> 380</ul>
129<li><p>Client Authentication<br /> 381</li>
130In order to activate the Client authentication by the server, the clientID and password must be defined in mqttClientParams located in ‘mqtt_client_app.c’.</p></li> 382<li>
131<li>Topics Configuration 383<p>Secured socket<br />
384In order to activate the secured example, SECURE_MQTT must be defined in 'mqtt_client_app.c' file ( certificates should be programmed ).</p>
385</li>
386<li>
387<p>Client Authentication<br />
388In order to activate the Client authentication by the server, the clientID and password must be defined in mqttClientParams located in 'mqtt<em>client</em>app.c'.</p>
389</li>
390<li>
391<p>Topics Configuration</p>
132<ul> 392<ul>
133<li>The topics can be set by calling MQTT_IF_Subscribe with the appropriate parameters. More details in ‘mqtt_if.h’.</li> 393<li>The topics can be set by calling MQTT<em>IF</em>Subscribe with the appropriate parameters. More details in 'mqtt_if.h'.</li>
134<li>The subscription topics can be set in the <strong>SUBSCRIPTION_TOPICX</strong> definitions</li> 394<li>The subscription topics can be set in the <strong>SUBSCRIPTION_TOPICX</strong> definitions</li>
135<li>The Client is subscribe to the following default topics<br /> 395<li>
136<strong>“Broker/To/cc32xx”</strong><br /> 396The Client is subscribe to the following default topics<br />
137<strong>“cc32xx/ToggleLEDCmdL1”</strong><br /> 397<strong>&quot;Broker/To/cc32xx&quot;</strong><br />
138<strong>“cc32xx/ToggleLEDCmdL2”</strong><br /> 398<strong>&quot;cc32xx/ToggleLEDCmdL1&quot;</strong><br />
139<strong>“cc32xx/ToggleLEDCmdL3”</strong><br /> 399<strong>&quot;cc32xx/ToggleLEDCmdL2&quot;</strong><br />
140<strong>“cc32xx/OTA”</strong> (See details below in the OTA section)<br /> 400<strong>&quot;cc32xx/ToggleLEDCmdL3&quot;</strong><br />
401<strong>&quot;cc32xx/OTA&quot;</strong> (See details below in the OTA section)
402
141</li> 403</li>
142<li>To publish to topics the user can call MQTT_IF_Publish with the appropriate parameters. More details in ‘mqtt_if.h’.</li> 404<li>To publish to topics the user can call MQTT<em>IF</em>Publish with the appropriate parameters. More details in 'mqtt_if.h'.</li>
143<li>The Client publish the following default topic “cc32xx/ToggleLED1” - the topic will be published by pressing SW2 on the board</li> 405<li>The Client publish the following default topic “cc32xx/ToggleLED1” - the topic will be published by pressing SW2 on the board</li>
144</ul></li> 406</ul>
145<li><p>Build the project and flash it by using the Uniflash tool for cc32xx, or equivalently, run debug session on the IDE of your choice.</p></li> 407</li>
146<li><p>Open a serial port session (e.g. ‘HyperTerminal’,‘puTTY’, ‘Tera Term’ etc.) to the appropriate COM port - listed as ‘User UART’.<br /> 408<li>
409<p>Build the project and flash it by using the Uniflash tool for cc32xx, or equivalently, run debug session on the IDE of your choice.</p>
410</li>
411<li>
412<p>Open a serial port session (e.g. 'HyperTerminal','puTTY', 'Tera Term' etc.) to the appropriate COM port - listed as 'User UART'.<br />
147The COM port can be determined via Device Manager in Windows or via <code>ls /dev/tty*</code> in Linux.</p> 413The COM port can be determined via Device Manager in Windows or via <code>ls /dev/tty*</code> in Linux.</p>
148<p>The connection should have the following connection settings:</p> 414<p>The connection should have the following connection settings:</p>
149<pre><code>Baud-rate: 115200 415<pre><code>Baud-rate: 115200
150Data bits: 8 416Data bits: 8
151Stop bits: 1 417Stop bits: 1
152Parity: None 418Parity: None
153Flow Control: None</code></pre></li> 419Flow Control: None
154<li><p>Run the example by pressing the reset button or by running debug session through your IDE.<br /> 420</code></pre>
155<code>Green LED</code> turns ON to indicate the Application initialization is complete</p></li> 421
156<li><p>Once the application has completed it’s initialization and the network processor is up,<br /> 422</li>
157the application banner would be displayed, showing version details:</p> 423<li>
424<p>Run the example by pressing the reset button or by running debug session through your IDE.<br />
425 <code>Green LED</code> turns ON to indicate the Application initialization is complete </p>
426</li>
427<li>
428<p>Once the application has completed it's initialization and the network processor is up,<br />
429 the application banner would be displayed, showing version details:</p>
158<pre><code>============================================ 430<pre><code>============================================
159 [GEN::TRACE] MQTT client Example Ver: 2.0.0 431 [GEN::TRACE] MQTT client Example Ver: 2.0.0
160============================================ 432============================================
@@ -167,123 +439,183 @@ the application banner would be displayed, showing version details:</p>
167 [GEN::TRACE] HOST: 3.0.1.65 439 [GEN::TRACE] HOST: 3.0.1.65
168 [GEN::TRACE] MAC address: 04:a3:16:45:89:8e 440 [GEN::TRACE] MAC address: 04:a3:16:45:89:8e
169 441
170============================================</code></pre></li> 442============================================
171<li>At this point <code>Board_LED0</code> will blink until the device will connect to the hard coded AP. 443</code></pre>
444
445</li>
446<li>
447<p>At this point <code>Board_LED0</code> will blink until the device will connect to the hard coded AP.
448</p>
172<ul> 449<ul>
173<li>In case connection to the hard coded SSID AP fails, user will be requested to fill the SSID of an open AP it wishes to connect to.</li> 450<li>In case connection to the hard coded SSID AP fails, user will be requested to fill the SSID of an open AP it wishes to connect to.</li>
174<li>If no AP is available or connection failed, the example will prompt the user to enter the SSID of an open AP.</li> 451<li>If no AP is available or connection failed, the example will prompt the user to enter the SSID of an open AP.</li>
175<li>Once the connection success all LEDs turn off.</li> 452<li>Once the connection success all LEDs turn off.</li>
176</ul></li> 453</ul>
177<li>Special handling 454</li>
455<li>
456<p>Special handling</p>
178<ul> 457<ul>
179<li>In case the client will disconnect (for any reason) from the remote broker, the MQTT will be restarted.<br /> 458<li>In case the client will disconnect (for any reason) from the remote broker, the MQTT will be restarted. <br />
180The user can change this behavior by removing the mq_send call for APP_MQTT_DEINIT in the MQTT_EVENT_SERVER_DISCONNECT event for the MQTT_EventCallback.</li> 459The user can change this behavior by removing the mq<em>send call for APP</em>MQTT<em>DEINIT in the MQTT<em>EVENT</em>SERVER</em>DISCONNECT event for the MQTT_EventCallback.</li>
181</ul></li>
182</ul> 460</ul>
183<h2 id="application-design-details">Application Design Details</h2> 461</li>
184<p>This is an MQTT Client application used to demonstrate the client side of the MQTT protocol. This application uses our MQTT module (mqtt_if.c) as an abstraction layer to our internal MQTT library to make it easier for developers to use MQTT.</p> 462</ul>
185<p>The application starts by performing all the necessary initializations for the peripherals (e.g. GPIO, SPI, UART and timer). Once that is done the NWP is initialized and the application attempts to connect to an AP using the credentials the user configured in network_if.c.</p> 463<h2>Application Design Details</h2>
186<p>At this point everything is initialized except the MQTT client and the device is connected to an AP. In case the connection to the AP fails, the user will be requested to fill the SSID of an open AP to connect to. Next the application calls ‘MQTT_IF_Init()’ to initialize the MQTT module. By default the module will create an internal thread of stack size 2048 and priority 2. These parameters can be modified by changing mqttInitParams in ‘mqtt_client_app.c’. This thread handles all the events invoked by the internal MQTT library and notifies the user of such events through the MQTT_EventCallback and specific topic callbacks they register when subscribing.</p> 464<p>This is an MQTT Client application used to demonstrate the client side of the MQTT protocol. This application uses our MQTT module (mqtt_if.c) as an abstraction layer to our internal MQTT library to make it easier for developers to use MQTT. </p>
187<p>Then ‘MQTT_IF_Connect’ is called to connect to the broker the user configured in the mqttConnParams structure in ‘mqtt_client_app.c’. Additionally, it will configure the client parameters using the mqttClientParams structure and register the MQTT_EventCallback to the MQTT module. If the ‘MQTT_IF_Connect’ call is successful the user will get a CONNACK event indication over UART to show the client is connected to the MQTT broker.</p> 465<p>The application starts by performing all the necessary initializations for the peripherals (e.g. GPIO, SPI, UART and timer). Once that is done the NWP is initialized and the application attempts to connect to an AP using the credentials the user configured in network_if.c. </p>
188<p>The application proceeds to subscribe to 4 default topics for illustration purposes and registers 4 individual topic callbacks that are defined in ‘mqtt_client_app.c’.</p> 466<p>At this point everything is initialized except the MQTT client and the device is connected to an AP. In case the connection to the AP fails, the user will be requested to fill the SSID of an open AP to connect to. Next the application calls 'MQTT_IF_Init()' to initialize the MQTT module. By default the module will create an internal thread of stack size 2048 and priority 2. These parameters can be modified by changing mqttInitParams in 'mqtt_client_app.c'. This thread handles all the events invoked by the internal MQTT library and notifies the user of such events through the MQTT_EventCallback and specific topic callbacks they register when subscribing. </p>
189<p>Now the client can receive publish messages from the broker. In this example the topics in the left will toggle the LEDs in the right</p> 467<p>Then 'MQTT_IF_Connect' is called to connect to the broker the user configured in the mqttConnParams structure in 'mqtt_client_app.c'. Additionally, it will configure the client parameters using the mqttClientParams structure and register the MQTT_EventCallback to the MQTT module. If the 'MQTT_IF_Connect' call is successful the user will get a CONNACK event indication over UART to show the client is connected to the MQTT broker. </p>
468<p>The application proceeds to subscribe to 4 default topics for illustration purposes and registers 4 individual topic callbacks that are defined in 'mqtt_client_app.c'. </p>
469<p>Now the client can receive publish messages from the broker.
470In this example the topics in the left will toggle the LEDs in the right</p>
190<pre><code> &quot;cc32xx/ToggleLEDCmdL1&quot; &lt;-------------&gt; toggle LED0 471<pre><code> &quot;cc32xx/ToggleLEDCmdL1&quot; &lt;-------------&gt; toggle LED0
191 &quot;cc32xx/ToggleLEDCmdL2&quot; &lt;-------------&gt; toggle LED1 472 &quot;cc32xx/ToggleLEDCmdL2&quot; &lt;-------------&gt; toggle LED1
192 &quot;cc32xx/ToggleLEDCmdL3&quot; &lt;-------------&gt; toggle LED2 </code></pre> 473 &quot;cc32xx/ToggleLEDCmdL3&quot; &lt;-------------&gt; toggle LED2
193<p>The user can invoke more commands by pressing the push buttons on the CC32xx launchpad device:</p> 474</code></pre>
475
476<p>The user can invoke more commands by pressing the push buttons on the CC32xx launchpad device: </p>
194<ul> 477<ul>
195<li><p>When pressing push button 0 - SW2, The device will publish the message that include the topic and data which is hard coded in ‘mqtt_client_app.c’ by invoking ‘MQTT_IF_Publish’ command.</p></li> 478<li>
196<li><p>Push button 1 - SW3 has multiple functionalities. The first time it’s pressed the device will disconnect from the broker and the user will see a MQTT_EVENT_CLIENT_DISCONNECT event from the MQTT_EventCallback. Every time there is a short press on the button it will toggle the connection to the MQTT broker. If the user does a long press the application will de-initialize the MQTT module by destroying the internal MQTT instance as well as freeing any module resources that were allocated.</p></li> 479<p>When pressing push button 0 - SW2, The device will publish the message that include the topic and data which is hard coded in 'mqtt_client_app.c' by invoking 'MQTT_IF_Publish' command.</p>
480</li>
481<li>
482<p>Push button 1 - SW3 has multiple functionalities. The first time it's pressed the device will disconnect from the broker and the user will see a MQTT<em>EVENT</em>CLIENT<em>DISCONNECT event from the MQTT</em>EventCallback. Every time there is a short press on the button it will toggle the connection to the MQTT broker. If the user does a long press the application will de-initialize the MQTT module by destroying the internal MQTT instance as well as freeing any module resources that were allocated. </p>
483</li>
197</ul> 484</ul>
198<h2 id="adding-in-over-the-air-ota-update-functionality-using-the-ota-interface-module">Adding in Over-the-Air (OTA) Update Functionality using the OTA Interface Module</h2> 485<h2>Adding in Over-the-Air (OTA) Update Functionality using the OTA Interface Module</h2>
199<p>Over-the-Air update functionality allows users to update their devices without physically connecting to them.</p> 486<p>Over-the-Air update functionality allows users to update their devices without physically connecting to them. </p>
200<p>The new OTA Interface Module (OTA_IF) simplifies the integration and usage of OTA in any application. The usage of OTA_IF which is demonstrated as an add-on within the MQTT Client application replaces the previous Local and Cloud OTA examples. Note: The OTA capability is disabled by default. Please enable the required method in the app’s “ota_settings.h”.</p> 487<p>The new OTA Interface Module (OTA<em>IF) simplifies the integration and usage of OTA in any application.
201<h3 id="what-is-ota_if">What is OTA_IF</h3> 488The usage of OTA</em>IF which is demonstrated as an add-on within the MQTT Client application replaces the previous Local and Cloud OTA examples.
202<p>The OTA_IF is a wrapper on top of the legacy “ota.a” lib. The OTA_IF module is available as part of the mqtt_client application (see under ifmod/).</p> 489This readme assumes you are familiar with the following documents:<br>
490* <a href="https://www.ti.com/lit/pdf/swra510">&quot;Over-The-Air Application Report&quot;</a> - explaining cloud OTA<br>
491* <a href="https://dev.ti.com/tirex/explore/node?a=fc2e6sr__5.20.00.06&amp;node=AHQEITy7hJ3KKFnYBLkIag__fc2e6sr__5.20.00.06">Local OTA README from SDK 5.20 or earlier</a> - explaining local OTA <br>
492* <a href="https://dev.ti.com/tirex/explore/node?node=ACE5ggZRybEJNZUcnzc3ww__fc2e6sr__LATEST">SimpleLink Academy</a> - OTA Training <br></p>
493<p>Note: The OTA capability is disabled by default. Please enable the required method in the app's &quot;ota_settings.h&quot; (see &quot;Enable The OTA_IF&quot; section below). To enable the launchpad's button to trigger the primary OTA method also set OTA_DEFAULT_METHOD (see in mqtt_client_app.c&quot;) to the required trigger.</p>
494<h3>What is OTA_IF</h3>
495<p>The OTA_IF is a wrapper on top of the legacy &quot;ota.a&quot; lib. The OTA<em>IF module is available as part of the mqtt</em>client application (see under ifmod/). </p>
203<p>The OTA_IF was planned to ease the integration of OTA to any existing application. It is designed for RTOS environment only (non RTOS users will use the OTA library as before). The OTA_IF presents a simple interface for the main application to poll, download and install an OTA update (see API in ifmod/ota_if.h).</p> 496<p>The OTA_IF was planned to ease the integration of OTA to any existing application. It is designed for RTOS environment only (non RTOS users will use the OTA library as before). The OTA_IF presents a simple interface for the main application to poll, download and install an OTA update (see API in ifmod/ota_if.h).</p>
204<p>The OTA_IF currently supports 4 use cases:</p> 497<p>The OTA_IF currently supports 4 use cases:</p>
205<ol> 498<ol>
206<li><p>Cloud OTA - Download from an CDN server (such as Github or Dropbox). This use case starts by connecting to the CDN server to get a download link (file server’s URL). Once the link is received, the download of the OTA (tar) image will be started automatically by sending HTTP Get Request to the file server. This method supports up to 2 callbacks to 2 different servers (primary and backup) <br>API: <strong>OTA_IF_downloadImageByCloudVendor()</strong> (see ifmod/ota_if.h)<br>Enabled With: <strong>CLOUD_OTA_SUPPORT</strong> (see ota_settings.h)<br></p></li> 499<li>
207<li><p>Download from File Server - in this case the user will get the URL of the OTA (tar) image using other method and directly download the file (using HTTP Get Request).<br>API: <strong>OTA_IF_downloadImageByFileURL()</strong> (see ifmod/ota_if.h)<br>Enabled With: <strong>CLOUD_OTA_SUPPORT</strong> (see ota_settings.h)</p></li> 500<p>Cloud OTA - Download from an CDN server (such as Github or Dropbox). This use case starts by connecting to the CDN server to get a download link (file server's URL). Once the link is received, the download of the OTA (tar) image will be started automatically by sending HTTP Get Request to the file server. This method supports up to 2 callbacks to 2 different servers (primary and backup) <br>API: <strong>OTA_IF_downloadImageByCloudVendor()</strong> (see ifmod/ota_if.h)<br>Enabled With: <strong>CLOUD_OTA_SUPPORT</strong> (see ota_settings.h)<br></p>
208<li><p>Local OTA - using the SimpleLink internal HTTP server to enable connection from a PC or a mobile device connected to the same local network. The PC/Mobile device will send the OTA (tar) image in a HTTP Post request.<br>API: <strong>OTA_IF_uploadImage()</strong> (see ifmod/ota_if.h)<br>Enabled With: <strong>LOCAL_OTA_SUPPORT</strong> (see ota_settings.h)</p></li> 501</li>
209<li><p>Internal Update - in this case the update starts when the OTA (tar) image is already located in the SimpleLink file-system. The OTA_IF will be used to read the image and install the content.<br>API: <strong>OTA_IF_readImage()</strong> (see ifmod/ota_if.h)<br>Enabled With: <strong>INTERNAL_UPDATE_SUPPORT</strong> (see ota_settings.h)</p></li> 502<li>
503<p>Download from File Server - in this case the user will get the URL of the OTA (tar) image using other method and directly download the file (using HTTP Get Request).<br>API: <strong>OTA_IF_downloadImageByFileURL()</strong> (see ifmod/ota_if.h)<br>Enabled With: <strong>CLOUD_OTA_SUPPORT</strong> (see ota_settings.h)</p>
504</li>
505<li>
506<p>Local OTA - using the SimpleLink internal HTTP server to enable connection from a PC or a mobile device connected to the same local network. The PC/Mobile device will send the OTA (tar) image in a HTTP Post request.<br>API: <strong>OTA_IF_uploadImage()</strong> (see ifmod/ota_if.h)<br>Enabled With: <strong>LOCAL_OTA_SUPPORT</strong> (see ota_settings.h)</p>
507</li>
508<li>
509<p>Internal Update - in this case the update starts when the OTA (tar) image is already located in the SimpleLink file-system. The OTA_IF will be used to read the image and install the content.<br>API: <strong>OTA_IF_readImage()</strong> (see ifmod/ota_if.h)<br>Enabled With: <strong>INTERNAL_UPDATE_SUPPORT</strong> (see ota_settings.h)</p>
510</li>
210</ol> 511</ol>
211<p>Combination of the above methods are allowed, e.g. using Local OTA as backup method in case the Cloud OTA fails.</p> 512<p>Combination of the above methods are allowed, e.g. using Local OTA as backup method in case the Cloud OTA fails.</p>
212<p>The OTA_IF uses a dedicate thread context to load the image and process its content (i.e. write the separate files to the file system). It will report the completion of the loading process (<strong>OTA_NOTIF_IMAGE_DOWNLOADED</strong>) in the user registered callback (registred in <strong>OTA_IF_init()</strong>). Other async indications such as errors or PENDING_COMMIT state will also be reported through this callback. The full list of events can be found in “ota_if.h” (see otaNotif_e).</p> 513<p>The OTA_IF uses a dedicate thread context to load the image and process its content (i.e. write the separate files to the file system). It will report the completion of the loading process (<strong>OTA_NOTIF_IMAGE_DOWNLOADED</strong>) in the user registered callback (registred in <strong>OTA_IF_init()</strong>). Other async indications such as errors or PENDING<em>COMMIT state will also be reported through this callback. The full list of events can be found in &quot;ota</em>if.h&quot; (see otaNotif_e).</p>
213<p>During the download process, the device can be operational (the OTA will run in the background). Once the <strong>OTA_NOTIF_IMAGE_DOWNLOADED</strong> indication is received, the user can choose when to call <strong>OTA_IF_install()</strong> to reset the MCU and enable the new update.</p> 514<p>During the download process, the device can be operational (the OTA will run in the background). Once the <strong>OTA_NOTIF_IMAGE_DOWNLOADED</strong> indication is received, the user can choose when to call <strong>OTA_IF_install()</strong> to reset the MCU and enable the new update.</p>
214<p>Calling the <strong>OTA_IF_init</strong> should be called as part of the boot sequence. It will allocate resources needed for the OTA and will check if the image is pending commit. In case of receiving the <strong>OTA_NOTIF_IMAGE_PENDING_COMMIT</strong>, the <strong>OTA_IF_commit()</strong> must be called when the new image is verified.</p> 515<p>Calling the <strong>OTA_IF_init</strong> should be called as part of the boot sequence. It will allocate resources needed for the OTA and will check if the image is pending commit. In case of receiving the <strong>OTA_NOTIF_IMAGE_PENDING_COMMIT</strong>, the <strong>OTA_IF_commit()</strong> must be called when the new image is verified.</p>
215<p>The OTA_IF still requires the legacy OTA library (<strong>“ota.a”</strong>). The OTA library should be built as “<strong>OTA_FILE_DOWNLOAD</strong>” (in otauser.h). This means that all the Cloud Vendor code will be compiled out and that all the other settings of “otauser.h” will be ignored (See “Configure user accounts” for details about the new configuration method). The cloud OTA implementation requires the SDK’s HTTP Client and JSON libraries.</p> 516<p>The OTA_IF still requires the legacy OTA library (<strong>&quot;ota.a&quot;</strong>). The OTA library should be built as &quot;<strong>OTA_FILE_DOWNLOAD</strong>&quot; (in otauser.h). This means that all the Cloud Vendor code will be compiled out and that all the other settings of &quot;otauser.h&quot; will be ignored (See &quot;Configure user accounts&quot; for details about the new configuration method). The cloud OTA implementation requires the SDK's HTTP Client and JSON libraries.</p>
216<p>The OTA_IF in fact is a component which is composed of the following files: <br></p> 517<p>The OTA_IF in fact is a component which is composed of the following files: <br>
217<ul> 518* ota_if.h - simplified OTA API definition<br>
218<li>ota_if.h - simplified OTA API definition<br></li> 519* ota_if.c - the new OTA engine (see &quot;How it works&quot; for more details)<br>
219<li>ota_if.c - the new OTA engine (see “How it works” for more details)<br></li> 520* ota_vendors.h - API for the <em>getDownloadLink()</em> callbacks, currently GITHUB and DROPBOX are supported. See &quot;How to support another server&quot; for more details.<br>
220<li>ota_vendors.h - API for the <em>getDownloadLink()</em> callbacks, currently GITHUB and DROPBOX are supported. See “How to support another server” for more details.<br></li> 521* ota_vendor_github.c - <em>getDoanloadLink()</em> implementation for GITHUB<br>
221<li>ota_vendor_github.c - <em>getDoanloadLink()</em> implementation for GITHUB<br></li> 522* ota_vendor_dropbox.c - <em>getDoanloadLink()</em> implementation for DROPBOX<br></p>
222<li>ota_vendor_dropbox.c - <em>getDoanloadLink()</em> implementation for DROPBOX<br></li>
223</ul>
224<hr /> 523<hr />
225<pre><code>IMPORTANT NOTE: The GITHUB and DROPBOX code is just an example. TI is not responsible for 524<pre><code>IMPORTANT NOTE: The GITHUB and DROPBOX code is just an example. TI is not responsible for
226changes of the OTA vendor API or certificates that may impact the access to the cloud servers. 525changes of the OTA vendor API or certificates that may impact the access to the cloud servers.
227When planning to use these servers, TI recommends using an altenrate method that can be 526When planning to use these servers, TI recommends using an altenrate method that can be
228activated in case of issues (this can be a using second OTA vendor and/or local OTA).</code></pre> 527activated in case of issues (this can be a using second OTA vendor and/or local OTA).
528</code></pre>
529
229<hr /> 530<hr />
230<h3 id="the-ifmod-folder">The ifmod/ folder</h3> 531<h3>The &quot;ifmod/&quot; folder</h3>
231<p>The “ifmod” folder contains all the “interface modules” required by the main application. Those are close modules that a user typically won’t need to change that are meant to simplify the use and the integration of common feature (e.g. provisioning through the WIFI_IF, OTA update through the OTA_IF, MQTT connection through the MQTT_IF etc).</p> 532<p>The &quot;ifmod&quot; folder contains all the &quot;interface modules&quot; required by the main application. Those are close modules that a user typically won't need to change that are meant to simplify the use and the integration of common feature (e.g. provisioning through the WIFI_IF, OTA update through the OTA_IF, MQTT connection through the MQTT_IF etc). </p>
232<p>The folder contains all the code required for the OTA functionality.</p> 533<p>The folder contains all the code required for the OTA functionality.</p>
233<p>In additions, the “ifmod/” contains other interface modules that are used by the MQTT example: WIFI_IF, MQTT_IF, UART_IF and UTILS_IF. Those are general interfaces that are not related to the OTA functionality directly. If the entire “ifmod” folder is copied to a new project, any unused module may be excluded from the build (or you can trust the linker to do the work (dead code will typically be removed by the linker).</p> 534<p>In additions, the &quot;ifmod/&quot; contains other interface modules that are used by the MQTT example: WIFI_IF, MQTT_IF, UART_IF and UTILS_IF. Those are general interfaces that are not related to the OTA functionality directly.
234<h3 id="enable-the-ota_if">Enable the OTA_IF</h3> 535If the entire &quot;ifmod&quot; folder is copied to a new project, any unused module may be excluded from the build (or you can trust the linker to do the work (dead code will typically be removed by the linker).</p>
235<p>The following are instructions for including OTA in any example:</p> 536<h3>Enable the OTA_IF in the mqtt_client example</h3>
537<p>The following are instructions for quickly enabling the OTA in the mqtt_client example (OTA is disabled by default):<br>
5381. In &quot;ota_settings.h&quot;, enable one or more of the OTA methods by setting the following values to &quot;1&quot;:<br>
539 <code>#define CLOUD_OTA_SUPPORT (0)</code> <br>
540 <code>#define LOCAL_OTA_SUPPORT (0)</code> <br>
541 <code>#define INTERNAL_UPDATE_SUPPORT (0)</code> <br>
542See more details in &quot;Configure user accounts&quot;.<br><br>
5432. For cloud OTA, enable the example user parameters (example repository), by un-commenting the following line in &quot;ota_settings.h&quot;:<br>
544 <code>//#define USE_TI_EXAMPLE</code> <br><br>
5453. In &quot;mqtt_client_app.c&quot; un-comment one of the following:<br>
546 <code>//#define OTA_DEFAULT_METHOD StartCloudOTA</code><br>
547 <code>//#define OTA_DEFAULT_METHOD StartLocalOTA</code><br>
548 <code>//#define OTA_DEFAULT_METHOD StartInternalUpdate</code><br>
549This will set the default method that will get triggered when pressing the left button (one the device is connected). This should correspond to the enabled OTA methods in &quot;ota_settings.h&quot;.</p>
550<h3>Enable the OTA_IF</h3>
551<p>The following are instructions for including OTA in an existing example:</p>
236<ol> 552<ol>
237<li><p>Add the following SDK’s libraries to the project linker’s files:<br> 1.1 For all uses cases: “ota.a” (under <SDK\>/ti/net/ota/) <br> 1.2 When using cloud ota use case, add: “json_[release|debug].a” (under <SDK\>/ti/utils/json/) and “httpclient_[release|debug].a” (under <SDK\>/ti/net/http/) <br></p></li> 553<li>
238<li>Copy the entire “ifmod/” folder from the mqtt_client example to target project.</li> 554<p>Add the following SDK's libraries to the project linker's files:<br>
239<li>Copy the ota_settings.h to the target application and update it (see “Configure user accounts”)<br /> 5551.1 For all uses cases: &quot;ota.a&quot; (under &lt;SDK&gt;/ti/net/ota/) and &quot;json_[release|debug].a&quot; (under &lt;SDK&gt;/ti/utils/json/)<br>
5561.2 When using cloud ota use case, add: &quot;httpclient_[release|debug].a&quot; (under &lt;SDK&gt;/ti/net/http/http_lib_for_OTA/) - this library is the same as the original httpclient but uses a larger internal buffer (HTTPClient_BUF_LEN is set to 512 due to the Dropbox server's requirements for large HTTP header) <br></p>
240</li> 557</li>
241<li>Copy user files and use them (or modification) when creating the flash image: 558<li>
559<p>Copy the entire &quot;ifmod/&quot; folder from the mqtt_client example to target project.</p>
560</li>
561<li>Copy the ota_settings.h to the target application, enable OTA (it is disabled by default) and update user configuration (see &quot;Configure user accounts&quot;)
562</li>
563<li>
564Copy user files and use them (or modification) when creating the flash image:
242<ul> 565<ul>
243<li>www/ - contain files (html, js, css,etc) need by the HTTP Server for Local OTA</li> 566<li>www/ - contain files (html, js, css,etc) need by the HTTP Server for Local OTA</li>
244<li>RootCACerts.pem and digicert_high_assurance_ca.der are required for the connecting to GITHUB and DROPBOX as part of the cloud OTA</li> 567<li>RootCACerts.pem and digicert<em>high</em>assurance_ca.der are required for the connecting to GITHUB and DROPBOX as part of the cloud OTA</li>
245</ul></li> 568</ul>
569</li>
246</ol> 570</ol>
247<h3 id="configure-user-accounts">Configure user accounts</h3> 571<h3>Configure user accounts</h3>
248<p>“ota_settings.h” is a new header in the application that holds the user settings (enabling/disabling of OTA methods and OTA vendors as well as user’s account parameter). The configuration is for the application only. The library does not require a re-build when user’s account get changed (as long as the library is configured to OTA_FILE_DOWNLOAD.</p> 572<p>&quot;ota_settings.h&quot; is a new header in the application that holds the user settings (enabling/disabling of OTA methods and OTA vendors as well as user's account parameter). The configuration is for the application only. The library does not require a re-build when user's account get changed (as long as the library is configured to OTA_FILE_DOWNLOAD.</p>
249<p>Several methods (CLOUD_OTA_SUPPORT, LOCAL_OTA_SUPPORT and\or INTERNAL_UPDATE_SUPPORT) can be enabled together. Note: by default all the methods are disabled. User must enable at least one method to enable the OTA_IF API.</p> 573<p>Several methods (CLOUD_OTA_SUPPORT, LOCAL_OTA_SUPPORT and\or INTERNAL_UPDATE_SUPPORT) can be enabled together. Note: by default all the methods are disabled. User must enable at least one method to enable the OTA_IF API.</p>
250<p>Several cloud vendors (such as OTA_VENDOR_GITHUB_SUPPORT and OTA_VENDOR_DROPBOX_SUPPORT) can also be configured together.</p> 574<p>Several cloud vendors (such as OTA_VENDOR_GITHUB_SUPPORT and OTA_VENDOR_DROPBOX_SUPPORT) can also be configured together.</p>
251<p><strong>NOTE 1:</strong> Servers’ certificates are not defined here but in the ota_vendor_…c implementation. The required certificates for GITHUB and DROPBOX are provided with the example (as user files for the image.syscfg). The certificates must be installed in the file system before trying to connect to the cloud vendors.</p> 575<p><strong>NOTE 1:</strong> Servers' certificates are not defined here but in the ota_vendor_...c implementation. The required certificates for GITHUB and DROPBOX are provided with the example (as user files for the image.syscfg). The certificates must be installed in the file system before trying to connect to the cloud vendors.</p>
252<p><strong>NOTE 2:</strong> Since both Dropbox and Github are about to replace their certificate soon (fall 2021), the current code support both the legacy certificate (digicert high assurance ev root ca) and new certificate (digicert global root ca). For CC3230/5 it is done using pem file that contains both root certificates. This will work on the first attempt as the NWP can choose the right certificate from the file. For CC3220, only the first certificate of the PEM file is being used (the new certificate). In case the connection will fail (i.e. until the certificate change at the server side), the module will print the error message but will automatically tries the legacy certificate (provided as as separate der file). This behavior is implemented in the OTA Vendor specific code (ota_vendor_github.c and ota_vendor_dropbox.c).</p> 576<p><strong>NOTE 2:</strong> Since both Dropbox and Github are about to replace their certificate soon (fall 2021), the current code support both the legacy certificate (digicert high assurance ev root ca) and new certificate (digicert global root ca). For CC3230/5 it is done using pem file that contains both root certificates. This will work on the first attempt as the NWP can choose the right certificate from the file. For CC3220, only the first certificate of the PEM file is being used (the new certificate). In case the connection will fail (i.e. until the certificate change at the server side), the module will print the error message but will automatically tries the legacy certificate (provided as as separate der file). This behavior is implemented in the OTA Vendor specific code (ota_vendor_github.c and ota_vendor_dropbox.c).
253<h4 id="dropbox-parameters">DROPBOX parameters</h4> 577</p>
254<p>DROPBOX_USER_TOKEN - Dropbox Application identifier. Only “No-Expiration” tokens are currently supported.<br> DROPBOX_USER_PATH - relative path to the folder (within the Dropbox application) that contains the OTA (tar) files.<br></p> 578<h4>DROPBOX parameters</h4>
255<h4 id="github-parameters">GITHUB parameters</h4> 579<p><strong>DROPBOX_USER_TOKEN</strong> - Dropbox Application identifier. Only &quot;No-Expiration&quot; tokens are currently supported.<br>
256<p>GITHUB_USER_NAME - GitHub user account name.<br> GITHUB_USER_TOKEN - GitHub security token per user<br> GITHUB_USER_REPO - GitHub repository name<br> GITHUB_USER_PATH - relative path to the folder (within the GitHub repository) that contains the OTA (tar) files. <br></p> 580<strong>DROPBOX_USER_PATH</strong> - relative path to the folder (within the Dropbox application) that contains the OTA (tar) files.<br></p>
257<h3 id="support-different-cloud-vendor">Support different Cloud Vendor</h3> 581<h4>GITHUB parameters</h4>
258<p>For cloud OTA TI provides 2 examples of cloud vendors: GITHUB and DROPBOX (implemented in ota_vendor_github.c and ota_vendor_dropbox.c). Both examples implement the following callback:<br> int16_t (<em>getDownloadLink)(FileServerParams_t </em>pServerParams)</p> 582<p><strong>GITHUB_USER_NAME</strong> - GitHub user account name.<br>
259<p>The callback doesn’t get any input, but is based on the configuration in “ota_settings.h” to connect to the user account on the specific OTA server. The callback return status code (0 upon success) and a link (URL) to a file server to download the OTA (tar) file (see the output structure: pServerParams). If all goes well, the OTA_IF will download the tar file and continue to install the files.</p> 583<strong>GITHUB_USER_REPO</strong> - GitHub repository name<br>
260<p>If a user needs to connect to another server (i.e. not GITHUB or DROPBOX) - it may refer to the 2 examples and update them as needed (as well as the ota_vendors.h file). By doing so he will be able to use the <em>OTA_IF_downloadImageByCloudVendor()</em>, e.g:<br></p> 584<strong>GITHUB_USER_PATH</strong> - relative path to the folder (within the GitHub repository) that contains the OTA (tar) files. <br>
585<strong>GITHUB_USER_TOKEN_B64</strong> - GitHub Personal Access Token (defined per user) - converted to base64.<Br>
586<strong>Note</strong>: The Personal Access Token must be converted to base64 format. To generate the base64 format, use the following bash command (any other base64 converter is acceptable):
587** &quot;<em>echo &lt;personal-access-token&gt; | base64<em>&quot;</em></em> <br>
588e.g.: &quot;<em>echo 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 | base64</em>&quot;<br>
589<strong>Important</strong>: make sure the token is defined with no &quot;No Expiration&quot; and that it enables read-only access (no &quot;scope&quot; should be enabled). If needed enable a second Personal Access with write-access. The reason is that the token can be retrieved from the image.</p>
590<h3>Support different Cloud Vendor</h3>
591<p>For cloud OTA TI provides 2 examples of cloud vendors: GITHUB and DROPBOX (implemented in ota_vendor_github.c and ota_vendor_dropbox.c).
592Both examples implement the following callback:<br>
593int16_t (*getDownloadLink)(FileServerParams_t *pServerParams)</p>
594<p>The callback doesn't get any input, but is based on the configuration in &quot;ota_settings.h&quot; to connect to the user account on the specific OTA server. The callback return status code (0 upon success) and a link (URL) to a file server to download the OTA (tar) file (see the output structure: pServerParams).
595If all goes well, the OTA_IF will download the tar file and continue to install the files.</p>
596<p>If a user needs to connect to another server (i.e. not GITHUB or DROPBOX) - it may refer to the 2 examples and update them as needed (as well as the ota_vendors.h file).
597By doing so he will be able to use the <em>OTA_IF_downloadImageByCloudVendor()</em>, e.g:<br></p>
261<pre><code>OTA_IF_downloadImageByCloudVendor(OTA_NEWSERVER_getDownloadLink, OTA_GITHUB_getDownloadLink, 0); 598<pre><code>OTA_IF_downloadImageByCloudVendor(OTA_NEWSERVER_getDownloadLink, OTA_GITHUB_getDownloadLink, 0);
262// i.e. Try the new server as first and use GITHUB as a backup server</code></pre> 599// i.e. Try the new server as first and use GITHUB as a backup server
263<p>A user can get the Download link in any other way and simply use <code>OTA_IF_downloadImageByFileURL(FileServerParams_t *pFileServerParams, uint32_t flags)</code> with the required download URL.</p> 600</code></pre>
264<h3 id="ota-in-the-mqtt-client-application">OTA in the MQTT Client Application</h3> 601
265<p>Note: The OTA capability is disabled by default. Please enable the required method(s) in the app’s “ota_settings.h”.</p> 602<p>A user can get the Download link in any other way and simply use <code>OTA_IF_downloadImageByFileURL(FileServerParams_t *pFileServerParams, uint32_t flags)</code> with the required download URL. </p>
603<h3>OTA in the MQTT Client Application</h3>
604<p>Note: The OTA capability is disabled by default. Please enable the required method(s) in the app's &quot;ota_settings.h&quot;.</p>
266<p>The OTA interface module creates a separate thread used for polling CDN servers, downloading and extracting new updates, and lastly installing them. The OTA_IF API exposes functions that schedule tasks for this thread. After each task completes, a registered callback function is called.</p> 605<p>The OTA interface module creates a separate thread used for polling CDN servers, downloading and extracting new updates, and lastly installing them. The OTA_IF API exposes functions that schedule tasks for this thread. After each task completes, a registered callback function is called.</p>
267<p>In mqtt_client_app.c, navigate to mainThread. Find the call to OTA_IF_init(). This function creates the OTA thread that will be running in the background and used to perform operations for the OTA process. Notice how it registers the callback function OtaCallback. Next, scroll down to the MQTT_IF_SUBSCRIBE calls. There is one new hooks here (see the “cc32xx/OTA” topic registration with the StartOTA() callback). According to the MQTT payload an external MQTT user can set the required method to be enabled (“cloud”, “local” or “internal” - see in StartOta()).</p> 606<p>In mqtt_client_app.c, navigate to mainThread. Find the call to OTA_IF_init(). This function creates the OTA thread that will be running in the background and used to perform operations for the OTA process. Notice how it registers the callback function OtaCallback. Next, scroll down to the MQTT_IF_SUBSCRIBE calls. There is one new hooks here (see the &quot;cc32xx/OTA&quot; topic registration with the StartOTA() callback). According to the MQTT payload an external MQTT user can set the required method to be enabled (&quot;cloud&quot;, &quot;local&quot; or &quot;internal&quot; - see in StartOta()).</p>
268<p>Additional method for triggering the OTA is through the “publish” button (button 0 / SW2) on the launchpad. In addition to publishing an MQTT message, the handler will also trigger the StartOTA() where a default OTA method will be used (by default no method is defined. The OTA_DEFAULT_METHOD macro (see in “mqtt_client_app.c”) needs to be set to one of: StartCloudOTA / StartLocalOTA / StartInternalUpdate.</p> 607<p>Additional method for triggering the OTA is through the &quot;publish&quot; button (button 0 / SW2) on the launchpad. In addition to publishing an MQTT message, the handler will also trigger the StartOTA() where a default OTA method will be used (by default no method is defined. The OTA_DEFAULT_METHOD macro (see in &quot;mqtt_client_app.c&quot;) needs to be set to one of: StartCloudOTA / StartLocalOTA / StartInternalUpdate. </p>
269<p>Next, navigate to StartCloudOta, which calls OTA_IF_downloadImageByCloudVendor. This function makes calls to two different vendor functions. These functions can be replaced with any user-created function, as long as they follow the same function prototype and return behavior. If you open ota_vendor_dropbox.c or ota_vendor_github.c, you will see the implementation for these example vendor functions. StartLocalOta calls OTA_IF_uploadImage, which sets up the HTTP server and prepares to receive a .tar file. You can add extra security parameters here.</p> 608<p>Note: The Internal Update requires having a tar file in the file system (by default under &quot;OtaImages/&quot; folder - see the StartInternalUpdate() in &quot;mqtt_client_app.c&quot;). A pre-built example tar files can be found in the project directory in the SDK under userFiles). </p>
609<p>Next, navigate to StartCloudOta, which calls OTA_IF_downloadImageByCloudVendor. This function makes calls to two different vendor functions. These functions can be replaced with any user-created function, as long as they follow the same function prototype and return behavior. If you open ota_vendor_dropbox.c or ota_vendor_github.c, you will see the implementation for these example vendor functions. StartLocalOta calls OTA<em>IF</em>uploadImage, which sets up the HTTP server and prepares to receive a .tar file. You can add extra security parameters here.</p>
270<p>Next, navigate to OtaCallback. This is the callback function that is called for OTA messages. OTA_NOTIF_IMAGE_DOWNLOADED is received when the image has finished downloading, and when this occurs, the function tells the main thread to DEINIT MQTT and prepare to install the new update and restart the device. In mainThread, this queued message causes the code to break out of the infinite while loop, de-initialize MQTT, and install the new OTA image. This will also reset the MCU.</p> 610<p>Next, navigate to OtaCallback. This is the callback function that is called for OTA messages. OTA_NOTIF_IMAGE_DOWNLOADED is received when the image has finished downloading, and when this occurs, the function tells the main thread to DEINIT MQTT and prepare to install the new update and restart the device. In mainThread, this queued message causes the code to break out of the infinite while loop, de-initialize MQTT, and install the new OTA image. This will also reset the MCU.</p>
271<p>After the MCU resets, the image needs to be committed. In OtaCallback, OTA_NOTIF_IMAGE_PENDING_COMMIT is received. After ensuring the device is properly connected to the internet, OTA_IF_commit is called, and the new image is committed successfully.</p> 611<p>After the MCU resets, the image needs to be committed. In OtaCallback, OTA_NOTIF_IMAGE_PENDING_COMMIT is received. After ensuring the device is properly connected to the internet, OTA_IF_commit is called, and the new image is committed successfully.</p>
272<h2 id="references">References</h2> 612<h2>References</h2>
273<p><a href="http://mqtt.org/documentation">MQTT Org - MQTT Home page</a><br /> 613<p><a href="http://mqtt.org/documentation">MQTT Org - MQTT Home page</a><br />
274<a href="http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html">MQTT v3.1.1 specification</a><br /> 614<a href="http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html">MQTT v3.1.1 specification</a><br />
275<a href="http://www.ibm.com/developerworks/webservices/library/ws-mqtt/index.html">MQTT v3.1 specification</a></p> 615<a href="http://www.ibm.com/developerworks/webservices/library/ws-mqtt/index.html">MQTT v3.1 specification</a>
276<p>For further information please refer to the user programmers guide: <a href="http://www.ti.com/lit/swru455">CC3X20 Programmer’s Guide</a></p> 616</p>
277<!-- Close div from before_body_template.html --> 617<p>For further information please refer to the user programmers guide: <a href="http://www.ti.com/lit/swru455">CC3X20 Programmer's Guide</a></p>
278</div> 618
279<footer id="tiFooter">
280 <p>TI is a global semiconductor design and manufacturing company. Innovate
281 with 100,000+ analog ICs and embedded processors, along with software, tools
282 and the industry‘s largest sales/support staff.</p>
283 <p>
284 <a href="https://www.ti.com/corp/docs/legal/copyright.shtml">© Copyright 1995-2021</a>, Texas Instruments Incorporated. All rights reserved. <br>
285 <a href="https://www.ti.com/corp/docs/legal/trademark/trademrk.htm">Trademarks</a> | <a href="https://www.ti.com/corp/docs/legal/privacy.shtml">Privacy policy</a> | <a href="https://www.ti.com/corp/docs/legal/termsofuse.shtml">Terms of use</a> | <a href="https://www.ti.com/lsds/ti/legal/termsofsale.page">Terms of sale</a>
286 </p>
287</footer>
288</body> 619</body>
289</html> 620</html>
621<!-- This document was created with MarkdownPad, the Markdown editor for Windows (http://markdownpad.com) -->
diff --git a/mqtt_client_w_ota/src/README.md b/mqtt_client_w_ota/src/README.md
index 01af26c..d026a36 100644
--- a/mqtt_client_w_ota/src/README.md
+++ b/mqtt_client_w_ota/src/README.md
@@ -167,7 +167,7 @@ Over-the-Air update functionality allows users to update their devices without p
167 167
168The new OTA Interface Module (OTA_IF) simplifies the integration and usage of OTA in any application. 168The new OTA Interface Module (OTA_IF) simplifies the integration and usage of OTA in any application.
169The usage of OTA_IF which is demonstrated as an add-on within the MQTT Client application replaces the previous Local and Cloud OTA examples. 169The usage of OTA_IF which is demonstrated as an add-on within the MQTT Client application replaces the previous Local and Cloud OTA examples.
170This readme assumes you are mailiar with the following documents:<br> 170This readme assumes you are familiar with the following documents:<br>
171* ["Over-The-Air Application Report"](https://www.ti.com/lit/pdf/swra510) - explaining cloud OTA<br> 171* ["Over-The-Air Application Report"](https://www.ti.com/lit/pdf/swra510) - explaining cloud OTA<br>
172* [Local OTA README from SDK 5.20 or earlier](https://dev.ti.com/tirex/explore/node?a=fc2e6sr__5.20.00.06&node=AHQEITy7hJ3KKFnYBLkIag__fc2e6sr__5.20.00.06) - explaining local OTA <br> 172* [Local OTA README from SDK 5.20 or earlier](https://dev.ti.com/tirex/explore/node?a=fc2e6sr__5.20.00.06&node=AHQEITy7hJ3KKFnYBLkIag__fc2e6sr__5.20.00.06) - explaining local OTA <br>
173* [SimpleLink Academy](https://dev.ti.com/tirex/explore/node?node=ACE5ggZRybEJNZUcnzc3ww__fc2e6sr__LATEST) - OTA Training <br> 173* [SimpleLink Academy](https://dev.ti.com/tirex/explore/node?node=ACE5ggZRybEJNZUcnzc3ww__fc2e6sr__LATEST) - OTA Training <br>