diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ae1e83 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ + +*.ini +*.wlf +work +transcript \ No newline at end of file diff --git a/src/hdl/ip_gen/bram_pulseposition_sim_netlist.vhdl b/src/hdl/ip_gen/bram_pulseposition_sim_netlist.vhdl new file mode 100644 index 0000000..be4da76 --- /dev/null +++ b/src/hdl/ip_gen/bram_pulseposition_sim_netlist.vhdl @@ -0,0 +1,3540 @@ +-- Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. +-- -------------------------------------------------------------------------------- +-- Tool Version: Vivado v.2022.1.2 (win64) Build 3605665 Fri Aug 5 22:53:37 MDT 2022 +-- Date : Wed Nov 22 15:41:40 2023 +-- Host : STATIONX2 running 64-bit major release (build 9200) +-- Command : write_vhdl -force -mode funcsim +-- e:/home/acme/pulse_channel_zcu/prj/zcu_pulse_channel.gen/sources_1/ip/bram_pulseposition/bram_pulseposition_sim_netlist.vhdl +-- Design : bram_pulseposition +-- Purpose : This VHDL netlist is a functional simulation representation of the design and should not be modified or +-- synthesized. This netlist cannot be used for SDF annotated simulation. +-- Device : xczu9eg-ffvb1156-2-e +-- -------------------------------------------------------------------------------- +`protect begin_protected +`protect version = 1 +`protect encrypt_agent = "XILINX" +`protect encrypt_agent_info = "Xilinx Encryption Tool 2022.1.2" +`protect key_keyowner="Synopsys", key_keyname="SNPS-VCS-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +LeGfW11jhaz2J+tJMaenLWkjLcTVui+VxPBx+8rOGcckNXfLMz6hIBva/LtsV+2wJyibTPCiSmwc +7a2w1hZUFyVACV9GGi8y0WJ9q3A8RsB7QVTtaZcibjDRLXg4k/3rZRfntRBGdrwRUbZYkRFSEnTl +2OduqlE12sj5Y7iF6zk= + +`protect key_keyowner="Aldec", key_keyname="ALDEC15_001", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +r8t9cQzglpowIt4+xcz/IaQ6hIJgvokVIVr1+ofeCnSW1AhoNDkBOVCYed5NZwqv58LAQ1joHKNg +5DeRcjUda86YtfHgnunZeWDMosIcbOUTFIhSSQAlGnKGBtjOG2QWfhBUsjtxkaPPPm91iippLBYA +9PmfS3n5qJlhEaXlMcWx0HjWoE7ugZGHVyFz4hf50hWWMW/JHymATMtuBic9wb+uq0a4oI0HyS/l +iUI/ZwfztlvtKg5XQGpHcMLZxY2SIWdjrUIBT+0/NjomElyFl9kJeuz+6tBdE7JPsmel3cbxC1fW +sz6ZsGtad7GZn1WyYqCJ9UoNPozkAxmABGY8uA== + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VELOCE-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +kShj4t8lODJ929HlsKCY/+5ZeTnPI9puI9QoNxPLe6eNy/+KnFhGrS0u5vusA6SvacoSwNgJhKUJ +2a++O1t2UCEbOBHpBwE904A4FnPrjLrNRV5TSkHTZxPO3LQJcNGnoe6zS3+hmNfVLL5eQUN1clV7 +5ffErvjamS6EB7Ll25M= + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VERIF-SIM-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +IesG4t3FxfHK+fEs4aT02sI8WVDIDncfRFbvXnWC8GwE91EP/dgDdTolq3nbrXf/+Qc6n54MCAyK +X2UodnEGcvj55W2heas/mBgClp8MOVqdBT10qZGgkvoVeLV9ov0bKgKJwFORTJZHhhou5ANX9/j0 ++7drtgFvrYOeSaldsQDCIs91T+ZjNX8R7D2K3RnxjohFgZ1KMhogeqPIlFmpLiFHK4NdmgzC+lK5 +W2FDcKN4fsdHtQX7qxZVJf25BL4+D1b0KgV6R5Q8O6uNPo+4FPAzb8rVVXda3EdmCQVgDdKd6hbi +N88MJoBnLd9Xbm0nQ7ir9ICJaQg7i2IQmFUL5w== + +`protect key_keyowner="Real Intent", key_keyname="RI-RSA-KEY-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +ZRawUDY2fbiuyochuUH5I82q+us23iyqE0jz9w5r3v2OmTWRs0lTLKFf7sj6u0rlH6HlaUU9lfv/ +kgZjpeombPnZI6sc5Q2/InLei90Es6fcUz0KM/0aW6lEq09pYS8jDU/zb8vFEkPyY8uFpgl1lgIh +sqTKAwub+VhJqkTaMghX64hneZ4H8k1CDqZ0JsQYvMKVqHZ8l3sh0ZujpYQC1NiLQUgyfwmebC/p +qkQYA1GGWRqKO+cg/dPVl7evcaRMQjhtgPQ/Zdl2UadJpT4N3lhwKiwjt4Y7vTswI7IlEVY/KFOU +s8WTCNCg5Z0uB7tL2fd9V9MH0D/BWZk1loGi1Q== + +`protect key_keyowner="Xilinx", key_keyname="xilinxt_2021_07", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +qXrHOJ4zjC6mSLsS/WK+Z/7gei2W4oZM7/nhA46tliEiiwNr8xFMmmhjhF2165yByTNOp5u/G4yc +WqvvVCktSptdefOgNeS7cjhYYUt4rD5NRCLNNWClDYyLB1Jd9OtRM4WTPdxE57cHrWQTgNFOeYec +MBPsYJ9vZC1/rbscprGo2u7dfscYqxwzEJfrmKue+dVEqdpfJLlSdqobjrKDGKr2JZyEuH+wnA0s +feX9R6OeA8QHRJ5Rt+wSRK5x6jjAQImEriVwbZzWU490bTOGFVoMPrlsFAHz4bhgK5T+vR899UqI +TTEW9zxG0lhTE1sLa5DS8Y3YRrH0q2XxVP2TmA== + +`protect key_keyowner="Metrics Technologies Inc.", key_keyname="DSim", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +bhYdz5Gt8Cr+8bSoHN+XQ1ZpiSyf1FbANMacYm4zOGxLYIUOltMC7URrvaM51stDXTvBSVgDpKll +oNKLYr7jWqII3JpNoTThJngO8baOsV+/enItW2oAABSEV/u56OPBBChP43TU+tAy2cwEdjTf5oz9 +0/7l2w9V3t2QGjcAZjHEvLOWz6jial7M63OeeowHD0Zjo2a9FxLiD8H7m0B2S63OyqxQoZ/8lo41 +SiEHSG+PlBzGa6PJ95XFRqVELCYSHdh6kixD4Ez3Zz5ZtrMU5vuDTM9YPpIICoPLhBFcE9Htn0sL +9PU5SMgLpaa6/AcWScKU4DhXVcbo0l8fc9fFpQ== + +`protect key_keyowner="Atrenta", key_keyname="ATR-SG-RSA-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=384) +`protect key_block +bbaFvGRmVr/tPJfM/Q5k750HlhRIwDxp1MLbFyafdE1N7QWhihDkGadzmBS2ssFPPb/ZkRFqpIA4 +SZR+uc47mdbYEtlrJiCLQOjcqKYn+DPf/5cG+tp7wz3zKxD3fO+dI4e4tMEMkIVC0XrN/LbUOq9g +sexgUi9nu+Mc+BsHmuuWGCDrgfBZa+9C/VTvR3ZIGAhy1tAqgC2r85JOCLT+AuXdMcqV2pEMxoCJ +NJERkNwLFdqn1tcBtzgvAD+AjkJEXJETOkGZvnD8ljo2yezC1siJ/Y78AHRdu4mWbiw2+7YEzPfd +frX0hVweSToMTo5xX/FXL4ESH1uq+d3OxgPMbmvd4c8ocahCUmrKB1yS5NZwV/psMSC6nY6d5gxA +9iQxVWasJv4CYeAQOnuv3tnxIk3yNSjazhS2m5Zjo6UQ87BlLx5YoFybI3dJJfRgF/rWdTrjdnyk +3lpSq5ZudxQzQm+W9YDgO37MR5yqGD4ytr1UBeIM0YNEsTcMQuHxrtu0 + +`protect key_keyowner="Cadence Design Systems.", key_keyname="CDS_RSA_KEY_VER_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +lr93mz6+I7varyuqCVsB7oDLzaoSs0HZFAGTXXCo/sbdlFjDN1mru6nXV9d9mgX2xN1Noy9dJw7d +8UiK6Uvm6oH/lQXrwXiPQfZ2De1Fu20NJnc01icgxnDfMBufXQDjFQz4k0quolkgw+Cpk/aesBym +6E/Dx6fF7X9gZoVjVl6I/K0wFOHiWKPC0lepToEKvexOESyXo1PdBxKhaX+0d1+yaUxcH42E/TLN ++6tc+ZIo2QvKIeBHJ66M/8kIhChGRdGrwP9p1+cP3Tf5GroIu11oiwtP+he0DpVbpzPRD4D3yQ41 +ptt5uxo6Sx5OHcF7EIhdBVHhbH1qQpVT9P5zJw== + +`protect data_method = "AES128-CBC" +`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 189536) +`protect data_block +FGrNmn8OO2QAl0bvtx3jv3BdKqqSMRhKToGhrMBNPvbmKw37N96ac5a/RqsRI4r4H4KHRNKApQG1 +QbGVzJk52h7S+CND8rYXO4woLbJc6icnzSXu+TtSPd4VmCFpOsxjmOonwEpim8uhIQ2Asdd66tEu +CET9XymPiXV7aEajf9gJh/7Vj9Gm2vsxkldZqtZynSjVBQ4VNbMUYGCQsa5tKNQd+AP65HgaFqhc +GbMl+7qU44OpIj3HpMrFwe+U9juMudZz+wINwwIuNSVtCSEuH5mE7Pah6D/EcqyuBH6/RtzNQWbi +9DOOtitRQntGQeVeGxEX9fSGcZCJppq36pyc09IXy+7ZTfrP25P7n05AnO/FEJLNgHJLCRcISMgn +EQE59hOlitIz39+q1k/jJ+X/zM6ziidjKYmbWFIX7QQZAou1WQQCYVkOVrOOuG+aybwlM4+3OCxe +c6dHgyOqdv8vVwil476XUvcnJ+HAUUKTbQYTC1NHrf8ZryiI4DGQYvz+hEJfOrp5VRdrpEsK1KFg +M7IJt++KpSPiTx5BOBf0j07XN9ZqvdMgqetr3onaqDtpxOtjzB3e79ytWA/68sb7s/liqLbLYb2Z +395xV9aEsyP/fTFkf1KdUc3EAYBW5hx1rgxyAxkUEDQZI+868vAyeFgaGOzIXn+gYX0fFf1Hc1tb +4bO6EcBAndVEu+thYgntjNE+KHcC4EB8y2jmMYLPvUU9Ir62YqLtuVmqI6CY0J2WKJnaZg+/E8fb +psyJuRVCDhSxzDXTMaeId7pBKsJ9C/gDMHSphhT9HJym3xnuKFv944IuJqZOYEL1KebWlULDvnmM +uL6Yb5TrJXpWYAgeqNvC+c5Scz5NKVl/GAyuirPA7P9MaWNgWg+PmnPd2v4mMFlHWicw9C2i8TgH +3hYSBH3WYQw/3hZq06X4LK5MhHcQd29OMjDLDEH5zviMvoR3Ax3Ec4ugrPvS71OLU6E/DGWT7NuR +7Cog49SNmqRfa6cIUjcKHXKExa3qZifkQcBayX0pFp9RAa/W9O+ewuIAerHHX7B0yRmoG7K4H8nU +pM5yV4BxICVc3UaWsHOaTsbQEmbuHCkWvORG/DefC3T+zg4Xv+da097z1k4Am049GlSAeqzaKFSR +uXRoGAAjfbQ/S7mT4AG5reu3JnXolgUFoXuBLPDdry7EFe0dHHeHQiVqau9d+L8lo4k1t363srC8 +BVAJL0TIQQJlo1GXKcDiYjbvEJM49g33X9EgVndMa9igUm4wf7s4QjdzVU3Lxk3zvqObkZnCjRrn +Ni03VLhhczgJg26YQ09s+lho8ikhhyMs1hIWcoM8LKsgg+sw4tiJtI3LA6hQppOvoT6pmkXyt5TM +ebfoD0fHDPzhqBCCKUOIBtYfxyJ9yknhnuMfr2448L/H29xblD0K8xxMN7aSiUbrN0PpYTIrBXEs +86HxE0bYCT46LPMQ6C/gRqBTAHIUFWlI73P5iuXqZ/D48IVfAh7sYxMXtLYtOiDs4scgjkI35eU5 +//g7YMtoZ9hAaJaVBM3OryDlbcWRsfJD562sc/rHj8Z9NTKSoYSa7Egj6AsV4WEBLpWn1JAuR3y5 +6rU5Yexn0QhbeUX4inwZFA6Xtdkla5kiPjWURyyey9h2MWxMWvxBlXcFHaRozm9j8fwDxq0SPE87 +XapP0y4PAt3VMhKzyRhqllS6iZGj+zE8gVTehLgksfOqjNP8B0Ywidx5ik0iNiFToH5B4yHUIbsT +xIr8ZbPW1xR6yNcRSOVscUQUKX139BcH8TqbemJoXPtpoU7uei8B/S+iDeh+T/7ZNu2bt+JuQOfQ +MHjbjJNrbLiyq+hfqqnei4348V71Kse1zx0UoYH7fmOmlwS4MqiwAz6BP87cOjI9pUlYlYzMJoIL +YgJRTpjS3sp7yYJEve7HNhXibzDUPf7P7+h3PvtW16hApedZccIErDjwbsuPV0WlLLK1yRlmXasX +OwI7aDHZj+KrQuMYp1wkmxZYHfNbzerKCDaw9ohKckQ4WT3T6nIZffTeQ0YxnJUYqTNnN/JInFmf +no3Mtyywk74sAOEpQPuMpcMDlCCFLbMxA0Dh1ETH+oOtZdFEOMwHU9kzDyLvcMOQEtHb0P3JnJ0W +Q86TYxNkg8RZYsnFmqhSAGk+mR0b7WU9hdKvPayn7CGj1G+0n8TVFCS5lYC7ZsrZ0AgxrCLRWD8i +Ela8TSP+/3tMD/SJ2620qB5c6SmRlHKXsxgC6ANq2Qm7Yg9Yg+mMnU4OdTk0VWxFNH4/++NdTg0F +AJ48rW1Kwsw40h0iMgOYBvdeDROK9jxEWN6ERKPFPevT21Uq5u2WtZ8VxyAMshk6oq9ihsheFyAb +kmoF5RNUcwCaPwBQ3YQ6VoxENB79N5AZRNOwj0rXHSCYFlc/Wfvj1bwwQeGkEJpPVthnI1Zk1ZON +pxzmA9W/9xp4Vv75u3lIj31uVflzyiz/xZLQD4XSqasgfZcc02XhDF39jcAxAiz87gxRLl1+Uj9l +ilm6+xnnpJYBI86nhju1/6wfG1sdFtkhjFuQqbbE53gExrSlTNpKFFDjGyG7Dbl6W1da1CTqpwhV +YiNx/YyTpq5LQ3z8yxK2o4McS7OB1DLKuxnnt1cY1g78DrXFeTM4V55qRcA6gyFzAM+eELGvs3Ld +gq9tvm87vGxekQ3TVKeqjo1DTS6xv2+is1OZ9J1nEMBTlYHQ3p3qHyJufJJRXQnuKZXlxQeo9rM2 +BzYeGSbJNa3nxFzkLNUfaxfBpAGydTzIwcHtUtdQ2MHYRP6fqhOu+6jEZrnBnUz1nKVVbU9pqYQd +SFxIQIXTLwcepSIj7s9touxu9B3bpX13kIveCQ6tITw2ZZlfN7HDQnbLQIOjZC1+/uDfBG0citAF +uV4fXt1jIPqKDb7Dt2QQohzecm5KYWiei6lgspJUXRh54RPK/FgStCiooAoMjOo6f9r4m6XPZawJ +bxc0otiZzH5R5yw4jvF2ApKV0fy3LcxJhZ+WJHQ/EbCAJR/PgM7nIlpd9i+M4rioVIU5SlmIuktn +sr+327ds+P3zl/gKu3vaZ9A/iEWBAQnI7ZL3l3p3IKzE+PXLyGfTIHqcyi7fmqVT++F0E3L/vcUJ +KkL8VTYMvib5y/GWuAOLtmQdEq+Fp9bhrbIKpVzxsH0nRROU5FftKhtrmv0Eb7O+DkujqD+d/XAm +U3UKThpuNJEX6da7sfb7ApCt8B99Co075HU90e0R497Q4Qu/RSMhuKvwcRX3UEr9IyFe9kKvGSPI +R/VGLBNoE0cg54ksef8jE5bbC8DxUuT82Yq6NpvuJn6HV6IwErATd4VY/rr7T4zWLUdTa+i6vQUB +USKKRHPcKePLH3cPWaoQlKVcHrRZA4Y9tB7ivT1aLBmcUCoyKpDUdYIvaD0xCYCrHVyVBTkmsBHY +9veLTnNQ+Pbg3Swy4+glH7C2E/c/HwYAPF2XS1gLSXL3IJ+JabYkebm8Wcnufr7bJqlkVGb4/vSB +zRatZi6n6gai5BBV3aXdPCE77sc7yivfM3cbdr9cavSoPQ6GRs2Iw9aDI3xv48l6CYNTYc6KrTon +hxSwxwIiRhWYyl8hNXZ0NcIVydQtKdp6UjTSgE74qp4Srt/4Z6uuEM5Ag/HcFajRzCS7O+smRFLp +8adyCiP89eAQsJhQO1NwE+spcS4zJxNtfzBdXW5cWGVvcApeODQ+ff2mprDwOM2kvUakv2W47R4Q +NhX0TakkvHwaHqvSYf5XPVl0UTm/hP0MF5cJk+FGNcXkB8ozQLZLSiIAKhQSOFNXfW/6zc3dq9da +vRiSC04lZSosDT5gN1UWvmi3EmemGsTD+WpDHybq5M6x72+sRD+JrNTuuU/JW3xuskyMeWeRXV1B +VPAAibYrr5mRXGPdcigluNpUrn4nWCt5ifPd18ZQjVc7OyAtEv4+uhBgkdHgg7XUTSy6w7pKIpL8 +2cxbmgkJM3Z/yzr653QcqKvnJ/BVFSxmJHOuLj63fyPI6nhG6daQztbHdZj7oSEa2XIvZ7MUXTJx +ROD7Vgh3IWYwEY9OkXQGoLzOhPy/FsPWR6kObDH1Mik/9vkQL9XxyvTPR2dvSLGeiB3Aus+Ax3XO +wtevoZO9iN6eb5akn2109xxZqCV5YtYezP7+FyrBu9Y8p/l2794ufiH8wEo/q6OW4o6Hr0H7Jcg1 +q02oJsjvuKMBN9oX1iapA5b/ZcSJJwJAVEQ8JVW6UaOcbqYWQl3hW+8DO1LWQ0tFV20HI0Z0ldTG +AyCLUhLPCCU1z+JzcngUmFUHoqLz4xtvwdicy9gSUje/XqkzYBxqUnUTgRQdFPmjkmbKPbN2mCKB +ysA/IYTDEdBQBEa5FnnqeSucva+4Qlp0bmoN4CgDV+s+8ysiL/p+td+hsv7W5AaVkW2u/UbjBQ98 +O5uj8HOgH78NrLQq3DTjYWgjjApCDbJacEUYPgeolllNxLNM9e56c1AwmSzwle0livD+YJ0QJ1UB +nTaEepPJTmobJqvZGGnc9hLERJYGB/jO0iaYD3aAoo1gOcAwSXXNnp4/35xkKoN+23Fosm9CHK7J +S0MLGgxkpzZgkhQp/rUa0NxSicFEBIwILisxq34xXfSWBqE/IB7CDUeVFszd6r+5a2kVQ2iwuGjr +lwDPnG9Z+aDCY4T0uilSZVAcRZwChNf/uS6Blp+oarYGp0Oei07rYKSd0UHltVxqPtshkgqHof15 +YdzZAldhNPOeyYUUWpxNhkSCyfinaVou3JhKD8E7Q0HJiVXYgYrjGDqjY81PKhVKMeFF2p2Dtjzu +jC5E/QPhVKmGyUqfmwc9F3N7pxi920T1agyNcAMVr/hH47VWvxWfQsWaxEO3EsdIPQ4CXOqWdo7+ +8AXZXsrMWLv0mDDDUJqCPX2g9enjzkSDeFFuHZRptugnVxM9GHvIDPy6vdpNQzDCTnnlfkPhx37g +e4MWs8a65PHMWR2zXY7kf10RV9S3o9Yviz+2xmX5yXj26Xe7fjEGqVOYlBkDiJvEjYDbpUrHSLOF +L0f7tlUoHAAbJCP3hmmtNJvtSNBy0R7en1SmLYF8hGwPYmnomp3jY6NLrUnPOO6T9tmC56Pl8FoV +HRmQ4nuTl/WICerlONYbDXN0wbiwS+2eaDTChb1w2X5f3Kssf2bXNUyCdc07O0SWbuptwti9pIOD +4BNuLT0czUi48pNhkB1Mv6PC2pptOmWvmYYBPKB+dMi14sEdoPpueiBNrf9hD1kyJmR6NgZoqHmS +OaYf9pvcmOudv8Njk6EJ4G06WjdcRCZqnB0VXCI8pChhoKr9oRR3zEdlRThlD8J8zTRlCcV54GBG +hywb03DSp7lq+AHLTXD/xBmuf6koDzAxMoLF+VpvwG9HW6kKcUUMYyZyWukrygtzx1x5r7Mz30Lw +zP2gDVvxN8bLnTlZdtThbDeccdoxRBaTsh2dNbk1+Pn7nQZ64XaKgHYsThQ/9JIwEfU3uR5tY04s +hX19KlxUUTH18C3jQUoZ5idP4viz53uXqhR5sNecxH3KHRt6In2J6TC8GxT+/wTs8RYDufPGbXsd +OIqsC0txhsp8ZdK/AyPWIZmJr3sSLJaqCridJFh5KP4Vx2GXoQI0b0noTI5dVw7ATLzkfqBSJQJE +SE+B+KztmntP7QXqTCOtpUSBbbIJNF6pcAFAp8G+jjAc4jma5IKDWHlRtDA4V2mGl8XA/7GUipN1 +srNT4RGVsJ5cku75rUq45//QorA8lH4qZXlIHhb8JwCPYjIuQLuVcD4uIIEtD60Oe5rZw3gx3+/N +c/Wq1ym1TFIOL4T3xV3heveb5IAtHBhH1/afcmBhS+SmEGrpbnlm3VQUMTqLeQZkU0C7lM1X2C1b +VbYX/X8ap1FQtGviI/Uy4F+FYzgHhDu29s8++P7t+OrN3lTjdJfBuCfVqYdLDzMxuW5MgIM3u3qh +3lDEXSmO5jKU05BeA9mCW2uCyfzu1eNSH6rELWd6Wwm0nviKX5W/6uBPmjr45ohODsF0RhLRztwM +7fCEpCzr/jwTua6SjKlZkuj8HmXJaGNhZw5ERn7mNhHpRReG9kd8IalVBydaQzmLWMYHMe1De25g +A8wenEGzD9LSKrgxS3E7PQCzyfUemxBfOGpiETOikTK7Gb+K5aAifcNAz06SWX/Ktjg4toI2/CtK +fVBNSsKAWzwFgAJm2rLCDkW3dbSm4TZBxQegGbf88ad7xOjSqsFf0EnjjApxzeVbsXQFrZboXgfM +DRA5uxKc/KO7m2YUoJFHFOdCRVNgcv5gGQOov3uK7pGWe8pWTugECzr+9DYc3eioDidikyFzq74D +szik83VkqkjzZFSoS4sfB3y/RkSL0OBgTRR01kUbxCE/2JjUyML7tFSHWzmWC0B19Z3ZT/FqWAHl +3wMVDBAGKr2+YRLbU1Zaw5MRYDB3f4ueMkcb1vksHURCkQr/t25v/1DaLR84grQu9CUmWymapoFF +i5//ctSjml/kcj3o67En6rmhLjiSXGJikq7xFTLILMBYDx4dVj4CyKn/hibO/czVFS4d2S4OEZwE +XAmdEydk2JhKdCzkEKybmlAL8paw/qtx8jbLnUMenQeEAvaS5dAfJNvbly2e+5QxNH8OhJrzvxPC +ivqv062s8l9EvTduUdotZQY/RZwyuP42vIXUwlhVKDj46nsJq3cskE3SBaT7wM3iRHGzzEuvgo57 +jBb2USv0hZED8h+j9Bqw9MmqTregrsJqffQyjgT1zwM834JAgWAf6iU+u6wY322gzsG+W2Q16TUb +2Xz8RN+vrnH3kqhaJGG+9I2ds2ZDYJe9hfGGjJ7YG5oiiAgT7B8hfg1h+u6YlSEPhbPdCUDZ35rP +LO3gku7UEcKNp93taPy+2LU6wmG1hUjszquZN1aQR0Ru6wgl1vptOVxS9zIA5vXvXFnvz8Q30un9 +Y8/jqgfPkkq3QsHgAxHfZKx7VVn98bXajxdqka1RN/WyAozqOMFzDp37l+R0l4wqVTLbAI3IvWof +wszZjVZKUmB2LQ1dcImSjGlwAStJ5iDymZ0lCxWvtee+2y3P4LY+n1b/NkYyiYcDCda98OsUpAnO +vTMEFScaM/Tx9wpm06RA7/w8UrGcmrrJag196p41fKy2i0QiyQ4jb02UEV8MBn1bxN7hi0idb3Bh +HNAuj/3DHvbujbv5R9b5CbstUQ1c3Hxioyh8rRn3OvbodWZutWqLaNPl/VaLwrl+io+zBju+AWoC +7PzBvw9hMt9GSoZGZ23gKx3VzcZ6dafS7PPImZ66WY0yHI2xS6/I+h/7Fo1iWfoeqGOWOfpuEeKw +p2ImxWzADDARWBbMNw0lOSpYubGtJ0o6ndiBfJWdr0nyOp5lBq+jAnA4kq1jm6/ENJRF6EcqrzQn +BNUwGPk85x331nb6x9ePY1PKUsfgOPDh4Wot96CJSkaTRkjm6DjRA15kdzzrleYRlOjxfZfEGdQT +f65z51qafyO2sXkmE1eWiTPJsyWCo1cC2hAkAntfvpY7Nod07yMVP79UonLC13fbL1RWlLSk5L/H +Vsp+i8w0YFqI5hJov4Noftz8eeZnodyPsJzWX9gDdLlNj3Hc6OjpYtO/aU2aqnaVKYfM3o9R+EGK +0ruRET6v+K+vdaC6xATDiuA3L55PuEMatNDx/mXUNMxdRsWUsnUHQVYckO2rZfyJpn0bcBHU/zes +Q71R6g1Rn3e5ht4DC7+rg320fyANgvUpNEXcQh8BjsjVx1jZMn5pmDIzjlOVyERntWBtU2jmctxS +WveKiy6EDYB8MxjQhMd8Ioc3SnHQU/jSAlfBxIyoTD1iKnwxD3O5q4IrGOZ1LMTKWy9h3Er/FaGw +ia2ZTkcQO9el0LJUCWtqdOBdkSDpQvegK/9fOBsi6mbOmKExA9t0RsSnJQAztk23UNmwTeSh8d5x ++mWU97dF2GG2nqvem3/6vV/O2O+eZJNaIXOQxSJPGXJ8/G7GLH5a7NgcnsBwrQF5ltuEk5SwwBVa +9Vvf3aZTV4CJwSw/WKAW9/QHHZ6x3712saIM/F57g0KAmni1qfvzR4Qdtx/haZvm2zxUj/dtfA4i +0fB0n35s7o8pF0IHbMFmgAqj5u7ssep7aayoLSLgehxmKhZS0iSGHVEo4FyDD9RvDqvljV6NBstW +u7tLpCnib97Tam6w3j6m3huD3lcs4aXtZ3Ps1NihZDxYxthTot9kgew/fr08CRs+1eGGUNJJi9WS +gg54xb9fyrEKikfSiWCDCRA85MdcsqVDbnzNowsUb86iN3Dnmts8mf8oxA7m5/fTgjlTXX3A5c/b +89mFAjYjvQaecoACBrTVxH+n3NdXDTA0R43ei6CVxJXyJSb/qHrZMwu9cpCcYRd7Asi7r4KynW8A +dC73xHxQDZqroCgz0p5R3SWO19RN75LJeobVlry2tPZ8TxKGaN3mX7z6ttehjiJLe70cTAuhf1ax +qVXWKEJ9VxWYNzcI8ZB7Qt2U3kNnTOfdxFgya85D3GqypAbFHRIEZq4fHgwI9BV7TagWE5Y9jFDl +2chc6CmezKzIUzHz77DPppHm9u6f/N9+b6JQhocCQ7ks8/BBsKITh6b36ynnLQt6EIDGkssFvOvU +s05sno8fF97goceyQOS+I28sm0vm4nm/yVwxUovJVCK9eZhnhXg3Nvx2y7nkGVWJ9iKALo3/0aKg +cxR+sljcPxUfE9zrfmfiAzjo/E5Oc+AvcmIoaS7U2uJGipOLMP6yTz/p1VWPz9PKC0zo3TexKatu +x8IowQk1TqJ365qUOv3mFFEkz9NIi28wkF/GR90a/BVZPBqHZBWMGW9ANjFC4NgP78k9iQdnbW+z +QdgjJUWv1R2oIAHDUD64TnQsOfJsOBoPOCLauOHdW088UGSGJPXq4fbCtXXTMkAuNu4NDGNpyaZ8 +Y5Ch/Q7tB3GrQbuMHw3IGOsXwRtCkpWm6gZK58RaPqeLC1LQqmq9Inv+NPrlpa4plM8qLB0Gu6/a +nluCfWzaue8CsR8TvMseOYNEpIge6CFP6iR3IQjDxgn5S/ddZNhtTORkRQV+Q55EP319IG4EPc8t +/m2UxDm+HECOCIRImQ5PePJ28dXuHr9SgQeaeTc3V/idHgXom9RutsGgQ8Ax2cqbsEG0zJfsOuPH +R7B3dRP6dUz6hXA529adaDHqCxZwf1gnstLeiuwv20Y5hwx/2bOFgxbkmJT22LZBJCs7ziQyiBwb +zZingiGN8ZqIKEXvp+0hZ+ZsK6GGbFx17V8vkXS+5LP5QKqdxjaWGmucq0rdq0Tm/s93+9dMeRP9 +Bce1FbeoG6S18bLRzB53QZmNVzWHDUJ0STfFjLX0izWC2Bqg+VxL7cPLK3ZXspbUo0MlYxa8+b5g +MF9/KfEfxoUtKdaNNDD13aS1Ca63wFqcMJ2e+Ma0TQ8iBh9UIFWpxKgOoFfye/3PCor05HVwRCXu ++PK5/OdFEC7VxjKYS7CaJUgNUlUC3ISdBDNc95tclpH4/AfQ8yhE2LBoAaF3pDyFsGCCSBj+34fT +K+3iWoAkD3o36AOsdJQQx4xUyloHbbEpjnJYNa/d7hcRCSHgYPYPG4xvb2uTlQmZn+I3cTOEj6cF +T8N1Ezx4xFp7lDFZKL4VTLnCkp+uMSyFZaSBrgalVyne2YbDKRwPoBEStSrw9DnXkkaezwxCwBnK +5eVEfaqoqx0EE2y46wm3yI6mdpdTOOSwoQfhvrAT3LJt7ZF4U9AbgesIuR+0QtcCS1XFtWEeM2QP +TC2uVA1ryYmvnDB84s37wo9n/t/jNMam6geRQIfpZpxdLuji7IpOSEw701BqaX5U66sXpQLqkXB4 +R7cZ348m4TCU0uO7gScNlw9IIA63Bp3rZrLXp5CuspfuI1f+phpDGE+FoBwiXMFNZuZd/cBG4K3j +iK6Ejy1n+VZLL3qt/q0AJkVO/bJvDIpjZYWUlhX5UzQuRRkb/LsO5l/LI0XTONrCJ11/QJGMukX2 +EbrfME76Q0l+MqhNhQtK3q5TeZystIrGIgzWRIzAA0K/XPTFPLh4LUJN+cug4rkxF7fwvJAKCHOr +3aD6CS3orGmpSPEzkL6TyxFpO5+9mf0YYRv5axOiKefDlReXU5MowM5dG6f4stlMQcjwYyUJ4Soj +bMx9PCwnBicSXIF9PhG86xJPzIiZzVjNbaWRPCe4svpfToeDpJU41bTt/+KQpUZ8QcrEXtV4Y8CG +wUca5xq2RY6LpyHqShaPUt1V8pDPZzDAYa6qHc/zz6RkAcM2Zr4YZmg3EtjuvwOxuUGfzvwL5u7v +qtUesm2K5YXmceU/kHM1ZLaL8NIg8ZztjYJu6r8pKGLcBMbIR68yJaILbQDs0tqFbIpoWkaZmjKN +eg8I4t++V4MkxHYrc/4xdE7/yMFZG8mQNAVeSd10y+RTQZNkdsZBbj1kjLJ9MboTitykWJmjwZM1 +fg1T35+eLb6v6cAa6tMe16okjsBKW3RrLnlwYykNAc2REKzEqpsjZaMLdoaFkhOvfJVcy6yxvNf5 +2eVsRGrPNnG81jbmwctLDCz8y1a2p9leKsCm7RhVKr7HmpUd78RAgGNknEu/4hWtZCoecCdRqDaJ +AtXmjAy9X7dheP0ZY2AN2UKbOoOHRpCcX9AoWJ/5CKv6q43lqdtxcC/LpIIn12At90w41cNvYrj9 +VwbqexvBEUwvylMr+AbSnu+Pn+M54wktzkGjIxoKUhLDzEjy6035MWmyQawuwQG5ataSI1YN6UvU +WOCYEWVzpbRFdh2qcJnJXjWYp5QsjbdlvPhnvG4nW9zUAX3B32ZNpXxrrLiVD9ZLpgqwr4qJZvio +L+PJgugogUEuHbB9f01aVikwF+wrrBkqVpbR7BAXq6lroxXLNG8Hz2ww2So0ZQoVDkyQzCr8izlS +gAL8vl1bRJ8UtZVn9Nq+aUNYViA09AbIvTEbii4qeeyz+Zk9WjPCFszh3EChGLgHv61WELTUGxu3 +3zxaF58PcWjWwGt98CsNh5O1MhOOqsz9FgY7jXCzf6wpQwU7s2j4JAVLiEhh8K04wR+fsEsfaakm +dGK01nUSR7eHF8j3qMbCVPgb6tf6vlXFF/xdw+EHdHh3abu9L0QiVodjzdBxLTwVxv48BbHBCUFA +9gUl5pIKB0tsNxhzJqbvvmNBb6bd+3sdDpkeaeWP+0kkH+NyDr5PxZXwaSeJkR9gvYb/HH09yk9l +5GdK0i1T1o3JlmhvOu5F58E6wnsvm3bp9wzEtSQP4hW8n7074bcygB0zgggHKuwYu7hRJ0diIsBL +OHZbRLFduQ6yqoKv3LHIdr97NfU0MPifVL3ebvKyBUQ8ZrcdYp3v4I2My8MQ8Q2pc4Twd9Ym0DzF +45snZY7928Gn3dfnzVm9U0W3HRpuEL3AYa0mUZWeRH//4gIBoHp6CVsQ85obfJ2Ryc5napCaxp6H +9xBwHg4EYLYTNbSQYVTwYmpmxES8ajRjESrDkaXOGgWudFnSYylVWM+2SDnIfGybNIxd5WOFfBEj +DoVp6T0bOs1Bczzw/pQs38jZwPeBskgmtkOPPaCDRHx6MDy3ola9B8T1TJvNiE+3SskdpcscAUt1 +vIwUej1BxG4t40C4btceekoA7ADsA2K3cEA8WxB1QWzmkSKefgwutf9wRUnLPWBkMuqGCxLg1PKG +03HgsFgHvepMvHV/a0JVQ+F2xf0o6D0Or2091R7Fkw94Xn+LGPPYfUe9WkemceIDfRi5/Ji2VYMl +0wrwyoOymu+r3mG/K3rMUottn2ZgsoVrRZsJdX3dibmDJhcMZ4lmkS2f1noJkV2C/9JEFXoink9d +aqpbeR6kLjMtClNk9ztK2tVmfMEA0v6/ikATetBj/IIUG893Rn/MtSOUm2leKpIOyK27jp+DyOHg +aFb/NF7lqlth2IusfgQUhsWxoGhwpnUGxuxERGK4P0w2Khb5LaSXgW2cMajZ9PYPE5UEr4aK04MD +co8gTAKB57TYBF51FPdxqtiGEkd7kX0sUVdEnE1PrYSyYzK/nX5X5j8KhqW5ybgYAZ+3i638ubqG +EbgKQSdaKW22j112UooHfA8wv3ubi22aAoLGVu3vK3TW/CNHwjL9l2p47Enn2nEaGjeTYlDj0ZQH +Dj3jL8yyfgXxzr24cscO5WXQT4jphn+QGasvne3+mxrIylCHUPQLpbtNSiAbIWY71jbs4gwA2k+Z +rqDdusUGWBfMlK5VWX5eBf2srfqJaAsRGycn092hdpRjUkzQk+AL94qRQICnk2yK2Hg9b7VcXlEa +k5VUi5BzbBClqPEGRYNe75Ns6hOBtR6obizagVigXdss7/+VkcXxo5HUJOWA6MJnGR0af9rU1LL8 +tPwWZpLXcTcFlfZUgBGVzwsoCJhrgHaIyPVi8Bdr9ThrwpLdb2kKZWTQMJYg68aXQq3M7lzbFyWH +AseLI3/s0jpn131MBOGKNnD8CvUzpQYsl57CaTVLqjx0lvc9tQCi/+DjuQbyctA63oSCnOFIWaEM +e5fv5zNm4RsEq40UAuHc2oFMs/xpw1h+hnoHPMcTdjkEbpmigeuwJUjvbVp/yhi4JQbZNe08jq1W +qfHm3L9szCgLDXIYHHm3tz5g3SwmY6HzH9VprSHfznjkEl+U2bOx965D8TneuxMa5s5VtOrP0WTd +AiTeqQRZMAeJ6zd/2dRk/2ZNdtgTtW8SaAw0Qu7mfvBhCZqLgYPDaKAKdilPilU9NTa9D9m2YGrB +uqJYyDWI03gKpXIgiENav6JwsotGU6F7jTWAxnUuSGLjG4Sjz+bdZJIAQQviiLlQSsJbCKC0rDCQ +XHgynIgx5jrBdSrK1UL9pC6Q3y60AioIccVgbAHWgNxazExpYd6ElRD7cTKRU4yT/v8LYHFv4RWP +7+NLf+snixIKN8+2/fdig7JnZcwHXBxd8SnjwC/nudlOvNvNNd6K5ui0fmYaN7A1U9M3EV6/Hd/O +pwpJz7e754S19uu+IQ5/2YPiFAiNjwoLfds4JQn2p1cAjuRdaqanV99EeGsutmpb51Fc9qKz8l8l +svJxk0U49oXvdY89zntV4Szjqp9QvtAnzU9QrQVAZuHSFbs7Da40EcVswucnxJkK+pFsagYlpqXW +GWJS4dGpr6HIF9ytSxZS3dBs3pTtWqogEf0FjkPooOulL7lHuPiWK3gBi5pAPLkPTtQnRD6B4KZh +mOF/sdGB9PMYKT24kugHRlg0VW2MoMNY4gsRkTmz2JjdZsnQH2YpVQbd+KSB94X3H4jczsJGM/2x +iqzjIsgHwwm7OgSmBCT+Mv0ueJUm7ayd7PpYxPii17Ob0RX4C5Y16ykbYmEg0KP/vtk+y8fGsSn4 +krh8rF3AvQXMEyC7tdntMuTePkkl3ZFVo3FleD3CgmHhk3H7cuyHTY5DLvkV3jqlA33wECWSIoRw +FaWtWRG4aSCiRshQEB9I5Jbt9aBqFX9M9lEmMyoyapshiKMV7KJjo6FZwlrkSb3fTRAH4MMb94Ae +WJR/S/F6vTnEkFaA3nkpunsFjAackd0J6tFX5pHPSc2HttoSgGp/YvSUNtNls+25z70moRqD/dSd +m2vJAu6NcqYG+lg555BHvCAh5uL9frf0uC/wmMa0bzWfSgDzLjMDleSc92EC1YjuCxML5PWweQFU +nwFc87ZmCvOmSJr7Eix/5XXxEJ2Es5PIL3d1MQU3pHSi8aoBwDdeBwHOw/Mc4XX0neV3NVCQ3wQd +bjdStYp11MdlrgRQRnxMlDCxd59OggZrefZACHHNLhSNEIR76NtN7mP9Z1drx6V704Kou/dJ5Kpn +b5QhXjRnRsT5nHdxUmd7dnIdPXiU/wJT4jXCV4sg5Pybh1cMgKDJKgKdGGKM2V7yejXt2XoNKuuf +PUGeXmv+wKNHPtty/GAtEXaeH3VG9MKCPIKa10ZxT9i7k9oJKoNxsE2GQTVGDrEQa0Z9p7Mp9/uH +lF1RnPSVUz2nK/2VoiHme7NNoV1JyOHnl36P39wjvtPZArTsULDm6qyqYvLBxSZmsF/uWGsCWroA +RUfsBwx2O3h1bv2H58lX8CtRD9ClEGwvDGtHwQ/EmPRqOOWnHTWzhd5mnTYEPzkopcdNnaZqwi7R +n2QmB24SKbqudkwclWbTrApQ57tWFKl4X8WUh3oZTMhk6ccGgJmDBATgyAayQaW3VmvHjqIUwRoJ +wdsqLIc3mFERl3pgTBLaIpMRjV/Z00a+6v9Y5f5H+4HyRitTchFJDlYmkiS+3U0jli+mnYpVKTwQ +ifBSFnDZMef91v7L13sbCKXscFOisLD077aEj0aiO5mpyfcNN/ehxKRPC6Qxq/n0ziVkcTOTMJtg +fkdw8oeOdrvqMYae4XMfqRo/QyHbth66n9G+vQDwNGtOApGQz+GgVnq7H55fgNMjZSAVmkMVi469 +bKRHeU/n+VXSSpKnQ7mLihKvusC8y7KKPpK3iVDQzF2sDIP9BlPryg+iKPpOWNIeWC0bqnJ0m0FA +mSf4faoSEQ+FYBBCAmphRTN9wgVh0/620J5RkbNEnOJchNFxmGY5K2FsS22TqWbb/7BGIE8Y6pl8 +rdqknNllvHQJZ4A2GIw6rPyTTZaRQV5/L9xclBn3couRdTNhPl7lhnGoSxArZ6kmkiSUPaj0RapH +Gslgno7RtI1+V4ZQI6ukm8nMr1CXQBIjyosKPUkiUHG0p6FfCp0zqKWTh2ELQ1iRe8j1jIx+a2NW +k0yN8iOVipv6ule3Kk8lO1sdi3bvQt+vIU8IMT7QhQd1I8BDS9xz9uTqcLMKLLMjlv3np5Cy90Ds +lOWKq/oAvpJSqlxdl6k8tQgO5zVUeMn+fRvlf2Ec0p4Ft5423KWgeiyWseZqpggEuVPD+flu/J/T +HLfnUrMfuZg5v9k0ZFh7UW1Ntr77Zt6EPmt2Gumzw1HnKtq9bHQ5/ZyrzuF5BhSwRMhRIvZBibej +uewLGIypFq6nnQWFNEWwaCHsVULGg6/PAMKxO9ZXFpSlFgCFKJTKi/0g7/Beq6HaYLXDeiScDxGc +x5KCcE6R19jHk7HJ/e620dRM6Ngq17EMXsVhtyinW+3kZD/D+Sxkyaai1V9ccEvlBwUAOboyZBox +EM3t0LobcjTnfBYmjaycXeNMb95FdayoGdapW0frRsSkh5+5XKcwSSOmnPON+SbX0/iK1CbJ4K0F +/4z+R8X1iuJZUFbsTwJanHswc5mkugFRQTMSc96F8TaG5Wnk83KNYnQd03roH4BtKzM6Kt4GSpXR +IEUS2ap/AxuhRV4dprrwVotpoRnVCgKJnt/zjvcUjEG3HfT1N9PGiVeQ8aOc9yZhuMFxHGV3Hgru +2U/ctPmMzve2n77/ujLWfWFYD68Ofz1HRfmcYbAMAkjk4yyJP66V32Ek2WaUJFJMgsAp4lThRC7A +blxjUF25PDRxu69fth3t6HWFUZo+X1Db+kDppAK3w4qesWhRIYMbiblnCE7qo0fY4x1cCnJzH2a3 +a631KeifC2DY+T06pbbEI09mwAahjaDsswDXkZXAPxCA2hfLy6qkcuJOmdT/jXBY18apwa2YEd0+ +aZjrDYlNoijydv4yJe1HE72YKjYP2bCJWzKxcgbAJ6r8WGoEanpzC0kkP3JY+XqBcrvgFchNzO3x +P/ZzLNbeZVl4mYQ8NlvjLc015baalJvDptAL+Zix+/3yXnWxJW2VyRbm5jLFqO/xhCDwWuSKrJa1 +PP5z+dyJfFWYtkB3vpxZkGXgfW1+GMpHdbexiVc8oejbvaWxw5INwvZQAgHk/xRc8ZN2o0KnucOd +R5X6Mz7rn1wOXlpeI3WOvIbipynB4vOBjmF0QoNfuAA/zF6OaXTv+MZKcH1XwOr4tVaqS25gxGmn +Kwld80FsYTyyYY+bpr4olJOroBPbRRJ18O/dqu0Xj3Qyv1AhXuRp/zcI6dYTyusuhKPvKxrScWYa +v6MKhntp41LnH9huGRYTiHKDx1eKAPdPL8VzE3KAlbEtI5QQThR4oK+L/nQPvf0oAqe9GSSeHHdw +ZO8tbw/ghuLbsFqT0nDn5bkXP+apqf8Moqxepe+g7HYKwi67894mHRqVZFL9PuntpVOYNHnkj+7O +35NGta55/v6CsxG8qrkg+bbcq4v0dXxsrQMtGnX1y5vU2v0P0YEj9XGBCkHKsK8vG+2y3tiZpGXh +wca5o6EfHWsTbRgF6qcJ7kkEd6Md3dyCtmMx0eaQpC41ALsyGvdYT+pODNns2JDXJI+PbDykCbqk ++avsaFc62w08Dyp/F3/XEnt+j4I6AipipnTYIQgNKS/Oed/ZJPDFIbXMdaeGY1Erm5F14J0VUSmo +YvDd7bljOqC/LOX5FlD6RYl+6cG445Qr1vkpOePtMfArWJoicDQan0H28VBmFBlvau7ZmQd5vTCC +J13ovKcHDsMVb7dCBfvZ2sjn153IQeps14QRjdiGbtZmlGna88NIufwOU8kfDd1yFOaKrHOcPP92 +iiL8aUTLpUQwcZTBLwH+L6srboTGLty/JM8fzbT3MJOdhS3aLHC9NjS6PCVy+fPgSMePEAdm6Cjw +NuHrFCbRyW79W4du54DSttsbf4zKAlSeJL/PRwkGbIpquYuU24lDaptCkHKKGQSVDeuyw05jQ2Pe +aySwN328/0ILqREERczZkQjkSBC/OnVjOvNQ87Ycd6zPXfYgl+/cT9YrCu4G3l6wIRPNjOh7YIkO +GNKPB6h+9EObl/XyqQY86PV3OkV/kbvx6gDkmknlvOeQGtLSlQUAV2ra2Bs2I7MNeBVJuiltDZXh +yYyIZrvDDGapcCWCYPjI8YbvxxFlFlI7AcWbcq8CGnDlO19FXQ5nKrNkD1JE6IBWpHJxATwjtmll +pCrECg4b+ib6Ysk0W3AQyClcalo/KLFxQN6fPALOS85XUsYK7axq5AankSeI9Pbu9PtNpwoOCXt7 +GtHJGwuGzEbnwgefgVWj+uUuoM90z8XEIsWsDMg8RLBtJ3pSixVahfPgHWgNPD+sWmLhQ6N8qOKu +NndFg+m02l5Xij50WTbuEZNet/Qusgp/kQuhu5+XJMNbH0vB1gdTnq7DFGmpZFJuMA/OLKKkZ6fn +Zp+cepmciaOZQeCxB51kHZ+UDtClMJYjehmK8a4kdxeb/o8PAnqe/EN8oVHaizw1GCbUecGs2G9K +t3VMb8BZVk6vmX+YYF6wJgzKvq8v9TKnMfS0ZnsfCyjHWN2Tn0tsBbGsfewXixNjZCN5aRPcInJL +GQKdBLrfp1VpVPSxXFkjRhU98T+5qrMPOZojt9+IbO28X1WF+tSt7v15w73f8zbpfsCnjwYtMO1N +ZfsB5MuwwkPQyYc4JWcjWH7ALlUeB0PGvdakenqU7qgBtnsyCR2oZCm9Qdd7Hc9la+l7Y8xjH2wF +aJxXzMIS8jtIQmD3PY7gFdzP9Bq+iEZSl9hoPu0ZTa5SftTrUD5qhxxMIhiYFBD1hDnCz1J+ArCk +qVBVNGsidZHWBYFqKQVfjvEupumt/at0BkbaAuN+R2ats1Q6lCKybI+2paiuZoW5fJX2QHiKegVo +zn5WvSejcEMX2YGy1V7xOAOK8Q3ZqbE14cpbsMxumBurA0p0dZlJBwa+wa/tuCuJKKK47XssYnId +1oJUBcwIxoZ+tQsaYEBEUOsoxhh1VwRBG1cBfxZ7jSJFaZoF4zTEpLaSNM6WJ28Rap5eGlGTr4/p +LAuL/Y5vrVv99GYIRQ8KUpsA+U7eeRNCL5uOWLhp5pJn5UyThNJQMO0oz+u4jLZ3HeIIC2K48pHx +cuB3fmpX0lZwXijzavAInDj1mUG/+HDvUEgK9EfL68qcUZUGYmgzCIpRORMery7+XMcPi2rh4pzJ +WjJGIdoWE0uWXr/zx1HmTNvVrg3g4x0CGrKvx5BvI2Iw0K1WraWyUI9k1kFaoRnY+GdJjDqyTQ8B +Qp5JiqcEqUp7C3v+GrkLo2wFoWWdkI3WwSLtIctyPxe7iryZEf0/wq3F8I1zt/aLAAS+Wmb42yWv +u3rMBndXPv4FJECfZQREsrtJ04UZG3KjvjzgeQZl7DqCxANP5dK9LfOptoNI3iVI6oMws+reVJu2 +uJc1wcW4WA1vj0cjs+FJo1wEGPqDSWJE/wMhfzTVJVYyxK4nj86JIPFwSVO1369/5MgxAqZWm7Ir +0xmwtrcAskklF5qlnGkhxvnkBZyIS4iyZx+xALFpqMYQgdpxuErBjfMY1d5aFRZqX/8eec3YgePx +oBgrpHu3kmmzKjtjiy+UJ4IeLmJEWRVCKMbEHl7eHERIWUvsQv6v6KWGrYl3G/5TqPDgzkE0dYNB +OxhSkWdWsBgBPk4npNS3DW+nJ0o5iuhcTp8qenGE2KY7r1vVRIR07kKocG+AnWoOKpanfdh/ML1C +A/hWczZv26PK/aKUvT9Rq6BefqdsCiTWUT7Kn9Oqwxvb9sYqpIx+kkYBMZXNC9Eity6t7/LugS03 +JTyP1gVi+zIgRxKBLeuARppOtAEgaU42G7xC5hNH7XWbiyYEh8rSrzJOMFAxuyOUq2eic0mcCur6 +9EYET8q5qVevgZqAOm079tKKHIRKvLiXwhaRAMUtqBNPysP1E//KjAP26zvVaHDoZSUIre6+XHkN ++0oxXlRwWpijkx+F58Z9PcprVQyyXP/50WniPa4YN1OyUxusOvJNlEZ1IZk/to+PqqmgDluTgPDa +1DNaB+JT1pUbGmM/VHbcm7qVGYQ4p23sAe95DtCZr2LFqokBCM5qMja0SuRY3DhqafDRa2dNDVHN +GdJZIuZ+82V4Yd+s6GoyKGHDovNRV5VbsGcYVKmey2PxX+2V3TNIAs8sYKVOhqePRUSmWFzOoqPm +EsKvd/6+CXVSKKjyOtYxZS2bxRc9YNZJi8eMW3Z6y7Ze/tPccGyRuH5a8+U/QU4JKCzm/ebS7vdm +iAoYHmfaCB04DZoLoNJ8UgyPCW2iSC6ZvzAG6ypnIHS5u+gcWK6jxFutPDIay8LRcMRu8TMSzG2k +GkFrJrt0msBOo8AIoF6Aa2Q6I9I31mGBP12b+7sySQhs47jrU/GGk2tqiwTKZZmK1QXmN17lKoR+ +pa7SudLwyySNlSUPL9qaSm4YMda4sOeYT05Qu84i+lTevttyE7BtIftyo8u99FBL2ps8IEEVeZ16 +C5MCXwb89iyewzt74Aw+MWN0nbgscwm3WLcy/fdZYEi9Kv8vQYjuFJjhdCoqRaj5wI393dD2Y0IO +ldQFkLHFhhtVmpYH50c9FcngEUx71tn7wx7jMrSJyRnzgk3ZwNNFZyhhFZLInBInZIetIctKKp7u +T0kjJdMpT+OOSigjmTsju2B5i1Wx2Clt45HJlHUEuIT0/9IjDNg+rUaGntyUeyZ1TW/1xa95g/Ez +C6Z05MGnV0O54bjlAx8tNhDa/LYSCNyT2Sgt7wALXaz6DRhnOHrr0HT4eb6Oec0ezEFZvVV1bvDI +O+5e0M8250eyWSANMwPC0MvbD/bY84P6JVWhN2CFtx67c02J+1nuWazNZshmfZDz562TrLnS3HTu +sdlJk4SDzpC7c59vjEXhnKudb/vtFiMGalrOTrIqaZCyE4R6ukhlSGpzd7KIK7fPBODR3Ps75MSc +mDZM+qR1T84pCexdEQJa30Y3/Of1c6Ak33Wg8HCgcrn6gfyd/sO2nYatIIk2WrkptUpzraC3WUim +Vr1Hmzr/PC9R8XquJL5mDyR3xWvMUdgZLHa3KAjk0I3+IgDc55tqz37EzoV1Xr6P90qnfrysqGJd +6lwbb1oolJ3hENSaghflA1Idag00T/lQA73fQbhKDB5sTo1AlKqnXKZUyDFw2PM0819OM58OGpvF +BBhFJg3oWXQZE9NtNc8BLXXWe9O69Qv2bTRIvl+yOJMhsFjUEXkGRC2oCi1S+UvgkCdGvYMA20h0 +SwInI8a9hpJKGlC5z1y4qZZU+l1KfMumRe3oCiHAzMN+PPtscMHYEhIwnrp3hib2tSc5gBZjRo9I +gvdJSsckN7dpLz+uqvSpp+1GJHPl4toaAXPHEy+4eDNg8VX9pXhroJ2AM9wnuMSXwiCtjwYQ7g3H +OzX9XrcL6aa35JPGaWHAFRuqBEQaXUZy5/xFOZfgDnQABqhI/t5X5M1skaqV2Ni+34cHf1yeVumN +69Nbtq+y3KTwnPB6lhZAtRWxUNcUpzv6+z9U2qRutu7xc5QsYjkhoFVgXZGzzggk5zH/hswIj1H/ +xvShpVP8EW7v5lw6haQA9nVW3zV1QbNM6sVn8MAnQyOW5+w0VNYyOT+xdmvv/90TgNSM7ASBTJnu +xHKJGHRgjvzR+2kSq7wQskFPLOtmcwKvgLx1Iig4cM74PglIgKgXcUtBl0ljTQP6yO9hn1G4Ad5I +wl0pj0DNKU1kxS41A669tXiwj1mGOmfyVBoS6LcTgNdik3DMLPbP0jzhma97R20O4FSiwSwvROYw +EG6OQ76mVJzw7mp1KhbMNxAloUmsljASnJOLDMVCaIQLARpoPIn08KQSrUPfreC7Tzu5k4ANXE1T +sLZhvXnOe1ul9JwP0mDheKzhThCgpcWt2YxWBVZIObarqPZpyycrxsZL2sSkxRLu4y4oxaX35OVI +S6rTEnJv8ALVOHYxGTxSe3HHKeTqKrU8Gt5+E6LdbjKtDJR0JElnTqUPVQQacQMwTQ+aAy4/2oox +1ib7P5KkPS8avR1It0bKK5OSfekS/aVoHB5WYtcpviwWsBbMZX61ehMEET0pgYPK63kx5cVizBEs +JYzg5DxbBqwty+nFp9ZXK+ryaIASFIX/TTVkffJHQt82TOQ1ncZa4leCAmX6ez2C2PPmtNPF36a0 +0XgOkkw1/hoc2zotamleR88QgP2TmLa+NnQI45Ma7JMq41cyBAV5g62dCUwREQ16pAzvniAC5MT/ +dHcoAUnKuhyRfnNreigWRWtbN06Jjp7OkMawtNXnuNXk8Xfd5XAfugW8Z+u4wiIs8buhFQW2ULMb +GkPG2c8UUSmfKUNwBfqPLHo7VXdl2FiXuWrHoN8rUYe4ElVQn7zCz/icUJjUITivmkdmjmLwFbIt +54jCCxDdikbKNQmcsV/borjPdEFvLXawCsJVkJV4aY+XVy4mXAstyTGRHYYRUdwmT5Yuv0zwe82G +u5qGsYcrMX+C1pabNxPQDS+mEJdsRMvaglbQD0QgAHVSYY/9Iopvy9n4EzrVHsOAC68wJSfPgq36 +STFhvDJObr2982QtfxLFGmMXBYxASWADX3/dHi67NSuD1uJ28CJCKIJORmht4kXelzFnU6SP4B9q +7VXSgHpYvnXCF2nC5nn+i2+snw63nm1cdC5RGsVRIY6t5rjO6xfJCLYzZqYdytqt2rp5epqRZVFl +0gYC7tme0gppLYPnPBq7gw5COg5stxe32hGpPnMb/3Ykj0DSC/8keU5C987eK4LFZfZl/wG5e64U +QovMRIk8LEp9EexZYErWkNOCg7fMbBrOZLyruua5bVz8beAFkaDXv4Tn/kcqfK0czCjPgti8SlPG +oTTYj8O6LLMv/WJx7ff6J++uBvQcGB9kZ5vsye8tS+0T2fwtrwH9rqMiBU19QD1FfwyzUxRA/pnz +waKsdmQ4yXk5ZyKkN9F5LK7zEnWgnqMyNoP3qty9Njwk3yu3MAJv+6mlAXQPQib3CV/J8Z4wFm4d +zr2W+ek+GiLf7iCEXRqVQgiI6FkrqBv6PpuAskHjlzcJGJ/5AKXTVLN5Cttfwq3T4nLXzibd+uEr ++fYwQCw9e2Iu0PkdWfpnzU5cl/1oRY3Row32Q+FYVsCUf87SIOf0Oaors51U/jXFA/6bbzX0G87e +vbeJ+o0hAfPDhRNmT2ny77mGH5Ra1YmWDz+7hbROdJD6iPjV/zQ01S9mqngmVd3ZTrPoD4aP+yAI +30MN2idh9zxL34k+K4bbb+TnASIcnd8vAjV8V8sWJCfKO3oZ7uza7z9vHwJlv7+/mYmeJ4WspK+L +hfNgWLq2vxDLua1Wb9s5YJHYQKECIVRVyzZUu7qg9H3FXzBitIOpCnm3HF7gJDWHKEfSdQuW1pU+ +hRJozjlhX4c+ZbcXPgCICm4kVyGwrtUlmCC3eHlbPkiFhiAHgGGCN5sBB7IuqI+8C//CrqU/qvbC +wi9LezBPfyF78bUF+PTZqQ3QJD+qR7tOvuxFz0WJHdDzexVwklgPbDMY10ROlAETUHYglYmm7non +J/SosFk2C4MdN4XGbFlgsmexQcfdxDM+68arQjxyiq80SgzJ2HU20miqSEkMePg2Bmp6bvzB5Nd2 +hQkHTpWmwVHnc9SZvUksf92cHpQ4zc4Ev6GKyPQ8qw8WCNUBsIBjM6FIVQf5MHuuZ5CLOUcVd7b4 +ZRqOCEkAxVM8Gdm6fGak5v0JDxZkL4qzNRSd+lKhLKFQ1IwsxmwPC24daDFuAKbALgf6MHvEWnAp +P8ZWBcsb30knKEWCL4VkppWKxwCJX7JQ8139IinaIE4pQ0c4rBOYsizYGRlovmNBenxLhLp4Cj4/ +GQWCeieLofMStLywz4YJr7YFMqNClhvT/6WliUAQmdc1T4oJlNBI5EEIagJAXmxuRaOqK9p0NZ+5 +CQlqQLlM+0XnFimZ96jeden5EVhIGDFtWMynQ90lpi3hWaeiEG3pZGseqBUeTF6uZDWNHxsC+2wc +ihJSxQ1iOrfyxcZhd+uZ4HoEbm26eJ4bXThgB6uUsJNw8C2pLflZ+doyXIPkVEXzNvoQpTjH5V+L +UJ//8+vCMT6rusTAAgS4A5pfFK1EHUX5Ly79MMz8NzELwukwDuJavNE0KIQoiTzJKP4esSFYy1UY +Y3ghGQqwm8jIhZfnQ8NFOvkIcK2VrLgmO2yQEJsWpCg8ZtLKPlMLgqZJ1mT9sY6lpK8M6hWIIDeZ +q/Qxkp51jJzqDfzDZmzw3Kz5JZFWnG5jV/bmHihP9UnbemkdMQNjPMCQMW56dhDgCuOCQY39A8mS +lrmspU/8NpPEsAeJ5Ce4d2ZjUVTnxwuz7tk5RcHbf5gojT/V+z+fUXF2NaNvup9FigPpV/vj69MA +gMm6Mb4bCDDkshyNDixNbjAw1pScAYsJrbePJDQjzCVrEqH5oTAcYEcjPjg/GMRdc+YRonMirwCS +Fx8VFCeqwUwFmlWd7Vsu4IJSvXy1cp/Pobos6TkTSStBR2qaUUuCP6FskGA6wzwmtFNCKggfBt4k +N9Kq+pB4ac2D9QPmNKCbw9ZOi4VRxR5N31LyRcarTQDEQ9suUrVDqu4AkVjdEQOALRE3QbFBFkTi +9KEeBmQMajy3Y68OU5Wnspw62btFMaayXPdFrP5oq5YUsFBMFv5qh84bWq7hEyrcfcwBay98bHEK +IX9htcasY5FwFBrXShMDqqXGvWfS7K5O3cgEGqFD80EmkoWwxBHCdYL4aSx0wyrl2h4i3FOzt6pY +TCo+y+9HjL7+MzHfwk4CC1ktZ1Vp1BuxQwVxRXPAO3YxwDO40V7ue4BehU6XOhEuaGb804cduxb4 +wdVnlfNhc1bQyYur+JYPKiGGd6t9RFeXEFAJsK2i2mRDdJao+BjMPv8fdRY52Z7NOBK8RgncnXXJ +gBH3i1/JQliswbfrIpcoWwRzZmihYHgtthkw5VOO3ens/gYjIfLK2YsfFXxjUD981tYQFPvcscRB +2s45xkDp+yuRWikmgWvDnXFEFiYsgqIF5YxilYEDgPlAHrcjU/jTYYb7ySUoNN7IZm9/JUOTwV0X +d7bXJlBuLE5GKJLCVhFL4RVP+6wBtaB+czk+AlSzciL9PrchYeLQFXESTO+KDtbBHj9iqZiWN6// +Z/rFqQvEFugN3oZb9Lt2r96gBCcKsR7q/zun3WaSbT28YtotMvPXeAfZN51voS2/pkRNDqOjghPg +0NCXoHUXu+xRyFN1sINHm2Pw2PXYUm1TbUnyHfskv9iJvc1cX+1H+K5GQvdure6KmJFtUIIbnB49 +qB31cdEFrcczEOJsMQjDhxqynOIq67VYlgm6XLtr9/ElH+MGjjs38UQwrunbQkSNTTl/7oPd8u18 +5EmepG5ABQsQj79VxgaMSujzlbO3kEn1ipSJXS2Xb7/M7JlVYVCJIk035I6B15Er/yJ1rgHPiS1L +s5eC1dYqU1U0RRCEAk6jB680WGbJFEwRiBUmoZl/52IAYc4Uad8InvpUmtFpnd6eUTzftuQVPdZj +DKJ7G56NiTEy4ZX+ZAtb/4AyRMnxgpwJ/4WZLvmJTPSfXYoyyVlBPR5TIcBynrQA4z4XCIVhf9pQ +xvibdVIWEsP/6EcPCpzr7Rq0cIhbHIrUa/oxls+A0dzjKaFhELi8dSmRyQSQscxQaIbmAPrG0pU/ +SnxUljPcF7AHCXEpbfFVSf20KD82ZSBcimvWbpOouLwUv+DTI7wz+vXeR3N8tKtqtPCHJII3YzFj +SA31mXRHJ0sAuwg8phdYI9bhQYsSBFYJcY7YM63CRXUSH8SgJtJeGOD/246gCqIHhUjTmZi/fbiC +OqpJI25diIOYBSi10sQ1RbG6+YEvN4sR8UJ3H3wPOQy0H7LhSQxlJNsq19CuADsV6zoWrp1DY2kc +dEIjPdvNSTatR76quDB53v3X8Ozk+YkMIOpAVI+KGV/g4mvfQqMsCnoqegmwYZt+Ggm7gKrlW+x8 +ne0iKOOLtZExzx1xEYAiq/UGMNMV+WfZ73SnJL197Imby1+nSMVtADnwjP/epoVBLNpmLb7pZQ3N +kBF25R90eXuR0q0egRq8RYN5ByT+LmaK1ZkEZ4d+OE0cs2DAn5xxm4YqhfC5dhBhxaaN4+ul2AJb +mncem6m+L3CZ9lTITg8MTGLet9egzas+BRG4ukDjsxDR+C8XXvGdGCAnxtqw4mijiXuke2CGoBs/ +yihBRCx79o7rfguK4lnuZmUBwTej8dv+rQMkyb9GPcmjEWDgMWFoOxwvDsCMMkU+S1m9eb6K/1Eb +0mf2lojLy2jgk7iOzu/UpJEKMmV7Zio4hnbN4QTjWbeMsGEW0pkObgiqq17XHym0L8iDUcKytabl +SPAiGOli0VOFN/bpPsJXiBR3GYb9PtQQUdX5jNE11Dg6rWMAmCboMLloZH+KEmEPUbbQCdtaqZsG +OI4a0oVg2XHTOSMMdsS8E3Tcg4kwVHPVwQZelhFiLly4MDArrij2Po2ip0lYL/lLRnRXVdyORyfi +eyi9qxJp/VUFJy74lyHonv/hE0ACtj6sfJoOaUSAIjLSop+A9HZn8QX0vTrlY2pwAZh4k31mlrPj +QRJYCY0rNdo+y2FVycp1TKjx6x/2PXHHmC3oZG12Kg8eKUGw0r0WETXeoRrkwt05ilTBZHCmTg9X +CvshKs4Tf9xECYXuxik4yG318QPLFRH7btjNIrk9L8bP82U/AJxES483wK6UBY3Oxs0U1FEvqdLz +s6srZliOurYLQI/WRV98Dwqv2hE97zESld4sw4e/lOhHoIgFMpBZASGW6mBPYYqj9J5buBFhn7c2 +3y8Ifkxzv6mlz37ZvsdQbiUYQ9KjVYtQRhRvjipg29IVzpLIwz2iguA4JimhkV7b6K4KGx6tgBzd ++Cs7dKflafdxpyVkydTKDpAw8k8LLdroQ85iap1U5FyD+GE8Hbqz0M9/spzovfyMNVeg/pD4lf9M +a0ZQ/KHXZQsF5r3Os3KYAYw0clO+b9B0sE4OQ2c7XuRhQ/08ihOhfAMC2YCu9ZoN08c8UxX9jlij +HbZsd8XtT2HUaq/PyuMyp2Ol26VjL1uO5q8rkjvlBE2eVdnAujGAegBw8SxKB/9trGHbASDS9PBx +YPz8qSGHkDZL/lXvy7jmQh5MeC1i52XbbmcGoYDElnGK11O+kjp46dzsKXnNPy8u6/rkTx23HXEv +aIa1tHWbe1KzC+T907aVJSl/JkwAXl6IVF41X7f1r78q/8DxEFM4LjSL3VRcD7U3z33GWv6JoOSZ +ci13vVN2tm9NvaCW5Z8nr0uisT5nuP4cgORu9lGUSGbUq9wQdLykY+rc4kJ4E/YPBx/4zZI6Udu/ +XVaKRWjAB0ksemaOPhEJ60Zi12zuIYbJm6Fkeb/rl19kw8On2Mzpb2PYiqoeOtew5S8thsdR21Gu +2dAGOES8afiYJYxb9VehGkS+/cQPpLFL2b9qnRVppbwrsJp5z5M/rDT7IE6PgkKWY+qK1oI9doq6 +uenlb3NhK7AJrhOtrQo/Z4biftepshO2Dq3eGFpYWGJFQt53+ZG5wfniHbwPJbSBNJQUTF3tdqH8 +XK8XU5BY6SxAGBQ+w6rkpHzJcPVwKrXYHR4YKrQojGz7oLXJi8HoWC0tOHaN156xqF2si+mF9eRc +odOxZh0CD04jYqdQNUfKhgPZ8Drp5UHMrVCUilbK2bgmxoW/XGl6CvtEPOhPaAHctOi3JI1GXKzM +KQ22wloPzEsdtS70TaQwkUu4N01hJquaXM2pthcDfff7LVBgDnSDn2dTS708Zfy2SYLm9xt45v5Y +xA3C1FDWKY5jeWdbWup2uP3u8GUKgq3Jyot1qcDJoKIncIcvpbo2Y4KDj7Iqm6JiVZSTgCTHaJNF +p6cwYy/fc8Z5eEZ11jCXiG4c3cTxMHUGQWvA0uZpLDpzlFqaLkWzeQWcU15fg0/xExAQ5w4DC/tm +PW0d16JRC0Qs0yyEZ0balgVlMmf0vNzHh4W5g1czXYYrPYk/VrhJd9zjSNHIAVKTNrXIS9rfpFpq +U3/+3kELaXWOM0LfFvaWYaC5PjEvEk9pCyP2xjdcmkxtTGq+HxSb3AuObm+fzcX0WHmeXHcWC4EX +Q80Kins++xzdJOWb7P1klTgPLNS0Y/6ofhpdtfM/dRY9oCk1htEiR8U/sCBMBDjmiUjsNmAsJD1U +0fSMJKXXyqB4MYk7ZyW1eFP11v/FMbP84AEW9O4jIWvKw35+p1oOXtBRIM78Wu2+D87jfg6TcFiJ +wnvZbd24GWHWALmIz3gXCbotRktT+l+FOTWn1UvCQl09MsdRgLPy8j0jEwjQSHl2I8GaUnQmYWxy +0pazsmfEWf1dv2G4d61RT7ikGM+Ky6x5UXrPX6/Ok2s8Oera7MsVgctm1l8YaZqRoo8Xkrf3OKEA +lYVF+LsKn57uvA7P0hmWKrlCZhYmGMCac7kKT8K27ucVCs28nKZ3jnfovEe8EWA4c3jMedTSCDVb +YAXkptrLCqsA4VrNn8LVDtsZVUJYMS2s/XzbiSE8Gall/Tyt6ve64GEDcYJjWcmuoZ1dcOviRyK6 +xRNrPMMl9TndPgMdTAgN+iIeEsOoRqVkiEWPbmoYa/F44Zno03/aq3vwGeO+RWOjhRPRrEIGdAzY +un/28vMD5lN03crH8BgNg6j25dQJPZz6YVhH51q7FX6xHUBnWpvd4C7U966b301NsPMwtD25IDCU +RWpugEn3dDsfEDkBv5k5isgeX3SX6AIwMv/r5fASRBvO2GPlSxn542lFTLxyvCyCnj1qS+XNtE/g +CRJ9Q5f13IQj8qujLTyoqXhfpxTtXkZGCHyj761kluzDPdzsWKGNw/OrIhfFZiSBHBiB2dhSh029 +AQF5Pwjzr6OacXksKVykSZVqfWo4s75ebKS+mMguPv9yNFe9jtYxfgx/aS4tWyQh75gTNK5dBM+q +4Mf9wI0qSVCw60Ua6OM0GqkXaS6CpxATGa8ksEvKfAis54ccxuYAsBp7MPfV+yaG8t5R+22H2Ewt +W1PelXNRlLTDN9VL0BFdkwPvAzVpmpGBJ5KoV75bq7oFfqbGOHkIAENf9bvitBw9SoPcQ7sm76Uy +7hnLyYvBfr43BT1lkh9CyFyl9gWNpfxWEw0X5woKm3+8L/yWyq8XDX6wOMoBG087e6bZCUextMlt +EzeFISdFnz9mICFQJd99KU/7h8da0WBK1D085PMQ+m79MS3RB305y1REdXsTp8j/Uzn5k7qcszxK +BVQdxVbkOcQJT8p9k5PSUyJJnHgcVRQvSQeviLZo3cHNSWjAMRl/WFOTq/tgVI4YrLx6Yqb6cpx+ +4cjwQJsFSJ596S06aY3FI1ser7GuW/m4/hJXFoVE6yXPhilaigPrEHpKpOAs6cVnithKmf8726/D +8SZvATDj9fe7bCTmIMuzb0US+FSI3rgEDu0KKodo0NtEsAQEzG8LJtZZoyJiJQ56kzOc76kBu9pe +B3DLMktDtTKHQI72vjsV3YnuO525F90eQuhMLfUsyObkTTHKtZB0oe5Rv2RDvigwDG9Ta39803mA +rYUfCJF6Cms6Np//6PxoLRh9VHdIRw9Vwq30Q4TM2klIvAoghx0hHdn663p17LIUs76VInMkVZ2e ++1pukvtcAtBDuG6ok4LAdAltiQmNn4NBXpc7YTuhu6OgwxDhzuBhcy6pwGNjviIjrCtwznNfeApD +29BSAJhqwCt8F2AArm7PUy/gosc6Aq//l+dLyKsRvPP3IiT83YCzmupfEF+qc/paZTCEwsLV4+uA +jlv2xh4gCuR+2Z/l/h4crBc5E3/YNdud/iGhMVUALFdesHYT/LDh44YLpc3/GIyCNmU9gr5+eM8p +WAM+PY/FTp/NLuevKE6fS/wMXv2tqNhNDch+5EHui8CzSl7zkKqXPFDKpsR0+o3N0/WZUTYS/rTE +Mx3/HowsS0ajk24gNN/oFztMvUZPHHkfRi1SqPTOy8G0WdBhn6g24m1ZHs8NC6JaxYJMZ+msS1FR +XWp+5l+QziqgoLzjUSYmpm/yxhiSzyCF10wUBfNF2KxnSk1L5knqLAWmxaBn2PNmx0hU4zvyjrzz +GoIdGbqkzj73yQ/Ha5u6azgDS72s3LgiqCZgxZsY60PJbusJupMIkpDAdKtcPfqK4LaD0HTQ/wkD +MvEXCaZtSgY6nPpJspxrjTF9uLX7XtCHri7wRP6BZPGaHEGSTVlnn7SW4Qtrq0170PPiF/rYvLqy +U9rxqVA53YJLwK+MIx/jW+buO4MlX755lLZYABpNbQ40yRXe8vCaKZetOresO0oCdxjZ+nUI0ExB +WNgBwC4+vV4eBBdgncUzs61bRHC9OVCiQjPfvSBzApADa3dJ40uKUXLwcTBDZ7Pqn9bimD+sLvcc +FYIALt+HxRuWrBRK5rX7Go0vygDxx1fzyj3/sHcmeXL8UgenUwXScBDYTOJbsqYBfCOEFrI40sqH +DObY405FXkueV5fFuGU303ClwU+lL3t7i/6SgGcdLwBaeT75EmnNrlbKcvACgMx/l84ji8NYE4dD +rCMKRgh65zgiji+llBfILxzqJjoGq3HpxPupBnsqk9GvMarK3y4sXqY6vIwSR1W/oPQZ4GsXq4iZ +2EhJlg2eVNi5goOq2PSPv9vvOY1NPg5Np5CVhIw1qg+1WeHGfGhVDBT3LqA02u/gH81zJKy7xHxC +JO1QeWpfVw/q9lfyE0f+lwHwXWEdKKob7NgtnDFuizaIi/3wxkUn3aT3rIeUR4pGgRqHF/5plFeB +fzJxzMNiWXW/ID2j0cJn4zEItITz8a8VVCgWlpo6nugGDBvmhei3/7QEzyPEmSinSjOXBqt6t0hq +jHIP3LpXLzyxMMjB/h0jhFFF0vutP3F0pt3bzdxLIcbyF7hVxskkknGK23U25mQQungCFr4+pc7U +NxUh4y5yiiY0nXCE8JFHCDt/XoPTW7/IAq4WOwCOekp64mFG8YsdwWdVVIwjIMqWJVGyq/0q5H5I +cDKH5ztJ9nPujhDizhM+4rx39azrnsJv/PrJGXLb7UDboeysgeethu84ItWzAG7Xtv6zTP+pPDl1 +EX6Wx09ghdKzru0XGMuPjA+DC2UXezqjtndnVXLaTDiUg3KN4tl4WaCYcrwtEn/Be6ZlyhaNFYCB +zms1sAAZktQOk7eVf5c2+OywJZQZ2sKmDaIKgc5FGyLMkWqDYclngSNjriUtL5mOSFWpJlEHpwrg +6zFOSaAZ/dvKqFvYlgT9ubkk1GKOfMIxUR+anN5vERkpmWbbLovCFPTC1BrUupJYQAuyhznkHEG9 +p2Pj1SN5nKkFkxrgm8vdI3+xqCoME8gsMymQFSh4CZ79X4moApteHbeOL0xgRkG//7orOto34XYU +n8F9UifqjBXgCAwWNN+9KlojkvaQeQ1wTREHa/2Wi6RBuWvtWQ82yM0V6Q3NUwureuELs0Pu8X4A +QeHPY9yg6dI9gd7ikr7KhsA06sMhH8JfH/QYXJgu0COCgg2E9gmo7qq/HQtiP7qM7ZkUHt70CzVx +2tQwVdshgfOsWnao24c20erqvWi1nzYmp9NmghdHHNuqx93ue//+cbG7lyaS1oPqc2fiVjmt9Nhf +gFyxGX15jf8V2nIuOKMvFRPfHRDJia25oXdOUuZmpT9prqHKDLhkaBEK8kGdNNtdL/FuPPhhmL/N +3rqLY1m2rPj9eMawuewel4jcnVJ9WTbM1vMKwuqJkXmhwG4VMnbeQW0HnRdRJs1s0QzCW8MYl2Rl +k3v5GIXlo6QSFvHWsL8FCNhzoxHxcgFjL+cBD16ConH79ez2LX96PvfVFdTCTmuuryfRE1yOtSBO +yw8osze0H6/UlVxZpY6U48SlHRDwnjDA/KYqiSSyaz3Q/6KmmhbBd0SJ9oknhm/t7n9vxYqowqEH +bKhdOkCkLYSh/mi099Odbu6znIEMJrFCcDFx45Qa/l+c0QgykuR3Erjc1qR17EcEWmE75PURU1gK +L/JIJEIfFMIl/n/NYwrw5fV4DO7ZSDOlHyvPpGfeuy27wb00+NxT+7UEtmKkaGanW4Tx6R0P7U9Z +cAZmhHHQfA72LhdGEKgH447kSyfQgPQvvvgXTebltFLdBvJDzZUR6kZpvvCXXlCaUwhsVcmJjij1 +z0IIuVQVaA7tmuX/kM9HWj14DrDr8oqhpHN+IfXfZ30SHt0kF6MtQEgBk8qmcChO/0qHtv2+x6lT +UQWQE/pFKLTbLtBYdKZbDMl32yZTt+VkpRUkplwRo71xih0+4JSABgjPShugUFN03F5trdUG+uaI +2H2lBXfZ0DwUBYS56RPRujWv1yXH7jHRu/10f3xncAnX/CEmAOoJ1twCbuyrPI+cvEBlLcQUHhBY +ckekS1jSOqNn9+lUp/7mB8DMsEEkPH9xDKutK/bQGrMx8938aAvcxrs6QefiKvoQPZixnQZ3jjYy +svSLNU63puiLAz5+fI/f1lE/3FdV8QwMCIvUmpBHpY+YL0cA71+Kmznq2cKvIzz99uaiA5pQNQnN +342sdxEM5nS80cTRWw4qzImLHjdQ/nSnZTh2vb+7W+AmyHKwqhBCVVxkddsA322k3Di8rTdNDz+E +/LA2pXqNYOI0xfFvhPYqIUK5rVi9rb3CE0JTkf4hnTh8hqPjDAIw4WrMZIQrg6X1ZLWTJpt9b3Nw +aNDiocJ121cAksyt++tmPUWh0XOoHnqQyae8mjq/yxgbojAnvaGNcMaLejTJxesWupUldtmfjXBT +qlYwC71c2mNLfmIxf4lqieIlsVEefTp6mREG0TxkmqLDTM3uVGSQEdsdDuBUocbyDVdurLnmeykr +egqik2DR+W40fpe7uf14y3yTOqZwwWvFnoH2KogVGzXBxxRzvKvFWIxXAVapOak2mWoIkya9BLZb +ZwAZmORNbWmHYQeC5mU3r/KE3ELnmRlLbJnxmOtGPaLEAqHmS+jUuc2k+5WT1lV9hUNdna2BZ/PR +WnCXaaowPhFROOIFCNOXNiW2tPsmMYhzG8WOje7zyvJ4eQIinX+IDlOP8rYXFg94K7A/ZNZwn3zJ +ScbVD0BEnz+XfW0qpwzwm4TjeyR+uj82ceg+lPbIj6rbhPRFMoJWDQDPkbG2m4h0V4Pe114MeIrS +CynUfeqJZ8TELEyCqDFvnZQvwwQ3IHvoqp+uYu+GHoESNW80fRALBGdCOy88x4LeRYig61iIO2Gt +5R7HVtzKpfsiRHI8O/kzMo+WZzLaPTWVYPdongt/H+8bVP1wNPyeHkDjejNbMHZB0IgMN6/gwh3R +8qi/depgvAffC6fJTnG9W/7phESnESTlpuwjPWlZtzcAjqmOmoGSaLNBG+9FXhPBYo5PXiGl53OI +jTsHx3hrKYP7Q8b5oGx/rTfw//GFd+7A/XJiaX48xD+1YMWBLlgHJRpN8okumgJL1ZV7G5sRAhIN +hyAk1W2TvRFACqdYndFR7cEa+L1foKjqPijTpNAgmlJWZS9QTcrkt88SXM5nXJcElmy+kMwYlJUe +ANoi3s/47LSBTjGxFduXyNmU77kpu3caWz4hVH4VVrp014BL1+rEpdpzZOINKz4/O77mvDG2ocmO +yE2pb8zl4EP6WKDA/8Jqf6l5jS81iiS1iqTRzKK3Z7n/fTEMFsrDShbrnzewF3YpCpIzawy40M87 +n8zebkk1Atkopt97FfLtTFg1WJkavjLfNAIrbr/np3c+crFBcGW3JgGuG2a9mAp9yxtdo1xKimHq +gv0xT71jhEsv8x8A1oA3idQjUZUYtjVgvFMO7jGflejiryZLbxZKObiIHgKCzA4xJ4LL4/g6C4BD +HeNzmFb3kyP67iTa3U5K6EANRYtCiDFbAX8UU/BNWUzxID8pK54eFpPCjWozsr8YJSbKFTps4KH9 +Eq6Zh/f0A4Own1OyiUFzSGhn1jySvqnqZajsB8nr0C9GAqBM3Lc5rtvQDCvrA622XDeflDjWDFTS +aFiMM4kUs5+rbvxx44h0r+GySD09nZaQsN4JDZeHqn1luBCgGZqEmNpE95Bf6H0fPE0RXOJfnnCm +RrK2KVXMznjbXLXLJE39sc3kGYCyyEhlOJ3SmT2okazqZEjwp3bVlq+2trDonu5ib3ZqC5bmelV4 +XQjHQSBtYYYO7tNXrq3GaPzkzfoYHv1dUGJzfugBjKlt3GmlFCv+Ql0+QiVl5mJl+qAkbrpjdAQC +PzvnQYmsUY5/4A0CVfd1Of8fIxmN0r95yoj+Oif8kAxNy/xYKhbgayggFRH48MLuzlUDkGg2sfGv +65gIaaAAm2+iuF2kYq2ek7+g1fq8CA6Og5NhExCPpBF9c9K6jqie4x6Q98yqW9baV7fqB7bU8MVi +J3DLlYWgNVpIcEp5+2XLWXUxfPbQV/5/APys+Y4//++4goTo584ytL6evP+0n4vXby+pNW4e3g4i +oVvDGMsromwhn/PUZpdsmwCdUhjUG8PUZ0fakGTD4kkn8nof/oTksYq474vb/xM8Thl8V90n+dSg +JbWTFzNEARD3hFdz9oHWQXiSxQgHzBnsIIcG3s+2r9+Q1SaqvlfMSEKpmvKl7VNSoJMzgFk6sG42 +NZK5gAMdRedhAaimoSjSNCqaBL87X3BMIkQbLAvZrbgFNrzGNfUkMzmjBvRkDVf1tcCTOzMKOcCu +CWlFwyKIEHfQ6BZYgnsUV0LIcAKq1FBk2Z5xSV0gNOVdsw5S5Ezpe76FJgaR35+Xec8G5ABLGrqw +hi7q5/IE8AzVvlB0LyTU/TNi++LoCgPYbP09aSgqEqTZIJgHayyaLr44Z57Lz99vHeTxXn9n/kYD +tfus3d88eTKwujcS/KKetn/PVAcbIDLAuRQ6K7afh9hfxTDtV7wSYUkbUR1Sdt3/jeGAXSQkAo57 +nWtgy0nHXsHBT4FzQv2EpRyy2Oco5ag4pRl315P9FOI097fuCcpRPHlXLrcGBxUoVa2M7y6oMA3Z +iZkmejtOhJgL9HJTjEWqx882wTGnY1m2OohJ3dp+YrsEdCUFul/tyQT/L8iorWJYfocb0amHdeKM +W/J3ysy0L8V0ULdrncnQ9lD25QnPYbuOL4q22nKgacBa31Sew2xTB+1NMhPBkHZYO5l74T1iNoBT +h2LiG2MCz7rR1L6jctlD7oKPf6sO0xZf9ShGe3Is1RzaXLPvhsEjBN+gbZznEPVqyhRz9CxrwzZS +Wbk3Ws33oQCYt7Qmq3xoE9OxcTbtETim62CeHMiMlEMaOUufwt+zV9NlRt0FyFEmq0Kj+tkBgTKD +EDB6Tp5GIvOiKZN5xCgMPFsJr3dk2gfp8YdMd1rbnLfR8FDnFEj7ZqY1wsL8DCHuv2fiJL9RhuNJ +wPcuD3KUXao2MiK74l/JHwWEKwlrKCes1+EkOuDQTOXBOA4Xdc30GB/LX9olCXSLrBGemWH7+Dwg +l0cvQOye7nBeUsBdzoi48KUJQzPNtv0i27fsaqvmuazUqM6Jhrw3CEVlCWz2vt/eRTmMSate835C +2mjmnFO7P7dAXwpkXXTCUxB8HRepDZwn9CTauFPZ4IxlCwwlnR2J82q/+SvLetqV4J8N4lu+p09m +uU4cKlrM4DQBfQTJp4PDdZ/4jNVfRqImOILxE/MjUTDzDsVgIfREkTfbyYUYO6vMyJsly5zfngc2 +mi/OOTIa5uKYVcoiPlDXBKNCUtg96olsKthdyRXbDeQ5+3Wir147gUNb6wPGFCOxUiEa1GU7obHx +RbUbqRbFCyy1CNC8H64yca0b2byutL8FqeP97ooh7xSaKSJKH5gIP+h8LyO+BgW02S7ARN16eqTL +N9xi6REqD3yXJQECop4ICn2iVBOv01r5DHC4YHcag2s0XuNTAtAex82iBZ9EPZMrIBRvvVrkT1vP +r+ppeZdFyqR1U7NoQV4mMHmdO0xLzi6zcE4XPa2bnjG/dgNsaYKGwWF+movj5/0LzpXzCmCQRbmY +ZTet8gnSCFQuM+xMxgw8gZed0YdsbkglPuXLf/F9QYVscg7k/BRalo99790LdBnvBhreVkQIt/Xx +vxUWSv4xotDVapbVCVOKZW2sOhKGG8RRZrP7Wbzm28A7ycNOuSVkMqvCLjMUuS2IJjdES3pZ6COo +WgAcCp+47UhtqyuWlPVCL7ciQpx50LJ9eDXse/ERDdsDrReOmNejmzNuXAR+YnYpGYQ1sSq2GCli +rbcw8eU2Wsrp0ceiqodo7wwjo1KUpoY4dAi46Rk8ICylB2J70tUwrZgW1WhcIQdgliKYMUReDrv/ +GF0rJ0cdUV/rfJLMjpKWQoaRLUpv5G/EF5IKorQ7v9LbgIQKYwJhZQRYA1N5rhIrrv9wIz/rFg3H ++KCtQ3m0fe9xWv0xFOLApDBwa7vXDwYRCsVPQEw77Y+4I/3hvvJzzWOn8SApewiGQZS7YhRrV4vD +B9FwBrO+g3vzuUlZ4Z/CkddH7WJcxi/lW/VxBSjCAP/DG4AyLYUbNm42ck2jgGKZHfqEq46mr/0+ +JZyRGyNNizZvAYQFsQmpBtqZODO2HHf3FvK8GIg7ppqu1qHhMC8ATaPpPIKf5s/hmD8Bt+b5yOki +2Hl/iT7XdRYb/ry5DfqnPGIwgJDAAJ3CLuUkQHlMm+e/G0aCdUkkm1qassF8nnr/e7jwXLdw+GtC +GThSL9g7i7nUfDAOTqU6Ydw4cRhsu/XleORKRU5DlRpfTGVhWEYF9rHFofVeW2FXs+GvxqG3o3wr +MrF/QiCf8OZBy20NyqUxI8vZYlU8eCKTJh4urxMuIc9gzJFqEAwaE8TxOXlaYAUE/oLDRD4+MTyV +8UJsbsEfn+AorD6QSogR1OemZErQe4gdGqK9zVoq0RsEJPc+B4Yo75EY8HVmrCrIh3pkUD3POLrx +jzc54ymsVUofH6p25Ye3WFRp62io8Pw4z2OgiwE8Mqu/ZAIeo+w42YFcH22aGdTyX8mDtKM5u3tl +dSBnuTSX+PkFh5jcbslDB3a2JA4o4SxPdkjS1pdk91XzvUHJmpMgFcx+YTzzM/7PJPLvjaU8K0NA +h8bc7MU5/nit0L3iCoLJFw0jbrBnyfSaoMe6OaqfEdfbUcl2UavVUtWcyOCyhAK2OvJL/BdpDhC3 +duGQVum/Q41OJJvWwHjVRxp2XEE3hGPWveUmEHfyvWz/JYp+TUkvwUhdCCpY+oMrt9O/DhlZrPkH +z6ntrdpxbNumQhy1KGmT3pviesqsPR2YG+DRXVuiOFtFfalaQL6yvKERGnn8aMW2vgqk78+h/ir3 +tR/LX+d6vbjyOARzLpOpqcpLhz8CwRyZf9th3nabuVYQk+914d6VYCX/4E3yJkAcg4sp3wZS6MFQ +XaeSaVa/jXXcUYoghJsoa/IYvOm945CWVzbMtAKU+OCsMvQ2zOg62vphzSwO+abYOyENiGFNuXSW +sbFzD6edXGvLFO8bbWlHHRZv9dKiDJR8dBzoBNw0JkL9pvElosFpCMM9T33QLC58B9c1BPkwA/v7 +iZ665+gbcuB9Z3lz5BgA2VJF5uv7j3xA0FY94O8JBwIBavU18oTQrtodBmycg7Zn1UphU6gzosQh +WHHx70SHxrtN+x8IT2gskRJwUA4AkCviVYi8uQK7n+BvSh0Ivxc0IQ3oYnOzaJ6rUKN/CRBnADcL +1YKk2u8A5c0PX2cEGj9ipbOOj/v1ItDwmTkPyAzRKJ9Bf3ipoeM78aYT6n3Edj6n7NdkmOviXb/E +8Tn3gu8EzBdxPIpxMtTNDaAax7VlGIdEdWbHxx4tWK1oSmhX31TbbwHdXfzhr65dD9VqzVgF+B/0 +TPsXv2zKWHe3rE7X7fwpEl0/JVUPlgFCTQgG6QVJ56/jqcRYwNL2dGnYyh7/+vuwcp4+BXLBG1PF +gu8PnIQr5S6K8YyDpX1zuS5sTsRRyP7ujMqHZ2qHfh/j2vBgLipO5/CxLodgaROtKGNH0WEY1mA+ +MawmThRBmyOC01xhhmgwDGVHaF/dZyCRzvh4QYRdmjllR2hEaanwBItkPa+QyyofxWnUhrlro81q +WwGr3wgY2LkZq9EBs6lcqjux6jEs+DMOBbQCqoLBUuAt7rXfk0rfvumnR7MXRiBTAHzH9AcE78Ao +nmgEPArFh9tZqu97icSlJw/2FQdNh8QJhWvWRwj7viBDXh5w1QCzDOO72CJa0m4DMv9faywcxn/x +GLV+T8tU/5GnaKI8Abe16GzUA6AYtV6NjPAWi4ayGlUr3DWLxbgbYuUE38MG2ifl+vPGqnRAC2Z9 +Gy1jFA52CJjTDBDLSdOdELL0YUeafAFVpVqzQUVN/xi/v534axK+vLwAK/NPXwkqSN/aM01y/iwV +qZUaYpr5CSqU4Kdwai4vuf/gISVQQ0Rk5CcqGBPUwfU0TNhqQ8xNaei77tx6KRbkIzm2vrR8tpUS +rBnqAVoOQk+nMDSVXMnqgwWhyGs7fEdjwfTYGIfUUF/ZBlm31TskLMljOTx1I1++p6NclMMV4fpl +RBcCOlpCeYcfYcN4IG89jU/ZVVDArm0L5Nj6+MGQyYYaLiT2SJZqu6rCZU0oV0yXCtBC98KQeyf2 +FoPrmF+tNzjyx1Vsg+gsICbv0sqJNxJvfGCuHOiBtHOHL+JNCscoirkfI7BrU9QDVBQ434bk/lQv +uboCOZjCuFit/qirrABo6/FrENoH0Xy0ED13ev6glzofdEFgHxIaFUHbWnu0R3JEw0FnPBfyMO0/ +JcwB5VBfeHab0ASx4KX5P8g+Rx4512A9RjLZ0ZdYUyyHQp1k4q5brtSYmRfE830X3ss5v3FfFl3y +8JEl4HSsNLT5v3/9v7Iab3iTnMlGY59zTLTPng7Dlhy6/uxt3Efc54Vsxrw4unwoflllKwWK+MHp +Zsc+xSOB+Ubwr9sOF+/i2iKx0EjBJmIE/Kn2YGaf/r4xFBnAIdlJ/e5REYVsvTOsGqjhD+7+G/Pt +lMrbHSGwLSlkXepXp4At1YSbFQLMlVnoapGg5JMVN41dEiW/kV2LK4WBZaCyJ1dcOg3pD//uVvM6 +z3Gs3lfeMwg5L0iYbCKRD1Sz/9gCM2VQVkUVPbUGUDC9HrElqHNUTTnbWgkewGuLIfHdNb1Z/jbd +fjSfnquttxHTifwEaKEytccq34QcDTW36h9ErzyY2nsbxbmseghnQ2OBz5oguneBfdz/K7vewgfM +lN41i2MEBIzTVb6p6vOp3yyBmQEE7strGvvbxrK+D1a/O3GmGSSA/ZlKGracPSHWtKtUIQLOrCXo +F1bsWjoDcMQIRrmDk4tcnKgN5bliyU4wzz1oE6zlLZz8p5ug2137A8j9uSpX6iAOvaa+PX8gIgGY +IQ09xq0RkjqqtS0KGtQByQ0mxnZc6oNUysYPg041BzFrGXDI07VC4D47EVwNdHtVARcG/LxRbSWl +6BYSt9g6dlFn4HD6MfBDPSa0hWPjMoZSe8qQFbJn94SwPIGCCw+ysmAAzuCXW7w13WSU54VgQMNH +04acMrpUH6sO+Pf5WPkYJQJrwdkd4ATH5ibEfUAdwOVyh4wfpczI7gsJCCNZ7VHxEffzy/0gv2nH +h1VuBb23szN6I+qa3geuQ7KZPTfSJ7MmmI6/EGj8zp07y8d4p7NhaOg61MGMKcZN3Fy25yxu6MM3 +1Es+Jla2k9p0bHn5wLGwEAhCcR6ZE9gSTpQd+VvBh3fINsJjiPxz2cpAiEVAKVDcRO7sKiGTlCSr +V6lKCgW20kKh9S3WxI6TJzmE/ZtDXJbQxfvIVbqQe8ze4wgrXjp19q4fRVpmw2W+5uNLiDS6Ohlm +OlHHCeAw2Mov3mHtnBfCoTjBXFeV/6STgsi4i3qT3qofzgwZ0g2be/eS2YfHpt2i5wYr3ExOhPI/ +x5FKjHmkHPixhABn/G7dLIdvCekTajWiJECFv8aXwCzS5ofNI6UTlzzgQcYEQGDj9gMJaMrxPy1j +Lr11VQkvJU6YerbjV+lzmSWn/8QNea6Y+mvBe4ZMq4Ad8vegcT11SgJLZ/1PPSwrH6uktLgohhPO +3oLg3wzAn/oCIn/JEP3eBKRRpa7764BZGay3ES4JKGlHvQG+XF4xZQtN0m8Lp8kGH4K/9YnNdwXl +7lrxaArfhgW2Aydbar32hQYWJCFxGd8JCkkI7BUHcMfU7vqkId87JlEOmlQKitS74xE/pSWu+BV6 +Wr1IadzwaFs2pgWa/g4ZO5vE4y73QW0XeenDUoGz5/AoPHJV8njDbHagB9MR67HsNBbjRVtiME3l +r1me+aNLfh05uJV6OZEPb3BvDX+3FKr5L26dZn/0522hV6uX8QdwaeWmVkoqXMgaR9b2TcR+di4U +Uw9elZMyFI7BnVmV51MuS5wMrQ/73spCvzCrboWYMp0gFfIQy+BxINa6647Q1Heau+uaA0Vcph7V +hkmzycj0UwYbCbzj/kW8AuRfsOqry3mCDtPwnRKgX8/uNOXu/Cvp+j5F5hlFc3AGP4zZgkoMNs5C +2iglIxPXb61etYUQbWUV1At3GmoJEtRFjXKGsYgF5Znw0jLI89oRCzwkpub9+VesGPNVpF/sSTXm +5cjSunUGOn0KStD2XIBTemlYYAoXv2aUL4HdN92ZYZIIuQ/m2b+G138DO0efff4m2laHFLKDornq +z/FUxTI+Ht4Zpb5GEMeGUYtCUJR9wg6YlufcTbgGng5Hn7oW4uOc8hchuxcPSyj4Wbe2Rhy2tZdf +Dn848p+N/hBBakwRErc6wrrKW7UTqjB6McTC6SB7GOmTFY6G1e0svU35PMBuqXo9zUOBb9hzdpuq +K3dVaWvSJyEUviLpImRBEd1hdnZsWIQBtIUcyGrgkh4GaW7Dz3Y4KNnK4bux2ce4cZWjFfkJHKr9 +BuVZiiWGvbpzEOaKtGnG2ACf4W84T5nYXIVmpiQYaY8AT5WdhmmmEKq46tWdPlrtgDTF6JRhd9Lo +2WENUAXBPyuOoHio1+yT4F+xzS2C+s4bA+jLXE5W5NQuvXvMLGGvMUHyjK2PXLpGUsuEeB+/Oaw6 +MhHinqPnP4ZbJhYk873xnRRMyPypo1XESb/i9V0sbSEPIcnGG7phYCzOFtfSiwH+3adH5tdjYT/H +abGvtNKuV37fV08ec/97VtkssAvsnMJmGbQhUrKx16D0cSBfpZJZ6nYbeIRyCa87ZZC/ZuylAkUl +HD/PQFF0UypuhxJ2Z3GUmVZ/hpFiiYo3y1w8BOi3z29YHshCSGfu03VkZ4QoqQUwleOav8GWMsyE +gv2NNhrY36GZVJXgZDyyjk9Td6ZVYtznHRNt9vO6qjQo56jqN2Y+SMvkiZVFT9JHItwgGxAubixI +MJjyhMhhyo+M1yB3juTxO3GGiZYRGE3SDxI4DNhY4aGXcmZxw3H2fys9Q0KTxqIlGwhFymnYWf12 +pcYIsVRdQAW9ECNukT2MAIuz6Pohv77C5Y5DLLtWsHY0NQvKtAl1JwMf2r7mLuwpjMJaFysaDpyM +Zmt0de4Vk8QnA5DMda8oqdBzTb3HryhoWJPXUsGajqbVPYbOvFcV3HloBYp9HXP1r31ZPC8oeFIy +j10bgCwRifGcFxUTAdNvOtT1FTKq/TOPUDXX0rvz7T7ArGUP370QNYGKSpqT7Yl/v59MW19aKwa2 +vUn900UX2+WahpQgnFY0/V6DfMmlelfjjhuHSnfTRkLwipiwR4Qx9TCibWJW3mQWe/5YhQvaeyhz +MCsMJ1eGSBLo0+oQ3jGE1X61WMzvX9Rbt6mhM7rmNTxT1UfCYLKbt7ZiKAKGRCMw9wlXq9bnZG9e +zKVMDZn0YSpAi+YJW7jK71djDIeQcXykQLyyUUI8wIA2MV5eWMhwQ8wQwPHvaAUBTkVq8Z2ONYUT +u7qVu/cQT0PDRPEnoirNoxP1rzSL2qeBhElkbbRgTlxiW0D+dcFAYNXWLEvbmPc6BFSQYpAA3m5d +mmIQZp0p6f1YGtNDFJY0hHJdYwP8PKTS+a6kWux6obe7ItrvZpv8AfkH6h8WtK+QgsXi1kNSp+J0 +bLk6CXp11b780L8wukpR8jH60MUU++vM05ZwdlC+kiGDGue3pJMpv5EBHf5OG7L4T67Aga1AOM++ +Ob03ked4HTGGZ85gGgqV2WftgICRQbla4DBy8jWv6aH1d7/JRk9CVT61HjeaNZXGPFejyFe5s8eb +rvQiNxIdCKEDccyQ+PJjIJ6wGWa0rG2KGrUqXb7kf7Va9Qe3tJgavRosrIaohzXnhsK3zDrxCM5G +pmqPc4d0ChVdjJaj4RFn+TH7UAlj3QD2ZfpzI5mMGo8MlGaMbXCXP7DIOw3DRpMWoCTZO+Oq3B89 +ck/F1/4eIdSnu3mBTmVmjFXQkJvZcxckq6EaSeVSnbUpzJoQeEPnneShs6wY2AkenEgIX71QZAWC +mD2yU7dchqIWXM5mzK0dh+tlvoJ6YJ89XxgwL4VsMcquc2lbegS+LYaY2FARXQr+8PiEk2c4d3Q2 +J92Y5OWGwWU73vV/xJygybFfKsf2joGBaD/jYkswhcvRWEd6vtG2C7AuX9DCAIkziXLPmb/2ESql +eaKvD4gNBrto+EdZ9A0NUG3ohRgyXs2NQqoviH+uxrWsYQPNFqNNDMjHI51G9hvXcPOxzj3jsLyC +oE64A65Bm/sYn4+9UzJgVHFZl+S9hotdBXM+IfS1vNAbMNNuV0dhXEk672Y0RiLWlKgvuyujdeS1 +cLcN+G8JiwIh6FDpWZyuRlKaJz7QroTwoKARQw6As702ytGhcqf9AJHjzJHTp+5ELqjcj8KX7Yww +XiRMAsZKzSnVYeSPOUU/Byj+HXzB5yZWUtabfb1sXbKsVzseFHVZfgJW6wB5hzlwYUKW7reUO6vo +YnI+XKgwUoDMRXntDehGUjIra94Rv9qgSu8iagvGJXOvDZ2dWmtrbniiyC7rNx12raH6VIxqQRHK +4WVBrDD401n9bet1fwb1eEOhGYZisOLxmc+25ZyIsX+KhJDk2NGhetfKYVRYQwBWRC3x5o8bGC48 +LbSgfR28d2cEVawohy5F0VDKaQS81Hf/7G+Yj4q+T5shKJiH+0Tsn0+Y0kKpTJpY8RaUVOqTx3k7 +A4i4jHVPkgK8LhtVHdH53xJqOwVTNBTl0Poqi5802Wcn5FybbOH0cNJP2I3p0PyIFxfQGiAvsy1E +hdrKREIBSoZYb7b/7I/oUSEjoeRaWpxBoh8OwQM269wxvhQI2pmLkdbrbGUJERSiqIEJLmlFBX6m +yY87HGMTh7RtqJcdpCCWo+BNcsPiEDQjUzPeZVKDCrCNkJfjaZ3wRzbzePQ69nL4u/a1FYvS6OcJ +WWYBnOFAHDWwcgzQxkdb6RhSRCubOHDws2k33s0h/vKqbvpb/QMxKrDMSYootZmsAKPV14RmEL6G +7B/1Vw2yc9jl6prTjezfVXSJJVk4Au/3yklZ+a/wMzUmRkosANUkAygOPHKPganj0i3/KYMXzFkX +aYbr3Ytp8WlptmOAFGDLio7FYNQ432y1islDJpNYO4/Am/G9YSrvugpo2sB6ELxhSwgBwfjfggCu +DP+mQyFg8r+ZYSqlG9zHoiAGg6tg17aDFtJ5KtysQASFAu2Z5JaEeDg9oqf7kx/9raqRXrt4VUdw +5M0JZvR9dnIu2KlkBqsX1Om/sGgu2RxbqgGp+2g0ZjlWnrqC5QTskojdqMwMTozG7O4zplcRKzxo +01Fe1TH0oXStA23fsEGH8tPWSP9Q27ppDD1x52j2ulh/G/RMnzKk5tAq9vl6zgEbmW7q+41g8b/x +F2fZogV+tiIlc9mIgxp/p8e2/zDvLAIubnAjtg+dmKUwL5CiiQgtdRqloekX5StJ24ReoQHPp6Zl +dxaSXB8Bx4xZEQoHGBz97xIvf80aFzT/hkQ/+oZ2V1E+nXxRN1CRAMunIZ6V8I3FzQz9ujqJkdZ4 +WOCXiicRxXNeA5f7rKHR3jAaO43X5eJIfktp4ogFp/V+1pWuj8/PRhGgnSlRgcskmaTpEpSSNpha +YbYzyoiOhMYrqGw8sLdE+RPgICIAUIFNk1P1otaMTXCkXW9RjReCD9Avr2s7j7U6pPJQeoiYuv2J +h9bkIsiiQlu5E0018VRyyv4+en9MloSGn0osqWtxXdEQFlnqVWXE5GoTjFGVFPC6GBIpXXvYJpMT +qmLDX1uDfm0eQTWcM0RlpCMKRHXa/OyoY/BoUjJyWrfAGMF0FosFM35J8A6xsf9rArZCFBRsIcL3 +m0x2z5LclbyROs/uRrusEsLaSrAscD1ZBIPVmhJ30rE6qPOkyXjRbwvHYW/WkDmqkucNC8O84RGD +QG3p7ymI5UVGw8za1wUbgrlb3S+8Y36p9R08Up6EY17OI9jvk1Qi+dn2UffcQnh8NvvN/3kK7DIk +1lj/fjyRYNxH938Zl13LpfVZyS/ruqxOqga5OFz3C9kTKc2PUJNLTUoy5LNUOOXpFaZK1394yXow +MhgMP2Vsswodh0dyiqEpSEBvUN9BnJ2GVDDZXzpBnqAI6+EMP2MNtw08bJf2sFb5KA9yskek6B4B +YqXcB54RyuccpwfXkmRl1I/m7ywI4YQvqvv9fQAEgwCJtstJdKZ0XGthj/7tjrQ2T7JmaKtpUgTu +w+KmmWN9SjnL8gU5nPe7AzANzhmzMHIxFQo8e+JKXT5ldBCPK/0RTcQbHvl92cSHU8La3c8nslNL +leectnIjy2ppzxcMbzYxZPLM5axNdi4c6cqnY8fMSFO6n0pdWwynTPsygLNm8llSFtJUWOOVaj+d +wFeVqBr0U/FgypbrQqXrswo9CwXIIHXNaFlFzV69XWV82dA9sYG7BaAqsTMWMa0qrWfgm3WCiNlI +ZOs0bfQ/L8W/9gqi9Yb55oqQmKXdBTnI2/hjpMY1qJiwt6PID2dFjHLldkrlD+ht5ipOV50s+ej5 +tVea1yqpBfjF/vFK5l2I3gbBfyqYFzwSK3ajBY8FRdS0GIfaYaw3e56XJ0EYk9qIesmaJlMsH+eG +VQ7/uGMyqMRn/J5xm6DThTr203mU8/hwYZNBC1a3fUmUcqXbL85XZp+Flo/rUojwucuu4dscIMvA +E09KZhusotFBEwBbxaP92kcMeBNf4iAlneWm1H7l2lTT6ZgV1hRiN9QKYfLwrx45QDr3UQgPEzap +eILFPjwEeK0ZgSfhktWX6MnwBEiJ9JggeFX5svDpsVDkh4NoevztzcvnhFLvKevNTyTPcF/bFTwl +nhYn+LokMG3/hh/szGA3Pd72iohYa9/VrQFdFpkPhiCYYqhhAakEEUv/H4f06G/c+O6aH7ifA7cr +nrsav5fbmdKwyCLZHRJGC8R6LRDmsRbbXwPGKJn9Yc105InzeoKSELqgy6MvcXXTqiBqs+hySjtW +R9abHxgxltFIFA6Lv0lZ0UQN+hkycAVdsBMVEBEM5l437NTE0rC8jWrdoGbxTVnhocMUFwbg/5UE +GrY4RZoz5qxUkTx62GkrjXJW/g6D7DuqLcqinu+3BWt5cBKS1BuWnCEwjxiXedbw6bZRdgJrdFsW +7VkDYgNLA1mmc3BjGeg2/4655BE9vH0HrygdbALStVqbdHyYrNQI1F4P8/iNIFTG1m3xEs2TZawd +YCVE9Gr5kkiSjiSgQv166LtvmIuYPYRkgp4B0WG+ixj6+S3AEau8C6s1toGVwOD2teTE1K3TPtKY +KKWPflQ9le/UsDQOeQIoBjuausZo7Tmp9g+5iVSddacivtbIVKxbaeMMma2+sqfXjBacmoqdywk9 +jbd1xc4v9O8miE4NHHvHxd7Zrc47Q0l3W7895WuDOygZzQ7CMN1Lpu4WulJuFDKycBEnRloAQKDl +ifBjwSugCS6TaiLxTnDXSw21kQUM2RQmwlhC0UfI/ggS5qBX65Bd5BugT62RbnIzdiM2NmqJ2Aix +iKtucWbsyG6jH3Ndk8TlBs+pavKrK9nuCqEKn0B3sFNd6UHrTSC+Cgvbs1YZ3Hn+6Pcd1Lc+G8Nz +dCgdCISpHEpyOKRUfLRR5N8onSRTqPBGUU9I9oQhfuCwK7SYBUQrgbVLhrCg5o15K3xhZMKPB1Mi +sfXWIF8ApNgSEJ8ZDYEyrcmImkfxp1J8X1A7e4Czoo9u39hJGk7Sy75GzHhHyreFKuSjuWUL0uqg +ic/nnXQ4LCMwxnjpstwEliHiYkPLX0lnYJU4R+BiPtoUwiImmZ9Zt3UTCpxhCsZsfyl9fbZ5KlZD +yfO+kP1S+hEtMovRhvV+3F6SLGuSFGWwbRRrd20/Pr3u9AcNhX1e4CqPoPKlTiMhW06hLvKdCe+b +JFuPbmASLY0f/EzsNTgzMQnJ02F3pHCqkx9uzyt8H9PI34ZRduUZjzSP0QbVgvMVL9k/EePConjj +n2Ks5c+d5uKxrLhbK7My0SUF7hbYb6yR9t3Ptkhigad8CdScVuzy0JDon19jk1g6ejxlF1fuzMpQ +o6FGdWXYroH3cov2UBeDbzk5XK0Qwlptvj7PzfEAWYT/cmc7mwGlGakK10p7fr9EIdZMsfb04f+s +e1TaZZI9Tq/RAud03wp8emtKNXIxw+ZP7Ozxs9+YQAtWeIQzLxjns2WRxWDJRBUQWleNTUP0w3o3 +TqCnTNBXZ36810GKwjqztpjCsOqjm+JzpRPCzGj5Frp4JfRsw+lSu3RdIJUUqXgyQjNR69cAGvlD +vwtNbRjineqnJ7o+eA28UW04kn48Ba1hNnWh1f+TbJdwU0V5vt3mMl7e0eqWla5yYfPNtAJEb9lU +g6R+J0Q/IYFkxD0hdYvEqPkwojNtnQ4SWHPU0hX2VwSMcNjP2CI8oVYZTTPXjV6biPFT0ksceZLJ +bMynA0XiWuwN/VO0C9lJsHcBkLYTAdJ9ndZltcWs9KoxQmUmCESSYvyFVskSep2xPEqObqbCIReA +A6xNuL1mAaI7GE/excwgTdPgOSHYkpdU3nrNlFkPgLHEhfeDFbbLt7F+OhJK1GOcifLyOtRrSgxs +O0QrClmS2WvohXhgQj51zm4LwkRIJf0PTLB4l3s6VKxaEIlmX08YAK3gBQ49JTbrellQ/0K3lQGA +dfxR+E5GC2D9AKxZ/OaEbK3tcwe8W5VYRIhoe/UM8zm605XopNNViP08lrYG42sR+gqd1aZ9a5vN +Vec1NMlo/8BVqjDi0+qbZ3niuxK9R++No9nP2fyrznUzXhu9k6onCfccM8BuiYMnNoDLo1QEuR8P +n66cYVD8oFwVVcV99p7KNjkmvWRbbjh3ZI9z/Pn22vunyUoSMjlwHrqV1jKv+Rh5MJG0E712Z4e/ +vtZ/tb3MTQTxIoPId1URCuxYU9UmyGrK7ldPvMRKLicNp5tomIJf8pVyFeZHUmijPzErTSlyXQTg +GSHwaINT6EUOacNEBg6rzB/4GPqLH9K4pr2utFe9QbcDlKItP/XTtTKv2EDsdkcX0sHTfdNvl6y/ +WK9aT+NyHclRUdme0FX//CK6yrXrSiMcftthtrDI3T0hyaj88LjNe1bPUomTaiuQ/YfD+e1/Eorx +vNfMDmfMoHBUZtmzmR5fLmMjksfWIsmvhGsrt2WSmW4urMyQKW+EISzNYNGAY+GNic7muDzALirL +xoS55U9Ml73syWbkbY7SFxbzmSG2N5h1wA51aFp9OydpyCLztrHudE8GuD7lXt1DHdt52/axxvXt +QulG6p1Tv6SRXGDu/9RDttjNHPh4KhdY3JUeXZ9/q+yTouNq3NhcZCy2FUWc5YM33ujkZWZo231b +iJYfY0M+2QEhTaEebh7T2fbMdNwMI8YlwqeQ1Sr2EkSLVU/h+E/jhT9zG2XoLAjIENUqvRUzk1ED +RzuU/YtEOeXb7xoj2YmrhoM30pA/8SsaIO9EJejTU0DJCPXWQUq1YUNPXZyYEzqin5z9//1mXBuZ +KmA3DhMRdU5lUKMefja1URHv2udeTqXvgTDNsxjWt5QYZzMamkl7Qk8dcsdesG5isdP64nbC5Ljd +JXQ8SD7BuOokRTUK1+5cJbc8ixSEJCWUWmq/0owKJkj6zKVxeGF+Mb+AUYX3+F6etOnE3yVqjwWy +u7NT6v9F/s99FDpWd1OqrPmb24z+H6jO0ufimJCFId0GmSH4gyDzIvHm7BvhZS5i1wh+Ok9uAS+p +nQRW4EHqaVz0tNU2D+iEP0WO59cZYsdg4IeoOMFQtQedHS0bZVNa0u0ObWO5806jM/sbEUCBDY5V +EyiY+Y2+Hs7s7SqksIjb+u7m2AaR62zbyCmHs3kR44WhPaZ4fuLe18+iffwzhey9S9tTnzgEhbn9 +maQhNR7bvUTI31PEwz/00QhuU0TZ5VzTXYZDG1L0bepG5jVODeOH3h1VTnBRV4ypv/VepZORiRcd +hCCfpORBhxxTX3p9u6s7dIFEW99urzlJ+AEJsGyM+tlxTZ4pMV6L/mxh7JmrAbpINxOxQMSvG+kL +ogifgNfUPw5RxjQWhUdQfS0A0aiqe1khaxZJUcK1ghRzHSYbf0mqHLic3Pe2ZRLP7+rNFTaB8FHZ +JkhujSB6ydadlwW8gUThMFQpav6OZn3ncIrr197PU26juQJXsARPp/6a8Js/LE4ZF4JsvC9DxLDJ +q0gBXvUDXp1K3FMtsEeaJn5pdzM2g6APaxvaIk3h79Sz17RQyHZONoUEuvdWmBIOVu2j1FxKKuj/ +WxuYJZ6GNSj7KEmTqGT+lwaMROLSQRyz41lhipB+14oDAQPH2LKLkNtKrxYgDcg3NxXoxsfoEfIJ +doBDkHmf/aq/wMlMUh2QKaA2G5JWs3vxEkH39tn3Wc+QiW8zxqDbrIg5iIk9MpZ1Klx+MormC5uR +PyqmpD8jNRBYMlzB523rbQi3N/mrLN7gyRytI7Mhcc0leNieM413QxtLqUc5vfWPYWRVfuykJSXo +Jae5YAgC73OyKH08+XIrAOs7RmcWOLTXZ07Id19BV6CAWmZL+AmPpwxJhdTq2vdiOWvZ7ubwkuHC +FtmN1Tc4/bhrzb+5ga0xcS692mFi1F5+xP8OcFL8QTM3+qmx5HJXPnZtUenUhUkTQnAVoAXC+WO0 +zXRUALr/rtgOd/DuyFpFR4BHefH3vMRKlYV2dgbwHUq7ZeGxnK85fomQaRFlxhR6qjpzhRD/c3/B +SbBTo684s71boRpaPX25o5voVZdedUiAMZpJSYUJwZbOav1BDeTetge7N+5Hz+Di2DEDKFx+YFM5 +USjhd3HcwE1ZIIZvBNpEDXs69Lkunif73bfl3crywN19Z4KrH6PiyCNJ49eY07yjMhm9Rr4huxuE +zaas7WbEMi93KHoSQhhn/D5o7sF0VlX0ODJc5+6D16MlxRDs3GMv2W4VLSFYw8x9UnHU7EKNIDTl +m+JhnjCL2+O88w9ypxY4l515OeUgIzpO9kcQk9u6TzIgFMWEuGt9lt1nTYTpf29FqJ4nX1DxB2Gn +pYGwjQnCKYAnEGgYxB462q+NC12i6vjJ4mMN/oUemb/NvfWlkTUbc/enGrcIEgD9DfWZkkWFnUXw +7o4FoIvkztfC4jUNF26O9J/IrYYEMzTGX3R8v+3yC9xsGDW0MNCPbRkdNpj+clVcbW1IP+LNjZen +C2DRaU23B57Pr57TpEl3OSnPZKyvbVnbTRacvcvEAUIArP7vWngUgWsVDy624+cPqWiscnyexwv0 +UAZP0VH72jP4sB4BFLd1N4wQoO8v4V/5EfCdikVlYx6KQF8CKE+Sm42LLg+nppX1PI+HaXwuIRKq +R9TEz/AgWuHcsflF1TmYS0PrdGNS6yR/xsUIpm3LyfiRSP8//gfuiAeRLNWnkHItkuHopreKl3Ul +/p4QBl0k/kgmZGa76p6DmsocDQJFfvgmkmkJT5UBWUvyc2OXp1zYFUZegjAPo8E3YlDff7ZpAX1o +rsXsNhDYasurj5typR1J28ahWn4lGiC5LTWr9+es51GRwqSHxdae71OUnj3N+BA4KK7rvMMtaW3m +0rN4LmLWx7cPCkRwSyYc50OzT+ZM0Hrgfy5t7+GllqwF2HcL+QJtcwj3Sy9313J69eVrPM1KHq2m +TtY2Z3mc8YAFx5CrnS9E84Fr0kwxAmafqUUh5pguhXCEAvzbph/zA0MBQvXQevlyZ7q9+0V/rjQV +KyFgxQB+jXyh46wOJrTFDRFLRyATGmGSwugJ36MFVfFiRprwHeMeT0XtxZJ6e2iTRlpWMtOYfnby +L4L/h3dI40J3/YsK1GfLRYobVA5qv/6knScpO4IKCwnVC1RwLb5qa4WNTs+zSsD6QjcFPxemVSGf +aD4gzaE44uE8pHvHiiP2gzBQi8MjMuLmU7P2MYpXVHq7O3tvPSbyXjXAVY7lfFIPwONjzdmb5AyD +tvVNeGob5H8F+0XSNxkNyS0GQY782dQGAiMPsiQ+Qk2cMa+BoiKZYc/Dkj9dAK/oqnRezJUjn4OE +wggI4xefLTti4O5hb5oeVra/0pOZ2p5S19r72JcduJVUIzY8K8mpHUWmiZYrr2/qnmg4l8ps4Xer +SRL177PwRZscfhF9guvCOGPRgraxeOZdduRgRqr9J3K0sNrGQShbqQZVKeZ6TVyUdihdM2wv8Lzp +7v4N0+GfmRxkWqDS7z12qj6oX/UyKfPs4kGq69LmClkZmXXbC6e4YapqQlI4UlkYswCgDtBKeuuH +Cxr4bPLhuDiKreSHgIFbOfBkFxD53KO54qHU4XQDZcKvMTp1XsUyGji7oVi1d/1lolRmKB92QaqF +E6VdB4ZGdCnp5ztBTF5QDcX/lNtlZel8RGeLDzZ5cCBasXkUhC3JcrEsSM7kmJy5he4mJY56QTT/ +FbcQIhj10WhEK6b41LvG023WPXb49yTwqo5XkE9k4s6ri85Pmh+++QxFnda9lujgxA4nanS1yaon +A1kFDt/yOpKTIPEXwXQW4gdfqK7vpVyLa/Ffxdw1zDJjRli6K7aPANjNibgkdXT+tB4DfkxLmllv +GCnDFXW8CsXsoMXs4ROsJXq7iNVhrITwh142neQZ1H2RhqT0W/G7NiZU5B9mUb218c7yERw81S6O +H8jR9eBjV2COcmat4EYkHoNicaCiJLkSJsdD+3iDrWf7GRRMyGtIVfJtdYSuQ2YNaR2/H2ozutz5 +mwQmsBDP8a7l0XeeWRo9REhnGSSFCl/tthvVz1kcC6+Ae9z4CPl7iZyzNNstDZDFvdZangFyBvML +97JfqSAhZGo4XNVRYMgOyzu30e3i6+IeUdbWeNoc5kFhAL6jV+PH3k2BM68030klnxifE6/22P2j +QvyflMjYJi+zjpUnqPn38XI7QDfKpN2cgN4GspJmE6rs2bj6gPf9xchmjq8xITYrPhbOTy7dCNp6 +Mi901gO84hKkzt5GrcLoOqH8XA7rGBrXf9iGSL/hRQsBoKkwuqm5qkXuZCK0UCYGestJ4t0SUfsI +iqHXY6DZmtyg2VPXiYTgFGo81cf3Xq4ida9Pus6rEhBZ+pPUA5nAxvLaPs/EeX3zwPr76Cq3aU8y +qLrC2MpEjWHgwDVMRHvAdOOLO0dwpCPGx8EZdX7ARn2OtmBfUC/JEYJkCbo0jv1p88PhN07tsxm4 +IBLHa+TwRZqAgfqTW5aAU0Y7EcG52kU4G/BU7MIvwoX0XnRGJjZuHPGBjSzjgBoX8EPK9cHc8T9a +3+RcMf0wEl1dYhNYGN1DEi+Iz4jOkq0k7graWLZo8TkdLKitcRDtdk2Toz+WAYp2qbJIJWlyoNBG +opFcKlrmRbeulzhwky+4bT/MauzOLPJKV1DTYXQz5mTvqgstalp1rgy6xMRl6nztCLWhUGyfqiX7 +6fqVc829BDQzgn1whRCl5e3Jr5DO4FdqY7sOsyrGLhHqoOaTrdyoQH0+dpPMUj6GV1zlWZfINSwf +5M7jEkWucqggr30JRB87U89GbogMP9765fPY9Cyxzb1D2W5gUmdjEGsycHZ3tvXWAWES1QbYqlVw +D7cklYWtjdfNK4XALjj6YrR9ChUbotNQTURRwLWIjaLbTBVu9+GygM01Xk5QaGRrQS12bwEKKvfb +9IUnBXsX2M1pz4910jsOuev+Hv6Co99ou5UStL6QYDTkyZWFRr73sKu7V6Gi9MNBvoknhkdifLOn +LYxDRp33RkrRg1BGXfFHo9gtWkxTgFjEFE3pDK6paw6Gq7js5oLcUBRRhYtEKRG+IwBu73swQUZM +nkKxh2eBe3kR5eVVwZnIWc+8wmiQJRuCaAlgC3/K745K7oC2RhyE+60PaFhqvW1BWKs3+FOWkFYF +u1rvp6L3znf8LWeWp+WOWJoxCx19eX8L4R8IKPn6FUBKJ7UGrdLVid3PeLSw0+wIohypubrpB+Yr +2s6L379dgTtQVZQDY+OWISciC/d5S9O+/uwxiRUq97zglAEP02+q/qov/6oE7wmgg46H20WxsT9Z +SRq6xceXzs0/j2/4If9Co5rL/tQpLQaIGic/TkHmxznjBfU57f00MYy5hl0QJ1P1jJG0ZP05Ujmv +WCFo6DD19hcnFsE+N+e8/03/3aha8ez7GBzAwqcZRfqTzbUtvA6uNMBkJf+GEGIYLKHAeepcxl+5 +QYJoK9RsisMmpNEPOPeOK2CiY8EzSYFeV5MYCqyC28waIletT6lqaVxm0qa2/x4OmBfLYvpxtS2t +HcPMLLn1UctPoCjQJsjFGU3xnU18Eb/cmQbko1xSNdiY1Bf77jJ+AYjByzfrwvP5u8ICLNzGj5Ll +rqyanROAAGRiVl9g7r33y27LJ3bI2SsxKlnR0xeZcYo8FCKCduFOAzPIc3As2qkTLN/d1zGjj/7T +n+NJZSKeLLm4jQ3yaq4OTbJgO1zB+7KrdqNJwOvmbLVZ3A7r1+nlXmbCvXNWTNB9RmT2ZFt/FY+x +lUd1jyW8lvqf6BhLfPiEiY7fFcxoz+jFHGGcdEH6uys7pCPDgen1S0qAKVcZaJCjN10N4coI/vzp +ID2VZLwFF0tKkPQ0qE3LUWIqqFQwX78Kv8B7AOHMpffWsiZUh728oxHQST4xK7AWEWB+bQlFjbHJ +9ooYSMA2Z7rzajpoMsIlfaD/iEW3KQcQhs3kI47Nntmp3Mn6MNMFXdiKnIx2h6db2ig4V3xOwgzm +mSAwjQgw1tPTZBU9E9cwP3TFhkEUntUTWWIolRe+Wc4q9r66D08Ii4Z3CPhv2nEMXUu2KIq6PF5C +S5NzlMz1KdWLeCLdaNQYZr8RaqY1INBkyc9/zYDTkzdH+QfZSH6sHFbfsmjTLFEaFhvf7tTWZS9X +L0TAwDtfObQVMmBdquhE0KLLJjlUVbmwJ5Wj5mO0Aes7uQdd42WDPvkjmJfbIOaCSxRP0OwYwiQ4 +cSh3/NTBYLevnFbTLzA7QZPDZKdhHm1Co9NM+643f8GnBJ1X5UjEf1V5fzZsY7P4mwPOsvQFnjUN +Z76ejFwpVGekR9QMEon1o1HIPn8bWibGAS3AF8uyvPvFaRJKumq2U5tPhBCIiS1HkCzZvciG0xSQ +Y+TQneVGJgg1JUeHAhjLqXL+ApBJTcrLEAr7xfvmwhtgEBYPbVPfAC52tHeernJKK0EBAif++BcQ +1c9fJ/hNKhGk7d8qcX3XDw/P2eOTf43z81iRyjX37uBNBJeG4pSZwSmG/bTjDuBsvxaa3MoKeAwA +twoWHm4HMiZ7SBa3lWwc6q5Z9HBD+4jH5mN2G64ME17+/urqUzCamAY1oyuXRh1J7u0d1+LnR/HZ +XV3olE3xPjwPN0wbJTyNVcBVmq6AllkEI1Zvc6g+4YBtME0TTZ3eh8MLrcQLFunrKyCcqGY/nRl4 +MwYrwhiJWrrQLJDF9kWGb1n7h2Tb6t2YIH09JTMQ3r14hyYjC6Ak6XIFAjOfStdXAe+f9izslirT +dr4A3faI3e8yhsfMurT/dXSwfx+/v95+j0W/dD0wR+wjyXWcXqhnSb1oNB94moxd9VSl5qqK/+CO +miUP5yFoZTMKc2Zwve//a4AnMDhcPcHoQ8HS++yS3YQbf6fE/4XNifcJh46uZO1ZcCPHlwP+CGOo +pNvCa/ws6itS5WOM/sYhdIBLKb2sk9UDJE6JKW777bVbk5TcNYSB3lxU785SPkb0K3e4gmzciIEh +4etFrzRT+0qBnEiEd0sYs9sq9g/XbAyGWwzQvdcVY7je7QjeIKcUOT1xyQVDbeD0wlw+uMkHztAA +eH+958FHtalcZ34bkD/cM+86ZoAekaahxh5/7bxg7Ql5sEWY4jw8JCJUPkmwgCEd8qYXwPiu6NFD +HohwvH46sKIOb9hppf5pDDcoPRFY41n7OQbFgI5AC2S6yI+UnmUzvKP+WOrvGcrKYR3+modatbr3 +lx3EhAgWeUTtYJ7CBVUbMs3QDuufKHlVKeis6wKT86XeRACmwFJRW2Xklv6hPvRzWmdGljgwlP7W +3T2HAWXaoO7coBygQ2bC+2wTdaHSAv5+3Vra+5RlQx9anFgTyp+Aze6BgxPTPtD3i95G7kqalp40 +FX6VT8DHS1p2m0HWmAh1MV+e5mkPdvVWmewYetpWszRSg24xLIoyvdGQF8liIMOed65Gp9WaoGUP +WiNLhU1fe3Okl8cSxA9qWVZGdqr4mcYcM2qFd82y/RvFr0jR4O9hPNDIGVLSUWTEJFdc2s9JV9CB +qJnJLpv0u7ExOK6G4TXqMnPcO0nXyvrn2V2Yer2UyYUIvmAR5yndaHNQ3XAFlR9BXuamnHHryysj +aMnLeTFIpHJKxQbCrUIgk03t1ZtD3brV+S+BJcxIaqCMJJb+3i6e9vBelYZaQj0wK5lRyHEoySNL +FPeU6w7jv0p2fUe0p8u7544DGIQhoSrrcUCYATKIzOjz304C5anISlhN+roZttoi2TEMSzkvJLVB +DbjPHyotDVdJpp7pWSo+nm7j4byz44c4AFchGw0bGIEtZZiurb1eCyQlGX50GR6CDi+n/EPCVnAy +rGksT3Y5LXz5fL7xzrikK2fmpPgwwdVIHEHpvSyvqswvyJfByGJIEUThtgi21fEadxEd9ufPm5N3 +vrdgt5qTs1Nf96LIj6WpqHYJR2D9QnWCRqd/Z0YFmptXATxaU2pQ6FrzT/iRQSrURoCoi57Zr24S +K/z37HXJZ3n2Tz13tv+cBcXCU2d+d9fW6nNDrTBuFUwVLpaGwdk15Be21kiqjvpQ9WWJ5pymZvc7 +CGIm7sTF7bKGbGYcYOv3A0bG+qIh4iy+i4Uk8lz+DZ77mWb2Byj4xMKengz2lK2OvSO4qW6eqnwN +ZnyIez+th1CaxdTvwxlk1l+qdqFsIgeIRMwb7AQNCGBy19Z9zB8EYaAf01SVU2gjJWoJa8zffmKR +SxTDtRBZit/2/WKFem+yGFMSOX7WQ20R4bI+OSYlObLXu7zPvNLMjRSxqh/aO/mS7BCTpxJPkpFg +S1ZTGTU0fCZOjSNKqEsIWDl8nRTwd7P65LtHpIt5zlgw0YNJfEChMFrhcgW1Pmq2Qf1XF286pzOf +uXDMTP9VKGpsfcRMNTSbSNxYIMeLMjDiYOVvUcrtz32PNbo7rEE0lJDrwZKZ8lDSnUX7ZO6C9Ala +fzNE3NGzQW521rSGMjmYM48zyVypvmB2VDP9uLkx0hTpX3ETXBpl+3O4x+Cx4peaD7bErXuri5tT +RwRCrEK0BqOUcs4zQG4Nai4CYTfqXgUT4GyChNN61PKmQtJhIBxvjFZ60wJwxZ0UtLzaiKxvFCbm +42OHUgDDn6IzGiOyOpsaGYQDtupu0zVEY2KdPZDXELje5IKXdG+X+mMqc3aiENvqNHcj+9TL4bUl +eMA9X40hhePkwxVCquppi7UtEs/MSIAWTAr0O/44Q+i/phu6TaAPEEF/eh+Fk3VFAT5ocV4/TP1s +Mey1mGbb5QXDuPTgeHuwp0+hbgR4UD1FcFl8ca/F6T+xNZ/krNeobmvfU3WTcupgrGB3TDFS6S+E +AQBCjxnJHeWHL1S9NGrUWVO/hkFePnMGnof5nhQ1rHuFWIfbXeeqhctyVRq8+elOVXelQC/HD0kY +bN+V10PFqugMfrWL27ZN1oCAP3Lzjw7ypM96bWub87uSAi84vy8EDVDS0BCpDTZQmD9QzqzvOYne +IZbYIV0yYiuvLIo1ABVagWNa0R0Hxf9IzPu3I/I2BOOHz1abYps7B9nhTOTWn+qFts4gXS1h3kaG +aqR18hRO1SGRPaM1N+WG4XlJdjiHUuU3CvycCx/G0yCOfiigMlhbyfMxxr7rLpy6clakkdLOjF89 +mgx+PKIZ7twC6yQ2N2bcNN9B/D6wdohmYYfolOZqxDuThEDzhlroX+22XcLLarXsVzqRx3RkL8Gw +EMofNUEVo5URp5Q4mWPl30XnskkeCMoUA9/TQC5VZUEQwdSo+K25Y37hjxAI4o5/pHunv4QZuOmN +xvKD0tFEcApwLQ6VLHtA3pIm7zu84ZaqdvtqfcOY8Mc2hVfE9wUffcttM5YyiAJveHfe0/pIYyV/ +dw3SE3c2N2vGSTSV5imBwOzy2FU2I6j9QmPAGJkuyQql9X8p+XQvMk5AK1dFz8pNCWPiSQxDUyj7 +qZop4UrS5bAVpsSGod66cL3GQ+Y8FM3HBfQmI5GzqIPWe2HMiKBqkVtD4ei3Rc70PkRnj2HFec6C +bzItJU8CfjcHsb6WTAmF9zGTTnMtQu+x9GiTBlBh/4ckZ2/XMC6Ul1pgOPhboAvA0y6XqU7gGAYS +rnk4prNgXsv/bQuFFX7xJQrV/04iiXt8JqpuvEh+DYx9FFw5V2eONHFbPFPX+znStWim9BoE5to+ +JzVqj37VYIMEhsjYLG021w56zxUn9X75TZVMdl91tZN00bWV/Wwcc8yx4tF3A9mZy4JtI9IRARc/ +hyCx4eELthzWk63+3mwMuwbuRo1QWplStk4uJVeKGok1iwuD/o5cZwPsBtVBRGyGgBS9ro6/n5ag +7qVvIDZzr0RY1iUXj1rNVxYSjAKChwThMgUnMXk6LPy9XvMIENFWlbKZvFB4VnNh9/Fl6E/bIuZA +lkFpm/3usYm0swINq4BjswNLZnYkiJfxcT4GwgXkn4uvCSZevidHu4zbV/zOJ6U/PUXBwWdBrzNt +1xx4MtfUeZsfm0nzRcNU3+T+LRh4M375klLNRQRO+1I2i4PXw9QxnQLj8/lQwcMebF0RlC0+KU9W +O6H0dOrV1jfxMeJMaVhP95FJ0MJzaHkdGgmSKmHkTbhA1LkuiiSIipb3rIEy3IEKIvAYjzbQ6bkF +qalo6gR1sIbqUaSJxQW8p0NHft263uqZzou1+4sHuwbqKYkznzBBWS9Jhjw21c1oQn2WhW6H00MI +R4fkyIDsLFB7AilMh9WMhKzUekMNFX/dRBESb4dCd4DcctqWwGgZWmophIoE8tCuUVM0gS39fczn +4D0LGetu8MtFVl7YgHnVW/WGj+PT51UCaxfQ1bdKNwfuzk/17/FQGR0dUK8ii/K39kr/lmnJATDd +XzcKAjGllCHA28HBgTFAvOne04n1MMCKrZUPkBgck3HnwHnXYNtiXCMU8per/9+1lbuX2Y0KiJlj +LOpxqe1JPu0wVyalUEO+YRPb9yCWj0/rdDMiO1eHciQyDS3c/aMqkoeTKn+zYrY/w92abmW38fU3 +COY3msk8r1XMN8OH3XFaRxBl4yCZPCt72ojY76z3S/4SMgE6H+QfCukhImx6zv0RMPDyOTHPmJGW +/heRj3KQpyJyu9qu4PwzFPZEtROYMRmtOi7WLbi9lsvN+64CMKqdDgX5C9QO6ITcQTay+LkYSPxZ +mmuAcS4vQoJbEvpFhAJ4nWGd87roxCpAhO3Vcv6Axo/nnKnsT36jUiBTi3+EolZamHTlLxuPrMEh +noBjMDWQB/hRGCGq5sD5B7rcj4YiFzTG2gCyVLwEXCHXFNMJjRhidTGxlBhQidRcre8Kxj9j/r0k +ewHuh7XhKtEXZKbkVVH8JnX6bBMuTVzPYlGdidgF57JETCXdrGlz5wJACC0ka16C/pHd2GXXDmIW +cOGzWZvV5R/kblALkt7y0PjImf8Y0+46Yk8I/she8rVNAYLcRvsu4Ie129j1XgxanIwJAOV+1toL +Kw+xm6EEqtoWy1S9ZIMBejBXVwet3i+gHOkutNYkBuc9gsiK0qS9zS1wYDfjUtG8o5sCAV1eiy14 +pWISOL1mNj6sRWqTdxeJsa1/eB3B8Qt0hlSq5bJywz0a1OQru4g58fn+6E4nR2SkyuKiveVP8Em/ +JzUqfdv2n6qh2/mAJnNurfiEZ1gQ0TI6ol0fAQGNqrgpStfh0cBpMey4yW2kfeI6zvu79/cUWqyM +qRr2A/DfdpJF2YGgxl8PmuAvULlhdvi0Zu7WKXcS+4olPtcnB2eAx8Hlxj1RmU/+dV+uhqjnnv5v +XWBVgfycy8ARHc/LBXbpOF3wSPLhEi9+z0hRt5FZX2e3aa1gHn19Ngn6jK46MlG9b44EVKhX1kQu +0DmBtm05OIp0r/iQ5G15ev4ZWWtNC/qdDBLvD0L8fXcksF0HuAJRqCzETDgTPJJWyEkfq4+dFRx/ +Og8SDY6SPMlRKoJHfUHNIir375PxQL/OezkazognhpXu9OPu4htm3djXcxJDqWEJlDrGsPrVd8uV +M94BHZlY99n0/T3V0jXyxul30Y6QQeyL0d/aU1VR9O9V/EGmBysLkEjEEM3RqUUa1h9C0JoonNEe +mSK+f4jnl5/UYsSON5gPc8cUHf4jikdtS9VZOgMMAPg4bwiw1d7o8WndWUNf2lQnCGuy7j/EW5sd +3aw5OMeGXh8CfczeFqrLONuvwdPBw9miLYvOwULPNmJ634DoSdd3O1o8GFinwlLjzyr6qXJlXhXW +FAOv7t+GjG682ecplwJKLNFM2YcqVraUmuATvPJVPWinpvfO4jSAhu6E0h6byfQc7uTwxL67XvjY +297Sx/hFHhG6GNjJbu5UEHD5lLoRK/pgB3G7DMLympLp7x67sj7MncPLBZTaHYv1p8f8znjK7OWs +BWpQMvozBCoDMKsUgwbinf2N4NlGQ8SHcqpuBgd1vAPR1+9AIjKhNOJPE1ZDed8yk0L1fER7htOR +6yZGPESgQNudQhO3L0k4/BZOn6iuPja7mUCLu0GEFOvqMNQx1AT3KuH/Ka8qi9LFDcm09/5RYR+O +hGc50MtaP2Z38Cjwg9ifdzR8hwON5EDYR0nIcPMwGdxqIEI7ymmGyQyRyFYv3zql60YeMy6OOSU9 +wzVsOZHA6KeEL0Y5K4+hejSB8wLF/HtMirV+445U6NjMAd6EOLY+5UEs94Ncz7+dGDXJgAkOJi3i +NvbaDYY2L5vwABamSJje6aKCna1op8PiVzG32WaA54XsAPhCMi00vHWc84V4XLWBUU78eoasnXsV +6hgR2ZvL+zGK33yrBsaVv3+5E8jiyFIfcLsGQwWGZ3Azz1Y48XS3Dt5fODbXfy42/V+H17TcPxbY +443arVK42DaJ4B7KcdvROKIG5zI3yr68Xu8Jtc8XXCq7lMA4S61mcNc+Mgb62MaZ+49QutAsqAO3 +b1FgpFHyTwvkNveavsbdfgERbiLby0fZC/hwF7XktMEFfTrSGkH38lG0DX1jnttK7D9we1s+2xsj +NTf9K0GNRWEZMcGdiGkiygFW+e68SAbru3ouEZ5yhGvwLA8vtjF7ot3jkcNKiM4lIcfsjQRQcTUX +2itfmRuoMLahEUF/lLaNSQZX0rICqnNPPnrJI9EkAqpjSRp0xIqDLX3UfaDEOmxSlcD6mSvkMdjZ +2C2T3MEtr70aFxymrVzzW4rwDJuw0AKxPHNJR2sPnbrKlDJXuLCGaOqiGOIDVKGSqZHkaYs48bWI +1aR12XPvUT6LQ1q+w4o8htqqefmiSBYiZehRpxlfxWAjxsPDisgBuZABlKj0eicacE0LX6AqCOT+ +LMwZAflQSvxNRkxHBupGlINexgO5LlfZY7YWuh2zJNK0fopvSzglReNoPOUvNZP8iDKHNL2JF6RO +Kgvk0VpN8Em7ez46igHX6yAoZrjUledTyLJF7aZrw++vuCPXP7G2L3BJq/xdU/BgWqYCvn/qO27r +B/1z3cDdPjpWnfgUdtrb9PqOTadmwFdqdOOWQMV6VgXdcPfA/zl0IYNncBc53hzs7JsdCz8F64pn +Q1/Op1w7oO7vSvQRAAXvxyfv3zq3MAwtWNJ5UoIkvoaHDQ3PHudHBnYqM0IWaO8zw/LSoi72djFD +5pbDTZ1/hldCbCY74w3lhWtSO/+6OZd0JkHJ6JZoiCcfLH3jtndlokQm3P84wOoZyiDqvr/rasZ+ +IkrAYxJTBu7R9n6v9ZyjZrNQQ4mpprwQg1vWrVNxiV/YccaFAquotg5EiyPLzMsWXcohUcP9FToq +EYlFtGQOJD1I+TvDrU4p+X6xaYuy5Ns3d3TQoGt60q5MMU4SQ3TbXYLWFUmv96aqsD1c6R8Mgzbi +A+TbQWzdEzqYXSJGFrMbsGgcOLxKxxYhM7ovXYjH0gWaAZGxIeQaMfTHzGZmjFQLb2NZJH9+fbKN +rYF+7kHMQ/KSNDDANnQ+jXj1de2zZ3f8mplI8Y7KcfWVh7an9HXdEWN+t9KU3mrXaOGboD9RXxwg +/USanrBBHdnanVtcnXqmbNXjlPXcpV+UcZSRhG7xfhZyD9h19GvRu4Y6zdewrkFhAUmC3XG/heuS +A5C71J6zCAZ0h8EtJ/h0EozWjbf8yKjfNJP7Oe/TcwELbUm82Fl1Nlu3tnjCnJ6Ed/Wqmx4e0AYH +HrYNwXmci2JBVC1AYt1UWSmCkqv+XDBHve5F1qRkeBEAjC1SsPQygJfmjee05Tz2AgcjRpXZNQeC +VocGSMdAVic6ZZBF2LaXvwGllzcT/jzlJdr2pTemMqHFdNRFQ1EvqsDJDgdiQl55ZAdpEnUoQbJo +LzzccMRSWTB1DaXuFK3cvaJF15kRsCECX3Mbq+p/giOo+DGrI4x1stfo7LVMffQ1UgHfu2xopqwm +pwbT5iWwlFFHpWXUmgCdA7UjGVWmpvpWpvZBrdvub/BbjsTVamL9xl/p9jxMjX0Zx305+nFtOwGl +ouUaW+VdhdJc61WTEbTQBVsGoAkXVe62UJFb4sQ82cCQId7lfIuI2GYPiZDPqZHl6f/bUx/PmEOp +cF60dAbEFy80q4E+eguqjqsJGbYppZglnpf5Sq76W96Nad1K5IIeZsmaQDnN8SO/9X4aQeTu8/KN +tTk+kldRR0qwLASVHIzJUo6c2ngFocxM9wxQ4TQsoxiuctghdu3Bb/R5MRfiK+lYqTCU2gl7Ph8M +NseVjCO0mwuHdD4nf9XtSyi2Xoe3AjKLlXeWYsNr12pNdTC010sNJqSIRLpuCNhoCvPf4z8oPwAn +uFPX2MRnq8/Z1FFioknISvG1U+7NTcFAW0pY7cRcqRIWY058euJm4AGsMiTalzrdqho1MFwN9M6X +5vt0Qz8RSNn7JVDab11rLE9+tgyX0a/+TMf9JVowtb1BR41mgheP216syAVRlLrtmPqaYyBBrQTo +fdBRG7O/seqJ5o8NRNFwafwvrgANuJqk5bW8ZEOpe495PvJrkyd+M5MMFBDGbhKokHGFolJsRdWt +SyJ3gMexA6arByUEUUE6RAeyiVmCc86KChNzXc6UhbphE645o9RGfpWpHQ7CCOR4HUIZAS9GwZh4 +WO64rGo9Kc0RiIBiRkEXjLdrg0MUhxE6IqUvTF3vJdvfrCG4pS6t9IPW1bnYnR6/dRG84tg9Uv1s +omVLx8Seh5uov4Ir/WChUDAn9BYasA4q7D8aKeOPw80v68ODWQcCNx9K9XDDCPOmbz/HFiVwsxI6 +k6+HRZi067xgbTvIZqY9EAU5Avf42WGTrOOigXxZpRKOJNKqMgbrfhHIF/E20Rbt7KT5cxTi3g+t +Gt7CNz2+gmgNQ6gxl1OBvpGZ1NCvN0eG+nUMVaSBnJ+nYg01iorhVhBRtDJg2RINGDWlIHOn81d4 +F8KUgR8pL+cQDgGQO/1PeuAN8tlZxuhcOIztxtl8twamDWRWAKja/SdV9m4Fm1AthGSzsfn9kx1f +5omF+r1O9SgWA8w0gE2L09ta67Tuh9JIPQUIL/6vxWTl0TNQ0cydjOpsTc9I2egtt+vkObsWMu3O +HgNZ23imfJTI7kyemEpn36IbIQazfj+5SeF/zte344CTixJ+75S7whMWFHtnHTjkx0XaRJUvP9r3 +EryCzP/97ZGkhKXaNJPCRub+pHpI9FE4AcPM34Og/18ki8YH1b7OxoD9QrUCkrmpecwJbjOHZWqx +yMpSB3qB2NqC+RenrSfjlyaobyw8H4zdRW0Iz6hz2n+56SYM+MoEI3LR+HLGYLYR8ViWpimL3V82 +6SvWdkSgIroJp1ynoKMCzMMjGELtYc1RSXaQSGpB0oA8mtvaGYAhN06PspJqJAChX7w0c+5sNZR/ +0tWrU1jJTbFLEQZStZvHcxR2qAzBG17Y8iV7T85ywqvUU5EDngKNFKdy2iSkK4H5inq13vi9bWkG +q/wj9dhCsi7ppK2T+ql480R6sFLVDOSi4N0utMuaFcrXCreILFh/16hVoes/InvGbKQdMXOU/T6o +1L7Q7pt//S1ixvkCaE8JDr+vqm4z7hpPOImOjYnoGuukatCBq3h4XOhH1DMU/ZvwV7is0W5W4eHh +LD2m1l+wmGNyQB6f0JNVg0wC+91HiuukTVVvkOS0dKj1EgRRg30/I1bqeo3UO8Dn/NYn87sZFPtZ +86Gq1CWR1o9wmEs8xVVITKvQaEq+9cXrV0/0BLlZjUlPoYpkNLSZPXkbYxERPCkcAez+lRdVHag6 +ZKebWZMlR+dnz3rmB0O9BsIX5kOqea4FWEvpbNnZ/rq7j7QCY8UkLrqeVVKQwhUfD73uxwOGzdPs +SY723h7XUWNlYH4TexymVq3gMmtEEd3PSAGXOXiP3KTU16lifDywPKsBjGr6CrMCN7LQ7r0ah6S9 +GY0AwU1uWCceqyFuwi2suovHVLt+VjqpiSYDgQLi+RKCtPgB+zBmqUnF8f0cU/Gs/fMEQTgRuwoH +U7pVRi9e1N5y9UhwMtZ8wORFaf6Uq06iK9wYkg5QZtaUgWIhc2FbNci8wMytspradJSmSeDDRWzr +yHGKPbPSsJ1vUrxUH+XfHeCLeoZL4T9b2LQetLu9VMTUcssV3fWDZr62Hu4eW3THlOMdACgdcfok +s82p7pVF0D/aA9lUkUUPg6zx+hu8aMD+vxGBbz2Tv055Zx/bguPp5FvJTySx6pEKIHffZn9/TzJW +mgK4lm3dySNHALSSaKARLySDpDnE1KhE52F6Oyh9Jj4IgYFEGKpV4h02NQFaXuR76XJXpP6gpGu5 +9yyHYqFzcaSeqpWmLbFPADAnoJ8w9dGJSbfEtEwKtkbK8dxQ52rfZSaU16ksXbAuLH8XcPaa9xBw +0/0vVE9rBllz5DZZQJIxIb48XHeKBem/v0RgY/F2jarkSFNGcjJhSBqO5iAQUlV/SFA3euzPP7rB +sYJ5M7z+5PyKkMF9sU4VZMwo/Anv1PY39Qd1zoIgmudipGQmZP8458lxmkHSF272PUBLKMZkqzHZ +Q12yuQYhZo+BgN7sxkLm1PX6KVcV981yq1ecQAmFfKWHu8YySdVyJHQ/D1vtH8Vb/IpJSc95uUbb +tzk+ze+r712xqDrk4Slt9UWg32hploXMBMoub/EHW19XoAKJB7nNH6otsl2J2vFkRZ4Wh2Sp6tre +RAbTH0N9fMwgJJww1tgB5Xu11k6mUqOPttgnjFQKFkwfEC7KvdH6b6A5EGnRbwdVGjDpa+B5HIt5 +rEkM8DQnTSFjMWctNBNQwZ/Q/tXIAt2xKDnPCfY1ATsl9ns30S9C3ICerC0CyVioQXubzii+3P64 +KOaLgluPh7lC6R7UFzyDzuKWX4nKZzbB4qShwr1Q+YIpBZnmFcR3LuvJekK1Wnc9oD3annxKM8tX +DeyXvAive4QyPPH0rsBWERALBz9+8tgPB6LRNWTWY7GJrwd5klXMlUMAkAuRBmMqZaEJIglFiItL +xyU+YFQEkeXK85XKs+TjLLDe/VdPXgKS61RAf8nvFEM3cCXms5ouEjd8q35wnoORs6hi/ubWt1cp +N6oCMH1bZpAnG4YGWYiNcSbFStPTINaHOxWqs9quUBmmw3UqcF8v2qQu8MY6sT9CIUzGuskUr87a +MjSv6zNRc25+JvhFguoS0gQh7D5A5PNlJtV19mqyQjXNL8fi/AFfP+j660FgLggeTA9M0TadN829 +oREFKIxu7S9tB4riqH2TCiN10a5xubRBMCB6Wd4e9Ip+D17+49tkSscBSpDtCFqFhOt6oTZAOQ8+ ++ouwyfflvA+RmXhukilssZEGP0UjFIvpGHnNWpTo797hlgBIl5DfN2HoOXrSgtiRqO2Vcu+Tcpd0 +V8MjPi34xgX6Jj35trmXLD/4viX9nq5gjdAn7NKEUe9FZZtNdkNvyTp/YeOG9oleZ9a72pKjJWGV +rsBFVQfVSTN8xRL7s9sZLAGvB18fBYjXqNUIfa2RhLFxwrzoLOHOlgOU4Mk5aQsoUl342MuBF5Wk +VCkEfUFxo8CGO9moOSXbJRoXB1R2kRU+8rdCs/E71v6AscxQMSxXJajcqSv1jq0ZSQqCQBfeJkHd +32n8vYq+sVfaeojoC/W8AxioGiWO5Os1JS8VAjEvhnq99u2cm6/guZhblMpZwd65T5WmVJuNZie6 +mhoaqKAei57EFf+P1P1lQG1sqjjW4sUNYUGEaBcLoqjhE0bNzrSNtsW3dHV+zraj6N04IZgIYtDu +t1BfCl+7wprtJGWRbpwahwnCdpWUByt9t1pkSMdEFaevsEgaveCLlZ7d2hjb8eM/c3jLbzzJkzE8 +tHaVx2zvVD1YRdE3QGFSICSVEys/gCu/fOQ28oSJ8RU9t0z1WT6tqqt638ipetKT2YYot6gt+BUI +epu73FIt+mMieymdzqLIB7LM8nG1bOC92/IYSR7DAGqNmOfLVuhzeAAW71GfLZsNa51j5J5pNOeH +8zuooRjms6i4p79WCwHKuFoMwJFVvCAGfi289cRDPzeGVaKHVhw9NtbVJEG+1eyB1wmiyZ3JqN36 +EtOp2aROlcK8P9Xlw5xlUOqU0yCZJ6yCYdGqB3IC2+OuQ44X6J1gtsm0KhWpmCobBVOE3FllhUxz +K4Y15irFKH8ZobBqQmn0fqd5H8qQh4T7MhUgOQddEKUOMTvpd2x3OSVFKS5Sh0ayg8Dp7DUWVtt0 +BxMcLp06vJr49R42axyv54ptyk+VZV7U9lxATOcclIFfiQoaO57L//gyVg5XoYfOR2BFOGaRknL7 +dSrc6zd3XMsdpgC2+z2Bpz0yK6HHGM4Bn5qe88ydXrt8t3eDLNOgh8OiWUJ6oAycafgafg4vNzGY +JS9ebswa48V1AoqnlxyXAWFfKETLZNfelpJpjawzibvwNfeli9YveVMNJKxm4Hhj6ucmvbLKx2EH +9jrRQtZvh1DsX4vtHEDcONWhjt6fwxN0iqO3QVvq92Xdl/+mDb4VWe+lXHqR9/6zNJdCw+BIVuwI +FV30WQ0zPzB75SSC85wGaCrNK0b+hAo8DAjporikMupr0k4NeQN/esvh8hZHcYgP5QWqGlzRalKD +rHp8cNxW0OeP0B2kqpnccre5pt1YHe8udCdWr22kIpiE35PiMSOVhoQCQF3JgvrbF4apn5DbCQsZ +zT+RmGKpbo/neA2rpvYj8+kkzE2SCnqnQ0rSe9KNteYkYl/jbWFvjquJx9YtHJLqH6N0LZy4DXYa +oS0jU9PG/9LsIfLWHE/6mZppnnaX881mneuNsdy7klwLyrOKwpxWTuvOx6urr0L9KPxxp8Ol9nUJ +gsKaUftN/TBXp9VugYYhvk2FfRhjqjEBqQhN+2zyxWqkcxOYRhh+MBZqi3j4TWPZnuFuYrxLh/CW +teIxZP2L9ZF/Qic8EjH2LmJEiXypIiIRxiHA06cr+WRBfqhPFANH9spP6isvONC3f0dZIHaVCKVB +OOp8GC3prrd/N8xib2PsA75rIcQ/xreQ48izeMmdkQplIMOlj/xQwui/hurI5i0bCuVRCE0eScxs +gDDadsf1gGQoVZQmlF4KbYfsDmOHO8mlaPvAvarYX0NWr6Bye6v8ZnZ1wjQOP/D+6BEnLxOWiP8w +05Qw4DFndnsKnaK8KeRNu4klazGUKadQlti1LUMbYyyF9T0pGPFZwyNtPNuXoGR0Tv9JFNDEzXBH +m5HpCJpmOMuLHfvg1CNNQVD89CGZukgA954CqlvjWjck0s8vukoJ0IHLeRAA4vdI5XELTHHk5fzH +gnOBupvLUNnYtGTUxSAhO3J5MzrLtBxM21A0qjBnHCWMMn8TmCSt3o4yNUTBesboLL0QqlfNUBkl +Fcph96EkJgwbsnawNLGKZ0+E7T0hf1TdWjVQuKBzq4GUuLcQjlj/GCo586HJmCYnTsMFDYTph2fO +cLZ3ls8h/5v4zp5R816sQVZ7MGppOsTUjYLIirxyVYQy3FXHtEltMfTrqmLkGtBCbDPBMVsDEQWt +yIVlc6R9tatFbU1lQ10PBULLg9JZtIZgKTAy2xFxlX2BvAMaldZQUja/5U6/QR2bY2Rk7ssDdK+K +cFeKe216c9+hQF7hb2v9rerGUDcPmlVqVRUeZZQyZWVU+ROTMqy5NtxDn14OXqsEPc7edmgrhLrT +IKewGC8wbiwuxsJpbrsAYjz1mftrBFRySHDxeYEdlEs5jmjrBWgAO41uvcZjbztXCXOTU7gZLkqN +3o/dkmlthQOg/BTLsPaFPQL7pIVby3WE8DdlWc2FQ6squSTH3I4mad81LLNHCDbdWLNVGwpd1cXE +yO3QQvu729FCHzGKZwtWCl8WzJU9DCDu3HCCuEiYxzhGb9pKj47T/C7X08MdHCehV1z4uXFgk5yn +Ppd7FyBi840TwsCA74XiJUK7OMqr1LcG8DNDQ4B0JeTz+g2vrFLAakfIKLNMmdYhUVsfQUbfwd7/ +lQH13ynvVF3ZLWyfRJGehv5wW350BqEEhZgMKxgruQoxudItlmeddKcfIn3aJmVR34oHQVGBgamT +1mke5Ai6r8Gtw5WAUEOAWvSxVGySelJpac6sRoFhun5r6FegxPwIofepkcTFdXVo8fgA6dP1FR0z +LAQGxc4ptFnOkEtBZy+tEZN0qYBn1VTPbrJlzJDoNY1iYJdDBLpPYGfhiOhQXtXultDTdHXuQNly +wRcYFPpLfgRwN8MBuiDYoUz8bRUod+DSKTndmqgR4y1UdwRjYdpN3OQ4/iK6lRHzx3liOLt8qDbG +b9AZacAlLRtnya2QJiTvZPQ8H+e/FXFDSbIAN9BZf65o55jtQPQg3xti4xKmkA75Y7rVGiogTEN5 +r3purApGxRuC5ZKRaTCJRMHliC41YSVvqNKBRhSgOrYyTkpItrqEiYcxc1u2O+C8O0KPLbGWL5+i +MHppP60k3EOO32lLxm4mwrtMcX8Mv8WZJDDmGTth/Wgl4oXD0kVyl+FqTtrG0BH93putDNGlURfE +YfRkcDSvSwBfn5Y234X1JGk+1BNJDOgAO7mxxUehNTNTzSugOoxnA2WXAwXPIPM13jsqP1rF1cCl +utfNKXPilZNtsjY1Vx0jgtJ8Q/cSN2FP2fWs0TGwH2rdVM8wr7ekxBHYf40jUxwVT5e8bVHDgxEq +a0yH+As0eqZl0ulmlFz1w+JijcIBR9jg2Jkih08bSn/Ed+lZfcmm4imObc/ac7fl5cwylQVIlr5g +QSsSncelWtgi/VJyhKMewuUU+2/k/VJk2ne4VdF9Ig1rRDmgsrfXsm/55lCwyYw9OOmfsVs1hEIk ++bUOK/CHT0FzCONXHlIzlu6q4S1qzuIdew/70gpnOxRN6xOYylTA4GF7+wHZ/b2PBl71ReE76IR0 +yVLfK5BvRUY7rNvHuRveOdEaRqucVALx5piy7aSb9SSi0QstGBlsP1JJwPUto3nS6/wXIeARqq7/ +oyvaQwcraF6FlpWAYIinQ13dwOj89omy6zixegsPeIYEmwzgPj95JJY75tvI1VuVyxIq8m5ddjMp +yue/vIGvEeZjEwiyDtinDtFT0XVTbpBexu5sqhiL7Weq0c33igLc7fCREWupL1M5L6K3AvfTmQ8P +ddhZ2CMsGcFiOf22iZ0Zw9dU1qeFxf6diN+wckaSgC2AzkistPrYHMpDmJw2LXxXIdccPEeBxYd6 +YQCED9kAIIq61udlwZtoMLvOrRBvz9Vxr0NOFuaILx/kIKZHcxBNSCFj/mi3WvLA1akbMxKvRdyE +jDmIRNFKNXcuJxCciD2Wg/bdGyq6oQNa6YgH70Jo4HWKo4TuPw+0hmqkZ22uWp21LCz0eZB2A/QY +EusGea1vXHctdJslcO0Oux95H8Fh6/ttQFDcZWx7m8PGGVWR09CHQNjvRsd4/Dmrf++kp+NaJWCJ +/lR/jLMbAcuwQZK9vLrXuR62jwt6+KJRRDOUqyXdAmjjLAD9ywfY90DF2FG+ggLCtehqHN9iPwuu +IYVx0R+ZIZ3jZ0qjIeD3L9wwwXQKVUlorahIM7kzTqCyC8rz8Vwl+vp/LSeBHYdFOEvZxak5kG0Y +tXTpIhW/lesjqONDDfCyt4Z92b9guF1p9zLgwoVy4eOrmYkYSGMOmdEYzDYmTaW2fHRGem3YVgQf +sJnu1ltQLL7RnNmyWNJF8c/yVpIkArfw8iyM7f9VpOyWoAtkMd6kwQc4ZseypJx1s5ZCxHdfqiw+ +R5ilCRFMbxQSmBVZOWE7QO1ufb1XUTRU5kjcY/6A47nJZ4g58pmcvRbiHI+0VrAveCZKVbz6k29e +Aci7HCjjE0UZl28/YXWzKID6+UyHQPzHUqqBIMK5F32oNbNslwpsyNKQ5gRi610/XBsCsbusw1+i +DUUj5eu8mS5rDSoK1ioUvOVdbd8sWXep8XG7ZYawgJUMFW8UfiDolKm1gPZ3ivFVu71cF/k6ESQG +acvD2gjdMqgmX9A0XnurqB0iWU0ud6qT0qx10YoDWjBmO++TFW8vNA5n1gLIgvrQ/Fvvh+dDxUsR +Gns+x8QbTdVkIQCUfcTkBenOf/vdMQc3NuSIDwHC43CQEGMQfXoFqHoZFFJuENXCgXou4RfG6n6A +4UNPu6IPVV/KYyuHFDoV7q/t5ApTJo2iO7l3cVw4zg1cq6pZWAf9pO19W75jBCGLikg88lUpQm4Q +qTMrluOtS6czinwPHBynmG3mL4tbD1IbhREBwejd2FxRe6qG2RjCPPxrzNIzzncUhZpynzed++xV +Vui3T/c58nqgC1JNvAQ2KuEO9WDeKT5cMlj0KiP3RwJZmNhj+0F02OspdO4NnfOX5l5JGXub0/HO +mKSg00aO+K43jHl/jEBC+iUwA9al0a0ItZLT4wtdbzE/72vzJZNFS5o06nGQGu2UZuv9/0C7COUs +TZphJ7FSRV4PS+lRKKByWGAIDGA6l3ZCmCYf9lft+LTEln/MCBp+CVAQXCnzPzQ9V8BchJRqvBjl +AbEHDLbalJKLwX6+LBJGLPLqp2J3rLLEim9/I17yMii7arUxfCerXBF79TD3XP8DXk2V7jdKNccN +CbHp18HF+jjHi1iPnjY/SP4WsYE/OfPO08gzD4w4hPsf85L+eoPpX91oXkOGDdX0cVbI6QWLoKDc +atih++vQj87pDqL1Yqsrq850TYhnP60xf6r8bZxN7l8DQmdVmDj3csnkpeYGfyWkfEJ39cK0wNQ6 +bMXYACCLnL+VLJbjM0mEMkjxPbPzFwQdr+9ZqO/t3AH1oBH4JRtM3votZNEqIawUCYfEn/2ApnL3 +pyQHmBsNWibCVDRYMEsuQD4wgmnKiPj2+aBm0ezhM4nKfWFj4ELpdqWYfoX4k2qM1bikL59Uf425 +5FHBMhqL8Es9LDpSZ7i5h7H/ajm2R0IFy7YQt/Q8HUjl7xI6VSyPGLufAbqFRNzSY+vAk7pZEbBX +HEwrE/d4AXKNP8Do4Zobqgf08zkhmmHrnALpSH8MsJqlyRCjEcAK/uMNRVD5h5rldykNN6xn6ICt +H7LxrAPcpE5j8W4yIRuLY2oVFoXps+j+lNuobhsb4flxYjsu342uiBKtbvyBz0+6nRcc+eHiwzOE +F3bFwl45vHYCH1OwkirbhjfTaf7mieZOAjYTx9TVSM5/10rJWUVLjLmrN6FBSLQ8kIgOrl5ydIUN +foRXXsW7MkDm8JTyDgCJHKSkU4OUsIYwPTGn7NTI3mTKxJNNywIUm2eFzXEjaQeK+zAS4h/Qb3eI +gmdz9Jllm4RsEDfjXjL3juGFwUgCHKw0mj4bL0MPBHfVH0BDx6JyUHkNLXcHYIGU9jNV+1uqV8GI +GS+XliJ533g19K57dAec9d+Da1nzC0EI9oqfEnQeCazS6/AFRSJZfb1CfeC5fRJ+KGpcu8x1dRbS +61kf2wJSdkvv9EwjBEZ4IfYAFks1K0JBSWntrDW9IMPX+bOoV8bjAhACmqNwkcf7TKCMiHZhUCst +xrdJgN8G894qWeilpoFodRGkTkix9uapV2rcqHE90jbyrCf6Mwg/j2F7QaTAGOq+DQ5U89MkZ5fv +LRBQFwDcLfUQMbplmJ2GTvuVvzTavFxzKG6QHXYKEiSk7M03VUxXyV6e4UsDiKMbI4F3X+LRfxVH +B4x3pJhDGGF3B7WdexoPZLpujiUNNeDjVX/9tryTFaUVUQFonHEvOmRP1uMsnjn+3NrBM9GpbgOG +tJBJAsK/mJFS76nrNjq2IhjvJ+G6ne80Vl26HKET+KJbUb1rAm/GQRMC5kq7uR/F5lkWfEY6quCK +6J4FGpneDjPqkMUQ1GLeSJQNtD7VXROjSDhS9OeNcIToxtyBT6w6+1G036LLiIGrpdkMa5t7Y6Vg ++axEuwruJRxkcAU7mIcSun9SjVr1WpmaWfiht+EZNoTboyiN+QvLcWDIg1ZR1yqF8SXoSSsn14m7 +daOBbQSY9ZF83h2SJOUFbrUoLqONLCtQ6WXm//GJl1NG+nJOm2VCgFA9OEDBrrhUW4lPNGxGYuAI +FZoBKryRt87esaUaA53KtQ/vPbETXXZxWp08fpfIUll7aDaCoBV+GJiZP/sCRe595lEzG9MGe3m5 +52SJSy8qfQ3DiyPybBfCv9uhtZkpXgXGe8SsDbx7n1zuxMJwjbklccKDRKkT0XFBQ9S3dW4IfwsV +8EsRgChWleLD3oLS07BqVeH4bcxvU7E/h5scKQr8Q/s2OCHm6AroyQ3ROsjuxR4aUsY13wO7yq4X +OiEu1NUF02NP5ek3qOHnY5a4SQ3nCF/9DkTeWJ9s3jcUwubM0V4+hZ/ly+GZ1c34KvdpwDns8kIU +7VoY1b94Lad6Zcz+AEyvt/x6WE1zf+S3Db2mPuq/vYr/RuyEVx598mCio42legMi5H3C48jkx/tw +/PQZfp4vYZM4F1+/PnGtC7p7C7fQVUFlHarTtUE+Tg/ZtPiq80R7/+geua3ruLFs1fdVaSJVCzzx +ExRL6YwkY+dK/mK22czqmUyl9kUqJ8uMze4yquE6fB5Lu3KwQFBxuRrIqZFgLmNMABJPQIyH6SBo +MTv3syvi2x4pi5UsgLEiGh2gQV+N0nX/PsL4V2u0jzoP4aN35FceQ+tUAgxEyY5dBoZSGcdeqFsv +gSRdxMeFl9b6My03k4F8P62vVM9aoAXGuyhikEmWo1+vR+0TC01CxmKfnDPkeM4fdO+R/sHh9Orv +uV6AiB0zG5j4u992EIH06iwQCnNeg/uvi+n8Aq2L81LGzCEJH5ZodVZFq+QllqfT4Or/JXSixJhu +hTqtjnLgjxuxgPxasGLCW1xVhuc9mf6QTwbj/gdyOISUlR1vDZA2MRwoNg8eDqOFO/O/daGrSntL +dua6rSN0HwNVH46D4WhRMuSEmUxxj22KtNmJIQAjXYacvnEdKk9BAi9ObwZMt104VmBGiTOl26Q0 +8f5D7TcD6KnQnTtDRzhp2WgOk+asfWq7fippa1C27JM8CS7d1eLHSa3tWhUkvY7YjUMIl3oAPzzU +19uAe23C0ucgcPyHEiZAuesynOal8p+YjMKVOreAqrtsJgbgkSB5vx9PhQSGNT12GpuvIy+Ly+GF +wIHsSQ5SdHfsWKB2VdFng/rE87WEdz4XRlZ0DQ8V92hTMHx1N48rid9wkhZpQoy8M6dCQ85oegSR +Vp2dqWobtQkMUB7czyso3IF7k7fgGYokptoXcHz1Hr3cHKSOJBcqbaumcJYSooi6O2Otc9PHnn1Q +zd3UG4M2k74OgQOEb7YU7T2NwxlfhXMro5S3fzPJ2XOgDuMNBtFmpNWyIr2pSc3gbJ1V3GULd0WF +SyjQzYFVux01XwcWOm+XmBa7RkmsBoZXatn2u5ZRFEdiRz/ice3bhKBvyD17uQZhgsPo7phR8CTb +6qAbZu5r0SDEW/4NxVS0vpknYu3/h0vEn8rO3gmgwpGRfCYhSDCrzXLbP+H2ZUVZXEx2RJY/gzt3 +itP5Zjl/N/fEj+osw9HmiDIppXbP0NK4H44cfG1H18dEucBKXmmEeURmhP9CPyUAQMvwo7+nga94 +8LwXHU5/jFJBRpH0quzOBaAXRGKP9NeYzP7zcgi2z2H+CZ92o3ohdERmompo5RSikUvb/tHCH3gN +4gGyYXlQ+Pm7S6tFx72Uvj8YfSrN0HjU+mgQgwAear3GfNFdqtiBUnu2fLuHWo6Mc8SxjL31pKlC +blRF9rRxhEN4CiEp74sYtL9ZhvpRbImgFUjTj+TMCueDUOglHw8VYHdyLG2WwBobS4w/1l/zdyCm +kjy3qwQZ3XKCPkd6MqAPK0HiRxd2Wl0xurAiWtTbMzBH5LCOVFbLAOcTuykaXQeuTejseZE+xiKQ +qIN1u/HRk5wpbuefFu06AjNlvObl+dNMZIf47mavIhLL9OXlAj7EabVKFoNgqJWdblmuMxR28Cjg +TP4zp1KVAM5IE9CeJnS4bAZ0y52sQMW7QKgSThEbX+PiL+jv0NSH24FPwKqv25DhqGNC5aG4/vzT +DkMQQh1wxijFcpkqPh5ElDUfjYR8cIXD0SObZNMLoTPcrTRMm0hKhOB8cvo7n6KEFWNDSGLQlT+N +o7b2iW2zMphMgk8SSj5Gi65Eynfyx5MHsZXnBTr3dwAIs8+yNsjPTCG5o9PgB0z9WO8qzLwbLT0C +3WMZ7XNwMS+ryBzOwy6dSKG7T5Eac1i06Rmb/9vry+3bXHoHk7I1e+/4gt1F3LeHr50/qI0jFMFR +PJCC59Pfq/xzOW4gPUa0R0Q5pNHmoxETPEU9f+ZYblMKKiQuqGv4W3K8gH6F/2yZQrkI4qgKc1PO ++jW/fXraiUrIcIWq4d7l1/Xq5M4Iri2N6WmRF9sFq7h8tEi1bSGGYFQU3su1Ml23iUFFGdTcXRFz +ju8oeU9OQmolSBzJnOIAMJLkbUKrZO1mnHBXzkdExukqJIwtMANqhsFQWV0Am4TGz9sku3q6CwWA +Jt5kkjEFN715XRpWGInRtBBLk7zZTayEQthcfl6x9yyEdbFLJu9S0d1zhJoCk5jKw7OuhgIqtLaV +cIYXgjmk2tYx/+x6os9wXvOlhIKsbE1TiwduDpQHF6w37WaIOvxuYEZmIB9V1tphzmPCLJDDUAqW +WImkQHJtpmXDmf3GHhRmlsGknZe11sBkKp76GQ8BHmP2dW2wYzpL4ZzwibglygGpxOGHebE0znAS +Kyed6MTxnHKkg+SIb2oQLHxq1B7LHkpiVgSQrUB4uk5pM5B1Ceao5wW5ZZeAfUXoMS/DyRRZucV3 +o+/+AqWIpx3MCynF4LUcxbIhu9cR6dciBAvR03FvhzDtN+2RxeYVJO3W/yRPotW80z0H+wxCZYR3 +r55wzJdDDWLmQoIrV3fBvdxupYw5IlYapLJWt+8WNAzV3lmNn05knNvMY7IUa6YJ7z05a2soyoBH +8FOuxPMZXBW8bt9aHcd8GXM4LpsZxuyr9Gl8cgHnZ7MR1ntMNxL5fMKTBQtFhAswfhnlp5ks4DUO +RDW2Ml1DApxuF//8Tw4/XSawUvYTaXlRWMRBc64S51STMhTfPwI0EKfOdJH9UDUOPhErJlzCUqaT +PVFkkyltYMVEkUaZeQs/tNi+6LY5UO+CuvYpAU1p6/qlqenb5l1JPcdEoPaPVXuvFEPmY+zFE9oM +CVAGOx+wcQZw2mdZCzoC9wcryUtxlK/ifkBKiy+JtT0aCI3+cADunwKgQf9/ipzUm77LQBN0srY9 +gqWFWNbnTMvjCo5lusOrJ8KxSNkFowKLKBgdUlBfsuksgKqumcrEiItIl8Hs1QPFEIp0CVrOdNq9 +vNn65c7rVrshGsPmvS4Ar3hMWmOSWJlGC//SSYUVmxGKQwyvstbRDI+QctBIbDXfXrjFgBZKJ8F2 +XcdsVB5XRsEs+VGogOSIWFOb5UUnHlXzvt2gh0jksubDU9D7R1vnmtTqDbCb2r9DeJdB1v0dNlHO +Zy37kc4yaZ7B5sGPUHo4ZMAvjhOATk32fZvmJFgcMfa4XNyQfAYxjTJvKEKoI0Yi8QLQ9ldBDsSN +l83IV3VXMVf4+HUncTX8o5gKVX+pXsKBR2AbvnvGkp3ITOBteKqoNWzBYF3H3XKtdOvb48SeRvq2 +utoOfPFdSpqYqm4praWIAuPn7QTRRrk+PG/hRFExvhwCv+XkOWVfQV9LWIy0G/bQg36JpzpqGV9V +yT32sdZjM9+/dB+/dbG147Ik5k0hIDZEXVEVGIwT7ccphyziFLeB3kSOnyOC3RJE7OiDl3KCal89 +Dw0tid0UxuMcY2U/clfU5sfCuNBgzSDQtQvjmcW1fffnMhk3RoU5fq6fLrQ66a7PyQj6MrSaIFNn +qOeAPgxjep3RGVccninY8UUXMvps3L96/AljhkMKqJ7raYLd6bVrhiRyHlgYLGPmK37Tw29Re+e9 +4WaQL+DTz6qiFhnditlBvOVWH4vooieipC2JK8SykS6KS2UCdZsXUIZ8RayBbCnstc7tJED82Wp2 +yZ+EsRWv/KvSmavEOBvumHXYxWYj+3micBpLHgeqHo8114TKUsZFFWJ2nDSWclIO3wGkGCNHtoah +I+hcenqlArOiAX+3vJjCe7Vnkpw30fE9euli9TpdvgXUAMLTjZMDXgtyjozGz7XnSbwDj3d6yUHA +0j0PLg0LIs6AQLj/LWCRya1FhN8duedik6BUgvIctbXWTIi67L2kE0i7oPZf8AL3XdUGxz1DWEG5 +ZX0ualT9eoOoTs6805BpjKxobtX7XJ+5jiBcvZoZnEowhT2BcDCMKmW0YA45W7NX5KExPsmOeMoS +6iPK8g0mglKrddNhCOlCvcOTkdn/abtNINHUqH2Hh3VvwUQOo5ItoMpD4doayuK0o4lxkQ1Mucxg +OZMbYdEpfam4VDBMj/qOLFZ50wmLBxNTL7WHeX1znWMYZuIThFQoV2rw3TtezBoub1SFhYdjFx4E +xVyGz1HfVMiMjIAbc+mBMy1WIboVvneIZnYMs2FEkpEkbMN1jCd/Btt5jWyb4zHJk8ZKH/fiTo0k +eFXc+V2BqzVjILzn1Cb3Jgx05naU9XvcchE9Uu90P6APM1rcVBGydxqMqAYbkMP+R8QWvQJJGcuv +3G2aq1LG4G1IJQyNj6xKxhk7/jSNuLMVi0wRD7+Md0kRd3a+xBq/Ak3BEBGrGy9+PPBNMBwrJgWF +cXBwD/8EsPdB5bQsJYj9tR3ZGjEh9mWzczcBvjKpp+ro62aICrT2lLuef62zd9rNYmJBUR0JcPAv +CaYk/mDjQINRaFvty8DtyvmnCweVvy3LSG2dBmO6jthEDfm5hGvFoomdC5SfnjpmuaF81Sm7kBBB +u5szwLoSM/1qSXEmQXYodlfYfpx+NM/mzY8ztnJTi2NVhWjLRtnlx0EKJ5jidROju7JUTLNTu6yN +I2Ng8kQxDFVILXBXQ46KVGfnmKfc+K/HZ4mDtocaCtShPSbI0zrJNSucvAbyYezbKi5UmzaO+e/c +s7gTb24iblrDSGae27PrrDHGN2dQ8mlHZURFHF70OMtVsdkXG8H2APj58Y0+JYgVbOeH/l3WVlIB +zw/FoBeOKvXLP8aWRHonCkXa06u6A6BesXAo0PIu+jTIN03n16wWtqPEq4Hrymd2g0JZjszf+4ti +5AYDB7DfMc2azAOD64HVmBoGeawnW0Tcdh0gGT7nkppYgvmzD/XS3u6z72NslHxNH194JpSIWuxa +MtJjCojBXxa6nvncXGUT19xXuvRVNEYEGF/DHZO4Gm5tmXwJwVSat7XQ27zbrXsqpZfR8qP82WfQ +DrJ80FSdNjI6z9OijpNylntKK7zvgAANojiHtmceViooPC8HKclkOC8/3gZXaeoqxELs+yK/eSUz +AzZIWXIw4Zu/tFCmeH1i68r3B8Hm02ZmjNrqH+2pw46Ylmss5WgJE+uz4Q7O5yxWXmDLm6kuVSiG +M+QoCzZ8eccolqoiTTSTNnjDX1lWY19H0OkAYd5XhPFG5wd/GQSNwrL7cyV4F5TSWM9tUCsDkAMN +ayx/qMgntX/iQk4zKia8919XdMG0xGOv9BPBmUDh7eu/Ad8UCxCKTsmIkYOWKwjyCLZwXn7ZeTVs +ZU3ue8Gng0qHD5xbhalsO3VmzhmFEy0ol0D7uW6g8OzZ3naxM+L3PPW6NmH2H46lojR4o7NKj79Q +OwwuF8SaOgQa4Y5ForrqnVFPTWpuQShrm47TjSZKOGyCFJtjMpWJ/uKfx8wxn7ikGyfnduax4i/2 +4F1TtV9kMBb7iB1inHAgtBRcBnQOLQr13VqKZrRmqmzaCOaEUrFE3a13z/BOvbUibIkWHIj7tpuW +uZRXdXeebNSJQXpX98hIkVaq7ZL8jbXpjbXGH2ylIQeb3tclIungxUsR8w+nfpmdKEJ5AxYXVt0/ +BkeXph7CSWD1IUaknDkYzMk5x/h5lrm33hNijl7lR6juoEEaNYbZBW2smlRl+s81F41aPaRRlaXu +6ssHvWYWjgEN11EFmi6MK2t6OoewU3gEo0YXdRpT/MyJwVv8FQHwDrlN/LQfFcDocEdaC/Sy4IpX +E03wiqyZT09m12w0Q7+vuIoH8uoqEUFjQ7BXuOCTa7BZ2y5SHU3MVqHEjdO8AEcSTAXAyIeB9h3I +7fNM4QADRYpTvAtELAEU6cMmcrVn3X69Iyl3RAx9gkyi9B/QK0R/n/Cem2T5Ju/AXoMjpYgsrG3A +wOR3nyMrl9scTKdSZiL83DUr4/Ilhs2sXmAmbNGx4UhT3b6xIlXqNHF6oQ7e8nWY4+THBWRSwu0B +oeN5mKAn6Eg+wR2fk2K1ikbba6Py+0UvXnTAmFSVHrn8FWsPYQa1DQmr0/VPa7eXmDuxjVjuYZcj +94OKf9R8fphRnOO7xPrdq0AWIoajHcjPr/6A5tSc0QbBhVLnC+kU2v/fdGztqIfriR+OscUkh5Ds +3c/u2eqdb9HX6i0GPdg/zKK3R+Osod36G7E4H43ln73MpPdknCvOjMOE4bxIyDS2uVyvlvzQVSkM +ejeIag0Jl5hAvtavgDAFJln7yXLk0X9dLiC2CWmfH9RoEgWJukr52ynNnrBDLLehxRUwhA/HMDE7 +8R1gFKi0aNSudnaM92/RSk+H66gJ6INvma6Dbm/Aqr1aH2QYvYqAU+USYXU26mEdhMQUEigrfjxf +4l5DBpvMarF+GIx3LUJL69jr9CCzO869cM4VXA49EMauraROhH8R+vPoiCUM4oIoEIc8MneZH4Nn +4nxnX9Ce/IOkVXSx0/9KfGsyslW6LbJXkafx7QmKRB0stXLecpx3/TLf48slIurm0nAgQnw56rxg +ZUQ3m79gw/9lt/SNot53ZrXkK8bOG5EadInF8ZPUWzD9Dw3hKUjknykKDzm80OAQFgph3ox32xkt +zGm/Kmz/A7e8jMf51y/sqGMQ0+wm4/YS/bzBhUDm6DJxgW6y2JwGuwg8XtM/g0ZRmYgGbILvY79I +0o9ybFBWz80IpGWWVu+MXFva5fVI7A3gNUYGHS4gWs3VjA8eKoRAD5Uud+HrZ8cv+E8fmiHSQpSK +D95Lf0dM5C1oVnh1vgw5GOLaQnKixYK9P9R1smA+1iOFvAzR9hsskDjD190F+N0sycOrdlBpBeHV +sVyMSMvPtJY88b0Tr82GyLRL+dUy4zsTpa7v006SUt76nTqLMVvoXXizod+0e13eGWAppPh93YtR +vqcJVnLNyT3VGE7wfU7wGYiGspLVjRT5x5eMk/Firy9wpr4PezBX8KzHvgYLhTe67+PYE1BUiz9+ +aYzUyPMMvF5EPm3KtPJchLa7r+ngOXtw/m3gHcg2BCSnYcIBJapDY/hYeS8D7BHEEC1t/7YkHbVm +m6ABA9a/h8VTOZ2/Sdi919WK1ElSZ1OkFJ9aQ2r6SPx4s9qSNJl4AfrGf1xNb764ftK2GzkxMcr0 +B5Y+Rxcn15UbRTfggty0T2VwjQqJiun3uQohOoELV8t8U/2RDXqxDnbm/lSsWI0mtXFtppEF2fnQ +VgAzdAuMFoC1lKxUF5hsgiERFQugBSbvWJbJaw//iCQsu36pEEyAc9ny5zujjZTeAjZP0z2mV17h +l1EMtU3Wzr10Jlpriaz9uHRbhR1yfv2vUjSiV2zHDxfPMZJcd0iyJEQNBG8Nvaj650sI79phJBRc +ldLlBy0/jrTN4q8EXcvR8sYMZaVZrw1HGxnfK41zYGu/sHeU8aZPAECD1RSnkHSDXcdE57o3vlnS +fZtA5uCFF3vpxBNh3lmZZG/WP/G3PvEi4HJ1my6fuaLaTg1tH0KCn2/ahUtpUDKnbvJT0bV4FfdF +7K19gGlLf1DkcoLcfTvgR5BurFwtKICZ/E+c/RdxT6ekdNtciTkC85kVA53uR3P7bMhjUkzL3ell +rMnxKpcmYmLaIi/TM+dvndTFML2pzMn/qZFq56Yk7EKeWCayYL4lyFeh8VLAkXJLW+NeC/Qcx7BX +/yuYvDggDVs5f0Wf7+ISatS81hymUOGvMQEQDe1D7aixK10N0vNOc5uavG8PzoaxTYcVsIdfqKo6 +LYClADkuSpdvFZ5P3K8btEBFBctUunDfglR1cE69SEwm1ZeVWGty3+R4shckgvsMjcx5Fb4/6Nrf +oeyi9JYgu7o7UGva2Chu27rfkmD0DgUgVsRopPGbQAhPGQJxhchJma1MnOJaNtZqF9gIgAUdDNf1 +ZsxoYbgoxS9AxuCM+MbyPEpCLKRRSSRPZCM5m4Ejmh53CCD7GpO1MVrjlNeEm560YyYZ25w7n8ea +D8L4EZkVDzopYDite0NTjq4PkTiNoDp73Re+jnj3c32t/RXRfwI88HbIue/+CqqzjvK7N8GuGbgs +KeUzrTJ+uaxRMjBrn6QmpTMoNMoaKKcsiwzcY6J4RpuVCyehCOjz46U80B+6YfiOpSmPGcTzSyi4 +hOfQaJiD0Jp9smJ804tMbC4O0VaH+MwWF4vQ0te4ONotPVB2PkaL+lIvX8nWgRSDqJbF9LqV3e90 +ZV4ydqGdMJncmFmFkt+y9Xn0C4SEUY6Nj2DKMEN2it+jPCAt/ujpdhEqKQK8dYjZ8/ZmNzW8nNVi +33hrlHyAkY/1gMdrU0EyJSLuwNelWaWZQHF9yhh2wItleDnje3MWtPwuLNPwEE0tve/rccBEBP+Y +2rCFI+C802wA2NzV3wjGJiDXNM94MtMOO660gPtK83OGb6E1g/O28f2NwOfGPnhXLqxhb0Qx0EFu +wJp79A+nvtEwut1UsvCEkET/HsfBURCod/pANjvsxJliCJ/AsL7c0mJz7cqWVK2J+1JndmKBsjbZ +DKci0JqwHYnBlVu9hbnOq79sY4BNWKm1JcWdLM+fh8WZXpehmHLZ/Ngr+bPfRty2w7ghADcY+6O/ +Zv5WVC5vN4Fstmmt34B67S/NT+JxpOVrzMi9zOHkIDMYn9DHApnGEI3kvG/5eZ2yPp+lhmsFuqcL +1m04Lz4JVrg9rybw9lrbk9sK6NLc+ZzQ4ScgHmfELngIpOI/8GN0z4zL2rx88RTwueFIltDyC0uB +6VBwc5cR82mqeq+BvULHmn5qYBXS7yZ46pE1D8vXSfE1EhdzI7S73KrLypfa8+j1cv43brrj9R6y +fxjSlprEOr9rxw+pl1KGk2VCRxOevchnFMjC48IUIAAUwGKpVZH7SryXZ3KF9CIX7We9sC+w3BCh +y9NLCcJQAEId17l1eTpM73AaQMhO2XH0T26UqYtEv8Siiitqr5tCRbwE+Uvch22iVYaFbIf119sw +vDVnrDwFN0ChfAXOJiR0KBto/yY1lRBYbiDzY8s//VY0IV/URVNOA+7uBXEwGoVIyPLb5Qs/ugJc +5atX/mCBD+zKe6nSwXOlzx7hibeTulO5GMxEsDdIcznIyaOlaXAV0D1f6vRxlEgJY2kLCUuzxEYs +76zcxL6BAoINfSPaT4WHU0vbLWKEg/b8dJWYs/ksJFMv0/FNr3ECFR7VOilwRHfYCqvM5Ya37UWb +/RnUwGJrIbEjtZFUBGWwUWBtXGhBOR4PQsZLtofqeWlXRw6y9+rIfuo/EAmFOdjiJrfEH/lyXbao +6zAD3MQ7Gv7YxzodNTxQLhuPY05m/NLdsBoVR9sf5lvBfvxpypP+FCOhVwv2r0Mt/INqHlhcqTgn +QLKnFtf3euyNWidA+bbQsUyStJXh1bSWKCjDRt2ham+dsWwdMLO2NSZ25WK3MZjcWh/y3NRlqhOu +NyuJ9cVNZ1msfHbbfEuV49KLx1cMMvbhUuAvsa4X+7Nef8A9YLIS8mMenidPmXcG4m0Fsn3z+Kjh +oUz31CmVI1oWd8G16GFd5U42cp+e+rg7Obri3eDNVQ4klY5u6veizm8XVYdvxLxrxj2LsP0jWMx1 +wOXsQOibp1lkWHSRPGKVqY9zYmXDmOV9DdH51vXIQI2o8VpBd5HT8ul+TE9C/CWzKjow6Kb+PTIc +rReWLSTDogvFwCx7E4I8Qd1UzRXJIiMOSPGULD2MtAsvxJgg+z7Tyx2hDJWlnT0rRcx/gWLDJwBO +u3Wn8ZYVI8MZx3vZGUSmDTFu00EGE16bvI7p1N/QojaRR0oajBQs8km+DJUBoPkTk5eUwq4tm3oZ +p+7plTSFzFX03NscCeoCPH9nFHfJw4CPGV9chm5A//PDRrGVF1iA1fKg3R51am90ZPe4wHiFpEhv +hs26q+fMc8aWIsoe25KkWltika47EAQ2gZfNMbdWWwGvF522scId1RngyuB34DVKhG3NCUwv3a6r +f+v3aCT7o4peN4Zm7o8UtqYCyXZ8JlFIBgScFxOdQFmQKkjRnE4e8q3czMfkIBNV9jUoMZyK2s9e +hgUQtgaLjLPLIZcIDMPpcTBI9ySkSXD79nFVllFhW7GKfEnJM2lQ8gm9Jtt2yppQmlrvzSliD49i +gJdRRYABXoTLPG4630bxHvEaSMe4MAhF/ghJG9cVSNovMvorxFeGWTfWDj2t1kzF6s4n/67GVYyq ++52Ej5hPGnoqUSeeuhadyodFWZCA08zxX124LgeT1dz/hd4QueKB7X+RNYJDpd+ELNtysAjGpzmF +D+zwxHXUjF/vceSufM3/WkcAZtNp+g6gf91qapONP40d8S8F0/dufNjZR8nRYcFwAj6p/6c8p468 +6Vod5z7B4ULPt0zbtOVZbkawxoiZedsVtcTdGUEZNEGyaoYtjJry+BQ5r9WR3xYaoyc6FJQzPaPE +vvueocsLLZ6BhpjKcC7OeluRUHdBDaCDkNe0kh6vyzmwe+TZ+3RddQRcX5RVpZifRfPndQzFCDSt +AW3OUEEr3uUiiHttBldcG6x40sfqbXBuf4ffIFlyGiy1BsVYecH4S730T4MKq9KIm1coJGCypCD9 +8Cw4AOZEzqsg9/bJosLVSgYjKx+oWU4zZr16ygVV57oeZ7fEgeLFB7CBwej8C+DijyGa0qCg65lW +tdiwaGjIbNDQFL3Q74RSTv3uvnNZ9vwgcl8uYgObkjEOwXMEZ7buUSpwNfOUd2OuBqtBilLrJNEx +FmwGUbNFp/7irhDqeHI3wnRR+1sGHSTfvTRBq7vaz/rbPd+jBHM+Y6rkSN8rcNVN0euMVHpKfgRU +dZIJV39QWVQpo39dLfyFEvickw81hwN7g15jZKNUBVOUeGx0Ag8rsLLJ0KKzL5k72Oj7PPrd92fL +5RMlPsd2tRbkbFGYUDnwgfe+Kdo3ksr+2WSFQMqxd2ayJfjCzl3/uu6uJdb1e9YS+cUTRitFvJxO +B1ZTQNWx6OQ7xdGpDbQ1cSuI+s2HJDmit2VaFbkoct30j9g7QO4V7H2pRlVy6zWO+LNXAsK7lNQW +8cCuLQguBiPi04usgex7UURHH0M2Go6v3KgGZP/N2q1w/sNqj4Al3cul3W/Ecdngh7O6FSVIo+Sk +nRP057WEtXKNk/nz7ywzXDKo7rZm2gJYJ1rPX1UNL1e2Syq/gH/nVudZnq8DWgAimdNNMLY0AigA +Al170GcInnGhLqkZAibSHspjWIaMpvfOjXuVdzLDq8welihy5lDHoAsEUTFkuuCA82dV18nm5wcn ++gR/Ae9FyxdDCW6vtEXuoT2eOZWnwaw5MXq+npeQryWB9W/kGzclOcFB1SYCyXnmLTYWdM2rLaem +WXmhjjNCcTsDzn9KltYRJEhJ0/rs7qbXOLQdOGf6y5PmZZGtlUocGYh4vMFLvF6VaZvjcjVlYidr +K29XfloI4A1VwI7cf1tG4EoIcu2kpZQGTjg7oQk923HovHgDziZ91hHOMbCQ8VmansPGv5U4hNYN +WRtKOm9S+Vx2seSIm+C7UiJ5bu/GXYeT3/3ZouNIDzBGIItmm2LOAHYSUz1lpkEOX1BYbK/CTd/+ +SwObbg9yHiWb4t6End9H3AzH3+hJtUurI2oHcq2AWeWLX3MsYcDPPjNorRJV0tJ1xyHPrMxeb4EP +CDCbS5ayCul4JBQJpfffF0823KoCCkIbkeLfUfZ6Auu0nmhi68iVkcdD53D70u3RxPgwZtas8GbO +V9tj5OK5yxbobpwgeo7z5vsgUmuLRW/ZxrO548cbw1Ht45uqxLQYaj4jy2c0EEO7mYMylOGS3jXV +eX97U1yCX2H/pwoTbxrN/37ADDLFUP0NUfXkqBJ4iwVWHHR3O/du5lergDzJwSCVg3G7kKKfsoUj +XufbNm6LIW0QbMUwWgz8RpaQp9U+H7n5A54ecMyry2RGYtZ1wsWgpMDXsHaeqE4HfTXGoEqc4NEU +tvEp/hlnokyVThCrNOtFeqGexkmnb289Q1rNUXVKqVH1foBBTlKGwQaZZv8c2b15HoDnBNQsGsRq +CpxEvkXmY6icjo8HbOJp9Rv+2kwpt81Wj1HRxptHedWS84k3AjnU23CtJY+l1kh3d+2BIHpRivzX +elKeY944041iqTh3ActtGXc0vITYWgoXFryZ+NegQ2uTdH/BOO2tatBx9OrPptkYB+ukGv49TzqQ +HIeNjM5MqXeEVl6Q0veTT6/LENryOLm59ETvTuvknv/YR3WjUDYEjvpH/5VpdfEom8PVBEAD3Djt +I4Gs0R7gikA+8XHI0gisE/wr5tuP1x98ZKvaz/D3Bj8fN7MmDYNOKOt8xTEz9bN6SoLvGEx2U3Dd +f9xRZXsO2OZ4qfDJypEtix5Fhp+cNBO/geYNeg4Ra9D6vriV76PtjXXKbC5Yf/bPSu6wnQEL/GXt +mS/hphCZO7qVV3gtwseEjM7RAAfSKBKuZ6NEK8Jl+UbGvliTPV/525kAqSjurUAuTJUPCrCfIBSD +F33YmDDT3oUy+CLQ6DAc0QXa5JNllyqDNccYZvvBHuxujQQ6yEZkMkDRmf437QUBbms30uYAF2OG +0V4lRLBTBMH5cgl+WMzaxERlaZyxmAqcDeOKZsTFmsc3tMTKvh6EKaqZa8CN7fxPkzlVevUUQsad +VLZvOy1vW/2DjMuvXnxlbszBrha3Mo8Icc6fG0ybWCWgOi/1D3NHMZN5+rxnyewe6/eJxJ2XPspL +88ycyZ+GPHNZa7z2jL7f0l50X3Tf29MVuth7Z8UWo6gZlcvf93fdudc+I5SJ21ONU3HVkKcQM88G +5EwSQYXZ0ouCarya3tdtYdHGuSRUAmmFGRCljH0AuvPNdi3CUlgTb66qlWzydVE1JJV4liQPixwp +TZkqQueiCQs23RzpS4pmMojo0QO7snruzZDT55u3K/AG4EXrhlU6zIEz7Wv10vkFEUVw795lEogY +y3zJ3ZAbEgEHBoph/YqwJaUyw5/sC01dPMzuaPTsmB69hA+XrWRXo81vvVv1Rlfsfu2AcaZd1546 +4dwbMuCHY++/0BeeZdE58g5FNj9uaOwvihlUdd+yGpqdPz58eQPHwBAAnO7sZ6FpBEXx3/mNTvgA +TK6Ozlso8b49LKDqi1vICWHUNHL8D1VP1paO7PLvU50pzmEe/OA9F9gx34QEStxtuSUBQQnBIKsw +VxbRTaIPXheiF1ZXAGjodpfPoe6aNrafXeZJ5rbtS2zI3lE9H3V6tuDh6lyyensqfQp+A5XUGHsb +60xVZGRZ5EZ62B8Y8edljRDxEBEhnQ0+g7O+49400kVxAE3Azf9tNI30Fhpva2hGjjSOd7/uTycF +yDbpJvzAzYWfFwzNIiXoNI2+TuPsmEKB6sDoBBrEc32I7I6H/T/70DIh0OyyPUn++Py/e2pCuw17 +OHng1FU4KgmzTj31q/8q+mfeAiEGXexoeYMw/fcIejECrME4dxtDp2LQjbWwvIGNc4iMDJdBhAdr +l8z31bf/gVWifh3usZJNrXsSGoqgR+IHx9a7qq81Nt5uja/jB2BllnWDvtguDREMtdWJSi5QW6C3 +RtLz9Oj7Rz8jqjLenT8snSnKE9sw4j3hlMpQsa61C2i9eRhADGecHytrHVoyT36g4sJMzuuXvut6 +ndfSq8Zk5fKyF742yDcoUiZaRhBnWpCtynahiiXe5CwEyHQ3ER0QfOSrYhndk5pp+a2zFCBfKub2 +OqGznQ7KgGexaVynHFpYPW3G3FnhJqaGUuByuZNWzalA7vng14O7cK0mUktvj76KYvObIUnQnNgu +69VNPItEcAXvgt97voBsK8Ob8dnQQiTs44OpCWpvfAXhNofSa/ToCrdnpu8toG2OpXbA/zXUxPco +T81+2Fg1x25OEjP5yiUExbdFlo6bKe8qRfsdm1e4NJkhMFkDACoE5J43p+7IFcH2/SIFWN8DE9mk +auhEfkCDddMno+yynS8JTen+ClmYj25Gne5kTr1w/5hZS49KWIY3EZT0C/Cwwe20RvxbyTg91b7j +KxZk/ddfCSsddrg54NEWNZiRkw41t8YQP+wmkmKdUtZN71tHRxRY2CLNxU2TqDQLsAUG0aC9quUu +XZIzkgdjQBGZGg0adC/YbDJpcCsTq4GnJrjJ07xCKKymw+SnT/T47D+R18EUrkMu/cCGaUNGFPpR +mG33UcnWE+o6XkJOY1jm1nDlV6wpTGVJ5MuX49KubEHOjZbaR8Ee/KqVS+Pe/ryK6ED9wZywxmyX +ZYwNZxhBgWGtFkuqtkH2aWyfNNnxJ3MI2ir1z6V8pQWxnToibRffT631L9hE+tsY9s/8yyDSUMCR +ViUk7ExlakvmfNKyteBsFkRq4A+lprK06JyI2rqNare+9s5Bl3g9VSh4fFiNOpXRo0r4FUalBXLX +0aKL60KvwknxGlCRoAMm/+lPRe9NkY6isiHC5mOYTuuedzcXCWxPPIH9U8OWXcTyPvw7JEfZvAUU +fMxKgMbqDCLmPj7WhsIv0zcRiq+psyVhl/VfaOH9Q/zZzAe1Vvrc0VUviCX2odVLiPwpFf21A5Hz +Nfz19+DKIKThrjhBvhmMlSfrgiNIlYgwdODNiDbMmO49gO/HTRsBaab/jG6hB/OEtm1lXXnVqULI +Zp595SljT5agLO77bPHcWARkiK4qHjNZ2g8JUv7UEPlijVntNs8ohjeRFdvXXegrh2bLqbKl6BoL +/XFD+KMFTsxMdTJvRsLqvhEe1q2FfSDlo5ViTc3ApvXgOOEKWNO+OfL8EM6QUSK9Pe6GtU8bNLeN +DtuWmyKXx9+tcZsm9t1ko+2ItLvO9lYkVj5G665fw4J2xpBr9hqPZJjkrByPafuv95KUHMew2Doz +lgAAumR/wgHMxL5oW+bB0atPhEEfW34pxaH2oxbyw07gFg4CC4CO3LDwbOv3XXJ1jb5AkzVf+xga +2OGScB8dS7PfkBHxOw572tDVZfeN2rwGpP/PMm4qgvtrHpolIu3lAaDXx613rfMOkfhF/LsRO2Cc +E+iWDI0ib68pa8eKQnkEt+RjBnH8rOTNBXBbA2ddSwWfSt15Kgh8f5r3tis0etDRBglkCWWzFtqV +ObaAZO6AWgeWIndcOtXmPwv+JG447OEESPA1ZT1qHuqTcGAK/FVcmABrLwvqD8kzmI6VpExhiqQL +GIsljWReOaravDtHLahlIcJEuJoSFE+iNuLKCif/UiWojjSKsjCQhT7xKIwpEvrCIb8AgCmYlVZE +N+jy2Q6qmLZoWx2DDbzIBzW0iR+c13WVjJwOUaJ+6+MlvsaiExaYNPaT2NU0FQcKHloKsVDanJdc +gwIWrtnXSWDMRsxrQu0kDPC84EN64Kq9xD2Bwvi2GxHHJ4m20ygtZd5NZ8hMIOHKACE/fsA5RW7I +N8I52XL0edyl2b1y6f+uOfpsA5zGZ/iFF20jsgDbkLqtv6AfZuCWCS6iyiJAluzAE4PlOf5nHIoL +uBQ9w0zbrKN7Fn6hiPXkLGjcBPbJA6BbFvwuKlyw/CyKNV7e5GmFwynsIkVWWJhMCdXLiuMIzrpu +05Tn03ik09kLjdTpiRcuQK3alCmfWyiSzA9JBp6Ip5rhGgeE33m/qMYLTnDZ3YVE7QDR0Jjahf08 +gAM3Dk9FudJYe/q0VVYZ83aWOlafreMUfwu8m7U5xCttgLTOghq/x/DSjc9aT0nUShq+PPqj/9Dg +78hWx57StoUdBLfad5Nv6Eln8nCYID3ADttGFZy+n3Dihnzc3WZsFnQTtBK6PfzjBhzi92SoyVmZ +3gxhpauUjJfs/FzIbLWSdI7RfJWWnv3u18+OjngvR5nU9H/lA7ia6RznGJzBOdHvyGDSMN9U1Buu +8phii46BIYZthvDbAwjMmbMgs8Iokv2/v0h+9QyPZlfuD3xWRFMM7SKWKtAZktrNZpLrJlneRyPX +ZjeGi6Czt5JTAg9ujxgSFK+7tEiyMFrA1F1GJ4s0gYf8fJGY0IS9HYKfWIbz2Y9h1qM3Q6r56amW +WWP5Xo4wByhqffa5p0oGppoeki8tLKN1z7T4U48JRhgBxK5LyVwA3m/ga+lX7fWanc2vA4K1zEfy +EALAwvE+NFaGl8HiOpbz5Q3cnkVaxnfnlDyVTbvoJn9n4UJeH4Kf+XIUPDDxbXYQ6KViOtr2cjHt +/QZHm3dB9KJbCEJOzhHW78kylCXRL9ML+fVEAre7InKHmVmq/tH2pE7vGWW++yHZdWYUKxrGf1I0 +w31QbgH9VH0U8c/JXCAab8IFYU7XQxBX3I9W1HApBPPHfE0bSKr6WFuYgwdgRunwN887r0BbhtWw +8cD5d+Yzq6+NDaAzEZ7UZKvvctZWFlbcpzZvlhFfzcGC/HH+pMzxZ+U9h4sgA3TqQDQ9exc2s016 +XyQWzzFPbo51u/qChMFN88PbULcRduFAhIxwYJDouIXWsx4bEeIR3Dysa3ute+j+mQsbg4fOffyK +m1NjNRS4cRQ3LwCid48YofAcrWQIgoSUuj4FNFJa2tmX/1iSxBWCVRAkB/0cMZp1JYigVJHce+1E +HDKcPZOeHRGh2wGlU+iVnmMzHOdMkcK6zTMsCQIrjeDgM5yU2dXgXKFkc7IyPekIlPPqioU07ODT +mYE8oaKQSQ/B2CyffkUpDbkkDvRiPwFU19nNysIFj5oqHm+O+deUUDvG89187LwkdI2J55Q1iOUy +b062rNTFiR9HsSzsGfgRanreNTSCQRJcR1idpCmiQg6OmW2/Vt0OOUbGdGjp5YAyeov0bvQaG1MC +sSs+DC99dRn8cdLMPjg+hfA+hKWM9ul+W/mBmeUXG3k2Tt4kQzLaJyw7ABAWbiAMcZ2vVstPnjdk +5LsL/OZcdxIUa9i8UveDG7J5WTThChRphH0bmj/sp5rdniVGdeRi/AUUSAxWURtf6YhkcOrft3P8 +OJSW6gMyG+u36SDUJLUYwkqtxsrURayIVy0whcJVYlDmcuWCcZvk1e+46FDFPkmDiTTFLFeVYKoP +8yDFIou92O9IILoPT4Lj2dItlPE4EuDnwpUTWrQ093EDLXqhLco+UIdFK7Y1yuraoGKkkiiDjlPC +o9CG6dkmItZUk4rXiXIOXOQHU3kC4Bx7XQw1ZqesQLZyPZRg3OgSqW8hJRpC+5Q40HqsSFOjArHQ +EiVOW0ie6vrbhDPAKwfwoC+8eMA+pJn/27Fh2CAdwtdGPOxkFuqDqgir4Ly9DStNLaxnoJEkyfG3 +XOXt+MvVfWIffrKkn3Jc5tczvFKkOwf/xKWJ3tY4hagpVgD0WR1samsMG/YeQlnBtGQCO/cGFNUt +/q7hw7eBe4GVbbUKum9/yhs7pwH/l2JzPmI8nrnGPqOYXZJknGVw/VnuXk/uUTowUqThAGNZYWUh +bEyM/jgUlhq7PBWuVstQUl/2o3lp4Z6bD+1h+AqGOSySvKujUJFIpGSKD02rrGLGTmaEWy4kyI9b +nAUr+pGiNTDc41B++HnmNOCk2epMOaIR7j6r7VYWWpqt68SJHS4LJp3LrOhsnLKrFDPxL0npH/j0 +GMe6jv8cQM0fh4pLjZaj6JCnucFn29gfGsfJe5W1diB5VQu94BFZ7BeaUccrftFu+15cbXs+TkYS +rO7D9OxIeg1vZUH69sxnNk1NdjHD6dD3iZuq/EDGjET28cf7g9GGS/6Q8imrcXjdRdtvV1yZXkcQ ++LY2aF9FdlxhBJweukkgxZRnzzOiVBQGNJwFC3A8v3bX8/XLnwk67PQAub/I6UwzZNLMayRSczzt +G6cN9pIFVH+yjdiqGOjqCtVnPu3UIkUaWvl7IWr+Org5G8Z6UdAhGSPVDMv/fQlvw8sMDcJDTHvd +y6DU9zbg7Y9W0OBwgVYnlCB6fKbD19SQEJsn9sqJpQBCgj+Ukveg2C1m2NkcbEUAZ/HC1EI9+Ymi +FWgnEGWr0aD3N71sIS76En5H7TwarXp/qbU055C/j7EbOE6qbcLk11xTcj9yrOSoEh7ETg91zxPn +4yf9H8/qybPtQLWuFMmcjqiEOV7F/NEq3Xe8XuTSTt6xZKPviOW/QZ+mrvM2wSDI++Sf6EjNiIW9 +8a0xH/X06Y8DVjiOf+pii1o00bhsrVSP7dzc4PyFborMeK1FP1kyDOxeEffsLUUEhukrM2MBQF0d +baRcuktyteZzk66MekLf1oDgwbYpFVbQS9SopuisFX5y1lGH1l106NxHcaR8gt9hoRwMvxBfmQ68 +dD0ayPKb3SCC3zhmBcV0FEkwOexjSUxwgj/yKC9h9LYN5gnAUsSY15V39sFaRR4WSa7AWJKsT0cA +llaGQ60utyOLjUvaxAmY5YWm1KjlI8R7X4db5LE4cD5GAS4Oy0Orh/3pmzspmQVGNeFVMVsh7IlG +kskW5iLxuiFQ3RwdPKi2MFlqDgh/N5Q4Sjxi6Ur5Aa89SV50qF3sfvVW2OCHuMWfEfkrgTI5rj4D +altkSH7Om9nqXgiGo7sLDQTSP0KxJvJk18mWTEvEq1rzqn5OYCVHHps6VEgkGIgV+xbXSAtzjiuV +qz6FtueiE2GwuQWkELsElEBUI0TR/w579tWUzy2YKeTZiWS5Kh9b4G5TX5sHdBeCVpdgzxo+mJ3Q +hyfL85gnrlK/2xg8cqWYeGFeNcEWsz6wZJWZTSRGibqNIkpOO5GO0n2PNkRLuIXGCjRCCpC78r1t +yk75dTCwynSKQmWMz1NKGkt+kLSLXdDEVWIewFw6bLqWkC2qA7QWdsVH8sa/rNV94WazfsVO9lOT +4iV8eWAnX5LjlB0ynOFRQh56S8Vf+Fob6o+221dODXzXypeq/gR1D/fhEKTDZYCl8z5JHPRMIMX1 +zzl7d1dFydcqJwm3rqLQbwyIfCHTGt5teiaIZjRblJfen8kmGzfVUPHMM+xaQD1pqepDY4aIaKIT +bX36EGblVSLYANGSffWI4U7CRVLEcOx/rda5GOysoW69DnTVyd7f1ngV65WS3He1E+mjz/hFfiSi +wTJY4XTRPxdj5KBYjBGsuMFMXCpox4lhzKOpShSioM/vEguY6kY1KmK5+P5QxRFBI35ryGI867Yo +Wq1sKELCECSEpX9e3IyWpYwETpFHiCfg+HVattdjowoQzpZTth+JAifUqU2cb3pJSTsGJJmjxKFI +vAqTXZ+YZSoOARGQN7EtUSpODH2Y2v9Jh6uopuWkR379ZaZqwUL7CYjzGKKiY3N9+jBp2ibR0XTl +3TMpg9OQK64QqPaRuowidNf6q4au8+Kvy3vo14O3JonWyer9/WGfnShxAx50GMjqSLTLQtJWd7G9 +1hxMz5FmcCN/Yhu33xW7NcGf/RjXxBQVig0P5KGa2+Kha7X7pTKcebqo3eowrz3qrUFaJJFzrVeI +bUooEVSedn3/ZDKeu0k5TyXDhpJS76rZf3afKp3scfuNkDMzHWpewt4ggDv6NGcdi5nuklpoheQ8 +KKB7/dyU5tPI3sADoEW3sLMe7PfChmE+qCYlUUx/cvRfFB/EFoP6HAN6H43j+EX+O2dhhtD6Xzwf +pYjMpGWaMD0igXctuT5wCTjzhFape6/Aa5g+d2VpGTz5hCsR9EQI2id2EP5m0PXzX+bZLgWPDR2P +BcX4V6wBdDiQKAycmKTNijle3qMhKykFEZn7pvd7lRf2IWBU3jM6edcEpKh+bGGQGYGGo5msKzwW +BwyvUQu32Wz4YD9+mxbf+lP6IaK2bwMlkZ9/ObYVSZnqI3Q89nPu1u6/JuXjA9ELiMe++c+KTllh +ICl1RIBDJf1ZvSwGw2Xar/5cyjzVdvfNehhq7NVZkBYA1UO+NYVV4Z61MN57jUudasmPwU8bVeUh +o+ZRm3r3Vm6ukGazeyAp/LbND/3P4eObGuBCHb7/vemXau85RIqzfI+BqNdU+uHef1cpUvTmxcL3 +/uHvmaznPnUPAaidznHjKQ84zAxKxPQeu+KCMRIDzoneRQfNJi+chXnLpBhDZyzklmXiNNjqJ+OT +AoCDXqXlOrxlcDA1deiuuwZAa1dw6+LGnowXtUUswquVV3LkNLQ4Dmm4a7en/PXnnDmgsiIFSMwo +wPjGRbZApfHQa5Im3EcUTZYJD+oCKOq8l1MrVEAxX62FswxP8i+SyxVOejGwtMcmpuMBBPnZ5eZ2 +671+kg9GDQ9gYzOKue7tpaxJVycv93QCJ+pf31eg8+sKnru/vLd2MA/QzZ1u7Q5He3BULL4YiaNp +aR9vyh6eioaywFNQJmeC8dVC+3aWrLs2Cme9+yPIGJQzvdWjtpPWFJb4sydynYbA4WIbAyUyz93C +f0kqscF0BrflfAPWaxK484tXdzvczjMhVJuUDI44NUW3+z58m2+7WXgrt/e7XMsYA2WC+PkQfIfv +QzqbnRXkUYHt9XzbuKUnDA1pZf9OScesC13BGSgqyd3A1tMkLGDviESJzO81+knmXjXyIyf2ffSN +VdS90MIeUIrA/AeC1Q0DKEHpOVC7MeLGR2a8VRUfmaCVOj59vhEqQWSz1YsCuZAfsSVmsz8VEs2l +ULe0OnWOJGA9ZfOzpBYAmE0f2OI19HBNeasBq7SzOrnosQeJY373YRDHSXgl943TekRuxc7gnqdS +be4yj/i3VkxtIUc+x8aMP5m0cZHpsUP1WBgVRIYmEGL+7ZPU8Kq8+svEHHoDjM4Nqyki8+yNunmt +0BphNuIqCT4+O7LzKjM3dLguLUFeg0SmxVZ7FzCqxRxkQ0Ld3m2NAiRHWuYNhQuy79jhq0N/3dXE +P8FQyhbOFcfm82ALmV7grsoIpemHX8jrpWV/K5DhNjCp2+Z7KKN6rTCN8W7CHZovL2ssLJdJqRMA +Y7D4lUvljMZYQS3DPW085mlMaA/mMN/u04/kjWUJSm332TkCAQYVNlNbk5wAqiRYDH5hTptQhPK2 +tTFqNzfIrvPO9FJkfDOF+hPhJmj/Bw5dDAqgfj4U2D6BaEzQhrbbgJEATktGzsfbxXsOt2DPPDzX +axxOQ5HF/i7OebJG2aT2Oza48m8wsztniTrAwxIvcb82mbQL/8N6DgbA+VtBRlKQn6+7oIrc5SCU +h3G6OM/HIGAxoy0pNn3P6DAMq2gyi84rz9WEJD5oRMz1wdb7oSRnJrT1Fy/BnL+FfJH1ZyR39DnX +rH7Uufk1Yfb/qpPWVc0Q3s02AWgyrjyqnolPqHmJTD0HY2AYUqEb4MVW5hK3hvHyPWoslogVqNkd +U/PMJ93JQu1dII0EWzXG27ji2++n1KVQTtqxFr/pBMt0JepfnBMzTuFU0RaVL2lJ3KvOktO9X0XG +sFX6/b/cfvU/MFwTvEREZlIlvzjYUxZcqeassBy4yMq7xkDrx51XXJgf/XrfMzx4xyML+MY/XUYN +QKdW3dHpJqd7yo7+wxLE0Gw0Uq3//Ikx3COihJ5fIPH0EozBUMWcNPJml7wrgB2aRMhtMtAgoN2V +kGK2XnZ90b2LmoZemKCIsYa4KWWBNrWiDC5BU6RN5CQChJv7joJ4m/9TzE4oPmMVU3/IHWj+uUBR +R1FjMsgGnyeNYZScmSNJID7lxRLFcVeq9iJpP+/N6Km84XbruvQy5QrW7y/jzdLR6e2oJ7jyfrc7 +XOH5u0MIE8ldvLWxfP/duyShY1F/Ngm4v0H5Ny5NxQw6yrYI/w31OZDqpGVbaS1Lq55VwQ7CWOfm +7PDorGv+T1FdLOy2FScnBbjd5vDxUDgMSRnP/55mWA+OpRylu+CQwGO2A5BbKRyE277kkUzcZTwh +DHKukVpSjb0N6HEeg84+3KbfBYZjPepDMPaoSspeVGk03SHF3UNVEYIVoOEQCAZh4tEvPzqDGcm5 +YxinEZ4jC4/AHH/CzL2r1VeYYAhXp2eouKDdgqNcoRGf6SfhMsBGGPwNkbML8HoSxchPhKYhwZ9z +OO4zlPv7iD+/fRWNwUchp1WlCACcvBFKLeiLCUypRGElr8dLcJ/mAppTIz1u0bsAh6K4WSDBNsSL +L0Q5grI9s91H+QRRhSMu8r1My0il6QmZ+Avbz0srDc4NBZrH8BVXlexgarocWZ6zQwrmfTNoGpO7 +g+ciGhgOJEzrMAj8ggo7t8+s64OdmsH2yWdrqXtbqwPucUO3eQ53cs+w4sWkFg1KJsD58a3eZyN/ +4l84SDsdyr+aqPFosGSqIwBXUhGgT/2Ej4dPzYq7Msf0EH238oQjj2c03GornRlklb62lXgN+Cdo +tJtPlzYy3w7roKQNbpxcqJsz9m2qULudK4McOfEuX0jy0JpCSdEJ7fTR2cjfH61TYTBcHLfLScc0 +2LAFDo1EweCCqoRueuDh5iIOGro5E/dmA81+dKMGYEMDAdMCYbX99KtbRu3QK3hVMsWDEqxTgOGY +G2G7drGnhxlzsK2o4/Fo7VtE2L0A7gsNZm424KmaT9e7UqNfTBzKaaVmDwMJLwaAw34ZF7zXfkEl +5s52oFh/lJL6U2tYcXZZu7wLsVj48sWR/eAhu07kgcVufUGzyChwd2bWUi2PuIAu12ZHAEHTA5hP +7MHbB2OeAvCUbR6SJsTDVhnibUPwjaNsAdxHtzGVr2Gntg56Qvr2gNQETt2E4uMbU6S02SpbY6k4 +0vRwCbGgGb3OoxPhsF+O+s+BvIcuDBvSvy7z9At0kXMdhO/DkzQJYemeaIq1rq4gJU23UyfyepmE +gqCNt3frsXOW7whwc+XvW9EyJ5F8vZL0TNljTymd1sytE9B8axKqdrEvOpuL/jyTDvl69yKSFCaQ +XLuBCmxvczBQpvT4UG46jUGZOSKg7S237TohQh5C8Rnv/2q8KvotiU7xi7MbibVCYgxKRCCxEhdH +LtdPNjb+MS52NLf011FI35Owa04aWId6Qj8qetYs9N3kRZWvsP13GZM92za/4rpnUnvWv+iPxiWR +t2WckvlCkvr8YPJvG+HWuP06jybzxG4phkV3ZaAKHGcfoIoznHT9KBb8Ots6aJrOyGeKqjpJGmv4 +rF9K5T3ndAdKVaWaPjn0KxnhA/XfJ+kUtWtZ4gWyG/XtJhKUaDErw/Ur1YkvkqCaL58H3sxVcYJZ +3Y0cmsef3Xa8+rvW5glqz5C9K7Q9lsRCWaZwWY+OxcYgWb2NZkj03CTayXZMAq6ABGwpsJ9lQ1Ga +ikdtYC731YmgCbV2klZ3nCAZRkd7PJcGzBAxXeodxHS7KjDgL/UBrrNRxSQP/NzSOUUtNX2wMuCy +PiS7h7ODtgvZD1TboMLYjHmlLrgmyeFRt53LvD9CJoohb2y0okbRoFbFqjEtXtkQvyHYDkjc4Hn/ +wOLaFHHiwiTVFliefpJZ7v+WX85/psyYm8tXEZxOdxqFqjdLkuksSgM6L5w1JoyeCPc8U7dF3f7X +g/C/XYbtRvuxqxK3a/Y8GulcLbW9w9lUvfq6wLmGIKkzIkAtDVK1keT+LSTnDja3vnoJsbPeKYSa +z0HlHexJkRcA/JKxCVl/IjbKxAa4nG9B0du0AJdew7sGIMMkXLzC1Hz+kh9c338wD3Fokzg0MBB+ +NgTt6DvMOACJhXYnxamLutxl/JJCK4YiQHMW76r9HDbL1DJ0lAww/Sw7yux+jXNuQ92cNYBuZ6Wn +wmEk8eodVAbNXx2w6vqtazrb3UVej6MMMZxdRwPtdsE2ZW33Z7ScENW0F4okpeDIwfGtHNvSDr4/ +1mIjrKX66qY0FOvslHPMSYmVdFDb/VGuONfjhu1RO3WUv0yLn6nemFEoDujtOC6xdAHQzofC/+/9 +gpvs92Zctrpt4S1IzyvOyIhpAUCd/Qwedfyz4DPS64Pf/dzhjA7wCIm2nvPObGUZN6rH9GXpU0yA +JOnxdPv6TKl9vwgYo2ldgGAZFWl5K2uDeunyPQD1DxoUrJ4x5BTVWVEq0lDHSa+9okjGytQpjPjH +HjBb5iM+h67rryh5+r5Zqxn7aMYUbY5isczHP/Ybb1aX2zMVo7ulx7JP6lzVZErBnYbWxA3im2mK +5+28Y4x4wHnI/BhgPy1KP3ZnK91mkjcNjPG+LYPWBMx+85iJNMwPViwOXJODn1WdNh/0RmHAc2Fc +WzmaknyZxMue6M+NoXtC0+ckBlnWK1FBVWNShtVNekvose2ol235yMo8we3PABXnKEY5yE5WRLna ++5KalEdjb18O7bLlh9UvdFpJ2QIw82yZ712iwhCZvXl6x3gUqD7GmzMFz2wdthL+WR7tsg32M6ol +7ndEV/RY2LT6Rvy9MBzEtlQp1agI4mRbt58Yliauf6qkCjH/jrpP5JvHR+Xoi2VJEEcaMtdYGAWH +8rLq3TVB9n8S96g09tWwq75e5vhhZHu/fAvAUwi1PqaNrQ3CqrykmuS+1VxGvkU1cgsYVwjdqJ0+ +A0di/lJDDzjqJIzUrsflXuEhWCvgBAXI8DU3fdK2+uyYyx54xyrqHz2rbT38QHjelhOJsNE+g+qh +3lehgiGiPDS8riCjR8a5sTXqwkif+TKwkvpaxXzzThSPtwhPPazPX/6mIMdwjURcIDJWYovAYSUh +8qkvuq4TI/t4w4w33SF5x4DbPn+AIvzNPyt8YPZfzlHSHGkWCFLpVtVvdjj97eLXCb/xJUyhSaQL +o9o3I9qlECy1Our9YFBNiX2VvquLFp6eObUvuALEPtyg89WYBSnMVeLDL/xY3uHyTLkVqiP6VnK3 +43N2L1vEzXCjTKXo2nMEJQs2neOT5H22yNMlH5FG6ILm4544ClVlORJp3FjEVoszTLWN1hx0fhUi +MOJ1R98VTBtyGb4XE+4Nu1yJE1GZSgziA5N05eTnvU8z1ANEPpUXoApYjG2jkpUP8sGrDSCd2p6Q +t4oqVh3W7OADDx41Dw7CEtcED8i+fIEA5aqq1Bt4ONV2FaBIHY9e//uCnXyalwFB2lGtDbRTamTe +PiRgONR4qRZUiiNk/cIpt7QoncOpDVR4o6qR0Yb/0Z/Ei90qsnKedYlGgkgkKmFtw+J5mppYSQRq +iOOBMAuJ8Bw3h61vdUGjZHRScRShGmsMP2QvLb0Dvh1jePOvpYUfcNBShGHmcJGH07BFL5s+tZjJ +gf1taolab7K7+KwH7O/vrPLRQpQWiQFiJP10UI7EKvvkHQZFPDCdfoNrg+Ts65er9eC6aFySq5A/ +eZ/3R0uib1nsbM/qmYfcSVpu9rGtJr0vQP897d0D+k5+b3gk62QQFkeo62vo0ytMgFpYGLypWmrV +Fq1mRxpek6v06kFJNIXMdrYgnMLKPYGMl7Q34AhXpJ0Cyu1FJHUgDTz7CrcIGQp71xYfJtLoME5Z +MPnqSmXoBpxmFo2lpSldKDfwjgGHNVr/dKH37B2w9ye2NByz/E5WXHfEi8ZTUoJCO1KNQNBmbGAQ +PGWUsKum+Wp4V+8ap5lqpjt7DImTolAR4YaPk/w6jfKL5AOGG72ZYeqzmj3xecw+agao7hqp6Glt +Du3Bj0brgUMIygU7CiDVYgZ7citdH8zHchOCRMcW3IRfUkcQtNwmtNtk9CuuCPwMpFqwm01ULy2D +ui6RDXRpnSefT23liGL3+mxXj+QY82kNedZIQWfpMMACzSzgu61XMjH0dqKOqeNGqOF3Qd5Mjswo +ykRMR67eWSF8htMDSf77pkKbszseQumSSVxZ+hRcJUdnDKvavX2czWFC4K9orpfdJ48sIjIotME4 +6zvHC31qip5LlqX0B4Z1XsH69EKQwkUO72LiK28hUTCtDLMbHxuidclWP0RBdaLw/Q9akBBVncGt +/ZMdIG1r5676B/Ibo6h63RKWTKGS+C8mADGreSwhlULD5Fj7WqkcGPPfjzpK7i6PdDmziFxBIW6P +7xIkgIgCov92MZVwvrKiKsyNqtkir6jS/3XA0fjMl2CW8YOPoYw66LX1EuPaUWglYq5hpKh8Za63 +l+pTGKLLCUPBaQni0as7zt2KIfJnQ5Nkqjytv9a/iPPFdux8dMa8zbqf1Kwn7wLlMCl8JlxaIk03 +n4vDJKrfft6rUvDioPIcgliTD/uwx6K/JE8o1Zy/D7tV+hj+cBgqqdQRDjtrmdcnlDnT7rpXqIGa +9znSZVl7di0Sj03j/AWT0QrN61k8xQu7lMPO3s+DzIsh/nmVvzl9DcHRe8JxTvL2hThcQGffSXfR +3fOsbktyDlgii7bc9VNid2/J3qTtzThIlEgj+E3FlOOkszZhv9ZSSWm/icF91GAd9S+LOCF4i1fb +DumgqRRWDSunHhhpD5H466zlXiv6R06gWiaOrbpjT6/gkCHPF2L7Ow/sAGQuQp8UYnzYRIN5y//C +iJ1fGABvNN0Z1Ij1BdEgWQsHr4OlGNaR2110A0z8brgghr1Co9+Sq7paRocxfdbZC35qnJ4H3TeQ +0OF4c3LIP7MoSZ29nPmG8oCIcA5TayMZf95fS5c1EdTR2crDq5RAVVsEbZC7Wlo/rMSisLwxO1eg +EktM2j0EETYQUibSW6k5hPEiWiBP5pT5u/Y/bFbF8/NdpmV8bJT2FC3Ej++yyAgFllpikM3FIOX4 +3JSCZn80MERMQi7hCMeCIkn6wJxui1VBuB2Pf82n040Z3uc7gvknUONxUhzLhAf5SVrvC/KFwBqn +7iLiQpbkld5ZfTjd/RQfiC24/RmbvF3l5rqxAeyO6mUDejeT5ZHkWZk2qh3pBsOLdix08ILJiypd +5OdUjfVqpnklYvAEL+2/jZTwIfFQwhOfdvHq/1fZ+P/fKeFDwu+btx+uyGqYmRVaGSCnH0P3RkXD +OExYgLpkGn0PZRRZCtH5XWZPTlUIndFOXtab86xPFvohIE/rLL3I0y6ZLAwF3S1ItugMwtA7n1XG +JNZn8TqcHCs3qoUwPjZ9aBexl8hYv72T1rW7T/F0k0vAueI+tpeKKMgYCDucsuvxCQd+ZtFcCXQo +A4sMs6ZtKu/yFVbkyj6aD8fX9zQMCYTIU4hPNQUHQ2zNorz9bW1sOy14IjQnaR4Z1Swd8AYc10Xd +as0RO9AEUX/6h8htz9HqFku83ApeWwrI7WWDrDpzp1+peiMjLH+JKmO+i3N54LjdcnO3Xpo/KxGg +wY1j22hOX5NXxWavKDiFP2EXRgMmYil50jXlXt4poT/6FcKoYRAOMi4pdCEUmFtGMUfh6mncn9ue +ay3IM/b9EYnr1DFQqxX+5EbUFxxpzvtSMlLrZ3f4hTyA7VXAVdLmJEzhIQnQcY5Ez900j8RBPcYm +CCf5lfJIFDFy8eMdE6YHDa3OPgXT2MXwgwe0OVXuDgnA+oWjCrSZYqPWs3ld/LyLz7ut4OYe0mql +/paXUFDmWxVS+bVEeavdiZtpzkKEDfyAJoKi2m5atOwYl5bZFoj9qgvoFun5aD6ot/x0NtZE3haM +5aka16aRluGw5rk2YaeTKRjfOs7fJrDAGjg30d+hB+y2A9CAjlaOWGwIZpA2oLsbqGXSLjAFjRLB +Z1gpfKDz1jKd8ZyUSX6vh9X5GyaxwvrxvkhWR2IEx4paaWcVm88vp3SO1gFqsjGpPfC4RZe67+EK +X7QFgtfrydfklocw48n0O1V9rSnu9QDXdUeIU767O21lqBH1iupJ9CDc9t3Da5tseWfipWZh9wjL +bv2C53TuOfbJunrX5/310cSSoLV1HXr+0tjEm41QEXODNwnfGCJi4ECm3jZIqIyJUEx7T7pN3kGw +J6ooC6pplQByXW2hixGAX7G+SkanQHSyN2Up58bCDMU9VtdhVy07W38J5lgWiVAyoujKIfE9IitA +N2BbHv1G8xAgRyJ66S+CoxEg2MAM7MaZavt133LGGLHOe0nOdzkDpJDiWn75KJb0iTqOTsR8R7nL +o4BnLUpRYg9Sozkc1uMmRxKOzPt1Iu51JMtQk2pMTNYl6DEKUnhpNppLnC9z08PpcWqg7028lFM8 +FSVZStf0He6PdCEEgUPpG4LxBWZ2gwAaVXVXax94GxBMBG4xZTo73g4QCohPf3OMBqX8ywMYUg8A +hzI03aYtTlbBWxpnx3OW1xUAlZkEbVYLi0ZNehIvcGVa79sAbdMlNRqtYwt4CQvvIMyqssSkVmIF +6JTJ+dyhPZqn1Ly7dpnexmYzTNBCwIxgjha2P+8ZPsncNv5ILRAjjf4Xi2Z+3f3McYrRIuWP3JN+ +8c9ngKpbxxbSeM1NKCS8CqtFp6BR2BP7AAhj0i0eMDrXe/gWDTrPr9Cg4l+h82/AqNYvBN+89TnB +sCC8iY/OW8tSDYP59xMmf4q/iQpD/WqSX/jZIQ1irrsor4kkbVwkJFH9T6iRnm2Bw6AfEQaGeo7E +83JAURTmCpIqZRF7Sa2466/B3caO8RujhiYKESNU58OIyMT25HqrIwljjylgrAnpw928YkUt3ePc +F19Q7ocyq/rBnb5dKrjS8lnoamZA+omYETEoJZ+rRUbSM99Aa9hz4z9aFzXHV7V58X38hNQudCpV +eUv7+I5GB6AuiF8gnI4DiVKSBA5S/3wuqg01MUOh/fZQnz4rFgvCQzJUPA9rrDgcArKOn9axw66I +c+A5r0qZ9qku2RsItBFeu6j2I8VVYbIE9/lwRsqZTFeahVe831O2FBHXB6h3DzKmeEENY9D8bB1T +jIMg6OTYjzJGVmk4Q3T8PyGeYWCtQHaybSCH2Tn79SaH0MHNy+GvXwqryfFX/KIj6nJr4vtazn9W +XO+Xo9PfV0gYFxDqGzWl1/fIRUfOSE3QAi9/lLM0aBKtmxjtYT0AITecIbnJxH83aNlMuRpP0xdb +/jZlYrSINoO6Ui70q9Bs5QUuSPPJawcNthQ8vGZweoTDkkHvCjHeVdgAm6/+b/WawlE4gu9ayCFk +UvKN9vSD3WwqZ81Auksfwb6xNQAltX0EMn6M5WdH2WoTCZgZMg5WymCIqLFnd0Hhd2pN50UfApJa +9tU2US4TqeLlWMQQzc+/SvRVFPS4On4MUl7R2m+HiSxHrS1410fHW4Zkz80SBQ/Pu8ebINQ0EPip +iDqaKs8FIAFeZPfu5dVPf/cww+no+vIOmUfSIDCOOau/8ZLUTdcHxM2q/eql7evrMo1epgiGjUJG +ExwT4AqcAX9imhKQYdFvqXsZ51v4z1AzHkACy5Ng0cNyS8J5rAA95ceRIhMPBCgh2ayoegzAAOyA +CqzNtPwPMMPcdjH7L9nReL/SNz5hlz00w0nTd4q7m5Xqr81hVJu+0DPz80G6EfsmjlwYMRSNbG/a ++WZ041olDdgk6h3wCY4UPNUTnUR9x6Ql2PFAJ/3WoMkPF4Rw7shzw48E5T7FKVlMAGt0jokpCH// +S9fKqsTdbNbw+9+yqEL7Yqe2bqASbiDeU5j2be5b/9eFs08ILbWqIFi5F9R/A7YvxZCq71rTBHQr +ZaUE4rFB3Vssmk8YHYDM6Pi0nzdSWF0rhtirdLH54sJw8opDd1VvO+i4u29+OTmLNzvAI+hUQSMU +rThxEu/DXNeiG4eDahfqOlx17scwOp0iv+K04zs3E+HEyX4tKJgjXN10FYgsYiSqnsjOp/5UGV8S +10LhUht0OEjW7ifiAbnoBOEKgQNveir8gTBvNw9Hi6yW/G2XDqaT80IUDBj4aIfShelqdcNAmFwZ +XD0tMbyBJh/UktDUViWLIQa2113lG2vGdyqS62QE/BDJ7cu+ycxGZE8CywfRFHJS/hqqqZST0qzo +++gNPN6Jfdv2fjkBCLIv3pTZhdahNlEZa7YRp/fYaDokqnnhLyV0DPu/NadbSjntBa6vx5d7xEp1 +F3bujbBaUIIU1joCTJL0QarxgsUMVfFF4og6ZRBsivLedkgAChNSNDFjsIUXUUaCXmmqk5ilsnNA +1P90o70mM1QFIvk+ZpuF0pWXQk00wFywBL2dNQvnhrcK7zRolv0Qa3rbQixOH6qM3noQUNaGZI+I +GY/aNVstrsB6wtgGyDZOCfNMP6q1t9AHxJCnTlC5hRpTWL++AehcqUCk2KgLkptI3T3tinwbeFPH +jMBkYUxLGScw1ZAb1Y2vZuno72jlMkfAAeR24S6Cq0PdM3/n0AQTbY4iObnWzBiSgBSzxQp2lrI/ +kL+GhsDgjpreqpIS6XkTrSFD+20sJeBRSoJKNWGOo4p+y5FF672jGzUxPVOVDjdB7pH1R+BzRxJX +FSCR/hWHPuOkU6w/5MpJjIJf1oZPxC7hvoIvka7Y4AQFwjtfQaiNBEBfJxxxx+J1GwLZietdqKcC +A2MZkdJj2nJhC0hGu2AoEA/SmM1rsukgldAtPocoU1o6NfVa+5eVRIMC2Cu8E3Rkqi2R6BAcO0S6 +tQWqmC0aD2+G7jbHg5iZS0eq3qPVANpHSssF/1x/nm359+FrtaQUenwU3S/dDWvnH4wjjJYkeWWY +KNQpxT+YcIWTCrvtJ2G8y9/Ur1ythSd8LMz4JTkjkjkCRSzPKULfPBa6Yq8bxH0SmmbgTaxpg8dp +/3QuL9ymSI6yOBTx0cEDR6k48tprRnHwsCm/dHO0jnITHSIC0ku7+1KwOmbqMnte5tS48GBO2SI5 +hKHzO8wrPLVHvxn6NUJgfpVNsniGBG9Ofx7lUG8hMimt+2fBJdKNt1/v533pG+mnLWCkSJ4sT/JU +tLkYTRZJC3EPT2QU8iA207Wz01fvNftZvbnKetXoj3yn5vK1xeh7KU/6ONubt61xzctxDGdJwfLj +Z95enT6TnhKC4W+yXhbka+CBZi74LSWNpCHff6868xz8tl4C6eZZjOZM9qROaeyicUR/a1izw6ED +YMR3jTDgm6Z0FQuQiu4+CdOxRiCSF189pRtdLA/dej5dLQLz8RriSV2tpMlqnGrglzsKWZ9urMP5 +rUix4dtJmXYLYHA1MyDC2Lc49NPBYx5SdP20p0u9tEjM6uEa12XftzsVPsK3C/bSnqSk5pk8mAqL +HnEbuPyyWlurLFtXaIoh4SNYw55grrpSjjptgABqZhV50nzokm+pPUXtzpMnqjwGqrCxzzstqjNQ +Ir5eRUzE6tYYP3cvx+2Gyc0JSCCet2NRqCeTzOGfRJ/cAOtMCsGKseBy3gQ0xuwW5j6deVYu1nsE +zsZlXKlGp2xGg1qZXjUT5oCiQ9aS+Jju4Y6wlGM3IPCH4vJ/blWZJYqVAgcgTmswWL7cfFU2Nd/b +ivPblEc98DI0vt8kJffbbi4AJs5E2+N2az3Z0cq0RaBRup2DP1g3otkiWcbXcUpRcOuu4mxws2TE +of3EJeKj3MhCCSydMg7WZlw0103674SHJF46avESTOy1slifeUVhwKECcYrTDaEy8A8j4g8iKXtk +iHK4wm2EYgU7QNy/679kn5u+gCZc0MN8w48wtlP9MhK9m0o2B2GN/G/aU145nf191wuSiBqFLAoJ +PzbvaczTThabz7fw6gO+3rNPypqQOUUcH9O+EpBHzy/MlkmnJ4ukh1htG5dlWlLwBMkOcXBzlJbJ ++CDcidH2GcO4f/PuQ6ZzMsHwSpf9Jg0G3gkBu4hUa7Z42hxCT8xfWZvoaH4Jx/UmsiMLBr4wRQuP +2mePaqx9TfNsBbwr/ySlsYbvRC2YyJFf87q0Lt41UcNHDIKjy2YmEaw3+GbuvVbK8wbnpOHN7G2Z +V8leAcXUaLqB/49DmcBb9GHZc/mLf6UUQF62nTa1+/0il9ras21VnNj8mv7DmFrEJfoPOctRQQ6v +QXrLHWuaHfaHBA4PgPSzgVaIc2gCWTc4sLSLVJUyykcudjrhS9jsC43g/tg3qFrhfODogrMauw0Z +cVspQaaqmDjf+6HE5EtkMkmtB2r8XvIyYm2ieOLZc0klSs7HhAGRst4BeFoV+XnVFH2vMIkQomQq +j+e+hocV8lORPLapfLpJ6fSuQ54FAfBkPXHThOofhDVXgbkKXQ8+Q2wuxxKhtweiqXExQB0IjRva +0qnzT9M8CMyM3En3FdTVkWX7/agRpvNOVI4WCBOjKFzdqrtdSWZwYEbdgxU+kSaXD2+9dbDOwJOx +ICuxjwG+uHtoWHbYXRLFp1rDODsioepnIKVL8RgdDmQBRtCJkO5yKdHcYX3o4lgasQFhv7jVC174 +O6F0QwEiPhd+oJ5Wp10BsGbanV9YHePsU4BqePNBrWVCi3XnvHbRCQieOapdsyWy6Cq4+pemXyEc +nv/+DtfhoJggbygrneY+fZVTeKfK0ni8UhgcP7cx/W/FTVgWYlfFu3Nd0IRKyiCfjm4qx0hX+dyM +KxZABC4pw5KNaeG8ev/fe9bUEvJ+/gVjFtRoqdp+q/NtgTNtG6pV6VMQkW8HqEyaQMGhhAICaVIm +PFBSBVMIcWuSnydjgj36Czaw6tc6ZH7IgnZx1MslvROw7G7QOQ3bJj5tIJNSca4UgLKQ+Wcn+0NI +SXdK9Sb3LFgctmY3IXmiIZNhtMSk0mU/Evo2V7EfLlrdcIxV4dR7FnYHWcoeUOELyYN1FifHT0wW +F7bey5nW4zt4kLgDjyU5DKUXJ/JyetkmpOik/tyUkGNgqB3ucOjn6T2kE9uMFV11/9DHS2unEPxK +LUr8JpS6T5L+519WJhKQg/4RAzjuHDCo0ao/Abq/aV2qD2IyQYZj4uYFJOGjCvx4MMRSKDl6K2yR +QbPaLp09sCWG9jclvr4j3lSkqnTlArQ9bzCB6H868AY4naflqYfs669TCmqhHh3vOGVSPv7jrl/v +dnxu377AdRUJ1wIaJFAZ4sMsQ4oazNJsvzS7Q9TyhiJLq+bUPVX37X9+uwa40DyJI/ebk6XpjUE2 +eZ89d9ZzJfAibn2grHWiQIZX3+HgThNHsgP82s6T3FxPBXLDxJUL8/ogdCYOFTOB5DV12y9G6pV6 +tQP+qZPASmVzfk9uQd7dsafH4n8o02DfzLBV96T0u9H2hNca07lXZGt+9odeO/mROqC1qncp+z15 +feXWnrLlDW9tvrfTX11jZej3NpwbhdbwZ/bE21UcftaPTYTx0SjlI8i6HiyfLw44V1tC3tJBu+dn +fNj2DZPM5L9BJmbu2LCMBcSdOnsmY/Tum1SFYg0VAGWZ2h8ZnwueitE3Dz737QZQ4MF6JkSFupv4 +wNIF+Sj+6bbG0nvYeu/OreJ9m3xUMfsSFAwgTY/Pq36HjtwhLjpl0MqPoerXDAl20sRrVNxFmA2J +mIFO5+LHmlYA5oJE/bW2+oSEWfUSXl3gZgznz5E0XIlmhlz8+aI77uVVccOtIRlojfhTIcLIXQyJ +C8JTbYQ7qAsPGjljOveYRpB7WitP6qERUNWNjEoaM1pnSHEzE3fuECJzptxg5dFMEDXP4urtRdyS +5gC64nZ+SsNjlUxCpYBabT+FIMKqkaW09RmYcLasPMpyKAJQ3sgnJSuiDwLCCT47jFOgxG4eWBkE +06OtjxGrCOmZjJD4NXv2bJb8divZ/L5pChCjPpASDLLSkhHQmt+lcLws6sZgqGYCwDL4sYX2ge3f +X0e53Mya6UZpL06gFg81dMAoVG4ay/Kj7miaoYA/FSZHJMIFSib91HhhmiKbiS9icgKxdj1otrGz +e65vud+D/ypIsnaj/j13G+v2cy2NS8a0cGh8LbY4AMfJWBY3Sg60wBfTljeKYHJQvTMjamWkfMA5 +lyOxzvFKKmIelFefxIYz8ebxcB4Ukk6wxs8a9krkWooT5fF9vmIOd19ONYLpjP9Io2xzaWPfsl3R +NbtxYF91RN8uRqBnX+Bv8TfoMi31hOAxyGNioXHRJr22hwEXoWrTIQU1frd08q9H13Q/n6YHdxf6 +QrTxVoNqhBRsNCKqVVzcXySsStsrH4osZvhvZRRfLOZpPUlwXnWpaxcvSH4a22W0b1D6qipUUy18 +/ZIhjXy5ygoueAKy26E0ejDJF2IbUzTVc1DMV/I5V6n5mDq2q0Ys4j00iZoi5dqluxRS6lHCk4kK +lwwfeli5zvat/wFwtCrmezHn6QY/PnMmcMzvbd5l+ST9/YDvrCMMQoMg1X3jrjEVui4Hto9iaoNs +1ylQIxkjIlKlbVDevT57o6hy+fZLnGG72NmtzxDbau9KTl9upMi7S9AMP6/bN5UA41NPw4RaIqiQ +SIKY43KrCCXM/fMeHCuBM4gBnlseAngIWyoMhZbVkSW1qb0FiLKUONVleIXI5sUi2Bxlp5ZHNkqP +xGuAAQUM2W+0QQIAiU6QOuQzetnOMoVv/OtPuJ/ejHx87omUgWDlGbaT7tkl3YV8o6xjjvUCD6lX +I3h4mThrKO1x3l3KyFavjUcuQeO6Sd9XJ1WdsqDm4dysJ8H6awbBbD327m9la1zecVyXQckPv/Mc +xQEPgYyPWXwQdovMNqCC/I6Zg08rirDgYDZ7+uLCfBE8xNO2ZRQGmCOuvyTdmaWkthbJXu+q8BOr +ZjlyFKdQdz37Xk2Jj4RvUrcSC4sXwghyw0jgaU8mFtNF5D9AmOVCiyjSl/wsN/WLVVfAXppYIC+i +XLgEwJBaQD4rX5qG2IuUNHw/HMMQhECu4lFHtN+9ao8860nQO6HbA+zh1JpupTabHQRDg2c87NHJ +FnnYA0O6WplhpPB2PSMq160ZRLw7DyVVPTUVjeMGJ6qWRe6iN/Uu5E/yRaEq3kB7bdEVK24RxlJI +b0S3XZQkYxxYyQA3eoxUvII+GUHa70O4jcwcMqwHYOdD8z9Jt2Fj98ieMSBi4Am/eIy+w+ZUfnUm +B1kDVkPgN5cvR4eNO92dfjTwkD9RANAEnQBqFj9yPlLmt5nVWlrz5DOIEe0W1z0TY4K4CTXLb3nx +uxzU6i6EM44x9YvAHOzMUTwsesx4Q0oCltpxOvjrVMgHQrEzEx+LXdt1DWh3Xn1w8TW76OiH0U1z +mcWX7nP5mBpI7eQet+p++IGVWq3U1wCkzObYlKZULFjefj0PnXImQ14JlllLUc3J41bluxld+5Sl +JQfxJldwpwj6OLIr4rRw0qHiKzU3L4meqSt4LYmoLIl4HR0xwYZ+bipBu67W+loVl71wzszTVC1J +9aHO4++0T15Xed6Uc8j3iU6oOdMBhuDj/bXww7VPwbGIZJYQEqbQqca5NkqmSJgudnC9beQwGSi5 +f4w5pRbegc/2j61sIMTjaw4jkOVqmSoRYjXLzq2I834m98wpIb4F5+J1RM8y847cwv1ZqKLxwlZO +XF85zhNkHn/RWgJE4B41t94kxmWkKaA7kjXtK7Sz8eP/49IGV/RLXYw4ylJYQQa93VoMt+elxzk3 +y7CF1WPoF3ZSbXT8MfQ5oigxar4ng8/S/nC1Q9bLI8r7y73BzGJsoeYqjTDs6ESfbcvG7ih7Wk6a +79mQCacyqiAuSFsm6rL5el3Kmf7x+Iq5bG78AKlD/2GN3H7mvS1X5HfObqMeHnsS5bcX4QyGQxgu +Z268ijnKe7p/dG33XUSH1ieG/qDPCGSLDtngaToFo6qgx1UyTS2WdxIAsh890LnWToPYI5M4eRxY +cZl0c7j+faYuj2+1ezmAprDOL06YWmP0ng4XPc6KJDdE25JZwhQf6xzTWVpjCp/jj2oExnjSUNih +KYEE0C3tmUkztqnzJTl9R0yO360Tc/XLODnTbQqsgRTFnu2fuAzGsETGtVkr1v0NvwQ32P+3u684 +A9HdhBfWRg1rGQzl23NNW4aEpg/w5JAgsQ70srR43hF+iru9SBgGOacfO5uf4Rm4pVVUOd6NP5zI +xAzTnhBDzQVimsebALfLQ53N+TsaWIE/9+gc0g8+CYSqCldlxcdo9eKXPVqjK56gpC+Utcr9ydzE +xqUF0siML39bNnEEv+ytm8cpgWBE3kNmhIIOmlresjm1W2gS9/rNn8kOyxQg/OJbeHHqW+t1XuKh +lpSC1khzSmcU4ZOHMksL+jQoNqrOSF4tLOIEBrwheubGWt+lsHgWv+KCQU/x6eZh4UmqpRHP6eHY +GcPLIyzkRBdbgEYp91z1lkHMW3B0RzVEx7T0UMNQEqYEBLcKsP6k6H5mRMInjPmqMfghow3mm60Z +b8CpU8qL/3ugMZf+klCt1/oPtqEZgB21ITPr6BUPEEdKiTwJjJX747pP1anOhePAZOeD6Z3rFtWj +YeqaYZBrRHvUv2aNKdQpshkRLk1b/tr3Vy0w6+Mf5g5EN/h5tSgigHafolhfpt3uyI3YtnzQVixG +SwZNfncyB9ws/bfLo/FRlAgzbaXcXjFpMApNMw/geu4kMWqQ0nO3+/KWvZXfttlTUSEgpXd8VIBs +iSTYTC5Ry7fmcV31fw8Q6K5ZvWsGYW6Hw8+azzTO1sdAxGjurgkIlnndvnA/mh2nFtfsdHj3X2qD +KffclMtB1zwbyPpOXmbfUy0YN3hrEllUwY+z5I69Hjl0U9eP4+WLFB3PSXjDhSxy50FPYA0x+BU7 +YACmVuTYg8O00Q+r6WqwrNgXe9+IQI8/yI+vfDsJwZUCxKgRgl3YTThOzWbS71YC28HflOWL4pwZ +adnkZZSv7HXfdraNjH0POOj7qIGhlC4x6E8/aJ/yFJFuhMPKHyXvjsgGlfuwIt+W9MMUSsdGkrnJ +lrMmqqEQiCyPGtZNK9UOKy3Z/ywUlF4hFsfmOMBizAJpLNpVrUcgWIdty4i3ca8FHzRg91RhWQfD +MN31Uu7B5caIpGAHBlFEXqjT87+2FE5RZJYaZIf1HPlXTsn7WwcLs2ASx64HIVFcAVu8DVy0WxG7 +oCeq//VqbXP8u6T8BI8z/As0JwueRCs1FqZ7H7RWQfN1wkLCdlO81eeyz//RAj3bS9+0lmWVMycS +W6c7YtbX0un38P0VSG6mw0k5/Bs0up2/NnNbLvlGFunFV4ycFOv6ph4AwNvKQ+wjLFeKqmWL2fph +Zvx1O6HdrteGL9FgqiqgS6ACoghKrHrjfUgxWfwURmKm/jBjdMbSA8PUA4sGy9A5f7pRRjLeGl+7 +SkWjXeMumPSmYIfL9dZtm+g75syUiYYVDHd6SRHYUPzVRQnm228hMlfMLrFeeDaDJuMXEhy1pRnH +TY3XOsYmWhKk9bl9vyqQrxZLjRqV1VHhhB7czAznWLJh7O9s++0fCjyjlDrLkl+XELrAi0QuSdtT +Cb/fDO/FVzv9yaBJaJo+ASpxocyEj8uU0N1r9CEmiO5vM8v6NLPMFYobiB6Oh6H6VY247iVIxDAh +nVUOiUTgTFcMuTYdg4kAN08YwaOAq/6c2zQc6C6GrPNWaOSKrV/uaOvHJpBeTIThpBpNiP/wst9r +VLZYW/1yguIyzbLX5R9tcbVgQJzXPgNRek7D0Adh3GC5vpXODfFKHpqf4+YIDvMMgtNrhSpvChZy +3SliW5CcRS2KCev9WAYYv1ZRxpPkeZaAvV/LPrjPVTjkzPOFzw6BS1a1GtLPxXVoi4vGwH2ZudTl ++fGSPRWHh+U0SnLj7rh8oDKKOW/TNE47OschzQgfGAEoxdBU0TSGdAlwoECdxMR+6rSvny6DAjMT +a34d9aX3RN5ssUvK4W1Ds6uy+ShnMukA4eYnoFUBMep43V/anol5BPtx5unSdrywIhCy9ycE5oPp +CIjwKwSX6pNhN4nGlY9cgsInzHEMKV7B2n4+SY1Y/tWTPjRd2Gq4dvG8zAIuF9kF+fDBKUdHP3ux +gCdT8M9X1BVB2jR86xoktx+pGNdOY+UoF0FUo2oTVvpgpHAC9EQodcvQeE3jmAz+X0NFj/kUznOj +QeDs1elX0dOulbKZpVLdz7Z+Hgs6Msk69InWP1FznpthHI5v1x6jJ8cWjSBx58nxigHQN7Doiua5 +reIrXj7ZsyG2zn18cyOcFBjhnSgUX89hSlOJMbkuNEhVCH/W9U3saIHWXAhnb+x7lebeQ3cNmqJf +KxVsgK1eZ8RxcDY1Fpj0yBVsWP8BY8BUN/fkcjFWVU1AJ8eP76YZ/eFTXDSa0bMfJlOda2MAJ28y +Vaq5z8sgL+JSezsxqMs0ldC8l61kNqJ+gTRSDdRX75k9wazqx/lXEocKAS14HY1DKKXOIPY2RRuf +ZFGZURPdTmIPLTu/wNovNnAtNTu1M0Txqxu3b54JPpHB6lJ+b4M3JmEFB5DkVf6VcjyRj1N2Yaq1 +fCvZoikKwvsuB6V4laeogRZYGUNbF050CWoucHJlDYnMrjYZvsHFEGJz6FonFYIGloWqt7trycBV +UqpiTJi4/B7AtpJg+WRCEEB3FFhbAHLxPkD54uuoFEWjOd9JFCdRQHfxMzHR2/ZCNGFbYey9j1ii +asHmCfgUybPAoY7xWIx6P7ljbiPXnnQFZfj97N1v4UoABZN0ssuOw9VUuOl/YqID8WQXQo5mAj8p +xZr9FOXXO6HQHZIcAL9ngrRBRoF0yIllzv/Kio9pGJDE9IlLFfC4N1MPIISGh+voq+/qS2sWh483 +ayeFJzbc5NjcsmUqdHbiFMbjFfSIOUknUB9+aclNVU2ORWEX60Ca0U8fEFeas3kPTZvt8K0nlnii +LT4a8YRDD/vaPJ54XAkwWtBXhDEbWltMkE5yX3Dw2fl9dNrGeZnbZK6p+EN6rbw1eri1AO6lmOul +dTi20i8I7NZaxV0b/iNZHWl1O8Wf7T6x4PLlzhaNyuvfYhyrhr4DKCMh4cKV0MvpXZ6oq7q9CdCg +McHqJX5hw3VWVNh8X5kCPD5j2ItacZy6rXM0qWrpQVztZ7lvzy5jfzJlRnsxjeVSb4nVSpDyY0Kl +M0mgc807KbqLCUw1pMIYr3Fy3XlKLcAxOBaa40zb3nbDXWNW5ssiW8dDBLC6vnpnQnJECyyUH8k4 +Zmb9Gl0nGFuqEsRm0po2l4z49ukgFdW+JH/eSCUhWAvG5q2X0Mjoxfu4sm4jQYKVaCaUH0RiepVw +EvaOhI9JVCWGeL5ytoAwByusIAgfSVxonpfYrkqos/Ocv+cILtpjX8zLVvuscBgnR9+7/m1tT7R/ +4oVQl4xjVZl9laCAuTUf0bJAEzylA6TOJJIzZPWA+r9c5gQKWYeIY6r70c+1a39bzINOUKmkfO14 +SOSOz4kHy8fB/TXF+etLOWOHVvQwGrPyisGXj7GefkbCdiSggmYK/SP0kyPyi15rc7XtfdGeLrpS +VcQtbILlgcXMgzDELcDuI9Ws9WOOaa9jgGWlGVFBjJNPXdt+n3pCbRPHax/SurLQN0siM5aqfPr8 +m09PHhy3wYagn8+e7ee7pRDXx/XDGULG+/LDWlaF96q0fOd64XRgKgaLecZL/PouKsL0/2zIKsha +DyB0nt+Ciadm2boJ31RGOoEhIuFlwRNYO4v9+LpDJUd1WzAA2YLM+a2JkRuJtTypq15i/tNlVrYN +WaI+V59ZUpp+q47E7f8mIdmIHM2ceNhW72NhirjARtq16MAbqFXJ+7w/Kul4R1uVQkxtcExTyoCl +SpSh26+zzflJbYIqPL0s9lEBVVUC0mmpi4E4pqXz3frc6UuvLfJ7GYkFeud/qo6IAn2EGKGDdsXX +MNmu+glUpeaTwbK3H7B7QhAmTY+U2i3SOENPrFrvSgf/j3/BpjemhhBBh0D2HqDYnmN/ukI0mpub +G55c5zjId9Js2905I3kOrQZ/42Z0bTTGEV3EcLhoYFP0FLKEBWHSKIPVMsEDqYg6FxOLykh4rKd4 +BPoCPVJb/aC0tmlL7NlOepanmhuvaxXhep9ngmvWvv9/uP46R4HeyQCTAEapvE4B9GFnkQcHAkD7 +O0DVzvryhW0HN7VJmjK2eohYLI50htRPjMYke5nyJkCpXMMBsGlzjM/kQVhGsO/VYxezB7F1XiQr +rEvtKSA3bGvfILsfinUJG+Ce6n9CerAucKG2nlG42JEfvgUkeyJ4c7J2Yz1auk5weQLqym0QTQIT +B/8nIbL90QJm2kt91EfLG2ptTqnSzmNeOBXCMaB2J1Pq29Tem+7QXBXIt+jDrY6wFwWYZBOwFGlJ +gg78Iuf0P4cqWxu8hhWy6m3gm2/lbQLHk5fwOqcl6X5Gzpwp75i8oSzjuq/Ts2tu7yOlxdeuaq6a +zdB9ulwYBnO359DBpiAUDmzxvD45z9/ayb/z0Ifx6GY++JucL/uhKU3mzsMxMctNkvNG2YHqmB/p +fY8b51lz/7/87V+ro9YE4SOYnYwfKWl2BSSRH2aS/szp0OyfoErqKXVHWb93uVIfdIMwuPGWKzvA +1YxdwVfx99NqHSORdCxfLOMx5pRZnGegZHkQK9jpr0QCzly/euKaiize9Ogs57segOoUFs3bQi0t +VhYacVFCi0nwAa16/qi7kz+QA/1LUKhEhAq3L5cHJ1LQ46/dfvAUzXV+2u9lY9mPF+KKq8IqaNWY +hYJr9rEMFEmhp+ACA7JqbnvQOWo391aiNVUP3G5qwV89t7xkgWptYKhpC5mPtnYj3q0JBN1OoaKI +0lvZOqNyQwm32ZYldHgWh/+H2ev/y2qz5TLqSm6p6WraT+CXi9eoaPw/GXb0soEBQf+I1VJdQ7Ah +65j17zsxWXKdIYaKlHXpxouuttTG1ByxrM7jqTDKEwJfxVnnTITnUgQsYX2XNNV4FKkTA2zR4JNt +JTCUMLIQScc1XaPkKiyjVTuFgiW3mlPUMILiWgcpiA9aOYaHeGPIt4AfeoqOLffuMUsYEQ+NnBfF +U3eWfTlwCeZz8nd5sAtlCneNmyKaLXskLJ+YkCuGcCKAJJh7EhmZhx9BPkquhOFAeAyuQoAjBAiQ +Iff6wj1cI5nykycr5K+tt6eB/hl7Kjs/9vfOdxXTuVTPke0Ad1A2VeWVHoEYynsEAVNCRg0ZImUU +fyuT1Ls8RewWZMjAvGRX3hQ/wr9IRbNvbIC2zb383MWuSeVINT6GLZzL+pymv32BJMcE5PW/8bHx +E2EtyGj8kCKfFassWkVtzLHz5k1URLg7YJ71xji9suVN2pj5tYxurhhU18eVL5MrqVH7WxPCAe+L +3dGGiTd4LpxKoFy/cwtjIne04wmovFnkSDtnquELiJu2NEctcA6iVTqpVukUSd6rtU1NOARIeIZb +Hx02yd633UdayXOs0nqQijEuqXnkB5N0aEDlddkrtcNUup0gmxUT1HWAVjqmNxvdPjVS+m2viYIa +LwdfYMX23XXSWCIg5iE1M5U7kwrENqPv+5nAn37rE4a6o32aipVvj15azrVHgJ3Emya+kT/gWZDG +fNneE51MSx0ej/dVfqVKcmJJvgZl/oXtYYDqhmnwVVauzkEdl9xqJ2ZgymUOurGJxLgcFzQ/94Y4 +GO8cHTaK24yhnVm9ycpuD1lEn4+5oU3535Boc4dcF5qo9+maJFiUqrxtem+olxeoB9VdioSxzR4f +iZzulMA2RucPNY3QWjn3CbatE+pooes1CPI8Ql+OhIk5KT7gterW81wdgNqDUt6qV97mcQUgWlGy +LQSfc/hebftGCCt6QEbBoJNajhzADw0hbGwMr5F4ki45hGajFqqAvd68gzCKn70sG1FjQx7scnJj +bcMRGm17wgMWjdRL7vmXlFT5+xkbvi3d9WeZCdb1XyOCkHmHETytpg31vnVhqcXPFiFK230nX9Pj +UTBRhtRRKqjm6WrFSxKFTR5UcV1iI4hFcG6SODwrVKIgq02QU92iwt27RpEW9iUWYA0DrgKWLRbG +K3+OtILXVLnYeXRWxOotigsDPzyLHML01wdYnn35i/xbOwFDIYa8S1a4ImjLgFJcAfFZVDmakndT +masIYj3tD87xV6UHN9ZjvEfCekxJrAOBL6ZKDkLBa9fExKid6wQBGwSN7jOZZ9eX7rrAeVxJis5z +SClcLTjSA7qFcd621HkBFGgRCmeZyTdtLOuuYa96nnqGXvVJb2CaxMQMj+YH95z6Q3yKyT7JuEk6 +LGhme99iuz9lju9QS0MlLVsqriWutrf16NCvQvcxKAjPsE+XRyN/mqgyQmhYnl81IPDzKsrn2WEt +04A6xI1VAPMPopzKiy5PxeUE1GU9g6tXvCE6iz5CWfSZmMQSgnY9q8foxd3FWgwwdsK/6AnF6Wfw +5neDi2hQfD1UA4xWIwnkG49zMPlx4JRoQeKT85moWGfuF8YInx/RZuiXW5RuKnD9zXpgDo1I0AHJ +pGVqazA/e9VeWSo82Kb0r2thYvDmjxzqp6IyT9gjOJsaXBO8mt49gzTGnWttSCKdM7IqyToJZ7kO +nrXB8VyKe0B+P4prYQdEE7geTTRj3pFsfqz7hkvgVAq35TVi1DZjLZZ+DOMB2ccWkWyANvPtL1gr +Z7SqMjEGFJpDoslYw4Exn0aSJ3yUP6VnBpFDdLqeiUXOoalixL0EXd13slfZ2Ktwde/pMD5JmUdt +pqCupFbJcxo3fWQVLIn+tUKSk2rKF6xPc3JMuq2Q9/heH99eUeHr4DiEYAxzgWI7S1TKnpPf6n8Y +XIncglBA41q9tZME+MdbmO9B5CNPby8uwluL4VGtLiWvrh3W4oA7buu6I6mf3mV4sEbGmpDVuj29 +u9qN+lBrEMWLv8tqwo8brcRRes7Y3nPRNHn4BRNHpmn9H595nsYxkJonMiRXvRfn+xFAPZ6wGadZ +4iv6SbNuUrkUfwNnFYd8ov2PdZWjupuezTl/rYoIvdsIWvp6jrgaHm8iEojIoMoGQ6CQlQ0SZvxp +h6apUP/ojEZZrqo+MZQric4sqMXg7yNZthgXVK6ffMNIfQ1qQPU6N+EWeqTYjE8VEOj4Wq0cPJLT +eg6r4ZbeNg0fLsMShqI4T5wJuxEAmtGOib6z9M1GVDL++QRjK19awF1q9JGI5M2Ihy8IFn0Psc1o +NNUtvkuFZpsTKErA6H8oGWtIKA/CKjghBIXVcrngEsrsgEbkun5iKAO8lyZMDtElNsMErPPzfZ8b +pLQAzxYFNRImvTFUzOLI94vPo0dgAHWALDRW56pSuPac3OnbP9OXeryeY0C/XLCSP06ox5iIV9rT +Ojc9tTjjMJ/wWPuHEVQBsTn1X8kZpriooNfsXfhrDAtxh9TStQ0ppJBJfgrbsumoQ2cEXw8/Sc+v +lmAQRE8r/UXDctdwXDXDLa3v84zQ324KMuOKg0aQJMXXiDZABt40D99HQspGLMqvYXuDu/f9Gcid +odsvXqnP/sMr4PpwRj1jsvSsNAXdaeBKk4dsicks2+shRmSLV/qbYkBWEM+l07wWeLnrGtjzczcS +kFJtyapTlmxjpNirFr5ADun4B9EuwE0c3fmTefzOKLPN3DPii5NrszkByFseco9wk7Iwc9ySPrQb +Lzn0plLJQD1sSIfg2AOFAKU+my7j+W/irF2Y9kGU5HwKOg2chnOQeV6k3QaODyxTiQiAGLVikFsh +eGRtnFrvA0hJw5hJk5suBByv/Ek1k7S+meVKROeCEi0X25EjxRGEjHFOgya2LkTFTEBWvrYuOu43 +anilKsREsUDDpPcOnjAEWdP7QpNcd0Bk2JVDiAlu5B0l3Y6J6tQsyMW9ULfpT81ykhQOZzPAIOUP +Ldb95ieb3LBpNoRCOWBcJDmn/z8hr5PcwZrFjY3K2tYhsOLPedQqvksPhVtZluRrmjAjokSF5KN4 +mqZj+g7lp5T+NGKymEwpY1CERg+8rABi42KeOXJ5sdnOQgBMBP6o4aynKpThfJzIEEyjXnoKoCPJ +QywlsuyEfJe6AoXO5/Reiw/CoY3MEldK5EIJ79WTLmGvUMPggZCEljYa1kfBaxBRMMryPMsGslm8 +XVik7YcAUpzdQv7sH1ODVUmI6tvep/OuskHASFEedw97dX7iIX9/790qAKh3R7lN1MJAQ7HS5W2W +T2qnoV3680XS3maU5uuZqthUBW940WkqEdjycuqvaE8mMrdDxvqBDeljGRDGcqDpMxKJZ4L/l9Q2 +839DFoKZD8UoCVH7x/4aTxVHLTPbgAkmazoWc9Mas6+Q7oKauWZvqD+UZpgp6k56fEJQKqlYvSOW +9azOIKbW67DsAT+pG26dN4dHx/VHnsv0LNQRDOevOg1whOnA6KoxrZablz+TfZlsC2xkZBGiFcQQ +bdu/Z2goJDfqGzyAKxosxIDAQtJ4s18vMwcY59osKP/Ag61cBoxjwL2/fdjQH/Np/uy9w3PrKL/A +MlNhYUfu7piWaT8yjnfpnaNbC6/31duZBq2F1DsVTgEW/zegklG9sBLc1sUh/nbVtl+uuQAz9gui +GKmJWg4u02V9NVP2u0hcPjjzCKNjh5audTjE354j1SbALqSHLzRdZPYg1XGmJg14NHVIczv46UXu +QxZwHK4elWp3DTlwqxNHGnaoUeUTdwTHRiwwc/7tSAGq5M0ptOLwLwcVPr669EWMl8L+ZZTgma5i +e31WOFclbc3E71m+jQ1GRuIdreDEk3CZfDTMsJxCLisjE/SkgKlL7vEPzuMNNaL0W6DsSMdPthdD +LZqgdaFD0xgfxYUKbOh5ul+ELEf3kLb1wzPvhEoXjW0y5mWO0zctB4YqojzFWXqofju2vhSSPN8T +2nWSKI2Exej5QtX7NttBkq8EqRiZWIZTCPAYkEgOkMO01cMqid6nD/DV/i6KpVknDfgaE7blLl3a +9LHIbEtRLvMYCD2W11USWLImNRa34YSVwTYv8wNad4q776qF5q1IwCWCx6aFh5WvQ1daotBrLgj1 +r+B+0RNNX+R7fMBA6CJ9kMlG1TOiGSn4c6g1+jDWm9WknrViUjBBso0B3uyCt+DmBM/DyUAmRw4u +4ktO9UABg956OhqTZGq5oKAPMxcvmXmEWmgJ7vbHmoqKYtEQfs+WBnLJ1hBzllLKCVFP/EJw02wl +9xEGIS2iwtQWyQk2W62Kz+IVZsnQAYoPZC/GUn5Lfxv8uzlQwqSW9UlfDu5/PgTIRqqpgubcOFx0 +AB9Pniw6itXFRqD26IZ5H7vDnpOOphMe8mNem+m2qBih1meHvdaCvb/TMNDgiwL9aQxb4jEGATj2 +F05iupxZUNRItCWn4yJ+NEepZnF2rWwQpHxdwr2b0hFkgawGdPgv3sJsqh4V1VWpwnjpC5bIXm5O +nIYl16enycOwyou34JtSQ+b4Ixx3Un2W75ZW01vIEzVy89iIAy9ZLIYPsuHAvHzmEzBeEbW5kjQC +FMnDV7F25+2as+TQaGzo7bUpV8pXEn5lZkZTRywJmPy6vpD9hehXWmumA/Tf4ag59WMeVb/vH+Xa +bOjWN1gbjUH9vitvVP1K20JsypqloYom/N5vUuk4nInaPkio0BmqxrMvEOPB6TwDe9fu4TBXtpNZ +djP24SijwWtIFs5HRxeDf9ZZ/z7KBRPTAgdbYGM/2erPMIeWOryytV+R3ICOqerT7XAZHJltME8z +uZb77HI8y+JSL1UuMv6u5196aeFOHq5hL80YeukvXEGilSx3uMdoJfznuLJl8KraQSOs3M16pPP1 +r4WoMscRqKJPAPtg49OhTTvswdD1UrWilb6ziiZWDT/1A5dCBE+8bKUhn/yr4dIUzXoXIwsveTj1 +SqkrSa1M2Em4dfBjE346piW41874H0dWGEbO3yzuRta+RuLWyAV6alODdkwC/WLuHi1/QCv9h2Gv +scAXEAg3QOrUPbZeBgAD1bZcJBWmwgCYLa244fht4deEuk0Kusi+f3bug7BXL96xIS3dlpLkhN0O +LPFl6hewky3yXphUcMUv5UdqZ+L9Nv0/ykDIpdn6cv4kGTmT6MWGhlM/Q6/KhKuwiYiz7zTTHR9O +aT5WuI4rgeL/LNIw916gSaC0pxZGooLjxwOLRTl2r2Lc5PEMsCUoDYlINRPJp+pV/tN63+y+AftN +EF0kd8haoQ1nXuRogfX9ArNlO6k2fs83en7EAp3phni/6E7UP07/NogMVSktzcEHE3WmFou98/Cn +II3RA6DcNQLxZDA4VUuC5yT4fu9iuEcqe+OEpY5yMDvmYMGsAilAL5ZksjS3zF+FOLZutQFvC9ou +UHLcoI894VMczBviH8NVg/O+/YExpv2Cbq0WY0iJymCZ08usin6keuwA4WKZaOVfLsQWc1f9tbGp +aEeT7QijROGulJchGcev8v8qR06Yz1lmvzSkvfP/F+nfO4vuXe8fVOJS5V+An/SyxjPp5DRDTcvk +FFK6fDveihinSMJVww6D21vy0SZTyEBXQuDpO4sDnRBLBo5QcLVQzZ+H+6IVrRMj+HlRIbY+a3u1 +wIb32ccm/FMSZxgCstEdE+iM05t49qPFogYLIngf1JyX4nT8MpDUS7czN01sFN6+GvTbbrZWaUV1 +eExKr5eKUjri6k+8CQprLXUtZAk5rfH8Or/CivpOBo3lBbaZO3J+eBpQYHxHrIZznJx/UNL7YdEn +LGsBPBALofkVWa2GUvrqfxGyWkOhh8gx5x409D1FZoBtyRQM/ky9ytpNplrFXBTPxTfSZKoEjy3i +t7LUf2z1J0fe7gJB2AKpJYXoJgsX8VEvkSKWniKDjWOGW2qqse+4kzoXIp7XSw6YaIWXgaiMaOjm +Alz3DLQdhhGvLV/h/erScXPzvA72GWU5wz8MVEEHu20PO5J8fpYyWHpsh2/mKJy/gSP/E/QmmsqP +z1XAm3qrWZ237o/S6SJ+h4MO6nFzN8JmXCgj4iWCy6Zh0q6FLE3MokKAGgB3cLpx21vFJQNQCZab +ug/6O1toTNGnTPIqNSA66J2apv0SumKJvzI5UeowK72ZJDQFCQEF6R9+jRwtoZfgRoO3SaIF2Pni +2Az+p8J7jDzFleASkCUV3t5kY4x/bsBrwMCR8S33Kol7l3DuaOrQnnxAxMO0bGeVc+8mbz99MHOy ++kN6sBM+U45kOTiqk+F/RNoGTm8Ap71bKs+Psmf7B3NV+c28lCbRbMwljg2t2oIEPVW3iITOgEjo +Owf06ZkqO7wqUNaegw9H5jxI1WmKdICmGDGwl+txgngv6n3TjGnQe7C0gEAzpff9ESEg7tpPCRtq +6oix5VKNQS4KIVErRjL1P3kC35/jMJ41CipVKvaQATS6OjjQMVklmosOwMgxp5zplPdCCybdmx4l +C8azSuKnUTnTYw05BAA/P+gtUtoC3cT8qRk8R43XrbefBCQo9N0/Dn/omThnn1cJVFfpQ0zg1HB7 +zo3gcQLg4Ga6ReV0bteXzJ26xS2nB4cxPL1p+nfK/61g47vz+hpGg3sZUmQ59OldNisW/DCJip7e +PqP52H/+r4EIn26PaLQZ9+PWJiflLOgE042tQXcAUo3iySUoDcN6WQshDj3qfgtruA3uc8Zk4f+6 +Y7ao0wYCW2iBU5TiwheCdtbDui+Fa17dOYg0TMaJIwYxpUMrNFtLTyWVjh7onc58ubvfewnJ2ddj +hjlYmCqCDM3XLQKgLzw7InsnfqbiR6OzwJaqvlA02Z7Lggn0/HCZVSJzIK1sQbBWPKUo+0U06Rmo +fnZq0Ibch1KDUuJmMBwNIz01cEs70DEuEnVoNQDPV+RYjdGUL5f2jm4i87696bh2IB0S7aAZg5R3 +G89YLcUJGmQqyARH9Vy5kbLBjmCZnjMTS1mchT/o3Po+jP1EuI/5rkDh55bdngsilplKLsMdmjni +tRhQH/QINT/UPPXvxoljxWsFcSoLGoKVqjmKBIOpyL2b8TC8JhHnOMvr/LzRFuFSv1hFlMwdyybi +RrCM/Rc+5V/bybGwtMIjlCiEWTh8jdov++C05hhTtVnIx8gWYHlmMXIFXQE16DTpfTMxbi2G+cyc +J10HzKaHuaWRT9QZtgSP9k5OT/clrlRJk5vD9SqlxisfD2izchFUuerehTNMm3Ejd/sky1QvRb5n +RE8uETB7M9zQ/+XUCe2VCrfHWGWKFIIDQdItPLtaWdY6teLavRrkgrAngmwmJAZ7FEoGIAdk9L5d +UF3VhZPjkRjcILM9PO+QPGiTbgtChZ7NjTsAo+WekVV9spJTjDVd6tSDdB3tjFO+fSMNWpR8kln7 +hXpg4m1q3LVjlubr8mY8i91W0+5mx2wvlk2ar1ua+ZpxwdJdK+XCKohqBoN2zBh1vBMFkuDIruei +idHXU98KSVO7/KdfDsN+kC6UqGyrIY6HEmYXUFWmzQPqrq59gQmlv1r4pDRRffPP4gXMQI0Ghf++ +6tIhmkDwpQz/G7AlS4rIA5CA3kgKa32IOzT41Kua9Q9gG0eu6KYCEd+T44vYlAf70QLTAsfYXT4R +du2hb/8ymJerl8hpwxf6eRhIMX+1WsMqv/SKFssrKLZUM6/dTeOEqBLRCpApqmVmdBTDIQRsLljo +sHNyS18aMxrlyF1S1SNwLs/lDiIqIqyF7hisPH6jFN7KL/cWvaQMR0GDuVu7DNJXPgRUPmCLIUpD +JbzVNeI2a3SkTs0oKLnBVMU/38v4+k/YxeGdoUZRig23ee+f4XJKhihbh1WSKp6YUXlSZBiFKJWM +dj9edh569VQRuS9HU55jTc1faaphHIGliaEhLnIGFsT6WyY7rTJNEwhfVPOmPKEmD67D9JrndA1b +RJLuAXSCF/7+Fy2vSbLtmcyNN4Aqqc0j0VYZFsFLRuonivSA0V3MVXKE9AYjC7I6i6qm+aJXaEjV +ttu22aEGyEjeXCGiK9OViPS72962JHUHGd4ig0mFZi4yqKBTLknk5LSc9GcaG28nRN+XyRRekbDg +EknJYYuGGL1jIi4BmJ/1k46D++go+5ZYIvy+2mTXA929er2IkwDKxmie/M2oHX0OtBnv+iTaEG27 +OckGq2r+V5sDAcwdnU8AOYRNJ867s8JAb3VvK3yd89DYREhk1Iu94eDDcpZYBJ2H0vMOfnf1z3dj +Xkxr7LCrVSfOOTULvA7+y13sHSUfQqjbLfTHFBxbiSTyCUCzLDyug55+ELTpwQTgQdrMrGyXgpD6 +h+QurVTocOPLgQ7CO7bj9oxBHSd4VC9aBsyGCPorI1ixUDP9RyfBSQRcMe/YZR4wANPjuzxLJ/lr +i1nmP2SKSTMNMYtr66BgizUn8SdyKWAjkbozA193ZBqd4QPzv31rT5uN5tXuGHfdpvIEmXzU+g/W +dc182NgwEdIJ0CRZ/DaT6W8doj4Bz+PSC+MXvTbyXj308giiEDwdzEZ14sIIO1v7nh7v11pat+Qz +g7FkXUSC6dithTbdE7zTWgIxj5J9egBJgvzic2k++UvJ/mGcrM8TW9MyF7lxjSxxpFOv2aGN0QBW +kY2Ky9t1ijP9GnBu7GjM0Tqyt54vs8lHVjfPcKII/qZuTyt6ukYKNlNzGTOUGrgwNEYFAtVW6mXL +/umeA8bI0O0TZQSaskLRbqeXEL7XDCE72mGrVA1aN67nmfwhdE/5ZOamuXZ7/MpQhkRc68RXk5/1 +CeCcNNZVTfrwgnMCmT9nN0oInvV20AfjMjDtWgYnUz8aMcEuwxYSttp5kKezeEMxAwVVVqHoZ292 +rCDxYJ6tDrtIOZn9hR5Pxwxb98p5OVn0nnbcaxO6hgaWdiTmmhZfcNG22/3MjqPIjOjcyFoOP9uN +hCJNQPPG+7L/lxm9vbkxGEcXq8HrkhkawZFu1eJNybTFCPf5tbb6UhYiy+VGisUxjEPBao2wHIw4 +zvdRUxNgRxBVyKk/O61S5XOA2/7b916BXPs1qtgIkj9RRE1SV86MI4LlkphL+OrdLSFo7No5IlVc +3KlDfgTO2VhMDWagjlqnDUPLgxSQY2Ln5zfTPbv6AWzLWncTuOVVjt6EXrpmECVRX8A+OU1ws8/u +cw0cO3jNWraX027JAZL2GKGGC5KLFVV7SoAuW9jjNj+fbjBDJw36eszgsQT+9cfIDQF2LAwTqyBV +dAPg7L3ZRqleMC/tv9EWfe8dJNZte/8/qiMt7wEkn7gI2PNsdt7jAgHDiD8bnbF3HocwCtTDsdNh +kHWv1JIoF1Nd5PNE2jXZu3Y8LWTLQq38dCq/euwLM48giAIjq/KvSKR/fZvsh2jh9nbW+YQKsNU2 +C1pIhBbDv2ccFMBGluNuTW0cW3wg9c8Jf6eWm5V3/334UUlbWT5ymPNYIDs2n9VFgDkQ4dFVZFkd +l5IC2MRnuk41vAVzgF2eP5leEQXV8KMT3gvfmC3xgG6kIjV/1IVJQGBSE8dKbc9WCibb9hJUOwMX +hqB/BpfSMCe4Cbq3OkN6G3nhKZ4JNF8WtXKdCMr1VG/lzN8pT/Fg9ymbBuaaZVuAR8Rx/ooD61ts +enlrt79cOW+hLvrIqBK7F3EEbjECI+8XQR45DZKjpPNUU8sWzZzmyS/h8C7MPubI4lBcyFapyKjX +jI+3Sk/DCWwjK9Z063OoJ7cXU4bSI65O9zgTo6lL9P0mEF+jh6xtACvrRXn8uVNwgz59zI4m14GD +ndqG1zoCeiTvB7sLSxvmybM1qZOf1Q4rwwacMFDsJbuOh3gPYPyvirtfajxubot1QM/zdJSG4/nD +xLAQXJUr+r+ZgKcYkwdvfE8oCB8HS8vPxguNFYzp/hzc5gzrw/ifHB+5sWXDG0xxbmk+FTUzJwtZ +hadD1/9AlrcO+ZuVwpRrHhP2ZCAvY9d+l2fkomawbd0dLs03JTDQbcGSOYMN6ZK1cC4tAMU3MwMi +cc2sQLKJaJup/ZBGckYjuiSiOBFjiPTKbubuMC7RIN0aTXcuULgMsrJdSb1L502i0+Ue82lshV2K +Bttg8RDysRUiW0/n+DUUB/yEhV8Q46WW+bVmYBtwIYRw6yPNfnSNVqgLmOInGvhe5M8Zovjr44l6 +6QFrJHIz056KaL64vJN0YK0SejwwsQ0kNgJfuVncWk8k14cnXcQ8Tl8s0m3T+EZ+SP57TxZvM0Dy +NyEu9JX/h1p8Fdo6Rrp4TSyz8k2CuhNs90Cfe3H2ovJtKceFyyF1j/JLT8cHiH+IqFaascrcOuk5 +UXZw5BwRx2HnLF0x7umyJTMc9QizUVpxoO/fyE2ZlMmqd+UGG95+wT0QxKMU+vgO8Gz9zJjQgW1J +BlVjDkasOTfVl4IWQ0GEbYIezfuZQwXhGdJpuDgUnYoFbH9+WTIChtUhYuqaVsvfToougkXwoKx/ +yvziNL05Zm22gSAI3rxdnH80eF9dkCxl2fGT2i7KsdT5FJ8+oFwpP9hsdkxtlt/X9NhbOHEXr7f0 +yCFODKCu32UDOc/19GN0iqhf/69bl0gZU6i+bGOd2Vg5lJ+7uz4hL9Wk27IesHTL7FoZ/t+cfZEd +HE35mb+qSWj+7V0/0ya5KNahqE6M6wSjkn3CLCuTwT3N0iGQrYIyLA9+KfJKP0tJ5WgY8oR2CiMx +orp7jrS5bls+bVTwm45NQrv7i4278CKJYvTYhX4MuNx4du9p8JAlX8OzVskYl9x5APsvciuN2PVP +RwkiRktQu+AhCoFxVDsBZbsD4+TNcFUo7FhyoNCV8Ca6R8ZEReMp0xouvTuvunWbKxX+YaEOGYaE +8glulu7kMjPyL+lHDYHgpNY7Ds1dCK7qHaWDYCsss9lLHodISM8zfeTJcA8BgMWRbMxT9jKkKR2t +dtqcaQ5d6ZTIWpz6p/ucoO42pEe4H3TfuB/9d5bF0dSnX676OVv7+D2VKYwB2PyW+LD9NXtAuPP1 +eU4LpFVp6TtATYYpEYdFs+eWrRr4JhyZ5bzFQIcCVV9o6EKbxCSvJaPFK2Hw30/r9+vqysaRBdFv ++PulMhKb3LmUTbkshygZdPzc/kYcPy4gQlUFNePezQIsHcZYoY5wpKwIOQOoyrRbLH5gC5I0bxJ2 +ilGWt54fbWoFwWhDdDYMVAvPLdOTEPxcuGOeZrxL7ZNPdpwrB9/wqB9oRDt4DZUzBCWqrXDGmS3t +/2u8CKg5cVj+WHIWpxHhEt83Feezq6QIP6lpPAJdL0RqxITMusgYgtXxI6rN/IhN+h7Gmiu7UmMW +dObj4SCcGkOgqI6ylT5QoHdkDf9MX6yQuHw+/S/4a47IewfEhx5q+DfW6ZCZoHEp6UnFSs+OCGop +Dz6ZbnZbzc0AAsKyNybQBRJLSi/GS51Dt4bVVZDjEJSfsKBFtBUHubqZKZuHgxFoliZtO+S25KN9 +RGY4yOxypKGelgNJTTncaXpw/PV/yzGjM4i127XbnOlNdbHg2WyHtWa6tvaNudEFFHO9z2EtEnlA +BYeW657P++Hs8Cj1jOeOn4FNlfFCxgY0RR9vwC0Aoiuu8NXiSRxL1mnJlV5g0xMG05A8w1EwowBI +6xmJ2OmKccnoT7bDjJeasZ7IqXBOA0ReEQqGRAJfSFAwh0WmA+VzvGcHouUpx9m8xY6yTt+V4yFQ +m81MkbKPTjyjgGIta2bR7co6P2buzMgeLtVYpkxSW6wgcDQxXWo/wWT0INlHjLsdNWUtDBzZQNiV +F5sxL80dDPbw+c7FS0u9b0oPaQoOuOMm9wgPyS/0uaeSa7sBZeN8ILC0fx8SgVwShfjJLTg42lew +8Dh+apo7TJg8CLKKZgv2R+nWnxzw69Z75qKOcRLUCjgN8iNeZj0kUZgOBXzXjeWoBVzUtLtn/OKS +EyJr1aS7StpY5mjETPxuzjRhdSOkLH05ugGk6dRVwxX5dxSxOgKq1TuTIw0/2RG691X4AZbu3cW/ +io7H6ojcU5iMKP5SRwaqs9/31qnAyHkWpxmb2NcR4gV2CKO/74ih6NNtFKWEEfMvwDZLezfMo0x+ ++0BMcsZDoWACQseFuxA6ohg5d27uz+WU6fNYgRtYYj5GPvzEQM612Kwfi87GNZRfyzwM6svT7PSh +rbfUtSJrN5pbcZDKgpio60/Mk6orBSClfRp/VmGDTUeFalygqTEGlEsBCgThq+AyM/+DD9G5C9ym +XRwpDFGFzkVDbw8pJ+ZF63sOiSidFsQQ1QZ4r/DFKbTwl8ljM0c/L8suCQRukCXL7/e3xTrzcTBZ +qR5Je8jAkCX9Yw7pBswGqsNUDMl+qazer9wXHhUecMOcu2AijTX51gEgIkKb5lfsM+NiU+7T0o46 +Z+iVE2U020r+KBncd4IUOI5Zh0WrE3MFGvvM6FAHm3k7fIMXgXDgYp1b3DDUdZujtT1yfYNDowCt +wGiwLNo3HVMpKs1VWRXMTIsUvISJDhY9WptfIrfMwrsGhR902aM64nRi8ebhL+zu0kbSfezhm4Wa +S9BBP6gH1/Fg7nES0mSiWs0sPQIyjewN8mZMXx0k5h7w0j4H1vXLWqtxNQD3HVPDSt9eo+b+99hB +pNa02dLhTAT1ZoCK6rH6xamEkxGtI2EIVhR83CuuXj8OqxIhwY+fN+zqTinbFmN9gn3lSvnUV/IQ +1lBzTRR5H8uiYfCj9fzM2w/psiUnOxzVgFMqv4eK/D0G07j8a9f0yiZyE+GrVJ81RnoppmyuYhx1 +0GutPXZbZ1RMoQiqE0cDs3eoLp+163KDGmMrddFkHJSs1GlDoYmpyL7b3UkfCzxQ5PRQe5mWqXZ2 +Q+cZJooP+DA2NYuF2hApQzpOYw0SQAwbZLt/ipuRAucq9TnwyMEGWtSb7K9wBzKRLFzJqRoZ4nyt +bFASgMtG0198RFjk02LP0U2usfysSNwupzdOkZJML10hE0CAtC+Jo6m3r1LZWmzTilhSHZqF+OSm +iNw35GCD1QnH6ZJjcgYKrnOunTK0DpQZGQOAO8lqpFk3XrBcnjZA4wJp47BJzONWl9hUP3iSWaYL +H3jy4R5RfeOZyXlp4J6fJbtx94F/Ge60e8CyfgLvredKPVbk22sQc4w8XyqVxY5PaJrfW6CJwD22 +fJBo1vXOTk14sSuX+gia6dzFB2Qlf4b4uMFuLamZY5K18YGOCFat2deYXyBdhNHLOIJ0HFcqtvWM +/v1CPsIKFk1DvLMvGFmESBHfr4k3Q8qfvapc6MXyLCwZn6OkPrZlAg9nrBLZv7N2xr2jLFCCWRQX +GzqoCazfLwNsw4vJtyUPYLnNPeRmU6ygVnVqncehzXLCgoANPfxhfEA6szECZgfIDqDoF8MkrHro +i+Uz9DP+xxMEfpWuKweBWNMMZf7mnMb+w2KUZt8oUYhtHNGEKuzqgjCv6F+VpLzWxk78OHBnmSKk +0UdA6wMgzPIDNrfg6gAmrM3J/aLrJhx/PMYynA99xLmgSP2mSy/IDramwMVCoC7ym7DIAWOefST6 +bQJqYqWxpHOc8n5Y82w+l2EKLPgB7sZhUJ90UEc+hGDNpwzSD4w4XxvfnyJadwsdPkEhbDGtSpOW +XCRreox9rqk3GPGw8U7Fd1s71Wt/ux/ZoKEk4N+xmtjodUhWRwQSmJc1Nk1X0iCvy3UxW7kMJfXn +4Zobl5n68BH5n24weH6enQWNw1EKdpPeiXxS1X5/8VPZ3k4PJlbQz+4fvJ7JhBFXwqE8fGwrvLKf +ra5gsuNQcV9Jcv+1pKWPGCbUd8qtuz4wjp4DGfHq8Ugm0km+GtU7NQHLTGnPA5wmy2yLJdWXGfm/ +O6FYcTyfSueGGUBJlcMl2g30Jb0NomeiP0KNZTukMexT+1sRGSVUyPCQuiC9GB72ZZ983LCClYWQ +Hxki1DYEl+l8xz3Pb2JmmjIke+mIL4SjMaXgsBPCt+LrYvV1KboQi1mWYfantxBo+2hzIQWlbP8X +CFTym/FsSqvz4/nvsI76eDCBqLUc/gPvJRXkeCfMTsq82UcwxojOlUmxHcAoR5PC2sSAlj7Ghr/5 +dpp0debRjh33jRAQH830yJyoLFEq7NO/iFBOTEL+SXy94mSZRctX+mwpCSKFRHJoJDwENH2iw1Tb +nfKonA/4mw9je0YYCsx64lIri4IGA3746bsapZCp7Kt8o0pLJPPfImSNuYiYuqsBAgnrBqMtrqjY +UAMb/vbe5qf+dgmIEqcM2QYReSLPin27dpvfkbHcWVsg/kV5xssbLNXZjkDSoy2Mv8gpALcL4/eJ +y8BVr+5pvhTP5rzUC4a2RP1EhERHXqKsX9v07lEAX9m1hxi5HE07mjXbB8c3nBJ6K37DbiPE0wJt +S77EL+ojBFrLK3TPJ99e4RewF8Mk4/l1EhbUAvq4EpkGZxuQuV5ivqfwUKnmMXhDCyZtD3tFJgKo +P2Nyr0cMjHE2Y4C80Mq6MmePS5jQI9Mrq4lCP7MvanEwgqRnc/lPnGOSxJMwq1lC08zjKSBUdh1i +MmADVIt2jq89UmviiLXlbB2/VIS7uNrGDzXtzSO9pVcy+CkXzIowhUaU/K8EI+vY2QN6AsbthVj/ +GtugDsPvh65pE0NSP1qn2rEwwStcYt/r+Tdzdba5FaRsiTcP/FJ0nh4nDW2lx/AnaSt1z2n6XzOs +oIpcHO7nnNdxjn97BYpEWuajyhfcP8cicmFsdS45fn+S3z8ISSa8FMzO3T4V56yu3+udBhPV7KK7 +PKAN7gRFhhrbKDCUuEGApYQ9M8bsne7gu4dffHuRIPh4FSB+tr72NDKacVJycvOeDHF4iF0WvG6t +khr7CVo4BaifmOxhRbfi1dMRGnDYsPKLhYGzeX+XDPHhUH1p2y0Oq1bZsTIwkOiEN9MLrHlcwH2T +2XBilNQEfloeiKgXyX/46FEqgNuWPYJp7d+j82ClXtOwDaGi2FcKhw7ZQ8yBmo06fNzzCJiPpIol +1KKu9zgEY+hChOVj/Co5CVQGAlLAyDTFSf1+LwfpizrthvNNLdXa5aTmDx5tgCJoRaND2XFrCWqY +bGWZITn51KzC6R478LF7yGGSlPHzywINJEc6nhOCpFRs+wzgvDN8ZI8GM+xwgnhfvfAj1gvq5QTz +NuXMrkdPlSrEQ6Gybyx7ZHQG7NkF2iRxWDf0S7Dgz4fxO5Eb8SJA2Z0vTwF5yDeh6cQaEHSsilld +fCSAk5aNw/XWYX5sMmnr/wj9BnwIU/XHCfenom8zBoZDsedGRXpuidzkpoWRBLGqy+7slo5cHEc6 +HvebGrIGC3mpm9J7gzeRMub+JbljQRQF33si+CnkuXmD5Q2RavW9NkKES/WhGEOauXdZ5iXijFvx +OBQUCXhKSHqRtTI+OEgLXARtTZlcImXGL5RNHWuhsTCvG3NTao6SxVEYPdEMWBrgTtpUMjw2H5X+ +PDCvRYMtjF2LS8o486u7Ic+HH0dLhxxo9L0dfcyzirI2dk0sDWDWO76SEOUgjq0NuLEGIxCmH1XE +B0UAgpDvyQusUVqVbuwk8RS58Fgb9N5RTG9Ey9J9nuk0Z+PbgB2JLvI57Alv9XrWD6pH05h7ifDr +AttF4O4891MRuYPsn9+x2Avsid+hXpiZ94vdCv02y5WwY4JTIIUsDtky4GH5W4ASnctdhc6ZnDJX +D4uYpX1cF5Uo4YjSmQAlObGmjH9KrHH87+6lFpW/7pDn2rACwMD9t7uiFUgpzEhF+z9qvmas6To4 +YHGgBlx9at1w36vp0zhvcDFZTp7/bPZsoent/Eh1KKAM4Begn7ziuA40S/c9/99gecBCndZDTEsU +z5nmM0jidT7qjpUBzOMmFKEd3EJs0X7rdSpunO8kukb01/3jJFdHIDL5YhW7oZaHbZlC1ulrdhNr +eARD7dP/Sn9wgeT3e8vPXWunpj7PDqO3dwO/EY49A1R3ppz4CUf/sPOo5LG+M9G1/KRuL4gsrtci +U0tm5S2RWaSCljB8ZsMoHAk0DV9onC4RB53Vxl7Nw3GGDrX7g4Kl6FO26Qt11zusRZHCRzxWUwAw +LtD8TlYr2GvTmyd2+2pkT7W09KneZ4t9vTkjZD7mLj1tzcLLIoiKGj+7btkpEI+670pCFCP1zuuh +qHcybM2mXHdCaRu7F043dxjWABEmRifYTA06WPagWX68cEhXOW9yvn8HNdDY/FJEAXzP4fFeX6AF +SA3xGLbJnblqOWY96/aN41R97kne5HPJNtiQsCZiKyenle5DHsk1j+E1lzyqWSC0d5jSAaNl8dsu +ATm4X2K39X3YKA+mw5Ou7Nrgwgl9XWvVmI09N5AYY0HcVNGdGVfxWqJLBo0vCRdDfWATA5OA6qA2 +qO/EgMDVxL0rV3tPNdEQC3ps+7AUAo0f3yYqgvfIDlERfX8ZBBNEdCqhedRvVtNt1tedcAynu/nG +4Ktgokyy2Z5esntbwrH8oOdhpf5AWrD+/nm44p1fClr7CLC8GKvTEhCYwKKI16Oi2JJ5EihquL9X +okhgjXdoeJvLvQLSymRrz6AlVyr9dYGBhTXtYehcuKSB6cPpU3T+1qXdAodzwrHgfr0qDlycIdUR +yNkAn45hpuhlOHtXJq4zXyu95K2a2A5u2E3NWN5FGctdEC3dPQiI5Gq8D4OmN1yUi+L84UcXcU8c +A4vpZpm88RfZYgmHDgVcaUHle+0HmD16dVu4c0z00fG07Qiu/br3sv/Z7M7SMXyWlraMMxeiAYIY +MNlG7k7In7rrRHU5CH1g2+EMhj2LurxpfFXQc9a6f+L7U19nhfMZPjLLBSQznxjBeYCBGCSV69ux +irA+uGM7FNNL5wDxyE6DhcwSsJej3rKJqfwGQvM08Tpjs6b/PTncnYSLWup6h6qK7MA6w1flrD5O +gpL2fdABbVFCZb6h2NfApx9H90SQI6qSAEDmd8E14jggW72kUvbJHvmuXhFrzLt9Xe1sLtRFPO4s +v9blSV14PEEpdTpkKrbVkqJgkEYwnZcrW/RI5jKsygQGzb422INs0wANFrX4TiKwdW+OOTKBFUDG +dfp7eR/efeWYJDueFa74ScTz3ggJ9ganMk5PIiqZns5i30o/CFdq6LMyCqXvr/72szViSz8jqbFo +78+R28uDZmduVF7RorV3nKGyoYvuGCmdTAP5FcHLD847O8pxZak58MB3nkAfhrZT9eTtjDsQM5Qp +Ep+EK8Nx9n4GiA/IfLiHzFcuNSvdLLq2FLW4l/d0IXJHj/gV60I+NDlFe+EjIszi/LypA7LeT41W +Jpnjj6lQ7FtLcCId+RG0FuWS+GVzpcUW8mJq63W5pFYVQmvmS7neCvdE1/Ndt9Fnh4egme9Jr1bk +JLJFfHbFJjk3L5JNKEF3YTnV0D0j7Ah6kglMbF3luciNvmCMSOjolFT1dgfnzC7jT+gEHkcG3fFb +h5nFKWzdAILDF/GL1GnwhU0lVO8v4UZWh6dNmpcb+IujQE1m8UGdPMlsx4reWtVZHu2wy+U6Zwk1 +gbBpaKJApf9uwrkHhnpD5uLC1YJJRadvmMBn0UucaYLyqpHFGY/NB30rX5TuJr6Cc/Q5BK+EMSaj +WPDnJuZueSv+q2CqDUStbaEnsdOHOpbPk2wG1FV40hXYrUhk4wViQQyGkulp9zRLRUT0MidvGF19 +QZRAGT2QH6472Dj3sK+DZbeNlxyj+V+8tIu/KOs6OK3BDKTUtHiNvABPQXmYWJKXBGtBSul3tIbi +J09RybqUgG7H3Vm2LLRXtDiCyAxY00iegHHdDPdc1kHdVZh97opP4Mrdfo5V2bPUD2+zkglZOl1S +DL0uJQ7xm11T2oZNIxN2lnDackvSyWD6GVjti/IYFml21OpzLdP33FFbYFeN5coHlAhxI9UtkKa/ +XqSg2eMSxu7+BxUTritk0CWbKRN83Q29i+5mSvKTgfCcIwlrGDd1ORb0MK/5hhC7MBwYAkkM843Q ++ZHNGeTY7xiA6c6514xzBrn2K5+hLxe+b6ZrSy2ld3VyaafIxTdjE+mI10yTSyg60Ipgb1OMCvJ/ +ksf063rM03GcBrh3EeGeC6ZzXJHI+yx+L0WiHtWshZFvZ4MvPLkyT5xE9Ljmyq0rZlivt1sXSe9X +g9rh8+CJqmhCl7sTWICXV+c5CU7+yuznf/3FNEeUXI/zqqQz2aXy2Kh/oqJZzi/+DBojyTUE7bLy +hanu3HE67hhFGp6l+AK9Q+HyBiZPPbcKgkxF2MhpXKQh1qFluesC2tW4VVO1Fk8oEf7qzxpBf6Jw +RbJXtl234UoFn5pkR+o/MxcfYAeD4pB8113LB7SmXrer4wKDWswdqLbK5qWuhWD/GViJ0VJJOvhD +DXXD6aTcNt9Q1jrmjVUkk8uewc+ls1ETqNvEnOlRyBcOTc0dodmdT05fk1I7fCvf/awXFi69hFgj +IzM4v8UgIUuKILUukjSqRqi/w1d5/xSMsTvOmXXXhEiopejHUsUvrCcKQxDbJ1eVj9V6X0XmE2yf +ut5Ca4QcLBXYyJauposDzQtU6TCWdz5XpOVfGcWU00lQlo5eQA+E9pQ3c9LiW+SzOLWpO0heJhtW +Zv5ekj666h2nLOzn8y4z1HM+6epnBkXvvzpga/8zowRA2CUYUqe1mpJ7LvjCG+LOZHtYIXwXINVn +F+dh10QNpt6QRI/M8UW5UcLkBXdOy0DVU0hW8LWvA/Rn40QTI0AETnFCUc1k2i/R3NXAFkAvnlMW +3rxOipkaxCqcYVd+LeB4lSlKebEUWooL5OqLUJx2jUjJK4NFnuOeIi5aaWzufgHB5fZUekGWN8C6 +j/8yuUU6SxSy8iltyV2gkwYEjRAUaZQDEUOTI9JzauLerC4OBw2EaNw8R1lvLPFD3ugwdzk/YAwI +DVkY8P7gM2Da6Q9pfqw5xnf79H0i8dMBiNko57T4OaybBJCWRtrox8PzZijDdzNZIVTw+HwrDWzB +FNNT1EkeYhDD2vIocnexpJhUcZsYmCRk3ZkKBiqVQPGl1OfavMJejYdPX2D9Q/NHGJ/QdVRK68X7 +L6Zecie5lTBJYXl6pseiCAaA0Hx7CsRQXT9JB7yKgV8H0PRTYWAQsrL307iPpXRB/3S1IHjkBqly +ldEEfVdzSYv11G8J9nk6qHZybUDZzptlj0I8fHxvkLW1tvI+L58AB1DhVRBQgVhvW26hsRNb2S4A +TxEgSCMtBzDozMN70mryWG0zGhDCpgxLXyGmKogIdldd5oHNk8Dxq5o9dUaisGckbNs+ffL7wOTk +TsewnYAKMKxBIKO7k7CIpvkaGsRqFptihL1988iusi8Sl6GwL21T+laAeqHP1EkWiAqL+mKvhkba +kSdtyQrENaeQ4Z+6Ma0biv5jP9Nue4zasRebaJY6v0A9dpkJ2zEzO3XaTQkCq5zUa1kBsGXgPV6d +BlP1sMRtYVkph+VwNjVv6kM9qQhXI6t96lGSyQee1UP87rMyAgz6bsAEDQqolH7N6YF6oObWfoKg +A2z6v9Cue7cEmPjuP9HvawaIEXzLPLvhPbsxqot6OHIQy5KOupUd+DBLtixayF+QdGlc80S9Y8kr +81okYpCKjFIyDCjRP0qEp4SXQ4D4oRE066/dsuPq2tATNkuzP6VAnWTtyKtyJ9/PNOL0ON0i+td3 +C4d+pCKVGZ1hilRkpqboptZqmCBbCBWOf+6cM03UzL3IzygDa/M3RJyIwJN/mENiF0YGez5FhlGU +Ga2Uesn8MNOXj2oaBcMaPzIpmyqdqfxnYujGAa0BWIKRxj+iU+UXdR9c5xZtKzSvFFNlqTqCUUqK +17GvvYMeA4bFw0XZ3MLANsIdpLgcHhv0CI2GWee1Tl0ERC4mugCRYAbYGUnaqq5V6U1bfzfS5lAb +aZLz10/EHKlfZKceuYxHVs17llMnOx0exUXm+4N7Ae/6wEroeNIjJdV4zu/sGZT1lKUBE9qSqUuB +6NzyPZ2AlugiF7qK12KKXd4chEaC1gFfYDPyf7ns2sgeug8N72TJ+Nu+uwuzMr1rXlMWcGvyMy44 +q3DcojRpPgyCCB0oZVb7GljeeJp2MMYMpYEI803gUtgXvg/cDbUbCkJtdx9TS2P0af6bavoA91I5 +Z1yJr8Rmu5E4pisiK7ce+k0QCP0hujTJ7BHDaIu+rDpBuOyjChBOkQlj/u4kSZnsbL9uLbGZ7Uxd +HYwRQB5dUi88jGCky4Rn7OENrcqd+8sk8soimYfaTlGKg/bX3EO3ygUYWXH5sUmSYrb27znNl3Dh +f8w3Rv2tORkczTN2wnWPOgFQEOyH07D3+Ge2fILkD2RdSD06N9hyaai4rul9bBy/7XXcuKT8DEvo +FLCkZWnoAsJocpZsW4FOmD3dGQ7vSJFnYDGHDACBtWvQPHBuaIkO/faBDyOLH+w9fOhskPeuDOX2 +jpb5XJOexdZWFLp4djeo+KYG/gFEND+U9w3XEGq0Sj6RyW+TCQ1RzQd/gxp75KX6d82leT673zYS ++WjNIIqFDPokyZ5vnhwEzCzn7pqywzejjkOaFdFCHnEsr6IWOZUtzDGqTR6bVdxqUvBUDI1T0Sht +nESWVOnqZbSifJKlUM5/h8YIvpZmB7H4A1HTaWXzCUWKdlaDEulQFYn4McQL2XvgDVZFjM0aEeST +vpV48d2XxNQCX5X/LOl0hv3fEptR9W6L9QsEKE17EK+8S1d7hcadaF/2OlO0WUkAg1P4/9VQV3Sq +VDUC8zzCEwSS71vQokzmAsPReMoPGRhT+ffzN7AlaF7G7Wqi5HDaev5Sibuwyu7h/VMxA7/Z79HF +tFlhQE1Th/Z9ymdIvZAt5sfDpL2BczMy65mLkzZLSUzfE8UFKS9uP6ijJacTvDvO90Lo81iQtRbL +bY2FsqRK+J1nsH2XGJ1hGVqzfASUuyQf3bCqZJtnV/JA8m5gmb8/mQy3a0Brs1BZG4sc/jwP3MIQ +AbDei2kYHo2Wu92xgcOgzjTUOlgWRnIfVGCSy5Wl48o2rI8+bHbkMnMUwkRtIQP6sRkqPtkrRFzf +T4HuzrfvqxZmN8eoZZEh1vZP/YRs+UUrrWi3IlxjTfqjPtIqWjj35USz9uDk1TfSnr2BnYx5s5DR +j3JsrpBRL2jT8+cWEROrQaa7uqBGldWnyajlBJkfFReJcaJkDA77P5T/DSnR6HgsNd1Y1m3bqmMn +k/x0aN+lrpenEnw7A1sAuDpDwyiVWlq8jXtzBYXT5RvZkifUnlM+ntqpSEAjmiWmheZTcial12Rd +KpP9CXuhIxm7+ZlIwiWUd4u5NMptI7B2kKt0a2iOd8MjE1G5TGzKz3PPl3uw2/i4djmAXrepuoNp +EHxAMnluLLYwUOUFrYTl+G5mrwkKqTZ7hinCOH+wu8wGw7nF3EYzoaqbmy8/M94N0CQRDIf5w8dm +JafmdOKqY1ZmmxS571HDUTz0aiVoDCHus53IjmgQDYfQYraSqJyCOG0A7KmHqP8+Fk7L5lhrw7HZ +WEyCsid9c3Kk0mXI6HX7b/nHVq/9+JFl/srP8nfk62JWPSPuMVDAlClFlp3+Y5qs/Gu0YPjCXlqs +drJS5w5TKYu+m5K5frPKua1tUzk1vuFBoRUBmtcrDV8srjZT66iOEOFIukLiig4hr09WLk2I5yGf +c5tP9IXRWH2+2yB6yHcacQMzNXiRSvNmIqdS4Qt+hMXYKby4g4uG4T6QJf3sc9HCPXs8EiZLr1rJ +1xPZbXf1YVdnzHt3y4UJvNwWTmlG16RLtfeJ8yQ2OEw9Kvj9akkXpzgUVdkxH09nJ4Az1GnsPZuW +lAGuYm8U64GHjCvLmB3IEgW2RpSZI5oDm3HZ0VMThlP7FcRzBQGnOAJg1dXGocz5En0Ya7dZEXdu +LwKJYACF7qVMZjpN753zSqOoNDEuxYA4QJ3GQNBvoAq70oByRcW5bwtQyRoUuL2vOXFZITML8ysf +grE23xixRn5TbT3McE/X8KNlpvpuyVg8NvXjvtw1zrYnLENBmwHQQ8MqIQPp5yCstLmyx6A/Guo/ +eV0NA6U1dmp1LUtjUMb6uKlqK2mEx/WfX5THFMABiWEgFbU9LWHnHvD7xM6TTqdQKilX4Jxk5BWr +grqy5CTqurvl9Qz+d6aBUtludtzfhWmb9lPvlgTZSoJKH0Pn9PoRJkTp+xtDgcfzv7WRqrPUmEZt +fzGqqqhl4WFf59TzRRNXcyeuaJuZRuc6MDb2cPoQ/9alhE+pV0l1jFSt0TPN+jxb/VUU2+iGFz7S +ZezSFZYcCKei94BbxGBRty3du0Woq97qFTJKY573oju/ec5p5BSWA3zJIIZomcHx0AddkxpveCZQ +4rCujnfhaFPQ02BfdCbuPd7hTkijgJXBTffOJHP/dLMxl8MGa30E1j7BFHrIaWQ16SJchBMgJjQ6 +puwG1AMufpqwhH3ps2vuoNfMmGN2nDdtOYKoq8IL6v+iDSTvb68iOtM7BTkrVCZAx69x+fBZD91u +7YS5p4xqT/tk9wWMxEfWTpQnmQ7PCv/p+I3YYx9lhDxv826IB1hB1hqI2wPqCw4H6jxWpPF1fgY4 +kzaAY+LcE3Gp6RgxtkhM0vngJY5wSY99GqLTaIKNCDLwBr7iMRhwXkQZE3q6vlj/Ti0PNCIPKQ+J +oSVAsW2tvrIpNxw6+5grR7u343+Ets6OtRwm6MOXKBWOcGyYRayCJ5RqYvBrTR6qG5LwqiZim5c8 +kwNtuZDL62N4BS0cje/IducZmvFq+8TPLvCVbNpErUvKBZ366jDFzCCHftl/QaHPeH5/54PJiexo +yiQDC6wT/yr2Ufqj0ZFUsljtRJCf4fatgSI/p1wzTvVF2NI3eNZcN/j9fKUG22XLvrd54/DJOQnf +lJv/tKZlH8t5+klflgvruuH7KKjboFraYr9WKTQwYKdfWyUDrBciA+504a85+m5bEIrwLUMevIhK +yddNDtvICEWANCzA1zn2/3+243t6TvrYX30L5q+bj6CGJfP1EbN7xuvpYEheksSFbbb+IXltytKT +jb8J6rM9SApJVQqLOLGcKc6LNFeGSAdoAiGeVn4LlEHnrLoWdrHgbgCf8JoFBJxS/VtqqvBufzCl +ncGLRh5w2S7zCV1cy2YojQycUyKwVd5EbSZ6whkszbPe0MOUe/7qx6NJIrx8fEz4qKBFBfT8hxeC +AJUt74ERc7dHseJQEPT0zlpA/14XFR0j6C9tqEq1byuTKySdRHePY3w8zZLJpFeKQhPuMik7e/8N +xrAKdknU01kQGE7x6Hn0Bj6qiAYT/XYC5NGTaWPKdKi9bYfJd4sihzgDMq3U4l6WuMn5W96zxtZA +EiXAf6CZtw5lLRgZ52q4h4iFWT0fr9bpdgruEylBtZ1mca7BGKCoFRDGqKgZ1dRajUDc7uEgT4uq +zmCBx84j1j5S1IHDRqe2xT0FDdMzBPynA3zPPNexY5G8ME34f8Zhs/Xc07xTgiCTbAw1MK/rpdVR +ZnT6uTMnTwjUPwDySN1OSb0EJTww8dr5AdM/bYP3FaLGpUltoRD8E0EU2hqfcKr4OZBltd2jX2ZF +IRXd3suEcOLn36hfPUqhV0BtQ2M9KacTxRMmmD8XDzcMNd2W/CPXQPd/UHVuM2t+OzwUhzhSnCIj +O3s5PE40hkuYmiR761WmefbNAtuQM2Cmz0TLIQteuOLwvEyjRwFbKWkbnuh4pMkNA+W+SwmUJl6V +xZ4NL49dkVaRZNex9pzN2xLXSk8ZdEYlqYlvFGizJceXwkNrad3qPArkiQ3xtqlNh4wQljTUfY0n +C9QdlNSORyoWjqAqd66r+H2xqi5p8uJ/CkaIRFVrDLbaRyMXfMkcAsblQnVZ9t3CI9NKrNOcGobN +hQmLXKQ69mLMpKE8TB99KTSFdCbiIWcqjTmNT53WeYSSGf+6r9qmYutgBCztlYTyQc08Q3NByZj/ +pNy9u4xg1MU5nViNkp0emtI2TJuRgpTXq1uJAYnGa617KJey1IhviGo0VBr4JfdWSiQ0DGWpSB0Y +P2qAiG02XGT23FOv6E6RNvB4SGP1alD3Pf3a0avbWz4YChwX6b2MNDSjnOkAsH78haO5ejBUo1HJ +EeO2qApLIUtYl1BKI4AP/s2ovbG8uOJDbloqUa6DGx3A7j142ZcI1VYEn1R5PjKOBD+6Wsl1VsEF +LEef+Zo157/ot0y90NAbFegMmhc6HPCLCtGDnRO6FgHu0JYc/Ik6+lwjJBdVpBh/cQMwrDg3Uf1O +QzW+hqyvIVYDWgxZTmMlFhM4SxaQcUW7KO/4tLSUmrvv2GrF3yMRQ0jvpkvrcLHw0W/LGmGHPcfb +5BMPsLfl6DTCBYse6HZwbnL7ZgdfECVOzn4Eg3y+69VBy9QaaPZykcwMJ7q/huVYeiFce147KBVD +TYnUcASZY/uSLSm5/o0caps7HTOPswMclNCcglnrLsgBYy/Tke5aMKyprlgFjVvGJzPdGct2UIDH +q470beaBajPoW7tJr9CCgAlZbdQE2dAigiugwg5M35ekj5gqFAAJZ+q2zIW7QvYohJ3qa3EMNHCv +iXTBM4+ptMGtVghIr3WmRmc7Z9fdYbPGWBHGam3ugbyH1VRtiABd54etK5dQGiMpXLHNAGF4A1Ts +PO9KLqw97wPllcfttFBeaUy0sMalp8Ti3uZlAv8UPTExzADWwLz9xqxNMGhYvcTt/ys2HC6388H1 +GbNjSczbSbz9+12nWHzjdFVmEhfF8TwddypnsT7PxRQaDDhJEwN2X3jVd4mJv9VKzX64100bpIlK +WXYDetfqc4wzyFcB5hYZbrg8ZYlDv6ss5W/BZ1uzbbhiy2c/t9JOnMKcUL/96mLFc3+sjB4RiHx/ +zXxC5pWDnnO9jIgIXdKi6E4hKdAFRyr1wc79FKIF7Xkb19wigZVl/bisVa7MGp9cO8Q4wxN7MOhj +dNUNyxpBiWEFMzogE7423PY7hgMNUUel+GW+DKEtDhv1Sy95Ov2065ADJQCAnNbNmOanFWZ1GCjG +3f4RuUoKVQAUkP1wdYGaER9ihhunBEgMFc/lkneK15BCdvWK9WuXjN+AytzFZek4H9GGJanhxnQM +bWLxPTGrVProOcqicGhL8/qkngyDzD0Q2flDBMFw3Ii5vX/GHrmsN8PEF+yqgM8yQYxpeqiCOfYW +y/lwAqtyWN5ghxuPsTYK4B8iPc71xoqLmPsMsmPeNjsB0rFpnqXCIqCcZnyGJm65XF7N8lQeFOoi +PwVku37tpV8VjlTNhZ5Ao6+qrOF6IDc2qH0gGj37aEnV5z6kz3CMFDvFo+MA73fhkOHBIWDar1L9 +IGN9h7ufMTICSutNNo2Y2TUKJNjqMK201TbjZPNaRkY5/ylz3H5mJvGZouA6p5BAI+c4+Dr8z/TM +Myz/7QFl6u/SwjXOCfaCZ2u6HLBnk1PD/M7KcYR4Z1aUiOn9o7ppOj+4Y0B9JF4sFWn4TR8vcRSx +MseeO8Qm11b2/X0MNM9y7icc0H0tCQSx4w1pTm9Zzg10/du+wlTKyZrHojg2tYetULi4bffvGMLY +WP5CmxeOPH9yq7QslPJfO71f7JYQXSALCUjEKOF4AdDLAxOF7RznUUhJITvVWvKlKg+qoIDebMoj +vVdEjYYrZZe94syyuvaowKCGVIMuT85v3IS5qfagF7GQdoE0pRLn8dNLmG9j+gVDV5sZWXjEkiWx +4ZG9dh5ognmCcixthnjqn03zHU6bHlQYA8q8VLl4FY8na9PcpgWryoJeDPShfgoJw5W9P/G7nNsG +R9NTwN2eXkKFxlS4wvjIvL/yT6sAEJgLjfzJM6KZcVPTk0KKo+5kqO1b00LTEDosEr064VhQB410 +J1CX8gp47V60EQWVK4T8qiwB1Ox6+AjvBpmiLewAjxvAaGsDUfROIwftPlR6eZggol/zhzBJGhvj +0mKLjMs9fNrsKr//0UXzuA7UCkBw7a4cKXSbTHY0bWjSkcveN/ypd88BTEFBB1a8Ya5SP8Tc15bB +lBe+1UopFspFMY9eGMRUBTQRroEBuLuG6Ejk0n+xXia2ynvV6Qf6hzfU2Ib2lDz7rvS1WFxR4dJk +PjY5Su02GLE9FkLziav7D5KHGgRJyOMM1aGTxYcRM8uLPTpQO3tKlefJ6MC7gjkpfxx0KRty41JB +wjHrBZJ/EoB+8vj3zOdYWSj64BXz2xOW+xvYVTgSWI/sOhwzNm7H5gnKaAhZ9xj9cTX8HpSw0erF +9bCOiuloxQ1l019ENchnNM5K9XUH6Jl9LVNvDhNYAtfCVD7hvEEeoXCxPk3HTD1Eburi8r0wP7Lf +UGk4j9Nj4h5+kONSxLIA9WEfuFaU/mZjZpAZNUdNXkI6TuOmYQj5J4nxqGwWdEWIubRdgDnlcCEE +SdzBL70Jb8HMRasAAkiQA/uyuDqJvKL4ZMD3T3hy4sSWXnM703OdMBkb9OiZf0ACNcsCJlvLUKAY +8TLzV1ENhomaQPkgttjpzblAdv3agPCkkLJY6MNcQxrOqHlgDdW1HV6tDmz1wPkoSiAHvW2v1HwI +r4iVatGllMN/o7QFG038R/LmC2x6+IWNyX7n3Yvr6wHFd19qAYVEqJM+z+YpxpH5+y45zjpsHI+i +x/C7lFfC4RVRdwRiCc3+UXOeGVKVssEo0jQs4MQGlcSOV6TmOMCQA9BxQsx8d/gWrmEt06oOt1rQ +B+yB05aYRgC1sIWcQm2Qe5Awd79EWR9oZP+ayknuO4/vAsJBZ2K4BfwO+wUG7tsH7Rk4bJ7gZdjx +ojrQ1ev1PZQM7XM2l8BhlaxRrN0I0X4dyvyepu/uE2m86jcurhQeVbErLYF6rpCYkRvN3sEzHZl6 +bxn4QRAWSq8Nbvnc8BmnE0kFrSwDfYDKYjlnQ9S4o9AmhNVCK8ZZxhDBEe2zZg4kdX4QBTOC5V8v +8KPaVbwY7FZvI/DpFaQHUhzBRZ9jTf9/lHRy0XdeMgdC46wWkCQAoBOp9gr2Crq5q8FQ3402bqBD +PBD+sOz7YmkbLuMuKA76w2i2czzRcDNiaf8pS5tZbElCSKAAnLiVRmiBif5vR3AdQFPAVV7wdMcG +tLoLrRmBcsLdaDWY4s9aNc67LWStxQL+iMPcnVcb4DPLYNGFh4hlQuWCJRg5Fe0nWpHiT3X1hxlJ +NJX0h1hFuFExeWFwT6eEWlHAt0072Nl1IDrsE+PvRHqXPNxF+VaVf/rpQsaADesAfvCWTEkDL4uT +s7US/f6bL2jepAOu2yxaGgjFrRhE4zSyL5+ltFJlMVqk8zsG+Y0jk/LV8K6VtL0DGxXZE92nu8/u +PJ6YOeWVP9VrdSj88hTt2zemWCG2FvBtYBZfAMtpKaYn9S8mjujaulz7CFN3dbl6AuHa0v+pyMk4 +S+KPqYkbxj/oAk3YNEu98+Rm/r78Z20z9Ycja5d4XK/eGuZiOeY4OJmnhXVDpZjPQaJkzotNkJoO +3hO/HwO7A/ghWX+zBFyWb4B/2oV2SJZluls2c1ZPXQ9OGtJhDIPc3faduUmSpY9evi9atUf1ue+k +A8sRicy2SG0fBKu5vCLQZgeAlHvk4HQO3m9GIj5mI+GQ6Ybl6DNzwK7sFNGQmKBXh2mVWuwFF1h+ +XVfksRHRgyXyRY6R+0AYAG6uaePtqi79rCRtpNEWDfHFbdzsdbX5wBsEMOdatm8xp+jY4PISDH3z +EX8kGpHrgGpUfwvhURNIIC+O3BafdnU8LTePvZD7E8kP+emiDJilOO0oABj6KKHISG0o5pqHCKq1 +K2l9pBjZs8ZA0B4CDWGmjT3CbeFGoLBGQ35e9TlH411LncwVaBNQ10BmiiudtGdqbUVQbiYWjOeT +gV7HMTc0LQ1gS/aqp6Q7pucMYfIGEmeNygKa38EvuQFJ46f5tYBtR5bT8N3CL2eQ4tlT0syeRfEt +bVeSbPs3aSelNnDhLlojPi0RZpRI7h6+daFYdx+ZZ+M0wkC/g3mG+mYOP4rC33njfCdyuNemIHrc +Zctc5ytVCQsiX5aua0C70+1ZkpKBQoSlGf2RIE/QpvblnM1XKDjD5gjfSFQxxKpopT+ge6Z6tJLy +SHXFSS1nvZ/vjla6wi0+dnHL9LW5yRdQqcbeGtHmbaGWyzYnPJC3uDhcTW6gxguGAEP7Lp+LRIcw +BcQoKmgwZLXNxBCi7/s7NfvYdK2I4KCkH158nLhR+8BPU/QXWA3wrFeDi66DcrQ0MBtE50mk1mb8 +n6wsmbHK6W1ZZxyZJycLKdIxeTNBpRPcHhdXGbcnijQRC+nCGEM47GXfu1U1+5uVsCMWX2tktL+N +hKQGxMBtYtp4Dl9KXyyYzAgl5se5Y2NFyJkcvQIlBAnLosO2oi39GeGZH2re/7mEdWxH3vtmeHB2 +1TIBwq5p4rh/QoHvRba41w9OyB5jFCWHe8MIZ0atItqf4705/TJLobxynXhRg+6byLHcvJVEKrjW +RYyUDVONrHLYKxwywRAIiANmEDlWwZJEKNp8VnQr9wL/1wmnWy5L4jEvDZmFdjX2wPiheyjzsJ7y +Pd5gU3waaqvEhlL9NohT3uhcwR6YIdV+DYAwMPNz5Pb11B/Ah083eSvmBXECtEDVTSW16B2/4GQp +Cvvp7crnT6Ict2BHxe/5D2HUaJ8zHI2ukpkz2sA5OtwWQSJzwEkgjL2LIW+6/IbX93W5fjiXnmxg +L4zrASpoqRu1z09aq4qyCJvJtKAtbq+WDypju4G3YNaZZkbA9JxuXq1obsxFkjr3xfBqflS45QQP +ZCowfmRPscCPcAgBsGfIqMdD70pKGoZ6Tz1gJS+NaZsSfS8APamKmatwkNqIXWdA6h/wkxctaRhE +De3WGssdAq5fT4SEH32PZF5U5KpfkmRLS9BqSql7zv1wq+CbPRHVgBlusbK02MtcBJVzeCLE8eQJ +LjPt1v0Z9thyxQLKaMk7Ks5AWcNEMKcGShKU5dFbBhI1vdUaQw9/Pi29Eg7t9gt+QN9xWxklRjqN +rLwSlD5Z63xe3W4n4AqAQ3e5EqDBK8BeTQCugp/XrSv9iyfLtvbE6Q6IHy/77VUdb92/RlgydJEA +f5K6236RBpT2znSF/X7toY3Z/oWkrPxD+XCDhCib/cr494Wufw5TtooamCFM2JN+5bnCsLoRv8oy +DJDiIgoLZGt6aOA10dVWlx9SI7xG84B70Tpg07CmlON7VmLvuJ4cUi+hz7IglE1ht9vHOd6rd7+y +QYZSa7jkhPCvFBztoxa2/NRo7A278ldcs58vxQH3eoDHIqmUNkEqxxnqHIl9xeZPMEoDBWzuIXhw +YsDJHLKbrak7CW8wK/8ntuL7OPeE3yYa1mNK6OV62UDOxu+8jyJ2YuYX3SZ8Ld22JHzjm7F5iLTj +YWMGQCOEfxk9IBeSSjsx8bh1gJUwIteA8PfMqKVDDRI48fHPvWf+Cg7xmGmEYpFb4//fRvZAaAwi +SVlSWXyrSoOqPqaHLgp1aN+5oOd8hxCXD9bm8D/RyY0YfAzxdqtFbzW1BsrI0MxvVVHLqLDCX3ZQ +fv6s6FBv9PG4yLnkF7JKDN4qg65kuR5EB0H/sHCr9vQPkbn3SVj6ppof1ZSVPMTJo4lDwUjJCdky +Zl3TBHrGvj/+0qPhSSmuxUBHZYoVQKm5Ol8EM+8JuibKOlF9+XjDbWYDJ2FEvP46Qawaltgrc1RR +MEsesRyjEt6Pe65qk0wgZvs4456+gjrD/1Dl3MZcmH2x2doPmCwJhumgCWEAk84sze5Xjq1F8+m1 +tMXEsDJfy7CItbFnDbbalKDP94lwAZf0FBg1Y1Os1pqu9K3dQER0R6D0d1zCQ7dIRrlhiLNluPga +pmuOC0rTU1p4BTFuP63fiZaRmh3fRrPQ5RDGAKPe2a9DckciLN8/usByC6msDWSIjDV/th9SVBZq +tsl8Z1r7gucKnWUxKFGZiX6ehLmTU5pglkPunHigtt43YT/s7XZ1Ok8QfHiC6DIorayFWmp9E3n3 +9QkVjKQM2tob5y5QOCO3ooFu/YjFyjonrqKgF2WGMYSCo6WA0oIGj6457uv+AvDXuF9ce8Rxm0h+ +5N/jSREE0Ygf9sQCHqySNmV3qFWLxArnw56XYQB7LsKqoz49aGMnhty2qdm+VLQS5K7dsdwbHaLA +BxPt1yHfZMdiVn1cAYxSuVG7mFxmhuK7/kmqOSlgAx/oXjvk7/5/bcKuYyEYgClzZhLavRoL8zaG +qSvxEwQoZCsffjBNa294B/pbIYywABDkL4GKZGjWIj68gVlFmx07CzrxLglQocjg5mFUqdHJKDch +wl6EFjtNc/SMBB8No2Uqx3W/EKWrcD5T80UBIwJsR0I6EqlyS8afR9GrNdv3bzFUhDqScaM6N30f +2QhMP8lIKL9CWX5tdfO44W7uG+Wc5w1kH+b+2YwD9+/uu3+ujBj/RNF5fkrIcnASueJCzEbMHmgJ +ZGNrn746UZ/yURhR75J4inI3jUR4gzdFDQuDuNOO04ibcz7U/aqqFIwb6X7S5Xgxxt4CHvQBORJ1 +vX+uG2g2S0UvplZyfxQWM9f3da4iKX4lib6Ddr9mhHlmzoSLUV3ze4hMexGWe0LPQRl0I1psEUH7 +d0Y9+8+i571+VF6HdAPfn+BK1MgXFdyhOMP+Bxlrdn3DM1TEcSUZUGU4T2VUszldUTXYjnO1S6IY +Yd9PfLbiDjg8hdKkQ11mChedcKXsh+Wd8gbsss5FsvpH5xrrGzJn/Ld2R3uxqxx8RWADqrLuFqz/ +qeMuZF180iSoVhNPWMAvi99A50UTF2lmoOYuMUZXFgYkmAo9t0+fYamon4s3HXN045uaBaIpsTFX +Zr/YGmuftmagIaREXnn1WFQVN6s+Q0I6ol27WDs505jvZedZCcp/Ja5Hjy77CQEijj7Hozy9ss1d +gotRx64b3TAbb3wlKlcismbJc5glR6lQo8iJakubDO+vav7ULeaqF1I6s/X4ICJwFD6YUUlFFLMe +10+rPVIzMjCqEhWnWpgY+QAzCMw6CS8E0HwiWsvgb0wcE5JN7JsdVb2BnOnn3oikcRoVReJk1eHj +dZGxXmg3Dzdux3qcM89DmY8Z+5xWdEOqht91IRIyVocmVlZtmGxiac9SSRZmfy2M+zKxoHz2D85y +SJGKWNmKLsG77eOyqeyxryN06YF+y+SUdsOkwg+LbgVEWTCCNlK69xbX92NSXDqNlqNnn1BQOXFG +bjjoEx5OOONqfl0QeM0g8MWsPQtkSO8WrPDzxgHC5oA1RXUpStUSUyVs1YV/uBOc/mUz6pi3e+XA +iqvscly62P/gIqTp0dT46vBPCbpNxqM6BEiKw7gJvi+Ut8kAzAxFEkG7sk63xN4/5IS5FdJI5TQg +5b59O5Xs5JJqdwi02u5J/aJW46pLco9mcYRpiE3XyX4+vcnyeD5DijL4DB/xAfogqYMeC4W2vHdi +8KJfKGemzNzVsixEEhTgJ0W1PVVWo5NxcorzhRjPRi0g6NjZECTZrVsC+P0l3xhP5FzEhm8qaeCt +e/eYNAoMDN7uO0FoCcPMwZf7eUA3Komq0B4zQKY5cMj/Xze7v+MJcEQjRJaI0kTvthLc4KE7GYgV +bJT3CGNdJxP1qULoAzB/lIAs9v9DOybraXJrP2MvIVsouY/taqVkTFBHd2vTm2hBEtvXzgcy9irX +8mHjISGo2NMLNxrV/iejpahrdid5ib3LGyKonsoySsgT/kqALhq8MPcv1Za/dO5l2sn3QA3I4Xa8 +fYairuN1+4NkobOCmJj8SKHya3FPWvzpOeNt1I38ZHbsEwmc/wpwo25aP5DKGRg/G2eyK9ykzkm4 +yYZvNq3hrWhy8bdJrV0hO+g9oC8o9kLDa0vi/+lQnG4DTNCCAmJ/temvRIg6Lx8BEJZNHycVQ9Oz +6G/xM1xVm3ncBqGjXM6mGqn6TbpRLIc/CUSUDta6i1Kdm9xwoRHLUFaJYmBLGssSSv9bkXwhWgZz +t4v5t4UjeDv+NxjiVU/tCtYPejHgCA1WIZ5oeRjzegYdbmYT8/LVtNlMRqoI8xAc2EmDhl4CAsD6 +M4OpBiAmMCxaEmTOh1ghfvBpCLaRdi3VoKoyoc2uqoUJw29DMB3PDG16VqnqGaiDqagTf96BwBL3 +r/fFzu/+BCFTlLtBPTYmlBBBHlJTXeiZVNtIiqzRLPDE83vhdY9CPd8i14yzLBoDNANY3Iiex0Y5 +45osmDzHbzkux+lQ3wdOevlMNfkf94BhhSj4M672FDIxCakSbRVG8cZGm6ohLUYh9H8QlPXWdlLi +dMKCLH6xeokP8PiYDB8ac0GikH40YGP8Rs6NM6k+u9X/gKSOzUyPVA5NRT/TVN1gWJ/RpESX92Ml +StdRsicTfBB431IemEn1sMza7qa3uRw0kvmZQTWgTKWP/qwUtpat1jtRDmbJ0CoDhDFEm9ABwkBW +RbfL2U31VX7BaYfmGE0vCv+j3iSR1BhxUjuq9aHQfTbmqsFrXXrYfZmakzbpe0HylswpzrQ5FKSJ +/ke5HtiXET37HIxzqjPu7j34NtYtlIwTiOSjPt4E05ttq/+Tk0keFYCyf47lVrQ5WwhNr2m0vWZY +ojKUlf4aLJNQ1anlZJzHrHBHN9+7eyECdDxYAVf9E0D9gyCJKoVkv5NiMMY96xUt7rguxMBC11we +w/53P9n6UJl3sTKixCv+DC0xFyEYZhdI3bzT6fDVW/HIm4gy/hC/fneyHDjdPnQ4uPFiTbN9hakj +ubKI0nVMD9eNUYJJ3f57wpKRMVhsk4lGUWxc3jCJdfx0t5JQQzua+aV+VOS3MUGPI8Lh3J62nIW2 +WvGzBvBTXlUz8r9b0Gu80fd9NPI/JtuY/QUOMiyCqVR1oi9qoGve51GtdlmAJnnMEWhl0hDToiqC +UCuG61llUjmKv2FdjfZjaGNmkCVGRJxZqWq3aOIrtk6a0XytrqgWouEtrHa7nFVEe5EZ6ZRXD2D3 +ScUSF7VELRUq7/fD/Tjfy8m/ZKKZM755+o6TfvwCUi3qKIlq8rh0uQ/jqZOyUUpU/Npgei6XeihL +PTFUQptO6cnYny0LI46/JJN7mkwOZ7uy4HgbzWSK5YWNSrI9lWbXzwEx5nTWBYzh7qbC1GxE2ieg +9Pq8i+MneEQdlxRfSgH5jHxYQ0y0aVP5EoBWno11Ewj4XQs4RRmI2luTEevLKsfb1uTf1rbCUxDz +rA2L7DMkvQ1gjLyz5Ap3aPkLLNo5fFZRfQFcYqHoSCTleKZV2+wO6vIZSKqSy425s/qSMmCAsget +sEWwGLPVrBLUBWaC7cnkb00sZhbHmdb4V3jUh6MLRhLEsy6IgFsT2VTu5Rjvclbt6gD1ZTL3HG4G +8BqJHXvzzHuFE1KOTli+ccP1ZI8aH4hErUdX3LLYqrA8r70PieEIh3+16g0Y8TXhr3ZAGgdKzHov +o6WerMfeq9bbce4dYHsqFBiHXJztqPAju2a7NAQrWlYw3YHYMRRSpaw5aPlvkRSlKCrfKzshtfFZ +nGn8p8YZ+n7AC5FyxlO9yuR600mlusYAGjjZIAl+E55kIT8QuFlY2gasbIJGldEC5Q49lIGeVgKv +gSDazciKfXo53LNP71dAqOiMAGZ9MbKLNR+zgPD035V1aX6jwWeoc7sw0EDY3w7tkj3TijUuQzv1 +Sws16Ccz6ybDq/yIq2LerG0Nt67k4OmCVWnNzyO9C4Z3nGd9/AYV4IIYDmwYu1gNNf0qz4Ma1yBp +CT5q1ueGlD59z3m/LsPkmcgMUDXVGAe3+gochBaTwlV7iYBtHI7RsIKiBrVRre4VXhbjOqbISROM +cfob0tO4pIVl9luYJ8LlyYB2YkH7pq3janhP/M/vKU8gvpPXKp6+YtL3SMcl8cPKl4npw/i8admf +rTsLkwgz0OwSf/hOhxP5aNhahqg3kOP/jJ/16Z1L7CmsQFbsVtaMMSCECbMVCjqkg1wMUQja3iQW +u7xdihpqmPvOLvoxhsPfG4U8chwZ98GRyXHOdBMS3NtWPWZVErkQKaKrCmiNHl/KfKuRctyf9SGy +LJdkS3E8AXqVrTpuz1Zv8nRaZgZWz/5WlEcECP4bFcCis5mN57993s2Kd3WVvPkOvbSCQ985keXE +x9GrJ5rc27bGdO3KxzUfzipn6mCHQZLiO12ipFOyAOgUGkZFnMh20HDQ/Q0Zv3CgCDpdpqXcaE7G +zELsFyfSQZnqlbJuuKaaTKkTsr20uY9mwc5cvuWvqZRu5eqlq/SrMAl4qkyUAVva+veO9aOGwcmt +jdPMOPtmhJEIyjYH/qV0oA9I9D6cHxOPc7nJ/knhY2BJpH76zGP8dz9FIijWShHBtegK+7U1DziP +T2sF8hdU9g/OKDPo4pB3NoDxpJfUDevIheoDdj4FWdDUtHbS4E/q8X+Xkn18cdkxriKrSjBNjHMN +mLNZiOyJyYbdKvTdquDy/HJSJcutJYUih8dadspRYCnLvFWJK0kVm8qE8wmb5N618Wp40DwBuyUW +wSN9oKORp4pH1MUdIRrsofIo/E5A7mmfqQR+qSjOq77uPs0qz5BFreHZFJb8PKFtSR0CWTaeYv+U +QexZUAbqds1hXYGfVw5XZ03dnTkkUufFGRf7x0rcM9yoRE2ntgNYTzWgzUK5T/owkOF30prLOwgK +4WIPS/+tHuk9c3fa6EzDdXIAkROFcqFBQZpGOtusqRYwkhGgyNNrTWrmhJ4D8plATYUTjZZvIVza +IC08S0kv0wpFlkggwQvzMuWRNnOPOVaATzbai3hDsIW9GXBQCnXt2x8z/FT6l93EI54tWSz/bpO9 +eO21gS6tg0/+7alC8sivS99Ie12kQC9nRSEqnYcGZMiyUx1HbhsAzpUCvduPCT3upXZb8FkHTEPR +CW2QEkEeFcTLy0utlmNhUURpGHsioJhYZUXISnhwqlRmGNOMSCvGQKVwXEJC1u1Va0NmjVKsAmLH +on+dAy3uUjNRfy83ZWDY/Bvkj773MTd9d4ONW19W9mYowC/dOJkGCtf8EGGZNi4i+fBPP9yrxW6K +W9xwhWoNSOP6InPjLbtK+Uevou8C3ooJOQbtG5GzUlGsuBC/ys+9HVsfLXLs8lgSjfFjtr1a4hXA +df0q3OgZfGVNGgOvz6PEaFDaCgIEbT9hMN3TpTHvSTaWQOUwNEIFjbsrln5X4HHf5eIAMORmLPOK +GtMNFnwrJlXki21DwKAIKGWbUM+/vIEgKVaK/k4UgBCEU2EHRqhtHb8S60czaF62S9/YF6SHNsJD +4Qb4oDES9X1edSeMLseQTrSDwXsWYpTzReMF4QUwvwN/w/exk/eJqtTsfphMwnpdI5nlgiwf1BUm +6iRxWQqRKBNgV6tcYE5jdNE0HgC+yPzvniNjbXfgAPFQQVbIz6lh3A1CRk/6xZqw3ItdCpcAERQm +daHLilt1O/KYL0J9yYn67AR5AO4tex5zbbEb1+/4e2cfty2Z+1zPfrfGDGlsRzgywXqaw0ylnllG +haEpJhlIgyM5uoUM2p0vVW6fhy2El+MySrfdJ/oly6G4RoWpdBiCLH1XQZwApMQowrrLfpw6LQoS +5D3QOI9XQA+7xHzZmv4dSHD51LDECCiknihNB+iHWftXAseoID1amPFFp6BF6bHshIbgQxg8qIV7 +JEuEtMP+uwJs83FyT7OoYe30sZCNY4WeovNTM+KgmjaPeLTYijhGb/WOby7NXt7Oi8OOrCmoy0Mg +KTG1sWG0IhI5YQraxsm7mWmSZa/5MP3PJJQMo8iX4wg1tmErQ5mqK6e7yMNhyCH5eAO+jQtvYPGR +r7ybbiEl4VBLCwJ91erhkHWrqxXBuqznp9KVgyAEVFIfSXQopUPozBCdTfUAwUesxmnR0oL0ohuY +bXExbfCGZBWDf2JlJNR9kW8DLg7bNTn/tlqMP+r97Dz8zgOAl+uLk/1vxd6E9C2rgDcpziysJC2z +netLR2BDsG0w7HOIPbCcyqq81CwC2olejvqqsYcehxPfkuMNWeCkjf6e1amb5dY0+dNMFdB5NN6i +Q8IY5b9TtEDCU2JcEZ051XIx6MvUDlJRxnI8gx7PXg0vUD7tCadcwv6u2HhpO+SuAmhww1OR2OGu +Ut1zu8B3NpXU/4V5qWSyntbjGmYOKf6cixYc15droSdmDSkyERqBkIyB/XZ8RNQ9VLCmRQ4oA2Ij +iOwmP6YSixhJwOMgr7tsDZyG8GiD7cxY60yJNMXYKm3MIHOXcuIYpF73WaCYANzqGTkIMdMqdhuE +JCvdDjNaGVVbLPQ6SKenK89x9PIQWXmQIx5RW51JScpCXgRJ1xKWVPzMmoCCwJbDWi0HvjTKZOnT +rHXCcSg08ts8PJ9kwynudNBwaARG/tddRU/n+mHSXR5fIGcQlf1rct7d9j7EoPILxE94oGkQQ4cb +v9y2fctJCdATK7bKtJcPQD5RDDmcaWlbikUTnTL7A8wcJjw9Hh0Dv6ZX1T/ywUrE5I+Cf1wNkIIy +2wpGGZzNcTbemaWWmATv4xSyfXZJvrkDxMOX6Q7WsZ/hF5rA8E+OrcKikWRrol2pBBnoQ5favs7v +01RhXXm8v1ZNBI+jM+aEPfHIuIbOxF6dZYB6aADWtlvCClUKv/OlFnsv0ywjp8g3IUDpNY0ZtID3 +e3rG7yj/HQIet9OCJD8qQkeE9lDhuMqOPtVkBE9mVC250AhkV+9sLqGFsKyr+e5jlHPuueHeF/Mx +dIt61uLv8qrroxEwd//m100I6lxrZJsHCq5nCRHQWOkKHSsNdAUuBNVeFrwFrm96E48N3SZlBS4j +YASdFQlRfDNNL+oeNIVrUHH7AEru22z8fL6B4jYcw/D3CWPDzmdlCI8OBGhmTEeyJXvKcerWiyNu +12f4cR+PtJxgKg8usK3+P7c650DaHydhUOXZAvXeyPob+mycpIHJyw5+dE0iXS351ZuFYOAz3Lo4 +LodL5xgEdgSXovPjhRrIyDtjyfQfipqjvSmrzQDQ6PsCpJtjMoY+rEJBethrlcIdhWQk1GGDK2L0 +3l09Ml0P/ZhwHh5r7q+noV6kqEgaSOqYgGQ8pCWFRCQk2Zf1bWecDY7obwHBYGLL2MNawUif+dOx +/aa1ScIZQoHO97Wr/5xHGpN/IUzpCa4ZVDPIWu2Iyslqb9Lp1RESqwQqtgefudxh4HXq3oC7Am5u +9pIC1HllR+Vdh2cZ9bTZCOnDxfTPev6R+SYABqVKmSUW6El1j2Y0dNd7L9iQqAVyjZsDxnFTwj+H +CcMokwbPdNun0OssvtckLw7CM7Vgwmt4vohifZBXrTn7f2fblgtvKArS/RiFGDMdC4lTLrcEpQky +OtSjaTxj8e2xe2k+Mq08zltydkCBkWdWj3H0ZuZkkVOXd1rl6XoOpNpYx0JgIscmDIENKn7NoEiI +jpUxsixiaHMzuOsEdiF3hmH9KQqjSsHe9DMfeZwpJAYeYqC1l3AUkDnRpz5kZKJIbx64YWWCU2gT +nXr465a94LxhrKLHKN2pe8Ktmc3jejMzk8xDnRA3ToJypLRKhIPCWNr6xjCagcQS23Pw6iNTNemI +gJ+Qyy5vGz0rZjekxg66nvFwXoqyUiMC+r4TSAnaoJyKukTwKHvWNWFt/uKpgzOmeDhQk2WMNlIl +eyNNpDWlkpaXGDpAdkCz8GIeNj40F8oYWIiXJv69bg1PJ2QE1OJEIIySJFKAR63Q/C94Ee4D3LSK +0bKwCsp755YNiI7+TqipoaKET67g/jkl6WEaUrzyn938wHaNZxBnoxgABFtjcA/yXuFp3y1b0oA4 +HQqLvI9eflwrRTcn0DbXmcBjocT+vC5/Pz0ArO3ONlkFTux6NX9TzjLnQwiufPWV2S31g4l4M21Y +exutytey8ZDEl6Q+6WaZRmulyFr3EqLbolUXeTfhiRIO1IQYLJkUHQkf0f2NGxCgb5SsXjqftFSi +j2EraqVFwgv9YdjoOmGaCnJRhETYNxyIXusYCXLkpyFEXDqXTdLqJo3bDxtmvpO7gL18CYNOztq6 +McMu9FG1N+Nw7IJBLR7am238Bwg8z4J4igITcszTte6aUzVhEBUUGLvdYX18ACKCIr2OPc1x4lG5 +1xjPpNN5f1iIV6VUjKlrwfFjwpqsbxgY48NMgczpQDlEM7QU0UXp/FiUdVCYpq1+TaNpBs0FCmk0 +ohcKXNbGGcRws5k2lenmgyM/AbOqDdFT5s1e3Knox/wqg1KNqJ80D7GkIHEw2kw35XG7+5fHlrhq +xT6QnQcEHQJ5GEyiJlThRD5LjT0H1kKEibuJKSaPkrn/+k/UiMLzrJTCc+kTgX+HI1nM0sNTdsNX +TWGgBHsQXcUI0Da4z9OexQbQEJSyeqt0X0y8HPTSByxBI9JNYatuwH2NKfxuTyaMS5Wt+wB/neMR +iXy1tw3tEQrYxynG04onXsqi2OJapjRE4wDkzAAC7sl3bU66VoTzSKPUbFOF9R+pjdzXCActLT1p +VoLvlQq0uakdZqy6ZHgilZI2J2xRpokOh5AlG0pLr2Qf2KP5El1zJY4/280pyM0NTqGI3y7xcls3 +yNkLDBx0PjE9AtS2JG0mGrsitDrO7/rRyl12I+Pk0b32MtH4gY4pf+r3wfWunDIOfaJGQpvii3lA +2lEB/qlXvZBPm9Zl0flGShCJGpzHxYmzD+PDwhOGtTWzsF7oy1Ml3s+UyTJJ96rJdJ+kCbOxT5li +LBR4/Ls3wHpIpSxHxLIHEQfHPbSnD5Ukh+nxHcWO9i3nKivPLlLA8NhjkeVwT9Uxb+WEL+4Ok56V +O0ubO7VdCgZwLMp2X0f6zKS75Ix+1oWpBiTNqlBtiwVjHZfVfSIs+pW0JXA6ZqTYU/8/mKSmyZER +DZBpcaa5pnrcpZqMaxPvZ/eEfkrlEn5S8vdDXjTP1NUuWo5L7SwHeXIP29memYVRCIPDe1fpFuCf +IBXqFC+TBHOxn2bhy5Wc2pusd1MgS5pl+V92dA8k0Odj5dtufKT2mym0xcfYklDyruj0BXJWZEiB +/gFYik1+uP5c4tI7SbcR0tLM2ebQLQtzHTGgThSWCWdFq1WffxUxrPWKdFuY5p80AemzQZg8BvM1 +mlDYmD3j1xOgIokqAca7ncpJDBR2v5+ny1ttIb5B9slMJd/rQikskEtcFDfurb3SaQs09mAHbjUo +389kZwBP67JWeMNglLYUXugp/+ZTNUhPtswk1AJt05td40clbnFhqS6azWWvvZ2LW4RbqnIU6G3P +4Ui4+Aqfn2fDmVr3+icEQM1TAz2wIYlNWIemdzcaqyv50SG7X1iMFATVyykjgZlui8Ddq/E2nk3S +2UCDMvGN6v8CR/8Fd+bMeWoBaGI/F9lCBLYgom0Jd2oJgsgNGqsfbtbQnjxU0ixtXNy99jfOSTek +9Wq+XxQd+2GuQP3W6qQk6/i6zf0L9Py/KuTsigWyTMV/Mo9FU8YDu1twXXZ3HeDZkesOSzyWveWe +HV57h8UZJuZ/J0k7RLTu79zH0hlxabRP7z8uE27HJ81DD9/0McAg8ysjtNYaccN7CcdcTwdwtFix +aKK1lsegG1tYGKq7KLMp6U1r9bAQsw3UgkiMRDF1t0ZgbDBLLS4TR9tbSnC8QCAmdQctR/fePdMB +e9t0bI+g4EZIhiHUEYj66amrwwFThDatc0nmhQzyVpkbZqkZWhD3y8yEA/ZXRxo5cMO3Q56yIESJ +buxNRrWTWJDSPNroiRRvX47EijTX47G8F1lz20XovJyiN+h7wpfwkuz4aYJoFZqxCWRw1rA7h0V7 +lfvAw97TZ0pmuLiAaTDkroCsQgTgjF8MIbs6FC0vj854Or8/RGm+d2TtKc+lKM4o3lIJIj91tbv0 +b/mXHtBval4QOA9FEKb2TeYlvc9lsBepcDkW8hYVvZUSFoy/vgOeCYb2UzbWJjz50CQZCq6+qYLb +heZLXtfUcSKRDMuF380zyzWoHEbxnXJvDw/dnBAQYqtQed3eZyjBcDE24I1bI18SvB+QJ5OLa2qL +SgvjrSDQV3gLA+HlV4cyY5db0USojVkqRt6IDSCSLjEk3i/tsUc8/odUjlQQp0ujP5Wz77Q4u/GT +KLqjenHHPqYZo9OxPyd34vil2ZtkC4EguBibSWdePVqdYLdR4XP4ExWJtV/yQ01oMA4yr09m5RXJ +Uc4yug3GtD2qSZre92fh5x95u8kbxiEvem+4ayayLveFTRc2AET8rqFJSNsPjK1zW26MeKJLXgsc +wYl6jULgu46kJF67HtJ0K5EG5oik9G9ubEBTr2CGCw2+Pu+NhUtFgx+S/VX8UGF9OBIjXwwTZMST +ms2nRmPxofz97WFJwaXGdivEINNvQ7PjzdcRbSTB2G72Pahd8WKo4+4X0vA2W5wrilO2H/sGuuCx +1UNlXAV1s1IZFlIHvHrQhafk/7u58aFLv1j5HhonuvgGkmEbIyXl45FjJPSRuVIzPYS+fw/iqQXY +EXYQPVY6DY5xrKJ7WstFkJ3GszT0x1Id85jGLYoP5PWYnwlFiLWsWPlrahFMBxjaNh1J721uKe3A +2nAteBOFyBIscxm4MGySQ6xKBN+iKs0uzB1px4D6BU7ZCkTLS3x8hBctQHsye3X7ONqH/5aK4SVV +HLPgiCTqRbDvcYg7JSj+10ssUoFwbuPWmrdahdg//v4KlBOnyerlb85tWPP2sTsD+z7tSh2yaCme +9jUrn+ejIxjb4rJMH+qoQIkw+IdXzg/P0kPXriOz7dgdUeVWm/aNWwW80vui71yDULFn6TQJkGQf +a/tFJKG5x/vfaPaJcnJ0L2I6XgAhSRkcotBMy8HVYuYsBRVwt/xQVEIRI9LVZ1p83b2SobK5GIEt +pwUiyWEHPO6b3DhWMksQQBHiQRd/fF2yq7fMszxR+6s7a0wYMYiOxCNi4jQNXP9V0fS12pU8juF/ +4d2IUH2UOykglyKjbtNotnXn2jyDipK/QrR53nroQk8D57fyfe3Nx8iboyO5DSIYMx/34cVGJhi8 +h9C2lXPtSjiN+XJOsb1B4Ek2wa89JblMsEU50wRBVb8nnF5Eyly6ZZxlXq0xaIJb+W4UUzmDnoww +9inElZj+SE1gyCWszu7tner/HJuBxWEBppJ+biqtYcigeG/F4n5tZMY1l2uGXLqoJtAJu+otOQhP +KNOH5ydHMzx1aX5RDzejBiGmrg5b3wkR/ixWXVfZ+dG7vm7jf1iSltUdy37WUqp6iqfNTQfak1HO +AayLZwRRsZn61PWPcWVgXIo+1ZZWzbolzO6gt3KJ3bZ9Lt+dkzQmQn0ywGZmhhmzTLlEfO6SXb8+ +W6m0xdaVrP2klEyFP8sDP8AvY2buUhNr/ahtsCcWH/fhYwo925OKxO6Yf00nm0vn/mMWg/ZnAuf8 +8NbCG/D0yrp5QIZalkjgX8blo1+FhJMq+d+frPG5GC+G0YgCIOn4JQa2mm3bWa/CcKvjFh1mSZ+L +e+C8PAn//jq60A3xtiBopJIvs4RV4gwwFwFpAvP4P1M+kkVGI6v/jLHh+8WAdgvRX6dQnp7Om0Ph +AllInDwMzfo/VgEMOJy6s9yCZWZh3f8RT4+fFCt2D86vQhb6UR6xr/PYl8zWjptNkUbzIyMARf2e +kM3Ii/iINIxuO4RNUNjCkvESemZv5hBo46vFYODdFA++Vp3gk/+8SQp8MKob7s2O9d6+kXHD52lr +6BqjXF+Rk0G/bRAUp38zPDMRMXnt/NdG52D9uJsjh6WvKiRydfOzYQDMpgj34GkGcGO/NjUR53KQ +0dXC6c4lXNKOhfPcfPNgK4YF/7uMn0VJyyfz26QFqdFm9regbhAXMsNYQHXSey+jrWY1sj0i4XE5 +zWsfVOLTnsIWdB06LVaSKh+bAaiV9VYHkRjntoMzIEKDmYXaMjVhfkWKyVNuGgFOFa0nSPnfdW48 +bDaki+gqrXdaCmiAnHXJGibFRPrPfYLAnGERRZgcM2GAiX5XYc5p8OmdV9RVtdfIc/r95SKQU0/t +r3+wGiwi9qsYZwn+OP6MrDezZLsB8C2kJVLBFuff43mdFKqAJ96ehgBml361iF8X3pPPzzIY6WVg +rRovPnUji1ZA/RadgN+mbb66txKCPwKGR817Uma6LiqLKyvzO78mJ35gHR/pF1LxD4KLqVPgM5hY +rCgqfEDOiTOblqoLs3dhqK9e4frquv7ERKYIV8QAq20C83eOqKt5+5pgMOcAX2VFVPdURTqLd3fF +qa9UhldH2X632xVOtnDsZcrajOBYsfnsQkGPkt3a+CDHtutD2FSEf+NS2cD3/5KnsWBp/W4MRDWF +evqGfItcyZUE5eyj7YIFMcOJq4bY1+t/25jhXXF+LHHfamNaeB004mtowuqCs1W0rFNNebY3skbx +odAz1bi5Usn0sVPRQLunHngsY5h05Y4iAaOcLDfQdip5Jrqj2ERaFQzvXnEIn7f5P5erSTbnwcae +fbxRR/f/P76Jdgx4ZR5aAFqtMX51eNbABRwafwCDN+VJSZ/yya6FE+xL0uqAUAQZnaaZ5J4rVWtQ +TA/SUke3WKlt2i3WaJ7do9PorDXYycGGHhWfbQrj0LwL5p1oKFJtXzsKIMsMIucdnj7yqijF+EMk +tq5BvolPWPby4me0F8GyRNPbGajWNf+wSe5Sg63xxuj/i5Wq4Q7LGcH7nnq/4kT/YYtZiCwo5BpL +fNZq081qbsRYXZao2XH/jr//OzRA5bZ6yf7GuR+o4s7BsIJKQVoAJuEqf092zu91vbuMZGLyZZdB +HCwfPjgB1aqNStY5a5y0V58qLU/8CyjrO9SuyvxhNn2emLlJONX+TUY+l9G4q/4GOCYb6PnAoxN1 +ZyS51QuIeoKwYONcKmt67KmmbnwDXh/k1TMHTgbO3pjpZmi9TP0B0Nyx6QRsNCGRFDjitpQKs71a +W7/1JhLmn5Rm+oDZTJvC2QIOo4/+o+lvWXk5gB0/JMnKxctp2UvNMWCSGyvPSisa0l1GRRrNAVBz +RfrfpTqn+HTrtD2pSAo4CSqpIc8CJPHVzBsRQyhKavLpM6QPjF3wn7OFhg0ppFiybqbvlgUaW4HF +hk1Bj509Wn5eWlQPqj9SV/H1gl8RCF0rVIHJHCaNyOyUzqqLNyIQf1LstgY5XsiqpHiG7Wtr/m5g +K0jUZ66FH//aZov1o+QaH7VlJn/P+5Q1SRLL/WMLebaWvCZX9JzKtmzyv15ykrAR4uBN3lUZ/EbS +np5t3rvUnqjsDkfhZmZlUgJQUUPcylfFCMy7bqCllw4CQXXseZDGK9n+kOdhPVkKCyjcGGtCrJS/ +IyUuiSrs5ThNnV/I0shlh6QjtPOv5/wW0dFsX+BvFxOh0tBkedDOy+AVLoDkF14TPEvdpu8Xzr5G +P+zF5trUVfof3C9QCisdXtDsxHMiXkUcwk/HmFO8egJwd0+GJZYYMXjubY3JKKA6QSNCM6H4gAUc +GluWwregpfVXV7O5MEBkEYi/GCTukYkYl9fQpGfYm7Ym5W2Mj593KVrEgpgIpm/WCy71ZVJg+7+E +sTbpy+1UMshImD+IudaIsPy6ID3aZu8zqw4eMRXPGZ01nDYHO240L4qQRwx0Nfkje7+7eqGQuNuT +58Sf+OGP4+Wl4WXjEFdPyYPR6dOcuY6RYzkkauCKt+L970of6PtefvvwgVZNeRY+HeFqLYssBGzN +8aTVMfB6NnXcI4162nEu/hhJjJF08c7JCcMzmgLzXvVFwyVIxmX+KW2Y1gb7oVEkB1GzQGO3SZu7 +3szAkDtucjEQF23kn4Ss4uT0n5I45WzIKNvAnMFK/RwsnCNb6Z8MP+HMmu2h0go2lbnLNSqa/LQ6 +94GuK/IvYhxGA+PB54Q+52b8JG1KoSteGebYplR1fjfxN1VhmXKCczl2vg1MJ3eiwtt3AgRG4DUS +Vhc1rDsCNz4zwbcKSQNmBp+Xa/3r9VXV6mRMtTAHXRIy8wnN2FTC8lgXkD/m0YuYcScHGWMEiJcR +DIaTb9r1N5wmbYgzUwSpDtB9AJlg7Qfjox9y+4azUDaP5y3iuJvqzhpHKsvB8MOIu/JjjSzBhAHg +L2DrJ39nCUCIJ47JFsH8JHDWT/cKHQ3CP39q2KSfq6UsbY3BoewoLldVprxeZCFYwMJczZ6OqYVT +sQ7BH16myURLgLO3Wa7oWBPEcdYmXEx19jLI6RoSMP+apTjxHNhWs6ulEKROIghVXBd1bepcIweI +3y+SUeaR/XLl3dM4EOxm/nZH1oRRHJ2+fpyAnZEx0fa6unzbZ8d4HRc0m+S9IpUaxYrMUG7RKJcY +IEECl1BkxySy8wHUbo0/Eu3YuatSBg67hh1h7is+O0q/7mQVkfi9IK+VGSjS6FWtCqDh4LaKd1ZY +wt0vprwAcuHkiwegebZrZqxbYoqSenvQIKk4MLnao10SHeiD7D8MVdR9x8wcTgHkumlX6ijSDdTO +J9oRoPy3mt7+cOEX+TUn/6KlRw+ggEoLupJmoKNH4ugiiMF1urBJsCaexCG0MF699MI0e2eedeWR +EQCPhcIP8xqfdx5bnzVScqLjZsWInzrNu9UglD+3Zl0zLpOR23KOD9JyI1UEMNZ85pFUex6R4IYN +fipH7J14fandycrvJdHJA3lN/GySKlN1dhxibGg0iq0Pa75TQ2U0nw22kxFYRVVIMrx0a8ymHXRc +pGVpkuFEWvsW4RvZ7REEI9kJ8vUeBNo+z+Rw3Z/pMVFfq6/Iin4DIHQ9uzaCRjgeseitIfFlvhtd +pa3yQqjqjiFhjILlimwHMkQbiahx3lkMPtS9e2kJL7CuI9Pi3mFQVdcFK5E/3u7aUpyEJMIMbC9a +jgHfI1ztyqI4D4jxRGi8Onng+p7+UgcqjThdI5pPOH2f6h979UyO/buUn5YxvcSaXKTV3FhsfIVI +slhF0k3loeVQXzAS5StdNx2rSIJoQvt109OFcyNQio1xKNzRPWIVMb1OYXaJgw/YGfVlIh8KeBy/ +8+G7fOygHvAz9PYCTpQuS3S4g9eImWu2ivxk53/gFNsz3SVErVh4cd2BzKLAKOuzbgqUq/Kty18Q +6WxV2UpcuR4VWyEocd2BKWyGoLyprwOVwUsb0jzz4Dl11/Quz1ljncs8nqFhkhjnFurEk61+oA9k +TDF2ADWX2IfX1PeB4t0pPqihcFqf7a9KGfSh6fGRWF3GRQCL/dyqrbIvhMbQcevRBJUlHHjyHiRi +s727o/Rwh72xq9CC0/4DC422jY6zZZhepoBoar2zWrw8BgMc9vK9Ndl5JVxz6co0cFTaLZsviec2 +7pli8STzMSTFtcWk0FdhDHZ+oZ5+Qnye2HYMC8LvNEVhpTkZkLkWakPOQfe5NcKpjVR+cPC75lGn +zjo0cxosQNofgFYXS7EugyD3P4vVjrocD1rp+IKqe4eLTQI6h6kPVeKV/vxOXiiVDwAenok2C02+ +8WRWk60QQERd1l6QCaf7QdHSt6hxniDPgYQwWeI5fvwuvbce+PvqSuJ0usB7hmBms6uiefvToiXE +1JGBPWVLIBiFUAdrFUUUzp0o4vTOXjBOR4dS3Ks1r+w6FlBZcZnOdlRi5HLOXUSajmmEHt/2EisA +NNszCKP1uYhHWoYX9LYfY5Mw7uuVDlpy3/1wfFIW7YHHVV7c/sjOywyMItzYVxuDhjhWodXrqn2v +YnzU0opJwWZg1u0z9ivUrrWt2Q/CuzjA4Zr2yMuJAKdv4zBxqpwvplK79j3LZmTyMnxevMIr1hsj +nvucRO9tgzqtV1BeCK7qcWONA0RmzDjAem9uzpMO2a76KAkT5QljUkW6yoVie3p5/OHz/1kiXEnz +4lfE4JUqoeFxojPCBGw2hsefE2bqAt4FLf4ET5uo8Ah7OmsYxnzK7KYpGVXkO5/CawGZIPItl2jz +Y04QP2P68DDCC8PoFaPkNY5/m1z6mRNDGzVZbPzXoNvS35gPuTOPYTjsHRlHHNoZUd3VLZWo2cKe +Hj0aKqkyOEVF8IIeq+eAa6XjWxEvF3QYQabn5XZZkunIAHT33yxoHuN2iYR0+qG47GqUc67oEuXx +buBMWAc2nERcNXSrL8i5Qk7pVv/1qkoDgLcDOmb/FOPgkyyguO7+4EA/OgEBeVKeKAOczbtGKiBX +xKgHN0J+fVuS0BESkoRoI9Ib7WbZYKH0MZn4dDMAiL7A3Pz++UfdF4g7OVX114v9mCYeR3BK6u1Z +14gGzPbOHl8QClOgNrOME3mlx9UgJFwPGtTjOLWh4OYgHQ3hRDeTjHZkMcLddvhDCo9/0vYXcQ4u +VLgOkp3siNHcN6pi0Q8gi1aP0g+5VaGdr9kJr3LlP8x94m187J/LH8zTS2M3Yweaxg/Dz7uP3jxV +g/CyvepHsLuEjKNmAslBTiztriS0HQxsOLgv9K8FBLicaQYvU8GiP6VnvoQqvKWm6hBq1QPIXTEo +7kZhHTrBz7hjdAu6tfzdjDlsECTE+u1FCibOEGzytl1w5h2Jlo1lTbveUu2onsrn+8mC71WZ2/pJ +qC9lxcC9QF4T94b4Li04gaC67KWEiSL3DB7IVQZUkXWJQCWonBee8+EIIJGGB/C0DPZJIgnTDolL +1sqy4PHo2qBrVceGIKjArJUXmSEu6lUD/vwULignzwQzSYUJ2nMPEsy2DAlro5yKidj5urtJvpCp +yG/bphIrMHJSXKGs1GelxUyRbd5kD11leMde0RnLPrpON6djHaPPhBbOJ2BZdJTCFr6sQxfgvq47 +4Blcg+5ELGlAvNbvsjDLnwC6Vmj9MAaUn+Q+nwfmT7eJH6v0+BMjD0IwYAjM7XvDsw6kj3V4/5zq +uIf5uWgsluoA4vXmiL5Xpyu/YpMZ9SYHC6dxQDWRt3oq2wI9X/QImSaIq1k8/uDjXhbfYezStZ6w +uu3S+YSF8IfK8PpYz1Hb50yhKOxtKg52zXMykGc5gzDdez5qv65Paledhra9gPLSZev60rU2sQMa +bovf2+DprmzmLx9B3KFWqdUFB5EM6xGnt9SohYcitUQmlUltL1+QsH1dU9nkapeYhC5d5pzf2q4G +LZ/dtbzPrrq9B5rIMBEnAxw13AnG/o+XPuhSmcuWaMI2K6ArL4dp1bu6roYeIK/Cr0IBoZij2ygj +rVKNrMgY+fGRdY5lsh9M/bz9dulWo4+mR8uf6m9PanPCwmfanpgeCkGVP+yzImpsAf6RtrI/SKu0 +nC4nm7QNLoMLs6IrvSXMm4hstBSc9ju7w4YNUDl8yDtFb1+wCK5zQHdWWkJ1txNSSFaFPmUrnkYZ +b5v7P8EusWq1goZptZgTQpbRdqbZgjJu8euiMb0ARQJps5iyd8bSrcEp4NlnCr8jgzpzhUKjJYhX +HGlfU/wLTTv4wT16apnXYdyNgnhUouGOx6N+IzXlmlnXdqUA2gutIiAD6koV7aQrUfeagsLmzGBA +qI6beMdi1+eUonNV77Qra4cyR+CwEldiY+s/yncZXqe7HquWiXh/T344junvMlmInEE6bWApQe14 +J9SskvEr5S9cKNX68VKo1AsCyb8ugNa2+7AMHF/eTxnqOq9LLDG14/+MMR6bnALBhyQybRbcXoH8 +xZgIM+h4Xiwhsb7N+JmFk7J/IbJw42UWcT8QX//5Xz7VB9VRcsaaI3poqsaUT6BUb8kQ9EZBmDWy +WDHr9AdI19xWWMJBFTlEOgv4kTPB9Q66wj4KZ7Hh1su9qCJZPSQFlCD4ona8LpjDuoHImDg1FfsC +4c0HfgnVdXcaEuiEhuksO8JHcjowMc2xFQQQ/6Ykzl8FEKfIELd0bVQuBAlymDbZvVS09xbNrumk +2ylJJYGPiNBOIT4w1fDZlK9YhX1LF00dhH5HdISvHlvItD1070C4WXhO9j2YgYYGc6M+3lysDUyM +TWsBgKwVaFR1PXAVWR2cSs38pGFGgtw/4CUXQG2dlLevBsrF9uk6iK3iU3saNK0r7pcvWk9qFepn +BRBW7S1i85pAWGlFrPS9OyNeHV3mZjXR38/C/Db7q00aYwGnXykFI+md0niBRnphN5hQXAjuYFhG +8P8UyRJFJmXILQNWteBm6VefrQnQ9Q+UHp1Vqf3acHNWEaYIanM2OfzeezeWQEv1qwRDJ2jSaK3c +p3g2MCobvr9joGrNp229LByPiWmFj1bAuByh7iGsH9EW3oUKp6/yqhWXt6/OTB8oVLUdH9m+9p1b +A2K8vfIWdIPjWv14hmSoBzdiCpDOpwpjYW6NA2AjwQzsjVHaC5424aCUKnPlkOCM6Xw1RNCfvU8X +N2PhLPUBKZ1gaQFCYJkCYcMCN+PMqkb/e0AmIuKvuQ/A4n6YgwTGvNKkSXAGCtemHOkuyrR6mjx/ +o9seNzFQ3f/rGWChuG8THUmye+xClyaOB61XQaL2rgOo3YzWeTShbH2fjV3a2Qt/kuqcjevK6a1o +0iqhsfHl++nu/s7mTAwnJEvfeQVYhGcyfot8Wjn3USeF3kpIWUFsfZGHlBRSl5s5gTxdprCAmwwh +4zKsEcDhjYL+tso/ape5bQ0RAFeggdd/XZi5YF4sMWM1W5X12mV9KNfMRR1HOwxWMSVpk3xGFa7v +lxqHfIXEhFskU+4aWJo8MR8keMmindQS7uJslRghHw8k+G5aj2SFvknoMxCrGQbT367in2wvBCPv +h2haW/FyD40S1hM6r1t4gcOE8aXuZqHVqFYZNmapk6G+PsFvW1lNVS8+A/L69QaIVApAXUqYgpVa +pA8/uT7Jdb2EqA3W5+NNq+kyNpveThwp/lirkBmhZ7cjNtGRvg/s+7WAG3xMOu8B2MlkKj/Wu2Dm +nyvyNMHixR8xmLvi/U6W47mVtaBPryVWtkFE/+zHS5VH1Av4I7ZHmUBFf9XPu8zgWo4DBW88shST +UTz0+J/Z9vYksBQg6MRBFj2++pTbxuA1+Y04GuCho7zFmOX+yy2Nf3Y3daDi1BRJQmqQgr1Q4vug +PHLeN/wbuioCl4X6A8Etit57EBnb47wS7E0MbpOtmRiAWUvJJMCUgOGv2KnF4fwaevE0aHwGhdop +4JXPJHdHA+/UFbC1WiWKlf+sO4uEfKFOFTaprE2cLlQkmXo2Xem5szifH55asRhG8dxeLz1LAXoH +T4HaY5PnLkCnXvHlIcgprDOGEpzrWlAZDQ/xnvjEYNQwgE+L+1fKMHMwLjFqippbhqvbzr94CKu3 +aVNs0weknYTz6pf5dIn9+7BpuIrTYFrtsNDe6CxALHzLInahjPZWavEqt6EwaYcw1rExkOz3Y+Cm +whUUjzuweR4McgVBwd/IYYCcxTLxCKlfio+tNWohJi+QxQRSYMcqzLjFsFZIBrijIbXPwgvtyduH +ewhRRREXyqN750uZuR5b6OTd98eoOz6D8q77WXkM1qj2YUmhhGq0ihnvRUXaRPwoegqT8YEBr4Pf +7NeKXkjlhB7lTCj/OQABy7uOL+ezasnhuYA4VgKm8ZYEPQeQx41IB68ofkuO6PrkLZUCXdz3kklP +vVWaKxdq8SuWxJ1sCBFELckwz6oqy2TOaQBAP9YsVxi81YweO3Fs0b2eTia2drATLhLeqioINxso +2xFa1e9xuYnyLTQLzTejGKo7KDKmYKHvGNOBQ8OguvYMgrCuX6r1yJY0bV5hfwXGewU/OvnFtLY2 +yELItjv5VAlRTtRsvmJezF2+3/c9qJgXbc2YdicriRxZZyNCiB3VaJC25iIaFrlcUlY0jIOtzQEj +70mubhQpW91U00RXrwGzxubrxV5VJYy11ZdQUqFltgocYhQA2fjIw0h/oQvbU1282GhO/NLKTtv5 +u8uUibUyFMgH6cRBZF2B/q7znj9ygBl4+2U5W/oS8peZ1njFr1oyq1AJM2fs+FeOIB3to/pHeuBV +wOGlJnDqWAOkEd5eJDi230zN1aFjC9lxNAXvl6VGgEepk/jYVkmVYfGnhwd9sQUHcOspwUJgxjGc +Z70XjHEyPuhhLsO5u22ZC8XJPWa7c6iPbvuIFiq0ILoSQqhcV08DUocd0+tKuP+Z41YF3a6XVRRW +V8KY8nZLKZHk9Lc15iK0+v5gJwbfV6zh2L9NbAa+S43HsPuETUB3OwvHiZ5kXzXk6hX5buczruEm +T9JWjl1nrQEbgPSbRm8sznYgZs3rcEzgzL1bjDqylu8RisPmfWUnoAzZCBC6iEQrkMSbLiOLezSr +ia63efJyhM33zA9qxkUSxNVz8p7xvE80xEGySvGcA9DWdOQefNRc4aPsNd1y0Ct97sxLcxyVwVWw +QbP1k3x2lSTobdrJuBNLfERn9YqjQJe/Q0C1J6zJTzLADr44KbJLOwoSOOMTYqGOtE5wgdhPuQ3C +I9q3ydnaEiayX9HzntmzXkyIS6QtB6RoFssXwgKNrpKP7+FCP33eI3jQXq2IsevV8VKq76ZTk0Yu +JtcoxYzvZLHpUSZ4yVslI1+8oY/YP9EhMixRyd/SA1i8Xyr/Ayc8WNDZxNCMW+YrWAGbwU88JTCr +Qsy72ZQ9LONRo83hcW6l91IjziILGDPxRXGI2cC4Dw0gLiQobXHv9yAJjSS14hNXCHhbzYuhXShG +7Tqbc3ky3uT7Q2jKgd5eCmoAmSujRi3CV8+oBNBCL+oPeGw5L58Ix/NJPmAAy/blfkZXkdVzre0M +Qke+tPpxIoWxotAu8hgtA1ApOrrfewgMBCE/U2wCkEwH6rHFmfgkOq/EvsAb2jmE5WUZWCma0RNI +29sfCZh4BE1qnt+6K8p00UKD0GYspZQaBcI4TTbjCTHFP1ax5hfdogEUmzEr+4dudwVomTQB3Vr5 +Accvc3qJyV+FFSJvVlp9sBu8YvqUudZdSmqZNAxg6XEVVwmRKy52h5AlSpcW6Akm+T3W8b6m5Bdp +qOIpO1t4EyfugqX0dxqbeoQ1znz4YZbq6chGSPDE0EdvWkJ9pg2385X50wgEmqFucoc/JGNU9RTB +nkLRPCvJpbkJScc4IQ183gEJ5Z3e0BQxbXpfBIFMComDDEvH14S5LC1vAXxQRiGf65YHDORLiWS5 +Qkm0nEa1C7ps8Qra6X0qnzA9NlYv+t7tywUOvMgG/D2rs/2KSOAuQt/lQk6qJPAgSbbJ1TxNQHtd +s4j0CDrySX/RZ2pZ/EciFpyy85jCpF0swGeNNdRJ2rH9Yf06dI5gGbWSqeiWv6JRM3lReIw0tcRD +ZbpRA+bkeVO+5wXuMsVV3zZKFQoZPcMJlcVhz9LyZA/y0bQnXnb7Hn+V2u/lNTEozrQP88qYZFOB +veM+fj/2w1tw+nWiaiSDMWuI5MVHFSSAvsIO/z/LKZFy1zrGpbp+xkkwwoiaq/guUhhHkjqlzbFb +WM5lF4K76ViiFIJqLX9vH2cWIq2ylQAcKYP7ACJznT6oHhPVLNiSMazSUBEssVlT0uVtKbxYk8rS +TGHuaroy8GnYznXyteifxFc+sjg7LcZ/2Smj1EzVpKIvXO6WsBpdBpWlnDLaRW07fM/uhWv7YyDT +XVf6N4NjrYUHo4IPEAw36s8xgjZnOJeq7apfQmF8RTB7dXDfN3a377UYr0nrkrTxX77QttQ95fSz +fdMKDYAsNsaT2BZkvgcoC+2FqqmQlLoQUay68V70mPJafjCSIUMmsBovjqEENHCB6yFE6NcUk3ok +ygWzQEaG3u2bS1poxovWjphaHKUa57p2Stk7okhRqBPItw4gGvgMiOgGFbSnt3d0XqOJPXkn2mNp +/8SqUHGXVGp9L8xi9EoAeHWAVTaI6zL4TAOK5o+h4NKeZ/I/4qRPtdZ32S63enOOEv8k4Vp/+hUF +V1mVbYALixDPlaJJEPdrTrxgxAGVWGRzBm+XHHDFXIPgq/UOaSDZVl3krJtR+LPUJsvYCFLf1qo2 +7rFS0oZcX/2qIqTa9eOcAtQQ/OBnLBWUlpM1OMM11IfabCSHbp6b/pjEBYhDIrut7jwN3X8GU3AN +a9x0fdlJveFcSlP4IVZTYhxTA7PRXaJXHYaGtsIT4V2kBzk8Pz0W/twd1y7I2+9Sd8nFEzPV9M+E +Gy7CiRNw2Wgokyq57OZCb7DUBUazHBSuuEFQRq61H4VS0FSh6cK0Npr0iXYIhX9YKsC/ph9/IIoc +RhDuV/YsmZwDzb2N8Ji5pjmPLYEN6yFi66seSyK/8Be6DR7Gr7QfGfJYzHFBMrfXp0A4w8XmE57Q +JufKuTWERX4Vwmee3nqtXaG1ZAbR6tKEOvwmFSehutofUlZv3EormWkN5RZpRaf793LudPXpFyfU +M35rcKomXFGd4ADsusxaP7odMrpAH6LWeVZBFdSC58nHn5GcZqZseI9E9hp5uTpWDCyhM1ZlBy9e +BHGwJuFOVREDnE8kWAMfXDKkyT+y2L3H7Fyl4Bx+sjhjJFwWxXll/kJ6BYJDbyOThgVwzcOnEf0k +ekJjcVbIY4OBLCw7NrwnC4AKBkVoFv3NzKsm7CYqO3EW3v5iThcBkPzB+ODd6mVGixYwdT2TOiI9 +KbefNwtdnW5DP6JcY5cub5WHBQ/fv6zumtyCqImSxjQcY8KuU0ZoSrIZj/jOIhFRDObr6Eye9Wxm +dCkcalCYLSGYsYTwhxQ1p6yG4saJhfst3tsKpDK+6iE+fuyonfknP3FZ8jkVVnSiChCkbmj/ubqZ +dti+WsRXCk/Mex1Oiq02r80Vsqkvqvrk7nOYlp0ZVnaAy9o18qW9Ty5Tlp9bsUHTgCfPQ4p5wCSZ +VS6hcK47EBSvWNEZskP98jK9EY9thaYVRiBfvV2o4pBAR+ILt1Bs2UPFoiRdTNDYjbIHGSs+cHaU +lbspTYU8T7O9dD6wsSjn4FYOZaW6GcZ9zz5zpD9mpgoMbfl88zeTf4FaiXkcJdsqYJvDnJE+tcFm +Hb50tu0NGwLJml8qg9d7tBw3amfTnHxvSBWHtAhkHuas1VRoNFA9kNwcSCFcG2m3fr0RdFoKAFwG +S68ExYdnOWIQHeDMK75rZsIY+gO3MXv/TFZTYWZ753v2pyE9yoTAM7hWqeQBCNDsr763M7edHE2b +XbS7XdlFtSod2MRLwz8MuD6i68+p+VEvsjevwobGkhSbHla0ht8gnr3rrVkYUY1kl18lCA18PIzS +PrexLK7kj/ZncifPgFkpQVYrShlh2aCkulOnsTpbbe2GPaaqy3DoUHVzu8iGw74+KZ8fIuD7rJhz +koqkQd7X36Mo6QhXAOx6NIvSTTgUq7CCdSXHRfohisR5bifZdsjmxL2SWmjC6skLt0LvhsMVzZXQ +0T7egpCq3mmAMA6h2AlW4WS3b8y1Gj7ONuUinlmEXJFUn8iN4nHwHSa8AvVDtMTavjVCOveoyY1d +lUTrp4Mhza6BRAT9ZWRuUojuUOQmfYE6YZeiTWsf50CHDZp9WFwmX3ptTwZ4gNxYxtgXFri5ovZF +R9rEniCssT5Wsc+W55CWTul3ZaVjo51B1c7MyFCiOUgdRSYk96QPvC99S4DmV5nWpK+QrE93Dbse ++EkuBGH3VvcWcbkhBQRftxByPM+93u74aS7ZZiqvaQXzokhklhQeRoeKs22LW9sLsoCThJwujjyN +CNzsvHoxpnfCZ21jvaJNdS8ZFAdghL9ehl+R5eUmsQWudAd6jjVhTnoX3qDm8NvbXtZTQ8af0yIb +VDrodJewwbSO9ExsGMPIGiBBz33jPog/yvRsDjUO0cHdfGrrJatk4nOgQQH/68BfkFnubjJBaOfA +KKzBLzxmPBP5vY2GqMpfUI3NqMP/vLfrODVY0iV+tXQu1cgt42PmNAj4m/Uqq5Asm7xf94Pr4wuf +1uTRSQbkl9AgezG9pIxwvFf/6rf5az8DsCyazXHoPOqY6ycD+kTYUJAm5kYv8TEZcWCnCYro3HV5 +swrbgsoNNplfgdmbUcuQ2tFyaPlPe3ShWAdXt1DG5S2eIdENNUrUhp7KK4Z4jdQDzXLEGg442brs +ohvKiQepj/Z23RJeeAQ6HjbcKbd6+TSHib4PnVo7VFussNN15LhCD+aAB5f6BgRqVglvEXFkCL2j +Dw30PJ0fimLIQiFjjrwk84NSCL4JyWgi9Rp+4d5p6hb98BSU0L1zGDFQ2Uj/svo+0PiCA3cbpA6Y +OWcvsTv64Gth6Q9rfzuHPqBs2ONq8QDUl87MiDBW3JGxwdGTSAHsWopnB0j+KTKMYNoJDinb4/AY +cfJfXj5XZ1sUiZjeHwgAikK569Xj7+sP8zUJQNPPS/etGuZhima0lPiT4Bm20Jw638qjkVblNq2l +DoWXfZ19twKjTnVFy1Gr5XgX2ho8wRYwHpFXjWyixE/v03uswjAnoG+nuPsMkVW1zKIO6lE7R+Sh +6xAsCjio2SAD1BVvUseqtoFNzCFqpFHY63DC5QLgODujRt26bSswTMQC1PZqyATdktAgIQAUcFgZ +6ERliQaH50q7q1CFOepD3EkZFC5Z/XC5JofPIFJR4b6q4GENfN7SX57ctcPdJvcZMJ2g55miHBuy +xuxwRG2i1/eNEWMCuyYr9aHI68dtZZU8B+oQ98AoAQxDNmFXVbXd1o6C4WW33YD2xF10WRimx3x+ +K1Nm4pzlObv3qcGUFF5/Ad5CLHrR8ktGy3lxTsKRjMLSH/Jpd02f++mOHQJfu60f9UCWR0MSAVCp +SxZd2+cTFMpDyJiyT8iLgD8L5PbyB8CBscQIHI1K5j4/VD1bAyDDW/RJ7iyG6iTcz5hWHlqv1Mul +3InrCgtGBzazmTr/nHRcul+v/o9e611erWNKAuEFnCSE/asb5rUvdu5VITAdOObJTazhZQDN9Nnp +gvvCOA9mScdQuX5mdqY03kZSQY05U9PY8Eevx60qDEOVtgjuRqWPeA12tiCLBiJsTYCh+eLH8LHK +/QM/GkK8FxeZOmMcqlyTpR8IDUDDdr/obRRTKrxPNjCisgkyHEnlME9Nd9LF3GLYsG3wmlS2uZdd +tUg4LE8MqvKCTPI8Esekb1YO1h32yvB682C9wLNyKpamovtxrVWrR6Ku0eTpi2/03tZUVY5a928d +2EukDKi6bfAN+X2xDGCTt2monHAUNahe4TlfygjiirZOserUrOVvuCX0bhL8jotyFNTe6IB/LPGf +rZvwzGbjTWwQo0gYWT8W6oPDG/gBntI+vpx8tDLrfR8Eq7OOkNt581SBcYIASIERuUcizAxfhXnJ +0/zuGbko2BZ1t1LgT3z3HUKNteg/meUGZOfhqx/OtnyqtrUWm2TVAebieOLvQ2p9VOtgFmA8mt9Y +KHqkYfUj1ZVI1YNABHib6bdb3Rd2HrkzeahLfS8htdV4zWISxqF7xX0DHSbyykmJ90ZMtLtWYkND +XVGaB4Y5FDMFpWJk7v8hCYPlvR3SKTX5wlJ+2v8z/numbwulwJtNRJb+cG1HCI7+EuDTw+uj2SxI +n65daFzrF4oD97eyvpaYtrtrrQKLGsMQqL6tMagdpTMxnFnLLhcdX8jb2WxvgJONoRh4Ueg/5vMk +O1zCZnHbNjyIpaFXkgJJJdpYk6eA6s7Q7Ssf0VKUQKMDR1yOJzgPa0CPAkN4DtLPbcMwqLFNtRSe +1PZWqIAtz8zCcExGI2+PINnUendE7PZz8jAuQfyDVzpyHR/3YfHATnpyFvTDhFYkayzvvWJ9GWy1 +GOrYcCashFomPOnrV3yI3MfncoKUpS3VG5q5BoOQ/TQeo1BmMrd2ivKH8faYrhbWiuHrYQpR3kjo +ZBlYU7oMk/d0+aLNR9c2rBEQO6K9vojyTZL516GiRe1nDXsWpLIFIr7wBvJ/rNMxsmOglHKOzINd +4TUeWICxz23O+aAa06c81i2X097X7RQMqtNUN8mVf+BaNHH+BCPtvKID/QVx6waukb0tz9dJ/N8+ +t+c1Mcg+e4z1eFceNhlO9fJ7NAigjO+lvaJPqpfNSUF1PKjQ6tNRCts/M8lXv7d8e4fFiQdgVLkU +uXuwzbw2ICYtCYgCG3elyH9eLQvXA49koR/7uFtn6ofbJyybO5S1r7DW/hgwajhpoTPlDmBp2eEg +TljHWVQoI8bslK/3y1jMj80CNWakE3P81mqFqyrXT1RJXskbJmrhVnCjwMgeIPqbLSKbCaiVN0PA +QwF3i+Sxxf59Iqobrt0MN9yQ8l71xCX5jmK0kiybwe5Pjsfm8T3FFfHuXzmloPjLIpf1WLkPwXyp +DFfxTB32J3P56MZwQ59Rz5W4/wlE5WDQm89RdV9c6djr97ehTfv9LzL6Bc1px2+tWDrP5MzROE9C +Ass4ztcDxbcDA14tRgyatKQU3UOJ/ldbCxxgdFfIW/rHA1oxin5sEWeIJ0h7MJ04G88p3VEk0ZH8 +xnWuZIhPXoPE0MZqPSFYzdYJkVE5EFCboVu2k0kw4ToiKsXZybewF1KAvlEiGgCPvG/J0TuTXOCn +TsUPAfgQCNRoYAGJw/4Wj9f5uTHbUSGV5DeWa7Edj/Zym8+WUb5WVfduf0geh144EW+o1pfK0nQn +sBghnXzDBTqXNEDiDXwA1jdy+QgCxQQ/8FxXK9cf0L3uA6oU4W7Vx2WUekHzeiL27fMVgU8dCgNC +YAH9UzNigXQ0/9PxYzt1cnrHAzzN+s06mPxcky3pCgaVNRoaDMMHSRytumw88UNK9J26GLjLjkrK +QmdurjM/WCxzSWgPvr+dyCDHuY7kTgaq4YzoBB1r/4Av/ZM2Yk4o4CfqzpKIVBClAU5lkeF65TNX +4LdAPH5um39hUNIRZVmv9DWu+XFGScMcmUWzbQsg00dDW1PanPKEAbB+N9z16XavpUubNOltDF+i +5L1SHpTwAQjltDGI3YrBvNLWUj+fmHd30MKoQHlcltwEU9nVWztw/hE+EBv51gibjLYDi/TGrLyF +bDOqdw/zA+ahdhagdyju4KJYlTxvv80+wAmpZPe/veDqo5o1Rx9sHHDOhPKKvk/BDDb696Rw9Y4K +aE288MFIVhSm0bLl3pAbh+wLhLdZULYAf0PJbOnncGioeeM9zQASlUJQN8IFk/BdNrN9hQ2u92MD +Kvret+NiK9OSxcDqFP+SoSpeFWHbE6qMcqvSm639GImmKvXNfmZOQcpbsouAhhTgi2eB7dYlzOwv +zdZHgHDDXE0Iy1yvdoIzKXS/ojo/CmRZ1Zq73s+zgnz/0eDSCd2yhNFAyPasVtlE7SXpFF3QDPhA +eNjetQB+Au8IO9y6iNnorgowLAGVf2JERdBLD0rYAl8w8zB8cxwiNZ62DbZ64IjvAxMw+FP76FmS +JN2Ulj/QG6HNSguJ7b8MNXLlNBCbr1TyS2l6q8N+RNMH7VIwCytB9sUGH0DyxtOQ1GX06Le2si2n +iQ8o8qjjN8ahtrrOWb9Qtvfmzymq1iowTE57sZJsOnq8Ts6FRXy7aTHVU4+dGGwcPnKidcikZWn7 +/lS3Bc//8wEdvoVDPIn8USaAkSRGd1sOvVabk0KGtpcaPv/yVylHjftPLt0LZ+q4tP3MBdbUyAUZ +MGrptLJ1xXHdBtFipBWDuLYFj6+XIWboO6voDzJTIhRow+5ROKZNOX+sjSRuBNz6eIRGEfOTMSMx +En08p6LdXcCbg0YIstv1ueYvBPVdb7hKUX6LEtghJlPJauckdBwWCku/UzDZfN9Iz5025M4WV7L4 +G4R322kBa/z44Ud4RKvTGh5ssEafIjNNYUod7/cZDz3TLStmappcIh3xchkhGMMD7NXuJCHtd7Rv +Bxoun9xqiuVsXJ+lrgmmCToqkB+N7l8m/4i7flyY5Rsr4YcwL46DMj1q0ugZ2fEDwC1Ktixupq4H +kgSs8L6Sr74P6D28xNmuOZaA28vJUO5EU7bjJgjDWz2jEW61CRfBJx5JZNBeUPcjwMBtvpm6Dujv +B10snVc+EB1laBGZl853u/OsYKMCE6YJ1w0t+3XnEP0ZHNrdCL/CHR4GqWlmcCBtwwhsbNK7VmCR +4CCDx2P7KSVCgN/Bv5Y5JA9MJIhSQkfYkAI1rtlxILRycNQbCedIqUfU2TCueSC4BXM6XoK8d9Lu +nc6hsPQGlKiDj7XdSXGCiee/qE3NSWqZ10bmH8dQRbDJe43bpkqZfyEsgzMAj1H7V9oH4nFghZ8k +PnHTv4b9WbmQl1TUBlixO2TOKLnt0aPnE0htpADEPKX3YJL+kpqNBmgg52FVVpdunwuK45wXAz6a +PF6dScJNMZuAnFQUZGEpgyz42FXkfW83JJpF/UT6Y8+SF6WiX8sI9sX9Zzyp/UFyjIZ87iVoqB2b +TKxR+522HI8kKrGGuRX6ZbwQQPrxzJtlqq63rPU5SV7QFvKh1AAGNJHn05omqVM1P60WNA7AXXSh +nJjwn7ar+l0HPWzh+fgCpVeDRWjgZwQAkPGQFnPcTgyFgMYkhQHA3yMMX2i5P6szUzSeHyL6kMHF +b77d3xXmek+3k2/uXcfLkk4J2bEeXdyWPSPAoBpmcku8IikndliTakhneQeukQ3wd5yp7qC+wf/d +GQyPIcQKs1uCzE7TWJmr237mliZ9apyovql/dY2Y3ZTzUROg6vlcG4CvSysN+OAvTIJ9PIvmy6Co +B+95uvePEj/p4D2+ZQibGSkdgB971f/gXuPLiyl6xnnTGqK46PPqwDEFfw81nafdrcrBmH97MCOt +2wNGmoRDoNKsiwBdeSKGYXX3VXgu2moKgJPU7YXxqBSPWkZge3Abl5d5knnzkyKTamVKGrwnvYMA +0MkwpH9WHS0UC+ByDIJqJ5I3K/SiLP1YpdVkEAZhJ8AJFBvtDG0Nd9B9okukF059ACiOdaYldhKw +zVQrIWVw+9y3A1q9IOMFDy+/QkKizBCIF7ttmQgWYtvbk1wRNc2u8lsbtS/YvHwZPqdFU+G2G2FG +4/ytVuN5t3C8wSPObvsKGJZlab8ncSvaLTgh86voBsllOQcZhtY0fvHaAxpD8oNS8+/OOiJ2hk9k +KINtsmYqhL0PjRnf9FlTrBHiKyCd5UM11BNwSXY5Tu3/kPPJNtO3+Z4n/0hoVJLzs3WXLD6KaDoA +kKLoxLPbHczyGjnmPN/JADSRs6ImildyaPkX4k+jj9DJMSsmYij5ucx/1QM2V/o+Mtb1NCgRoEFy +ASLoe1Hh2SsotX0lANHOcVAacMR1EheNCpSQd2lCgnepB87E0CbhGWUpXWifKZt6M+gyN/h3fxzD ++GIz9j8IY4lDR+w0ELmR0YUB1pm9EWahlw2W6+2zPIh6Cm+VY0GWD64CT8ULJ6QXq6CgONGpoVR3 +fr8DjsYOZ18aVC+siJ1Qtpwa3eEMopXt+YM2UXXDj84oFdSB6GFs3hBPpKvOK2Mtl1MX+eiKUrMd +CExYroWaduSZ6XYE44RfZcLBgbGcbLkAjz+H7uesntwl/k0VVMsFl56q64ynFUzoHqGjk+8boS7h +4IRVmSB8mijLnxdUv/s+ias6kF9rpxOkcz27FigNlvaYv6c4ZrRZljndmGLof4R42DttIgqDlTme +07mJ6JA0yNSKpLpRumjtgOw9GrMvaIjD3mpJ2HULOz+XIdImVKDb5CX/oSGaCiurzDYTP0RM6poq +HZ/WuZoyvvlnobHDBY+q27LLVDOkxI+T0vyAJtI9xbMU1BTA/m6jxXisRq3sHjKbHMrV6jOdkd4R +Pd2XZSzviwhmqf9TnVe0lU28bd6aMmZh3HFHZ0FLcdQg17FxsEFkVeYpRDUGKSokLqhPRD/2sFW4 +rjEGOddyCatqwhgoXz9k7BJhBva7goa2LnKG/sU14+22NjKF1COQ70DMeJe8z0ID/q9znKqTfMDB +Wo+7jGY5/UwS8dqdhxzzM4oPzRppwS18jWz3Mmh5RQedF4SipnmqRZ/QxvtanTYZTeQ4QJQFnaly +3dbtAwMKjPYMWEjpHCrxNAfJiyx6wkAD230mQVpJPmi0GCtAVshDUrO560A+UEQa/6KFvU9t5kFV +zRNUzbwR4uw0hQRMzDwD78KdHcI06SpI/XFiPDuR2mxB6zLFMr209JVLPHHFZerprxnif+sxBacw +FQeclx8m9B8criehoYjir8/ts0F5E7VRbi/9ZaHEDXYiZxSzds2z6xpy75XoVoGBOQKLSLlIovNt +3zZmWnlK1k8oT2o7V+7YORtFfdbIQPTsGHi1OQ5g1adYJKKZmnnbYqluEwGga3nctiUdvmyr1tcN +f6LYcoqNAo2SJVkkELpxPVZS50oyQqYufyi60zlMqdYMOwvFdN3MeGswY2twnnCufND110gquXok +HjFboW39GCgGdrBVDYFCSiyWwOsPgGLEqixUQd5+jqapONnzhUrB9IFe1I0pPMknAmuW4EQxtkAX +O5rI+0QEvW5MwwLfysmYsYLiuuf/NmcjGWx9xbJsLr6BSLLPUtP7X6vRAOc090e5YiUWfNnqbS/C +g8reL/Fzknl+D/BGQEz0pUeqGOYwLoZ0aOiSM/ShsxT7RSlnaUK/RjMlEoYHYesSJWIjuDf+QaVi +/ttFoGutAfqbE+EEO8wuwonm5Jz/EExjnZ6/OBe90ve5QgbkBq7eIRkoCrb4OWV2dlTsA7aLYi8e +XVYoyDfWT7JSee5F6Wo1c+p028W5mKmB4zrMT16QGsEs4YQIIww25Vne2Lv3e5ETCNlPgIxlmwLZ +HrP/v+uvTHAnhD+2loP3BjR+ku/Fm2wl+0gsY8nmpbxoGEucbx9wOzGBvPFrET/xMdABlt5M5xa7 +IWw/dfAkDlyCBxONVpl5vr1EZL1MSVGdBFnvVUI/reBcBgu5hQt6Rsa0OqAmuRxEZ5CXMjsvB9Fs +JD+is9VAgpqtMUxf4mQ41jTYAY6drcvOXK+LXs/sAmfnoiGUbO4ABatUlK2+fA1U/Aws4gu4QYMU +hpCtSkQsteUcUGPCgugIRh0IzRpHQfGGVzZXWndcjGCT0wPPGRn9GEHVhQTbDkbCVJ5halarLx8e +FyM8v5QduUKNCjHOCTzeRObmQ3rcgMZjTYkpdzdokzTAOBd6m5Q2OizXJfNoYWIY7ZNrxpjIYP9q +mHYx9XyYI8r+rnXj5jw3AxhsDmUFxEbYG0TCc1h5AK8tWH8+BCdksWqihMGzYKbbQJ8b22nrS/KF +DGpiTkI+MnaEv7cQpu85tMkiHm2k79LoaMMiADvVsYzVkxuh0pAjZ1S3/cvy9WDYCHmAkQgLZj+I +q3IKEGbYCjdipaBW3ZPXTjiMsHVqyy2H7mrUYM4tAl2p+UvvVJWQ2WFDf754WV3D3bPbz3NRXAUz +FAJUY3s8paBh59D2YAXqaqDMddWxbzf2T4YGdCfi5LUHKq3YCRcGVvz8hpySDBvSbFIzRM0sEW/v +wg7BFiEPX21LDz6hP65QlSuUhCXmK87T+0S9tTKSjBna4exFUsU1H3OcByvht8E3AyTYze06Dsem +ixYBDpaVMoCXDB5hb0xkYi5dclkdze/yvd3wCXgzvHWy9jJZ6nvqBgeS3vIcxNVaptTlL++guVTc +0erdje9Rw75+QX53QYpr7eI3vDi3zalzOC76NUigjx4q3NBRTpTpi14cu+kFOXj6QL7UrVXNsiKX +nYM9qJnP6jtdgIDul23GJFkje4o+b7/Tg4Cn0TRXCXxmmZjvT0MnRnwGEa/BbtA30a/t2PmlFBmH +X1ABzlLve5+eay1MZdB9WY0qfIF8WKWHzKGda1DrpkGB0+/DlC5KNyyvTEnTgsmE9Ixko8Mn6DzY +2wnTmK7Vjf6sRPumw3Kzu6zPChaZuV9fS+F1ao6jEF097OTDl67tCxETlGqVMIpZwthziXiTxjX7 +B36M/4qwbAmgySHwcKb9p3/w7/MIuein1tYxHkUAPmpiO+D13w211aLE82eN9T4chwNWpnLaVJva +jqil+M+Yw5rcfi7DLYOAIxfXpaljciZUACg3s/af7Pfv1/D90xKxahcZ+Lbl9XEH4iG4zYd+xFEH +ggG2W8JNpL6tHiNwk9aN0f5IvZEgKQe04l4xez1x3mqpAjccKvJ9KofsQ+7YJ3rbWK1lfhB9u4If +qOC/sKFMaoGjLVhMgI1GoCkkmahX0d2w3BvieyERSQlbBDIexpfciwdgGMyRVa3KB1Xh6kcuHLQf +4TqPW0MZYdkUacP7lxnLHGUFCQz6cO7ecgNwVjx+/ph8GDlehdTqwG8bQXBkX1KC6IO0/BdvmScy +0q7hd3urB4OiZBmk3BrOLG5nyscOu7eiF8DnHywV6B/svXAkeB+NWkpUOjlXovz45DQ+D1JdJYT8 +otfDbd5FL5GR/bghasQMwgG3ILTkVNBUNIusWZmaW+dLyYOJd8qbqhCd/McYqwPFaOucUs2W7Xat +6w3Na5AZZ2a+Y/jir+AoVDxz6DTVD1yE6jVK7CZSa81xvNGKbF1csqAJw3K4SWeFnLsWCDKjvUA+ +BkQ7nHlCo6JCJammOibCq8HVkA/MOux9Fh8ErHBFlq9tH3eQmhZbRCS/04bY/d7uV5smbbJLinVb +67s3RBkXvQb5yPxXUK2PvXKNACb1PW06aKxplowTqO00CsMZCIPkWReef1l+Ls+emkpAVxfFLmlb +tEeK8tsmoGcssv6OrhRcE+jv7o8w2PKei/15OjLEO7LYdUYA/8ww8/v30j1mqFrZXHfwEn24oanc +swQMEbD+wkkhFu61X4xInncDo5zTWHOEqNVLnXV665BfocJzAsM+eEc1Bkvegr4uzesvriaKeKXw +jCjr2QtLGIWNAAxzXUlTfXtNPFgE4fdJg2k9pdtzO0VAIyftPBj9R44wKOX9eFMCKY1fcP6C+8qy +MulowpmUzNCzz0Ow+nD5+jcgYvC1rvDvss8Rau1i/PlvB4miqtV8ir8YEvb5hwbAWtz2r/RyqCVV +89yhpbg/0UHARcyqcjiX4SPEb9m/Hmp56wLz5X+C5HWZwuA2RIlrkNPpIgLwLCvZIddBqcnQsvLn +yptKMaGNF9LHZTVJIgR1MgLw24KdgVBWj8L/zNvJrDrPCWOKlP9aHd5nj0t2ZSPsun2G62hHqF7u +j+ubEPJFceUPOuEoftjcp5sohaarrVKFMEHGpm7jaUsWScXgGAmyQHmplSNS7zUIOrY/Y4P1PgiQ +S0M0GeAYSAZ9SnYpYj4YNIYT7Hj2yCkbpw+EAA7LuQFiyn3WHs2LpHjwzknu/pGyUb3ChJm68+PO +DEpMA65HukxLxZbCnsIuBE6TYYrjr2EPiZnElB1eRmYpacsXLGuBHqCWKPmncfns6qx6vk4/Oj94 +jRDQxnO++GLAgzbG0J28iOb9RdhkcCW15v2FOFs9kEBEW26VId36rQS87ueiW2ph1T9i8JQD0Jxa +EHvzJ1q1sDKoCDb70s1A7WS+Jfu+ePVNH1E+9YjuthnOVzhFHvX90qcG+cMX4lcC4ylN+if9jiP6 +ncdOChFFpGF6INBHqHbhwoxMPazAkRY4QrXOacqs/7D9gJi1e0mhUNCSic4x1YFDtMTsgNYf5To9 +n1N48AgjSjASWJrVTSDYfZ6boVTvm80C7OGurqtAJdxbGUTXOJ539jBKBtlo9IMgChIZaxgvgxhX +bpev9mBNOturqyuRAFNaikSlROOdjjizDxp/4nUMVDW8eto+gkazfsGQgFBQtq4+j+0Vy92GdUgl +dgYLX0JHDEJSVC9TZ/24XmEHuOFgOLUAvjhRsujdwOyr2iabb0n1BNhdsxm6/Pa0tua7bh4gcHTg +KMr83tTPKaZhOgaRCrhN0f87qEn/gjliZjBKf2YPY5uhIMAKKa7/oFf1HyihZrlrFCbg0Vk6Vwfd +beCQSHdeU03JtcWsmYDYxZI3Bpg1zD+R+lXAbdAXrUMFgUHFRBrqKTPqZuKWWz2diGla065arlro +R9CpK7tasJBAmdxoffDeWTuwSSpMrxu23JY2615mW9VXPPHoABJLeK1klJduqKDVyN5bcpdY9Rd9 +cZdu0XkfCvw4oRJItG5Rf7MWqYozxD5xxYAvWpz5H4zavs+FsCMtM+EKLkCMl5m1QRQqHrbC9CfC ++7mKl6DlaG+OTEY51tfnvh5hMtYIl5IvUfseT5Y/Q8IFhNVS9+RvCSooeOU5wHRtvV9P+yuLLR1w +eUnFkOqeGvc9KyBqZaW0kal/7YNXig9AVadqrTaKtrulZIEAfTrVM03k2p1jDQ/PelXt65iV0bbC +ovBCfglFsJNTQKCEkk+8XjN6qJUK1e687EKUpStxwwLqMDMQyGpXtGrJdJu0JIsNWK7b469haafx +KU9Ww70YoqbOIPZ50a/3FCKLyMtPd2i2gqW2rZfRQFdat4bUk0ac7F5TBr8DcS0tctKEK+ISfknS +yEnZNXHe+nw1IewDukwj35TSPvTekkIrS/5sJfVuDU+dn78SeWQHy2cAUK5U0VuzYuN1g7LNNBLO +3KVCcvxeadkBTfYA4A/WfmU/m2udoaZpbnXyEzz4zUGNEQlfe44NQHXgcS4JwZS57m6mNWlqA7b7 +Go5eYVD26MRd6VF777AaPagpTXNX7xnFxtJocId5qebmbZnEl4WB+XSZ8htXHYUAni+bxXq43EGZ +aQFOs5uLW7QrUmvtWsfluilLaEKcOzd8ta2DBW3LnH8sWY+38DLg/HFlIUc7eI+I5FvHWGTRNHjP +nF3wjPSV72QtDbQGmW0iNDorTEF2rn/+sExVsVafP8MZrOsK9C3FCd/sy8m5i2K7OHDpjwbkDnDw +DPJRi3C5AowHr5nwP9FpsM5IanXuzUx+vyThO9XRbg1rZe/bQnMQ33f1L60cJcC5PwT+DuthdIgJ +JrkrqHBMKfpW9FLHNWj+QaO/Z0RFvszWzyWf2jvv8iFcaYU7DcrNLZQEWJ6bv9LsbKNisP3mXNMy +jxuJSwH8YrY+V50CryqQ4jalHp35wBnnfcP6DHYZ+LvW3uGOeTIfJy+VbfnIoARKSzkCtGLLDiwO +2T5jv0kQa60I+m2V8aIPEsamlj2wININTAMzPUzTxwynlJ+xthL1lIPQ0AIUtcN773XU06uIMRUv +1CWl8x5HGHCnXvnY2cHA3j0bWqcZYKW/3qGku7c0FuNz7eyanUDVIFWVc49ePvskbk1Wv1DaWPAX +BysPL3/ZWffoYH33WHex4Q1ReEl4sFiPVriBC7JLcKm+4GFE59NTLhum7xkB6uEpPQ0OGcI6Yx6y +hWxEdmvvZFUaLytqjPBUT7A0XAn2Tt4Iu433GhmCIItD3x6djHapBEi43pSXjybKgwbLNOBb8j2i +m0W0Q5rG+ZszTM+RPt4OfGRZWEwgqU8sdSkmh23185si93BEBB572DOeDapGSf69ylZ7bfkt8Pzd +gyHoxAjPE4oKVXCJq6RTzlr3ggM3uU335NnLWVJeGBLWo0dOXCMyYw3EjsljJp57KTGx3lat3T4M +0RblLPiUzR24ZfkQFgbCl/mM4YkK7npfKuNx/Z4uhchOw+BlmmSRf7uTA2qdKqBH3wshrRsSFpz1 +bofHwOaaWEfNb7jjQq0AZHHOL/4TF7CjZPaj99s08Ex8v3jlSTYJsuGPWZ7oKWhUKDAlA6YoZmxJ +liyGPVa00wA8t9/HjwJge92rxrN19+juZ8ioF/f2Y4Z/m/DlrqnzGDGye7Sd3m5n0jwBVgkOxRnO +RWt4BzvE7/36L+xt6BL6U4hdBH9MbnOY+dqHWJ3DKLtriqcaMHIfoCQoLzjPHm0JC7pCYOZobofC +fCT+zXTIPBnXTzHO166HDTJU9L/LQUkGAzUzcguBJuPAGrdftivPhXl9LQeGXzhN05Z3DZn5G3XB +KuhvBgOFIqNmouTkBVpkJ1GECTv3v1rx4K3whXTHhw7ob+7qTNFCxWnx/pke5Zw4SRb8oM2j2It1 +ArrBc9Sdeezw7aoSJRc1rv+TLCEuS5Vk6fXxoSHIL4as5kB0ynN3xtuXzZrlmrCWVsRI7jsR5Cvk +zVjYoWGmEqdv7gfktkFoInzQKr+wSKl5kp620GhUHvjNK1eIgH+Bu/cAuDkkELaQj3ZD90WIGs8c +P3fEbhY/5CYGXwqSKZ5U9PECTtLkUPLDkCpnW2VXGRGy+QE2kJWq4GFT2bLqAJrO3I2N//ioaTsK +Su5LXwxhw9VDe0Ig+mSF0zLnRks2yQOt4NpZT1SD4YmowoU852pKBQAH5FSR+jIiXuoRpPnDGAeh +s72juf/+ZedwmfnT2PYDAzz3sOZjjwiTKut71cpey1YvpvYjElKQr0VzpZvlZIniBuFRtHsqzI8z +HkmoZ1Jt1IoDXQUOoR2BuW82g7djlHN9Hqk3imoUAodezsJvBPozj1bscHGw4d/oGOXzTW/jgSxT +0g8I//ubm7AS+CskxLl4yCiql1ZkvpdgnXkHdQWyNezRJrgaDARxFHtXHrlgz3WInii4U46AXoc1 +I4gT8pCIoXNK/ECCGEu2gSp0XGFJdmNXKUgRtSerAe1HrEu+z8zjJUWqmqoZew8WxRsaNRpYYqDX +41U3C0hGSeYQF4hvEXVLaN2T7ZGgRmFpwnPKpCb5OZKRsChDAHk824A6ovQODBwP05oNfXeCKE+m +aHxIog9pCDF2o2K1IkMP4Q7EJ1y61kOu+Phg+e8Ucr/qq769nVgfOKOBiTWGKFL+Tgt+mvl3qVY0 +WcZvAu27Eu8JqzVeCuTgtI90xKP84FSPT0oZfxPhZehu/hxoRI7M1UrUMZBPkCG1TWea6p1p5KV7 +q+7ME87FZsXWu70uHmCZOU7u+TBF61/nIYk7+jRsCKidaX3nhKwAWBYWG7cTXOastwBoEcYiqlo0 +yu3E939Fv6zKE+WSoox/or2SIbCHo8IDXrSqIwxh7/nY8lQfvg0beZRuo+M0YvNj82x0DNTUCWsM +nkNNOsMqyAJzr5Yu02oNFPZVNuvsauTuJJwoV0FHldQMQK53HHg4TuRmjr8kzyMlyfKZPFHLoZkx +hWXLF+W8RecWT4UNBQb5dU41cEkPZcIIQBwIPOkiJvcijcYGrs/YjFrCI/+KumMHJbxkbOOk36hA +eTZ08rRcGsrM77Hf+5kIiOlyv0cu+fSjVKCyi8Lwtseof1eRATT+cATgRa+uvdtG2Dlioa9qMVeI +n7H0yLXUSsQB98KeN/dgSAO0mFqzW2/vCKxTcAu1sWpQRfcjtMTMczfRLJ/JEaHeImIQ8CsuypMR ++NX1frtcHnSGAe9ZJ5EMD6vshdTdWeErRl4x7FuT1KFKl6mh0prNEG4MJ0+CkClfkokSLuVCgu0z +RRliOjnCoweJ0oj1b6j3/iHgnkzdcHe3Jm1pH7OcfWJAtTfNzrn5CQafmZCHlNOSEMogiDo+F06j +tauxe8hxyDAXUK11hkEjil5SuxSyCRXJLYro0AE4j9WZUaOZowMg/Gk6Njv8CIwv4JgrNkkIUcJd +jucdEjhLcy54cGsvRbdnV0kAJsfBlzDi50AEyLGyTYFYBNeuNMJqWydEtKW/QG0DUabX9wVRv1WD +LPvev8fq2DdhfPqf2mbo6I4WYXa8KohPwY7lS3mmB34qk0yVHZSyECjrlzJNj/+ExtRfLhdfNgj9 +2UpjAiYGhLsXERA5rMdbQv6epHrMZiqPeXswOZILqxI0Bk5DSvcxBV5pFdfNJo0fX0KZ81x336mc +/Afw5U+CkXHIREXIhPXtbHeykKQRdznAKIeVYBb3AYQ1YJLCu12a2c4vKT+a/ofVEfKK5DM65Pm+ +Sr/nwPpinR5NmaU18i/uBS9J8rl3ufH8JeZFcd/IHWEV6MYla5At/VljMiWwkhdtf6O2LNDnZ5Ui +xabTvmUm4POhxc34G/K6C2TKGUN9UPO/Jk3dmqjOkwfG3n9S2zZx1Qqf58npzClc/ikLM3LJfedz +zreP6DWBKN+6hkHea/1nDTLahHzctNeHKhC3r9c3k+t5yH0cqDrOxkBomacE46TE5VJcAE7goBeK +KFvD1HEt1qpY5XqAwBamxRA5Dl3KWzZsB/VUyvtb6LwlVPTLDj+Jy504Uqcaj9hL2sD1oE8jUDn1 +GYIRyTtjJMjLlDBbUz3TeOzRh4jyxj3JMQMSgWUtozQ+6LiGu3uH2s+114OKcPui0Mvn6qjj+y9n +iqv4WmZ1PH3ENwflMPznLuO+JY94NS42bdwUHu2YtMCR3uAPTbjrj9VFcHNNw3BGEa4i1F/rOFD6 +PS3Fg/shzTsnGy2V56Ut/sCQ2PotI2T+Dq9uxBYux2NXRHS4EMtk78AljOPrq9H2DH1nSAF6fJgw +e/WNCUmzyWEmaZxp48OVSLX/DYLOyCDyVZz6D71rMa8uwC314zeUUXNwyS97kpr2ARUtP+Vrh/TW +X1H7w23QNSGmJ9wCKmDe5I4bXoEYxD+Uj5u9F7GcwswRh8ii2CT8Jwt1jnB5z08TrjnoEiGudfpt +IdVteYtwdgbKpfKJUn7hqlpovUf+tku7PepYapfcE8DEEoQ2qRqrWRPSbhkZ/7F9SPI9egjAciWE +LnBbzjoCWFL+PhErwv54xPGQk4GOHlGW4hiq0O9m7bn7VqiIQThHSm5iLuCmJfol0vJr+YfVClwy +rqu05GzYM0SKqdGMUNm9KHTQzdN5SXtYl+FzBqIiruOr/gpJHBFpK4ifZ5je/PcZzBmIPbqQjAGO +gwaemXGA7yLlcdojBYFHH3sYbi5cXVBoPdzWy4FNQqCzIdMFsfUJODLx4MbTuvgmQl14Gqz0+y50 +GkR96rgzHGjFgGIbNiaRQFyv/frPVk7zIjE63CMqk4XRMX3JxwECvrn9gCINiVQvQ6FuiUMOrxc/ +B/1MMHO8w0AePGw8CGlneElVyIzgszC1acKRaW6MN6OSLB/WcQPCQ4CzWPixh5eTZ89SCpKiJkNy +FwXEHW7M0fMkilfxmdeJDsKcDxdyhGw26H3hQ356MqiW/xYhqFofMwA7ElG+2AFj+gJ6EwC6uqNI +Eysl6EnZBrSrLmcN0pBA1anx/ruCOMhpSTMqhPjYw8v31g4b5yGtWmd0HucklAQgK3QgGm/xCpbj +HlArLlwu0nfY9OYRG1oKELcw7DeH5M6MJV9RuuPaFiqAuBuuC3clIzNcZEU89ZCdhauW7Y8G/Rh5 +34lqtPb878+9UTGQ8oTom7LsKpXSGkg1bSACsHZW1yJiKKIXDtFcfRma445Ftx9RgHzuT+j7bqWr +ybBuEHf+6ES26lkJzzQ4kvRg9XMDvk2IYQ9TioQRPTODBT1RsleizbjsdtmTbquacBYOKgKoSCPj +8ylFSB+X+2+7LN49FNSitKb2rEqoAn5W4XPuVlZ60YKHPfyPpo+2tGi7jxV9fDHokkyVxJgDxJht +XkXaBpM2fn5x+jDnOYcLoiNSFo2mWhricRSnE822T+ihXWf2NdhPb+d4ghVPsL2jBuFpJieg1Ge6 ++ycPfFD5abAo3OUvhK92WPKyAl4wiT+6ymxH7HfQ0k+uCgnAbsWewkHVW5InuBfjBXA203CAjXIY +03BWYM83EAqDhUEZZisBv0dBOLF/gQ2RSoHQ+EUQQzJBECtn7OoR7uWQUq/BzMQfI4ALwuH9DOP8 +TcBiJDUBnBc6UR5RZqrE0qIuEEusKKctnFb+a6FVIri8QIKYu/KyZChzIIduHTp8q7XAONv9Muy5 +AJCp/3QVM8Wd7x+GQC5QW3c3wIcHhDOsp27X5K4jdrtEGeWjvXi7MqmlOjkUeG+qgODOHdeFU48U +BbMODveCZJldbQO5EH5rojjaFtGtB0iQa8md0OUnvcr7Y3SAao5bf+isrdEJCvXTNsm0nRpw50lU +NqDzL+ATpl6BxLmJWyqrEdXvZInc1wLuxGH2uw0N5PPg+gM2SByvTVUYYGuJwRc+MkqmHzlOJAvb +czNovfRkEJhBN2ZJAyNGNdOCMijbuyOgL6ccspg/Le5P7OWn5boJS9HHHjfUF/iL8665KHEm6pHr +PFa04oNb8/Wgk+d+sb4iZuDegM/uzQJMKtwbEXbesNaai47DSexHA0YDEGCykmGllT4lMcVFbDp8 ++rROG1zl5XCcqintb34mr3IlEZ4E+XBOnmmfeFGLZUT48uN7Tx8ci6a/qGVzQFu6ZugkEio4V3yn +liyPVqrJ3lak3Ev1GV09OuXRbfJYGqf3x7VaPMn3EiT/EDOIpqd+XeIiK4qx5JVcsCdhD+K8t9lV +dxoIAXjuxppW2RIMZW8HHLath3qSN6hVfTWfm2sHytxZj3NuEbOh9HcIQg7Lj91tdWeB/5sdFRfF +wPUAlNBzvOXPSYXjk9L0nVSQ1AcQ/aWKbvlmCmIY2B0Ldlo1YUtuPKeqyghdZdQa6vtktY8qT9zx +fF1yw9A4AZ3sQNMQnhL1RaSVeBrbaUkzVDi9WxVqW5b/bTRNpH0h8tD7Tw16QtP9z/4aOUM05Gmj +57K+tk6ZrWNfE5dExbRnXyd80x5dzWwMQrGjDcd7ah3H3KgskVoeS1ehZYBYBAyvbf4OuZy5JaeE +z//dxLuDdQ5/uHIhwvDVPg8tlR310oj3ojYH0sbIVMUBho2N2zlIwE0q7GJ3Zs4AxsRB6C5FS9bg +sOBsKB/wWlljrPoYv0iT87XuCKgzD49MfpYxj7yumMFqiMBgXfhsIr30bf2KtXTUfv89wOq0va/d +sm5q0Gi9xW3lb5cwMCnepQXhNfyrC4KtMDZ5EcTYegPQq5Cz7Q4L8yeGYLTWHvwYjdzeIE5B8D1U +SB/UQHyRYOw+sblZUlcm5ceTighPGCPmDkTSBstn9i97Pwjmer9uZhiCesTzMXYx20vAxTfAhLkV +RK7UnF4AFQUDVjhu4rIFMM+Th8wsFiF6NJlLXkdEc67Cy6IrVt1K2Xv7/4qFJLgwJWVJD1wqV6b5 +nF5VhTY4qDbru/oKjZNBYmZHtAu5smLds9PHtzREKAz/7Rt+hZUOohnSBprEP4s15gQwEFTsQ/nJ +uRg5oiHIbCoWgcVQNC1sDxGNhgD9hesgdDIMt8l0zxC50CjnCQKZkCddqR5dIPRwx0TbTzqPpXxE +WWPML/AcFO10AltPXoxnoO9ekYpBPkEhOFTurizm3epi3WoQZjDvU8p06qkDI0akSMTSs3kfeumn +otLO2ANc6dKLXb6SM2ZzbcBR+qxxxETy4/pM5YX2mxU3ndX+W2BXmNYlEmt3acPjQbyOb8hyTpE8 +DipD5/VJ4ofeq9q2Y4MsWkLksHbk+Z9KXwjJ3GeZ71onWF3x2cZnxXZJcBp/P7/f34JjX5VrX9au +1fjVjqq7QIJz26yaP7C8KJXJa86cq68E2t9oTvnY2gxkCnhX5dIBj21rHh4QD+OSn23Ah2BUlCVh +gXpWnpEkp7Q5fcjux0919kSOOIQEuRTocN/7QDYkwT9x7MUtVqWJ1MS9dktdmgfL+eZfXXO68jvO +BMkgnrwdobFJmigW25sTow8DfmBXPvJYgoSi3zegdtJxMehSShu7LJC9slMX/n3ylXgXTd92N1BU +hRFJ8M4evVSmru2sfPAk7Yl7BEIzuaqbN7v5u5LWbPZ9zn5U35C+xTk2PbRHn4uzvJI/d2h+pkMT +4thQRc+JgUSwrZick8nevVM5g764HBTX21oov4dvYsPI/H/jlpTTrqrKTvqAx9pA9xz4eW1fLnql +UscKn56HsARKfSB0QQmmKDRppNfCQ+do0hBhLA6sVcwnKIaZI9JO0CBdexvICKQ+LjhgVx89tiIO +38zIeBuCEBzvF08+3LX+H1pjbDyGCaBOzJODfTe1yIl2vdD9Q32wW16rErRynnHEXZ9nH98fM4mX +jOi32kIWovPVSWQByzPjgJwCLy+82kb9MgLleEyJsCdU6dka3GQAV4kBfQKNr8YkvMFzNeo/dSCg +0EOBMh2SoUELCYiy79tQzttK5YTpYhRZuxIQb32dA68uy84M7WxiPLnEGJ9t4WmWFOAvN9WTTIge +RZ7R9kDh24ueI8k0tS40/MiMRXQjxVZFA9sLtpIdPMZYdYjn10mkOovXaA/v9Qt/64Xcxv042Vmv +8u2iJ04EvtNGf7TavrxeOCJRyUpv091gxjx0SG+yxxj4Vcr26EIPuX2+KZSOI7iObeZU+EGzzSuM +narVBO1/VZEuOmuuHoKCZJG1AwQxSMrPs7ICQYpR6pDSmiuErwRtj5DOY8g9JYXCS23t6BoSAles +eCoPNb5Ze6k2ynQP+ZErczMPoahvybY6k7PEOk/oWyMYA0yntIt9cffWz01jkCw6IVT+47wbqWLd +0wIw9Tj5tbH+DZuxTYZqv9QRy8DgqXGlwE5w+dBV869D/T6mfVI2tIiAY9p8PS+KGtoMbKawpRpw +B1FWXGQYRLML8c30WkYcz8bXoXMIJGb0oaAlYArdXdH2roJBit/HY4ODUFh0KfsIGtUhb5qgneqs +SqXaeHV96s1N9GTyEIRrVi895P01NaiBHK51gBqQEoFzDsB61bNU37wg3ooxLRVP8ZIi+/EOecR0 +R3XqCYf9EevlYvQt4ljyVH6WJwk5ANRfuhoipRUEOzLJwm7CU67Vkyj8Q3T4HHhP6OPLU4FaHEzZ +vxkfSsBF1mw0dPpcsy6MoXsZJQnRByYV5gH5kI9JGJlPaiN/aZKHSDaGVuPXEWeAAzz+V4PJtmZR +Ems0jZk2O3CwKV8JadRIemzeM4XLMMbBgo8i8Zy62XB5qf3zKJNbrBTkHfhn/4zZAcn6ijMyixp5 +URJ7y0Bh35zCesaeZ2zJUHDgM1FvnCFGAKUw+lCxiLMj/QY4e4f2xyRjfkM4fBUeJZpY7N5oW6Pf +L7v6u5vCliCz9wtQTVEqvcVWHk9nMK1ugwbnxYZNmsqG6W23sY4c+clv9mQcQ1vDcUJQd4InnWvD +kBKMhaSRFu9L7sKDDWWTzgA+4uEkhPgjcjXjvXtsboUx7LwELKZn3JD2aQbTq3hX2zDGEyjYdtgJ +0lMUVe2Rmd4Jli7Yla2ieW7qOEz4BJlJ1IEAd2kh3kOPDqQTJpAtHdp4BNglVY8Z3I5oKAyQGRlv +kQtVLF2VDo+7dv3aUWnMwvgdghTy3S2j9eWa4Nvde8laAkdCSonqFBYK3HijJFZAwH1c3EnZXVU+ +OYpAin2ABbg1Tisac19lBdVoUhIY55nSdxkaAwBDdcc9EimAWe5rSx3aU4VtP8ypIrDjNw3Vrs/F +qpVzzFQ63D51gRd8uXiNlC51LD5juT939PlgXy29NsEc3CNTj6ve9xj5OAm+sLcKZS2jj9BS5Baf +jfcRGT/uAjA+eZEaHXXONkeslUiowgSZ0H94QHS1DPBd7Bp1Z09PwwRu52g/b2xSsWAU69mNUb+g +Zb2oF1Qf7/eZ8IgKM34Wj8Y3JEcrtYsxZFEDnIcNRz5Oeced8rDSvvzEZi+mU8uI86725zkZ3NvQ +xV0JZrFJpQFw96sRaVTZA4dwiKVbqGaobZBu45VQs3zn7CO2YdABXPT63i0dpMlASv5scq/FTj4S +eEQCai5btFlRuOlRT5VRyJh548TSOE9cb/gJ+/LutBib4wDk2nbj+u1voPxuIEo1HBCC25YpdJ7h +DGjMofx+MKu4OARcEJn+zFLT8EuGXuBFIXYBkz6+dyefyrWbNtEZe7FAlsvbN7dov5T4mqVw8kdU +AzFmtS4Iwrn5IzgAKA8SC26MBtQVOeqvEg9KhzdFQ04Vo16MAQ0Nq8k2H5dDw5XtAASJQq/bEu/y +bvixRMZX7W31MdPJZ/0uXFNB/8aI13K7gqYiPrDiHWmqF+JK+3unBikWPPI49Qg1O0Nl5PNDN0SG +O7xf2ODnsD3xAjz2BzgfdRTS8jEsLAFeDxvEYYhODd9EO5goPESEPSUvYx8TqSf/NX9JmSicgriQ +Mx63dueQ7tdMPsixKasBOwXPRBZ1vYAQsElo51UhCLR1PUMd/yIlFMtPlrfaqZFKBnevtsCz6mK0 +QsgmF879E9qgGJFCsJtmZsVL76XgsMoG2D4mPiBwkOvdIv6HHWQJjlRnOH/uNh/crBhoi6joPxVp +xheuTDnPZnoHxYcRdHHVkSBdGO5mJ5s3AVcnS7T+5O9NE5bzglhTsgXwEgMmoVYjrfylPAPJRIIp +N4ouUyNRqEBjEVQrrCfouMtKVL3IjYiGGUD0x6jNDF/qlD1RNqG6tzd9hzEoGjTOGs5sZ7tFHBkZ +xg6iemPyPutIt8wF24gw9Dpe7gmRqdSXjZ7vS5t1rIXQyOZtyEusDI+ePjjsMaW3ydKhh3IxO7HL +SbBh+xhEsG6lIe2g0/Yy6PdMD0hI5yAWNvmRa0mb/9E8p5Js5MEnZ2jPPlL0FW1GbwrQf3YfWOMz +1ZCr6itUeMyLT260u3adXfNz38P5Zt51pjS9eefuGZMdiYN9C5LqI86NjmeYh302OSZCzNap47BV +sx7irbXMdr8xTSWotDSZz0AwwUMyYjXaxCH/9AQehzhh5XtWe0/cTEs6O7w8jsA7nhpvUyySSion +Ak5ImP2yVILfma7u+GBaUUdXUPQP93vAUOQvloBbkUQvJowdmiBU+R38O607m/98sP9hFINXMMg2 +PFJLQpHLG5Z0+RgE4KafUFRMk/qKkBVj+U78Pi7unfzFiCisI5GOkOgjiOIcxYtxcCRb35gJ6Ubj +LANjyRKeKSMtD3nzznXQKAzuMVj8Tgp+kTLiHXZ8/tsbgkwTGcRZx1/iXQLxPCOxR7fjtQDFlgOY +iXKhAUMkbr7dqcQZwBfHihLbKh0XveO2rRin/yY95EdrrP9FPAjreb/3m2Qv6qLqorT51OhPlTdq +Ew2F2+m0f3HG2tAgTxkbD6ps2L43unZ13pF2KEX3Vubv7JIl1exX5DdoltAx5HVwjrIq6KxJyo6e +tRlyXvAdOgqp6bMbYGFLPQG5iN2Tabq2CBcWTLRkLWs3EdLeno51OQKsvjBICH8E2zW4H3sLYHGR +mFcC3dQHRrr5eAoNWlFWEQO/6ctFdgy/QofQj1jAiJmQ/2hKXke84GV+64rn266QjR3Qp5cMzcny +/QFTlp4RsLjrU+5UiABmpVg10vXn+0UKRS8H13AWozh7e4YiqDdBweW8oTQcihjFYBbmPqD7jbrI +ab0KCg32z7tewlxi2Xn0NeatlbkUw3OSik10ma9vytFLrAMMfM9NfBCDDE6KirBioQW0KEtllCVj +J+7JV7l7E28rMj1iSE6FFP4HEUKIJ3EEct4sbZ/A40uUfhUAM9Qo8Kb8tJ2iYIIquGu/vrgK6+mV +mpEGqzA8psEyA7Zp2udsdugVdS6wha1bBwfT9m6l+xjWI8DDs9Fm8FN0GQOiewifZp6kNXLXnNey +WhnoYQGX7Q/AhB6aGFNsDjbPUNiD80Ks2lkfYw5/KFfQBPbKWHXVC7UFj3KCQQtD7WRUvqqAOFhf +QzBpPeZarqltt0jMF8zeVOVnY3Ks5yFC0dtdMFa+SApU5NCRhNECewYyAOarnrsP38qahAm6Dph1 +TGLUJEX3TVF96DsCfJhFo7Fn+XvNpKSap2rcxsnmQt7ECMK2Co/9oUPB4+iWH46IUoNAGx/Lki+L +6DjekXdtlMJO6zu+dQ+EagcNsKcdNlU55RW8LFt8rFe4isa9A+1bcuHGpUBn/WTqs94gA/wpMCdW +tedWV1JDwYRLDLxbbbGMvBU0urKXCOKiD1wFGc6duzJ+ddnIuFJsY1GLWg1yjBMuWzC12nk5SNQy +y7uMrsi6NdlKGb83b91/qWVeXdocKFhqtrKk5F6rZZjEEQlOAL91iBD73d2IQHMXKBTKh7rhOfM1 +2madIelyZrliPSV3C7g3KoXyR6GQcMJvNPH94US/Q8rmbU/6fEqS7NqzBF/H2Eyg+2/9DZZReg19 +r1icStnAeju6FDdh6RaI4pEN5Riv6dyuHX1bxvD4ZCQ+CRFRS0Yx21fXdgNWGgrMx92q3hcOIDDS +osMK6KdYtT3z2HV5gvbiyZu+Nt+0HO0fo7+WiFRGe+zgCgxGFIPBOhX29CjIK+jtspvKXyNWDPln +35zNFGRnOrCNacPnLtrucdiiF55dQuZ35uagIkFa72PmiP0Sepo0QJzxhtDyyDCVYp2cFdLhqMMx +oRi0v0+MrgDqV3bvOPL1APvFHunMkh/T9sZUbuv7bYU7bkNpLOGo/4ic2G1XvyV1ZrI5pfSo9E3S +PNFhWsE/fB8OS33+EjhYFADrY8dgdGmGrPy+Xz/LxxXZ+ypHhfNZoFTLgLUSL3x3Tqe6nn80UiI0 +xVIhoEJB22Laqt8Uz/B9ZXuEcmUX2arkzhrvxhF3i23KVk7dQb24Zj9U80dRW+rxwL9+iuOZ7iMV +BG+Qu+aaZ0C45owkMLZIHq8BHkkqUqYncpyC4WVVROOmgXmFagyY11CWww9KVnwAIRcsujzi8Ag4 +SfkGelVqqWAVs+OL1riw5ku8A/k7YNy0oHzgc/E1YI+Fdc0nS8yEH8U98toiKunzw1kfq+Dk6TDI +rF4GR6CH1fiIvxKwBiceTxrISmfNmFLWZDWmJKLGiSJ/y0SdxvcFUPkByGUaiTE7ojQ3Cqm7yeeA +MezLFiKXYa6DJSAPp3iY7if0hUdQfGapOrF5DaaR1naVhRWGZMCpUbgMY+rKY1zWC1Q59TZtW1Sp +Xx0WpcR7lwvc6Rob9Bq1D56cOHd1h9D1QqE1n/S7VVsBN/u1S1nJPFwxpLeykEJlwm6hxrgu0lQY +IWtX1Bd1byqe3rvWrgiTn+O5XeCygmcml7BKxHEugu9dHITXblXjCOpcvfKFJlkLhCtRosn1ntNu +K0n9yfmK5Z8qs8WrJo0H+5mMe4lbbYxTbUUlJyRhXgfstx5jo7M1fZUIhfrVhjTAIv+mK5zrVWGO +27WItgVa90FsU40TVQ0w3syB5Lw0yaMR9sDzO3LXC4L3bfAfXPHgJuDyWLWJjGM9Nx0dfM96I4wr +FGFAVu7ayC6HRf9gwYtmZ5+WQlMRqwBx3+14HIrGKJSxq8Adb5oNkVE5SD3zUhv/uKM9DULzHfW9 +exNh//rieutOpi5KyN2+EIoy3eu3WH0WCiXojbztvtdTbKl8p3c68nG7aH2mqKE85D6jZElBJRMG +a+LiNhIOyEvYXVk1l9DC2L2DSiRpFQwtBAlfT0kcgHaB0y2S0y8OKgRWobqXOoLcjZsNdQS3+728 +jXTShAa2s2YcXqux+NHw4VBLP7S7s1XSuA9DgVhVcPeBa2JdV2rKk4Gn2glmilMtcgfnRRaEOL37 +sIpS74OYTzVNDeHv9qUDCGuM1IMj+9+rm0nXdIyRbH95s8goOO0F5gZVzRKCyFEQ9xmRg72jvJSc +oJ04NrG8r0/LQblGaHxlYr/OE/uwKjiqkrfWnsEPDmsewRQGnPGWdAb4UYxdWOGO8dijvvLNVeeD +jhwEWLXchOH1rmeW8tqyzYGokc/FLdHh43wiCFzt2htIck7Sjv7V8qan48U32DQiji9ZmJW6MPaH +627thiN80a7j8iRBKV7l3Jg+TonwGtzdgvPhAPrHjBjXd9TKABtV+dJdji6lfkY1pm9ds5+mT0MH +sLmU/kfq6Ks9oD8YL7QBUEJwsEcvPeQwQqveix3VmJt4A7RB0l50B/xJ4nInibXiajc8o0xHtwP+ +8R973fD0nApqTvrDOBi19+6NNHHcGXcD5YkWDbRsaRgHAE0XdxtPGNxpuOPyYWWyvh73Zoq8C8RT +kbvk7NWlVqLa599SX5sAnU7HX4G0oGBoxh53Co4cSvZ9sm3goUycE6Lo7dbad2VB0Aso0//2dE47 +rSmxqg8npftwzeQpShF0OPLUZ6ONCwRGZ2pNWtpqLS/zMtdq7IB71B1HAUDOJNSZxNU0sXg2maAh +6ZFpZIb//OUErvufws4v9VwjSZjL5qno5FJEyJKc66XIzhA36317yXA2NYUaqfHQbQDXfpsCawPJ +ny+cgMgXrAwsVZ6/RLm0MXYueXZ5eYEtKGYMVnaBwEiQVzq4LbGiclyvn6EwFrALNkWBHP7dCE/F +kOBB+kz9s6q6XeL3mUuInFHd/yjYZedqHCZe6qu18eolRgDDLwQSvORuDZUMnPWky08qF4I1CLNj +fzzGZCNvdK9+m9RVJNaDWnQ3Dbg4U0V98sMpTQO51hDUNjXG68Ae6WKf2m55raY29RoSq1voyHb/ +VH9/e3QbwnVfJKeYEecHlQ+zYMcIxUMnJLWdzxpUDaPh5+szS79VwY4OdXQXH55M2CsZbZsoL6+k +ifyxEEwy3nUyT0nCkVK/pmkZsbGYToPLPe6gHEVC+/4NlG70qjcJ8s8TSQHlu2Ka4XRY5zRr5Efq +ILxX7t3jzHXC8/6eFCrxQgoFL+RDZXCUXC4IdgoBnNjnA1FM4WP3x5UIDRkP0iaFFUFUpzgVr/de +ngi/IeOT3qzJpg6WqMxpUr4ehMncGXcj45hjzkW1HIx0LEWWpNJJ98HgozZ6Yn2ANGMx1cUBeCH2 +t4fkanfHD8b5yEcgaUEEf620mYGFynsMnqN2dGADodu960v62WZqf6SEVYXFpnMjuSrWI1Rp2Nlo +ls1VQ7BkNtSaavB4yFZzcP6q17qGNl0kkQRRhqUyKKJRsjTvJWh2BdAmAHwwSzIihoiCq4VodyWy +xXGpdQDp6SgfXmdBPgLOe2vBNPvTp09VdLe//M6We4Q+fe9XQEbibVLTnfn3U/zmEjONYRGnli4R +XJ5bU3zuja986Oh8lxGPgTGZnzJqTBcnRvmiRu7eb1/2J9XBnmS3VaCu+5BlVEre4VDSJrr/RLnU +r3UPIHDXbqfwu1n11sOYs4jVezqpxrHTOQWW3yPFWLac3A4YfoW7RNlIQfPqgkfRP/egyUgI/YL9 +hG5E8pg+WfQOQrdEX9yb1KAFjqd4iwyNHrgaINbLlaUidEXP3EgEHmb2gZRYTwYklV8Vudei1+nC +6tJ36M4bBt7kvxGgpaBAk/eFXL186aPoCw/4BCl3ENg9aHfEK5SOWvkSyVa401rWfpbb9TZxTnjR +jnxHrVumUxM6NfiLjwaV3ckjPgriJPqfIT7ltOLlZZsUZpSwa39+RTxtNe8vVgRP97RYNK2uIeS7 +72Znl0wAxU2+LTFusTIOLKE4Wo0oZTsVxG7/8RFKb5ubwZtYQjgloqZZ/ae4MlxtFXWrMM4eXSjd +3pkMrfVnl7Q/00z8nYete8nEeu05rhx6q7mSeWONsd0Hyf1qaev9aOzTJLNVloQLc0h0bR0EU9/8 +29emAie0I8lCm10Pya2iW6kgHh/Qpi+r5tqd8W/IrNuDGtVN50BKNiNNU3dbTPFxaFbMZgIsUxVb +BUv/CVguTaDSFE1kWVb6SnBdyVyU9wTlQfvGeZ+RKxZIL+ykqvszT97WfaknDzpnjPKyTukGqQ0N +XY14i3F9zWGsEJCLHQ1mJkat4T8owKiB3jQxPfAbE8FrwfCS80DBm9u3zM/qTCS3NjFyVLqvOUeV +aYZHMo3oFHuCGT4ylhsXC7Z8d99gFBH51MDPbrg8cyAOvavys8JJlRKIW0Su9z+XQEEOF9gPzYa7 +Fg9tWLsPnl5N6iejqtW1pBQJl8y23h5fIXPeb+lqerf9fFqmvP9ZL9ykH9NruMK2y7a5LnFye1q/ +NeX3XJAoQoAU8SR61jdjC26PRGqxtrH5S43iHOEkvyO0q1ugkVMLzKQhl8evRVT8MAxMmxOekfmE +N0JBmQ+F6K0uPyHHWA2pBOdrd4KfsFQuUqS0ItP6YFdSp8K80W66ER6l0k2AAPDUWAmILA48XQBF +n8bGyRS94YUA2gScbPLb6sUiWXLAqq0ZtuMKc0TcVH3DuxZl0PVpLfgumfSD+pvH+i7JEjYvZ4Fg ++gZYF1NJ956rVjXMofSYREs9k4pu2vaolhVXKiZdLdYjyYjjHrxUq20JMqa1/DtQdlJUuc8RcC4Y +Io16LoPJNiTDghB6jFc1x97xVpPoKi7dU/W81dZ5kW6Lu2JQ0wgEFXwpS7Oj5hF9P+IT47QlSlEH +Fm1fmGdUDyDDsGYNBN+GmBKuIGUXNWh4QD9znhIHYtvDFaTC30VkRDRGbmLfLJMT9CyrDRkIvYfk +g7dFOiXBX43thDI4HTi5eoT7V7p1V9XBlaNEqsKJUqlJ+Pf0O21cfCuVJoLU1G/T1NJX/JhghDvz +e8EHPHN9Xsx/a+B6MlZ0j04m/mZrd+t9fgkdfg5qo2zVd6Rq0oW6XgLjyJ17FQMq54fAxdxQXvFv +21ogP3Qt/iVc4uP0fR+o8Q47lk/Ois1fmQGMoQTWRACFP5v+n+BJpTu8fNAjhWabzpZ0+nGV3y5W +7qapVZCAltnSyFYMJU7jy5LpyZ3qeZ9asPw8ZxyHgeMGAPd0idwZEEKVpTozNTIgkgawT0uZSc5y +T8prRrOf2sPgmDtAqleoOC7zS+6J2wtmlINyLVvYBd5rpRRhabOTbak2XcdD7lGhdTyZd9yEDRFi +IsUdDIs9JcDpolQFXp3tGKhHIxpAPAaK30+f0Uwl6hgSG9RtmQ/l4lQoB/ejUdSg3KMO3Z47Bvur +oAVT7tiX8fc+JFiM8y4zx2MQPm2IZlF+oqqJQRRCqv5/OTjIXWvL8d/QpsmdfssG6/MTX/v59wnt +2vt+4yPqA32EpqfL8L8j1tuYYdOqjtNmIbrKrwqStc6HYPmbGxRI8IdH1IYsGFz6WZju1FqS+A32 +QthuS+kl6P0t3JBgXHkO/17hIOPYY3lhRjt7mEFuUq2IgSbrc549c90zqjB2KZJah59sbRGDJ4ze +9z0IgY0ATc6uyUFsWIR/CvV6M4+hq3TsjZjsArosLHv+L6WTS8o9E2DSicY2u68lNmTAaNRzjQAl +GM2T1XTCNJWzorTWx/x6gDasNnLCDws2Iwmf/oridyjS1+6RdZGHHVoEY1p443L0aCOKVuNrk0YM +vE710xAqI3w5CjB/ZojqibQywheHVshZ6eMHYlgGspoXQQ27y/8Uzg4JfRJ6w9wd1ZS0LIJyjAFj +vMRXXqFGggNWPFfk+tBQhzSs/OMZpBS3HmNcnXIlv+cFuIEHhjP4inUFBoQSlF+HPa12VX536PtZ +yBf6KCRkRO07XUbAgWCj7gQJ9UyBxKNNh7z2OacdoACvS+1QnP89qd+Yx2XoXi0HLZTJV38c4nRy +BhDEEwwhLW7Z62Qw3hh0w9IodorfT1xD9buTFbVsWE6TYT+pC9tS6Chs5K2zfnN6TysL6xCj1L57 +ELjgAs9do/M7gWVjB9p2Po0Inl+r8IL1Fqb8NzeAq4x6oYg7jP9HZrQLAVgSSVoNEs1jGnCfo/Nc +NoOApH2OQCaUIFlZbvvOFgR7hbeIbYjqP4w/Rmr5OyvIJ8SGAs9Nl6MainPf2zre3QXqrHGoaYUx +gKLnANtgfWHAmd3jkH5zKRsKjlbR5uSFJgZVWU2h9Yn+k/FwboXZepa5DI7EdB69aGq2ZnlrC/Ts +0iLHa2soksqt+b6I4CMpk4c95khAYI/wfS6b10fp294YbpdPdjJMW4izTiI28B8cmTQ3LNOezDg9 +kpFygvbFKLCW5BK/fqJhu8rM/RrPoDTp8kj1Y9/I4jquyZ4oFxEsufce3jEKew+1X8w1YqDdIc4u +Vy5IIfVss/6D500Ay91gx7SI4nOWVFqYJ1ddS+qQ4wB2tUqhp83on3nTTnY3BhEiBOYIVaay2l5z +yJd25cqJQlvEPIagQUzDF/sOfVtlr3NeCAJ/kzr6tSyy0P5cuoxFQl1s+sXENGc/W2/ViFubNVti +e4aEd5yzJ0pcpuVvi/8a+U/Sa5H7zhfJ/eyLsW9xNyDHVeenKKuJ+9O3jy8MD3Vqfn3yx8XLiOgG ++uCXylCaXnjDrbYzEmWk2Ei65ueJMT0e2PSffwLx31kUEzGWi1pd0XhcwoZjkX6j9cPkOBb+gJF2 +eDJLakVUvos5E94gykRoq8v/mwBawI5ccNFW0cRODPvANkX+eNFSytKIiUzLVzKVXtvZlSXN4WxV +c1hVY0H7dN6pysYJVBxFh9EI+aW1JuG4GA6P23varj+T5AbxQgB7xyRrGDw39GHvNBo2Atw3WCif +1PIfzWEk7xxw4RUcpOn5DOPeZpczFrPWVsA+BTD3ZySOaV7dgSg/RAxbgw9Tek7WNb0q0pKFPEKI +3X5QEftoFLzfcwp2ayTw/Ue7wh0rHmaI3ktnPAuVrJFz/OiFl5iCXmW3c9Ia8ZR5NzisKpWPUueq +0XUw0lubUDhQMGT1fR/5bme8tQMQ90CvaEk5MaV+GMjsfMk4FGfHI8riJXtsNf6Eql87afOMuOWL +qH2gtkbNxLcS+yalSp8n8Pm5CtC/Y83rvUXFkaMttjzXlUV6nUPZGyjd91aqgs/iAiGSg6CZh+VV ++Yq5PEFCK8ZrwCdxMpXjkIDORKdCvC3or+1uR8k83unGjUaKLLp2KBQug1wIBeNXdO7wjXfPDnfr +8Kul72oJd9ngW4Jh5iONZn4EeoSCGjG+ghR7wEVDlLD49vt8CZvyxrahzRAsIkBj9dRB5p8KrMYF +5GYiKclRPLQka09HugUsqRcU2+FqjbvM4UxbyJ5Duk88WqSYGmr3BtAzWJbQf8UkXHG3Lb+Ctv9/ +Wicr90XnPhFnO+CwWebQMCJ0iia1A1ADd8CBXlBV85HM3A5eO+NzQK73pb7fWzaHu2fGote7t/V1 +Epd8hhQxKjp49WqsS0Yz6Sx3X+kkLgteGUC8+3zOKa6O8cYq23FIe6z4bk+9jIH8J9APphsaoyk4 +uHyn/SeRYnRRETKje8oFhBNLtYByBxnN14yO2Dld5okJSd2GPHN+P6Out/FtuzDtDv3nNmEoNz0i +BMBjrEozleg76eT/DlhcYLc4ejsVcy7wyZiQvLSbwy4klL7aQr/B/AVxgFX/j0tcnQMGA5Qa+DcR +CtLuE9IbXYlU1zVc4m+q761eiJVpGrRkV5iQGT/gcWofwyq6r3ONespHiVG+i9bhqUActyqLtjVx +tfT+dIXd6xSr4jQYpDnwN6st6v6ZLhPgfJsr9t0ZQUR+9SjQugomAdyZyaPjwKJ29+qd4m7l5bGJ +s26NmSjJf1Hs9FZT+MwR39e3U1gp4d3wYHNw7NN3/YDONkyobIzPCYYZGB1JWtR/U7I3z3c5ZacN +suEtPN+swPhKe2/wk9H4rbsJb/f3nGDLOcw4HxhBhq8X511KyMKYh1sDqtbpmSOzp8DoQ3KN5G3i +tCmLQWcVk5Ok+uqdB2TznKLi6uHTXjznN7vP2oGIErOZpRjnL2gmzpjLDVai7B0T3m+vs2qHU0Rd +HOIpiBPgJW81ySUrg41egHHTCCIwGORonqqmjKCz8syvhUN1YcUugzJPKkIATQQyCFuix74EMAaD +DXQ0Jc7NKHw5C/+x2bxNrzS/NzZ0RGLSLryUZdlJp2H84kjbtnXaylMLEprKYuIVYB+SqnaeOqY2 +PhvoN3Ky385Lob6NODNb7spWI/1LlqlzoZtmOVfXYzvW6GCX36m2nibbBZh56HLrwAQjqx/FPHux +QR+sQELytNkMUIvqkIDkEvKZoTH2PYnDpgxkA46xigqDf16npHWLnlplH8I3gUlAPRraFAOJcsUx +WXOJQBtxd/nSVFTFh8FAk7h66xFCyhSpeHsJS975Jb35u8hrEBTHtrP3eRzexCzHZDoNcBUwzFUa +/AHju2UCWygBEFjV6q20vT7BwBuwhYYgGP9KiuGUg2MRLQgkC+Ab8k1qXl6qMvvnsJMXvI4xYa0M ++vsX6GbkDfd7b2jFSqEEDvREWAe2CT1hg1HI7VGyToVRycbs8RpInuWxIHGucEOVd1VTTZ2bMyfp +54YM66ekJgioyWrBhzg/tO0xE+jA0mIVYnPRww8qduLf044LabW/JbwCzlZL4rW9ppB/zb5Yq4GJ +JmVGlw6PIuZxb8Z/PddU2QWpWjueukUvy3uaaN1NNei7QwUcy+2JZBswZzCQfLKgGs2iIscFk/Du +9o4pBdnbQDTBxsnW1ZN2oK9Zvuwxy2/pwetUI+MQYY/Opci6jhdpRBumXQzTgmuGCSY+YeEEQO1e +q400ti7HclSUT1XFcfFKnc12ZH9L+qHCwM+XncnHJbwPlMsKzXoaSG8P39bI4kHhDwqYi1rrG9Fi +rXi5xBmC2Fvydyjsg9TxYzFTs4eISeidhz8LHhLq+KzUPriYcUJBQhVBUGSu7nX3YgOb41Fccon4 +62ccgJDnImYr6iTl86C9lyVcqSDrDpozlTyRciHSkgn/bwnNF9T1J98c0WBr1iIq4swWrTgDSUah +JExfqztKO53hDoY9BgJEKz3oBBOg3KNm4yxl/RidVEekqcHE3PmyuEfiZcONdP4Tvh7HVYzQaUsT +T4X8ozVLsPQzY4L3spUa9WfYcYV/4l9CFx1weH2HOOUoztqVt9XVCLUeEDu0mFcDUVB8RDtWCzlj +3+wikYFR8ATdGS7FEp9KLYqDOATiJX77o45Qp93Xme3KlPdk7TcIypbTpVVHc60HO1vEVvYQn9Ww +ZhsAKk5hlAEhVmK2U+k4RuA+aK8xQzItqWcqR8cOequF9hslvJ45C1TvHxvvgg4Bb30xuG8V13Dh +Pns6eu+1WL5aIWEOO8vqiEZkBG3rBYJ5A8UtpkxaGg4IfDVlgmX18BkdrZUSMEWTUsUyR+yTFITS +xmkgyoPFH9NCNfiMaxT3tRKlqqsBCVoJhheBsQeoX4tWwKOLVukKGiPukkyDzJuJ4k5b49bifGSw +UFgJGYfQ9/uPmrzbz92hj1dFEW+RUHnWKRbhhDT9fmGURGruxnpjYTGwRwgulV6+KbJwTverSeqt +YxcKquqT/dmgkQNwSD51/kJzGOlnPN+M7IW+jL4+SHZUKtdGVwEkVQ5SumwgTNYGpY1NIKqZQstq +M+OJxiGb6qOakGAHq99i5yR+IHAHaA/HDdHmTqmmi1gXGbohdJL2QuQqJPEBRTpXK+1i48DbnJbh +15oTHQWnTFKUROIjKTwekVRI2m+5T2mXaSyFK3XRpfzQIxntz0vpy5vLBO2CweMsoiTEYAUx1uTo +jdhKHDBKfmfmq9UnSmmukyeUzWcIYLbFrhmRylOf5WAeI1BdZt/yED7HuiGWTMxyzVSm0h63ALYp +3rcqlkL5zW9CQ/qyBsefa6xy+ywl4M3Z8Co20qFuP1ouzdrRO0xrM3POtW1yrjnwSq9nOyGoiisE +y8aiNE+FaBhhtcsE9wJolbhVKdP/8LrP40N09kZKmU9oP218x5CwZ2MBXJxdLhTpvX0qVYMtrk8E +8A2HXL/hcFgcw/8OVHt3YvXDnGbyAM0O3xjWqkAHsG2kPDI3mZu4cNgdRiYKnrBXtfC17kF1IGlA +TxiuZZmgkNth5RBcUbfFcwQ6tk7z1I25DxXfjpdzjctDXx1jST69VpiR4Qpa3EY60UK91ajuEZIc +FQirj4mr6bqzgRwWVC3IrxFve6+aHwugrqKn2BRhZ7f525rAU7imFL3BWpcbjE40BnBo+3kVQ0k0 +P8FiWZv7mEIFG4VfKqI2fJxdg3Yd/KnRYfrw9x+uNdt/CyOO4CqEltEeg3o3TfvjV+8l7kLbiJyF +9LlezJhdkA5BaAitPdXtSF643skRpKuMi+RS0ueTyNYWOIwLago0ccaVmAV52PAFUQ+HOHgqTXzC +idePInN4sLcQbUUaXl7rGTZ4Jmtp29V1JP0lVzOpzaSh/ciaFOwNkgO+kGKCQVUmfLi5RVGbrQ7+ +ctfNZaoJteyJmbmHGt7hqg63Q7+QL0Rh7JOLFZQr+zQ4ogYX+HJoHvkYLxlP+Gw7x2mgQiSJeAec +16yiT+OQIiwFptWnUpGiXrPJsSOswLV3SVDUPtWruSES9u0Wxcko6BzmBbluENekvKbdwxCbLK/N +GjAIab0LA67Hv1SRpPh7IPmsXntQz4TxAC3U4fsKiz/UWf6/2uvhnXzDbXL3LG97W5SiPgI9as5s +RoAPLcLA1RlPIgcbgOQ5x+IpvoWlQAkWm6tw9LcB9DEYXTmWW4WxLYYJIsHyBg+GNzQ7YvDq1Drk +FSl6TgwXRWaWxvbzNSuhIIAsYVy+OfgDR4R/frTMKSi/GxSoP4uLQypfOz5xTkfYgQOLjZB9pgLq ++Q5qpv2zcoXDKfeMseBmvdeXR1IWBm8xYk8C+aUQ9nii5Urt6ibTYc8gesPeW1g+VTmhKnzTIPTw +1PgrGCn51tt53qtA77rICJn11b341Oni1M00XeZly7oq1vVWg7uLk69i/ib9mHOS3yvThKAEr+19 +pXRZDzQoJ5Y+lGgTVExICJBcH5zrLh2GZ0td8OAKLsnJofcfXvrx4zbpTclpgViLFXQVBXIVTCPA +QvMHhHdYXR3W1T+qow+LKMsgUthbhULp1qNCsrlokCIp6T0ntkO3nRdnjlxhMiD4KHNUlkvTg2FO +vqC3+svH8eInPwFquEPBWVJXQicUhufAWcGaOr3y8uqWP9hchmCDz+4zVKezTw7yGEquNPf/AFcg +vOhxIB6jnMx2EBTzth1jM5+2ghZctjwTQWnA9uhIx5f4nZafeerGxmp75v+GvTKRvswkRIZ1AB9j +K++5FOVx+iODsJxu8VWCLv9mYN/QpameG6nnuCxz0LVBquawHhSSrVvHWRQBEECiSJBpSBEHJ3pG +YR9fEZxokSezW0dUlzGHYlmXbnj1Qfs1ajQB+sAWr3R+Cm9yuOlKh+2J96G5R56yaF0OeqlaPVF7 +UkLDT50yj7zr1O1/zSg4efoKAPEkeBmaKfk1WP4RzsILHONmY46R4zVCdBh5GvwRV2iTVtDMPt6L +Bq6ROv4KbYsw2idR3y04FbCXAwH0lo0EZAJPLHmri9ulCNrR5MAo/LTTw+JK4c2h5sT3wNFpLTjY +YB/SLkI1UCqtkuoAZW3t/3Dt88YwhgCKAlwMXkjVDfZ4Lq0OitjCmRHTYU2G1uAKVaDm6JQ1Zmyo +94UkqljZGlocNI8cnQnH008hp7fuUMeO6Ij++Xclxvtg+q/E7ttj2AokU3aqONtyG5W7yGWR6+hl +cTP+rd59tSd1hkTmcE0vrcr3KIwSNAdL12RVgN1i82PccNVJFu5kagoQoUyJnmgVnQDemswylivf +ZgoCgyvz9B1QMTHtJurtWjtk7BcHAlrKkw8XTMw2arpswKjSvUMFk+sUNokWGCt9ajxefyBtBFRC +WoVk1JlLTxEaSl8b9DmCu7rGrSmthUv/dwd34lhTOyafacv4SVVRCNvIF22K33F9fjQkVZcaIy4k +vMSN7maWUZsGcp91oJI5wPaM/ja2O3CVJ9ImHtwQPcULXiTKsmEM9Vdjyuc5XZPkYU7wlPS029EW +twNWo6uGGzRcCOuD3ZI3GNVOYpNUNkGkDJuWiQm8N5k9U1PbwbuNRXPTfG2PkO+Msp3FDFBoO7ci +ZmbVnwNtQlRhFfX5uFta4c2VLn9PHrEXMoPsOBsb8wx7MREyHkHory+I3D7BbDaoDv2ELHQLtLEu +KJEdSQ+WezZbMHfNNcGnrfjo2leWST/CcwmCl0x9emZ6B2Oj/XZ++bwfUpIu9HkrQaotNPa1eT1n +n75Sx+npAF/Skl/V9+DZCOfVT8y5piJz0pVhOrQaMUtbcPhSKDigp8+pB9h1EgX+/c/Q8eFlCYWm +9I2S3yn74iVT9In3lj6BOThkHLfZQF5isIih9UoYy4Omlk+/VLtFLSkUC78EBNCzU75OQUto+V/m +e/IKw3FdVBbBTsoNYM+2HTjQbXHL7HLSJWOWDblWJ2eW2PazrKRUyf6AVuzJYq3pMKS2aEady01l +BZwAV74nCMMrsmZJM5Uk/TYYXwMW1KPzsA3UpY+HTGDk/KTHe6oGeZxDjEmYJRFc+9YfMYzQk7gu +IbvSCCCVdUEUWBoiiIZOLStQzNn/PikrsxymwBNXUQoLFS8zad7fHmMx8MJ9nG/3Ql3kNhT57hGp +74bmCShUPctCOcnxZg+ixZ4WCBKPUB6YfE1IZ8YAmDRtRk+fPZeK3dkGF1W5tOBnIse7EAObA1YK +LypMnqsYb8aJN0jZB74/oM24AT2i7axY7CfponBteZukX1NvvpBr/Nh1EaimPnjHEyBHCYscjs7f +115AhsjUhPlHjTF/ytpVs9+mrexNB1XlleQyOZNWdkCRyVDIQ4eUpBTbDr/bS9tZmebDX2oC1fBs +o1w9ifGuyK6d3kuTEVIqC3pTW2fM2OPSi34MtJE/NEUH4rK5Dw2OwKWN1SoB+2NQa3pyuukfoMi7 +fFiy2/zasmPPWN8c2Ru+47orLtwwd+S9URneL+2YseZqN+cEWRddeA+1c/1l4y1aJBckjiTDQ1o3 +cnJg8wqSnGYjU8Ma5qcHLCYacFa1oTQlZcFHRqKV4nxc6sb8Yvm8LCWdh0i40354+gMAbybHvIua +fE4/COgpWg/8OtvheuCmZ/uT6rAORLC12+sr8LqPmBKNwsRZ9k0oTg6SXFKRyZQ59qq/tiiYWz/o +kgHyLPf6iw3cdnjSMBlO5GG5VmZ467/3gBG06J7tpb3bc5XIb+w8k/iE/abVokTkjdylWjube09N +3luJkhfGP668Y0MmQmXI+0woRPbMLjbJuNwogT+H26Qsdkc0IO5FeQaPzUsZbhqStfjQvt3r761m +FAittbMiJGms+uH1qVN+MyJEWrvu0/4Db0Qh1DZK9chH41DIj/G6cklvL6HapAMxc9wOseS8UAfC +W72RrjZr/dWaI2Xqx24mNwKQWyitivM4eIzFA8BKRo6wPbWNwI2wv47/1j3Lk9AP6A0X5Fwcku4h ++S5TURqZlwPhwM8BbA3h1UH9Uv8vojGtZR+it7X/nh/qGsNFA7ho5m4eNEk5BiFQ8oj7NPcSmCeb +W5qw4hb4AoXxWAz2Q/XU/U/F4kqwii82Mo5BnSBfKqQXklrVelCfrnGI7AkFEeuD5/2iwFSqrGP0 +inkgzFWvqJr/46Laa0JBWEe9gozMdWUQBcgBkeJsxMXb3FEEjuymsDbTuUg3hdboy8QvIGXAluhk +m7wX7cY+ejTerMDnNXcwHhQxiBPgN3OBx5rxqNPpA+vR00YUD0VNoNftFjCJ1ek0I5+yUY01gMRo +h+qH1kAbOZs0NuDLTIjsRDSbqg2HVgkWEk1ldHxRQ61nz+HxSNR5p1dBroPdc793Gw2V3LezMFrX +7pXVj4Sd4Xug1wUDgGyF6FodC2/5gfU0CTsbn9aQNusRkTHa99aBzE00sOLfrn+PwELwz0oxbOpR +KeNe9NEW1D6nZpOUpLo89WYD64bAvjd+7GVdDyldpxcsqGUEq7C2Dt//ZbatML7EloCAu3gvvHmy +tfGqSxyu5XUbg2qc7XoAbHwi+1RbQGpG5lub0GanSD5t8ByxyApJWW1mk7L7mYIUjA5lgNUVKrNW +YG10VqUPuWMQbrffM187q7FpHWX+A7HP1Gpk8sokpix8dutKL7WbMmzScbvozNmgEAsXl0TM2Il8 +9p3YNRhuIcpgHHJGD8redp5IS262Cw1F2fXcBVe5QNDjDldrmlPPTwjZYBdri3mcORb6XjcsdyP4 +rzS0jwcpkxUr8dIYEu5cXxyrSubsN+lLxS3sxwJ3Zsvcz/38deX3nO6s7EM3yl/4JQQkol83rVRH +n7Rlnr2BN9nRO/4L4Ue1HMEBu+DXIQFnayDsBDty0nU2c+yiT+IDp5e/Tv0gJG7yYVcJXp3DCxWf +GPkopcomxx1GVdrzevTdEGQ2UYkpQDNmOU+pCKhdmtLsP+g35rc0EeqJdXXSrnpBxpJs08kefP8h +FS5g4uYX3zlUEa6qv6gN2FCdGOtRiPZVibwEnyLVsIpSY2pyJ2ivIA5d+TMFZBAusfrVI6XQOvZn +RXoLwMu3rOkiZfxT0S1YwdaShf9JLwGK6N9XxRhBN8oMgIId3cqv+HfYqH2Mm9Aexw6tSGrBSZbB +MbtLkuhGWI/MnqMbRzRfZ8YOaLLmPLsAE8iOQOSFUH+69EOtYy7KwItA1fndg73BpBR+optA3V7i +uLac0uEV622cRbMNEFlP6ysWQQIjGIn4Kct/MlpnhEpJ1taTpV8N8aun+CRgfw3nQnKnKGkgrvEh +58tz/sdYbvdBPbgrBEXrptn28JVUyubPpx7b5t+c+VD7DBuY3SL0dJKLKkiERLAzFEHyadkTgRB+ +5pmcjcYDdkP9fncyjHh5sdi64+tlQxN8oibSIeEQ7UCTE5/RE4uMglCkp2jnrQjuJUj4d7wKjuyL +qHfdiRUHWCfg2+kvNkA5CXiXnGZim9XSJvqEYS810ZGr4KgVfY+cpyZvuXhsVOo1s/2BO+KM3dJ8 +o5z6VjfCAt/0ze2bmGBzPXDv5RxmLx3IYRc3+9prmibWtwbqSgJK4+H9gVEFkY8inmR2VixLZw9I +hx0uUFB1GNvTxlbDdNYlXHU0gdPewaMxALgzWvL+5UlunPPKo1xSZ81QlGlr4PNxG74OATBesFog +gClFDeezaf70M2cIvqPaU4W475RJVmc7H4Vowl/ZxMJ5HOaGYjiHfYoO5s9k5btPZuYfuaAdl40f +2GPk+BUi84XAgpv2jWxG0uhYSjoCdmT+oQX19YzFM9KvnKQpeW70AQSGbnJEIgMQStcY2ZSTv6Mb +KkHxhQ33oaBHtrinT9WdWFAeWJJlSDjvCV4A+xvyDDfpuY3doFzFgVypKbN1HHzBJmnTtuCskL3P +PaXvKnQsGxEQVq7BVE8oXWwMJxtAgFORjrXyEHhEr3Xw2NxoujZLpTDpglyF0aU8nU6m8D9idWLy +1Ck5UFoVWJC7spxiHUZsQTfQQCLov9S5Tfyzwse397L4jK2aKKCxqZT6EJOxs2Yyu0N9EWSyLcZ8 +y5BdPkEgZy1DctCVgkwLt2iS4ln3HhlZkE2VBNccp4Nh4r4dr6my+H10D5o5grxRoGqhLosUCkz4 +3d7hRxzT+68EHKsxK9M3YZDpWsvdZcdU4RgyZ6roD9ELEDL0A7BlFsSULIZ0d3/78tbu3+K1F5ng +9yjMOl4DFxEIceuMsaal9uLYGcCkqZnGb8gqxYi7FFlgfRbmsKNWmOUgnYG8ID+k95Sq+rGyKbk3 +Tid912T3eBzlzq9rg80diDhmQZijlwzifGmexzrodKlyorkV5Xbv3F+9EJdQgtSu2kR1EvS0PJo0 +r/QyjGzzR9TPKCQSdYy1DScdt1fdNsUJeNj7olpoJC599/LHtHHE7JqCGl8qkndRzgw/HuaLMG5b +PNrgJluQlvwQ8raNR3nZ3bs91WrYRZPxEiq3iZzbxU/ab7vFO7t2u4wkPjbzcJCzFXh4Va8jI0yY +qMKNhVzxhzLxxAtk71YeHasnMdhWAZhydahonegS01XJdnm0/BTi6aWXqqd/2om2IxE+VZnYy3cs +2UIx169ajt0XIvDNh1kk84Zwe6ZLki2K86FJ+6bKJJbrTjpPWV4e1mlA8XUsFXnhvpQtv8gh3xDY +pFyoyOjtOmEml+E+atvGEMY3ahTFg17C2ovslL4nRBgqzyxU8LhUCvQETviMIhFs6U0mRtrPBWdL +e+Vadt4pqA2gg8bX4US8tfysGq74WKUVwUBtKZ2PxaqjToL3MC68waCUevyO6ngWr3QOXxnGyLFk +9FQIgKGf67MZRST/euoPJrOenwwmDl6u7CPRKvYb/sblY36lNC1p35mxtlXPms8QgRPWfT4pHanC +1p/2+OsZSufetbEvyvfseXtqN7a/wsYZqOQGYkV3bwxo1rrYQGzDphX5ogZxN94vN8890HcUvVll +FuOZr7ZPgzBooq8TGWDkGjY/UEx/2eAOnnIgsYwwzYxT7USzxFfrxACZtd4aNe6NCFH+hzZ0T01E +FXC5/ln8iGl5ix+tEHq+4CGJBt+009cG6Bcg6WzmwMYKKr3ciRNjfGB1wsLqbgnN5j/8tkddaBZc +xxqfms8b9dj6K1AJ08+ugv1jOmgZnnEKGtF7N+/gHINDxeuuXoTwTmyaA9KRKf3mO1m8NgfrU4lJ +zLp1rqYMK3qJwOFkVILBSwACf5MC6H3Ux03+JEvFgSppqq4GQZF1bXUt/Ff6YAaOxRcqohcrKFd0 +WI9Sk92j68uKf0QjHtT6f4ZytiF52IDprCCBmWV3RMpMc9RZrakbehK0wUVTRceKmQTFek0OWSUc +chsIvtoYXsDsrjgzyAW++uwM/G1X5skiekWtSvx/a/xtRGYXtdNxB3HI8Pn24KnEQvYx4RsQHeeJ +RS25noqv9YBe5YgIOcamgU5+yfZbW5Fl1+KOkfy22UT/3soA5D/MomzJBokTDv30hOU1VSfuKx/3 +xTMGROKmKLIuZfUJPJ/rkZNrJmnxJVgLdXqyfRIQMubBu2IXe9LWhV2ZMR8BuGrKbMPfa0NdW3w+ +a6w3zf+ZURgFtBK46PW5sWt06FkjArkobNsRr/m3RHgzzNMBrXkVOFnYFQk0o0YKnb5GZQkFdxcu +iPqCMOJwLLPIQI+5z95dhU4jlTDHu2KKWQvpZGfygXbLOkR+J5FFeGa5Eh+FGlRHpPZN2ojXfsgt +lUIk3jiwxMb7bSPH7tqwyxd59xVsRKGaXtsTiQp5LNYycRm65fgc5ce82On4CZ4OvNWVnW30Ymn+ +CrUbQGjz6DMJcHLnN/eduMcamYPMMkRvxRBCJW5rkECT5BYm/uKTGdm/3EPnXMMJQQJoEmHe5ReV +XCGbuuim96hD9HDeWlDQausYGoHa3Q1+p5+SJfwA1VW+HxiA0d5zoKj3RWs9yM/s4n3B+sn+ewHD +MAlKFAxzeZdki8wS67dlhshF4IGt+q3H9vzh8pe/L8xXoLRM3ZdmNmp1eppsdIpxum+WqO20hqTF +NP3uOafaPHczPwiqowj6yeRO543WXgM3U0d6yyl6MkXEZRcnAXD2xRFLkxbHUdXOIsjht7kLvXIl +ZRRYRjitynHGzVbj9GjR2CEd4AapCOYo4beW8gA1gao0qRXW6uxri5wWZ96ANuq/NQrwqT37VAb9 +/a6Silpt6HgzbEPz3Lw5625B13S3tWH84KuhSYcJpohi+ykRJJa/I3n/U4t8yfSTfEbItPtxFwfM +5lyeKC4kKB7MBVQ4CVFsijIU07RQHFoZ9AQTGmBSQ+84bjnAqXtoUMzbb7eUdNq5V3FVge7apduE +nTF1glbJ1Y0FvpNGu/qola9vKRT2MbfgUVgEEKFrWKOUT0QCMaezG21eHhSxF4UwNQXEqG/ByXBT +pZgf/TCKkVqIOAEiKqPtXzjaQf2/aPWxI9XOBYXSBLYCafhD/fzyIl4QcjC6S9ULk8mj49yMiNE8 +nYtYlp7/3x2z7wwaD3xKkinklHqPO3+I4OooN8XU6LSnaxrh2YEHFL93wX9N2hQIFoLWJKMuZ2qy +5q4IXFEs23GE8YKhsaCkeA1gtYwBM/bl2e1W1t9qrCrOVUSNIYpM4pxdrhiaaJZZNnD2oo5306PO +TaMl/dENjdcOyvmL2LPgt4ijQsw+uEol238u3rQ62xn+GTfbXzDU5gtw2CCmnQq+WyHwec0QyPDu +14uf/eEr5H6bors34D8NQMvVdS0L61slh6EQeSe+aIDC9l43MUcxlKqR/GRp7A28K2ShR/jJ67k8 +ME6KJdPOtI7M163EsT7bx0qZuPYksAnv7FfSw3I4warJCPqvmob3/Zj7X9diw7+LkWOGbIYjug/E +0qzypyVKqe1OqnB6GjtQcrD5nYvdcPfVBNwhh1c3RUyWz84kvzUO9tPHNVjygIKqGWvSw5h6EVcU +3R2dE6qV/tfl8RQHD/IJX8OC0v0AEFgPkstnXFSMmjm8m0WzzSX5kMJ4n0OlGXXDwdNaWRKrmSjI +XkB8WCxhUP6+bYkKdYuSXmRY/bEab0ByOvGyUrv1cxXC8WR+kiYHuHsInGXae/hXcUXPe33TbU/v ++i+IMiO3Kg2uzLhyK98kij9mApAvQ6/J4VvZdlYNCAY7wwoW8+vYtvM+A6dHG7DvRJSCnN5kiSFm +kffsLT4pHvAaIvL2YsNvPmsVpL9WsMGDzS376u4/Gy4klI5ljeVVQ+Eu0PBCy++61fPgE8GWgvvh +j8G4Sqeyzan5QGLhX3v7BUhejYgZLNDQtufP56tnq0/RHfqX69aer5+ztXHMYD/ANDz48Ij9Lmzk +LekDIhr4MUSil170BR484huuvJRUEw27HCY4p9StEqCQsacjIIH2pERCF7BxK1my4BYKhREZL7MT +0N5wJhF2essisV1pI7tB8VDUMbie/kWFxV+46wlEJbrtHEA6mPKG2Pvm77F5ddl8w3YBMa4kmRGh +gC4zjdj9Yey/A4YBhQXbYbbFlXcIN8pk+TpyLGueUFCD5eMiTHmIf8cm7aXpBLzRbtS7jCmjrARF +qj+V2avc4/yuJqOBCnMUhliWaawsej0Pqhig7mG3HH+XK2/euy01z46K/r2GXxg4lYE0opvhpBb8 +2GgYAPuDw+g6mgmQn5YExMqP7N937G6VDAi9C1eMWq+rmFnsqTvML7LGbpXFF64sn8edQiYKfSK1 +VnbG9yMSSC5uVMEWGYf0JDqkh/FF73KZPEs9G5Mr/ID2npz7co2CMu89lT6bRj1sWBwsXdOy2P3t +2fpaJVQNFF2VmcteVIQmMJOJQtVyWsz9SkMMj9ik/RqwiCn1TN0bqF0Ac9w/BXWUiJ0furIUZ9yN +4ZywLybOlvcJhSl40f8pGOdsrLvcbRyqb7IslH9RWxBvQVFnuUePF6jxyrFQQGKFvRBhaJ9x2Dwt +JjJNXfv0Sao5oYl6HJeSdmIhL//t1m07U66BkfUwqw3ApV3tf2hDdSA9hmhfRgenYcTL7iJtGWTE +dJbT7tjtkuBCi8WVcQT9QUIqon86fCMw7ryibs69gWZsHZDAkYEfBvBU6RaMh8f0Q8N5XTDp/ioa +yEnbC+ive1ZsCW23cxRTJNHt2DbVWfLmBUQV2hYhre1pFwbMxWkiiEfX8SihcZLGwx9uwAECkDhK +SJyRCX8hs3CA2WG0xvv1rk5KAMArqWqeKGS1nZI8EuN8fV8xYAT1fLy/xwOGdYfONrQSTFAaC4gJ +TQ+NmDGWJBjj6tUoEyZv+xf7VR0jcHdMm+ficXuW1PkAME2mh1ERUyjxBTmFECp0Ypb3iUNm+N1f +Lb6HtD9GhvwOoh627zbxFR890asHbUeAqIch4g7hXU9UG07Kil6dYBTDc1QUqDAvG94LwUz+4qXc +wYSLQHBlsUOvpM6RyQ1RAe7P5rLr9wfaYXrVNwmPXmNKNn21HyZs5aLN5ost3rko6eKfoNvLO7et +C4dvycLcf4r3hnwOYhJ+mBqvuzjuWPNV73VJpLIix73KEi1z31tZNn/NPw5vgcEBHlV+zKXg28RV +HDzn3i+IUc1sHTxQpx6hwlD/gLPu/8P21Io/+rtbfD2vzYOz3K8JofbjQH+wmeALCvB6Oo7sQpmu +7/VJZJMGVIeNbv0lQS7OTT+R4tEOlZ+WGe944AAzrUIHiPe9QIN8qBzdTcEvU8SGiJc9f9rvqzlD +D71tCUZKik5WpQp6p9+0uqkxwnvGmQEiiyF/aLH+NzIceJDXNZmug4+MWwg3fbBiFk93fnAgZtV3 +eCUbKZGvGQ3QIhOHkXPyG9yA+a61dsLy8qPzyKsfK4j0Vh4GyIbiybjXd65TuMv3+1LK3Gi2VRtF +0jU6TiKT7gVSaExLVjMO/99CNzTGLwyYNiKlH3Z3KiRMXLQgjI7Cuo4YUFl9ryCyd5hTmbmlOAdd +MH1oVPEkq5C1F6hbqfMqlYrBYgJVdgBF942I19e60FtnlehL1Zm4oG222x17/TwlhTTFUYzg5oeW +ujdj6x3DnAvAfzpQ7iZeWOcN1E51YuKj8aZil5m2WqRX3Ps6Z7jZgIONsjbRaaooLfbr8VI7Z0qY +guCce1SOgUQDC7wRyUoHSUnR7gAfN7pC96LC8HNtVuL1v/1c2eBxxSi4wOWOoPp62roQ+6+NHJTS +N+GJ+nuYATvX562JTmjqc6y+lj41fhpBUQGO60+e7cmN+kZjmdEKDoUyVN34GRFNVGOj0td/ncsJ +H2etWGnLJNrKcc0xNuUk5OHB9z7WxXs77p+UhUae5H8Ig5+uXhIcoYaIgvtJ+7rhlj47DiRvzENR +OfeDd4byQJDI3TyhYlMV9rWT/h6pTuhuCV8MnhU9bgDYNTJI8yuWb0gngDohpHgvxBZ30X+sErdo +yAXp4NdmrfH4ZmncFzDM3nK6tptQUqJ5/M4zZffTWXNY2ObJMDVCKbJ1+4OQju0GOkZhDFcr5pb7 +oal6LC3ppVXJT+0dmCjIVi18ScV3YdmTqaOqPGaqVSRc7LxroLlMo8FimiP5lZxVN0Ch76hUMSXh +CKcSVK4Maty/urqQvVfbiun5pkI+Fv4g/CurKI7p/7UeqAT6Wa5B4uRZHWwcQoU5v8RT3Lmdk7pP +tctM7W2JMAxIdVk04JVZqp7xjS6hVR2aKUPkigj8We2AacBJrvLxp5Kv8QIyhnVYTAJmAB0ls3WZ +qJ8+088P0ExuXTmkVaE4L5fLvDWqEnhItx+0zG5yIceNjwCSXQGCZKRIsWEPLtP/mQKum3ZVnxNE +M4fczynoZ/tRp3M2S+jLhv4G5/PCLNf19431XeOEBnqLNT+gls/Iq8Y7Mj8epvuhipP849mknBLn +nkFLFOHd0jbeu1kRpuEuDtMetcz3X3zuS9qeiye3VVSTi+CRLekrn1ENYpGvHbs7PzZjBm2j+y6R +wVx9689lPLVrvcxQ2C942YdDKdyM1p7G+tiyBsKZ9HjktbxdfvheRdqSzmjZ//ymADyaeuKh1IV+ +HzHfw5Z9gEOF7iZQWjutxzEbKN9PLjJcTyqj6vH5i07i0Sd+c0vtnwLfEbJpdqL6HqwMZXtVFfCa +UM2nYv604fe2OJnWR+WEvhu11LP+Yr+iDsXH80+xhnku5a2KHNvsr4NBu6whFrnlFYBc5OT2Uaxy +PZLvutlZwvckhxTrWrG145cVaFaFTshWXxxShop8HYjaDIm8lnXXcav/Tp2WanKawd5Me2MWzntU +vc1MhYqE1D9j5y5CugiQDZJNPLebPLg49NGOp8/ismNxCiLyv+6BIvJuancAYZwyNFumI99AsDuo +uBrGoZj1cTc5PJrl75M859z6TEAu7f8lvsbkaDLRiNNZXY01pbRapBuv2ja3fuqs3Rbleq1dOM5G +5RAKYlgbJsktf6+1TJJVHRvdht7E2vnrgWQFD1bvhuaLRCxXm+UAHUjetMhIK2D9cBwmYwKLnCgW +PaNx8ph3OnDSp7xG1IQefRtjFqwexIqTEO2yDv+gOKfmpcllTkdN8ffHTy5eBbgJcdvt3aoZlK6m +F0+bSb7E7THXrk0QM7cUecsVdMTkeRPVLGfR5AerDgVPO8eGLRxCkw/Nv8QFLhLjoxOMMjGm19WU +aWVO6fsJFDXpEV2ZSh+5D7S+rTTo8Plr9hA9vhxuVqbTIqUuPP9j6U6niB0jBtCDeh29wQw8uJ/e +Ri/nsVdAjE8Y7JWFvLo6eivN1QEHOeYhKhRoqfJWQ9l76fuJvETWYozL8sB8xfBbdZbyP8LwrB6W +tFaDA8sk1HoiyuyYAV4hU6UdtEIXl/UhO0s4wdrDlDCmoqbbUF1HULslb6Zg6uPfZx55GS9DyWVa +y4Vpg/AnkkldMMx4lbCUEjXEc/5Bz/Wujd997Mgc6o9l2IdnOlUPfGr9JvlAhf9Fqf3VhxUIo0d8 +tbmLZgT32z/uyp6Gso2pC8201lQAnr3omLQ26S7B6O/Z7dfOzy0gurusYvAPDa/SvyHk8Nom67ts +z6dULyFS7PjB9Oz89DQKoPqQTpcXLkD39T47tu0W3dm/8o4qWlUNHI3GaDeYO5jDxbs7B8t1qZi/ +skalMqiIjgw0lijOI7ZXb6A8HcgbiJko649LOPJwLpTbF6vxGwHznSctWhiVsTW+fdcpmi08hYbh +LfNLJU5s0fSDsnhb2VQV5BOkASvtMOy08qD549kMZtQqWZ3X/noF5D2rwg8X3h+ej96AFgLZZqeZ +EOGwvamWHnday3Ok8bxlftBLNSRPEi07JDIu+c7VYUh6Rfvj6ggV2ENygIHWzGpRX8470xN2/4OL +wREF03ac2sMswzkBEawAavzuRReH3xD9fSj5PNraZYuo10XSxBtDcAG/VFdpkSoP1o/bSUK5vtE9 +eBSqz1Ixat9PzGvJ1xSaRZyIhmfC5qs8nvtemRleb17egLDh+XtMPPyDihZRZZg3M3iM7Ok+bimy +DLPRph0JQaBw+U21qmeshp79M80zZJneiN34Fp8HZF1LaocZNbmCm2SJBQt0gqTtQU8DPz4gYBvE +KvVME/JwCp+DUmeDnI//t86VxCWI54vrYz2jgBqyIMCEZSS3B9cAOjfei2D4E+fcAuiNAEsdjCAg +SLX9om4RPBxWJFhbLjFyTGYST9tcz+LrRUhA6zsXCzWWY99ESSifxAXew0Tvxj3DEkRhFSE2M81b +L42I3qdDyZnK2KcYXpyN8uIOsPhdqCmuE/ZKtgsOj9IRKYt1Y8bmBQYF/9gXVibHBsHj5oI0mI7C +cAAUXdl5L7Nxb7UFLJAw6nlgSVmmIR97Nvhb4kRAZfTEXP5i0rx2DJXUkst4gsIzHbKUze6n0sKV +Gknlv/TC2rsxJo0e6sVBGEX4QaY/NJRtwJmWiUXz77lOeVhICO+8oh5MwdSJM5B7/TDZ7h9xBnk8 +1CmHP8CFS5ke3F+5McTeashE8qo3frCvdKqfLXSeFlShlJKZxYdkkm+UbBfJ7cDanSvaxvoIHOYS +Tln4wyX8YWIArOKXWcXOmH7u4ti0BEzMPMr8TK3Zw0IlR48D3BoSSnLa/wFPCSDXS0QyydG82vGT +cNO0QMNJWSEQufrjfLp/bGfkGSaXs5DYnTCkzfrr5Hp6JyCS9NMj3+7NZk3BoYK8czXxamZ1gOia +2rWqglcDw942Re4CkmETHcmQ0gIjysUvWDlkpoFrjsYbugTm/2v3A8qlE2819PjU6VE0K4Te0UE0 +0Idy6F+hzcF6ER4su16aCVLDM9BEDSJAc2UpBuZO5ITrxNG+T/PiW4brhrZW1rdJpA+60FOjlqBg +YW4VdK4BDBoG7KsBX+N7TU3WyGfdjrfYEGNccwjYm+OZECtQpZr/EmY+I4hkygSznyr65ngaCcv9 +2cR8lH0tVvz54CFCwpBr+pzPLuRdEA4HG5aUMy4YIa6AUp3aJwdBhCJUd5N4zZGmDVPgRoTzY3iF +Ka0WZ/SRlSGl2xfpmaV1CEp2ljI4QOeixuvp+aOeluCjjXrxknFe6xemmgX3ODGni+RDlt+LFaHc +eCd7/l2d4wsfaMl4OkNrwdUPrwZtOWqfYp4SckW7sx70SH2cqnjYCUmzYxP4wtY/+mU0RnTwnylN +QNaQzpHmYCm3YDIbz/oP5RRZexbvJOh80vWVLVGBv4hZiL1zTXYtn86kYXxtqcGxVpScNt1PilYB +wDO/UkpO/l62Gxa7jAoxuIcRGPItDMvea3tBPSRawK+IZ0inQEi6fWRGNnGIzQMpo0O401O0a5PU +Qnl6No3d/QmZhRaQ2mvwUPC0cUbf6/VrYzjuQHw3PUIeI88weJlWhJuMSFIGxoSWTiQrYPvDBlkZ +rW6jr4FU4n48G6TxgprQAxvXkO20zAoiOJZB+EG2n+yYMdK1kZwUf4giDQad5AQ74lNQYF9yOjAl +znA9tpPuBiXJjq+N5Z/iKlpttTHMkI/YnDXlCEp6BpSkTCJ7WjSvEpxehdR2/KY1XuT5TQ0B4amx +Ih2UKR8e3Tj7t/LAWtEo1noO+DbifmCWFFTdP6AhUZwv5QR/e9EDzqSRHfexVmIopCAQ8ap63alQ +vQVq6KjJ/4QP5OlWtzvsEZPNWGxlQAzkBPrMnzvJkSOHkReFgir4X6iNW+r31tc7grBvrnq2zZBJ +/WZAt/jRxzjZmxDkrkAaJN74xKKEsppMrcf+fA4RxFD7HnN+nG2NBZ7iefIigcKDysqc/a7kkTFw +zjg2Zlo+e1m+1blVovKcLtdt5rzIAJrN+KWls1btIfULbBN4kqfYcW/Tj3KHU6H1f+zfZZknZdPt +xiD6OAFUFBL/uPcSiEzkP9rLQVcIMAxbL42ZFqH7BkpRagDvvKIt5e1tGpNYD9AyOGfJBmwuK5hV +H173JlTAIFoNoHCLjmogc77G0HHdNEg6Ilob7GAjAMkuKAunEbSOLc6KExfPDpNNu1CC9AXecdOB +LOmCkw6AcKJyAq1IMIrL3vXxbKG1EAaubEz6LWhypeHtPNTyJi+maD8UIwfPxeDqWnqrJ4CI1ffq +2CNnick8nJ8cDw/f66L+wXWpgCda4xhYmS3RSkLFMzM5RUurWSgMjTat3LA4Str55hw/xmRUyDS8 +XN72OYbnkFnnXuSVeg6baKk7AnCylMrYuZv94JumahmdiX7UCTCCur77VLd6A3UsL/r5xVK5jFgw +Q3VK5W1fPDc2qU+rYxisEqGRce8Y53p6cJaHT9iJ+fesjWA3//JLOqJBMFvxTYYweE48ih12cW0h +oho6MhToW+mHeuFAH6UJ6rl26S5+4UEMMdvyck17dwGtvHirGRz5nFsFzToBBsPJW/7UoiudrcNE +F2Zlw/w7obVIk7TOxeWhnKm6vix2pRpyXm8KG/Sq6QcFDKEm+2N/EuAD7jarD9Cw7PcSwBMR7P+j +hUyIVILyNz2t0383NXAZ4i3dklYVsxzT+UwbyaBjIsxPZeiwPAXt+3EsZpSOSSff9nCWnSvV/+4l +RTA53Nmvpr/+RDLiwE6XJa54btNrQrHZkjPNhx8wARGfFpu1x/+4nNcgCGyRJyo/xn2mNWGXzYaB +PUcx6cpTMCuGV/XlSNs1/DrMLYRS7eVANPAB5eyTusfy216CqFu9CJgRobJc/GogCwvsrNAJsIVj +I9dCAZa/fgULx8Th481L/YrcqrPkQ0jLF0d6b31anVcR934gL0dwzj2s8BJBCJXmIwAVbiLBHQKg +GhIhusyQqcRvHEaK30hREjiwf6vvqcOqV+TltAEDTR6KvREEm6Ps7IOgn8BRELuqa5t8PEofNj6C +C1V1AY/UwfIp7XbEVNFRl8cltnUI4l2hZcLy26HqLclOIVd7+1F/7jvnR4yaH2cfZowll04bo+VV +IRnPGzzEh7KA90i/iZ7p716GLidgTUW4sveNB4olNxbCk0cK0fb9vFb2t/Ws76vmSj16Da87tQdu +SAXtgL2bq0wCTEhUi5aFnGjDfDpkdP50WIvxcgjALq7yGcq97wy2qumOmHKJFGWCwyQ9lDjX1LuE +84E4uAlasDUVxBcpcn3mHJLfiWqwU0j4hhj4hJ1nWkV5chV7mWeQ+m5gJjwGvZ0IoOXM5j4HBzVC +xpbyFdglWkwl5VSvVcd4Pr4QmoIB2KihymwQNGA0YdpjWQms1XqSidFxD+G1iBw1aKoIYaOsZFdo +OpMvufuPrQR1BwW74n+m500w0KTYeXaVvcI7J9mKa0d6U9iJ1rCZC/z41FhKKjoDOvcS8UtUY8Kd +/DVwyiL7dC+X1cfaGRP9x7A2gXno5V1mcb0iBaSbH8eqyEiKnjNqT+CI4hAR4B6tbkEWnP1qJ+So +t01kRbB2IWcC52u/kDlbc+KTbH3p39MdPlzjeBdE7WA6QYQwWlN0SczdhK+Y2YvGdA/vf7PN0+/x +Tmd6UUfGFhpu8c+X5Rceg4EE0uhCtbwOnTHsZflbA6Ljlhep+h/hSuKlUceykqFuUkpvScyndSjD +MxXQGv/gusw7fX+tE4xqKst3ZF66Z06uovpgs5Wb9sL5R5zRl+eB0qe8bSNjLKzLpq6hnGzQ9WDi +v37bJcpacjbn4cK80aTMYV+tvQ+Wb7b+zz3/318POLxI8aiVtAKGWKU9+OzVl1cp/Kk/3Q65rhdp +f+X6GJO8VUjeBQyEAyCfG8ycZGOb/pagEFlVqGq//98pINuUpWFDkZW2KuLWHfgxL8rRwc8sMWTo +9gDY/xxUBgVWoECBNLZrLNDCPvhQlFVD/laVf4/erBgnB9jfdF0oPti1fnBHAniQcPdvUkNIYSO9 +X/iyetYlz3sihwfFb7VF1kyWildAS/jTK3dR7ro4KqD6UuQtZ8dpEnT8rdqDeN4n/I28no1GAdPj +VK2xYpHraFBQtmgPTnnuM2ReRN/KAUSu86ZbJMOmnyTWDvAODoqRP3yoErlo+rYXj/otm3FohlL8 +QzzmTBpMBb0WeibJLSlbKOcUqE4rBckkl4dobc/cKwFcY0fk5FX+0xgg6BZago1gSxm9Zb2iKcLx +5V0/OsO268OSiuESdbEHJF1BUICg0M3o26Z3j0oyo46AqytgLCVlJtZsiewTethl7qUfze1jpxre +RedTPLI8o/9d5AhK2UyQ0kFLwh6PcFI4WdiAp8sVh6jWeEcp0HGFaGn0gS4lFClJodOQ/4zCkTUh +68qP/zf9+g/KOWtjKm3cJ4kXgVmcDFwFcT/ubwTpcHFqSJqiD67IrLrsYq2I+KBqp1XL5f69ymP4 +dU3ihkWYYU0quhf3e0fwlKYTH3S/+I095InJhLpFvEsa8AYd2f4pkQNi02XcyM3KBLA9Ku9suWGn +qkJiPJEu9mZnavlg4v9sc4YBjRKjlgUHhvkF6vV++AoGNW+BU6K94O8T5v9pnWCwAr2REQceXc2b +FINL812xpVnRBbJIfai6NXhYVSzjCpH20cGGfzXMewAE2pJJzNhqMC0ZvmgUxJ2bywLVO3bOYm3r +TMohqgEW1c8H/tzRbxg4HVmEcoXx1qFNZ88jjL4f92kGJtK4ql3oZJVLbj62LCuTUwvkpLmAZrnq +6xxNKXZS/xZyYOzEjtRMUQeUM9z5Aufcwya3yzL++HfcbSOX9PgUA5F68u4bKHSebBqOyG2oOQ93 +PiL6sc2sbkTeDcP7OyQbE2XdkRb9r8OV6qKT7yTtI5tTDCUlOjwv8j9/xUgzJH0vHAi44B+2FO4D +PUPBQbq9Mn3wsjd9MloCBVR+z7PMymlON93Iax0gNRPvl8a3b/7FQbt6wp9F5ybsbM5Anpx8xr0/ +vl4rGk2tl2WrNf98XninIYeG1L9HT7Mv7OmvM1J9Xhbhx8L7bY25IuOka4WQAo/XF54H32uVVQ7o +BoerYsSWiEvxXib0EM3dAM5WoJSmwlK2QYo5vD5GBzt+QAENlCyBjFbNkritR9PYECKMFINo6LoH +W8NYaNCRlaCPZO/4qigYUfY9LP9aHOUt/FWPr+DlCuwT5qXNhAM07yU7Butw6M7fgvs340x1lbve +qTHA/9rxigTqzS1g1X3wVqy7rAjqeJe+ZhKtoGaSHvSdf9q5wXQWNutc9XHoQfrvxFFWgR6576G8 +Si8j2g1n27ZQDOQy7af5GG56kjyKfC6EQAagAY/VVj1kOaAiZabLKL2/TJl5QsVDzz0sFR6GF208 +7DT+gtsHv/oZBrdGrrMZghPkBEgWULtGhTc2ACPGM4PKAhbhCWGCrPpgsG3SarAEWwnFawFimx2M +IAPZDdwTcuftsmJm9oVLejIEygDwT7e/gdO7cmOlFYINNsS+/PjkkOqecABz6K01oe1jvEmldV4m +Z2KCP32HxJhF0sdf4NdC4lGXktKLo8cB9e2luon1f78PadfJLxNMzIfNKAhDadGflJ4KW0quKYck +HIfX/wxOxpMrvbYRb7xcBvMGd1kk3QA7Ur0D4DzLMLLACahGtVhNxIye8GBdxG0XsmNTy5pwwyOi +n/eu3lxMoGZ+TnReVk23oZzH/6nfBVaWk4QjdkRqDHMLF7sBVgRGAmw9jX6dYUbQKdQGrp1Qe5/X +z3za8kP6+zO3PnE+9Ha+8eMyCG68sw1/KznkEw4erjxLfn9c7NYn3zWJMc/J1Vor8qnxsb5YvFvK +g4JuDe+9aqQqLk7P5dlZO1BH1E+e3V6dwJDp+L+LcMLFLhTbHFKOS/jEi5LQUul2vQbPCXV/Sw71 +x27skK4jdd4ijsJyGqKTxYYx3NxYcS6PFp3opv8MAjZRSAENJmXFygtmgmtkPHMYQhGiee7khyhX +7mFhRSwm9Lsw2OjNwxz0Ry4bZCOf954c+dP2e4wmHguekxuTTfKUlTKky4C82LKNN+MdXV/dxUr7 +X2WsmP+6Z1ya+NPOn7ddZBR+oSl8+2IYnxZuzv7ILO7M2eM0ztDKfjEem6VDDDbdxTFnFYCgrMyU +apwi67GCH4cc3DtBKNTgnJiQPiRQvhaOF4LHL1WrMG/NsBVDvPkeDeK36PjsEkbH8JvpciCoZV53 +j3F07Ug6Bkw29FXb9HcuWtwaGmyVnzDc6Bx2zyUSmoSzzB2K/qT1NC7KGQpRMkbqn/co604DXnB+ +vTMDpseurRo/8/uJVTu7YcBxZ18t9JlUegx4XjugZjkvwMhH629wXhzHE7KH/9uH7GKMwQuSg5MA +ePOX2yOQ81oT1+0n/CRi9PLIweQyo+cKRvmehMIW71PLuND2HApT96WLwzz/h8ATM/trsLdh16Vy +BUbGfk9xe5nah5vWpQuZv/Z2Vr/KCO9h1WfxQiP8Vcz2dZ0ok1LtmPsKNS1hI4E6O7IugKGncsWQ +/Khl0QppQDdQ7YSlxIYTM3Ld/o8ho3Zf5tbOBovUDhiCQUcg2gFSraZmT30+g8IfbV1QXZsu2hYB +F1sXjy1gonF3cwgHeQ+oi3uVYs/LrxHMFraKQ8vyURmHVZn9ScoKtHJGWOGGB/ILo/XwS1G/w4Pv +hREGqCSTZfD0GXHhXapx7qzNx5kUYktHf/kC+AP8Pl8me+n7PI0k3AnhNmiAnABVOOdwvYADOIfK +J1V+lRlEPWJ2xTJV1FBCj6QteYRpL1+JdW2gKA30sAlHOcYdOY0g1oXJEduUYJG/6zLNblv4MbWA +2vixVNVgKgE44pKSiqIi8GenBrxEo9Wl5yN7KbLXHKv++YDLw7g3aUOFpOI/uJa0DLUY3O3wKZd/ +lBwVgxfDOUEKYOuolrdbsDI+9RWVq4TJJDE7n809zumkIbebVOExzZLYystfE9lmcqc28MOP7UN4 +fQ2siFuNBUnm4qaM9BlPjKAcAmRLbDjEXfkqLO4wd37YhcG+IuQX8B0jUpXtxBQ2Fc6PZ8MfkPYg +BoKtvj1tIdWAJq8+VpopGGdbLCMAqb/jNYf3mNkMRvT1m22BmFQdCrUvMX8jjszMcEMhtgr4SvBB +fxeiCmdLgl81MieC9uxMIRFgu+SCu3u82WLKE+6kJKPWvvzuRFnUr1b2NLgMUXi8PRbmkfkBmXha +FwMb1Y0jTq+fZMLN/+8Ugkh/4Gd6+KYYTNMUjmD8MP/hjiQPAJPVx57UPGXtWRYauehCm4v1xyFy +vGOgc6W2JBYKQMeTUDOZlgaz2diUs7kJHeFY4bsqjDQf7XqZDBNwFxEUobaiSpFIbc04oW4ZS61n ++AA99ArdjnRoAKKU9yGwam0eH9kOCBFLudiruoRYe2hAh2As4C9b6Rp8yHmdLQkiOm0zmdI/UCBy +8ufBnwsnriwVrCWsaPwSW5fUj9Un0LwhmtnJSQx08Q5M/X+aSDztnpAn23yK0WnYkOZMVcELH9g+ +gjYuJ/YjmwLAkLEe35u0I9kVsnQiVw1fExSrD1fZMFHkrc7e/4gvoNGjzQgfbQOzdz2UiNqRDtKc +0l4dsCWhZO4r5C3R+zpaQ9SKhBSwh1adKp1QGLPSQviq3G7Si4Q8BS3zOhb1EtihCp8W0w4gn4LV +AlbDtiZno0LQ+LOMumgBY7xIfARfeL7LJ47VCUhHd/uFMXCg/YCD6I468A/8xbyEHS27cPh9vhQE +LCPo5zwvGAUURlZQ/I45QfeyqijU1QugTWNAA9K6X1lXFcL5UCofQnziC7xz/8g14wb5gJt4XFDT +8q4iI6qtvx1CijAgP21BynFyiJk5yi7FylYL4w1v2ndA20StSGI9OVCmtETGSDBHSKFcui496PQz +cEtPiajDDeBO/+0VhLL1kGvdNmMaidPAghXBhuoXO92LyJV1kqFUH4ktGuJq47kLy2D+6QEyf1IE +pyZBKRRBVcM3EC6tM4oSMCfX2WG857rm1TdEOTd/JApRzExlt0B0Bn7v3LMfikQh33snQTtiSPOA +MzI3Njw3SwhZ53jtxcmvGO8QJLjLlCylgKOmhMFK/NkWgQmQZlNnjUnb2IjG9Yfp1IO8+H+ZFOFo +ZKG0kxyh121AK8em0KPH3r5T/jpHSMatUHmj2hd45wqVJUouayj6tSe4VoD0MO0MmEWrszSUGoP0 +hvmdoKx5J3SIpaQqi/29QfCng4oA7hVpqWSzvrNpp2GHCujjCenI4VtWpmh/OLA0hOVX+PMF4ZMe +C3O53IqHcsVUKpsLe62ADMbtuDxBio9LH/bCUYKbkRA/xLeCyy14eTTYZYR+lzIT8AOo4ndhpzwM +25JpjGCcFowUM6Su/JXDgR+7dfJIlBkcdmDShCI7PEc+poLHKTFh7uaCIUKnV0viUmnW44m+dtuq +JNiZ2RNZjo2bNCB1Y9B5laTMesaMAAMMcN19DgKyMbN1p4hU3mMf5gagnXw9LPeKXHTbObAG9JB1 +CvTIJEHBzV6l5jOf1pjeeg8CvXawMlH+1zWs8B2F8GasKpm4m5o3q34pVD5x7nfSCedkgIE4Bcly +i895KKYvVodxL/UyhpOEogH0FJYpu3kFLbNKLfUdfveRG1bh6MOhSz1rtro5xbymeXoaMKs0eDeS +6modwt4fyCOvVGSOYpHLR8vTMsjKca1oOCoydPxdZjMs/zqAPR0YqzRnSTZZ5t2GR0Qag+64JJZG +Vs1o44qvigF9K2HIu31OlL4w0IX6We6Z3qREqMuGEK8ecAZUMH5poLy+JxyrzYjjPT8yaWRgKcZR +2SgY2xMpahEsh0QtOZQ5qzupoYklPlP60bjDX5JqVouKVVcE57HixWoRzX1MKGA+k5TU5HsiCVen +DwZwiSy6GbNNQMoXuBcqYZzkiJeTQaOvvBMzePCgqUgAzaLhAehl3DOe6yM4l/UD7f/Fgh6bfZJh +nPeSJ8O/VihrvVWG4t1FNsScuG45sRMNNkkp/ICgY9bLBrnBEPQIyq3Y0TFXfILPv1+d67LGHxdY +3NFkzQQR3RGTH7ITSFgaCbKDCfBB3gTl/LPwJcYW1EwTx/qOkUZx94B0YhvunyVFhYugiNeOrcGH +frdI7kK7N961yKyUrxhQp2/oUe89VJkoA5ZzFUIvX3R2BUGkRqAtOYq9mGW3zhwJbD2mpmbwX4mA +n3TrEYBSXPAfY/P75EjlMiOYQ9vO9psfK9vrQAQlgYPDltkT369QZ4ky4c2itvoOv+EHiQ3gqvuI +jCPlic5kpMW9QPiQJ85Fepm+qY9GMJrRU0Io/hAfMoMuYLymxvcej+fLGfJjJW+7NXOfEyJCDUvF +UbnpBcs8VopjhfVhhJO8ZZVKWRCkVSg+U/KKLMWDEkCdggJNon8T+9f3ooxcckHMxQbQAU7GEW8S +wIX+KvfwXg7HAsxLVVK5z72+WICnjp3lB9a4B2ioO5RxG0sWiNsGJWqukkBB6i7rQWmDUcp1UE0a +0OyWA24Oifdxml1Kq8m8cL+B9UHAJye5s0hzZVM/8c3ZiogrNn7QJCTQ6FvOzolVex9085UELUGH +sfOhNPq16qrA8pDBG5YqqCyjPUjM5+drACYwTa64Sdk9y2F5D2Rl+ic9frA7MJgXbpeQnawoe29h +mWVDOF4IEmK0ldIqDAJ3Hc85P+a1BrddPg00osekjRF5xNLSPICAW1N5qgtU/R+FgxFumctBQ7GS +/mvGGp8COZqmkBz/FtyV+UwB+GXngQ0PWxTGd47euyBAlzdugJD+sKWlgwq+fWjtx8QkV0udTixT +XEjiUuSBdpJkO6PrQlwPLklK0dpb19Tp6WlHckjT8ItudeYafVmkqB6eK698fRSY1x+HKfHp1tpz +ok3suRKwXqfR+1Y16PxWxqm8jEinKVjc/sObbj4qA3AVLRqSWWnqqd2MUgzyHPYKmW5RHovmyxIJ +3Q5cTKevTgcqIpiOiqgEn3vIIZj5ZggDtA8pPM0kizwgnjb0e/tq2UluY9j1a7F5vxPguGzGCbXf +yKzKvf+JC5TJogonw+avJYpDJPFeLG9WnqdKLLeDYdJoROMdkSDkTP+GivJ+W0eU+SJYCk+z9NyM +u5tWp5aSeEwTC0NvNjY3GSqrWCCr8BDlD6V0OItCW/Bx/hggl2N454ea0vv2hUhbAV/TUvHTrV01 +/dwkDTkFAKMeuqmz6PsvLvxVZGVsc4dlSDH3rwn7pd9sHsGqY7gbmdRYdhIs52y7TnOSNMzJHJZ/ +/9mtjFzpkKBa/2NyVj5JpbFShysQxXLv7HfsPpygvz7Ty6Tulls4+vl6voGsS9Hnc91oeeG1Im8y +pXBDwEyXEQqGRUIRXNmQ73n0VP86vzy5Vf6I0eAgwIN0ZcXB34/jQX5GF9oOvVCZQ6YPEfUGpTlt +RAjEMPzjCEgQiMtXA8L4TZGOwULdZdBHYcZv/c9RXCyY5YbFVsCRMgqkWDofB2CZ09K64+wNMgOz +DYuzjVRIYjt67s7q7H/Qxh32PhAceBun4EXljhMvn9z64FwuXV74ZpXEfhWWtAXl0ZSMry8OKARL +p/QF8ll5B+ccV1mt2k6ue0AMZAw5qghPpIo8Ij0qgFJVTPcV7mOfiR1YoEE2H2VyuGwd5em9LcNF +xsAvDP/9Nr2BmpozaIs0mi9Ks7v8/CzQxwJM1jiBpLGMt6eq8yuw+ldZAXJiU0M2SWYmN9u6EiIC +cvP+pjuQugXeOlyfUdDDhYk9AY/nd/ZJCmXh5SU37sddXaW5wwO1+ZbA31jdQa6Z+7NsdZq4uotx +bw5po07L42+rUuldz55/8RfAqaOLrowJ2pZtRgxyA6sxDa1sj5JnFewRk9W20cdMasmImEoxjPke +xOtN03X+fwV/V0pxUGVenBkoAwTjHIaLu6/9xidtvF9fvY/M4ns+sw0UPwgIOU4YscG7kpkB5Tjb +1CxYbfWiXB+fCQip3WzNGKOR8dEjpKWoK64Rqgu8EQo/KT0ph/jIB3Q3yc7gky5ShXHjwYBqu7qJ +vwDjeXirfduYD3/Tiw8n5IbVS9asUn+qLEzzHDcg7gGsAXc4DprVm5yYrCfliFLdXR/NJXPgM4vq +P4IttDMjRRpvE9g0i0ZA1fhv580jrIjGIn5i8w6F/PP1ocLA9Q/UdKoPbktC8I9UYuSlX/WemNCH +Vf1xFfxE6tLD643xIu055+tVT5lM8pkxz95dCChX8qD/ygWYIqOHQZR/Cs6cMfIRS+QG/RBR3mlS +BUj0UMYUME9Ih/h0E6ehpfvTC9R3vhN2lqZ6Dest30wSFQFEWxX1NTHiWV3s5mPpc06PPVcOf4qD +EFMsak4FtPysqSpoBDlSeQPseI4D0zdLdmHiO7xEvjv2yQZdeQPEZeM//gtoYVUtXsA5Y9jprHm3 +Dy5O8+LRjLwPQhprJvekettU7klLV737kgjDEa00GQZU/F7JL1mn0pSPZMBrlArOHY99bAiUQ5Qx +r8N0eh6AOYp7PL9aXKhiOXfMCUn0DM7adwyET2fRQvjQKj34OmsejESwqtj7SE9ncAPuXqHnREq1 +0cqi2fdZqa2IxPgVl6l0DotXTJhUt0K2cNyQP0WF5/Vt6efPnzsp8uf2NGFHs4jPdSiawuPm+b+W +rTjbtMHpaXlJ3AgY0VFiiMAIoJRgglzYqZ8+XXhogvZDKw2TMhHCzJkph7SLpNyfmtiyQxc9zH6n +rIzEFx0FXN/Pku4DIDb/md+FbXep6ZfXanUi1iWAAkg3V82dfniLz2GYv52eGIbHXOEXZtKEgpne +GYEJfrz0A65caXO3Ck1A2iRJjHVlG6md50yYL+d6BpXf/QSyCRX+E9azmkaDtlautpf5O0R9MulU +m8TrPMhLaDwewnJZrsIp0TDTtqqByJqEdL+lTKZujEnG8zkx5wwhYBSp10pxL7c6e6NkL23UwCyY +XUJ6Ee/k3HHIztuh+qdrkhtozRvZ+Z8kGmr4Ey6Qjwn2a3fljgQiLr+fIBotA6kFqMN/Rtw14N7+ +5fIMZ0HGNvHGLdMd+POViIJpSyu52Qx58iwedji++NeNfgrzF5A5RgRxsc787WRtltVyMfn5jPqi +s7A8WjYG55ZqhcaLPxxg7l0Zg5BQlL4Jj8R4R+iRr6ysVgWCfUcteVVx1Dbg1mP0hN5/IfUzAilg +f0seM+D5DVZgsD4omyiAEKNGscI0m40I+Ug4ze1P2onzKMvqtEnA3hcbtDuWuOF47xBvAmYgmceb +RLLDuq/xNU8+bNKWVUQyhKrLVcHcFjCnjOpmanYqrxIJCSnVjG9SvP+Lwk8CGWxyRR5lub5qNNkA +7/UY2FFaijWv/SX7OdVH3LOTiZe1GzMstMP8UnxgYXIiRxNZlFTD/Ctf9Scs1GBpysde0lYOvezT +klmKVnQfUv41DlaCPh3hXFcAZ+kg2td4RjftBEaDBPhIK7MEDkK9iPPrcgR1BACAq5yQX8apHve0 +7YzpHsfP/ZOhUkmKh+fjoEOP1Zbin3Q1+ZN6btVdYc6pEuwTONWVYMktWdqj6GqTCM4rlBtaynYC +m8DhXIaxhkOhqZa+NDTtfzES1X4vkGh+DS4PMAVdTMuVeZbdiBF3z1FXLhM0VEPZsA5X4le2QrFk +diPvAS+iC0ZvtyO60h1BU/PqAppTK+K//W7/UQaFYDDvChmvGQ9fUX5ZmUdFnHLVEabsqJ+cEv+7 +oXnCnQ3TaKADfW/VVgFGOoBFx2BSqzEDUzBSc9ygvhJ6N31pUKFF4vH8BXjQodpzfZQpHtDO+bnf +mR70pZgX72FFS6ThKpTH8k7yKpCgDKRiZXmWkYKztdptPfiagF5JQ/EVklPOv+e9qcgOlSgqLv7D +xm0Cu4DLsMepV8qj/MG41TfVa1SQR2tD4oVjJWkqGfVVtkjSAtq49IaoGB+Bv1zmbQXTeXXo9t1d +ZzfglSy38dGE+xcu2kVNbur7YLPtoTmFyJzwGdCM/Uu+CbPdCaBSPnYaDQhyon8gT25glaX9KzHz +/W24NW0/5uCHvbftik1o9ZdH+53ILn8LPzV8x9PBavgN9UJXcFy8xTXDllxEPpNKu7cMZRqW+65Y +2ucEio9oUcF8aQyINE0+x8NB2+elCzvQy/rQ//i8yEPyopjIETwp35DqJm3NPkU0xmUFGSZkYzRh +mUCVNYP5izK2PYaXuhM94HBIgLKjdvmS5q+HEBolnwiV4I2aMo2RBc4Cy0ANHJ3to5NAoycZqQI0 +gJEPWfARtlP4NCU8QeGDlqBzU0a8fqzRJSeOVHW+bzVLDMbh6xhsAacsLKHK2xl1VHcj18nojz/7 +A4WTHCK2nzO37/rQL2EIE4EidFvnh1d6H2h/F+2RFwXk7zNERKQCwrnqXx+gWDixSau4SkgLyyj5 +xBpb2stu9/MQnbNw79eL9gIsoEsU3F2gsSNmDY48w/HeuF0ogdP+Fw7XCqqp1L9cS65cyeSfB8Wd +3+YJijOPhhKHoWManXkQdFjTVIc6gXBT8o8+u9Couy4o0+MFp6pEMWaGR5eP8sMNenn0e/2/o+2b +YHHPU2OP9dL3sCTjti67c/7sJLZIQm8z0qzlWzkMYrEJssa6+8ex3TvjZjYYwAg8e+bmDLuPKHNW +5PSvOrKbbSnZotUaeOfHfkHbM+iYH+s4rItr5ZdW3lwDGtjQEcUtT8PMZRx+yAT8dpTeixEMulFi +8FLrJ6mwgmi8skcZWRs+iqGYI/2R7lq4Usv9+KF+oVEGZQ6JtK7B5N4BIa5w59JnYsqIoxq8JPgk +TUSUmHPjDOxnVyeq02UP+8+gMh4beyHrei7MkmaVK/+ZNmnk2rHX83EfeVKOi2TTzk/711K66Ysj +eetM+qLW/6AIqFNu3KrT5ANv1WdMJ8PPsxOgS0t13LnAY+5d9ZZZXFDx01FxX6BA6+He5vQoL7Hh +1mee49j7oEOUj+e0gssrp+cRi5LN8zNDx0X1g/2JHwM6GiwBlenxpT64sVxb8TZ+zgKOM8O8wynU +M6Vf8Wy9/2lKh1M1ML8hJ757Uz00Zrf5Kt8DeBqPza4wNXAtAc88omjceNu0Dq17yS1HP4kNvqTv +u/M2GdAx7x6Uy+z9VA/xXkqharFSz2AdnefIu2It/HetC9w6e7/LXdddQJGXgicaPCXXIvhRrphm +Gt7fXec8BhQt2bgbk3jo347/InbbQNFGXHB4JSZkiEUt1bfJgrEeJ9xyIb/3piPM0yuSJShu3hav +PLY7z5YU4kfNPDsOP1tXeV7j6INoa5yKEPfPpg1MgoG2C+Kgg6hbxMRHT1zUCpA09XndtZgbkOgq +R/fuVkWOaN/nEMwDIjYBB8rM7T8WcjA2mybNtdLjHfigbmPoP9/Dgn0b/lZJatsQSjOF6Ud8aPLZ +rJIMKBOvW1of3Ac0wDk/ghRKWhWaoPEZV18i9nFNdsvlbxkWiSWNHQ59i8KchgsF3dLe695ERt2K +yzMjpY1jh3RwcXEvSMhIAs6Maw+xhr3ykBLbetu2QDEFMYw20W8FBabwIdsFw/JpHgpJh+aFpCyX +mKVCnS/hZRUDQMx3/rOgcwm9zfmW12K/2jOur86Spqjvcz0bEzeWM/+0c1TezhGp0nm8oagAxRPT +fsRv5we6X0OKko78R/SCq2A6xfAiurIdLClH8tGtPQODR+tRzMX+DKOTTA/ohz3FH2ef9J+b0t7J +YRH5I+Dw8eibZ41eWI8sqU5M8Cp/m8J1ZnORgxrAWWGnOMegBnc+PijJkGHVKypu7j2wCl06fsv5 +iuRKLKU9cnikwLvYuobqwOOBaXBVZ6ly80Yum6EtJYo72oNMLi6YypXVM1JhqiHtKzZAjz7YXPnU +QjwMNSYlZ4BHomQCeLT2RMgx697hL2MKzlwtMTufSVVufLNnMTi6zCmEP2kyplv0L4CyxhJEVSSA +nVwa7+tMZU3BLG5wXvyVm/QkyZd687qj6SP9J0+mmHjanX8ex/KB2vNRpawyLbr4DNs9ij3kVCyl +K8Ea8kKxGR4cEM/XX658vYYuDBzqpq8RCxpsn1e6iWV/gvNvASR4kPogTMZ/7qRR6u74NGeLUROd +zZRLxIVJ/ZMnHnlQ36rVOM1oI3igRgkgyV86U5ob34eBHS0yVrlLEUnkziQxALFP2+o8lirwvb77 +pImIJC/DsAzw+e7ygY+w5jEyoLWtv+WsLaKeQ25DX/Q8WgOwZcgS5PnyC1mV6hfMiAB5kzAiA3F+ +wFAoTGt4J2sGKXatvgiG03jbg7it92PO+y+spStuBbbCTy2nAuzx1IfCJoFXXAL1xSS6CsJUhqP1 +YTZM3TyRXBJpgdvwdxEcLaBtULI9Qu6k1Tpr3mOf0GYeCBeal9m8TjaT363DTqsnokvXVkKLpuLT +FD9fHEPqosqzyya54GOH3vEtaRbdvNr4wlp6fyh06EZrVC7o9TZ8/RGheEsHbxrdDc5M+K/V5o8S +O2gVaObEYiCrCu594sFX4Bw7epMZJZ1cd3xxgbCJpFiG5qR3Ccvsm48WcZuI8Bb8euoFU/FwD16L +I7XF/azWZRJj6kcxLDfMNpw/31bIOisVTZqvPEf3sk8ZjdZd0bAXp+jRzZy2lNcvZ5F8i+xF/ftx +SLY+fyG5VEZZRXAkkBx4P5qJwErYzhcf9o+2OI+2UxI6+ywPZIA8fjDwSHvyDzIdzcd2M8Q6Ia9I +2ECWGoou35GDirZAUV2LjY+hfeOg8yUumZRLe4zvsvUtVuqAE342WODuBrqkAlBwFNWyDPUXQgF/ +yBktg1oZfc9Wl+h5mrjYa3P6Mjxp/noPtjpDgC6PLuFgsSIevOASoC7a6tUi+Ii70kR1YMklrgqE +PFYwhdEBHEA6FP1K1zoRkbH8mo2WmcQbJmHX90OA+s4repBRG/JZ5DshBKxzwAycvKD4Jij8N3CU +3ULZl4Wzj102ITg/vqT6etLsYLcISu00zhWEqOG5FoQ57+lAmyLR0rbgvvVpvFKvxTuirRv9cinx +IX/Ei/CRiDrK7enCC2BFC28FdXRGXhEl40D4R3VfBikbk65oKn1xDiIYwA7wsdD4fs2ZosY9lRpN +OSx5JMotsXzkOlQloWPsa+ZDyK1loKq2BwTFoK1QA9sE/4usdPzTehglZ9TVp701kEycyRQW6KuR +nBn/fAQXMpgUY/xrkaUAQuBVQMKbjhnuAXjYeAb5nYCivHU4tuYhklS1JSHOVjERAB72NP06z/Xc +OOQ9blVe1R2iJZE4tG4LC6h2kv5U4znCQd/gn28q6tKIX9lUPr5oKOb6LgRRIgs2qt041lVUmv7z +zPqxOYNMU9DEejw6oPQwhWCerOeanLUtlSCXTpNfpuf6KrTscRToFI6F32SOw3Jj/uLgBaT5YsyW +1j4nc3NEKO1zsGnL3Ri1bfDXInvTfF+CvVYd53qgMehS6qx9XtY4iVsiqiHc6NuAkbPvxrizNHEi +GT2Hv8048F0zabPPWahXuE+nU2NejKcPm4uMyXLVaJOhEAOln1f1n2OcyrUfUevIcDdZGNfMyrSY +nPttH+ecQs7LWipljw3Yw47wn74Ts3qokDwOxR1Z11A92VqPSuvve1jhGug0W4TM7sswHmddn+ea +mW6B5gaqBFYlppHsn7hSNIxQ8jl5a8k0/hMfdRIE+rNSSfTHd0wair0O4XY5iXbxryV5dkw0iLmr +837iXp9ie90akuqQU1uwrVNAlhdGLiMxOTZFTjG25MxJtKQNVlzw8Uai8ly5doDkcx8yKbvmgZvd +V/DAJ8DbPoT1tNEitI2wrGW3NsDAaxkRb/5t+Jq/Frg84HV70MYBfoQ8ZR8kO4sU/zmWaQeX7Sm/ +FP2A6TfdGQc16xhNKMnHJHY76ksITbLoqAlVcjmd0bGImXEU265Cuby3WuMEu+r3Z6IBP0T/f86V +E0gUU3DqoSvsTJTYFTB/ll+oKTXXzgqPjyFtxj5tUXCdHDe28FeRwV0E+rw7OwAls6Gxv0O5AiAC +h2AyIKxloDfB27Ypf+15uV/6y9qwJoOSn+ul86i2qXhJxchBikTws2CsrMz3G9Vtdx/Zw07OZFSv +K7DArX6s7iGNh/udUKj1oHKNMV4uLo2qZ/tsulcRUBNePeIYhtsMyLVL7VfjlXIrGDGNI5dApv0G ++LGxFLF9+qtZzIAu/eOCweQtAyVtv+q/dWJJhUWR5afvfgGnMQgNCjlXgokUME808xkAJuLxprod +Ozm9G3OQgBx9c1L73IMJXWR2YVq9Ux+0UxozEUXRipBZxA6faXHH985mHKhadZs9LvxWSQGOSkS5 +iBmcByBKSGqYnaVV0Dw6uajNZ4ZvBb4n+qIDjm4KShodEPNjJ5v2kqpPBfBElHhBHqQlyD7PZgkv +IqfD+icGS7Up33j1N5Xk7zsCMoFixzmALxMxiAs/D6JR8nq8KyPZqbojtGyLwM6mXMNJAEJ5qHRl +IfmnEtPpXedRuaETrH9ClxmIabCx3N8uyFAHmL1sRGHPVa5vTcF2uyYyJNN4J4t8FsxqN6qKniz4 +cicCiV99ikXmc3Cdx1g483G47w2asYJobPc3OBX/ziqpVBtiEOkVQx86k3n489Oul/FBBE4lLMLX +yWZB6wq5R82ebpTdcCQfh5gaJlruq7kGV1WrUTkv0/2GE2901oNIVbZSjl+QGGVh8U2JCuAaIMZG +Bk2BeTliFxHNHgjxrfHC40Urojs6U99X5oZHdGOiQoM3bTu5qWFNvrrN0UEmk8E9/4BAx10gbFL5 +UzHIRWK2zYWJSiX3Af6U5PX3QrBAtfyroj1hZx1Ej4zRJ1RDxUt0ojCzlJp8haurYzNO8iOG4ojS +Yu81/LyIyUZmZvZS6owUSsVyxFVVUglYEq9o+RN6CIX0x3phsA/4Bl5dRTeplbB9hSjdxVLTK2dl +O3qnWB1//SXsXPh3kRhUUZ6HP1VUOFKt1qZ6skx2Difh+4eJORgNFZZRcQ9oq5APsi32ojUUqdBG +vSPD6dsq7RhalAjk1Hu7f9hLIQTa+Y8+KqMQS01gcrrCc8fjvDL1q0Mx/Lm+119yEEYjbqALmJjQ +VIAY7C3oepPmA66ZHDYyzRFcj28iT2UWzBKpT7RbxSyuyvvSa+7Uuo6KlePkot8xIf907mVp9J3v +KgI9Uj1VQtrQWYrqVFj2606putRNN40BqXk8zb1WfEJGnaX+n1jPx3dg5u8fv9X/AgGf9TNLKoAf +edbOoLkf5ZGnv9cvf34iUrjKOWsZ5NVyv/N9RgW0PqR13PArFhIJSjXLsdguo8DOIg+WtaIUIbRK +rPhPUKJ6/qZ3NWFudZIkqNXR0/Ef+adUZv2WxEwqeYA/Ay4CEq3Ykkcp6rxwhP7p2aHVrzzDbrP9 +cCoEyVYtO1kt75btRjk3CbltRSxaLNbBzi9ORDjEUymrOaQedlZPr0wGufNHjAPbLMU/XG78/UuA +FifjoU9zwd94qyyRRJzRVtGFHU4Cy0gjWxx43DbfBMzJ6n3Iuf4zket6GlXgLu6ZOb/cSKEKT3LD +NgUI07Q9nkTT7Trmd/hNB31wnP2QR9U8qk6GSHck+R2B1S1Ua4Hgs1J+72w40PK4/aPduAL+1vJO +4Q6vmG+e2O07NfpyDxoMB2PZvsfKHhf7cYBXHJTD7WY2Lby+FnYWH/ZdteVj+BowH5mgJVDZ9ZLb +cf8fu+/892DWScAgbTf2uio+S1MqPXPhLIsET8lVPdzjKD370XK3NyTfjV99+xUr+GoKwq4FyJ6W +BSW0jXkUQE+qff3stJRPIWX332B9JqcqldV4B8U7KsdtK+RYp3CfyfY3axJlCNmN/N6boJkBpfh7 ++Zq31Se5pN2ZPUw6peHcNiv52VLA4Ik5PSVpLZ5wtNj3TtTAwT9FVFkslD4zhEGsQr+XDRocuzQq +SCDwN0cPBSeZZrSybeSapnbcb7HFq+DepEiPnlmXNoSmodXk5r7rnxw1UNKHnvS4AmGJdpoLLdiW +9uzPx0Sus4TQi40YdtvZelkqHToQRTYBf2QN5BYeqjI/PZfQptkICV0aMgTgMp9JIixuWgvJRZwK +/VbraHX6XqSBiDl2ywZyOZScW/4FlfjLqx5a3vykF/2MGO+ehXOvF2Qx7GLvH6RVEic79pi8jueT +r7EhZCFOEjBfg1/WOHr9wP//YELEuZUaEzmVVZYJ6MwRQRoip9sdUZ+oPGVAoMLQetlJhSS/Hmq3 +Uv1TTfpXvBZ175cwlDlT363VgbIAxIPtATR8bKjswbDA89r2bLRQAKmlqYG0KJm4WGAySCeCgjJF +qAsRqCcRvywHBNBdGuDvVGNFUa9CFkYdszgDio3mxkbusrUFGOvWPa47QB/wIeYU2KqBroU6+PcY +FenGt+cHhMyDOY2B3C54PMBhudINOCxix+HlFonjOt0660q+qlBFhRd++GwR8MIUqKFj1U7HoEOc +tUH+6GQkT9SjdqmPq6OsKe+supH9dZJCSKwdBrLgWHKACm48GvPs4q7KuogTQFh5FXDTtNTh883g +3DAJ9E8eMW1stmMdJqTcXZuBNhQkNs7qBukVtsfqeqWSDmSQlYVv+Ay0qsS13c5ToZOIVnGoYRDF +htxmVSKip1pB89qewWeunzjUdTrHEdHYv/86TLV0jAqMit3oLBT8YjdKvOnEnUnXT7C0pRnjnmdL +UDfLHmReLGjSnqJ8qX6m7ATROCRdgypG+uOJjKTE/6lgzeulJQY3KKMsN2dssgZLyPqpGC6DcMn0 +e6iU8GLvYgNIzGnVyPgeWCqlJ0iiC6XyOVg5S1/bHFgatBh4zNwfO0cwSauxqZYqMDG/JDJktDre +ZhTLG9ZF6Y9uGEJZ2WpLkF7n9dVS3pbfiJiCMJrBiIJRDNtp9QoBJoGkg8/2xln2Gf9kUzdKefFH +hwfWhestqZUJJCyd9itRhzqN4Bdk+/jH+ZsISoXrWVt2E5/iQImJ4IFVpEZOsvxJbwc1x6CIIo9S +ndL0Dq2ctVZ0lgygGBBTiOJ+C3TRGkH1F6ybMGREd0sOE9jkwBZWkSMisYYjUIvz3zpq6rb7NkHi +b0Ez+3Ko/h3flZsB8TlRVVITNxot95y1uo3gPyfQipbuDLPiJFF/RvqmfAudTQwk91LsELIhtgG9 +ciUTjtvTplTTSwoLC3cKRVpKSVasZydq4ffU1NsQfLZUecLKxrSS6nTphEKHKxz6Ja287pnYnRg2 +bGSXk1sjuVQcN8IsLtPdjIsLSrrMq+nO7ZaDRt22Zo7BI0Q8QCsoD2GGAQjI4OVIUBEJq6YEzbEY +S5bH94xAl65gbUa7kyVnJ0DIPt2OyVBfsi/sXz7PqIUFNo+G1MZgas3LUx9DxSq+6Xk+9VCnsqsU +obFqA3NrdwjG+DvsAcuRoEfvQ27p5i/D/GXTznIgIpVLl+Jqr99QuDez80QhsY456xBZiMPlb6SE +zO+eIpqA7Hn4/LBEuObcC445YQxAH7qts3gzldbfVp/KI/w/udFlpZf2lhOMJtNxl0MlAXFZFrRC +A7CDSiIQtYaofizLCvTyMCWnvMr1O42lQktkQQ1u5gVGw/DCVgcQULRddr9A7W9PixjS+gJOpDm2 +XQxUoANBipJVtt5UGq0jchliWoqMGAZqAxkoex/1jozK3Ygxyw43YloyXQq5B2vlA+zJl6DgQUos +gvSrSelOItjfSFcf9JDUhYECOKA7QTAbZ5ptxIys1Ap1pI/KLAGOSAXCguRH7ensRq3eImmpC7sB +Tf+ao4UCMYlDjy25FPiN5NeNvrL6Lws1Wnczv2T0pcSMu86mAHYUvjRoFbmvt/MEPu1772I5t9hr +q/GgCziN54sJTDJWur2yqgTLLla1CQ/FdaOPSbs14P1DRy9yaJA5oiegSirDJCwQPsApMO51d7lz +VXChOT8TpHFsTsNCuM2wLbJirLe/lHb42nCpDVMXExIfHn16+VQ+IZfJFPgDYibHW5ZPVlTR7pGM +HpaKzZ/ZwQSgwBezC72nDQCiKnGa7qNY/WFVjT0SQ5IUvEy3SDVMnJIjk0e+hZQItIt+AcBmg6hW +Y4KPJv3QDgbQHXilXNfoKHUNZc7BeDmg7eTfNKs2YSBi/3+ZiZuqs3y+X/iMmazDlLUD+qm9vFRc +d0Lv6zj9AnAifWjZhlRTmnREGggTp5ab/yCm5LyXl94VPMixNQUbhrOGodaGEGdm5TXA6pD2xdUX +qraBBeo/T7bxz5LeJFrEQFrlps9SK4tU6FCM+Du//suJgSoODc+V7T/v1qQGncq47oogMLHPUJuY +iN9Tp24Xr0Bv6LalAMiEJB3rIv0f5SvZ2ArYiOA9IeseByT9RWVI8ggNznzWrBOcSjcKBoVIA1f1 +zL3yGf+ckCpFtzearILgqFhTQiIK3wBFDnWDW0ucDxRHBiuB7GWCdNxLsX7gEKgM70SkCXfcFxm+ +SrzolPdWLFFxgG2prXtplVOG3C49bXzZk2KJte+c2GGx/Rb9hpXAhZ+mFydeELXAgoV40WVA5pDB +jLUGmuE461z/vdZZEW7QadKc540OZB1ge86MvXL4Tv1rZXLcx0+q5liCFpCtB5/4qqV5waxvoo/t +D+8jtZtTLOyK9FFdzH661YVWkR+Kps3lgSMeUsVjk0o4+2U7cXPRPHAnnkD+To6fokV1VWUqrnnm +C8qPBEToaXUDY1MShUTyaeIXhKn5JXYQqcVDTUiomljOru+nfzVrv6X7cGiwc5Y0+uPav0bqXK/5 +2G0qr0bc55TTUtx5qko3go7voeoqxH9rWK6W72XT73+lKUYihi3qIjJn/Cyu8TevSNv7yMdX9g6w +RrfiQ4yon2LlfnX4bh54Ck5OPDqoh/wilgJQjMc82O2kTVgRV0htGKdk5CHkhqKBTzwG3jVgY7T4 +HJBwfj7qLppjR3BpvzfFPOx43yyV4ZBv7r7BxpsYnrMCNAa+39/7KJJCBTJP/1VoTpbiND7/AQs2 +NeH5Oobr2OSHXlJBgQRxyvkMbmKD6yBQL35YMb6uuKQeNniy+wtlMKOu5W3dtIAgiYVP0Xdz7BcZ +D50ntG7I5bGqZRuXLr8Zvtm9tJCDt/ynHU8m3YXNMpQ6jx+Ct3icYITcI/Gf3yowoGhwBUMI342y +i+LB3cD53LPy5s4ew241L2E7oE26LH15vB0OKQ0+O1TOOdkoo6J6ZE3oXrvCz6Vg38YQBScfkPNq +Y/AacD9OtHJwOYHWM70xqQI6p0lmzw0PxnytW4s/FQiRbxJNr4bQTCVQ3f1Q+56dqaHUkC0kTGvR +e3zN5qkIb5nOidy3I95ZF46e8NDKJgIGz6281skrCkRTBNT5VufQQKCSCCJphQ3N8Fs8k/3Z2mAz +ol3TuTZCqzY1SrR5+m4X2qpGQdYK3frNo+EBpCpEUt9KkedZbSYjVcrX/DMGjnc1pDMQm+c6U2MJ +9v6iWwt1sHarywI+izvLlmJtjrg+nlf7upxdVCw1awzFxHvHM8qNpe25wQeL5AIgaEajdmESAAAJ +rI5Z3MtRtiIbbKwVtq1nlPOXuzhZdjsw4XXzHfBtntV6Q6XCsKnhc6xUDxQwX+N2uwg5mmjVPd+G +bng431ldQRk0QTkLqsQIkpe79azwP6FzzuBzp498rU3rUTuCJ2Mqa3FPB06ubG+9GX8jUJZ/ppJg +RDegBVIk3WSqXohn3VxcReyUBmbg2IjEZfe1dUx869aGE+QncyZt1N/pI0Y4eApfRULs0AHW4IXj +tOKTEmtg0228gd5IAdJIq106wf/gIavxTd6TysUeWn0k7BpkNjQisyozypeR/b4lYOJu1NdDimiR +wtlMh+kFGOZwL2QPoO+EzAWPicKAKzLq/G6rexrYbNs/mMq7zuDwvBok1FkxcrxOyXGpwAiuxLev +9tX0KcKq5PpcULQM7TeV5fOzcGtzACfWEJgOaPoOIiENWRBc+7ookUYxEWczk2WalHgIjJMmB5Xl +0OaOJU3O2cpRPdt4Td6FjUywrRFwdIA1WpV2tF5yFUK4tXUZJU+s9wT+IYOkZBajH0MRH8UMCKKz +sFMiB0YsgjVO0EzqC1w++Aee6oc9SUHfNgAkLyWIrciGxG3OAOuo9EwJaa6eJlq1+Spvmj0eeqiU +PyeI0eLthlhIzlqQl5LfuoCPpS5tOf9214p9AjiGSlyhRe25/vheZU+bh8dQ19EAAZSYw/nO1g78 +TRaIuvXJ1GpFCTjhRCuc8GOJ90BY7PcJG+W1uyjelKD/A1AlmKEY1hHk4jF7hqmfQOt08hG3zDd8 +hi+/B2dPnGCwAf12uYD+50DPSQwq/8tP4WIblGGDx8fM43Kw6i4w9VQjt1cVciPddFSxcNAvuL08 +9I9ujeO6qil1a486hbvBpt3b8KAhEHZjOE9tiQp6WOsEir/iO1gfDFm6Q+R6XlIhg9vK7OHL55Us +r6A9D53jWi5oAVpXerpXE78dLo7OPM9Up7rlEALF9Cb6ReHwyJ7BiWIIaS44r3b7VNgsHuJ84BQ0 +e+eoHbAlj067ubj8Dxu4X44eYW7cYPACVshZkGIXq3e8BQZ6VtykWiLiZ1hQOTfMTWkm70JxgJMR +FMTeociSHVq7DfJkyeimK8HeS7UvQX+h1eHsKo1e3FTcT9LQMVTi72Bx6v8zstvpB4QqomkmEWuI +zMMVXubnCKQUEbFXBKAh9W75/NB5XoV85HBBDrElTEFJV1+baPygtI/cGAJY19stYsAJh3NVqqoY +xq5sbKsLq018qtqsZrd0VfunGse3MV+wp9Qb40kPrJ1OT7bN0F16neRFtT3EBXKo5Vz63MefQKVX +6fxVMED43WPV2cl5570KOpdIoUcLju0WPAxAI8PiIAPBqrJI99O0RhB2YmdG8rYIWNewjHFTGcCa +q1r9n/ioQ4tmZOjuZnedpRHkDamlt5f9GpGpNpve32mz8FijyYIV9nc3xyzWqhjDNO4cM9rBftua +Xg/cfAl9BzNnc0zcWBNeF6DVCu3004O8ypfUzQ8hxGNLk+tdxMZgavSVGyisqwY9rGEMd6WGUQ9I +ATBDAD6mr4ofaW2bd/kVvROeu6EQonfiIIo6/nFg6NuEzNb1YAP4p70m9BTTmmpRx8FM3x7+Zi7Y +YQp+t7H9GauzD8WMHaM5QwhfVAo8mjNx/d0VHeEFKxBOiMbHgC0KblEpuMSXaCoSa77zoWowLj69 +MfJtYwyxGREdQSKtkaP4WDI8iu9JZB9BxJymOj39CQrrdSUYHEIV78ENlwKFfJZlrtQdn8zB/Sam +5Kw67iORomCtQUx+zno5KClR0JYvQTS4Dl3A/zVQpIQKM9JkjMPQQXdlcTPUyqd0DI3nyUtPBFKn +zRGaF15caNPlHdOZ0zt53S/z4lD2HQeAHn+Q8yb9VJ3e7oIqFTGrKgBe23lyI1Jbnmk7gIXyUylF +AHKoD4eIxI0jekuc9qfoufA8YfCu4kKS1o57zuUdk2D9OmrEbCYzKRHXpTlT7Q99douJOtWkpxR2 +es5a6Q2DYQ5Mw5l7NAYVgDJeMR+K/kiqAacy7CshmYdXWH7Su0ak/72D/P7sFyxIAs9/GJ8Eoa9k +gaUI74MkSgRGxcNqDrLT4kqhOETY4eX8kJ1vTqeR5UlVS2nJjSjMUW9REls5pqZJwmIuvIKgkaVc +dFJBWsRz9bdG1dzZsIt+0FUNxP9V5mmwUhcy1Xza6isy/mHaAX1uv1rILAl7OvjE8waklKpjOU09 +2NMuZerI0n83wRP5eUMj9ht3Srp0sY2XMWSBPYHLAnxdbNy1YIvr4immg6VkKIblhJ2paptNEvsM +7nIDg76IBIi3is3fuIE0w/lGYHs53Vf5NmVDlfPZQw/0hz6pe4ZNLcq0gPdpc56l3lDBJLZAEXKh +0DKcnnETYIhlxsDn7d598FL2epNCYbXEM4yCr0YynKvWbpMNiqE68awzHK6iZwame//FWlAFQFEy +LE05q1ztfaho6YjXvVrqt29PcMqmhKrifNYmZUNW1tJirnP9lVH6bbDCWSkIVG+0zOMNrZ/j5IIY +q0FrJh5TSNtKBS88ovlNhmRI+UtgXtvaUIbmQa1N1FBFiCBEtf+kN2MQ2ZQQMhcY13Msfq0NucGL +4gZJ/uKhVjFlMvDnVjS3VIZQjtSgTXQ9q+WFBD0HRygUgwbpqM5yBZVP3yZPQYonNddk7ePKDU2Y +3qYHldnACOXsR/xfrpaDXIppsCNoi6xFbGlgKVvK/sraguIRz9BBzXfLnNydU+hNTExheM3CTpLe +ZXcFpguh4fZPm0geuh4Z2fyG4sYDDdoAYFSIJKn9i/hTXqImd8EWcM2k3J/S3zrWbFdsAwUAcx5c +bfl6OAP85b0e+1uGFysl7SyOURfLIMQK/T18uWITGU7BVWPFEfptqWmHIKNx6fLnaLRIdG0t9zYs +9f/GiSGrbcW0AJ5tCi9Ig9XUvDJdYUz3ZrKwzMQMCDcnVex8N7iW8zWvcLLYjfICAE7mCMjbKzZn +rtsaH0g5PlrIo8+ljYmTX9eBzWt8vNGCIILUJrfF6I1gqR6TnwUVy0l0VHk46wcSu4vEDHaBQk89 +NRy3WGMJIcsx+ZVLru1Kw52fYRNOAxqn4tnInhLS4hDbKhmdB+fWnOsz2ybF/DTUQEH5ovBsqz+m +jgMa5mhk/nSHI1T8HVMWX0p0cPxhzCjeQ69CthXAGedaoFFsg70RnRudoyYb5ofICf3VEO2n+R1j +xAABM2KztAw5Mvyb4mt6l20H0McY4bM9371iE/51ZWJCf4l/+5wT/dwjwCT9Mvg7IWxkF3HfuuoT +TpofdeO4q7K9f9Ih8/HF7n/PBZzLiaSZCXvfOIeBTW27QH0CqIMtzTx1CM4Q4jCMVe+SR9wjwhLp +OtQdc7yW6Xk40TXKTHd9rc3q/Y9cUol8WC2U9S3xE4GyLosNxiks7vuko9ZvaqteaGMwMjL6rMmV +37rsEfK8OnznRahGxo5Yqf4QBVtKYW3VPkcHHMX0OqvYLIAugRP7Jt2VqOxJu2sZ0G34Ezfy+g/i +yyTrzIZMSJIHDgKE4nIOVharru6UZnnrj6Y/7hwVQapgYYtVRcszVWMNqqsf6wvrsTnEgeFP/OFQ +tWHSVFvkZNDfWmArxcpmhA2xWuWftBT33nIefocuOURJlTBtcy43c/28HHIIVc89pBaIXlwplyel +TRdW6qD1coCK4ZBygzkUTzQUhzIxgW1Zc83Oe0NzoEOmjb3GPNgtlp9K1XXP4JZbFX1UAbM5LeKj +rhHL5sWGO26lPkx608rBMLRlMEWET1BxhpwO81ntw2q1/utzn4KiABDsqcaLfvC1AXXgV4wZ8xC/ +8aW6ebKZu5/SrmtCf8XBaQi31WhOfdN5etdzq25dLMDi2RfXyG1CGiQfXC0s7/DlGGra01wyjYqQ +J5IP92fgU15XAZpXuR5EAIQPI8Ktk3quEr+p5Y0F/rSbc046aIB4bCwcUuFS6YdvMFEP/D2aDpx3 +VEIlXcQrU6BUN4kES1zX2LTpO3g8vD8xKdtrW69i6TkFqZ7NsC55GBgdXFkiC619A5i+BBKKjGww +tpLKxG2eDv6/xRyWM5KKCV6WsbtCdGtX7pWbSyHN5NozcmuEak8eX8j3yyempo7wb6KbZbweCnXJ +an4BdENJvFI0U7u+DGtAmEINCYguSfn8rL/g8jsvoiMj3HlqoQPm2cxkxhMyEVKl2ZQZGlHBaKC2 +alczuwUHht6O27miz56JOhl28mMSOerSYQwEV2/31wZkVeHiLpma+VM6KROcBDpPXleHueQgO/Nk +AXmt/YUeFaiDF3+IvI5GeaRYIQgNz5LzviAUTSSpTfCewKi/LTbGAP/CoWgK2MjN4k9+Fo9xpaZS +ZMhFZqkQQE/MOeqUeFj6UwLdZ2Qdm4KVG0f6C7u2QoYOCLvD5X1ln2WInmHoZTWgflmt2TsUmp59 +fIE9bc8AZeq+MKq9/cKOzOp++gPfVo9IRhKU3bbFgBTd2or/XCLFcvqqQd8bri8phZ7eFErNjDWL +Ok4S+wta41/vRRqLSRWt4+wakAk4nM6wqoJh4zUCcT6RF0Bnl50aWy55kWK9+1KFNZbsS63mvm2o +xJITx+YKBUnhsiyKc4AVrmqgkS6gLQjKLchTi55RbvCWBpKwXCxYoIEvE8K8xnzH2HWyWtuDZOaQ +DFWDfQ7nz7R8VGFgsl8GpzP564jKUFgywbVU57eZ9+fQaxlRuvrsoVRiNfAH8PEPqy4g8wL9E2WW +z21QXSbmiZpaiNmIi1ZjDFuTaGSHXiRRRt0s9rQhZ3JYE8buPoByP3eURQk0jAqyRd138tdSBy1m +5BPMvnbcIFEWBBJImhsN7Le92aCM9SvgsUrvCj6A8lzUCl04z4kD9fAhtTp5tXYQseIbv5n5PiCr +8l8kC/11SHQfBSb7ETJ8I69fImzmqhyDj0uOSnDSKep32VQNHwtpNSrDVOqoCO130tYqCZKnKzKB +kko3eof4FTC3A+/MXY6JnXsIpzgZTuSPHUu/rB838NQnqFrDV+S/M/klaHkcCz1hGMMRgTfZ+tNp +tkTeX8vkLbBCRdlchrGIbR/zIVBbDi7mNvbncYPkD5HvrLx9FG2sxKWBxfb1/aJUJpSLqJ66d3aH +o/e/Pd0EknHHARIxpNQDO9gNIPbLPpboqCXKMKCjUuVboZtnMX2f3ku4163rGZi6h0YwoIK6Pjl4 +T8uiTH70abDYQvOed8egyUh056Q3N633ITgHeLuI7vZPjGFjrew649ThaImaDaTJEttaBiGJcSbx +nPEQirngGr1wFRxEkbdNl+EGrtNgz7SN7P+HOB5hEhneeUjZnUo3mFYOtwRyGA2zP1fgu8lNlVhk +PbRQTWvgApj1zEEeQ+0xANSMN0D2pScbO6i9IHaUBJApunxrs2KtTs1fi9djjGzAXCt53IlTnQsU +SNuKIUgNLqnKdlK23n5pjey5PnaTHlDbstOjoLt8Tl2C2g4qXeWz1gouoYNrR74jph3uYou/A8BH +IubF58rDZ1gjshPFUvbG/VmXxQPgrJfyCmzpHMQ0vK6gxrHsSiSVLWW6tNotDpAdKwjjlvytnpIg +IxQStAkcbV+H82ybJelMQIDzmFXqaN5jzrTqSF6+k7+P5MhE7GT74kmqx7hIVbqRotot4tEqz7R4 +uOj52KJz/7aAShdwIifFPWU4+JJGbyf3RGw20NanUVvOUpzEvI+VQOHvkHtTNfwDlBPtgIeGDpLs +gXtm8Ng/wt8lgDCcfAHCtogWYhiHt+z1e+nu3g7gnnHht75tSkHFVnHahajwqAS+Z1BE6xkjWWYJ +zsuUKSW25OtN8aI/z3McDvv0vLsKnCp3RMxdnpoNnTO9BcjPnECE037IqVqbTVVRiFInnwHfVF1z +Y6E3Sknx2oyF9r7LEYNdv+xSUtOoMmoCw1naclPXI6jUvzCrHHFHnmZu0NSHaiJ0/qnTZAZIKAKi +r1i9bcv0B7+xGDk9YnjaR5mbL08vXYkmuy7aDrqUkcWKtk61CqJ7ro5O4r1EUfLfPfJHZVPhTYO6 +5Z7ewWsfH2qLy0N2Ab7xxVJFXvrc1kbYZwbLP/I4G+vMvDwJ15/T8LJI+uosKQ4cpwggAA/wIJZr +l7SUl7B5et/TGg1xYMCe0sybGwMt3kYrFaerko4N0Hj8/8/ZhfuXji4BMbIL1+KOgyp3DpNRKpDq +FvBogISWjLB1UVUhjQKcwJ4hIx+jf/Qw84g11kR1sxRiiUzhK6khKHAA7Y7jba0L6FV383PGhz4w +VN2D1jZJtecH5mHay2CHkEhYBNmjrIqraJsDg3xC3/JbCgl1f3cp1AlaNZ/bWkVabXGcGaQVVcLo +t0N88uzGe2gzfVDAc3ueOzYbCruBYTQiLuxhboHapJ8ksYSdYC5T1SxNUyZr0XWeIzwX5pZuH8r4 +0VGwfXbbk2TCebV24RAHIYibDXMMwnek68OuhB8h9ecxwAN6lo8sVxvUebBrZT6wssdjQ5/VP4/+ +5xMWlm3vOL1nG88/fLk1be8lgVYlA1pMrWGcJ5Xv18uf7HoyTVx2BGU04qbNu5XAafMV2aQByJ1z +wMO1dAaLyv8LTta/ZDN3UmD6ykmg+l0Ic1Qp6PA2oR53F/5U4mK8/9FJbyJdBC1oSQvMPfV1zGHJ +IBbdurIlJVLeinAdtjCze001pc4LpuOa2tujROUufg4HjRteBQ5/IQqv18Q/mAKUoCWgDaBs+m3B +jPLeZt2/LeFCtTG1N7ErHD8C0T6ZOYcwpL2n+Of3UeyXwU/Sk/CRPm9xNkYmDw8p41JSpZir/i7n +3+4c12EREg2tw8qs5loFsezlabNxTFf62cftKxw6FXPjb5v85Xah+YEDsSEjWRbEjbtD5TmngrJ2 +3VRWv5v9/BWqzcj7asf6XYbAAMHP1HO64sNhqCOPPxlCTL8vT3Dto/C4cl0EQnb2tgAJcBn9gMFX +kGl2hZ+ccT0RzhIS4SCFzPkNjn8JY2pjP/KIcTHqEzSAT6oLiwMdsEJRBAdXGlsFceIwLa7MvuSx +M1Y1Wh8STadf1U4GkMHsAIEwiNlUanM9bunZqh88Nv2BF/qq+zr/g1q15txK5yq+z3IQfW7yqgc4 +C0pogYVinlxO9C0kUdXhzJyC0OLEzWSDKPUnraShiPMb7AmWzWX7obaFO0lZ1Jyb3bSXpNgDp+X1 +2UNEhdgDUyFi7v2jvel7q1I561ST2yXk3tVRELMJ73W84QXZxpH6HEY8UuFjEQEctQ8jlniJ9I4Q +kkDYvg4hmWtsDDe8p3rqgXf03BHDSW74twbaqLIksyk0z40mhqvLZM4BjERuSSjPtVHP8Mmnfb+/ +ucaLpAwkmLKhgaHaSV2SDz3kuOwHfKkCODXu3HmWxdoe3r1aeKgEj0zM+02J62NWlaz57P/82rpG +euZhe1anrNjquPSiBPyu7jCNVvD8q6uPV3yT43jhQEaYiK2B8wEW1RVZ/FevX9Mqto4WUohW/gAY +xv+C4gRexXzNhO1Phl55t5zI1kWnUs7uzH4DtLuxFv0L1LmA0g4UNh7eszBqlPGZboNlu5nPCgzj +8mLLBBFWsRBXNH9eFowJDSc1DRpbpOkuLn7yEa3vr/h8u4a2uRUyuldiy05Mcu9+Qavh6BVtpTg6 +t9xqipi/ks3RNQHm0WK1HN1f/2rDWphh9RLoSBhzb+MSboS6GnpHK4kFHmVQxQNl7tnYT+6Zo/oA +QAYv1Qe0RJvrBtBoNuMot4FxhSVYy2JjT/e4yx/i5jv6yHsAuVdGp4Y/vIyhmKNe75jOVNatCYzs +wtcKxekVnYLsH1/eE73kZI3Q7CtdMxNfOGatcc2Ql9koGTp0pVwKA2iCxaVKn1UHsOs7EXG8DgFP +lfEnF+poWy1EM3QNiDD3dNAvnd/ciZ/jX2bVrfEB6P6MHnlAW6hwjLJijoW63AbItnjxdzwoUDkb +KcaFl5UWhdLKnHKQz2XgZHAGRsTS958JTpg5F4SpGJb+09L8CeT6K9hqXWI8Zkp+Z/rdlkpr2ks1 +77ekRRxhgzu3Hn6GrMlfrkM7tHQslPgaDfldHs+BtQ1TU/CUFYT5gMWypNcsVKqa3eqcJ5Imdh3w +6vz8B9MThEbVFveGKwJKhA8Y02Ft2oHor1LkGhhYzZK8Ti6qQk8+gyHamO1ggOuG9B7XmCumXgqS +BoQ20smllno6KHVu6+n7xFTHT8BHeXuEGGSIAOB5x7BgkEixGYP+pzbGYG4BMh3qcbDcPUPJ9ERq +LzegfXg/vvNK9RlHJd9AY8nzhHaVA1u9iTGDu8rXmeDHefFbGlbygcN54VdwH7fNptOdG+fudtEg +yIUSk+XcYzljtuL9pKBIH+vhbwtBl34X8kgPxgIoqhGggPGqtqbAQerqrxvlpSQfhdeC2fCJ5qyE +DExGfhQecdR17yHN/zlSbQCWGDODhXxAeJlSCqNRu2thOBNQ288NlKctKHFOiZLUjC7mipeEGAWO +0RlH77HaE1WnK3MVjPumwj3HK4VkOX6T84bTlQpk+YA8hUs6hyhHAkGPpP6TLs8EKwvfqJIPuvWm +3oKmAOOttpR4yNnDPPakXSMpDcMI+IbUhVwA1dEYmG+Lk6GY6YziBaQ2EktWr8IfGV+pRXSXSCfN +FWCAf/LKIt+hWwqbknDpu5Gl0kgUb6FkWY9+NFIjRLdnIzwuzwIglncy2VpVk3vTapE1ZnS7bXov +DSYno/YdhTTP3OzfccBcJYKdSYmzhwJrECCBcpJjbc4W1smPAPVDiGf+6Zbj+zFUe4gzBIgNseYi +YKBOJ/JvKFJJ0eQtVxR5qv2dSEfo6eNgQRbfYlJkvkxTQP8nSlpMdZQKO2CbF+DFTA0BQclAjt6K +uF4hXNKQjL3+vU8x/RGc18Xs7fFMCyLd5getpGhidrmNm20jXKu5TJ1xLA7V9CSoGVEDX2xAOd3M +obdQb9kyZTrzaBYo6a/L0ZXdm5yXa7BuDDO62KVx7EiLbw+KZWTLSPf4TFuKTEK8JyC8VDfLL36p +8gssDFKyAKkQAz2qMvrxOEFhOUIYJTn3LjqQVG/SmfJje2hNPajHNzbWcJ3qSOk7qHFsdnZj11jQ +nExQGKhQBggwHa/UUFOofuFOOeXAwq2Yglzq+VEffqCWgD9MuuIRmGpVRsiCptOSNaaRgrkwe5XC +PuLnjRvPofqn3oz5ZtJiDZi7+i6wQpnaMg4vBjeXQbX+fmehE4QDbnGDmMyLEIwLAhNOOXaC0yFH +joUwZMbhfjhJVAd3sk9TZMjJZc+OlyzWwnhPVnOBEQGFyhnp9//RDefQRU3172VEl1ryiDywrgvX +/+ax8R5rxf5GlYM0I9Nj1XaKzgGBxU5l0BBwKAEL0xISv2SWODc/8YmVlLyAzRRC+qJeUl55AqzQ +DoJK70u3QjQjEir6vO/kd/0Yp9kVLbf/5/oZ6knCv8eiEc9akIC8H9e/Y7oCtI2u5pNopiiXWiic +iy0Y8F+HcpsD8AolOriou8mnPaTkBSjz9Y85Sxp5mTnzIjtSaobHBDAK+QFijDuEb1AotIs1Xmdo +gyJupOpYAW0/XwkkjEAaSC5fY4MDQh7x0dxfaKbep8ybjnpdhvDbmG+uhB3CmsIZi1qs7N+5/9J2 +6KQtsTrJWQE4QuQ0MTZ/dMxletxwi8bM4gYU0Xv/MDqhyCTUQDhkeB9jlR5bo+XTDXNPNRVXCRa0 +f20AYa+5sPBwqBk08q9IdUT9vr+bJ//U3EAHkQXrSyIitgIQvh0ahk00e4eLq80YBPi97KwLuVX9 +oo0cnIQFuYGRcjryPUpv3AXYh/KNIaSv/dgaxV/n+HrdJr+Hyjl7N59XOC1jxB2wpSUXNBOvAgnz +mnTI/befF8IEy+E3lygcIbdjDD/51LqwbS0uNbKJ+KJKmy5NA0gHclJtUXUyDvm0ot/u8jKV0h9w +IDeTDfhpXtw8lrDsnJ8QYrxYZtTVe9LwdaaYWdo2uGNybyZR5OgcmrfhzVG5dj4GK35qoXFSWdlO +LLiCqfVzo3TDPE4BrYJWxolUcJxCV99wXiTCRLZwAaGBTT1Mvbmmqnxzg4rG3/oD6Uw/XpHnnzEk +XOLNBsemEh3NpOUT1Y1NBQ/S2h3RulEOh8oMAh6SOiHE7ysyiGTaadxfl3aOZ+E7Qjm3ZiFLmJKB +jCKYw4RUoKPfKyCbL9ZqPAXo6zH62IOXiPi/4DfRH5yNyzudwXgi2FQKPWSiR1kNt9+Zc21gnaKw +auxGy5eAO/4k1H9sf/9ojFYWLrcdoBUBth4kIZiL8GCxXfnyYRyl/dbsLRkpzUDovH2XEo1klhVg +jRtMghH4Ha7UT3EHyAI0SlWYrofAiLw+rR/pa564G65mP4Z6KGPAquHklB6lBm4hCbsTOUg4eqC4 +6XtlvvpLozuElYUQluU/QlAh50BwgqrKcsIRw6eHLtCP3EzbLYQOFu5R2xJvam6TKwCChaA9Agqd +FBSxrEHF8BUlqkXt5oyaSR7WzIyovUiFYtjaPp4LrJ7LhgizDQzbZh2wxmontwcNrUvXR4Kvy7ZJ +M/tMbUqARimKfCEaFXRT5dQDsFZtrzDQn/KP8Gb5onCa3ZGmSr4vFDZi+RkaFbK8/d+CGi2Y/3om +pF6kK4CPL8WRTK/r5OGVVFhcsKBJPz8kG4oHCC37cFvN+gHOB22ThLsDijxVWJ9Qcq5uNI6kwv9z +ExHEIWfNutg1UOpkGvAsApLDPjbc0kCEClyoQxVM6ccICpN0oQnA3QTOQw/WJtgbLGHKm/Vl5ERJ +B8AqBqpW4VytfOyB6Zb+IBmOb3q4V5qplmqg1Ql3D1vgmUIAVjfzvsevwKeGgLo04KuU0ufCN0aL +EPmLwXXAJ6SSNdHOvA2uyIWX6DMRH59rNnEW9S5+t7XNPysFMJ2HxKuy/xfoZBHwhbBDbPKoHUCH +vQzM+RBevHw2AqGedSm5Rs/VBrRruJln/14QuKp5FlaKgsfmrANfM6kRTDUwaTXn+HFO+GAP0O7N +HTfrstTaqEf52jeIPUl44vtAELt0l0KRvZlVvpMmNpebpYme7nvvZNzAXCMC++4y+2+xpydDUf/5 +BTeaXQx3bvkwtiUjlbtlqlZaLgGV7FzEqIcOotj8/fOa/jBaiNjujQOHg4JclwAk0cNWK0j3CPJT +54WU0R0RanA19hknjHkkEXuUTx0PrZGeHkaW4iRCgGd+4VEpW92zXtbZq4GIxJbNoXy0MkVuzvem +SR3zsWWDA/rTZ+qzRAySBrukkAxmQ627CHhFvwVKLNxqlUksB1ZURa1peR75568v38OoqpjScbQd +WFvJp1M9CEopXcqL55hHhxzi5xwkUBNUci7jIq0+JEiYPi9PwyyFL4RwEJlrbVr43iSH5iaRCOPR +TIsk0s4teXpyfiAQjGozmG0VbYbyOItBa5jVYXlVTSit7fwpspFiwdmGLVG/2v60cLWVs1BR7Fm4 +EimdMF5zKrfwck/K8vLMLNoVrDLlbbNmsyGGq1e198uvrdg76zJsVGssBGPd3pyWFaBrrnpCDiIp +FrszDxpj1lpa8Vxd2NkTtvyO5O/rP7GR9I0C2obY+CPHFKbYs3btA/GcgQHhD+/oZ9/sH07v3aLs +n/mCkutr2z188hraRsN9BaoRDQIE55Hv0evP41pgd/rEr5pLKJ+H3wpKfArk4hyGBSk6UcFFkUD2 +569isARK1BZN/sduoeeiu/IZDuJddWfoY0bLwNwGOCL+P+YF6ke9u4zuWOIimTy9o9j2TsfnWR4d +cpmsHPPnHiRxrnElLRkW7cIlg+cgzwQUrrtTp/KrvCqwo6jjrMBILBjvn2BDwmEWjtAUkqmxXgDs +b3oLJmjdPgTKf6ypUbszSvk+/UF7wNkTh/3+Zbz/Ch3xO+lEeurnQjblSbSJtEqHGp06HMvKBoPw +yQrZUs4xYDnxCwwHDWikpa7M4jH2Sjn1XHeW7Xv2XhvbQxfTW35y8SQtDJqeRJsn8lM5ypVBaE0Z +wz0ctXj+Y9hAFPvBviEVyZhZF5krhm6JKa9nf9HElh7TW45kFaGl1oy0BFXYHRdNaS4Y7TBjh8W1 +4lx7h6F34XnFLZuGpj95HMo8+QnWx3REGqYt8p/iZimdQh1nl9KADuTVsubJ94XF3J6WI2j74epT +u1cEKxPVDitNKDyao0bl4Xxxytxwehe+iv27keuH/UE6p/6WvVsn2oGnZfY004JAvp7WYOdIphSy +Izc2xIuwBRtObd1ogz/W186LP/0QL1/l2AAuDscwHPWj6zGGHd+4YrcDZmqI+NfnrGyDEqWv6/kd +sAj9oGq5qB6lp59IhMGbksfbiZafoS/hDiGW2UAzaRmXtGBt9ZE3GKSI9JNblvmkAjWaadDJBPzT +VF01VUDe6a6i0qiSiLopScl/1zUuy6jZ6JozHhNRqNZ+NXerLP7Fx6F3Ga+0vkqEeP+6mbgSGvfU +lbbHxSssqesU+k1HLsq2AQTtq/tqF5zy+PHLtWHG+ZZJc2iGqSoKv3h7/I+xHf+6dOQa0X3j0W26 +ytSdq0Benslf69UHP5jeszKiWA9vh8xniUWxOcf/FQSGkhB0G+U1+1ioR6tXbZsGf3Z1i6galLMT +At+KexZwmXkl3r8CPmnBzhQiCxTIBkvZT9f8C96t2SjBzF1+05m5zbV6jj5RYGZfxaJlEQMHI+5j +fYVS7mo+wN47GfB891Z6Xv5Fn0GPsFqAiqweK+TUR75q7SXtE8Jq+Geg148Oz+BsFxW/cYTE3/Wu +RXMx32F2wIinsMnfUESfO6FuGs4sVdOf3Lf08WSLb3ivnMVCSm/dHzrmZfgy53tMoep9YguiGa0F +zhMAOJzqq9Lgo4fYuSi1N2846+AbMFe3lJxI8BGtW3/WGiUkjjAknAGOrALjalZLhqpMcFQeCwCP +qiJOjqJPmgt9M9FquGmY7VgHPiNDHjnUD2dRSDJus2UD3TE73csB/c5QMSrMUtZkVStvI+D8e3v0 +2da1xNt1Cjh165xQsN/E6C3pQ33n0dV0tvxPRv/e/s6XPKhZjnhscZMBgvzLLFYYQan7cq2jpxLJ +uGBtbMTr4oLg41kEEqPmm0MUKMAf7+3Oht7iyVY8ySyW4meuCBN594aq54MoHjAHMLpYEnjjvdBD +xfMe5KLleQUrTqTiWXmMm0FNbgEn7DZuMoRWlJVpIxM/hExkpiY9DXhnPl4IKv1jhQaRqbcH75fG +lz8hS2/vVHKBSQjOA8CgLHeQ4G2VRFmGBHDdKYGHZT7kGAp36HyeNGmIUubIe9S2cN5LoPVcSqOJ +iIw5yPFN1kYDdmuWJOWqY9pzb+hROO20DHdacFMggDiF0nnGmC7ZAf/h9+x8baHC2QPCA2Kh8a54 +tEF2qr++gwvh0xhpeQ8tXHIUcwdgNu3xAFJ1+2mPdP4PqCpOnyyTEc127h8UjOLfJ51u/DMkafhJ +lWhc2wOB7dpH8leDNv1ubEmCkExQRvV7B1vnmLx9hBn3pSIOgmd6+ZKhAFHVqFhW8WFx9JNb4vBY +jD/LO9mIUdtRhmXt7d49bEFpNGIkr5qhjAEYtBNki7ESko7GxkBXleC9jf+6SAROiT5S4vw/cyKg +t1/n5VC2YqQBLrIeHXROnM6yZVB5Bc5L614SjTeAY63As4mFD62hUDP87y2ceirn9zL89ogseAeO +lCoLG7W+IMfM7YvpUUvkVg2/qNGCjVWIw/vjn7HCg+xHKPEfrtsXupdRxlQBVzcqVc7IzGJbMHQb +/zsnyFKnO9/3/lkAHxY6jzZpDgKYPqFLRAwDp5GwubFyuoLw9EYt4Jg40g0ZZfp/RCJRukYuBCLp +JVKHpo8GdV3x0N8ZuU1Ew/C43uUpKDAgJfVCmn9gCEgG+IUo4V8H5Vrx3E75POC5ordJW7j6pMAE +EZd2Dz+y9B9HewRK5h1Lj68RrmPRQ/KJxfsUThrx6/tYaxu/N1cCyDpXXotKozR/ENs5YaC0VqDy +DhpPNWEiEgLD2Z+aMqJt/40Jgpvo2fvnFijf8KDEFEgyz+MuuS0PcHcXAIbQnPhV+Op4v0YlFjWe +gvGBX58172LkYo2q4MTWDDvaABnf4UGerX4z1iZD2acXEtBWa8JHfPsNYyZOlTuDTCnrntj8DHTG +20NaVmWDSYJZr8IXya8xqT99rCACzkjJdiHiCq6jrDKR0CrKQwr8MaVDKi1pd0I/QhZqBySaDYz4 +yW6dX1OBWGRBSzSf0NOu7p6N5npA8TG3vQBSorKhwkCagbYCffKSd9h+/MpVqNJc0QjF9AKcMf7G +02t67ryWllhWLSscBgh6SC0GCy1tV8Ea6f+xKNf6e88mn7SCrfIWECEADt3IIkQiQhKLQZU7LYvN +2D6QPgbfpXZqKT/zMKZ3vsmaE0vkxrwRbiaR552MvhqewewZ2ib0bxAlVJ4f0sFUn2MVq9wH0bdU +MQMVUx8WqbWlby2Ute2ndFVFRWir6azCItZRMXKOyfbNi1gJrvx+j7HquLuM4nIZsQCPcfW6c9BK +meB3BH+cTwhLAgSc94cL3ooD484fD+yvsqaSXd0fJLnapxcCr2HTyavjBe8zF0y/MIcW7SVjazg4 +CrjTMiSOCJecitOfqWkjFsXOb/SUNTaPJMTe+AiKYvfrJRuwTeARootjWDzXmwjs5aygs/U/BvGS +VuTn0wYYnLuCUdq4L9VlTilfiIwOi1q+UvdNfMZW8+HdFtlxlcEi3l3M/SLMRVPcHT6hXoV6L9Lw +lqGPmTFRKxat82k70Lczs7UlNiClvStANcnTyzsNDdEImSJ9gPNATm0fBR6UDMSb3fDlQz2OPtYq +aBg3CLRvSJ6hw2kTU1wafHiVTD943EVtIS0Ti3uQ4REgRdZaUzFch0slgBfzCeXqErfA7M9SI3Z7 +LBXh+XfZMqjsb9t1Nox7HL8BbDMnQXFrcj6XUQypIR8QGOA5nGFF1ZXuZLO/JjGjxwVGwQkSXRyM +KNid5BYWgPeoO4rXDYJMsxGJJHZLa0m1XPxSb0iwgwWspwyDyxYfmcQyLbYntEMOTrSYTxwr13Ui +VOyx9fnVjREgFYh7YfnPbbb4l89qLwbEZv+/c/UIvK+IP16Jgw6Er7C0K6CwC3OLRRYkXDbi5nZn +4pyUzaiaGe86eEeW8+X9v2XrzsBgaI/TxT72Rc+6x0viNV/cxcWLzDeNZLcqUEm3JrBvY1J4pWKk +RNe8W/+IHxGdRmnlLUC8IG5Cse/7yE7wqds1MnnWx4qfK1PZTfmgjOT5aNi26nrLkoPIUd1B3sYt +75DdrhkvM5bYZfxaU3iuYJAu3BZpcmMBm7D4EPw+zuVTOhCqSChW+1tZ298FX6SPoMQz3pQoIFAo +/8AsGptMEIrTSUVBlvyB/mc2OR/ni1bNOT2u18IBeXt13sTln/fBNaB91jQWAZO725KomwTSjcRG +PYoZTxGfUinB2aVl1iEOt/4+U86bilETzkezF8zcBPxzjT//k8NNESrACeOE6SXtINlCoXEL3w2p +MpLzbergusar/Vgp9mtofhCQmKfLOzRu23fSWlo2ZWgWFELbLA1vHLw+OQV8clqcFcgYHqpP4+3P +xkryfGdYTYiOBzvxIiC1c2GBqww84sw4qsTNuzvAS1HJ0jM3dFzt90/D/Kn7s9jVCGBaPYOtQOoj +LgkarJuifq9bK5rElBx+S7Bp23vzlwx9sjyVNj1BfhjwsEzeEyQ7yHPHRUI65PchGyJvB2NudILk +X9nrlWIXZAs24Q0NUFw2lUWuGrU8VxeV8vZLiMJXf36k6hirbdUlvqp3SzpDQLLPjioD+7IR78Wc +mXxIodxnWsJnDRegzX6Ljlb2ziOr6eZ2Pw4G2iqTMwCPHsC/Kdk6pdwaXYjiq+1FPtC2PcrBz8fa +5s+xx/VLxq7rJdjjdPiyL7VgL9yxIpp9WxdCLB2TiOd0foTPYVVkJ1Oh8MRu2gtxIF19H4TWq5n6 +ZWYWqYSglhF/zUrgZnAwItypcj0v15Yu1xB2vY9n/BBg/fRTqUiBEAXjYMGnwXD1IKNt4tmrS4mQ +KaR0hiQU16wPdLoGrowXXacHSvj4qNiLJTZ9KHlx4M16AkbcoqkKoQkOA8Cu0caV9N1BOWUMu+VS +HdhrwEUKMOfvX8JLkjrX3Jd6QydoCkcGUzKCxpcaTxlrSPdJ9qHuSbgAAMiwa7ezzuKfW4hg85Ws +FCO+7rth8Ac1qRBqheOh/J0utk8323ZOZjvSGeYoFhqwjMlPWYHEntt8gP6Dpsyoh7SUGWj6MQn3 +tAgiGbJjxhSTQ2H3+GcO5RW05EKxzLtsXBKl9SD+AG4E379VOxsqUI9dncFJeoQYKTF9PO7rVQa+ +PKeT280xMylkEOf2t26vvwoSAUXyCWT7VGlVp7SvfWe6leDRRhxSmBvREF7J+HDN44cwQYM/Woms +4U4CbYB2V9LHKC0lnA1JodbKpGLmGz5hfD39alfZbOK9BhWqYSiDuhPHXrYhmm2rYzUul5DkbLt4 +WziTSreE2VX6KC2M5byF8E6+QBv1FnOM8RjOaRuMp8hEbBmqvJ/NvHBUhnR4yllpJK1rdW5ES089 +QeSBJZRd9J1+Actq107IaPxJ5OUZDfyPU28aG6IGS6wwQ5f/qpThCsR1kzY6zhKuCeYoeyprRO6S +O0a98o87L1sAYkKOBXOwyUplZVOSQhm+gYD4KOIcuhKntnZMyuj7PyZjOpJpGfUDccRIU88iwjtR +Pi3PuTn9fH5YFk5fCdAxVGZbWe9p0JxTez7FHYTecRr0qZkaAsG/RnFTH6+46SB8LYVpJqN0k503 +5Wzw2vWnC+DfrjLRKv5Z3f0LEURF2Sl2tF7RKlANk0+1Ge2NlJJQdBoqOwcNpRjuCcZuMk7tk2it +hixecatMfp9r4gcFG3hSvIcYa76GEibdyF7JSCW3OVG8zsA4NazWiI3jPlMh6KIOWwKSte4ybtIv +ufo5bzw703QVjkno7s5kTkNSRL+7XiiuQGVltIhNOvZ5JSlP2s39FM5mKuySwYxfXcj6uZhbBRAO +JCy3d3Xa2VBvysf/esv39jgqdvBq5YF3ZK7im6mKP+Q+yzGypJ/dfw2EocUfSmnLPiRNocwTEcn6 +/fvHGRMd0Jz2xZ8v7hOqiR0htx1xf58YJznEbGSeRVhg3GZxAl0+W6eVtnOhUEkj4S2b4jGWjCZO +NeorDQYHyb7Zzsg2PnfK6hV9M1G9w7vWLmyOzu2MkOIfQ2G5FJiAiENO0w6M6GibtBpnC3V/+sBb +1o9cwWimc+ta5PIYitj57oOxA1sLCKiLbgPNgJgl6x8WIGsuUZkQhOMJM12XNUdswelC6M0wLAOy +2D1fR/gi5yamJBPNdO/zYxYWW+GAJx50semLzXVV5oianmJWhu95UcjX+aDeEjAMtM7rdWGS7HOB +12bEH2IGF1dufLgC/KyZE7zofcSENujY+/C8BuzGOow3xpTxypJU3UdJo8UKl4l+x9Jw3eGviEUt +JPG/eVUFQmItryKcDIDxV+AYiiol/2VDdhZnC+tVJVzm66m1pQpfTEcxJgTX5Zl0yk2osxgRw1Jw +KCqwyT/qcZTYGknUZkbsuqjjdsawyrufIrW/qTews7wbEe8LEAcia/FTx+pOVET2gJqGpwHvhFro +Dhl2AehZqiTLn9/HevBdlbIwZR+swYhEpJ3XppkMHKwXIE/k6QpGJ0GtfwO5Jg4ANm16COMAi4tH +OZSY3D6z0b0xKN3wtSb8P7Os1yqDOf3syrHPcUu9Ri+WN9H2mNuDAxResofz6v3FGxOmV57AnhzT +RkT99Dz1b8KX/AnBvd4FnI74Ug/CVC2V1Ko9BqDix1p29GnWg3N0iBqyUTWBqDYtFHai7ibLncwf +uK5rM2DqMZDJcpNlTsfoQxP0D45iIoPeMbRn7xsgmd+H27AThTCy1vieMogJSmZyv9jj2zFf3n2B +cqVkC7O8RP6vhVLM8aq4QUpySlTK4EO7qQXxeFe6oW8mG3/k/Ltot8Re1nSm4/D4AXCvr1AGOW8X +ETlrQ8EJogpvgQtVzakmzDAqMwr++QbSEDnTDgump6Swr6K+yq27Ttzy39VEW0QtWQgWGExxvbsZ +NKEBdAIC6keisc8ckNbclBYfvyb+kakcqF4saD4SoObvaDky1+pCYDJC0sjXmk0mgRppqEhXH9Mg +lHDdlLVOkwNyb3CkoRgT75iIz+jMA7vL8RH7+Xyb77sQLb3mFH4eRvkRBXSBBdxUK1UznbYN15UC +pMsgBhzo5OofP3ABj7T5eNkiWKFGYGgl4iUqToip3ooNC4ZitvSsR6qFRJaYWPVxbJddCgBCA2ua +7c80/pwIPpMCARLPHMzXRbpuBjlk8RgO7CEF0knFIiu2+9FdY6P79hZOViB3eRKO+Pp7U14a4QKo +hrULySUjex32RGnlJItozCs0bNHMnanESSZlX18FBkExp7D6Wp3DddDLUWyrw6CVgotCxMaAMZbN +ZhJZHtwIty0uZQjZWDxDSCoawYhVwQBJL/P5cWyhHAN6TWUuXDQaWDyQFV7KJdfkYyaYQhvXoO1z +asHqXyjOxM6I8vqeAhMslPftoihq784SVTq0fCMZK8hkq3a+CZb8EsooPo1DvLcby0vto7V5I++d +J4MdBeR5BIn7ffYXgJa2eVUc6O2Y+l+h3vT33H+5z5IH7bFShno3O2G4Yd3yCyUlTVJd+hgnkjiD +H+YW9X3NPDH51eUffgGS/Io60M8Ku1qu73k+tOYYOFvIYi4zuI5d12tbRBPB0q80S40FVu2/JC2Z +cYHWedgec7kvcvPa10fDoV29EqK8N0qXDLO6KAsT/69q+PalNb5bpLFiCwTH/WtX72MXZwoTtXj9 +Hhf8e+l4TCxeSVi107tNaSS0EiICZxLiqMPmj+llWffg55pTWSVNOax5VE3vHIlWjrZOkS5e0Vec +cetUDOHUK2A3O6cwn1ri9+aVuQWxhoyyWhnLziuc9c0d9OovdTCx+xZ3cKqMxJoUbxerlpUZYZM6 +qVB0CfZKaCqh/X0vQzRayvgkEN0Eujo0FmwFBWYI+taTGG12Fl+5EyXyQoPBlF/P/4q2ubwmg92b +TqS0CfJ22Q6fdlKrEltUNBBapFvJ+Z8f99GvrI4VPyLvHhc1SziJ/45kSBKSFVBBuBAelIZtb45a +t9uALfuFWVDx4d8qFp2E6aWEAdC+ojdFl9X1nE4bPYrvNX/OMRPvZokgQWk7c3+ln22xBXxMrCpS +IKAJ0M9SJR/Br1txTV3p6GDzahEnmj+OH9I/ydw4Z2TNyzW6Ha4DWbrxarg+S9Ne6tpb7heX98JJ +9fdZCV5kz0gX1F0HhCGFFIxwEP+B7W9/PeOoOUOXo3DsVcc9HGOSucxYbAVTi2omlXWgSYJZfkDT +F4wUByKS+xEKggNMU8ueBdL91EwlHxxXjrnic4Fe4PiCNEsVyVB6FtUJBjAiHUt524t35xGumWq6 +wztNiGqwGSviolixM5+vYnjPKtz82ok87Tm6O2vREYR5gJNKbsy+zCVgYPxLVtEQ4tW4vzI1oI6l +0Em6Vi+/FDtk+HfU/v5moWAKi8sXTyNcBszB9qNYHEobp4wN9IZcZ1VCiZCSxN+Ob1egpttsror2 +Ete/u3k1qLhBnGQbDFd8xLpTHyXlfstwHAdV0e6m2Szq6J/Vi2psrrhAtMxpe76/SLDG6RzshRof +WsgsVi3Qt+MEyAZM2fYhbSHSnbiWzAOqXnCY9J53H0mGolhf7Z3+lFnhHff/gZwY3/mvO4tA59T6 +BaoefLmcWsCKfmkbLoSWhXqdqM+zbArbv92U2e3HBm0Iay2LmZ6wbeG4MXbcltWTBApZ8x69fEXq +pRgIZO2ZyQQ5cQv1hCOtyJityA5K9w2VwYosa5l0S9HO3TMIKpoJz6SCEgcRPh0W+uT57zQdWx/7 +BB/8EaP8g/ZqWCE95878fkoJNUcwDub9YY6IOz6MKCPBsbEpAmwqPMGsjaBcskSfIeI+jTMN3ArW +KbCoJ3+DjORVcC62c7IHTQN3cZlGE5XZDJZSvOiNk1MheXcYKp9iF5JPM/h6DDV3nwkTj95soFsr +J9wEeM34RdpsAfvD9g02BHy9dVgq5gwi0M/aiaEwlSW0Ry/TvoPEriN+RE2XRK8CEkJemHccbpNA +UWXP1TnbAWPdef9JibCTQAJP3kuliA5MyCthlCRaeRBZkfkNvdkFpBzHQpN7NA1KNJ0lRwBcV7S8 +WD1RvEoV+OJI/YruxG7uqFvoMKFf8pKi3EOi/z1ub6ix/wWiz1gi25CwT5RdMVCnaTO2/Adp5U3V +r9/VANYoH40DHjbRP6deVMDjZ+sBLkw01gRzzd8xGwBolySjmgklP6+4iBQFHZrAQAHuioD1Lrba +4+RQ7m+JiKmTDyDKx82LEZta1ajJ0oUmK4YnE7fS9/7mjIG7b/QsqIqWSfoCn1dQeVEmi9cVCmsC +vQTHAuxN9eEUxWx9vjsQ3c+Pt4T8CNHHr1wMwMVAGvPFgHHvxk9VHxWkyppd87Vhd7XXfcPYPFAv +Frve729h69RmO2QziIwPwcSADJh/v0FbLxK89hPXbpE4kXkffzO4YvAvMlkWY9KyXXYvs6bXXPKI +KijVsYz5L6FfNB46JS6IRHodc2LSnyAUjqd+u+ADe2FwgGwZmIEs4VFFAmDdqOjPefdz3cc3JmTf +4DADYFGqrX6ntfUcK0YhOhMBHeDHT3To2wlPo6YI0ezMEBV8TAr9rPqhOLLKsA377LfYRqTYnsrS +7CfQXfQ1ovxJlrnEfPPWDReMRhxZYoU9sOIdHkjZw+6f0Z4Hid/yxKo55dDY15cGBdCNqbvQy5Dh +ztNvhk8GYHV18Lehh0iKt+GcHH33HCOxyHg2nGl7qXeMchojsmBaJn4urGsJd+7Bk9HbnaT22QVf +Cko6I2n1og4WCa+WYQR8/VXK5aO2ijm9PQ8uAAfxtuuuhzPh9BPJ79w2T6r6PyY4pVXy0+SnHc+t +I/n41Iv9xcNgImpod/2CRAEJwuUUfuDowGR2hNXC8IYpcB1fVk4thxWSUyyBkIQLPYvyPkp6mb7l +cupaGwvFbqcbkRqhiwMsgL9PtYdIHiKwc/VDvJuYvAWNuDR0Aa4zIM9ro1PeKQDyQn0b5C6KJlBQ +5tD5nGP4nqXcOEOn1oHEtnD9r4dmEzwAHWhLPsG97R0RV/DOkBEELb7waKQFfV6BV596PzYP+lZ6 +AehEJZVipVnqKtLPKrKgvzzSXYIITJxQT0idE5o5eXngam1JnRN/Ojft6QUL+iYp8AGopazBgmxH +O9G+V4VFD1zdoaZBB17MgQ8QAFaliWGTBGv4ckP9TWyb2dPPDWDiHtQjiI/HwsHTU+Yerw72RbDx +AZYqhXYsbqwyxjVgi/q95FlkzrKSpVn4VLmTF72v5SduGlNaZecto5shrRrbCnwUhvDHl6H6bh0Y +xQWUf4y9eYdpI3Xh4D+HCrf0YennC118P2GQDbhxbqAAY96uay719r7sodONK3fBo1foydqeRSyU +3Un1hWW+J74sQc1dLsXk45vvfVZ4d1pPl2tmIc64BwqAyl0m6yl130N/O9SG2mXkxB/x+v7CTYj9 +iIPr0MVdQ8pMrMdVuJstnd0A8bwmL/lLRYl/+70Bzvrc6jb2PcnDIPFQVOgroYJiTpS+kAUS8QMg +6t5tQJOcqveLfB4bsQpaQTNRWUNBamW16/IoDbDEER56KOx6R0jUUB2vcL0uGjfILmZ9uX1wRFkW +yNltDzf2LYnBuOlD0wT0zVQMIkek2zQ/1gVfqsLQ3cNxvEcrj8G4oIcEnBEyLV5Y4qCISsk6CzDd +447LR0I0Xl3+/fNxguF2Odcsiu5noesYL/nV/mPCgbeHGVPLnQeOUOUFJrVU7w3/CA7QwnnNqNr4 +ZwnNvPy/PREBRrmxdOxLcU0hiWyBxncx7r5X0+vLN9BPyg7QaIqKeX3f7qNkaGc5LFzuKx8urekA +iVvDdQZAX8YrhsZtsKp7xLBAQF46+svvp7YyQHqvv6DMJXFV8h6wBmhTyMaskaHCkgNiVnbOw6W1 +j0SHez84dkyy02kzfcOhMGB5FCy3yywHaWE+TCoGGGJvYgW7KyxxWRtVAk99Kbk/HdqIStbtjdEo +KyZFvlaPvGbSRElbOgzNlwSwucxT1y2Nu8AD42StLLadQ8gjUPJtmgPVeQqzoWfW6W63K4khvULB +IqbLSa1XQZRQ5xCHFnMcA2fiqopJ3yqsdGMcGbJiHsUtMgkdOytm1zcPek6TDYNrkbUZRENmJqjL +YcFQvDaofClp0nTOsEiReE8323Ox4I8um3yvI2dEfdpwRI713ZaFTHZeT/HawWz0447sUAFzHbmj +SLDMiF/ts2uIF+V2yZDGvvxt92ccv0+jFbMwIR0p4gI0Z5U06sVUZw4Lb6uBMRgBaLi8nXuHiOVz +u3vCH9GbX8nxIHlUARqd+1SMQFwO7zKRgI1wDHY9OHWtjvcJu3ucdQ5/QM1PXl6vv0FjbRY6exGJ +lfEZrdUyeqHfFXsocI+n9f82gUBGISdfbzq9DPNs4cqz5unBU8L/M0AzsNjQuFQwlsZgtvESm/zK +LOP7gDQtiSDmPDaonkjW0cOWwW4LT57/4yr7QB9MFJz/xfr/1MGQStCR7lH3PqFMBm8PLsXliJ5i +GfxampPFHrQ9ELz1Q3leXmXLjotH00d/0tvdQSTMk8KcBBs7nNdQLB82xJcuUbtGzikrBdxy6z0f +T0BpccJXHisUfNRSbD2m0A+PLoQoTpmawzEUjBHlbLH+4XZvgk32a/TCA3erebbfFaB3HiLtA1E2 +kyO8Mj1EeuUbYMWoDc2YQiasNGUMIdrWkEkuvGo8Ma4cMnVz8MjbtN6Dk3o1zBooHo3JJ0aaM7Yi +fJO+2uvF0+T4LRWjT2PC9U/jid7l40Ci4yAqGxxfOU9A8x3s2+pQV+AfnTAGb11EdF273Qppco11 +aK8O0zHhivf1dSLM1zxP9hX0Ltq2pHt0LGHO+NxGWlWiKzspTJ4+V+1ncPoRDGYm1ibKSQLyobl4 +kFbLYnEdzN4sNlrW7ouKGl9v+snhvXhhA24n3GKv8RlG5X2CUY0k8A9qyHxorFo/b5tdcP4p/gI6 +0x6iJh9lN7v0tvw4L8oPzD+mD/qdJyY3SUBCv5NnG7BNQBhpgvc2e+a1bNZeff0NQH6nNNsGqsvv +mD60bHI4wEj5SjJgoVTlrBiCrcb+bTEouQXPOBWdrRVnz04EzEg8tScFUKgmFWDTkXaWvU3SJliN +yBewu11U/hPcbeF6iQ0FvhR9NnaG8Yed66lXwm1twgByXK8OcuOkGskQmI+W+wIQ3GYiK6e7mQzJ +jFOZeHR0/9lq6Cg= +`protect end_protected +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +entity bram_pulseposition is + port ( + a : in STD_LOGIC_VECTOR ( 3 downto 0 ); + d : in STD_LOGIC_VECTOR ( 95 downto 0 ); + dpra : in STD_LOGIC_VECTOR ( 3 downto 0 ); + clk : in STD_LOGIC; + we : in STD_LOGIC; + spo : out STD_LOGIC_VECTOR ( 95 downto 0 ); + dpo : out STD_LOGIC_VECTOR ( 95 downto 0 ) + ); + attribute NotValidForBitStream : boolean; + attribute NotValidForBitStream of bram_pulseposition : entity is true; + attribute CHECK_LICENSE_TYPE : string; + attribute CHECK_LICENSE_TYPE of bram_pulseposition : entity is "bram_pulseposition,dist_mem_gen_v8_0_13,{}"; + attribute downgradeipidentifiedwarnings : string; + attribute downgradeipidentifiedwarnings of bram_pulseposition : entity is "yes"; + attribute x_core_info : string; + attribute x_core_info of bram_pulseposition : entity is "dist_mem_gen_v8_0_13,Vivado 2022.1.2"; +end bram_pulseposition; + +architecture STRUCTURE of bram_pulseposition is + signal NLW_U0_qdpo_UNCONNECTED : STD_LOGIC_VECTOR ( 95 downto 0 ); + signal NLW_U0_qspo_UNCONNECTED : STD_LOGIC_VECTOR ( 95 downto 0 ); + attribute C_FAMILY : string; + attribute C_FAMILY of U0 : label is "zynquplus"; + attribute C_HAS_CLK : integer; + attribute C_HAS_CLK of U0 : label is 1; + attribute C_HAS_D : integer; + attribute C_HAS_D of U0 : label is 1; + attribute C_HAS_WE : integer; + attribute C_HAS_WE of U0 : label is 1; + attribute C_MEM_TYPE : integer; + attribute C_MEM_TYPE of U0 : label is 2; + attribute c_addr_width : integer; + attribute c_addr_width of U0 : label is 4; + attribute c_default_data : string; + attribute c_default_data of U0 : label is "0"; + attribute c_depth : integer; + attribute c_depth of U0 : label is 16; + attribute c_elaboration_dir : string; + attribute c_elaboration_dir of U0 : label is "./"; + attribute c_has_dpo : integer; + attribute c_has_dpo of U0 : label is 1; + attribute c_has_dpra : integer; + attribute c_has_dpra of U0 : label is 1; + attribute c_has_i_ce : integer; + attribute c_has_i_ce of U0 : label is 0; + attribute c_has_qdpo : integer; + attribute c_has_qdpo of U0 : label is 0; + attribute c_has_qdpo_ce : integer; + attribute c_has_qdpo_ce of U0 : label is 0; + attribute c_has_qdpo_clk : integer; + attribute c_has_qdpo_clk of U0 : label is 0; + attribute c_has_qdpo_rst : integer; + attribute c_has_qdpo_rst of U0 : label is 0; + attribute c_has_qdpo_srst : integer; + attribute c_has_qdpo_srst of U0 : label is 0; + attribute c_has_qspo : integer; + attribute c_has_qspo of U0 : label is 0; + attribute c_has_qspo_ce : integer; + attribute c_has_qspo_ce of U0 : label is 0; + attribute c_has_qspo_rst : integer; + attribute c_has_qspo_rst of U0 : label is 0; + attribute c_has_qspo_srst : integer; + attribute c_has_qspo_srst of U0 : label is 0; + attribute c_has_spo : integer; + attribute c_has_spo of U0 : label is 1; + attribute c_mem_init_file : string; + attribute c_mem_init_file of U0 : label is "no_coe_file_loaded"; + attribute c_parser_type : integer; + attribute c_parser_type of U0 : label is 1; + attribute c_pipeline_stages : integer; + attribute c_pipeline_stages of U0 : label is 0; + attribute c_qce_joined : integer; + attribute c_qce_joined of U0 : label is 0; + attribute c_qualify_we : integer; + attribute c_qualify_we of U0 : label is 0; + attribute c_read_mif : integer; + attribute c_read_mif of U0 : label is 0; + attribute c_reg_a_d_inputs : integer; + attribute c_reg_a_d_inputs of U0 : label is 0; + attribute c_reg_dpra_input : integer; + attribute c_reg_dpra_input of U0 : label is 0; + attribute c_sync_enable : integer; + attribute c_sync_enable of U0 : label is 1; + attribute c_width : integer; + attribute c_width of U0 : label is 96; + attribute is_du_within_envelope : string; + attribute is_du_within_envelope of U0 : label is "true"; +begin +U0: entity work.bram_pulseposition_dist_mem_gen_v8_0_13 + port map ( + a(3 downto 0) => a(3 downto 0), + clk => clk, + d(95 downto 0) => d(95 downto 0), + dpo(95 downto 0) => dpo(95 downto 0), + dpra(3 downto 0) => dpra(3 downto 0), + i_ce => '1', + qdpo(95 downto 0) => NLW_U0_qdpo_UNCONNECTED(95 downto 0), + qdpo_ce => '1', + qdpo_clk => '0', + qdpo_rst => '0', + qdpo_srst => '0', + qspo(95 downto 0) => NLW_U0_qspo_UNCONNECTED(95 downto 0), + qspo_ce => '1', + qspo_rst => '0', + qspo_srst => '0', + spo(95 downto 0) => spo(95 downto 0), + we => we + ); +end STRUCTURE; diff --git a/src/hdl/ip_gen/bram_waveform_sim_netlist.vhdl b/src/hdl/ip_gen/bram_waveform_sim_netlist.vhdl new file mode 100644 index 0000000..944afca --- /dev/null +++ b/src/hdl/ip_gen/bram_waveform_sim_netlist.vhdl @@ -0,0 +1,1118 @@ +-- Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. +-- -------------------------------------------------------------------------------- +-- Tool Version: Vivado v.2022.1 (win64) Build 3526262 Mon Apr 18 15:48:16 MDT 2022 +-- Date : Mon Oct 30 11:46:12 2023 +-- Host : SURFACE-EY20NA6 running 64-bit major release (build 9200) +-- Command : write_vhdl -force -mode funcsim +-- c:/Users/yuhc2/Documents/srcs/blink_clk/blink_clk.gen/sources_1/ip/bram_waveform/bram_waveform_sim_netlist.vhdl +-- Design : bram_waveform +-- Purpose : This VHDL netlist is a functional simulation representation of the design and should not be modified or +-- synthesized. This netlist cannot be used for SDF annotated simulation. +-- Device : xczu9eg-ffvb1156-2-e +-- -------------------------------------------------------------------------------- +`protect begin_protected +`protect version = 1 +`protect encrypt_agent = "XILINX" +`protect encrypt_agent_info = "Xilinx Encryption Tool 2022.1" +`protect key_keyowner="Synopsys", key_keyname="SNPS-VCS-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +RgPKnWr9n0dGgttm3akiFhAlfB96usOQYxnEmPhGyTGg1AbizYAjGPWLXBWl50n/d0IA71ci4aJB +wt6mtfyNADm3ZReK7D3mKu037BOgxryoEwwf1kiC6q/PllxsdAgEMfQrfHJ3E2AzSpdYjoxVYito +y0JW6CUDcWvWa4WV0EA= + +`protect key_keyowner="Aldec", key_keyname="ALDEC15_001", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +M0l6KpOGH3jL8eRt3NCD7e2USYnkg5H9GAnE1PKmnjiouFN3Y8kjWA2PZDAQLm9UW+TsC1HeVlzO +WjNCHkjR/6ubCsIcWfpPZWdIuAenlsyq8Y9l6b8vMj8JSbDEOiFF/GHSbKsn22MJdDJKEhHFK6GV +s8gR2vywRFwG69gIRE4qGhVB+WIg8GJrDpDMYH6lCjMkTrjXuKDUcNlJN3NPLuhJ7tsditwf1pr5 +moJRmGpJnip/rGm0g4o4A6ev4CtePjoao8C1wFtzHkERX9oenhh7cGjDMejU5IrLv8NxFnLj1FpB +9MuF1beTU20NI5oAn6zLiLiOtXjf0ghU3AN4DA== + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VELOCE-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +hAsrUfp6Qgjm8yBjNYTEtQmVQmMxzL8TE/3oiQSxSI3+yEkXAbQCXkT9mo+LCdv+fGECOB0istHd +eLtbsiYbxjxNxYkXiUrRE5O+aSxynIray+uF9DJigTEUZu8JJXUbzxK4DDUu1Lm9tpGps4+Prz1m +0gkj13RT/Y/418s2VTw= + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VERIF-SIM-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +BP/54Wm/GJmb1jy0bxWJJX4aiKyiWPVh4X3VL30BQrmX4PlEsNKzBJH3Qu8IIYERfnFP0ifAgboa +vypMQ5Ed0BrMePGkWIgT6I8hxJCMFpHdkSK7m1giSKyZzFfTOrVqoNFXE+qdzLfY1J5hBWCvouYo +jllavK4N3gF9FLScH2AUWYVMcVth2QPaTAU2NLnAUNH8kgtBjBfc8/KbPPTznD1QNVqvFstzcbTA +hGQ1ETVPvINQ0KqxxAG5PRhtQD4+pC+hr/Tvk+RSvGyBOfy9zE86OXkJiYs9dSFhNiMFmCPL9DBO +se4OxNNC0/7aBtb1mkSEA9YFDYEb9jS7Jasy2A== + +`protect key_keyowner="Real Intent", key_keyname="RI-RSA-KEY-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +SnzT9DVH3xlEN8nrr2YrlvTO5qj7L22d7WaBcuKyTaiHoIwwFHrC4HQbfs0TAwkdWcOgmJoATPSF +F6qm0KiddbrlERF3MfKUldeGBJtqLdX+zGw7+3JD7S+HB9dIMOFOHy+IiCZp1/Pz8epKpi238cel +rcVoJQKz406wmXDvOo8KsT+XhRLs9BVCrBErPGGXKYDk6NXAp0duOgQE9DbslzMU83M/kUC7uERV +tQW02240peKQFp2elEZC7Tetvgp0TaFTtJiKN45REi8GQUCKGa85JjNIk1qb/+k95TIIP1xrHirc +6iX7qbwnPetv8TVu2NjkZ0WDEK5RXdOXcxBwHA== + +`protect key_keyowner="Xilinx", key_keyname="xilinxt_2021_07", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +erkR82V0jX8ytva+9MzEs0c75Z7j7TsgxWRLNAUfbbU28i+U9YzuZlSfYU75M0f9jx1gvxtBrfKv +cNHVdkR+i5zfHDZsDwfMEEBhs8wzDCKqe+eex6BBEvlIOesCPXrr2RozQgaQ1PBh/os2Arfu+873 +BjsVxFJkbhpzIqlddOo/XZV9Yi+eih7A7pXXEBR6IL7Poo4Ka49MiVQU0xJrDTm+ddOuMPDRRD7g +dsxS/uzdcBcO2myV6g/7YH/C2Ce9s6+UywJN/0JeXSqwA7bsBqqnfFicVAT0lckLopMLiuzK7dsN +EwhFeqoetciFrDIj9+o0xDMWBZhgNP1u68vURA== + +`protect key_keyowner="Metrics Technologies Inc.", key_keyname="DSim", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +R+BI65BKLT0I9hEtsxGnDyM5XY9gzULeTPOSDXvd3KWOzZJAx6C0xlbyZcFZhAEG/QIK2yd0wAi6 +IUWxyF/sx3HsqKjhVi5KxnpuXDBOZVoj811O7JukedFVmDW7OHGtBkuiJ5X5irw7mfsEKRQmF/1i +V6lj9HYHZEjxtDeZjACsLY4y1QxWalSKT4HIMOHznBLL8dLbGMlS+ZmFuFn0gcwZavVl7gTkTtkf +W0gn01A9ru7NKsf+iLX0kj4dgItPu9N2g02M1vWQ9UUQEVvfV7lUc7GY1suibrD8aEkhH9S7lZ7n +bFsT4qxyvzg8ML6v4g4v7N6VuyhEtgFgNd725Q== + +`protect key_keyowner="Atrenta", key_keyname="ATR-SG-RSA-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=384) +`protect key_block +jNUVKiwH68vHsU54idgvKwaVJcoxTUuxfgrQpbpmM/IpesWA3wHsGzYClwAxkKzw3KRnFyQqTWcZ +yj1EQ2CMBxlJ0kyNbZW8OK8pXzeigToZ0U6Aq3Gy+j7wBbhe83wE1Ygn82sK8dHTEulvaRLn/c5r +ispy1s7jMKIvYNzoUuZrgyBQyfaYmdqUia8XlQjFd+VwzhTXKwzvmaqHWyaHjfBKeCooO7+oUxMG +OJg83W54EVe9ronFQ8Wr9EOL8ia7qelCAgyQe/bC0HHCoMAm8apI7sX23iMR/wMiPP5V2bQzycy+ +rBX/+SWkqSeIE1FLm+muFPvrE7iLwJaW8d1fzdFFjAZ5aIXArbWNfwbK8S0TczXc9lEzmpb69rwA +UJIrs4alo81qGQ32UFhjuMQjX75O9Od1HWHDj5PFaT/Ja5Ly+bK8Cc3gfO6dCE81m7d+B2JBZ/Hl +tBA19QuOAYwT2EIPOdpaVtCULb33cWODWu3qQFhZMmDzKTb3kwpcr0LL + +`protect key_keyowner="Cadence Design Systems.", key_keyname="CDS_RSA_KEY_VER_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +MnzcA2swaxH1LRacKDou0ZmiiMRETbWIdHgeBgyQz7ILronsXLoB/C20WuFNGEVSiL2/51EZ6MXZ +vMHI8fFcMQCJcuTBDBibUMKv6bXI9s8fTbtrBZppbF/R1icG5JYhqmX4aRnv4W/dxJRjI2L35nLN +Y48E9OfgfkD1sr+IRwx8WEKFmUhuk8dLe0VOK7ywe3XEcneYvrz+HhPj16bGmNfMwNnDgZ3gKKZD +hRnys+jzvAX3HyISrErWXhMKrhWMxXeTNFJCqNQ0LWAVHQYwyKnF5xVpyXSuGNSIrva+QXqOrZBG +3VNLirNVtMRiKLfwZeMaqvswkqBDAa53utlAAA== + +`protect key_keyowner="Synplicity", key_keyname="SYNP15_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +d0xXkKtsKM8GvXhDZr16p1+oE3uBtD04BJ76eGGIEj/CFECfHVy9qsJ43oSKjas0+AJr4GFFnVb6 +X7gJV6MmX/OboC9ier5joUCGz0mxVzkRZK9a+LPEDcg0K6+cLE36kr+FfxW9Uk2816EHBCMCf5mK +A4eAhSmAb5Nq74F/q0quiG416npbny7faiQ+xmPDfYYiM3UuMKaD4iE8ODlz1w5xThPllWESf3LZ +NTkw6fozyTqZ47vvE21O3dgIGAY1v+C6BwlCK24VwPJa1xs9csY+qTk31j5jjAc1ExlB6QF7t9UH +lk70qdNPWxT87OH7kFT8UvPO1D6BTC3/WkDZfA== + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-PREC-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +LYhdzKTvo93uJrAaiP5OfCDuOnu2BSvPnxlv6I7h2n1+xHtj34LNNKzWEgOg9dUV9cYDaHYUjjEt +DKdWcz6mZ61d5qyxAhpv67fc90v7JVgtOAcT94/Yb+AuLxXFcGA6Gic7uoJtUgz6JmTnb22Dxdjc +KuIewDj4IOTfP8XGXKTaF+cNp0CFrQgTAcVSQFyLFxr0I/9h3S+GZLecA7ntEeHEOfCJzPvy0ddi +7MCdQWECLb+fXC0IAn8V95TumcpINiRAX1BHi9IGJ4QoMrb3jOCrPkFhDMTJj2aiImUWdi/l/0QE +d7wcXlgIEYVeoKYUOJ4mqy+zZPUbLNeOPADUDQ== + +`protect data_method = "AES128-CBC" +`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 40752) +`protect data_block +eCs2fQQluNDFiEBy/aOrs1YQmpDR6x9oVxtJ2GxUuAr01DJR+rHVkaWz495wLadHk9t6eQwh3gkO +6BtHwb1wEa2EB7iFiAmltpuw7WdAWBuYclgps1cXi9Po7DG01PDsown3vhbZAogNBZsjflZtFj3u +QjAs6z0e4E/KnuNJoPvyRIyEk8krYq/lBcILt9m4mMq1gFJfbNQijjEXxUHAlbr3jDhM2bfVlqZE +AyZqDappYnMaH6HTBhWo/UZ2b6Dx4TIymxlCjGVokZSISob+sU5254fq8woFC06WFquTcMu7ZqfF +0W4hLuX1fGBjkvzY6vMNygH4ojCvUqG83fGjFEAVgWbAASWp4yLlul+hDVvtGzbG3YGb8xm+1jm1 +CnBLHrTT1e5LamRIry3F7DkwRtG0EZOi6B+jdsVEhQnoS0aARe0lD0CAFUMI1a6JXy/zPy25LZUG +Ng2nyJsBiXixXLOopv7Z0S340fqD5o4EZWjKaLm1hPR7jjzGDuaYeHAA7vPZSq46S+gdV08/8uER +QfslMuf4faYBYqgr564fT2il2viOgJnQdr1Xi0e37NQoewCp1bQJ6gTFmcfCjk7BTUAV0Yuxgf7E +llWL7Bcv5StzUf60KJTU9i+hsIhkGMKTYhB3kklYHI5wPt8n1JTCUkdC/2/ITgg4qtCPvm4gV/9i +3qZOgDbl/vi+DlmSAnDcMjpqk1pJmWltuhwr2R9yllEKhMromLurSPGA/c1uYHbqRLpjBF27YE1J +MmUqM8D/oK191A30vwZwacKFbkeBul1Mexm5ErR7rETAWxklbCoObTniw9RNjlEspYI6vHv9k1Ry +a1ymDFfCaVzonAF/vQZFMYjo/T85sAnS0OzqbGgB8ZW8C2UNPvbRP4ywNxmI//HTr9iO419txgCj +pvnomC1uISdNnYR3OgA61MnA6DvgpwjA1dHQsJ/tIHI2txcfr8mf8JKKVuHdZE7B63CnCm27I1jL +076lx2LB6/Frne+LjO8REofN2qOM5lKRiyu46f8nCIC3Nd5hJ9UEsxJfjtl6UUjOl8mLrQdyHDHa +mU5TjUiJUF6UmnGsvj+ad8kg2nFJ3CCEybcC60BEhd2RrRJtf3uS3FT2SNElaoBcbqMiwY82AIut +N/sIePPeQdPsZO13d3DjWxFD9JnoK+O1I3QHIRSjEP0+Ztv5/o4mc08IDEhqfikA9AZjpK+rMNqu +AQs4CQp1VkZNTbLvsN20HwhicgmKx0FjxzR2M5I0mLkA6g1cjO2LpkihL47sgBg8TYtSOLJx+W0u +4JucKGFj9T3c3gVAM/INP3EeulhgfaHyWrrasSqgpEmzOS0GH3IVk2vd3/tYWq4lHB5QFGuKsX++ +3KdEUmsEOfbdG25RE+npQQbVa7BPUV+/grU4eOoYxRBAFdPO8/MJkW4TFx203Yt4NQltdx8ZclC6 +TL9Ew4kj9S6ridcmSHnPzPSX7xU+1Cj5GvHMhxfaGao9ldL5MLK4FGv6qzo8Ae8PoT91M0YotBCW +5DOU+jU1vubpkgvyQIZ08Yqm7CopIi1ssNYncC1WQPvlxqyw9m3RaFiUgB9dQL4AzDmDGyq5GO2f +ymrliEwuRpqI3fFely34rzVe0l8IhuU77S5Dacu55n3rhrIJWjyTw4KfjKlqJeoG/Ca6iH2bRCaX +uUSrlklvXoiNjYzLsSuTNCuCBUI5CSjZHg2l3RUSd3x1X3taVVudpz47T33lijdos4Cw+YIU1Yuh +NUn2hnXd9KC1UDfpJp8qHsObq4q5u/MnE+VB9scwD9NXDKCSw3xSV/M8EMUYMVA3iP1kXIbGIeRu +XLouY/OOFlEbruK/PhwyGs2wZww1BHYPYubM5/L3bhUquL5eqRa6eS60igCBhf/8LZdDQpyAJCbV +SltPvUATcpp8CJAYJF0Rt7ty0l3TwTcEjMIV2zsu2qJVNs3jX1zaA9oDjrpxYtsx8boeZOXp6bb+ +1dIVrL/1LoRcPG4p9TG8Mw3yRp0NtuvWDXF/Ort37q/+TRdQxFOJPIl7q2lWVKXWoA7NXTN2Qnjx +ippm1WPEGO0Qp4kw3r0kxPKUeuXysZQqTtgX8SxTvSDtw4/ofJ88abvcCrCKMai7vMB278OeNXnE +6ikNAskbmnMFI4AfS1w9bOEVZH0c++q4eRQlEm9llkuwF1RkZoTfppPW7Groda1HcYhl33yAuaqP +lUVASwy7L5SvhXGvnduBQG50/RDD+yf5Psc9e9D4Z50XK9NH/zJ4UZZvm4sKzgvA7CzekKb2de9/ +P1JnJPnLk+5iBTCRkZPso1Rmc/zHDHUEzyroV5XvrvUJMoH1xvmvfu2yQCcc7+Kn/nyeoP2LHVM5 +25KtWuSErcfD2oRFZbt2MMdLQVGamardjq9WrRZNtqETZf+UDSDMDjKixtxHwFcKTDQRqqEVQ5e3 +WjrK5bVAFAGzXIIoFKz4BNMFECjp4w0lYuAlAAZ4QeLhdaMMgOX0CQdAJBd16TP3W6I4eiP0RNbS +uifa4MXS0E8DwJUQQDymSn6+k/R0FZTabifRFKYBHubTYXcBCqnQr5uP6tUl7LqvxpLvOSpadcQh +pyP2yhGi5livwjvl+bc7dsHWAkgq3iCjhpCGNxYTghZQS/78zTPd1XwRz9hkh9iM72RwWcqs8aMu +H00geQOrSg/1KYtw8rA/MPHcica5+RXpM8rxl+mGNy5ZOKkgaLIJvJvKcKiPWDUoSDsRbXEEPeaA +bjHbL/QndI1Ih0/PTHJtz6GujtMLnSJ8AmVlTj69hBwH8EsRy01uJIm956/58PvkOP6lqsT3BisF +qWz9DtUoNJln2UqZgH45J7XBBbPK0T2ggiFvNlx00J1NEvffAz4Ch3i6E/4p5rfvpUmEWA4MJ7mc +ylgHiFg4oa0GlM9ZlpDp61ecV69Sop69CmFZU0FCeavo3DPHSmwSLNNQMSVs1xm0BRlO2BCNKnXp +uoeFw1+/B3t1XydfR+7BVAgQ6jKZNyFqVqG3yL2GacGpO98IqxHxe1SP0sFAYVK0F5EvIg9Sm+9X +Zjm6+/3k3ZJoILe+NLSSkjtWEWiMBwh1GOSRY/0CVVvkUdJFt9BLW+CNw+lVlgW/qo7/JzTRaZ7n +8D5ll16e0TzHKIwTPZQQE4VovYw+ZCINZ6lrE53l2Yrh0EuHL1YzYw5zwjbuYfo2tqyuL0HtBk20 +CP81eXUwm7UbqRMd2Y6gpfXs05zdWngzZ3SJ6zGoWcd+w4cnhj9Yjrd1ertuZoqb2H0aWNI+3AuP +uy0Od7RJzSrrxMVjanjZMPGYirCoa3Apjd2oXbF4KrInRjCZZFUH/ExoErdQxWHnzHSoDzjJCb+M +u4AtblAhLhb3cqa7QAp0w2Hd5AoyiffqUgSeF/NtpAooTDpE3obVw7Oy6JqId3bB9FlN23x97mve +1jAdUlXUQrutDnTUCBl67HVZVUSuZb+g3lC/T6PGd8fXi6FQSdIF/wdbYuKyQfP1rT5XCXsyKJls +2VEoT6iv1MbBViA4HfkwMdmjm2Q8W8cqYa0a0+VFVZSNewuccUOWHK3ZlRDlsL4DUJqebV7m8w84 +xpcRSispylbIm9P2QJhYVvrrVINXtscliX8Tl7ebxR2gv7b+DKEp1l6HBVD+F2Jb76Mnt9GxQZmy +BUAj5Ibwvi5qmxL+MWD3kxkGefZrDWXgp6uPnrytnA1iJlJsAa9WoSF171R5IMS88PrSmjDsJoxb +1BDsc0snLz/DE9dI4WZHP5RkSmgDrZuKXQr96bU/E4RP8BMn+o2rLsw9pUiAhBJhcF5t8+e9h19B +8bZLTnKL6rkXZFqjhdpijmkIv0WSKCYi6hBGO/x2EZy7lDXzvLtzk0YzqEp00WFqoRuvuZEdTsRx +u5KiysE9q6yoR8JEfmve0Y/JI9ycQRU9nltYnrU42QboIo/soXKWhrrbMRwkIgMd/rNJTBTvNHPd +ftoaM7d7MQ5CJTUzm/mOOWDMxPwuv0QNywBsftPLG51FnZ/YTpfyKQldhBBQiM+Ha+iIEa2J9VQA +kyhZFA8o92cZb7QVJ3yRFzWh5MipqcContknaS1+PjRpeRyIOFY1GZvyvhNf9+Thoo5v9OVJOXld +TD2SWYbzUiEyh0smyI2XbI4JZWJge7yB29xREqzezLsNPgo9EPHfjmn+oUhqkIlPBiXVMPgLnKeL +JcKLfAalhT8vGi5g7IAAtsanWh6SEMme7cT8Uwm/AaU8OiUUFXBlcy/1iVa63w2Li77I4l/O8qxO +YNN9Zn8gfB/md3fqnvqL+pX2+T8pyNElazzXpK2xEiaD20WvupP3LsdpNH0gFutYkTAVb1yuKe0M +dETrUT9wRp0eXoj9cOMUqvg3IuB4vKN8Ed4Pl/2xjJemvuPBg7zSXFdMU0cuuWY9KVeTHuINiZFC +/WqVW/9wVqdoUhpQuxTGOqJD2Kc9/5Glr2fhUDyM4tW3pYGufkldigJ8rWZcPiE4IOOo3Ller67+ +KYpXW2WOK6PEbgzN6QpWZS8J4fL4PyLB2IkRsGxZZ7adjrJ+nOyjvlJDsl7PqhOPtGsbnrH4ytRd +VtGMem2PYdjV2Gm04vd2jTvAnZ06ND55E7reLCatLAqTI7r935f6F6urLfNBgFOZc5iub8xdVbvG +bneeOSrHaxebXnz7A9WQdhgs84TwSFA5WxMxLPhk0/+oCEKtFR0bH7fggzFEBg1CdZ7W1Vsz7hkr +hPHLoY8nnetU+f0w9THl0/Oh7ykGl2k/oWi0hk8+v5h/mAifIIbEKnAZhApKdKhwv3ibjvFx8jI6 +xY1TfnnO1pNZGSbQAwSDIfaAxZbUmg8vZed4BmFmN0u5CBUwv6Fk+LZk53MD0ppfdo8JT9gVhMON +7VL5moqle3uwp1pIRg8smeDQ1+jI6Zgc9Gzp/R92dCRKxa/a4eW3lA1mor+birdwyQvs6a2Otn/i +HPS3RA368SsxZXR+R2UgbqU+cUXNM10A56Pv7bV1I3cUJ+fA6AuUDrTaK0G9cRPw5dCWwZjP65bh +i3DH1LsieahyMg7yC/NI5lTCPPanEvS3fcJKmJeURTJIHa3mvSirm1pPgFIbGIJ1pXfwnqzGjuOf +i7yFXSOJrmKRUGMM3U1WgNpu6iSN/m26kHsjQKAkDbvfH9BhuBe5QgzHaYlJfMSqKfjxboVHpd4O +zPEzZvVADCzyhUOGnOzx+aEUIb+Jrcp8QMgc2qQ0AA32ek9giT8eBE9a8Vo+Ez7Ho9Ksf7lAU84K +drXYs57oCLC08Vuj6usm2X0BPIfY6NUVXdE18QCrI0rooXoB21+QFOjng1hjJECGYKZArC+kjsuO +xpf7kanu0ZVR0DsBkzG0Ftg025CqIEJeyBQgw1aVEsXp4zEs1wBdMCN+fz/aLt1Fu3DSXuzlVu8K +h+A75erH1/X+qeSX7dxch/4LjRwe4Ogv3kYgRF6NxqSflLq2xgQP+WENmIZtEYX1W0+3VU6Jmpg1 +63siYb8TU/nUaDFdPrWJmge0ItomkYaTEXcfwJ6R5DmAX9JiDnWO+ff5vlr28xSNxfngGrjdkCu1 +AIaH8ii9VAqHnonw9OA/gSUor1HK306sTnPBscX1QIuhyKswzQC7xSkpZiuPKAgavIagr0/VR3lg +2w0p/4sb0tTTfNOQqKhsr/yZjTWiOg6gSQDdy2W/9B8sZgG7ywpJyAQefCh3asugi/Ct6vV47JNa +kg2IPyrW3aubCZeO4jJri7g09+1ECowwJKt8hCkSMik2Tl9Jbs6Iek2Ktu0tZW+XTI73CUWH2Tc5 +jzllMFTZ2qm+XBRr/5Eaz1uEHaEmwMKtBkjVEw+y5p2C8gmc1po+S2H/DWHy2QCM9qiDEe7GeVm1 +7IGnKTIVbps0x7fQ9LwHj3ca0a0/VWgQHXGaSpTF41U7qhVi8LR6ZUztybN4XWzoUrIAzuD7IxS+ +nuG/G/zaVKHkqaN8UOVkUUduot3Rcu0hJ+CTYcYWcZIrb3lFVeYQOEAsOcKSSS5PJpJoTnphU2+B +KaUm7IYDnTUq+/Bx8Fh/Y+jV1BXghKPSmWtTkw8fYllxTkJPd4cctjo0M3de5lpTKysBPb7eUx5o +pN0yb8YR1w1x9oiT/V4his3GmkpO5URRLVyjs9g7EdfRWl6QkZIj+542XiDOfYpAY8U87uYnQidL +9FrjcRNCaYLIiFm3kkqg8uwSjS4touTbg71RnAKhXcpPccCYz5wBuOKwYsubcGyWjP1JqRqtGENA +pcfKjt/8S21yoUIo8ju+hTfj7i/oRtXQ6zaUptujDeJZ8OjHDMSSX9JzmEu7lbsiJ9GTvBCpCwS9 +h0BHQx5UE3LuvFxdHqF3g1fFiYKGkDTSFFZ8+yMrt6T4dwbvSZA1PsugfWm/dylCq9XPj5rSeMBh +Cjt9PDdteETi7st8UjPnt6bhqqzBzPo7/qkoA85YMmM7MfjB1k1G6YRW2qhf/6OjnsqsNPrNd5du +Z0ZXZpIIkU1FGzkqaNuD/Ywo2a+/IijhJAzD0jmaBiBaKxdqEpJxYRxaG/sIc8DFIT9n5oBTgLxL +pkNn2Hjg5DuDY4W9UQxShHx1nfnXymbybVubJoDi9ytbrHTCcJ5j56gwoxzNLCF8fJvQw7IyNrPL +hD+95/SGJ5ziI9nZma4oUlc0WYUqmRyW7JfSub35tBfmSnBlibVBeIN+nXViBlyEXNTdAoV9+PpK +Bjiu6Ph6yi4aXnngLQZKELYgLWHaScdUML2QTdijHVw72XqxSvtx4fcmrDNtGZipy+SEUn6KDiB4 +G35RFapoG2+BvEJEsdEmyikM33jQy26Pz93iGC0e+hN5+JGpL3J8JN4qdAYN6p13yZJNRqEGYvBL +cudmY8JLQTYP1yPMS+1lWHBpvvsHYgN4iXzzFnIdJuCQci6GCZYsKdkDcVU47Kv67aS/0/zCJfqu +5pqvZu9Q3QGtisRULgW/Kqui5ZMKm0ILA23hy+MDZ6ELdZre21I1bnNUD+WvJLFjsObJJFv5ZfuL +QJ6oT6McePtEHIdxIJN/sAzIoNH+/mISwBldOT0hmaHvJOvlKGQCEbmtZAQLVeQmtdfZhQek8Out +IcYZfdoNuz+9olv2pyrbsEeZ62VmNbuoC3Eca96qbwqk3eqow2o9RM124tp9hCZqc/0d6pe3jLDU +cC5QOAJQ4pQp6foexRGWBotFaGqkvGLRu6oQRudqce0Awp6MC8EBt2VezxPvO8f/VYwH6ZO5CUjy ++a7tdJM+bZxLv5hH6gOdhUbYMACJqNzs+wSm9P1PB02KJzKDnXZwE1OUrEsQr3Sq4wGpLwReJCgI +bBwDl/0CbogQK7lvQdaGQC6yMltlGifwX+eGOIe8qdkwNvXSOw5vAbgfNxm3YeTMoqZRQw8a95ZQ +cMPUX1nE1pzuB0+J19KzzsEzdxFjGq6G43nRgqM4QZeWp3xvLeo86Lf0odJ/OjTTObMLVaW/25Dv +2LvsGxsuxPkvmMCRhqWtp23Df8eLwSob3cte/9fESSyN1Ni2ua4EgQeXIRh9xCI0La3lL3nt9W6T +o2aqA3Im4fmi37NSBa13YvGn6sxw1ke+b5uho/e/26bZmMvl3fwskh4ouVXc+COrkaeKwviymWW5 +jizu2I8wMRcs48KnzihDFDIvs8k2bBXfx5CWTjaB7FZzY3iq9areaGrz7pjw2J88U7CwPnKMXn3j +CXnHWBjs/r1fxp8M11W5zU8CBp4MDfQ4PT4xW+ijMlYz7/Rrof/72lydE08mWnS08mH8dsy60FIG +30iHZA8tUvFIc+QA3JmmLjhQS3/z1efL4h/OulW/EYD1Rfm1ecUJQyDKSRE0+LRU+QILtCE6lNCN +2EJce6LAc2cfu40ey1mHAqw4iZFggU7ivo/zD66JoGLUqMXgcf+nL+dwc3zaOx8cNyTHy4vZjVtB +BMhdsbrQzyXM5bmVRbF3JR5Yk+GKqJGFx7LNPU5YzJvGYsRekYrrRDTXKmX/X4M76Dxe9WWQnUOT +vDBk0FcqQPMfAxMd8bk7UkaoR2EB5xIdwPnfUcGiC9BCkWNbDxQhl+NlxCEHm/BqVWlmYANhv+Yk +NawWPIy4APFyAsTXY7VpAc0e4vrjllNcyPCF3Q/ZWJ3uCbE5ZyR00TJJLPaO/8P/Ze8/CjjvzME1 +Mc3a9Y7Tc4H2YwjS07z67kRPTYaF5B8Ulu4KRj9Dot70jZH2XgftYkETv8viLa6r3rd1xpVMe3hb +JX/TGV6I3H+/5bAxTjP25RY0yngFvCrAXjABguB/zfzopYsTyERgQXFnm/MvD0FnzmDWjSD0lfo+ +1FrMO8+AgfTUjh/NWihiOJv3RkKzud68bkR9T2LENGMOqFUD/GKWMPhybUtxeAqrs+gsLcclBbRF +Jo38S/BjYA/qDfW5mrnWKEztTyFFaXob33/UWBMXhF8vcGd1+yf8dPejs4ggYufBixPGi7cgOfM3 +KIrNuhdvi4zXf1fBcQZTtI2mQ73aKmP3DkWMqguh3pu2ouXZBoIbIqm1lka8PYDE/qoZFTMSEl7T +Bx+0OkOnocpu1MHJU0ijTlrGDVg37I+fToZD9tNH3MX0PMBU5fsa2H4VdEgi2Db/YKqnbxrevD57 +Y5ibWofSj7SsnRgdx0isqHRZaME9KvFjZY5i0eenYw+WS6xDDvBe5x0MXZ0mEEW9AIAxZ0zRFIOE +frDT1mOC1et4tbl63bLFLKLzs6ScVzNS8KdSchDhr0ZiK1Hyvo5qytyU9JcbvxBlYFPsz+O1isX9 +C+vdeX0Ms3fPAOkaXo7bnqOgrqUw+msxLcyP8pXTc9aXfq/rgijGLNjWlXptqKXHPWWCQ6QoPm3g +1B/8ULRghW1Yu23gaNshi7BHDITWrdUnfFxkeUoBi8oHG41oIOQGzBAGTkoPMqgboX400F4uhnVv +eh2QBZ4RWdDYKUv8F+7k5z4Fm4KvVyUja4eOGkbDM2n1gFp+JTuMjFbWgSjEgKIsdiWZ50pAGwYO +uVVtGzLoKDKiS4HFMqiWlWUlNn+hedatBCef9cJBBwRHQJHIXyQ25hRqSDdXrmrHmWziy+pUMWCX +tsIF6U3QXLookZsm6jOqHTotv1IIArOhpmx9UIX4Gojq4JLNr1fj12USclzQHzUYvKlcUNnje//P +svSzBxbv8Ws0aC9oV3deXjIDxqZ0l8eit8p2Qv22h2WToQY0CebkoPm0K+GOlPYjuEhMZKqXw+V3 +ITJakc+Gt5lfII4egD13r/KG9viQy9gRLPtIlTimTeAUwUOjFL+4pGeDALLZKkIKIC037GnbpnRA +2OmWUJ0NixATJ+cG4Pzy+Bn2gguOIoTrCQ4Ujn//DalEGPt7AtQpA6Vm/jPsRfDlILK7Jzi8pKzU +VQqVdiCza0/4DWgk0CZ6mp2DCRlGAxOpJLkMYermr3gzxH5wyJXkcAQkwn02EBWgcDPnMGsOENkO +6IsT8xQY9/UB63JRKK6ahxx3o9gp74+SbWTrg8rCc514+jH9j/QhK578Uotlt4ofOHH2X/USJA5a +aprU4K++pTylkrnMid+Aag+d/b6fjv3qYPL77kKqmmiX56rcUlnN8Wv37b/WUU5OYbTcZ5w0NjWb +x1uuOQ9BOfSwfOo6HpZ6AXM50qSxyspHFycgp9CQ6vOPs5mV6SPb+4KrAeLTI+6lPPqzIVNj78Ys +nxYj4YCPrARWjxduSd4emqkcZMpAX9wNctHXlBOndejm11UsrtNS56kmI6p4u3tj9kcEojmliuuF +Ez6gxufEMsb+OE4c943mWKbnSMUA0AwIJsJMmBbne5cj2vjVQVmOluv0sQHsO7Yoixvxr9BNS7sh ++t+lnaociivWPSNLRu9HYnpEdEtPMtsPHMoBGVgVbKWc7ifKSq0li9Vsbn8JiTowXHU8xOlU6SmU +L7475AYcUJDXQ2m5HQSgqPLA5Navuzcr6QmcZT85qYLiHacakcddL1G3j4M51i7JImVBS9Pfzu3A +gKNkyMISeO7/5pvM+zRDbRjm+nLBls2i1Or5DbZu6Tbf0yfvMxbntjrxXRwh6uoksI/syrZ+SR6/ +4D4hcobpitM0GDp9I1IYhONMtzVdte2fqzrZF8Xy4oKrnX2aMHN77QkClswuE7bkpYDFVgPT0Rxy +vDCr3OByFufQmdFQRtJ1vqsUi8jkKxz7vS2oprGL6qICFVdbrGIsIaLDoiUGJcZ9ZmiVrE0xQ+5D +qB7gjjedcIqlqxMBJRWViYU6/l/ddRbcrZ0gdScajPTmv4aeuytfEJq+PDzoSuFHLgme4z4cmx8K +AZ4KBNnNYjpLwIegsLFDkiyEige2BzSntTUyg0n0lj1Sns2r6wAePOPuEz/W1dj/sqNz2apFg8df +jyCiNMOCoik6rIfByY1r4GgGgOa42p35WsNtte0ZyLmlaDuUxP3yKMqmqVUyJ00DKyOOj9bPKZso +VTKmlG7lCTJjE73vl9y8hvBqdzcPFcfW/gSi98JoaH1A8kGAl996q0JoUvO7ZaqpjgjlLz8C2yy/ +QN4da9aTnIl13EKaJDSg/u+2sSbSMX4U2Iuk2MYQTdoBVL7jZW66xEqFwGRwhrm9/yg4dHabqtro +vz2M4XhywbbmXKJa2kvbAsmLKKm0/ELPlVBL3TZ78T0dzjnQOWh1IeX/68mEnkldqg+p74NPmRJN ++8oUEB2pA+S52ezrMyhmAA8IQOIL/QhGC1rnfEfC3wgOG4WDK+R5PHkAOXjlGbvzqAy7xNv6abjh +h6umkN9NrNMydsBogsueaaZ8IW9wXCcVhjj5WHQor2IFQehGi6XBR0IgTwTqYUXOCIjuTB4nCl7C +8qG6NEvAYflN6aWEiDABL+7fIFzFiDyAW7N6YdnVV0SmJ/ALtEvqK9TeVCJv9IkHCVAE3OZJ35zG +qlVXzeWcEze9Ce8lZolb73OVshLfQtf8lf4OQ+2cW58qLJTDAiX3pHPXfBJsc1JLu7X263sEdnz1 +Z2hOdM1B5xP+7/O0zr7Knde1na75jw4V9f5yYelCFLeKo32/xHyEJHgokpYM7IsTsh58040SMGea +mb4HzQh6F2ySMrHHgxKyItzTTSK7zG6uhR1TZdeMj2oxWrH9W/ehsI1MQZX0rAW7/MNth7takzli +k2Dk0hMsF6i2ROneFhgsA11IvUyoqZ4ijtLVKeLnRt7TMCFuDHPiXZl9xfPSaDajom3/zeAH9rwU +wTDjvMNgKe35mQfXpy6dEQtsNrPVRgIiO5k706z17H7Ngx9/8mUa8pOh4D2r1XZVTQmiEfUwrcgb +/FrMeO3yGO8rBnsY9MsBxokF5e0yceBkg4cB9ZDKri5txTWxKmAlpRlTEBnicyUl3hLECi+bMIpv +T3/1mIX5tksEMBJHelHl+qeWwUiwMnm3NEIsimAA59YplPIZRg3JDwzkjiCLVbo8Ec6dnA1XjFvw +CPiH6m+YCk0+M7hWQgAnCYaaTatWmh/dp3XEaLUA4eKUvNjbH25rG9PIdVIgvhdRaIcL9ygRVWwj +jAcvDDAK0qv+9c3vvqiM6ngepAvfyDce2ls/LlHnLfRE5VwT/8qZ+pnKy3HgHOszR6hJbpuSHJft +rYpo26V1sTCnt9AvQ9gB955ZqLAvbprO9F+W58MerFo/9OS3e/4MlUCefUC4OCXCA3Pbh5kP2FnN +2JUkPflHhsOBmFo/xuH2lSajrtzQRvurjX9NUK4GaxhuVRJLdlfZe4OO68zmxWXRNnUCDYJSmKCP +Z++obHJ3XMH2YNKSxcvPkTMhALf67OI++SiCGCOM1ypxtPG5Kb9lsFrr6VZ8ucSTzDRnEMLrftyE +OhPxyKK61Wr2PWt4q40qFScSc9FBtpAGC0DIEGa66z3/8RmIpU0AmpXpFhvgrhsPLZaaPpEWhH9p +dF5pnx+JFRWYz1GCbLXWN0Tzu3FE/o2M0ClbSQhqbd5h/PIkMj18QYh6tbd7fd+Uep8ok+nxHSeH +M+1JXBAgdUHjMA0aIvNHQxcVHotLnTPk8a1lsNTDkjVB4GUieMjJyzDkIGpNgbcoODjNz5ffcNQE +jFFwiocjPoJGzE1DuQHjCLYuHDKLIddprzErMmu2zqBZhjsZgzHLWjw0hAZmjLfopDrMmeo/yCLk +Ry+BvFUgOZK+SewDVzktLiekcnlmoyu2uiZqS2mcBJQXLWo2iIvsrCUT77l+Wm3C+uiYFuQZT6Qo +Tn3cq7uYlkzKc9YayXAiDx4p/VV+whI69mSDPnpDf/3F67D7zVCKY8eT9M3ZGk7ydmHDQRqec5RK +v2d1Gd4uCW820ZY3lvF3FUeL0hexEky6eHzQl/uGYOQ3eNZ/bMnNz63leUFlxQktG/6n0zTZ8dxR +mBI3JUYk2qGmcyVnS5ISW/1BOfHFRaEbG+yhmIP3X/shww6Z77d9YofEEH1MTMuRX2Xt8AqDvWs5 +X7GPf49OQBpn6x7zlJxa0LhTPHzRAQm8DtYE18CtV0drSDzAL0/IMNyp/SMfCNO7aI8FF6ANk02v +l2RwFpQWFP6/IeCYrfd6sqbAm6vsIRsf7BD+NglCRALjg7PqSE1xGGnnPnVdOEP9Yt/+Jh5wONGz +gjj21WQc0HJ66xigGfJwzJauLvtDum/VgptyZ43mcb5fUr1u7pPsFCkGD76/0k7gzjiFBWcBvsgZ +oEQehPENoGvDCPJVOJyfpUYcT4/oBH3gbcuOCYqyeB5qOe05XuhJBMlTmBPuePIVwN0vaGG51yrb +VAXNBOr+Tvhcbtf7vYFhak3Ft8njYZYPyvJmTQuG95edmX1u9B0mVPYQLh/y964+CK2MKTy8oGDf +3uxRUxJJJhf+m3higxjM+cs5f1HyWX0Bwh0XYYc2dkA5t2315SDhHSibxYa7VAMH6Ja6XhvvV3wo +AiD6R6y0aQ6kk5kzG3KXc70YULWM1UEzPcOqSUf17UH+AjrjgfdHD3p9dvbUfW/Urh7Q0ch56qRj +E/C7rBCl3UVjPHyRKPOheVdhx0NZ+6h/6eDyJ5pZyfYoC9YJCFoRAanVBEMrqoq7ShzXvDvTo8M2 +edrWnE3cXrTjN2dXWlG6Sb7gvRWvCTjgjPTj6+w3L/7dGbMvHlW4oSVHcONNaDccoE4xXLjWWgv5 +0Q0hG0BvhRlcTBT8II6RrG8o3HgeTcnXgCfl2RkFP1KqpWbHEhwU+6ILx4VHUHqzQOrwFw080G0F +GiLO6bP0usjEk7xICgLKRD4qBT2HsaXawkbrTM3GKuF02R6TqJ+70hwI9AStA7wXqVe+DruxUxJW +8WVbg/ytJqYGNNFC3/uVhD/GGAuhPmVh7wl43XdRDWbeT97Cbjy4fxWrdoPCQ0zw3I3/lPqFErM4 +L8SQXIT9MKksk4g/wjD7WgDV7Xlhl8y9ASWzsCYe3wAbAumsTt3eOqjX2CEv0mftjX19SZ+vaFYY +L2/99DPZ3IR7zvScDlv08xFHUVEXOFdweX9R0yyvYrCWXywubgLz4WsN283DSEq/gHspLz9+PFG5 +1qzmYMVX7kXWKmSuk7pZhnpw1IX4NuITcwD+3EAZljpOGI9J8Tzub8UsuueW3NqDiki7J44XSjp4 +1xsImpMRHt9PxYY0Lsn5+cHi7OXYKatWMRIEW30p9EJeGixD4afkYM3XCrJINHdBrijV+fTWpSdu +J9ozsUKTPL8jjZXylSdHUb8OdHt1C45JGRh539vhrpNJKo6OQSBUeUJS1Jb/h9cNbd73BNjoduBm +bz1mDLe2dL2jXHmHiZCNuf/4GuqhTd4pzg1PobTKejPdkIInlBlqfmFUYtnwC8l6rjgBthzcPAvH +awub+FVEaSzY51LPyF2FHcgdOr4Z6j1rpj5NWMsxFlglkg3wmnniHlRbwV+fDTAp0GJGTT2mMJ1E +Qn89b8ehz9Ma7mHeXpJ36KQBXXcPzsRwnG9SgjUfPIdBuIca4jeaQClbrAD0/siHK9Vpgii7lCzZ +VpfYeBtwn3PyrhqpY6YTwZtlZxYkBfurzTfpYunYuc3OT5q2UFsMPGR0z1o1X1pMCxP3X0NuJ/Vh +DTv6HzGd+xzMZkxQcfsDTKOyQKc7CVTieUtY2cGARlO6/y1JZzbQZeOsxI6Pf5Xttny10CXhhzdz +OFam4JvApljIHMiO2E8veEdk7XZqzz8dCkP4cBFdF29orS2j4/kiiOyotobSIplz4pYG/ViOB1Lp +jl6tfmy/lZEsxUCMfUCETBMP+bkTfjxKrSq3Kgsqri8PsKB2EHTmosTMlwTlMuZmkkaZF+WYj3VN +dOA8Fkg2ghQ99lHa1jrLLviZjBkp5OX2EY4D/d8HanaT+0lzPGSbL79DG6xDe2W3IYwKMTThW4lN +ZUM1Rlg0OmAzKepl2flnD0aaO4jE/zkMosNfagJbTT9zzITaHcP0uPPUrBsB+NX7u+3He9Gp4/Zg +hjKwvX/RGIeZRG/9PfEOLZrRYYg1gmvmLJnBeYatCJw57CYIXFeZ5vbqyMJk5hPl3RvkSmUpqv0e +hUU6sbYiEcKPr3FoY6qcoQQkhzh3AWccEAAlL8iQeDwflDoPF25sQt0b2ZJ+2vY6iGplp5c6VZnM +VS2HtzvhnOl4oOXfQ9bJRFdpLmiapXyqio5z32AT9Eas2iTz5iLi7jwcOZMxowWnMFyq8WEWsU5E +l6d0zBwx1P3maVt7C0w4sAFUeIWktl7F9v0G8ywgbEFZCkZ5kPKnQ4Ec2F3JtEyrt+tjhuOQN3cd +jlszoct/XctqrGM7W2wq4VI0mFdkw0SBM73D/rZi7XMYQXQhWrFthpyOCezrBINECZPbx0cDLqOd +pfpgd8AfNBNHomvPvfuEvqzYptreWgdvmGfqJjp2hFIQRFBK8iYfv3ny0K+zft/4hiZLIPSj55Ez +wdQPyelzBS51ySiDJ4bZCswogGk1rdG6CVmSwiwr4oeXQvB5Jr0ktLCzhCzQhu7qo6KwpOFfK5C+ +t2ekITq4YukWuU3SbspFQ1jxt6yv+hZ7OHr+5yy67yFO+KTnQa7gZ2cTk7Aot4wE3sYotveAxxBm +NWh571m3+Q/jhinPHXh2TQ51GEcC1H4uuyuUgnZKZQEdZcxHXIwcg9OR0weZkqGm1oCeRa1bv2MQ +hfVu4u2MjXiADFgk4wkCUwhodAWQ1FgZSuRbkzOALrKZjT6ov/QW8qiuu7nJDPsdaDhpasbgqEku +oWdBR3KcvLgv7367hpIXGfoC4yAwKq369iJjS0tCznMcuSbv0VhEyA78V2HIbN7PokQuls0PxAct +5rG3oJBrba1y+2PxaxTEfT7hg3Psbwn80SLMWSqXynuY9WRJUzWAsp6ciOI67298PycnvRPn9DL5 +CVaHs5m1ghmxucwD6jXvduKrwvh/J05of5h/rKLMAl6XMcJ4bYot9W9jU+N6OIEtS9MhjkYirXtP +aeXoj25yllQEndE0SJNN/RTRNtAoKh1HMPfZuWNcS7bNUGcwGvxv3DF47h9Er+D1Lnzkw91Ww1zj +5ds9uGEE1jHy3zkrj9gh/zfDnvVDg7IB/oP9wIVHYQlTzw3+gpoTNRkcwFNeo+wEHJPcua6yi8ou +hqb9q6KeUtbV5cPwNaNzWT0knCLc99k0leCmHG5vfv/ipaTSxzhNjQV3HNOO1FHxO4GgWaD2n//g +Gv4gmOGnSO71G2b2H7L57hJBW7qDiEmyWR1y2InRarpvfyXark1xKjqfHQV1yT7LRZc0sFslAdJt +ZrRpbdRH7lf8AR0TFlV/G3n0qRfRrOii1FaEWh4g51KDla0B+eapVJcZ+b05Gpd4+LEaNHU/D9Em +8pqdkkeXuwrcEjZI5VmgU785PtV5nAi3j8Hc9ww8DlTqPzBChC7SNN6GX3GXCBh8HhSno34ltGfi +lgqVn9edZ1j9IyRSfzX6QrEH+gMJ9GUHdydWTmUCbQfc79Njq4tCNalC6V7l5mf6JLdFxadNbSFv +R7oALSLE9pbN35F680VipiFnhhBstC3/gp4sS3LgoyPFlsDIeHvC/Ji+XnPuPueaOuZZefDUCVKb +31CB8i3zGRj1tl8t9pMBJXB/O3VGi79pu1UmdmHuylV/xNzVBUp7mZvMJZGW597kobMtR0z4evra +bBl9nDE5r1DfrvFVhj6tRFqXcmXIFOHRvV6VCX60qhG1yOB1KiTtT0X1xCkKjsKHrdnGze55t6fA +IwU+jsry5W7oBZjQ5j0xFBHohwTbogQqzc8VINvVHtATkN+v58atdt7E82vDFBcpGDUKm4poAJsF +gPD9nvxlChIffazqwDhjiOavL8DToOnNGG3C3pkYCOOPPR7271tiEDdnMIdlttg4pN3BCOyMIZd7 +BowwhDIayw9QfE6RKYc6gLOShj8oCphYJ0eX9/okh0AxUNfEoaIMLnsyn2MPCLNPJGzBKvEAim4W +vsGwHVy62YZIyrkT1JQh8Hq15TNsoSVmOEGN6o9lVDMyPY54SL8Z1Wd+cNWKA+ntKkZnPhndcn3U +A6b84h8RobLrgnSNaDJmOvj5+fbf5egQ9H3NzS0RDiRHCl040mTou657U6aTq7SyaVuLHBSlmO3j +Mw///Hp+6HR1xLYEmxhnz/ZQn8QpEM7hvxrvLyYDcrU31iyS9K8LlyKTesUiwju4Wf5dbj2ca4Kt +Ica8t2A6AkEUj5d+xpysazc4BZYl0fiVsv5NXiOaejrem9QjFL/RXvxKplw2V5X/b1pk9xCTzzeP +WcrizuN+HAhcS2vSfUUo75Q0YwzMhN68s3BiLHc5IQVzwgaYstbmnADErUSCdthgImzlQnIpg6dS +5/NR2HT6t7R3XJq8vXYIzJRL0wf3/ulcZXbmqOmO1VI4AmNu+tkHU+4PNmWl8pZTdRprlVkcJhjd +8sj5ZuJ7+2iQ6uAIjJdzYihyd3O+j7EMc3ceGcfUWpgSsNJ5HMZCa+m5L3QCRMOjGTOfcdFzn5il +AZnqDkctSbL2cLjVLVQrSw4++jB1gSOg0nSjJO0G+ARqltFoi82wXMm9CNCq5LhtHnRJjzz4IEou +Jy0EOCrfB3O+dMK75Z/Ztk7N1zQr6boRYikcV1nHJUncLZobiChbfN9I2nUSHOd64XZWmxLIE55b +BphwTE9avwdcTvP+JNVkO7pJxbmlMXN2fMdIQGfFDW39kJwiZUfFCDiRPudvjiRQHf0EQvtsBoQl +38/VSujyxW898/0LuggpRDNjFCvFBZotk75/fNuZb1zBBPLliPFjGl07ZqVwpDjoWXFnvBWnGMJt +2nE6n9tjUUXybBt+P9eHcOzPCfPID6sAaRlzLzio1dPMF3UXVwKUzsrkr3DPLJHyum8EzMgKUTZA +xCiTHvljAc5H4kbLttgPkyANIIVAAgY7P0sKz4m7mygmnGsLSP+FQ+xzSRKIfGbzoTvupOD3CunX +DZwrQjm1zi6+kUR+oj7iE0aVs9Txclc58UwI9XcQSfzTMpWeesDQn41y0Bmfbrnuq2v0yBwQqeCW +wKuvVprq91RRr14l4CWcEKL/myfJo59ed0InWG449j5gD4Bj/Fg26CLxF/yh6sAPJT4CH4VqQ+mH +VVnzQ6FQZfWEGQsTaqADtbCrcSh/iHp98bCNw8l2/+cscZmocOa1icYrm8rpbXAU4Jt9DTmux5VS +jWH3A2Hx67WKWx1hB8a/o0b1Jo2AvOED8ISUoZdTzJVF834kGRlugDSY1m73kJxUnyKbCqzLE2xj +ykVy0EhE9cbKKmR7riOxwNnOKhMFIV2/Tvr3N3wubNceSQAx9jhefN1afZpiI5EbtgDzV60YJ1nl +7Iit/d5PmihKfX0LZEuYh+7fKOCk8sthb/Vu/lZvHX/1iCG2UZ/VtqzuO8znYftMlVti9b+vjmVd +Efa1ZfIh3G5/bLmr/kONQJcFPmB3Igp6cbsrfqXwhCqnMiyxnxatvOu6Z3urHNSsGXJ7cCK9sGsf +h550+NlmTVaWK1+5J+r/xK/qB4nEXSuApLmDoZ8AknpOtFMwVk5PJXhVwD2paTm9J1z+u3i+wP17 +b+hhp/i4EXh17a6mn9Fw6OWHe1gQxnr/O16GLOLcl1VT5OYs3yCikm2caN3XmR1yhHh+Xlw1+i2g +wYYqw5/g9uLyAvCMzdJG07YZzesgpPTa1UBDsIyNl+F2/YejhUnFbfpZZ0G/AmvMvA4xE8Pbznlj +Wt43pGQ2rInT1rToytRM3HUxpiAwSe8EWeFab/y9ds2158UC0ES8nNRb4bbm8a8KlsYTfvy5NOwr +mcSGUVcms8W1Pw39PkPAl5GpVhXSpppgjjaZUd8B9OqN/Q9/8NR5s5VHKphX/upWYk7ML/dvdiuQ +UnkCaZ5mpS3NcmdueodWQ5wRA7t0h2H6Bcvb8eyl2Co1h+QQ8EZgVMaSQJyUw+Ar/q76fMvpJ13Y +Kv4NXVMuJimrWyc/v1AnHwIjHTlzM4HkeI1YS2gybrlFG9ZgFJj9J8uCQqvgQkMuX9mx50OkGOSz +MauPszHtg7tItUAlZn/tQpjrYZy/JTVCDmr1hQQDxVa8R0dLsdOhJGT67tvhKWkT0zlKh5eib/dH +aPqmGtlwucque9yUmuRzHPbQD5FVLavYURvpNM8r4hAv90h7rcqBCvGfCucNYY5nza+toQDcM0YE +RzxzzsCdQBskejwnVsbyo18WAYuGWjvYclLRN5rQqaHRhcXqHsguti/GOZ11EbFjcj60SrejhauC +A0ooCHFiFc2+zaPVct1CUS2FBqO9UcQFvELGMyXFrNVpric/09MLAtWH78kKf+ASqehux7GUZgAb +LzgcPqLGU+MTAA0KBXfzdM7MyK/LlANSQ0DRCRDtuCXAV36P9J45aYfrxug5llfGgUEOgKtp9z18 +ULo8uXXjPzvAaN/1hYaemcnRThZRb1Fs7mNyELYOPBEPfGgLXXRQL+1Ul9+AbKuxtPXBvkVfFmKs +Rect0HGw5mBgU9AAPFgkjD7SFz/LwadSv45Ezd8msbHDO5HdclR6ZLvZIo2nBMzSv3lLq7AHTnJq +24Xbfo+LcH4kRGw3O6wXaEGzyLtFYwGLj1TSWlPBDQjv3/T0mtlo2s9lnTby9GJe3YB6VX9uxXjE +bfhjZKLzTgqOT4cq3wj/cCMP+0OCpZedtaxxXDdDwXkqGkCsbIqiFTnRxECiP+nkyz3LaF0jPMdr +mtRfg+Va1GolUh6c+SKYGpFApubKT0ClYuYxfgrckvGSb0zFmu6+QHa2Oun6ljnf0N13Mk1lsCUg +2u7RtWpqlsCd8wtkkS7j3W2IJkfICiBiCcwqHvJY5YCslGSIOIPeLZhuU/+GgyVn2PBq52IAsAd0 +++UWuVLQkyD1C4XuHqnXk939njjzEs4XnXBBb7ExgOMqYJA/H6tyYo4ginKaQFQWQjc79X9qQD35 +ZhrKyWJJoEViv/KbJooaprJb2yPEBmosz2QBDNoAEQpr1ljqLpHXYjmFGTka3BbjOEYl9r72jD33 +PgeG61/0/TMyU1yd+mSvYNXu60WdenWCWRLUcBzcv2csE6RAUh+9SiHDSPYNqbwBAJ5xNRhZmS7r +JXlm7y/hbS+3bNhFrP0bxjF65oZkpSEoFhlpotMuddZSP3ca25GMWMIN9UpKFkLWFW0nH9ehV0ym +EaBr8rYPrBjDDNMABrgJJmN7jIR6s+9plPXn5PrSoYCLWtHSSPGFuj+5TCaQHN1TKcbYCFM+voky +LWpT3V6cBqGKXLGLk+Qaz1RBuZitKsyKEqbdodDld90v6dU9kEUgNW6ehcJ4FbUgcItKOgg4hn8/ +GW5yRbKBnNUMjNtGfJzRKUzhapfwGCLpz81ym95o3UCv77+brFjvS+R+/c0dEVlVwjecilMyey1Y +/KO0+p2cxBh6izpk2NMUR44wQaSLKDBeyMnKR8GH5Jy1R83bExtoa71LBnE8Nu+RThAchHZoDcwa +CCPe82FHMq59+qxi0Ur3CtDa4d75CUAgUwSxAEX82Q7Cb1pW77pB6Lj1FUFBHYNlli03NboJ6JYN +uH9UcRfINBj80ITKRzFOJDteh9OWg1tcr6+hb/R6ZDkQ4xv9zHSfrwj3OtYFkxAGkeG6uYTCbEDv +3hPNACxsXk4hbCalW3sTonAJDAAV9DQueXEIORapMAYok4WjH+GbQuzyfbZv2Nknc90IhdJdMLFG +3V19ZGn3Gdid/XSoF1E+vSuFcsMQUAtdRWYU/ubVP316v3STr0mK+5kDb2YHFcDC+XMZxp1cZAQk +WzE/WILjrt3LS/8bGmi65sDSK5RmezHXpFNroxWw8mEZa7vJ5qoJZBpNOc/XIyBpTGs5r5+2Kxso +aTtYRsOFjmqnVnsdmKmVopBtc6I04wVX80YuD89pRqsHIbXoYhr8neqbDQ/jNAIbtTG5sU2WN6ZI +IjOVX1QaXvT4QzXkTBds0qrZBavHvZRrv8qgEmMuIZjtWqGm5leOJ4+HkhisHyVAHIZNqxVNtbCJ +IE0VKlLlEKwNpTliunFr2LXvo0FIOYt327/BXibJecO68B/a6m9XWMKoF4Z7VHk7Zi/avMoQUedk +NKXqatohRn9pTPyAGOmUKXB3JEd0aBKIOj4fcm2TBAHiAZC2IQSpBzeRGlm3+KxkZhF4QejrHloz +fRHVTR2Xgt3rSpdar5waY9yx9RTBJA1hbQ1CQ4cC1Z4OvPceYHFTRqaeaVihq5A5FiDYrMsxDH4x +40QVithuBcDFu5n48XdCj1b0ULYJnYuo3LhbBprGAxz1QwwfHSN+69BR6dyIZouVNSNqMerEZHss +NgByc1CMqiQUk5LsUwFUKLjnEr2at+s6FfFZvwNgjbcafiKzsqxTYxHX0hYzvBKkfZkkYi2sYlbD +qVlu2rXW7PeBXy37i53oF7ggFR1zF3OppMrHiRpf+QocdXT+4PGCP814dGLlcp37FU9Zb1wEP1Os +R+XXDJZaEuCTefYlrDzZhxaBYctrXFzchHVGA9Mcg2stDB697npoNcaUoJZAIpq+r9CHU2+1Q+Ww +/eGPmVvjwnZGBFXrn0LZHbpOQPf3iJDktC7dnFq5V8viXdM7oK3qgC5X23EZPTIQt8i31xKiuOoF +IEIlTD836qRpMO3CjbccZOfIxJuZppc/oQ/kdMDdID/C6URwi0E8KL/dV6Az4DneyxwF/m9r/6Ie +Fd08k8WN4K4ltTJi7U4b/iZuU3KBRyKsLBHKzfCaoZT5kWUGmDdJKHImkSkS4lFkV+Ob6ulwYPue +dRwn3U2q37gXXq0TndRzVegaLUx/CJDOlsO1eUjRpt3tulatPqXEqd5kTTrdifbLtYwKR4dhZzPK +MgpKoOFNelQc53AzEF0QSRAHJbEyvxJf8pXHUxUlxjVshItHaoouokjDhTBoAsF8lptRzmdolEGM +UoVi5IpUnB2slKpMrL84jsP9BssKaYaGbDCL0Jvj2ejCFHytqxREjdxqMVMWHOa0yxRUcSOKyK+f +Jqw5NilSE6P+4MD3gDsAQ/c+mrfZf70LPDhDKee2fh6rwzG4rR6wROhZdQSE76mJ1F8+J8N2DL+5 +ferY0PWs91UA/eUJB42F9IJEQAKnflqTL0J057Y3fleR21PUY2cbsSCKgI9EGNKdyX2UVuvJ4bMV +xTYXkePQD7ZXpE11iURJIiuf42tzt9iwGZ8aiatVJ4nxzzdTtCnL9QlNwVdsm/Vr4/cve2IQD7hV +pXutuUf8kLQoTcGPeaa+L2nHtRM7uNEKG+g7zNkio3nXwEZT4Lhvidmofc8tfwxBc4X368OcFCmW +pyFo0hju6T1CnoQ8D2gm8LwbukcNUPIYF0mXbzkY3zLtQGVS8FJK4TIPNsiQ0uZCxEN9f5OWi9wZ +lFW8ZsJUolOfhxLbkX200Spy/mBdpm04JLCSEfsCSPDV7PeT64+zlhSfvBhesLJmlMD6h/W+EhHw +1J1X8heJsQa51KluRVJSsqKTYivZtD8j0O9kyfoXtTgzuEgiuWzDuJRtphuMhYdRzCMoXvDnX5I1 +AWUk79rkg1l2aws+7QYoI0MzHfzmcfj2/bO4xhe6tURMYSbOBXEgvpJJIMFrRtKz8HVbN++O/OSi +BEXN71cFrvFLHFOA7uU8P5qq70gCFJ5KOcKhE6Gz1evjMbs6jTGzGgy3ooQRo6OJuzXMRx65zkmq +FP/Vo3ltXd+F66s9MW3UxiE2YOghW59sVbRqKdaFhGNXMj23t7POhCCVkiufYkkVVMkeP0n4mDcL +F2TjHfdHF1LB3CRlh3lUWSUDl5Zd8XPTB68QRX2J2tgvqNMXDYu0jputtcyiL/PUi7GrbxeMLLtC +vnbWUeHYeUsu2iJK6LQ+qCCosDKMtucPHHZjPV5awOD713X0cMOTEVaRrmG01qpRHfRFLGN8OmIf +/1RoCGua1PJsvu2PjX4gqQ79e0wHdGn2SREAMiRwLzLFsXdRMDNq5J5f+8PPdu5P1Y0X8k1CNMWs +lxAxpduvY/ARxYrWITRJwbhnrA/3mGVvA1GYoqbTGoaIeDTmjz0ecsP9ZjatbajKPuaZ15JuMNDU +Mt7TO/PGVtlRmrGRhm/2kd/zzDf62EyMsBqQssEUvc4rZafydRgJgBy9Jsl/1Kmy2SrkUtqjsMvD +Zm+5qyB39S7ZgDOY8Jku4zIC/+65OsFLXh2SGQQOFbmjc43R/YYcXTtPtq//cDn9QC35IDR8xo9V +3bLb4DoiG7LuX+GHfmLPWdLBDqsPMQYdHC2ROWm9pwYmGaFkChTP5Dp2gz0pwNuLNj+hA/bkeCvq +C3lqhyHAwl3vweJhKljoilaUYzJ0zHudbKVi9iRz/aJkisHatseUAXq/6bfNiP43Lg4Alpm2GBKU +3rcOln71MnMPXFXxvFsJRNffFa26c1IOElSVFgRDUKNa1m9cKv9G1Ppnetyi386IzDyaLnq5b8+4 +jGBZQW1sXqRvNB58C9ZyfGHhaWKVjFXFs5IkoWlkg3GDG5E2o/lWfwxxSnyDR0OL5n3VoBzyAGfu +qYYP5xG55iFY9z0jNrkghL7un3cID/F2rDqlVK89BsBTWgwR+7kB8EV/2lR3ylbSHD/ULlpJy5gq +c/GB2YYUkYu+SUDDwZVc9uBAFu1axgJxMa63c+SWiA6BrYML/hJGi3DQ+aZ2ZAaIsjHjEnbZDyWX +bkrm+pHAHZb+hbwS1s6Obz/i1VazZeoOJSArYTlYrDBBmhMtYLLl2F2h6MuFVa5kJZXYFPno9rbr +iavafQFHyWH//WJfixlhw/r+/HG+T8fvCDXZB8UWbjQNxZtXcsaJhYIZsl7EEto6Oog/KFJQcO/Z +RgRbTLHVl5Wi1BahllCjM4Wuzu1dlkytzDSAckW7ibvWAB0EryOY9tGoMMWbxMgwbUp6rdxaF9Fw +PDkFguXWQGb2fnsLf+Nf0JwSTIf/D3u/dHWvPXEQL4RG5EpVqoFpb5J8sZZakZhYxmqTRbV+YFIg +8XATOdetjAVvQfJdiQOgawpU7yJSOkqAKKc9sIvIUKRm+0ZomJauMGsXpMRNkxS+yyTg46No2UQw +3+YULgQ5lq8w5ix1kMIPh5+p0TvtrLTAIyLNqJuW6RfeJywq+KIecDwrSLra1ySBGuuyYM7IMrIZ +CjhNLNqU9YZ3MI4U5mfPp3ElIQWjDPX5v8TXpHnGaW8YAX1GExIQDFIr1CPHsVvVZICT6SrJUeYL +uNj8KNuOYuML756Jz+a1nqNd401po7KQYsEK1h9f0pXGbDiAaIJt5TRaa1Agqbm4B6YRaog220sQ +EWW7Le70tpmwU54qeTG+EYUtjZPkdVn5c0UfpcH0/YcdrWNrHX93RYvDgrLOZKn5u/u5CENpqlbN +pAZpxLBmpoLSTQRbD9JIEe7+D+VGyne5+kIqMFRE5sxogsPJYfsXnrZV54TKUMXKLdekmitOe08v +FzvnMib0C/nfk4IIq/VaVRIyTkaLXQn/HoV5R6fG8ckPMbJumTHCUnU3s10mPLTe3y5cZBiXlI45 +bjqe9hENq3orqMowHwh85PG2WhXLpMH4uz4bo8V50BtPVsII/4SwGC8LwdEK11cuVkI56nA8+fJg +HqJ2qNhaEZMbrR7kUppzQMWNN7r0+2lHw8wvpBIsFcl4VAhBrosNNSIqJpRi0EHErF2spWdDw+G2 +YX/HJx7Duz3f7aO+fsci4k3nIAYQOXB3KGEtAEBG6wZu7IztUMGanlgJyhc22WUqBGt+iljxgYNP +WIc83Xfn3Rq/hMaRfc/dQ+/7H3Fzek9KzCiwCzbiiBC/2O+2cS7oD/jAta7DAXG8t6C/0iFJASyl +wYLWWgVJbyO96xc+exL878/XAiDyGVClRxEcgfLox1xeNtpKPdvYPANnsC6Rq8FJ87suIh8QCWez +ZcN3gpveMRLfwhV1fOsvzDCprxt2ZPJxU7lLhazG0Y/tBDJUL4MrBZW/Puq9y/qfzK3VDcGjH1oy +FYIG8ibfvwKS2f//DMjXyrxtXDRnAV/2rUm39RL2PkfYzVNQanpwl/a5xUG5bZ1QnrR+ZP0zWscq +P2UrjizXGUzILyw0I8y4qsE9XV06RvCRQQL1vfb0cVtNEXnHuap53lJF7MgmpK/eCiGyY/Oc4Tlz +B4VH1/jwxBM6sMtqNP0cHXmqyRcdnzMHFydpEBYCT9v4s17AYynT2l3t+eS4+UbOBipan8rOej0s +daIiAnQC/oV/y29l8DTZZSSa0RS5G9JypPDr0WnAJ4PKzc9aNh2Xx7kAkcAwSCTe84ly/OnOSdhj +A9779+403SrGti2QWzoEPbK7P4enVDsEY6+TQWxTjiob4o1nRitv2jt0t1xt0Lr80kRF8GLslzoM +QZpeLG1KGa6t70NEVl4u7puO/tABfIq983ysWDH0WtIMD8pr774ALb+77z6sEJl0L8U8XaIowDjV +9vjFCq+89bwQ1Z+S2h8CqtCSFyhup8hLyNVkLI0+DE2jHmBfWEHv0SVS1OGZhE4vkHI60dr/glUK +JuiLbThHFWqHSYMaCilTsvciWmYblXKa8beYmS3dLU4gco2m6vUrKOae0hsBeiNqBca7Mo7TvmwT +8K7t68ru7TezpydEnVIeozrMzSq0dPS13Q7AimfexhseOzL3pTlCBpUXSIvW4eLPo6Not8F7NqIy +wDLaok74DMz2fi2rs7DikL466/CNdP803OJv5ChKZaxlFD3/IPRp3lxM8Swr1CmtEPTm9i16kzuL +LKYVdTf15oSxaR7DxipZ/JbAYoXyNLcwo5aLru0B0r3NlTLXS+NPcCNbnnWNifXkObJgH792V3WR +x+8DzYFNWLmZfD8q4ybXwG2/M0dkhacKG4IBNRXoW5lhuo/kjcXr5M0kcJmZqC8VFmKlnkPTyoV4 +8/JgthSGZ5vjTW+L+fe7dJKUvNI502eaMQBgmO286G9OXv0weZPH7xZeDIdY5NirtskYzDimxyNL +LQTEy2n84hXqUi/bz6H0Gl5B0tEQvX78spo8cif9Ly0YNmCJTpxuL6mRZuKnsW3q1hXWdouYg3CO +jTBEWQKRQFXoHyYjQmoDbBQrVFNh97JgD4PUlNqpCVw75v6dta2rNuQzEQ6Mx+YB7P/vtT8RWqSA +FLBh904PapXzwOGQhoQh9+LCBsM/HABUuForb/uI/AeRT437V6Ke9IHipp/x1SL/SOcUlyvO+pth +OcvPsBtJ8PwiNBoY90VWWtxp60WXkXCpgQCwLWBSfnRx6DxELTeQCgaValE76ebZkDpKuTRdm8lw +USC40O6SR6XsHe1REWh4YwzXVERiIcjisJUkSeHbPaeQYHSrHDdprd4eOftetFc9d9KG3a/bQkjx +A0B6hYt3SzzDFrzu1OGPOdi0r7cZ0syV8NNR2TRgvVlCpIKvs8aKopYzAYPGmlWwSgMgTKEH42Uz +jkPS3UEXFuE8p6UpeQR33sjtJuXWeEcSbnuDRZ0bUjtVINgR4Mpn0mVmgEXGm3IUHUnkP/w6Xc81 +zpJssBk7UUGsxAuXPxKlzgb9O2P//nUTh9AMzMRlI67iXc7zmOP5Yw/DePlfd7WCWGc9UNAFgLet +UQQ7uG2pAEHE5CezUdWMQXQB82H9trj4KlZ/uY10qDpzCb2A5rjHGMgrchudXZLYFvEHo3hdHxYn +dudA4fNvzfWtTaPy+LtlpRBckYHNkR7OsKSIagJ377qsDHFG3qIddM8uhonJAWaCK1xm4HF4SCGm +LZoJuEceMJ4xJFaWcU5tmZvr1Ro42ah2RZ1Xd6x5FMq3t/ywsy+Hu2bpW+2reDaQ/mk3OHOeG3Pj +vGeu4G9vpDn9DWXcAyW0Dq+8GPxCcseClc1miJMWsE3jYt9L6VjWbZlMCJkPiLLKq3HCekKeMlXZ +UOEwvIiYa35YSJ292o30Y9/MMvg8x5eCVR4TJBKgyPSBeopmaio69KPJ7Ll2lY/4ZimBkE3BKLNt +hKA3lgFTdxZCcEfzEOV/s14QhFk1D8Abzefr4ZXPePkkWmSt6QcvYnk/VDE5fZYojeVZtI3W3eVt +Zk748mH7E/qMXD2ndz+eSqzzHVJ1qKLC5hfRxpw5CCvS46/nN2I5bSJ5CW3L9MCd3XTKAavZ/71T +JekqB68/zJtrLEtXUjK/CwrdCCGUjDTAmO/w2PJzu90Ol6F/hgA+uMyLH+0bqXxdtcfp6GSgUIgi +uWNPCUatRDCqthsqlyd1vh9kkdhw4fk2uPpzBlnGZuaseslXlJ9M1oUM2d8hw2qV2BN0R4xaZrJw +qP4q4iUvV8y/ZTbX8uSMpHHgTOq2g0diwkV5qv70k8Bvvibyw934QH/45oY2VzA9pK/Ptz10FLSn +9Gbl1ih8MDtYbEBMXwo8XLK3wwrd5uimDVEhr+j8pD4sJYmvXr7diELlaMGX/bHRj4JV39koD2A+ +0rHJNF+GPX9VwYz9ODHQ2tZ4COgln7tg/LuF7bJpT4/pzOow+5CrrDUIALDDyedjdehIM2Y5JyH9 +zJOCDT/SDLqH/f8pW5HHmKeU9S9NfbdmFD5mOEyYbpCGqnedAlhz0+B6TOHlk2VYyA9/yAHaPqlb +7jp0hhHleK5S31bnBykeMc0sJOdRcSiMTkwwiSgMh+u0Ioo8CXrHvXr9hK/DiQpJ8LIBIOfy5Ebt +jt7hTZZlU0bNPPZd9XKxhqONds7psH/gm8+nEQv8YQHhw1Jjnn2mnvtbGdadRTr143kh/AnRI8/j +8NeHnS6WurjYipKBsXbHQjg2AlxxdmkEWLTepvVKiquJYXvu0Jv1h9IuIzKMx7/ahPhlTy3B+Kjo +rLNDPD2LgrLLhyZ/y7R04IB5PlmxPwNMXbnG+DJOipf5BRnw5huI/cdD3VKKSd0cthX/4AyvTimI +q/bzoCJgqVH+FiuGUcFA7cpF6yJT0qzrf8Uz1Q1dCh/BGk39eGXH/qfy0LdwlQ7/b1tRk/NW5wEl +qVOM8v816T4LRTxRLOQopIAGgtBKi0u4ZgiXKA0CGYqpd3J+eCdfLPOol8f5cyoYjfBzBBcI8xyE +vmrFomDZjX3+XWz/XDTj3KuXPkZYzgAQs/2C1Rc2B5DnKZ8r+SfegNjWw8sprKkNwgFdaEMB2Nec +3reEvG3s7mG/J3jZaBikMPT+PWHi3ZG61ueMWyzqeDpWFsEdoZFBB/u3SZdHOvju+u7YgfSFCNjf +4RGb5BuNI7yM6ocFdRMF5eY8nHAXbqRTQFnen90IczeEsWY+4J8AShR2Jx+COjo2HgXbEHvHD7ei +MyW38fDSL95mFv6BGedgI1L/yQaSQJcsul0+qAFmk/7H/g9MK19s4icR/dSp5EiGOeoLXzS4W2cl +WUQPYoVSpYLV7bIjlnXtg7VywWsC/m9CN2cPC0gDSYScZ+BfS9czLldfxxVCfRcYlRshj27eaBN/ +7qZG0SJDDVYbb6IPt+FvhvOvURSPza39wqmeHvcTqHAriE9J/9yvxp2wq/4TzWyvlL1JsjnxGh+U +HlLcdUSCoifjox2FeSuB+dk74ZWpl6pcaf40LpM4zsSwiRcrCaEUYe5NV1fAHWAgHszm2h25N/EJ +mVEGZKtV3TwKWKCMz54iH+kxABmCYztfKuY589KXFHNFu6JHuKlmwiiW+qagpmjMdf8Kvnp5ezPH +rrjYNAfu1EmAfLz18wgr7yVC+OLX5ZjecLogAoyaRcZOyQ8DrDZIiHFF/xYVZzDszX33XfVdbqFT +KcAqks2H1s8QujdNq9Dr4GrQXCdIdEhshoaXRuFWselMkeDdvYJErNtK7kp2PSSnar2KRky+Mjs3 +4umxzz2dGErq0NhazKc5NI/Go+lBBMqnZ01816Da9JfErVGCpCn2KTtDPNMjKXH5L0ofzkIsBSBx +WonAigMi/AeLIFVlntCL4yBPL/muxlxwi93n4b3nveKMCJ5R4l0C7FMC6G/E7nxOPzR/+KSUY/da +QPYsdc7EAUZxE3ubKYgLyIkpPNziSLc47UvUWpwMJrweyy+LlFANtsZzvl7C7HfBP3MmIBggUeYk +erCA1QQePcLIMuVVR6tExdjnobaevoJClS9o48DVS8oBDqjGxiDTkmulzmbojuW6YDT1MswJmUqF +6c4IW6moUmbAZcLcwNKWXLNIGX5NYDCzwzOJEljRrqf4pYEc7a2RY385vxmf/ucc84KT/qqrNcyW +LZBgyuxJAvdlWZqSnlVL89tLX6p4XoKM0+Fp7BR4m1whqyAPs0aAfe3QNcLaVbes0A+IflUZ8YfI +wMzagQj1F4mzFjXPV4h9h7FeVSQDOPh+9gLyLtsApkFYJbXGjJmN8SRMHl9hKu7jxVugJwKqCEqO +kwqO7b2qOf+jF4NTgNukm3G2loDg+tKMKAwrr77rWCLgREt7+gb0IE++hik0StZELm7H969qlpEc +YwslrD8v65GW9BKwxbg/ZU2TSmJILQ9PrSRFhyr6FuGUPZzAP+MPHLVuW+VQAtn+WmZJOn7Imc3b +8huqrm5JVxfsSE9eXVjx0EMu6MTrSuuL53g8DaCEeM8edLy5MTzyVoW0s8dwWWA87p3kemNxTHZx +0D/0U6smTCZu1WLVTKEG2Bv4PkK1DyYWfitJZLv4GJxfNI/n8dLPDrrngZk3woh0Ozzmw4rzCCTY +vM6tJIwdkgmbFN8BKmXnQ7gTJuBLWNyRiftDI6kvSj7aNmQY1cBNbfu6O46gg+T3vigMPNQaai3t +uRTp3BJqfoXXanyTnL/lQxgvUbW+yrJImxZHw9GLIMeMcy5VlFGuJ99CzXA5ZVceSjjzxUcr9tLX +nYbc0Q8lf7IBMb9vnqEtkxP+qqGMFchdjteQPOoSxUfgM8OR1xcjJlw/ukJR6MOPkNw0ojPY/+fn +3U4GINTFbhF6aa6RTUXzir5kMWoNQsmKWvqYboRXNxWbbaVEZup2k5G+ugybm/45FVLvTvka+mf7 +NTiUgmdV3xcFZsmR7UCyVj7wijtW5mP6q1rqwO2MrwUsNNOOxVclVTolxZlyI/33b7NCeRYUuZUb +2XovkE/gnWPuoSr5rbyb6SjpZAjt+LUnb/y0Q5zIXf0ywehEQoYWcbcEsvIABUyXnFeELVVNizo3 +Um1gjl6cpPguHdQ6Yw5MXAtv5YeKewFcPjayqMI/KshVqbJbebSNrwTA04qhtv7pkr8wa4DlNu3S +FY4GRFOum+Pfsma+qWLN5iI/qKxGG8Ah9G60hUL7F/x47QEEi23hq40WJ8ge2er397h/mHySuG4l +IUJ5pWv4NOvopW8+iTbbO89HSDFD+KksFC/06M5FzuKZuddMwPPhtl3qeI5NpO1JhkqZaSknAgXQ +jhNY2S/p7pCTZ1FQUiUYEevmVdDZJ2oOJlsiOGOFr3iMpVXIJeYiMVQkxLTnQBKlkYT43BikD2sT +K5drV3ymhu2O/u7LAr2uXXRaw6zpBVwuZNCi98mHNFYXgGyTzYDpkYMkPGjU8Az4LBwLJeMxXcX3 +gAKExeKYGPY1NwhYe5b6yYVDz6fhrfUFsuQSdIm+3jXziU2ibN0xMpbagbhlFoX7rQTcB8+vXWcX +YHSE0U4hnKBscZ/S3cqFca9jWMKIpA0e7HgXd7A9n6O0A1isds+TvBNY8FEfrImCWPL0x4YEB59D +knm8E6a7fCDnm0jzKaVNHfZ9gzPEySxDQtcvBrslva5c0RfSVJNPC/xF6bXsX30YwSVXR1lkrue/ +Pj1sTxzT8UsZLQjC3AFdgYb+AQwXwVDeReIbsyha9YA3Phr3EkEwQFa17g30MUwHxQ7KTJnmUc/+ +gzGVXQKhdBKitvNsUwSMeTr9Q2RTMpRMWnGpshhnOiWs1ovTX3oY7wXCjysoQLuFNcl+Ro0SbAfG +wgShQapEarTRnJB8H3cnQQqar1AEEuXLLknPVKHIO5uIYhMoyVpdYQmVq1cleaitIkNABXUIdyxS +6G6zD9IIQAjOdAKJwwmPbuUhngyJNsDGZ+vpwzwLhYi7SKtMkRO9KXBVPwmyW5ceDzxjG6bn+eug +4Q2y4Qof9FcAjAwxhxmZtPcrNM4R9sTV1Gu/9kjMt3IWxf8A1p7swWV3cNSSCuuAgkBuKEVazs/v +IDUi9A9n3huTro2NaeoJijDaF7d/VwumVL/fjMqsEDL0YKiJeM+f2YvlnsC+wbQo521vz26Ziy8d +pD7I8N8Pd3On8XktcbbA/oWKZUzKGQQPbia+qWa92ikuLI6CLs0XdIzBi2z1s3khqgZAjc8mn5AT +nZA7gOjVr0W7Txq76ZWSzcSq+Si5aYjTrhqDhZRHtwxHaGnCBLqa4ooDTRD/z0pDgkswaSlasf3x +HbL49DP1zmLkFxeBb2k9XalG3psHt7aSTbAkTg/OydvnzA2k8yE9IH1iZ+LNfIvQuGpL3qp98x3x +04I4aylAmMc9SKAon22CHlSmNAhmUqh/1+Dk82jxie1Q3iwJaGPFqrfwtO6AOmBuFjelJqM7hWxa +sUaOsHGGjQx+ziOTyHb51qKbccOBNe5zEwJc8mF3gQVk1328WNxMpKGRhODYXwpS3t/3JwTpUQWI +f+cpzOCWkTYIa6HKkRMsffozbEepUVfk2MIEmxnR58uXAz1gwrZGJdpg1ZIBa9HqDTVDWGJ64wJw +L3m5tCMocy4TnawA6EC5ueXTvRrhdh61C+eHmA0ujRanMDZijkJOWaXNEXwas32gCTnq5zm0m1pu +N8plVac/qtp1pR4qXRB6NPMBd4U290Yy6+RG5Q6tScrhh98gWqCQiJSgjyIMfo6XV8farCDheAoB +Zx0p8ZTqNX41hYnl8MW4sW5djJsJANgmKsu725oVhLhRcQVB6WEBQwqz+GAkajXfaUqD8lkUkDuW +fQyR58MgbO6j62u/e7qwFLV3ll+qP5ct0w4/ufX3mFcGJ4XyKuo3CUEBMv1EkPjP51zoWZ40Cdnl +L9Lh9L6dbb2Z+bkROQ1enUIt9ofzM5LBrx8y8hneyNjVcc5bwmb75Ix1PBNfzrT0HkPELvStBcFd +sUJmctFuqjhjx9LCfn01PvEwwkENm1x/NFC+jpbkjEgi46CpCIuv+Npf5KhfkLH9pzAsFwhacPji +05H/9P8Ajx3MYwp+xwvPsG4IhWgs2Uos8TttXV9WCa1FYpHC+q04D08QvBNtBgQ6LhLk8VoafDuS +L6VmAMNTg2jA5hN3Q/MHyuKTD9LhR5o3OyrxBHxHs5j0z0x6ocdSzc4lg17/71ZakR0pcZY3v88V +piauS+/R4i0U4BRK0Ful3xm6YiN/GVs9HQJe2NNs7UDQKsTdA6Q27XiXleAKP/+e43kL9Bzyofzd +XTxMENygnD6oBzMBVXPNgM0HIAEoO8urFu10QgtR7kVBEQhjE5Ka7+qB+PlAWBGW3LROvSdxTNfh +knBUXJEsGSlk118PYMZD4fzvqX2VvhrRD/09ymalE42PneqUr7KF5ZjDD8+6lP5zGqshF4fxUf9H +mJMUHoh5dWFXgbZEp792N7k1PI4eBeKtb3fBYfi94LnbvTCUwSMitlnDjANeyEm8bLjh3rK5H+Ek +5coUFN3qVYLUKLD9wMXTWr8pKwqtFyE4gZq4fci3S1F2F9rfADIF3vEp/2MBweuheGtDkxwJrJkf +YsG3igVN1c1wZorE17rdwIA4ZOpMDPbZsEs0sYAL5205CU4wzLZeNdLtqsM1RvYodJletMdZ7nWn +Xj6eJ0nikKVDOP9mBSazsk66E0t4mO1g1VQlPBfOvqq/BeWrKHarqgNX3fuk8SKtskrzZzu5Ut9f +Fkf/NKzsQUiJOQVULnglj6gU83L6aiYAwp4V0GMoZTN+pn8rXFibY9hiB8ztgAzwVDM9eTtC49kE +2Vw1Bpl0To7Ew2GtPviv50j9FNHqnKNR6Qqn0yEc0pKTBwPqK1PBY7fTviWEKslSsw9Y7p5Y/LsP +PqgzPdnVCKMm9fi8D/rA0FmRhTwG53ROiu6PfBsNuhckI9EBEuLTXOXnvHRpbq4TBZE9N8updEH7 +zpTEwxJTuPC1exQktzB2MQQxjyVtIWjo6qU/ajnhocJkzAG41yyptGq113PI1wzEkFt+TtDLJ3sZ +UgCAoCUtFp4fNpzXVzPtUjsO7QVURdW184IvdJj7A/hPUUKWFjBC5v/ER+gfjFBevBBd+hwhImK7 +526TxgQ7MrCgXU/j0o/vMiiwxctlHvo502fsrm5Vif3X2ig879JJwbziVIu+bycyJhTRFylX4tUB +QSoj99PRl788U1klZpP5L92T2Hq65nGgDNWSUMjI4v0UmcBlty35XIl4af59SoC1IoA3RAweMz3e +4ltjdlKhytIWQzmtto8O9D5O27aQWyOMziyDeAgoeSpQhPz/CrrGb96iB/r2dXx0HLQecKX0bWoI +niYW+vDVM8cbP/6YXrmDwXXjFoJC+mo8ktqyAyI8cZWlaE8JSTaqb7AIe3ZTglhawraGra9rC3ar +gOKuc1pw5TX2tR6LJBImomxWr23fhSN2WBpaj57DGUwIs/EdR1/U9NbbVasRNnSsEgkXx/SIu0IH +EcRFdG6quXqJphnYjhhSibYV4vi8+kFndtQ4Wwu598GuwhZhN7LLHQLzjy+DARgGHFew1OSkxgkf +sCc4QLKOwFBEtxAO1641KtPT9uf8NnwZzwylk/EA0SGSfEHwAmqIyo1ZUEhwlxyDEG05EnOivGjX +rKWltC+15WxkzumztU9Uvf/a4w2GHh4e9RcTco+L5DrvcT+Qj5oItuAvU0zAYYUutrEY9cpvJepO +nZUyW1Sq9V/soIsfrCJkLt2cjKIZ/U0X4Yutw6zmSYl57Np2o+k15I9wUwHQCAa+DRRvwGeZo3ZF +ZSSqizmZun/YMMyw9xcuCeR8wZJ8RPwIRZDmXIFv8axd68wP7d48TDCcg/g3hC7ybpfmMxnzqSio +qMGx6XoMptlDaMyavZebJ/4CWIjI+ZU3X2AUDP/AW7q2Ovzwupow0OLScvlVGyVVJYYIBg/ORg5k +g08P7+ttDP/65pFBSRwTNT2y0kdCkzsEKokVtPgPzXbUU7UkTm5kdAwXlFqsi6slH6JyjV8rKkZJ +1HOLRVpGn4NnvHqOr+DX8vyydZuHKRe6R9Ph9EIcPSSu/FXgHf7Cc0pfyoVUx455fjdSxfGgNOst +0ekQn1YhyyvP/3hZbjcoDoCoe1siQWQSnrapeV7WvVUz5UbhnjLxfnL7JbKa7cIXReIPacyZ1jmn +cw8IqT1SZADvz4bx4YaiR5vwv8jcUGM7U/FNK2XAEQhQ+KUJts5aTk+BT+I5vIa7UN6RFxLCmZu2 +QCNcqks2fzzI8HJTkdRbDutkDO/36iUHfZNBi3hRApFjF21WGjHN4OWEwv9JInKCk3vhovBAvUDQ +FeFRuat/6Cr0hVyPz/4C+9hpK2QHHrYlP8/P+ijsv7lDirKa7wyVQdAt4FsgtomAwDgTbO9iFNSq +kde3XtjlRqomeTP5iabOjiwJxvjpQNMHxBxZBqNQkgQ3DN/NwBepnr93IpSfGNGsiDnG4W38w+ml +H1h9CNm3sW5jBjBM4aXW5XBSMNRez66OkG8IwJd8Oz6m1kftS/2kTNqSLJkrBXu8eHNoYFarDuYa +CJflqiUvopEWqO4Ljg2I+WCWsC/MhPMoMunat/QcdJvIuDpmQWbVFML8N6OFAonxe+3vAoNiixCS +FoZ5xkuHAtpqQ+rVtVjUn8YqMvWCKvLC9JocLI/8RUg5FmvyEjzAmJUC2hpy0MEkwCqmPdoyj4Cr +7tvZI4zhxXdtKgcu8/dAi6X93vZydcpciWkMGGSXX9cSnumyFbOHO2uWAuQQgRQbck3Y/6AhX6Vo +2T3zXF0QArTq53qH3UAxZUrExCOBOUdcp4FCYztWHkD8V1c9VMNNyOrR7Ar5OPkzRkIFAJfD4sYI +36q9N2e0I2hs8rdhZmZKR4beNJ1/KGsal0Lp+oLCBmVd4JjcUnlR0OQNYGerMr25JMW2nFxirLJW +SANuoVh/Q/dPFXhu5MIAMxPThHCk+uWTOCUvVf5x0MCH0w+ySaJhUuBQ69A9uib477wIHVA478lo +2XTGR3if7CRkBk0OwJe8IT6DsyvnSNrVGd4fFsSiwPccLC3tTiEj/QxjDjLCupop7CWn8LrEqNo5 +paYXJ3CmKic256kNd4JWrNXHLI8D6SyoVmwYvF4dI7mXk3IhF0KfU4TV7G3uwnw9ho0CqiZ9TpS5 +1J086qYHZgt/3gydXTfK86vQgu+N095RPoZWcIEBEnktC/vjXHwau1jPvzb0apbs2Lb4ysiZjuxE +KbDJT4w8qtrR+rKdSeBhvfA2sn+v28MrGsSLp3gnf9U+/0y1sdK+eT37RJKwcI786kLhakPAG+/W +UMtSDj+MlMzsyzJlEGCN3LudODllxrB++EHl7wf/JONjkbQDHbMxWPE7OWHyUBbBB3MlZ9OKXISP +lrBtYg6/0niS75Y3UTBqfxeoiBC/7lerbv4zKZy3iF6a5t2ZxR5Wbowvs39CHgbvb9IQgjBsay+6 +54oIrtKNrsazFQDqpf+qAF/WfJGzyLRi2sixg7kQYBjUkmDIi60QFLBeveQaKmlJdVz3fs4TfdTk +pr1fgeMi8O1e7o6RmpPcLekc0JR3yKoYZkt/x0/GWrr1vOcQ4tPZ92DebPPc9k7HuDL3QXhxamV1 +BCCivd1aketm0vnttxTjxunHIm603JUh+3+3YTu1lMJTlztwytf0XJWcqXdykOI7qyLsyVGeObls +m8eEucrsVrriqe951dTSAU7qZLa0lOW/yKr/z5Dn0gusO/ZnB5P7c7sINBnIJI51Bcl+ebzILWma +vpQZ6+VX4Cbg/gOmE6tvreDRLXBEy6RzMm+1euSnZzk3/GtkZRN4PzIZwTc3KgE2wWarzbUXHIGc +awWC/MuzgSDKbKEMnjCgX+trwN+WBmkcgu85oUpSSmVOMPJI8E6qr6lFWgctRFU7NdOyvwM6rknk +n4CfBw1a7yS+UTwItotPZflJxM7zgqUGKJu6BzCWORVw0iOkrdgSrYmbNLsYpSNfmpCc3aHNzkig +QpZlc3i06wPGJi0sQ/wHkHAqqKwW6jPImRKfYSF1N88pKNM2Ep6oLf9XLSUoAg0NypTZlNXdgIPk +PuJ+hCJ/n8w6ERQdYfPXjFEh2Vbsv0jQklmtm2MqqdN5y61EWQkjOEq8hg9Sh7VanXivt9PNBWL+ +YpqwBL26NBsgdKOTStHOmKad9CVKOj5lA5EoIzmoQpZB5wsLDYEAJLZRNzyr0Mc8wcReyFLw/6ah +9GeJhnPmzAt1jylLlkFtX93hSVassyEZz/V8Jv1iJlpj1XzAMaOxd+EBSvaopcW6PHm/gT9WNuOq +2GB3++omHri2pgqrFivwmZI5maK7zZY3sFy6W//I+1lxMbt5sCMtqfsePHQjccgGUy+La9smmDqb +PoYY10UOSnsUGk3tB7KEXdGdJx3omP5q0EIU6OILIOKq1TnHdWrBTY+j597047szA5/Jvy15p2yb +QUUZFaKziprT5vqAQnBjGBU0sb0CwzzgM+CzvsIVavt9hQMZXd77qFV6p7+GqOMkGRDyDteRyUKG +ltWjXgGXvUwOAEb9nV4oer+zW7Q6yTUrFbMjtIM6T6G+YOldPv7iJG3Ev2MzEXBZxg5cSBkYTS1H +SdV1cHWzLnkmBFHSH12XO3MYiJsoB1dDaEAArXPJOaUmZpPexcs1VwKLYAtcbWG/1JEu5Ag054fd +dAbz3Jni+0dOqMKbLawDAUvVg4OhtAtdeDtpMvaQhioZk73GgNmWXrHY9FBNyd5vKIKKV0IjRXpO +W3TJ5NgTqq4ErwRoc1YuLW+8lePXs+BVifIZ89NDiylnzIhPzKbPh+UkzNqi8h40D7X/zJeABl54 +GWf5SdX0TVfVOQcT5c3QLEGZIram1sndJubbGPrKTw0CQzZJfbGvRpUCTYSNXvkKlKxPMvMobXmw +Pgxx3h5FJjqP9XK2PZi9dnQBvhr2q8s0Bu1+pEL8LFnrmBBFcuY1h+RyB2TcxiT8wmX38ZOiTxIY +f/xiAztjkedjQUg2zWeUjwWH2b+eKY5EbeEDSsxNMJ+bcT4gVLoTP+06cz2fG2r6hqdvyuvYTc5x +M6+CJa+ri01N/EzR/6RTzhbxwfKX6ZmpNpcxasfUJMChPpOF3qCr53OY1x8C0TZjWjq8VnRY5vE1 +L7RHAw1GuviRzc0iCZPc+tFRQG0JH8ncOTj6vc1RSsb1AMUmZO7Nf1qAqccJB6Oc4kqbtPtQp4Zf +6K/nkHXieGIyKKRcncIHyZgNKFJCaO+mhMj3dd3eFpeWfS+u7S6g3XFrbYn9KHIL0O560jhQwd9v +TAd7qlsfHEklZ/F1o4W1Eez4joKWqqaKdky+qJusobjKRPW+y031FNI7PtyXl840vh76ZrYwsCqC +5UyjY0+lbJZVOcrERHBDLQ9Lmc91aiJaEFnjz7tcG2M764/3YMnVlajJJJ5W49WPoVuf5cTtWal0 +UI8qX95GWn7tIS1IYMNPv+aty5XJ+1SmflF2Gzw3P6UpjxwtO6jlhXWRx52XqJxO/xd18PJaiui1 +1Z2iywq1mqdsYAKlde8uVsazFKCZCIhaTs4DropaCPuPZPnQTCVfj2q8AoYFaW8W64k2SCJXsd8k +9PVUZ+r2a4uCJMxR5Nbf8y7bnHgBqh/g6Jv3zPz81zstvIJK1yZRwXo1yvrExupUdUozrC+EoPuy +canAziBHwP66MHZhzvq1HA0P43y5LLU8BMnjfRf83+DQp2koSVKa1hH3BnqeTKym1ozRXo1FEF+y +8s3XZZBXhhDwvt+UfGWegsXFAVJKkoowmAEPEmfKA3HwqOxotIFAHjvJOf2IgJNjH4YkOD/uPAbx +HX8XGFQ6EYj3AaHLTNmtQOsvdMKtRdteypOBD/6g0wbCxRJm3poaqtZxr10vzayHMZ1uZDhyuGYg +wIdSSOkajJCl0JdeLEMg/Q9kn9/72XAwyBYqmsoo6EBhhhPa59Wav93FOyhR5y5KGvwnSOOBML9u +0rNZXPxBNVACzB0KvDt/71cu5YVULy3qTBl5PN93UD75AuhuKtN7Rj+2D1aE1T8ZVYIpsf0Rg5bx +nQcfGeYbb8wE0utg4DbBwPLggTOTDCzTst1mWVsUqMpkShy968u7i6dF+iMSnO0iGg5Y60pjGdZu ++6Zun+t5ZXY7ZhPhXy0N0M1o4DfhMZL9x0nDn8pAGHolf7HSLllzLZ0mBH5OlAOVAQ/hb5S9nN7l +XjZUN0QnxLoyaVbNwrD2L+gW+6rZBtHlwfv7ahmT6aF//1YozbilB0PbUXfDiRyyEvikbypTli7R +lVo9hbmQEWFpGXy9tuw6Rm70EiyPd0Tcj2D7PNANYEn324sHY4PlV3fQDS6fxv440HeRIfGbT8UY +/xNbL8AA77HcLTDxNQGMUAZydeDWj6Lo3ifA5W1+AXe93ruSxRb0oWSJwgQAEr+h+N2GrwkIHhfE +5EON5F54yVmzDvyV8/7HUNBnD2fjwk9zoTzLfBM+rJrMx3u2XaSqny73sQYuWSLxGxZ2adv/9+A+ +EwBtpdPOJKG0qtQ1ibZ+N7fkXg+o8QqwxstdWTAYYTihyTD5NYL/d78ecOzWM9K2FUx6Ts8Jefqc +EWrqDQO5gSZIezvsZkSUHTcOFWkvCXcbipWXy9OVD63xBLcTKWgV8cz7wyswd8cBBM/H10AvmDT9 +biqVQXbG5dZ6HlAtamS0lJQG8WH021PaiS32g4Ju+iP35Nu8wZuvguaKY4+PN/ZvVIAr/1nLPHGY +ZnAMlcHwIJ3rp7a8Q5QPqxfXaXR00Q7LxkzL3Mu2BFOjtdvPoEv5PcOfVi0F0Q3LPGrEokzxRcWK +2FJscSrUy//ra/rSgOney9BdF34WrG26GMIXp99+Q/aIs+tPsleW7SW1eMckR5ZLQHTlmdklT7X4 +oSLTQdleqRsLCWbpe9rbwiiwEj2pGtIwaHVbv0O+Fh18yM/49GTQ93tLrJoikw/FRSs3i1gQTrfH +TB0bRo/g4Uy3FR2k1tgBM4jbkqgHUTfScJlcZcBB5tnI1MRuxa6pxQeFYKzYyl1Owstpni4ymDpQ +kmF8qm/Vxc0e+Gnky//Q0n71MO2lEomtMXETwuZQLa/ZUg8fP3i8wkImNeJ9/S2SE5SIAOfPtjMT +eCSDiuuLMx1VknBqbZe1smz5uyczAHQzzK6XjS0iAKk8xoBM9/zLkoTsl31MIl1ctEjja0Vyhw10 +hw0ALrARxNUGEI7JyOd5a8lkq4bmwG1TRXcQYoWFlC+DH9+KrMYdvDxWb4soqih7IvZtH0r4fzuq +u1Ru2WCAYP4PtlPAXuJZrlCLbvAJj69+1pBCpKDW2F51vWyMdGJFGBWK3FKleYUED4g0QGGf/+bW +bjvhjFkmoT/Sdho/0sS+LLU7OqbmeUqZBFoCBN6cweZZINS9hruYdl5+MNie56Zs1BhAkXgS4UqQ +ieutPTNGigfZgf8JjQnZD/h3i6FrvsSwUztXQwxqiYLv2C4mdNSTsP6EKNYQ5QrZFRY0EQ1rPW0J +kDoOgzvr5Qg0PWb+8/Dg+bmzN1YXFntHES4BGmzMNDROx5vmqyv4R962UMn+xXAFkAeGDjZWZIK8 +Yn4ds3iLfAKoDyK9iqTMVADFhpWMCrnyskNrB/Ce/aZ8oMOBRdnAuYycmxKEiAd1QHTrkptOOfOO +IBeOLhuBSSpjNlgkClW5BKc576Y3macRt1d8ntPW6Pll63JbopR0waas14kQa8R8FI/M0ClaNmAj ++iED1T7ofPLLlFiPoXccDeNTncLr3Zd+HiAs4k6M9Hh1hFMb1TTPEJyQmtJiA/Kagb6tg3Wk3xHl +DQI4891txNRRvZDOVJsvfpSB9mPtM1wWDiVh+J2e41sjv0WAyrcDcI58aPwywBQ64hJ/Gp7dPRg1 +6lWuH8lsoidYhxtK6a3QqxhP9DKMumO5qq7NMXE42r63gu4vHCrrsb6+RqCxyMmuFCgbbqYBoCgV +TCWmfXuM/Araa05MbfNa4K2A8LT5bRCENgEXZv7Olu5cX6vvS5OkyG7vc9LYMdbAlTXs8wl/LMBs +xFNRIFje8QaHi0lp63Bv1+Qt4GKunpFKKBCGK5GlPtQnBCugPgS6u7s7kSAd+xC/n3mgOYUwm2uI +M+Wf+sxucr6otw8K5TrRSwFEH8O2dWAylCnLpdzVm1gIR4vnvVqgBqwdNDUcoR11jNKxuU2wpO4M +pRdQUOsY/f6KIOjrcZY9g9u//GfD5rDXS80cpcjRTx+3jhi5Ekg6j0iq12ygqJm9VbmBwepM71dJ +vFebcuFWxU1bQnzxBTCJ+h+ypkBqC4Jw9Xaw4JAtYyaKdluEtPcmJnfcA4smS6I+g2DQueUmqQGD +1oo+Lys/Dv4LKV5pc4+0xSS0rRdGVgI5oKvhZ1azNYO17gHSCOo6jKGmfhmHUMdhX0CIQ5nDVEVt +60sut65jspuQMZxfGfV0OysOoa7ffqblDu6VdT4niIt4tnvp7y2sLVI8hZGIXocFw759si5/6SlM +7N8+LqWda6zNlFSyjfYekyymoGlplBxtmxaFVHtDil8PIeT38lW86nEnE34CDb6Xa1WYOvrLaWKb +noRUHUtRXi3/mkreJtfhqdmAy3hs44jHqLkidSgrcu0vj5Hqi5CF2qTub36oyKgVW4twd+MrUxNB +WDHWYONWjorffyWWNCVMLKTpj5XxSHyeaE4hvzISs3ns5AEcLnA3AzpEvZWge8EvaIaRkOyrfGVw +MQcx9nQz8LGweH8e5maiaK0AzAgm9uQ+JQBwh0/z78qje/iR3SkeOcVeLmR3kB9WJjxXGJrf8qeL +yaRev4MlMn1CBEArBWVZuImNf1/Urh/pdyDo9xnxidiFualBO9YizPejyJgRPooY+3wrDazZRU8R +cSLqxU/50p2nzNMdkBtUHJq6LmBNJ08LUItTQXEVISUbtnKDXAnjFOh69D+duFMi8GNZiWftmLLx +RQDX6feGaoElomtDgX6bX5v9SehrKvQF8YmRuufOsbXWV0PMAFvbzrcn6xtljhXEU91Evy+xVoet +/HsvdSPKh1Iakq5vZwfzAnOztwov0tFQtjLqqishVHIKdULXL3aHl5Ou8ytI457NwpEwoHR+TBCp +gACrhSIrk8zWA0c1LFVAXh6nByq9VfSlsQQp2WOfQX+huQPMMjkSB20hjQdE9XSSj45qtggosHXM +plZsKMmWzMBWiX8SRqRUSIE12hf/65oWv/uSZ1AElSmP8JJdqZkCKvjhX0lU8iUJLVyyPEtv87t/ +3fkTv0Qr1O0HGrlIdaz5nRrZlxrKgdhWG4e2zT6IJ7B6CspJGM4GrpMUM8WJbHznj7cNWkXmQmDh +LZjgCSScW9usBBT+ShJvwYQvkrPYkJ+ibosFzarxKnNTFmnb+fDLa+RY/SpF6p8jN/3Kb3frJd0D +Sh3YrdeuUOae7oL8udIIR7nXOZgyoPJ5xacZTVNRxERPatWCCkQFjJeY+U2pr3m9Z03SgR6uuLPu +8EBoTce7ZCdzfMm+x45aqReZpIiQbzUwMObn6K3PQZ3XQX0ir1yBSF53BFb2u1W17cN9+MCdCexk +uRyK7R6RfMaaHuS8e8+/4WpgEyuQEu0jGK4L3wL5+G3Ts6jHNKUtnq5UJwst6xanSHSMMnOjhxA3 +8EJ1EZVWRSjr2go+tAENFTbQuohLiGCCDdg4EnrafsZ3v19HJovEJG1WBu4hGkkzPHZVV2cKKJas +qQHAHXJyFMYtiXLW4mjnSyr1AZJc2jBxzLDkuWX2s30Ay34CZOhXCT4O4VanNaPmLnSNuheORIkL +JgCgT5XstzHAFypb4ampOB8cSLboIjj+4BsV1KswxB08n3TJUtY7cZ11pBh6zUj8+nZ9CZkpG9L3 +UL/jCgYxDanRfrzPX2Ymbpkbp5VdiEg9PaQWXMjo+Sdo6B4Y7psbW4xdpyGKyeV3giRZRsO0XDmK +YsGZ216+5NujlcCtKyGGWL+uykyk+H2+7wbLsFgIpMJtxJGTpBAhV62ng+wqWxPuNc+uVuiS8UUd +5B1ehxNJsKETI6B5dH2x/tbTmhhwPPu/ArZD1MnvPopJ+41Ab6i9ibYF89jJcmrnLDI31e03rQiX +GqMtdMfcN7+kvxnQh1abMyxMecWN3/jaa3YKvi7sBj/THaMhcksdrlSnVJzDHpDsfoBdxQNfzJDN +auKmNIbDhI7w6jRLu1WBN/DPK8p/6IkuE661RmuoTMxRshcLPG23kjAdF/1hNASAHykMZbtY/hiF +2/IYamUEWswY6pP2JhUb0Ot8S5jA39Z4aR2adIYO4o6cO+GkD7WtGTL+A12sv8RTf3R6qEdrDYPh +3ob4MsNNwoNDNTswaIFtyBrPn/VTiSplEpqL07hnnrj4AngRoaX17WVwaCkMM1eDIqKJdwadlvTS +uDg4gjewBEktxNqpv2BZU0F8fjx4IOxYqVwP9m79JG+6tvT33gi23q0tZrG/LziFX8Uh4tm0/VCo +BtZuzqtBeLsrT2m48Hio411NWDVaLhnAGbiqzFn2vV+dGzlCT/VKbjB4+jG9pe80DZaunh/Ydq+g +svi6xoBBYuFPLS5u2DQxG+NbFvX7i2ELBcNytj4MGe1wWezzWbaDHG9ChXCt+ycPPpmqUGTwOAK+ +PG2LpU1xZsgZUcrNOAMjtTOSiNkaO1LqV7JyFMWxXRY69Bew+9CZSyxiVqlJKtANXznRvWR7xVqS +0ek4tiht6qm+m8AGsddj0+W2cFo/IE+/u9Lu8RJwR9EkRJB4DsLqORZ8/x3azliTTPd+H9v+SAiq +unakMDDkztUZxwOqSYf1Yu16tYQ4nKSfgWK4mL6SNBhQgIwaJBnS6L5nsb8LpZkrkxk/VGKRP+G1 +F/T6HNUH7knjOOwL2M6Emx+hecXAo00mfySFHzElk/QynsCkofLJl3XMifqAxYj2ru12iy9nMp7S +pZJAiOm6exgjrq6JhbaIBbIS4UJgI8vaW56Q1Y2QDdf2os+hYA1oLgI/bFGGLYlvO790aBOGHziW +AfLSz74P8d1uI7Wd7A7/WFsngCoBSmd7r5cAb2HFGyxJHcTesVRyxYVvwnnxeabyLiGlumCP0ymg +rUvTKBGG0PU1mhDglJohmPocl2g3anc3cDIIALDkoSCwB2ynHmNG7f4hVk8ELtChlh59+61LjeVj +EkICb9gabsrMOZci8LSYfJH7NoGAvRo6nPIBnsAlaRsYk1gm6MR80+R/jpfKe4SPAB2tBmLeDXU9 +w3c1IGyNDNQgdN6j7Ju26078hAhqsRDCX/TJckcxZ1V1fVEF00gvPyouZ3NCscxIV5F0IpsRbGX7 +vtl1+MFfsEk86sCBjN64sONJxLt37Lr/BGugO714y17Dpmm3c1Mo0E89fkdXYLvzZ940RVyHIQCW +3/hpXNY0Mllf+5Wn0ZUtXwj53j9JoOeC1tdub+d/RBM3skFKVIan3lf/05yQU6z60SvQxa3c917n +xoS1xRmC71vX3fFu2p7wndxXLQlQbB1nlfG0UbVhk41rWsCj5LZVvp9gpi79jynI3TJ4wS1hhPtl +XrzcSEm3chpSEFLOa1ftOZ4GxTliKKeYqr4sckV1aRh/X2EKjtEgBArRpTh4SMAxSv2dXWW2w3hQ +UCThT7kHk6TixHMwZdF+ow8OGxpig/wi0sFjoRJjX3FI/5CPb32Kron7nAYYslEbKuR23iOH/Pj/ +WErOzfnAGJXEGGUKsEAxAt3XruxRMJCbxS9rnsFzxuplNi0atzVlL2wD03nE92VEihOFxX3Cd4IM +fjD6rl8rEvD8pDtlgctyq0uJ/uSYI+hM4QeA1tR5ITcLcXe3Boa44xnY44iDHk/vtymGT5JcqU3J +1FW6/JLXBoPV0zRdqCm5mlWo45OIzrbk/ibc1D3oZfVTdT9DQ2i6QBAheudwuhwSBiAMZ9MGIOCZ +EBgyhFZl1ZVhJ4LAXvjM1B17DNhCCnFKTWG2HOEJT9XqD+LiG15QXCXL72hLmbQIQFx21lJEp8xU +uhqcPSvr4cOJbwIRct3amGLHAk0R0Ps1e4fyvzbiUU7wQZRvF8d1NdKljk31NcvxQJhN4dtuzoZt +exkkFtPPmArK4H3qgSvIkzzKsgmOG8eLQuZRkl8xVQ9ULZCuxWgOxR2Vbka9nHg3ZDGwvKbhkd44 +VUUZIxgFgpVTYk1rqjCkzhjMJdaBJuVQKE+vi2mAjWblM8QBpaVvQBMZy5ByhCSU+KTHgCuzTN8R +ARtWXmUtVf2OYi+QuSTxDcQ7+Xnamdk9WRhtmI9eea0WGvvD0NEe79YJOxqH/mFzghVofRH42Lxg +j7lOmxNDIiMyOJOZvIEvrn8nvH0i6uyyzHFPNqGliiaCvCMOCJMx5DNWtJOO1T9tCfOfrL9RThKE +mbn8Umhd92RxeQYE/Wx9nXlU3K6QgNSkpXUGyD6HxE4n1emUn06xYaJLcy+OkKB+wXcaXqGO+qge +eb9txLMSPt+chhIBjVIj+58sDTiSKoDubKP9Nhbje9mrh688yhuznrcmY85Tw1KRGmYnLOaNGhhV +romA5zU+eHrr4LnC1rIgj5dAt42zXZVGr6kbJhFRmz40mzJUfbLSj6r1ZGqfGWayHav9uF6V3xK7 +rX3lbTzjnyltwGxKlu9kQRSuxJGOP6G8Bq2GjsARbdMum9/w9C9pSySBYTBwDYEEi/lLi8OnD13V +BQCH+tCB7T8v6JwIGU5+trCDpsFePtL4yu+Csu/epQsHGt1pugFpIn/eI/VOonRhPYydFmqowYXW +jrKckzSf/nZskVMatH37a17jQaLkJj15sj3vI82sFFCU/deFeqDgVzUz0RYMVSCuHHpn9TqOIn6S +dECMGK888OHiHiuIpC11xnqo0hv3/+2RJH9wNCUu3y/xJdJqUpoO9KXxHbhkokLYTDcVCAyyBJ/P +NcGJNaVcUbhcYaapCF2J5oZAOMrO11rSdP/zCKGYoyhL00ndbv7rwiuNBhjHNG7Xf+TzlSJsxAB/ +CRCObtFn3rLCe16Xq01omXjUPylRSOm/D++ELLOs8BpSryh5msntwVT1cQFqohKwmaky9fiIAWAb +ykXwXX3jSM45UjnQeTHd2wmlcGTQv9IFbU+Iuag1v0PLvWqkxtNvYsMy/LkhVbfNhPl+Vp1YL4mD +vJZllNSqcuCWUcnvF9wUENIdebP+iWFWa5EJuko9JShbzbfN7Un+aFxC2FHGTCcXdTvz0BjemCDu +bOo5osUmVpkXT0Vke9lYHZumFddFVXgWw4szsxgbclEYi376MXnJAyflJ2Y+0iUwgNAHTzCyHyyO +veMCHvDU+18OBsidanmr/cSexjbiw9CFMSbfwwJHm0AdNYjMFhwGms5ZXXJwjG0DpEYZwVXpYnwh +gkRQqx8cXIZXpi0r3EqkrRuah1PqXpaGCmQhW0J/NmjPvetQcd8V+0OsYQE2pp6TEhzPOykFSSWv +LYhfyK7AR7+zUrFe8xcFLvo27j9UCPNpJpKjKrnLqJ92ryWPXu3Jv6LYoLndpQrfcyDPQvFB2G4o +tb158cnu6D9XZJK3cuiCkwmAK87o+Oppm6xezCWU3TLXvEKLQEwjiZ92vjiJND3gQVjzdncwLSix +i3Ow1Ifm2fo6LhNjT3z29kHJPSGH8LVWhQAspJ1/G20aDiwCNynTN0ixKI+VeZdaXlq2Ag9jSD95 +4A9lq9tRZ9yw+1S/yqtrMZAC29w5JIPqdezuiPq8FdjyKoaFcS0XMOETTdMtpYsvQfOJRGHCT+tR +Cxs1clwJ5Vx01IyvEeIghPCahpff3YIN6Q0XTl2pyVSyfI/szJBiKzkctMVPyD2tzA3E8rKB/5zJ +WMCt6946e94Z5tV2w8bK3nH4TVRx8stAfpDUUJTrs337ReCREfAyoAOqYDkYrcjgsjuLUYtRPOQz +fwcyarz4Od4/u5asqQd9wqSceQ55unm4Z8PC4wBK+VMCcfERIFoBDaLXS/Zif8V2zuzKtMh+onGD +YF/h8Ai2cSK0ggY9XuxHFN6N9+UPpknCzbLwPsqWpEO0Be0yaq5A15wLD12Z0ZA+zk6BzXgKWEjF +80pDB/Bfj0l8a+IbR4VDv2QXkdYe9uCvlYFeZTmXXIN0OC0JzcVARCJ9TvrgpTebhU9WB9Aqc2R6 +4R+/jSxBo7GQAzsExkEcRdk7kRccU5vtQ5cKSLOsJTlVjAxJ6AFypM3Qx1C1jmxs5sXJi8tesI1D +StNSDhNAcJC1P6wS2g/KU4g9UQyCF3UzVEaXq+kvH3IwS2aD6AZ4EqAmhjK8JTWLeY0m4kBaMZsM +k6j7rU4I0NMqF9GPsZShOm7urcGYbCirWX9zN0zPMQ7G4kzvk4TPbVIUIV7DqQwKdnvfMc1Dxwe4 +P+G33fxmrRckHb/LSkmrrBMaAQ5WPTnoAm8aAholz10zEZ+hoVSaqALe4lBzS0yiGweFn3InNnR2 +iFZvDrfarDM9UCLE7WzVy05C7sJ3wJ4AA+1v1Y8MxQHFANzHe+1k4AFUKrBzEy8bmzVmM8dtpbGG +GuXwh3/T4DmBCi7S6nsaoMAFhwKciIV7idTLw8D/vGO14q/ENDbjhLWCsz7bsJDLtcJ7CFopFts0 +ADEnHx6b4Wj03XFsiETcsAfrWdVu7CtjJHj1Hxl/VvqokkIUBjA9uYflHKen1Kt7+zs4P65HFKtm +tJylW8cdUEqAtMMCzoF5eQoD7pJdqj08rl8JRdBWIibX9UlnKh14bU5XqFdjJCiG+0ZHNjWhx5EH +AN1es1jfYsK7ElfjO9eAcPgBr+RGKWKhLE4pwADpOZ/r+/QbXNSK/CBNzohVzhCAN/c1eoW0bG5S +8DW8A4fgGrX3TBuKcMigeLP4UlH28Zqk/aCqY7ztI8IbXC3yWpft1I1StwOPI5X3a+5doKgSsRv6 +YNcLWQyn+76rhy5k+5lFMIGzOjyH1Rvp0hu/J3+bPXNbjKTWgEO/5PR+nAkCxmUysAmvXzf5kPl8 +JDbmua4k69sSS46Mt66PvKeqTVyv92rsY4ffMdmUHzIYR0K2eb0C/GIJ/q6L0Bj+3ZfQZlwCsRVI +5Ya29SadPtWl3a1tJRb3PIbN24NfbGk6rRFHHNXDOx0bZCNA/KonATw+5ANeoFWRr1XYvbceTXrb +N2ZQUvo4mHsBw00uAjOrvUT3bezIUiWfc6zGbZsZaKVJ2PwFOCCh1ySrc1xym5UVDCZMX0yNz1zh +da+9fBekQb2bGtqEGDsNQZ3KHiG4tG/dBHDSNi8mNm8e6erlhNPCvHTroQaoFuk/V48r4MkF0/PV +8+zo8V+I/BYirv7Ba++vH9ej74Cs5Rzg6SI5MZnK2ja/DfWQNxv2T+vCV8KCV0FiAx83ZmVrtw8y +WrPwW12ENsMJ51mwYjdNIZCkTDVEsBMRVpvT3zFSfVtzsCaBajMKUbrO4d8U1mDKdQtIMU9mytg2 +qwUEg3++IEnTo7yOaBp41Gd6wMIVpYU4XLloYAl2N0ugUmQ1uW2Bnj0DSdo8hztszzypPD5cEnMb +aTaLYh2PnxxMbb9D6TwKvlaxzWMUkmm7XSsxF0k1Hs6RQwhcV9Db9CckqKk5GRrsDJ3XlkYA/fI3 +odNIHHm09oiVw0jtJYnrADRY3OivNrf9LmbuM3mgKVnGqhDo4a6ajmVGRVrwBBSvKyvjGXVr06vz +nkajbphyaQRJ/IYqTSGWNxmVKnQ8ARKoLmbNXcoshKqr0sZzqVgjmHc9Uksvm7QOXCpzIPCpYdhg +w4t+P2bwAgaM1zaSR1baFS7/hdLmR+66/PParVTpNqgepUFjCM8gOrBvcAPXv/XmEh8WdQFX6XxG +IyezESUYrXxeffzTpqaMXIqERRJ+VBqbzQ/GTTbUTzosnpiavNGu/VwPdwycliog4+ncuMyZDPS8 +0xWX5j1FNEhwI2yMFA8EBV0iNVfw4VugVP7Nq2HPdWwmBSA0BCr5UruZtgwa8uLincOlOyVtkH9k +ij83PGhLx6jwLdKzRhJSuyOkzojy9NuNqB0d7Ysshl+33Jk/4Jm6k91r3RoIFuL27cyhIyQQH6CE +QolX6NOF2oWpSYo9fmvKE/Jewv5sOa5gMJs7kWmnfMNxGuZYmDllGGPZAo/IPLRpYu7+BRf9K8F7 +VEMe9maaP7CUZQifbY6hySD1CHHOy7V5rwVppcxPQN0u1R/qH1juFy/+TxTuVJzUq0JEdsCLTZqh ++eTVC+H158lw8S3w7xztVN33gFf2W51DSCt3LthnLmH90JegT8bl5HOPWiCpVnw7xq+xd+Ysv2xT +CDi0ZYY8KpJvMkDu/PX8or7jyfmzw0e6L3Fpi4LodcOCiG5G0jdE9CflPzkyWF5kTVLY3QZg0+u+ +TYtd02KCDeKhdpwAwVYYZe+j1TzfuKUbI++hn4XEafCTntU1WVpqcjiglRm7YNQjvraloAc8/dGU +5SXKyr7Pd2sAgEZQFS3I+nuA8RpMa17WlZni/rlupXktfWGk9j7fQkWA6O6dbG2sgwv2PhJ4lhFp +4pZoEzwjMPPWSkLNYCe388BlVwoO9f+uc45vVDL9j5SMe48ooJJPMMf9IDjsFU9IOpPFBLGfPYZZ +D/tw9FxqKCUtYDJQ30HkseHZSZmWk0rt84dnnQvQkflwmGZd0UOhn02o9IgljEOqxninjSaM4ELj +3eMShpp6gbHwxnBdwJlQAajW04awA7LtK+yCi0179mVw1CJHDt4qD2UvlxXFKOJpK7cehD65ed1t +6gyujTXvRMD09bT7ZZUs/3W6EdlFx0LJueQJ6xx1Y7va8khgDl0GiX0KN8RmYB7L2ijN9ym5Y8Ki +T39tXyeI9jCOxEJJz/r/zf5yKep99eFHxkSNAX6qdKEFDpq4QvpcDuiGL1RW5YQBW0onqhwsWtNY +LoeToXI1tdUx81bkOqpbUuwxK3y+LqG54k2uzbWpDLzY4FWoL0fFQc1RqqQ4JD79rW+oXbObvSZH +gkVw0Zm5LX8gPgThjvt/FL6usRneW3uSoC0rarpQBXm8KSnmJ7R+2o+Zw7hRf9Jpx+Q7fO4FGuQ2 +AukYHkS2ZUYe1kvzlle/JrJ4fM8A9UJl0rbca5F/rkZjigURfUMutvacuqo0IMmPpfINRql0y/LN +CE78FuBvlFuk98BSoECE8GoV+HvQpFEv4s1a1T5Ye3JKeeZB5q01cfDQg+Eb74NrNM9kiM6ovqwA +d6jFJArl702Fh2GHfvK6yWn+I62vRnJGggdBsgJgWWpQkt6nrnTwlybGQsiD6G9LLaXBWN474367 +Lgv2FR5QBXgLmOSKroXPChxFQUON4/Iky77/fWZ2oL3fYBJcfT1yaG5+PPwtlCXIlDMP0I+4tJmH +NoGDPtB4FKekGcRk/4p6AjZOGneZF01IiNTshF7/A4DiPWsLVD9j58Na+Q7eJycFI4lWfKQ0Wgj3 +d5jKuR8MR9khe7/z5gP090ukGTTfb+HAi5SgctE9teM1qcVW5FhkhtT1l6O6Q57ynxtwLkFdxaMz +i5vrKQQ9ONHsy68txGjMpK9GfMLuedvbXxduxYAMU2V5FrAtInsYHelx+DHoYT4Yp5kIiQ1m4bL/ +krHu0umVjnwCstQlO9x1PAN1DbKLZYeoLuSv/I5XegrpIhFrR9MIZ6CyofZYDfRomiz4wuEpCiY5 +QHo/ncL8qoL7S5TYvoSXkwL3uPHrAAyqks3HMJMpFg6X7eRLgy18W5yao2j6Xjm4sNrGQTDT33S9 +Kl+H58ZRvPcTBJziJqsBy7udPZTRLWo+LWQQrpq8S7eYBS0EDM6LPlfghbPV389XebaRqdJrTJWn +IMTRS5ArKlCMR8jI6iEeSkQl6URu0cpBmmjl/dytZ5mA119i89Xi7LozknbomtBCzrJX/2h7ptnv +N2hibK7vJnxtFj7PwmOGZZoDyZPfJd72fSZqchiNuihnOejQJXwms6TxYWlcSd1N3lCnBqWq03H/ +KRO1PWLrss1Xn1AV9mt0nIGR2FcZIs8yuah5qZuaLKTjDWYKr19wAhCWSTjQwgDtxywZ6VFfXQ/z +jZQk921ByVl3xQi8DMFnfeD7uQFRh659dafLrAYw3XHvElVQlsNHN3Polc8VFbS8q+5BrMGLipTp +njm4jWqHEklDPOY1M80+9TzXOou2Pi7W0JZjf+QOB7ETAWqQ/K7/1TYi8QBgjruzglRisS/x6G1S +x8z8a9sAeH0mTmsDrMMRmpXeYYcZllAmp0WO7r6hxAmX/3InxNJKD/9DfpT3tOMFG1J0pxbye555 +uyb5TGUkbxlYj/71wC7e4ZXxFjh4KgMci7p6MvudA/oUYrEAUOTZEA6xBPp+3vXbmaAnWGn6DiM2 +loL1A6aDrUP29nfH66yY9UM5rzneGLxhPFZkMT1VO8aEHM4bY1Wtsib1lyiA221sZQCyNlXDdBfl +BHO3qqE2okYxXB4TLBRmKteJ6hDqnpcrgcRbCX7W6ISBlInozMn8Ua5UHqqspyZC7x8mLII2r8H6 +vJ63dd4V1PZ1TSbE3sQ0AwJG/LtMpTvG0X0i07YK3+F7ZudeMruZPwVND2o2A3QGSUKndYqmcsXX +nZQAH0T/EO67MoMHEKd7/7WLMAyIOuKtnCMEoWhil5zGPzA3iqC8Y7JjW5U/xTrhlh2IefiLzKUM +ojEQLFIqrY3z/B0SE0d4AqMAwQOuJlaudaypFbnst4TYzkXNG0If22+ZmHJ2ZaqFyaSIgL+qMnxG +7XK4yekTE+IYS+kGyBDDdITn671eUANELsG1oT7rVp2TjG90Jz5jAcYwO2DHmh3kSBLj87jaKYdR +LU6NqQWe/fjdqzmlVsZHLJKv2p8FkIQV3vDOdqrCB5ZnrUzYsK1KPqvCm3YDCX10sjdKLS4Hi8Yv +XIdLzp7LMSdF+3n+5o0AR2MIY6Q53cdEJcWlJYFUVugMfTUA2x5FdxyYyNO5VBuC/6j1rDgQwP06 ++RFZ7eAI01BLxU+HoBvVQmpCLOFEt9J7SkACWJjNvtdk2Prz+OtDWuVs1FdvQYSBfosoPhAXDbYx +BrJ4O/ZAL8M+ocIQCqMqQhKAjN1JWj+/5+qZryqplG1BDdKuNv105PJ/TbmdaoF1dGP4TIo+lSoD +roSbsPEjR9ni+HaRvr6yQkfL61Fx2iitTe2W6w81lHlwh2QHOkWjje/inAR4GFwEFiiKFqmX5Tl9 +yNci3YGbfVY4EBHEQ3DcQC+Oyf52ej9KSG5xh0azHBahq5l5emnrQQGRb07s/2LTXl+7ENe1vVGD +qvYlHoIFD5xEF7ZZuzfpuYv92o7W595tI9qZYYrIWEXTOBXLOKXU6PbiglN0ahqqpHlOJgRHBicw +0Jw5EigHsb248603zwL8noCB9d97BMTpuOSwPSmIGlNX+9x1OAIuzagKE2deHJCN5StcXBmzRzTU +9owF3+mHGX0LYvIu9CwZqbQo5N4BWFfGGM1X2qggZ+4nYtflEimi5wejkXYqqwMA6jU9CxnFCDB9 +7R0y50enBbvqDqMqdWfyGB21nSGViY40iVVm0IgJEouPjvaqDEoIZuiAqJ+bmOceyLDbte4a2YcH +479SA0rR4fvFFWR+i+NuIKipCSZYFKP+LiAyH+9jjsO3mzP8bL2J5ZKsagyqzCtf8hq7xRsN/Mot +MHFsuy332e8eSw2k+BGW3tG+/KsSehTGFkDwkJho6XdZs90gnmqHQehdYysYzHmg7P3el31xLlus +CBKVzE+9Xq4/rHmavBLs+HKzBUsyJHJ+UdcTH8qoNzM27y9ijyTnc+TJraMervhUJnkZZjdXQGEy +pvhjDsDWqdH1uZEx1yZGGhYk4pBnJQTRFwL8Zvk+9ZU1OJivm6b+i4Gupy1FGaTYuydJm4GaZTEp +WxnTHpkTQ0RtIq2FjCpy/2xIAet+WXMaI1XNOEHpBSWx1lNEa5tyXh6S/jtdrx+KyCulyC4cQjM8 +rwaT2g/ywnv4U1R+gAfdO89XJg4Pcf0kdYiTHTxh6PXXy6lvdNfibmBATTKfUwmNLO88ctVJvzXO +6t5QKY8GksxVdSwyXTg9LSxGFXV1QiWi1cM0qSwWaOqKy6aO9Av/hmaqtaFjU83pvdYH8bGnJ+gU +QnrwE3kRH29UIqyghMAqp5fUv3Fb9SPwnwl8/h7i2XkMTGsb3f+CeXZ3x43h/Vt2ICsfm5LNcnj4 +IM8Qd2Icn0jP/Iqf6ve6zRtyIx0i03LTAL7/3gaY3dBBJz9esZyI0Bwq1CNasapNRDNBJrluGZBE +jSm3FCQqaJ3JDYQyyUKTq48gIejfPAQpS4h937FDb5SBkl1tK0JtN1OqbgtOpWkOUo2m3cBMte53 +GqTr0lazscurletl3G0uLNEJDUDe3m6dVjJqA5L6zPb/4cVB1WWRQ2igjNW69b/6f0lbaxtm+Wux +vmJoJ7LFYR2nEN4yLTUIIHvXVNRvRhwTcAj+tA5+rhhuVs1lH06k1RKBf8BDSaCAgkEqys8aPn+T +LO5Klk7gaVPlUY+vTj1tYqDfEDm+GxYhocGs4GWZ4xjcaQt0MKKZtLCz75jA+7weX9OQVUvbnL+3 +jUqsSQAdu6hf+LqLNnzXv7oxyVGSeDqE0tYdBDgIvguqUrzPdMDwsGTbYPegkOeuUANQV/uFG7yB +KWaBOIrwcTgkhdcAk32RguN+TvXRxUwUWuJRgAfIIQVmaEUuz8ZwIqR7TI2nSGEabrINd03+F6Qv +zHM1wOHO5vp/3VZMsFbhnYbonhwh8Ni78tKxICtCfeLNeq+ZtH566O7jOQNUN77v4QBY7+XC3eXS +cnYyDV9qzid0QDLk91muNvs8lLw6zHCz2LWooTyFhftjfsM/rwIWMxBaILokMTJDfi+Ur1pt9jUI +GaGclOYIYpL+wtP7YVS1cEgRoB1SEl4Khq2nC+OUzXSCzYahJSMq/vKnA6paJ/RRuA3rcMfPt6zc +owgoIE9JH+P2XyrlhnSUMDOWQqxhwayAbzgQPSLaLNeggthVZ3sI/yyIGnUHtBmAeRKLk4nd62qh +Oup+HIv7UsTrCYraje34a/GdwnGwbesXzIFSYOS1pF4DyZvA1Mpj+NEMfINIts47lrWoqL/R/9P1 +bIUK8YkFH3JfYr0//KekamIH7LYvLzLr9Sqlex8VeuvMxp9d8b9yNj58EO2TWmgHTmnuQSY1XTz0 +GtB/kVnajYrZ6uwd56TOAQ8dd2S9P75LrvuPTDFU/U8FGAS8XOWhu7WeGIxp7/wUX2m6phiECSws +jsThFrDUuZhlsGCYaD6WLV7AQ3i0+V3Uk4mGpXpEYpe7cHgNCKakzzWvXGuhX2M48V/w6cYF4VXo +cxn43Jgv3gKHuXrOAiMQW7DBMWN3KaItD13JJDO7mKUG7yZR6vLR4wgesWV9ek7pPcLXbYpF5emp +h0pfM7zbg7O6ajGKp7r4rI0X9HClhIFUe9/qKOU/P/u1iip+JxK+D5OBJsywp7Ay+fi9a3fXuLkt +oOVGqsXFIBVzmy3vNSjy2f8XPYbcEODdP3dMHtev2MwzLVX05925xNX/0AQ1ESX3RhqxbH37lJR5 +QMxw8I3+VMKecdt43JjxXdJjL7by6deMU/6J+rhSquXDovx2+6XD1qsSdJI/EHgy1n8kpw6vj/od +91/8FRyspRYe1DPl5OrGBlOa3S8aT3JmzyPncM36YkAMKpdN/AyrtHe5izkQtdL59TP+i8rYDyEe +JLCdGQ5vC9ZxvDtaNm/1FYFqa02PG81qIBVyCRlRECCgjt95k49oYx8IBSkZ55clt7GxeAF5Or8B +I21BKDvUVIATk8jnaOYod909Tvu5YuHctDM5y0QLpaSpyNw/SgaWageNnMnjLkMi4qhtK/qocHap +I1DncJcG5HbuUE8U0OkLJI8sJ0O5Cp0m90cZUGEC6Wx6sO67FvnwwxoRvodu1Fm0WbY0OYBrcjHF +bTxvJelzZjVmUk8ag3ZNuqoRMfMdeKiVpuNIaOM2CIs93G6uBjPYnnTTCjCfY2Gkm0e8EfiDBLvb +7HEsKtI/kmJCbS2mApleS1Yq1SRbixiZaoheLm7NP2idHrrIuGIKCylJi4+Ywf2tWe7fW8u+QrPi +9pVeLZLA0m17tq613+ftMpht/KzL3LmEzkJUSTuFJrI/AQPYwUL2dSbix4tqiTjFoYX8NUGqd2+C +1a1AftROBSCi8+pld4t5MnroP/DtwDZnBRxII9J7tZcIpIP1oBv0OYK0sdjfvFijEgHd7bs9g6R0 +UFc59zCizjFJ8zGFPMIF7Hi9dRdtRgnvze4c50Q7JPyh4jiubbs1Ad8EU9n1JPy2VU8GggMbxbQx +OYThhu0PQ1sKn4S52Sh7WtUc3VtO11HvAnJsBHxuNqLC5TLGM4Wr0iR8tXQ8guhsqfCf6mVX+w3x +0fNiYH/6fC5yBhQx4oBXn4OgPTyyglLv1EdNnqgNSCBRij7ZXAfufAkKUGK3tTuoFLWeZtvrzvwA +2ho4xmasboRRSFaOBsU34YkgfpeDROATfjWkLFIaP0rVfb9IPT2WHXhstsaTvH8bYgPtoy91NMBL +GxKKuAruieYpM3nrhPaNBBAa0lEBtGPTH8rR3CO6C0PGEECY6W0CYqdDGdMFYE5widbl0734fRVU +yPMi+hbdxOGloIFSzEK5qwSkZgPFawjp5F+CBy/2xumx6ZoZ1T4LFRCO7B96E0AKb93aRheqYxQ0 +U8EEKoadmhUN2/u6wpZcI0OWeRMoAiEIP4I8mjwkpN02ZM1e4gJ2Gi+ThbgAWXRtfIsALD2r1kTV +elcc1gERgotnQt9CJTkEpVRoIfVL+ZBR1kIOLta5XBp+Ekv6QTIud7ehQe5x9wMpV5t/F724KdaW +ao7kU7ZkDDalpkWskuFh//eqPfJGlrLeU6T/NsXnQ2LTkNEakotDWV2qpub5bJ57h9OrFAY2KaBW +byBCRD1AuK/wSjTgyJPlUpl/vo7gUxLfEFw3i1cwhakOnqgwYVg4bkE8qUI5eDF8dld9xG8TJq/t +mTNYXaNs0K6mUk4GeCTxY07yFJGjaZoecC/P5HhCVfbfdrzarY+YxFWQ5XyH68dMmVmhTEIy +`protect end_protected +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +entity bram_waveform is + port ( + clka : in STD_LOGIC; + ena : in STD_LOGIC; + wea : in STD_LOGIC_VECTOR ( 0 to 0 ); + addra : in STD_LOGIC_VECTOR ( 8 downto 0 ); + dina : in STD_LOGIC_VECTOR ( 31 downto 0 ); + douta : out STD_LOGIC_VECTOR ( 31 downto 0 ); + clkb : in STD_LOGIC; + enb : in STD_LOGIC; + web : in STD_LOGIC_VECTOR ( 0 to 0 ); + addrb : in STD_LOGIC_VECTOR ( 9 downto 0 ); + dinb : in STD_LOGIC_VECTOR ( 15 downto 0 ); + doutb : out STD_LOGIC_VECTOR ( 15 downto 0 ) + ); + attribute NotValidForBitStream : boolean; + attribute NotValidForBitStream of bram_waveform : entity is true; + attribute CHECK_LICENSE_TYPE : string; + attribute CHECK_LICENSE_TYPE of bram_waveform : entity is "bram_waveform,blk_mem_gen_v8_4_5,{}"; + attribute downgradeipidentifiedwarnings : string; + attribute downgradeipidentifiedwarnings of bram_waveform : entity is "yes"; + attribute x_core_info : string; + attribute x_core_info of bram_waveform : entity is "blk_mem_gen_v8_4_5,Vivado 2022.1"; +end bram_waveform; + +architecture STRUCTURE of bram_waveform is + signal NLW_U0_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_rsta_busy_UNCONNECTED : STD_LOGIC; + signal NLW_U0_rstb_busy_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_arready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_awready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_bvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_rlast_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_rvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_wready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_rdaddrecc_UNCONNECTED : STD_LOGIC_VECTOR ( 9 downto 0 ); + signal NLW_U0_s_axi_bid_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_s_axi_bresp_UNCONNECTED : STD_LOGIC_VECTOR ( 1 downto 0 ); + signal NLW_U0_s_axi_rdaddrecc_UNCONNECTED : STD_LOGIC_VECTOR ( 9 downto 0 ); + signal NLW_U0_s_axi_rdata_UNCONNECTED : STD_LOGIC_VECTOR ( 15 downto 0 ); + signal NLW_U0_s_axi_rid_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_s_axi_rresp_UNCONNECTED : STD_LOGIC_VECTOR ( 1 downto 0 ); + attribute C_ADDRA_WIDTH : integer; + attribute C_ADDRA_WIDTH of U0 : label is 9; + attribute C_ADDRB_WIDTH : integer; + attribute C_ADDRB_WIDTH of U0 : label is 10; + attribute C_ALGORITHM : integer; + attribute C_ALGORITHM of U0 : label is 1; + attribute C_AXI_ID_WIDTH : integer; + attribute C_AXI_ID_WIDTH of U0 : label is 4; + attribute C_AXI_SLAVE_TYPE : integer; + attribute C_AXI_SLAVE_TYPE of U0 : label is 0; + attribute C_AXI_TYPE : integer; + attribute C_AXI_TYPE of U0 : label is 1; + attribute C_BYTE_SIZE : integer; + attribute C_BYTE_SIZE of U0 : label is 9; + attribute C_COMMON_CLK : integer; + attribute C_COMMON_CLK of U0 : label is 0; + attribute C_COUNT_18K_BRAM : string; + attribute C_COUNT_18K_BRAM of U0 : label is "0"; + attribute C_COUNT_36K_BRAM : string; + attribute C_COUNT_36K_BRAM of U0 : label is "1"; + attribute C_CTRL_ECC_ALGO : string; + attribute C_CTRL_ECC_ALGO of U0 : label is "NONE"; + attribute C_DEFAULT_DATA : string; + attribute C_DEFAULT_DATA of U0 : label is "0"; + attribute C_DISABLE_WARN_BHV_COLL : integer; + attribute C_DISABLE_WARN_BHV_COLL of U0 : label is 0; + attribute C_DISABLE_WARN_BHV_RANGE : integer; + attribute C_DISABLE_WARN_BHV_RANGE of U0 : label is 0; + attribute C_ELABORATION_DIR : string; + attribute C_ELABORATION_DIR of U0 : label is "./"; + attribute C_ENABLE_32BIT_ADDRESS : integer; + attribute C_ENABLE_32BIT_ADDRESS of U0 : label is 0; + attribute C_EN_DEEPSLEEP_PIN : integer; + attribute C_EN_DEEPSLEEP_PIN of U0 : label is 0; + attribute C_EN_ECC_PIPE : integer; + attribute C_EN_ECC_PIPE of U0 : label is 0; + attribute C_EN_RDADDRA_CHG : integer; + attribute C_EN_RDADDRA_CHG of U0 : label is 0; + attribute C_EN_RDADDRB_CHG : integer; + attribute C_EN_RDADDRB_CHG of U0 : label is 0; + attribute C_EN_SAFETY_CKT : integer; + attribute C_EN_SAFETY_CKT of U0 : label is 0; + attribute C_EN_SHUTDOWN_PIN : integer; + attribute C_EN_SHUTDOWN_PIN of U0 : label is 0; + attribute C_EN_SLEEP_PIN : integer; + attribute C_EN_SLEEP_PIN of U0 : label is 0; + attribute C_EST_POWER_SUMMARY : string; + attribute C_EST_POWER_SUMMARY of U0 : label is "Estimated Power for IP : 3.643151 mW"; + attribute C_FAMILY : string; + attribute C_FAMILY of U0 : label is "zynquplus"; + attribute C_HAS_AXI_ID : integer; + attribute C_HAS_AXI_ID of U0 : label is 0; + attribute C_HAS_ENA : integer; + attribute C_HAS_ENA of U0 : label is 1; + attribute C_HAS_ENB : integer; + attribute C_HAS_ENB of U0 : label is 1; + attribute C_HAS_INJECTERR : integer; + attribute C_HAS_INJECTERR of U0 : label is 0; + attribute C_HAS_MEM_OUTPUT_REGS_A : integer; + attribute C_HAS_MEM_OUTPUT_REGS_A of U0 : label is 0; + attribute C_HAS_MEM_OUTPUT_REGS_B : integer; + attribute C_HAS_MEM_OUTPUT_REGS_B of U0 : label is 0; + attribute C_HAS_MUX_OUTPUT_REGS_A : integer; + attribute C_HAS_MUX_OUTPUT_REGS_A of U0 : label is 0; + attribute C_HAS_MUX_OUTPUT_REGS_B : integer; + attribute C_HAS_MUX_OUTPUT_REGS_B of U0 : label is 0; + attribute C_HAS_REGCEA : integer; + attribute C_HAS_REGCEA of U0 : label is 0; + attribute C_HAS_REGCEB : integer; + attribute C_HAS_REGCEB of U0 : label is 0; + attribute C_HAS_RSTA : integer; + attribute C_HAS_RSTA of U0 : label is 0; + attribute C_HAS_RSTB : integer; + attribute C_HAS_RSTB of U0 : label is 0; + attribute C_HAS_SOFTECC_INPUT_REGS_A : integer; + attribute C_HAS_SOFTECC_INPUT_REGS_A of U0 : label is 0; + attribute C_HAS_SOFTECC_OUTPUT_REGS_B : integer; + attribute C_HAS_SOFTECC_OUTPUT_REGS_B of U0 : label is 0; + attribute C_INITA_VAL : string; + attribute C_INITA_VAL of U0 : label is "0"; + attribute C_INITB_VAL : string; + attribute C_INITB_VAL of U0 : label is "0"; + attribute C_INIT_FILE : string; + attribute C_INIT_FILE of U0 : label is "bram_waveform.mem"; + attribute C_INIT_FILE_NAME : string; + attribute C_INIT_FILE_NAME of U0 : label is "no_coe_file_loaded"; + attribute C_INTERFACE_TYPE : integer; + attribute C_INTERFACE_TYPE of U0 : label is 0; + attribute C_LOAD_INIT_FILE : integer; + attribute C_LOAD_INIT_FILE of U0 : label is 0; + attribute C_MEM_TYPE : integer; + attribute C_MEM_TYPE of U0 : label is 2; + attribute C_MUX_PIPELINE_STAGES : integer; + attribute C_MUX_PIPELINE_STAGES of U0 : label is 0; + attribute C_PRIM_TYPE : integer; + attribute C_PRIM_TYPE of U0 : label is 1; + attribute C_READ_DEPTH_A : integer; + attribute C_READ_DEPTH_A of U0 : label is 512; + attribute C_READ_DEPTH_B : integer; + attribute C_READ_DEPTH_B of U0 : label is 1024; + attribute C_READ_LATENCY_A : integer; + attribute C_READ_LATENCY_A of U0 : label is 1; + attribute C_READ_LATENCY_B : integer; + attribute C_READ_LATENCY_B of U0 : label is 1; + attribute C_READ_WIDTH_A : integer; + attribute C_READ_WIDTH_A of U0 : label is 32; + attribute C_READ_WIDTH_B : integer; + attribute C_READ_WIDTH_B of U0 : label is 16; + attribute C_RSTRAM_A : integer; + attribute C_RSTRAM_A of U0 : label is 0; + attribute C_RSTRAM_B : integer; + attribute C_RSTRAM_B of U0 : label is 0; + attribute C_RST_PRIORITY_A : string; + attribute C_RST_PRIORITY_A of U0 : label is "CE"; + attribute C_RST_PRIORITY_B : string; + attribute C_RST_PRIORITY_B of U0 : label is "CE"; + attribute C_SIM_COLLISION_CHECK : string; + attribute C_SIM_COLLISION_CHECK of U0 : label is "ALL"; + attribute C_USE_BRAM_BLOCK : integer; + attribute C_USE_BRAM_BLOCK of U0 : label is 0; + attribute C_USE_BYTE_WEA : integer; + attribute C_USE_BYTE_WEA of U0 : label is 0; + attribute C_USE_BYTE_WEB : integer; + attribute C_USE_BYTE_WEB of U0 : label is 0; + attribute C_USE_DEFAULT_DATA : integer; + attribute C_USE_DEFAULT_DATA of U0 : label is 0; + attribute C_USE_ECC : integer; + attribute C_USE_ECC of U0 : label is 0; + attribute C_USE_SOFTECC : integer; + attribute C_USE_SOFTECC of U0 : label is 0; + attribute C_USE_URAM : integer; + attribute C_USE_URAM of U0 : label is 0; + attribute C_WEA_WIDTH : integer; + attribute C_WEA_WIDTH of U0 : label is 1; + attribute C_WEB_WIDTH : integer; + attribute C_WEB_WIDTH of U0 : label is 1; + attribute C_WRITE_DEPTH_A : integer; + attribute C_WRITE_DEPTH_A of U0 : label is 512; + attribute C_WRITE_DEPTH_B : integer; + attribute C_WRITE_DEPTH_B of U0 : label is 1024; + attribute C_WRITE_MODE_A : string; + attribute C_WRITE_MODE_A of U0 : label is "WRITE_FIRST"; + attribute C_WRITE_MODE_B : string; + attribute C_WRITE_MODE_B of U0 : label is "WRITE_FIRST"; + attribute C_WRITE_WIDTH_A : integer; + attribute C_WRITE_WIDTH_A of U0 : label is 32; + attribute C_WRITE_WIDTH_B : integer; + attribute C_WRITE_WIDTH_B of U0 : label is 16; + attribute C_XDEVICEFAMILY : string; + attribute C_XDEVICEFAMILY of U0 : label is "zynquplus"; + attribute downgradeipidentifiedwarnings of U0 : label is "yes"; + attribute is_du_within_envelope : string; + attribute is_du_within_envelope of U0 : label is "true"; + attribute x_interface_info : string; + attribute x_interface_info of clka : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA CLK"; + attribute x_interface_parameter : string; + attribute x_interface_parameter of clka : signal is "XIL_INTERFACENAME BRAM_PORTA, MEM_SIZE 8192, MEM_WIDTH 32, MEM_ECC NONE, MASTER_TYPE OTHER, READ_LATENCY 1"; + attribute x_interface_info of clkb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB CLK"; + attribute x_interface_parameter of clkb : signal is "XIL_INTERFACENAME BRAM_PORTB, MEM_SIZE 8192, MEM_WIDTH 32, MEM_ECC NONE, MASTER_TYPE OTHER, READ_LATENCY 1"; + attribute x_interface_info of ena : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA EN"; + attribute x_interface_info of enb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB EN"; + attribute x_interface_info of addra : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA ADDR"; + attribute x_interface_info of addrb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB ADDR"; + attribute x_interface_info of dina : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA DIN"; + attribute x_interface_info of dinb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB DIN"; + attribute x_interface_info of douta : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA DOUT"; + attribute x_interface_info of doutb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB DOUT"; + attribute x_interface_info of wea : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA WE"; + attribute x_interface_info of web : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB WE"; +begin +U0: entity work.bram_waveform_blk_mem_gen_v8_4_5 + port map ( + addra(8 downto 0) => addra(8 downto 0), + addrb(9 downto 0) => addrb(9 downto 0), + clka => clka, + clkb => clkb, + dbiterr => NLW_U0_dbiterr_UNCONNECTED, + deepsleep => '0', + dina(31 downto 0) => dina(31 downto 0), + dinb(15 downto 0) => dinb(15 downto 0), + douta(31 downto 0) => douta(31 downto 0), + doutb(15 downto 0) => doutb(15 downto 0), + eccpipece => '0', + ena => ena, + enb => enb, + injectdbiterr => '0', + injectsbiterr => '0', + rdaddrecc(9 downto 0) => NLW_U0_rdaddrecc_UNCONNECTED(9 downto 0), + regcea => '0', + regceb => '0', + rsta => '0', + rsta_busy => NLW_U0_rsta_busy_UNCONNECTED, + rstb => '0', + rstb_busy => NLW_U0_rstb_busy_UNCONNECTED, + s_aclk => '0', + s_aresetn => '0', + s_axi_araddr(31 downto 0) => B"00000000000000000000000000000000", + s_axi_arburst(1 downto 0) => B"00", + s_axi_arid(3 downto 0) => B"0000", + s_axi_arlen(7 downto 0) => B"00000000", + s_axi_arready => NLW_U0_s_axi_arready_UNCONNECTED, + s_axi_arsize(2 downto 0) => B"000", + s_axi_arvalid => '0', + s_axi_awaddr(31 downto 0) => B"00000000000000000000000000000000", + s_axi_awburst(1 downto 0) => B"00", + s_axi_awid(3 downto 0) => B"0000", + s_axi_awlen(7 downto 0) => B"00000000", + s_axi_awready => NLW_U0_s_axi_awready_UNCONNECTED, + s_axi_awsize(2 downto 0) => B"000", + s_axi_awvalid => '0', + s_axi_bid(3 downto 0) => NLW_U0_s_axi_bid_UNCONNECTED(3 downto 0), + s_axi_bready => '0', + s_axi_bresp(1 downto 0) => NLW_U0_s_axi_bresp_UNCONNECTED(1 downto 0), + s_axi_bvalid => NLW_U0_s_axi_bvalid_UNCONNECTED, + s_axi_dbiterr => NLW_U0_s_axi_dbiterr_UNCONNECTED, + s_axi_injectdbiterr => '0', + s_axi_injectsbiterr => '0', + s_axi_rdaddrecc(9 downto 0) => NLW_U0_s_axi_rdaddrecc_UNCONNECTED(9 downto 0), + s_axi_rdata(15 downto 0) => NLW_U0_s_axi_rdata_UNCONNECTED(15 downto 0), + s_axi_rid(3 downto 0) => NLW_U0_s_axi_rid_UNCONNECTED(3 downto 0), + s_axi_rlast => NLW_U0_s_axi_rlast_UNCONNECTED, + s_axi_rready => '0', + s_axi_rresp(1 downto 0) => NLW_U0_s_axi_rresp_UNCONNECTED(1 downto 0), + s_axi_rvalid => NLW_U0_s_axi_rvalid_UNCONNECTED, + s_axi_sbiterr => NLW_U0_s_axi_sbiterr_UNCONNECTED, + s_axi_wdata(31 downto 0) => B"00000000000000000000000000000000", + s_axi_wlast => '0', + s_axi_wready => NLW_U0_s_axi_wready_UNCONNECTED, + s_axi_wstrb(0) => '0', + s_axi_wvalid => '0', + sbiterr => NLW_U0_sbiterr_UNCONNECTED, + shutdown => '0', + sleep => '0', + wea(0) => wea(0), + web(0) => web(0) + ); +end STRUCTURE; diff --git a/src/hdl/modules/qlaser_dacs_pulse_channel.vhdl b/src/hdl/modules/qlaser_dacs_pulse_channel.vhdl new file mode 100644 index 0000000..5697a9d --- /dev/null +++ b/src/hdl/modules/qlaser_dacs_pulse_channel.vhdl @@ -0,0 +1,582 @@ +--------------------------------------------------------------- +-- File : qlaser_dacs_pulse_channel.vhd +-- Description : Single channel of pulse output +---------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use work.qlaser_pkg.all; + +entity qlaser_dacs_pulse_channel is +port ( + reset : in std_logic; + clk : in std_logic; + + enable : in std_logic; -- Set when DAC interface is running + start : in std_logic; -- Set when pulse generation sequence begins (trigger) + cnt_time : in std_logic_vector(23 downto 0); -- Time since trigger. + + busy : out std_logic; -- Status signal + + -- CPU interface + cpu_addr : in std_logic_vector( 9 downto 0); -- Address input + cpu_wdata : in std_logic_vector(31 downto 0); -- Data input + cpu_wr : in std_logic; -- Write enable + cpu_sel : in std_logic; -- Block select + cpu_rdata : out std_logic_vector(31 downto 0); -- Data output + cpu_rdata_dv : out std_logic; -- Acknowledge output + + -- AXI-stream output + axis_tready : in std_logic; -- axi_stream ready from downstream module + axis_tdata : out std_logic_vector(15 downto 0); -- axi stream output data + axis_tvalid : out std_logic; -- axi_stream output data valid + axis_tlast : out std_logic -- axi_stream output set on last data +); +end entity; + + +---------------------------------------------------------------- +-- Single channel pulse generator with two RAMs and a FIFO +---------------------------------------------------------------- +architecture rtl of qlaser_dacs_pulse_channel is + +-- RAM, pulse position, CPU port, read/write +constant C_NUM_PULSE : integer := 16; -- Number of output data values from pulse RAM (16x24-bit) +signal ram_pulse_addra : std_logic_vector( 3 downto 0); -- 16 entry RAM +signal ram_pulse_dina : std_logic_vector(95 downto 0); +signal ram_pulse_douta : std_logic_vector(95 downto 0); +signal ram_pulse_douta_d1 : std_logic_vector(95 downto 0); -- Delay distrib RAM output to match pipeline of Block RAM +signal ram_pulse_we : std_logic; + +-- RAM, pulse position, from state machine +constant C_BITS_GAIN_FACTOR : integer := 16; -- Number of bits in gain table +constant C_BITS_TIME_FACTOR : integer := 16; -- Number of bits in time table +constant C_BITS_TIME_INT : integer := 14; -- Starting bit for time integer part of the time factor, counting from MSB +constant C_BITS_TIME_FRAC : integer := 5; -- Starting bit for time fractional part of the time factor, counting from MSB +constant C_BITS_ADDR_START : integer := 10; -- Number of bits for starting address +constant C_BITS_ADDR_LENGTH : integer := 10; -- Number of bits for length address used by an edge of a pulse +constant C_BITS_ADDR_TOP : integer := 17; -- Number of bits for the "flat top", the top of the pulse +signal cnt_wave_top : std_logic_vector( C_BITS_ADDR_TOP - 1 downto 0); -- Counter for the top of the waveform +signal ram_pulse_addrb : std_logic_vector( 3 downto 0); +signal ram_pulse_doutb : std_logic_vector(95 downto 0); + +signal cpu_rdata_dv_e1 : std_logic; +signal cpu_rdata_dv_e2 : std_logic; +signal cpu_rdata_ramsel_d1 : std_logic; +signal cpu_rdata_ramsel_d2 : std_logic; + +signal cpu_wdata_top : std_logic_vector(31 downto 0); -- Top 32 bits of CPU write data (95:64) +signal cpu_wdata_mid : std_logic_vector(31 downto 0); -- Middle 32 bits of CPU write data (63:32) + +-- Waveform RAM port connections. +-- NOTE: Port A is 32-bit data, port B is 16-bit +constant C_LENGTH_WAVEFORM : integer := 1024; -- Number of output data values from waveform RAM (1024x16-bit) +constant C_BITS_ADDR_WAVE : integer := 10; -- Number of bits in address for waveform RAM +signal ram_waveform_ena : std_logic; +signal ram_waveform_wea : std_logic_vector( 0 downto 0); +signal ram_waveform_addra : std_logic_vector( 8 downto 0); +signal ram_waveform_dina : std_logic_vector(31 downto 0); +signal ram_waveform_douta : std_logic_vector(31 downto 0); + +signal ram_waveform_enb : std_logic := '0'; +signal ram_waveform_web : std_logic_vector( 0 downto 0) := (others=>'0'); +signal ram_waveform_addrb : std_logic_vector( 9 downto 0); +signal ram_waveform_dinb : std_logic_vector(15 downto 0) := (others=>'0'); +signal ram_waveform_doutb : std_logic_vector(15 downto 0); + + +-- State variable type declaration for main state machine +type t_sm_state is ( + S_RESET, -- Wait for 'enable'. Stay here until JESD interface is up and running, + S_IDLE, -- Wait for 'start' + S_WAIT, -- Wait for cnt_time, external input, to match pulse position RAM output + S_WAVE_UP, -- Output the rising edge of a waveform + S_WAVE_FLAT,-- Output the flat top part of a waveform + S_WAVE_DOWN -- Output the falling edge of a waveform +); +signal sm_state : t_sm_state; +signal sm_wavedata : std_logic_vector(15 downto 0); -- Waveform RAM data +signal sm_wavedata_dv : std_logic; -- Signal to indicate that waveform RAM data is valid +signal sm_busy : std_logic; -- Signal to indicate that s.m. is not idle + + +---- FIFO port connections +--signal fifo_wr_en : std_logic; +--signal fifo_full : std_logic; +--signal fifo_empty : std_logic; +--signal fifo_wr_rst_busy : std_logic; +--signal fifo_rd_rst_busy : std_logic; +--signal fifo_rd_en : std_logic; +---- FIFO status signals for debug purpose +--signal fifo_wr_ack : std_logic; +--signal fifo_overflow : std_logic; +--signal fifo_valid : std_logic; +--signal fifo_underflow : std_logic; + +-- Pipeline delays +signal start_d1 : std_logic; +signal enable_d1 : std_logic; + +begin + + busy <= sm_busy; + + ---------------------------------------------------------------- + -- Distributed RAM to hold 16 24-bit Pulse start times. + -- Synch write, Asynch read + -- Port A is for CPU read/write. 16x24-bit + -- Port B is for pulse time data output. 16x24-bit + ---------------------------------------------------------------- + u_ram_pulse : entity work.bram_pulseposition + port map( + clk => clk , -- input std_logic + a => ram_pulse_addra , -- input slv[3:0] + d => ram_pulse_dina , -- input slv[95 downto 0] + we => ram_pulse_we , + spo => ram_pulse_douta , -- output slv(95 downto 0] + + dpra => ram_pulse_addrb , -- input slv[3:0] + dpo => ram_pulse_doutb -- output slv(95 downto 0) + ); + + + ---------------------------------------------------------------- + -- Waveform table Block RAM. + -- Synch write, Synch read + -- Port A is for CPU read/write. 512x32-bit + -- Port B is for waveform data. 1024x16-bit + ---------------------------------------------------------------- + u_ram_waveform : entity work.bram_waveform + port map ( + -- Port A CPU Bus + clka => clk , -- input std_logic + ena => ram_waveform_ena , -- input std_logic + wea => ram_waveform_wea , -- input slv(0 downto 0) + addra => ram_waveform_addra , -- input slv(8 downto 0) + dina => ram_waveform_dina , -- input slv(31 downto 0) + douta => ram_waveform_douta , -- output slv(31 downto 0) + + -- Port B waveform output + clkb => clk , -- input std_logic + enb => ram_waveform_enb , -- input std_logic + web => (others=>'0') , -- input slv(0 downto 0) + addrb => ram_waveform_addrb , -- input slv(9 downto 0) + dinb => (others=>'0') , -- input slv(15 downto 0) + doutb => ram_waveform_doutb -- output slv(15 downto 0) + ); + + + + ---------------------------------------------------------------- + -- State machine: + -- Compares cnt_time input against current output from pulse position RAM. + -- When values match iti incremnts the pulse postion RAM address to + -- retrieve the next pulse position and also starts reading the + -- entire waveform table, one value every clock cycle, until it reaches the end. + -- Once the pulse is complete it waits for the next cnt_time match. + -- Repeat until all pulse position RAM times have triggered a pulse output + -- or until the maximum counter time has been reached. + ---------------------------------------------------------------- + pr_sm : process (reset, clk) + -- TODO: those bitwidth are not correct, we could optimize it later and find out how many bits each variable should be. But for now just make it big + variable v_ram_waveform_addrb : unsigned(95 downto 0); + begin + if (reset = '1') then + + sm_state <= S_IDLE; -- TODO: Eric: Should this be S_RESET since we reset the JEDS interface as well? + ram_pulse_addrb <= (others=>'0'); + ram_waveform_addrb <= (others=>'0'); + + sm_wavedata <= (others=>'0'); + sm_wavedata_dv <= '0'; + sm_busy <= '0'; + ram_waveform_enb <= '0'; + + elsif rising_edge(clk) then + + -- Pipeline delays to use for rising edge detection + enable_d1 <= enable; + start_d1 <= start; + + -- Default + sm_wavedata <= (others=>'0'); + sm_wavedata_dv <= '0'; + + ------------------------------------------------------------------------ + -- Main state machine + ------------------------------------------------------------------------ + case sm_state is + + ------------------------------------------------------------------------ + -- Wait for rising edge of enable + -- This is set when the JESD interface is aligned and functional. + -- Send a zero value to initialize the DAC then go to idle. + ------------------------------------------------------------------------ + when S_RESET => + + if (enable = '1') and (enable_d1 = '0') then + sm_wavedata <= (others=>'0'); + sm_wavedata_dv <= '1'; + sm_state <= S_IDLE; + end if; + sm_busy <= '0'; + ram_waveform_enb <= '0'; + + + ------------------------------------------------------------------------ + -- Wait for rising edge of 'start'. + -- No data output. + ------------------------------------------------------------------------ + when S_IDLE => + + if (start = '1') and (start_d1 = '0') then + sm_state <= S_WAIT; + sm_busy <= '1'; + else + sm_busy <= '0'; + end if; + + ram_waveform_enb <= '0'; + + ------------------------------------------------------------------------ + -- Wait for cnt_time, external input, to match pulse position RAM output + -- Return to idle state if max time is reached. Output waveform value zero. + ------------------------------------------------------------------------ + when S_WAIT => + + -- Start to output wave and increment pulse position RAM address + if (ram_pulse_doutb(93 downto C_BITS_TIME_FACTOR) = cnt_time) then + sm_state <= S_WAVE_UP; + -- set the wavetable's address to the starting address defined from the pulse ram + ram_waveform_addrb <= ram_pulse_doutb(C_BITS_GAIN_FACTOR - 1 downto C_BITS_ADDR_START); + elsif (cnt_time = X"FFFFFF") then + sm_state <= S_IDLE; + end if; + + ram_waveform_enb <= '1'; + ------------------------------------------------------------------------ + -- Output the raising edge of a waveform + -- Hold the last address when complete + ------------------------------------------------------------------------ + when S_WAVE_UP => + -- Check if is end of rise of the waveform, and hold the address + if (ram_waveform_addrb = std_logic_vector(unsigned(ram_pulse_doutb(C_BITS_GAIN_FACTOR - 1 downto C_BITS_ADDR_START)) + unsigned(ram_pulse_doutb(C_BITS_ADDR_START - 1 downto C_BITS_ADDR_LENGTH)))) then + sm_state <= S_WAVE_FLAT; + -- initialize the counter for the flat top of the waveform + cnt_wave_top <= std_logic_vector(to_unsigned(0, C_BITS_ADDR_TOP)); + else + -- Output waveform from RAM with rounded gain factor + v_ram_waveform_addrb := ((unsigned(ram_waveform_addrb) + 1) * unsigned(ram_pulse_doutb(C_BITS_TIME_FACTOR - 1 downto C_BITS_GAIN_FACTOR))); + ram_waveform_addrb <= std_logic_vector(v_ram_waveform_addrb(C_BITS_TIME_INT downto C_BITS_TIME_FRAC)); + sm_wavedata <= ram_waveform_doutb; + sm_wavedata_dv <= '1'; + + end if; + + when S_WAVE_FLAT => + if (cnt_wave_top = ram_pulse_doutb(C_BITS_ADDR_TOP - 1 downto 0)) then + sm_state <= S_WAVE_DOWN; + else + cnt_wave_top <= std_logic_vector(unsigned(cnt_wave_top) + 1); + sm_wavedata <= ram_waveform_doutb; + sm_wavedata_dv <= '1'; + end if; + + when S_WAVE_DOWN => + -- End of waveform? + if (ram_waveform_addrb = std_logic_vector(to_unsigned(C_LENGTH_WAVEFORM-1,10))) then + + -- If the end of the pulse table is reached then go to idle + if (ram_pulse_addrb = std_logic_vector(to_unsigned(C_NUM_PULSE-1,10))) then + ram_pulse_addrb <= (others=>'0'); + sm_state <= S_IDLE; + + else -- Increment pulse address. Wait for next pulse start time + ram_pulse_addrb <= std_logic_vector(unsigned(ram_pulse_addrb) + 1); + sm_state <= S_WAIT; + end if; + + -- Output waveform from RAM with decremented address + else + v_ram_waveform_addrb := (unsigned(ram_waveform_addrb) - 1) * unsigned(ram_pulse_doutb(C_BITS_TIME_FACTOR - 1 downto C_BITS_GAIN_FACTOR)); + ram_waveform_addrb <= std_logic_vector(v_ram_waveform_addrb(C_BITS_TIME_INT downto C_BITS_TIME_FRAC)); + sm_wavedata <= ram_waveform_doutb; + sm_wavedata_dv <= '1'; + end if; + + ------------------------------------------------------------------------ + -- Default + ------------------------------------------------------------------------ + when others => + sm_state <= S_IDLE; + + end case; + end if; + + end process; + + -- AXI-Stream output. + -- TBD: This should come from a FIFO + -- TODO: the bits are not correct, should be top bits (C_BITS_GAIN_FACTOR + 16 downto C_BITS_GAIN_FACTOR), but for now just make it this way so modelsim can simulate + -- TODO: apply scaling factor to the output + axis_tdata <= sm_wavedata; -- axi stream output data, this output should be multiplied by the gain factor, then take the top 16 bits + axis_tvalid <= sm_wavedata_dv; -- axi_stream output data valid + + -- TBD : Generate in state machine? + axis_tlast <= '0'; -- axi_stream output last + + + ---------------------------------------------------------------- + -- **** TBD : ADD FIFO **** + ---------------------------------------------------------------- + -- FIFO for waveform data + -- connect to external output to whatever we want to connect + ---------------------------------------------------------------- + --u_data_to_stream : entity work.fifo_data_to_stream + --port map ( + -- clk => clk, -- input std_logic + -- srst => reset, -- input std_logic + -- rd_en => fifo_rd_en, -- input std_logic + -- wr_en => fifo_wr_en, -- input std_logic + -- empty => fifo_empty, -- output std_logic + -- full => fifo_full, -- output std_logic + -- din => ram_waveform_doutb, -- input slv(15 downto 0) + -- dout => fifo_dout, -- output slv(15 downto 0) + -- + -- -- FIFO signals, some of then are for debug purpose + -- wr_ack => fifo_wr_ack, -- output std_logic + -- overflow => fifo_overflow, -- output std_logic + -- valid => fifo_valid, -- output std_logic + -- underflow => fifo_underflow, -- output std_logic + -- wr_rst_busy => fifo_wr_rst_busy, -- output std_logic + -- rd_rst_busy => fifo_rd_rst_busy -- output std_logic + --); + + + ---------------------------------------------------------------- + -- CPU Read/Write RAM + -- MSB of cpu_addr is used to select one of the two RAMs + -- to read/write, and the remainder are a 9-bit or 4-bit RAM address. + ---------------------------------------------------------------- + pr_ram_rw : process (reset, clk) + begin + if (reset = '1') then + + ram_pulse_addra <= (others=>'0'); + ram_pulse_dina <= (others=>'0'); + ram_pulse_we <= '0'; + + ram_waveform_ena <= '0'; + ram_waveform_wea <= (others=>'0'); + ram_waveform_addra <= (others=>'0'); + ram_waveform_dina <= (others=>'0'); + + cpu_rdata <= (others=>'0'); + cpu_rdata_dv <= '0'; + cpu_rdata_dv_e1 <= '0'; + cpu_rdata_dv_e2 <= '0'; + cpu_rdata_ramsel_d1 <= '0'; + cpu_rdata_ramsel_d2 <= '0'; + + elsif rising_edge(clk) then + + ram_waveform_ena <= '0'; + + ------------------------------------------------- + -- CPU writing RAM + ------------------------------------------------- + if (cpu_wr = '1') and (cpu_sel = '1') then + + -- 0 for pulse position, 1 for waveform table + if (cpu_addr(9) = '1') then + + ram_pulse_addra <= (others=>'0'); + ram_pulse_dina <= (others=>'0'); + ram_pulse_we <= '0'; + + ram_waveform_wea(0) <= '1'; + ram_waveform_ena <= '1'; + ram_waveform_addra <= cpu_addr(8 downto 0); + ram_waveform_dina <= cpu_wdata; + + else + + ram_pulse_addra <= cpu_addr(5 downto 2); + -- select which part of the 96-bit data to write + if (cpu_addr(1 downto 0) = "00") then + ram_pulse_dina(31 downto 0) <= cpu_wdata; + elsif (cpu_addr(1 downto 0) = "01") then + ram_pulse_dina(63 downto 32) <= cpu_wdata; + elsif (cpu_addr(1 downto 0) = "10") then + ram_pulse_dina(95 downto 64) <= cpu_wdata; + ram_pulse_we <= '1'; -- Write on the thrid cycle + end if; + + + ram_waveform_ena <= '0'; + ram_waveform_wea <= (others=>'0'); + ram_waveform_addra <= (others=>'0'); + ram_waveform_dina <= (others=>'0'); + + end if; + + cpu_rdata_dv_e1 <= '0'; + cpu_rdata_dv_e2 <= '0'; + cpu_rdata_ramsel_d1 <= '0'; + cpu_rdata_ramsel_d2 <= '0'; + + + ------------------------------------------------- + -- CPU read + ------------------------------------------------- + elsif (cpu_wr = '0') and (cpu_sel = '1') then + + if (cpu_addr(9) = '1') then -- Waveform + ram_waveform_ena <= '1'; + ram_pulse_addra <= (others=>'0'); + ram_waveform_addra <= cpu_addr(8 downto 0); + else -- Pulse + ram_pulse_addra <= cpu_addr(5 downto 2); + ram_pulse_douta_d1 <= ram_pulse_douta; -- Delay distrib RAM output to match pipeline of Block RAM + ram_waveform_addra <= (others=>'0'); + end if; + + ram_pulse_we <= '0'; + ram_waveform_wea(0) <= '0'; + + cpu_rdata_dv_e2 <= '1'; -- DV for cycle, when RAM output occurs + cpu_rdata_dv_e1 <= cpu_rdata_dv_e2; -- DV for next cycle + cpu_rdata_ramsel_d1 <= cpu_addr(9); -- Save the select bit one cycle later + cpu_rdata_ramsel_d2 <= cpu_rdata_ramsel_d1; + + else + ram_pulse_addra <= (others=>'0'); + ram_pulse_we <= '0'; + ram_waveform_addra <= (others=>'0'); + ram_waveform_wea(0) <= '0'; + + cpu_rdata_dv_e2 <= '0'; + cpu_rdata_dv_e1 <= cpu_rdata_dv_e2; -- DV for next cycle + cpu_rdata_ramsel_d1 <= '0'; + cpu_rdata_ramsel_d2 <= cpu_rdata_ramsel_d1; + + end if; + + ------------------------------------------------- + -- Output the delayed RAM data + -- This adds a pipeline delay to the cpu_rdata_dv to account for + -- the delay in reading data from the RAM + ------------------------------------------------- + if (cpu_rdata_dv_e1 = '1') then + + cpu_rdata_dv <= '1'; + + -- Select source of output data + if (cpu_rdata_ramsel_d2 = '1') then -- Output is from waveform table + cpu_rdata <= ram_waveform_douta; + + elsif (cpu_rdata_ramsel_d2 = '0') then + -- cpu_rdata <= X"00" & ram_pulse_douta_d1; + -- select which part of the 96-bit data to read + if (cpu_addr(1 downto 0) = "00") then + cpu_rdata <= ram_pulse_douta_d1(31 downto 0); + elsif (cpu_addr(1 downto 0) = "01") then + cpu_rdata <= ram_pulse_douta_d1(63 downto 32); + elsif (cpu_addr(1 downto 0) = "10") then + cpu_rdata <= ram_pulse_douta_d1(95 downto 64); + + end if; + end if; + + else + cpu_rdata <= (others=>'0'); + cpu_rdata_dv <= '0'; + end if; + + end if; + + end process; + + +-- ---------------------------------------------------------------- +-- -- Read time from RAM to generate pulses +-- -- When input cnt_time equals RAM time output then set dout +-- -- to RAM amplitude output and read next set of RAM data. +-- -- Keep reading waveform RAM every clock cycle until the end of the RAM +-- ---------------------------------------------------------------- +-- pr_ram_pulse : process(reset, clk) +-- begin +-- if (reset = '1') then +-- +-- ram_pulse_addrb <= (others => '0'); +-- start_pulse <= '0'; +-- dout_dv <= '0'; +-- +-- elsif rising_edge(clk) then +-- +-- -- dout <= ram_amplitude; +-- +-- if (cnt_time = X"000000") then -- Not triggered +-- ram_pulse_addrb <= (others=>'0'); +-- dout_dv <= '0'; +-- start_pulse <= '0'; +-- +-- elsif (ram_time = cnt_time) then +-- +-- ram_pulse_addrb <= std_logic_vector(unsigned(ram_pulse_addrb) + 1); +-- dout_dv <= '1'; +-- start_pulse <= '1'; +-- +-- else +-- dout_dv <= '0'; +-- start_pulse <= '0'; +-- end if; +-- +-- end if; +-- +-- end process; +-- +-- +-- ---------------------------------------------------------------- +-- -- Read amplitude from Waveform RAM to generate pulses +-- -- When start_pulse is asserted, and when FIFO is not full, write +-- -- amplitude to FIFO. +-- ---------------------------------------------------------------- +-- pr_ram_wavetable : process(reset, clk) +-- begin +-- if (reset = '1') then +-- fifo_wr_en <= '0'; +-- ram_waveform_addrb <= (others => '0'); +-- ram_waveform_enb <= '0'; +-- busy <= '0'; +-- elsif rising_edge(clk) then +-- if (read_table = '1') then -- start_pulse get asserted +-- busy <= '1'; +-- -- TODO EricToGeoff : This condition may not satisfy all cases of a fifo_ready, maybe also utilize fifo_wr_ack or just a simple FSM? +-- if (fifo_full = '0') then +-- fifo_wr_en <= '1'; +-- ram_waveform_addrb <= std_logic_vector(unsigned(ram_waveform_addrb) + 1); +-- ram_waveform_enb <= '1'; +-- else +-- fifo_wr_en <= '0'; +-- -- FIFO is full, wait +-- ram_waveform_addrb <= ram_waveform_addrb; +-- ram_waveform_enb <= '0'; +-- end if; +-- else +-- fifo_wr_en <= '0'; +-- ram_waveform_addrb <= (others => '0'); +-- ram_waveform_enb <= '0'; +-- end if; +-- end if; +-- +-- end process; +-- +-- -- For new versions, ram_doutb are differnt RAMs b port outputs, ram_amplitude should go thought a FIFO first from RAM +-- ram_time <= ram_doutb; +-- read_table <= start_pulse; +-- +-- fifo_rd_en <= axi_tready and fifo_full; + +end rtl; diff --git a/src/hdl/pkg/iopakb.vhd b/src/hdl/pkg/iopakb.vhd new file mode 100644 index 0000000..b984952 --- /dev/null +++ b/src/hdl/pkg/iopakb.vhd @@ -0,0 +1,9531 @@ +-- ---------------------------------------------------------------------------- +-- +-- Copyright (c) Mentor Graphics Corporation, 1982-1996, All Rights Reserved. +-- UNPUBLISHED, LICENSED SOFTWARE. +-- CONFIDENTIAL AND PROPRIETARY INFORMATION WHICH IS THE +-- PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS. +-- +-- +-- PackageName : std_iopak +-- Title : Package Body for STD_IOPAK +-- Purpose : This package contains additional support for +-- : performing text IO. +-- : +-- Comments : +-- : +-- Assumptions : none +-- Limitations : none +-- Known Errors: none +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- Mentor Graphics Corporation owns the sole copyright to this software. +-- Under International Copyright laws you (1) may not make a copy of this +-- software except for the purposes of maintaining a single archive copy, +-- (2) may not derive works herefrom, (3) may not distribute this work to +-- others. These rights are provided for information clarification, +-- other restrictions of rights may apply as well. +-- +-- This is an "Unpublished" work. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> License NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- This software is further protected by specific source code and/or +-- object code licenses provided by Mentor Graphics Corporation. Use of this +-- software other than as provided in the licensing agreement constitues +-- an infringement. No modification or waiver of any right(s) shall be +-- given other than by the written authorization of an officer of The +-- Mentor Graphics Corporation. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> Proprietary Information <<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- This source code contains proprietary information of Mentor Graphics +-- Corporation and shall not be disclosed other than as provided in the software +-- licensing agreement. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Warrantee <<<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- Mentor Graphics Corporation MAKES NO WARRANTY OF ANY KIND WITH REGARD TO +-- THE USE OF THIS SOFTWARE, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS +-- FOR A PARTICULAR PURPOSE. +-- ---------------------------------------------------------------------------- +-- Modification History : +-- ---------------------------------------------------------------------------- +-- Version No: | Author: | Mod. Date: | Changes Made: +-- v1.000 | M.K.Dhodhi | 10/26/91 | Production Release +-- v1.100 | M.K.Dhodhi | 11/19/91 | Compatible w/ Vantage 3.650 Release +-- v1.110 | wdb | 01/27/92 | compatible w/Intermetrics +-- v1.110 | M.K.Dhodhi | 02/13/92 | fixing bug in T0_String input time +-- | fixing comment in SOX_Machine +-- v1.110 | M.K.Dhodhi | 03/06/92 | production release +-- v1.200 | M.K.Dhodhi | 04/21/92 | stand alone version +-- v1.130 | M.K.Dhodhi | 08/03/92 | production release +-- v1.140 | M.K.Dhodhi | 11/05/92 | fixing real 0.0 case for To_String +-- | | an extra loop in default time. +-- v1.150 | M.K.Dhodhi | 11/17/92 | extending fscan upto 20 arguments. +-- | fixing default 0 time. +-- v1.160 | M.K.Dhodhi | 02/11/93 | fixing Find_Char +-- v1.610 | wrm | 03/30/93 | fixed error assertions in From_String, From_XString +-- v1.700 B | W.R. Migatz | 05/03/93 | Beta release - changes to all f routines (not fprint) +-- | modified str*cpy and str*cmp +-- | fixed memory leak +-- v1.700 | W.R. Migatz | 05/25/93 | production release - change to fscan with %t to allow time unit +-- v1.800 | W.R. Migatz | 07/28/93 | combining into 1 file, mentor support, and From_String(time) bug fix +-- v2.000 | W.R. Migatz | 07/21/94 | production release - fix bug in fprint, fs ps ns timing changes +-- v2.100 | W.R. Migatz | 01/10/96 | production release +-- | Initialization banner removed +-- v2.110 | W.R. Migatz | 04/02/96 | Fixed Find_Char and To_String(TIME) bugs +-- | Find_char did not stop at a NUL character +-- | To_String(TIME) did not handle a precision of 0 +-- v2.2 | B. Caslis | 07/25/96 | Updated for Mentor Graphics Release +-- ---------------------------------------------------------------------------- + +PACKAGE BODY std_iopak is + + -- ************************************************************************ + -- Display Banner + -- ************************************************************************ + + FUNCTION DisplayBanner return BOOLEAN is + + BEGIN + ASSERT FALSE + report LF & + "-- Initializing Std_Developerskit (Std_IOpak package v2.10)" & LF & + "-- Copyright by Mentor Graphics Corporation" & LF & + "-- [Please ignore any warnings associated with this banner.]" + severity NOTE; + return TRUE; + END; + + --CONSTANT StdIOpakBanner : BOOLEAN := DisplayBanner; + CONSTANT StdIOpakBanner : BOOLEAN := TRUE; + + TYPE char_to_hex_table is array (character'low To character'high) of Integer; + TYPE char_to_oct_table is array (character'low TO character'high) of integer; + SUBTYPE INT8 is INTEGER RANGE 0 to 7; + + CONSTANT WarningsOn : BOOLEAN := TRUE; + CONSTANT END_OF_LINE_MARKER : STRING(1 TO 2) := LF & ' '; + CONSTANT invalid_input : INTEGER := -201; +-- ------------------------------------------------------------------------------ +-- ------------------------------------------------------------------------------ +-- P L E A S E N O T E +-- Following routines are hidden, they are not visible to the user of +-- this package but are used internally +-- ----------------------------------------------------------------------------- +--+----------------------------------------------------------------------------- +--| Procedure Name : S_Machine +--| hidden +--| Overloading : None +--| +--| Purpose : Finite State automaton to recognise a string format. +--| format will be broken into field width, precision +--| and justification (left or right). +--| +--| Parameters : fwidth -- output, INTEGER, field width +--| precision -- output, INTEGER, precison +--| justify -- OUTPUT, BIT +--| '0' right justified, +--| '1' left justified +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : +--| +--| NOTE : +--| This procedure is +--| called in the function To_String. +--| +--| Use : +--| VARIABLE fmt : STRING(1 TO format'LENGTH) := format; +--| VARIABLE fw : INTEGER; +--| VARIABLE precis : INTEGER; +--| VARIABLE justfy : BIT; +--| +--| S_Machine(fw, precis, justy, fmt); +--| +--|----------------------------------------------------------------------------- + PROCEDURE S_Machine ( VARIABLE fwidth : OUT INTEGER; + VARIABLE precison : OUT INTEGER; + VARIABLE justify : OUT BIT; + CONSTANT format : IN STRING + ) IS + VARIABLE state : INT8 := 0; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE ch : CHARACTER; + VARIABLE index : INTEGER := 1; + VARIABLE fw : INTEGER := 0; + VARIABLE pr : INTEGER := 0; + + BEGIN + -- make sure first character is '%' if not error + ch := fmt(index); + IF (fmt(index) /= '%') THEN + ASSERT false + REPORT " Format Error --- first character of format " & + " is not '%' as expected." + SEVERITY ERROR; + RETURN; + END IF; + justify := '0'; -- default is right justification + + WHILE (state /= 3) LOOP + IF (index < format'LENGTH) THEN + index := index + 1; + ch := fmt(index); + CASE state IS + WHEN 0 => + IF (ch ='-') THEN + state := 1; -- justify + ELSIF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; -- digits + ELSIF (ch = 's') THEN + state := 3; -- end state + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = '%') THEN + state := 5; + ELSE + state := 6; -- error + END IF; + + WHEN 1 => + justify := '1'; -- left justfy + IF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = 's') THEN + state := 3; + justify := '0'; -- %-s is equivalent to %s + ELSE + state := 6; -- error + END IF; + + WHEN 2 => -- + IF (ch >= '0' AND ch <= '9') THEN + fw := fw * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = 's') THEN + state := 3; + ELSIF (ch = '.') THEN + state := 4; + ELSE + state := 6; -- error + END IF; + + WHEN 3 => -- s state + -- s format successfully recognized exit now. + EXIT; + + WHEN 4 => -- . state + IF (ch >= '0' AND ch <= '9') THEN + pr := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSE + state := 6; -- error + END IF; + + WHEN 5 => -- print % + EXIT; + + WHEN 6 => -- error state + -- print error message + ASSERT false + REPORT " Format error --- expected %s format " + SEVERITY ERROR; + EXIT; + + WHEN 7 => + -- precision + IF (ch >= '0' AND ch <= '9') THEN + pr := pr * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 7; + ELSIF (ch = 's') THEN + state := 3; + ELSE + state := 6; -- error + END IF; + END CASE; + ELSE + assert false + report " Format Error: Observed =" & fmt &LF + & " Expected = %s (detected by S_Machine) " + severity ERROR; + exit; + END IF; + + END LOOP; + + IF (fw > max_string_len) THEN + fwidth := max_string_len; + ELSE + fwidth := fw; + END IF; + + precison := pr; + RETURN; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : SOX_Machine +--| hidden +--| Overloading : None +--| +--| Purpose : Finite State automaton to recognise a binary_vector +--| to a string format. +--| format will be broken into field width, precision +--| and justification (left or right) and notation (binary, +--| octal or hex ). +--| +--| Parameters : fwidth -- output, INTEGER, field width +--| precision -- output, INTEGER, precison +--| justify -- OUTPUT, BIT +--| '0' right justified, +--| '1' left justified +--| str_type -- output, character, +--| -- can be any of the characters s, O (o), X (x) +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : +--| +--| NOTE : +--| This procedure is +--| called in the function To_String. +--| +--| Use : +--| VARIABLE fmt : STRING(1 TO format'LENGTH) := format; +--| VARIABLE fw : INTEGER; +--| VARIABLE precis : INTEGER; +--| VARIABLE justfy : BIT; +--| VARIABLE sttype : Character; +--| +--| SOX_Machine(fw, precis, justy, sttype,fmt); +--| +--|----------------------------------------------------------------------------- + PROCEDURE SOX_Machine ( VARIABLE fwidth : OUT INTEGER; + VARIABLE precison : OUT INTEGER; + VARIABLE justify : OUT BIT; + VARIABLE str_type : OUT character; + CONSTANT format : IN STRING + ) IS + VARIABLE state : INT8 := 0; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE ch : CHARACTER; + VARIABLE index : INTEGER := 1; + VARIABLE fw : INTEGER := 0; + VARIABLE pr : INTEGER := 0; + + BEGIN + -- make sure first character is '%' if not error + ch := fmt(index); + IF (fmt(index) /= '%') THEN + ASSERT false + REPORT " Format Error --- first character of format " & + " is not '%' as expected." + SEVERITY ERROR; + RETURN; + END IF; + justify := '0'; -- default is right justification + + WHILE (state /= 3) LOOP + IF (index < format'LENGTH) THEN + index := index + 1; + ch := fmt(index); + CASE state IS + WHEN 0 => + IF (ch ='-') THEN + state := 1; -- justify + ELSIF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; -- digits + ELSIF ((ch = 's') OR (ch = 'o') OR (ch ='O') + OR (ch = 'x') OR (ch = 'X')) THEN + state := 3; -- end state + str_type := ch; + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = '%') THEN + state := 5; + ELSE + state := 6; -- error + END IF; + + WHEN 1 => + justify := '1'; -- left justfy + IF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; + ELSIF (ch = '.') THEN + state := 4; + ELSIF ((ch = 's') OR (ch = 'o') OR (ch ='O') + OR (ch = 'x') OR (ch = 'X')) THEN + state := 3; + justify := '0'; -- %- is equivalent to % + ELSE + state := 6; -- error + END IF; + + WHEN 2 => -- + IF (ch >= '0' AND ch <= '9') THEN + fw := fw * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 2; + ELSIF ((ch = 's') OR (ch = 'o') OR (ch ='O') + OR (ch = 'x') OR (ch = 'X')) THEN + state := 3; -- end state + str_type := ch; + ELSIF (ch = '.') THEN + state := 4; + ELSE + state := 6; -- error + END IF; + + WHEN 3 => -- sox state + -- sox format successfully recognized exit now. + EXIT; + + WHEN 4 => -- . state + IF (ch >= '0' AND ch <= '9') THEN + pr := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSE + state := 6; -- error + END IF; + + WHEN 5 => -- print % + EXIT; + + WHEN 6 => -- error state + -- print error message + ASSERT false + REPORT " Format error --- expected %s format " + SEVERITY ERROR; + EXIT; + + WHEN 7 => + -- precision + IF (ch >= '0' AND ch <= '9') THEN + pr := pr * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 7; + ELSIF ((ch = 's') OR (ch = 'o') OR (ch ='O') + OR (ch = 'x') OR (ch = 'X')) THEN + state := 3; -- end state + str_type := ch; + ELSE + state := 6; -- error + END IF; + END CASE; + ELSE + assert false + report " Format Error: Observed =" & fmt &LF + & " Expected = %s or %o r %x (detected by SOX_Machine) " + severity ERROR; + exit; + END IF; + + END LOOP; + + IF (fw > max_string_len) THEN + fwidth := max_string_len; + ELSE + fwidth := fw; + END IF; + + precison := pr; + RETURN; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : F_Machine +--| hidden +--| Overloading : None +--| +--| Purpose : Finite State automaton to recognise real number format. +--| format will be broken into field width, precision +--| and justification (left or right). +--| +--| Parameters : fwidth -- output, INTEGER, field width +--| precision -- output, INTEGER, Precision +--| justify -- OUTPUT, BIT +--| '0' right justified, +--| '1' left justified +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : INTEGER, length of output string. +--| +--| NOTE : +--| This procedure is +--| called in the funtion To_String when need to +--| a real number string. +--| +--| Use : +--| VARIABLE fmt : STRING(1 TO format'LENGTH) := format; +--| VARIABLE fw : INTEGER; +--| VARIABLE precis : INTEGER; +--| VARIABLE justfy : BIT; +--| +--| F_Machine(fw, precis, justy, fmt); +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE F_Machine ( VARIABLE fwidth : OUT INTEGER; + VARIABLE precison : OUT INTEGER; + VARIABLE justify : OUT BIT; + CONSTANT format : IN STRING + ) IS + VARIABLE state : INT8 := 0; -- starting state + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE ch : CHARACTER; + VARIABLE index : INTEGER := 1; + VARIABLE fw : INTEGER := 0; + VARIABLE pr : INTEGER := 0; + + BEGIN + + -- make sure first character is '%' if not error + ch := fmt(index); + IF (fmt(index) /= '%') THEN + ASSERT false + REPORT " Format Error --- first character of format " & + " is not '%' as expected." + SEVERITY ERROR; + return; + END IF; + justify := '0'; -- default is right justification + + WHILE (state /= 3) LOOP + IF (index < format'LENGTH) THEN + index := index + 1; + ch := fmt(index); + CASE state IS + WHEN 0 => + IF (ch ='-') THEN + state := 1; -- justify + ELSIF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; -- digits + ELSIF (ch = 'f') THEN + state := 3; -- end state + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = '%') THEN + state := 5; + ELSE + state := 6; -- error + END IF; + + WHEN 1 => + justify := '1'; -- left justfy + IF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = 'f') THEN + state := 3; + justify := '0'; -- %-f is equivalent to %f + ELSE + state := 6; -- error + END IF; + + WHEN 2 => -- + IF (ch >= '0' AND ch <= '9') THEN + fw := fw * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = 'f') THEN + state := 3; + ELSIF (ch = '.') THEN + state := 4; + ELSE + state := 6; + END IF; + + WHEN 3 => -- f state + -- fromat successfully recognized, exit now. + EXIT; + + WHEN 4 => -- . state + IF (ch >= '0' AND ch <= '9') THEN + pr := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSE + state := 6; -- error + END IF; + + WHEN 5 => -- print % + EXIT; + + WHEN 6 => -- error state + -- print error message + ASSERT false + REPORT " Format Error --- expected %f format. " + SEVERITY ERROR; + EXIT; + + WHEN 7 => + -- precision + IF (ch >= '0' AND ch <= '9') THEN + pr := pr * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSIF (ch = 'f') THEN + state := 3; + ELSE + state := 6; -- error + END IF; + END CASE; + ELSE + assert false + report " Format Error: Observed =" & fmt &LF + & " Expected = %f (detected by F_Machine) " + severity ERROR; + exit; + END IF; + + END LOOP; + + IF (fw > max_string_len) THEN + fwidth := max_string_len; + ELSE + fwidth := fw; + END IF; + + IF (pr=0) THEN + precison := 6; -- use default precision + ELSE + precison := pr; + END IF; + RETURN; + END F_Machine; +--+----------------------------------------------------------------------------- +--| Function Name : D_Machine +--| hidden +--| Overloading : None +--| +--| Purpose : Finite State automaton to recognise integer format. +--| format will be broken into field width, precision +--| and justification (left or right). +--| +--| Parameters : fwidth -- output, INTEGER, field width +--| precision -- output, INTEGER, Precision +--| justify -- OUTPUT, BIT +--| '0' right justified, +--| '1' left justified +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : INTEGER, length of output string. +--| +--| NOTE : +--| This procedure is +--| called in the funtion To_String when need to +--| a real number string. +--| +--| Use : +--| VARIABLE fmt : STRING(1 TO format'LENGTH) := format; +--| VARIABLE fw : INTEGER; +--| VARIABLE precis : INTEGER; +--| VARIABLE justfy : BIT; +--| +--| D_Machine(fw, precis, justy, fmt); +--| +--|----------------------------------------------------------------------------- + PROCEDURE D_Machine ( VARIABLE fwidth : OUT INTEGER; + VARIABLE precison : OUT INTEGER; + VARIABLE justify : OUT BIT; + CONSTANT format : IN STRING + ) IS + VARIABLE state : INT8 := 0; -- starting state + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE ch : CHARACTER; + VARIABLE index : INTEGER := 1; + VARIABLE fw : INTEGER := 0; + VARIABLE pr : INTEGER := 0; + + BEGIN + -- make sure first character is '%' if not error + ch := fmt(index); + IF (fmt(index) /= '%') THEN + ASSERT false + REPORT " Format Error --- first character of format " & + " is not '%' as expected." + SEVERITY ERROR; + return; + END IF; + justify := '0'; -- default is right justification + WHILE (state /= 3) LOOP + IF (index < format'LENGTH) THEN + index := index + 1; + ch := fmt(index); + CASE state IS + WHEN 0 => IF (ch ='-') THEN + state := 1; -- justify + ELSIF (ch >= '0' AND ch <= '9') THEN -- to_digit + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 2; -- digits state + ELSIF (ch = 'd') THEN + state := 3; -- end state + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = '%') THEN + state := 5; + ELSE + state := 6; -- error + END IF; + + WHEN 1 => justify := '1'; -- left justfy + IF (ch >= '0' AND ch <= '9') THEN -- to_digit + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = 'd') THEN + state := 3; + justify := '0'; -- %-d is equivalent to %d + ELSE + state := 6; -- error + END IF; + + WHEN 2 => -- digits state + IF (ch >= '0' AND ch <= '9') THEN + fw := fw * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = 'd') THEN + state := 3; + ELSIF (ch = '.') THEN + state := 4; + ELSE + state := 6; + END IF; + + WHEN 3 => -- d state + -- fromat successfully recognized, exit now. + EXIT; + + WHEN 4 => -- . state + IF (ch >= '0' AND ch <= '9') THEN + pr := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSE + state := 6; -- error + END IF; + + WHEN 5 => -- print % + EXIT; + + WHEN 6 => -- error state + -- print error message + ASSERT false + REPORT " Format Error --- expected %f format. " + SEVERITY ERROR; + EXIT; + + WHEN 7 => -- precision + IF (ch >= '0' AND ch <= '9') THEN + pr := pr * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSIF (ch = 'd') THEN + state := 3; + ELSE + state := 6; -- error + END IF; + END CASE; + ELSE + assert false + report " Format Error: Observed =" & fmt &LF + & " Expected = %d (detected by D_Machine) " + severity ERROR; + exit; + END IF; + END LOOP; + -- decide field width (fwidth) + IF (fw > max_string_len) THEN + fwidth := max_string_len; + ELSE + fwidth := fw; + END IF; + precison := pr; -- set precision + RETURN; + END D_Machine; + ---------------------------------------------------------- + -- Function Name : i_TRUNC + -- hidden + -- Parameters : + -- in :: Real_val : real; + -- Returns : Integer portions of a real number + -- Purpose : TO obtain the integer part of a general real + -- Notes : + ---------------------------------------------------------- + FUNCTION i_TRUNC ( CONSTANT real_val : IN real + ) RETURN integer IS + VARIABLE rval : real; + VARIABLE i : integer; + begin + -- find the integer value rounded to integer number less than + -- the real value. if the real number is 0.0 then return 0 + if (real_val = 0.0) then + i := 0; + else + rval := real_val - 0.5; + i := INTEGER(rval); + end if; + RETURN i; + END i_TRUNC; + + ------------------------------------------------------- + -- Function Name : i_FRAC + -- hidden + -- Parameters : + -- in :: Real_val : real; + -- Returns : Fractional portion of the real and no of fractional + -- digits present + -- Purpose : to obtain the fractional part of a general real + -- Notes : + ---------------------------------------------------------- + PROCEDURE i_FRAC ( CONSTANT real_val : IN real; + VARIABLE f_val : OUT INTEGER; + VARIABLE f_digits : OUT INTEGER + ) IS + VARIABLE rval : real; + VARIABLE ival : integer; + VARIABLE i : integer := 0; + begin + ival := i_TRUNC(real_val); + rval := real_val - REAL(ival); + i := INTEGER(rval * 1000000.0); + IF (i>=0 and i<=9) THEN + f_digits := 1; + ELSIF (i>=10 and i<=99) THEN + f_digits := 2; + + ELSIF (i>=10 and i<=99) THEN + f_digits := 2; + + ELSIF (i>=100 and i<=999) THEN + f_digits := 3; + + ELSIF (i>=1000 and i<=9999) THEN + f_digits := 4; + + ELSIF (i>=10000 and i<=99999) THEN + f_digits := 5; + + ELSIF (i>=100000 and i<=999999) THEN + f_digits := 6; + ELSE + f_digits := 0; + END IF; + + f_val := i; + return; + + end i_FRAC; +--|----------------------------------------------------------------------------- + +--+----------------------------------------------------------------------------- +--| Function Name : Is_White +--| hidden. +--| Overloading : None +--| +--| Purpose : Test whether a character is a blank, a tab or +--| a newline character. +--| +--| Parameters : +--| c - input Character. +--| +--| Result :Booelan -- True if the argument c is a blank or a tab(HT), +--| or a line feed (LF), or carriage return (CR). false otherwise. +--| +--| +--| See Also : Is_Space +--|----------------------------------------------------------------------------- + FUNCTION Is_White ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + VARIABLE result : BOOLEAN; + BEGIN + IF ( (c = ' ') OR (c = HT) OR (c = CR) OR (c=LF) ) THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : Find_NonBlank +--| hidden +--| Overloading : for extra parameter - index (see below) +--| +--| Purpose : Find first non_blank character in a string. +--| +--| Parameters : +--| str_in - input , +--| +--| Result : Natural, index of non_blank character. If string +--| has all the white character then str_in'LENGTH is +--| returned; +--| +--| NOTE : +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 10) := " TRUE"; +--| VARIABLE idx: Natural +--| +--| idx := Find_NonBlank (s_flag); +--| +--|----------------------------------------------------------------------------- + FUNCTION Find_NonBlank ( CONSTANT str_in : IN STRING + ) RETURN NATURAL IS + VARIABLE str_copy : STRING (1 TO str_in'LENGTH) := str_in; + VARIABLE index : Natural := 1; + VARIABLE ch : character; + + BEGIN + loop + EXIT WHEN ( (index > str_in'LENGTH) or (str_copy(index) = NUL) ); + if Is_White(str_copy(index)) then + index := index + 1; + else + EXIT; + end if; + end loop; + return index; +-- +-- old code +-- +-- ch := str_copy(index); +-- while ( ( index < str_in'LENGTH) AND (Is_White(ch) ) ) LOOP +-- index := index + 1; +-- ch := str_copy(index); +-- end LOOP; +-- return index; + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : Find_NonBlank +--| hidden +--| Overloading : for no index parameter - see abov +--| +--| Purpose : Find first non_blank character in a string, starting +--| from position indicated by index. +--| +--| Parameters : str_in - input string , +--| index - input NATURAL +--| +--| Result : Natural, index of non_blank character. If string +--| has all the white character then str_in'LENGTH is +--| returned; +--| +--| NOTE : assumes string has left index of 1 +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 10) := " TRUE"; +--| VARIABLE idx: Natural +--| +--| idx := Find_NonBlank (s_flag); +--| +--|----------------------------------------------------------------------------- + FUNCTION Find_NonBlank ( CONSTANT str_in : IN STRING; + CONSTANT index : IN NATURAL + ) RETURN NATURAL IS + + VARIABLE ch : character; + VARIABLE indx : integer := index; + + BEGIN + loop + EXIT WHEN ( (indx > str_in'LENGTH) or (str_in(indx) = NUL) ); + if Is_White(str_in(indx)) then + indx := indx + 1; + else + EXIT; + end if; + end loop; + return indx; + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : get_token +--| hidden +--| Overloading : None +--| +--| Purpose : To get a token from a format string. +--| used in fprint procedure. +--| +--| +--| Parameters : +--| format -- input, STRING, +--| index -- input_output, INTEGER, +--| at input it represents the beginning +--| position of the word in the format +--| string. When procedure terminates +--| index represent the end of word. +--| token -- output, STRING, holds the result. +--| +--| NOTE : +--| +--| --------------------------------------------------------------------------- + PROCEDURE get_token ( CONSTANT format : IN STRING; + VARIABLE index : INOUT INTEGER; + VARIABLE token : OUT STRING + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE indx : INTEGER := index; + VARIABLE res_str : STRING(1 TO max_token_len); + -- % - fw.precison s + VARIABLE i : INTEGER := 1; + BEGIN + -- make sure it is a format string + ASSERT (fmt(indx) = '%') + REPORT " get_token --- not a format string " + SEVERITY ERROR; + res_str(i) := fmt(indx); + + fmt_loop: LOOP + i := i + 1; + indx := indx + 1; + res_str(i) := fmt(indx); + EXIT fmt_loop WHEN ( fmt(indx) = 's'); + END LOOP; + + index := indx; + token(1 TO i) := res_str(1 to i); -- fixing bug + RETURN; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : print_str_buf +--| +--| Overloading : None +--| +--| Purpose : Prints a string according to format specification to a +--| buffer string. +--| +--| Parameters : +--| buf - input_output, string, +--| index - input_output, integer +--| format - input STRING, +--| arg - input STRING, +--| +--| Result : formated LINE. +--| +--| NOTE : This will be called in the fprint to print each +--| individual argument. +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE print_str_buf (VARIABLE buf : INOUT string; + VARIABLE index : INOUT integer; + CONSTANT format : IN STRING; + CONSTANT arg : IN STRING + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE arg_copy : STRING(1 TO arg'LENGTH) := arg; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE non_nul_str : STRING(1 TO arg'LENGTH); + VARIABLE len : INTEGER := 0; + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- call procedure S_Machine to split the format string + S_Machine(fw, precis, justfy, fmt); + + IF ((precis = 0) OR (precis > arg'LENGTH)) THEN + precis := arg'LENGTH; + END IF; + + -- check for the null argument + IF ((arg'LENGTH = 0) AND (fw = 0)) THEN + return; + + ELSIF ((arg'LENGTH = 0) AND (fw /= 0)) THEN + result(1 TO fw) := (OTHERS => ' '); + + ELSIF (arg'LENGTH /= 0) THEN -- argument is not null + + -- copy arg until NUL character encountered or precis to the non_nul_str; + + FOR i IN 1 TO precis LOOP + EXIT when (arg_copy(i) = NUL); + len := len + 1; + non_nul_str(len) := arg_copy(i); + END LOOP; + + IF (len > fw) THEN + fw := len; + END IF; + + IF (justfy = '1') THEN + result(1 TO len) := non_nul_str(1 to len); --modifying + FOR i IN len + 1 TO fw LOOP + result(i) := ' '; + END LOOP; + ELSE + FOR i IN 1 TO fw - len LOOP + result(i) := ' '; + END LOOP; + result(fw - len + 1 TO fw) := non_nul_str(1 to len); -- modifying + END IF; + END IF; + + for i IN 1 TO fw LOOP + EXIT when (index > buf'LENGTH); + buf(index) := result(i); + index := index + 1; + END LOOP; + + IF (index <= buf'LENGTH) THEN + buf(index) := ' '; -- leave one blank between two strings. + index := index - 1; + END IF; + RETURN; + + -- That's all + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : print_str +--| +--| Overloading : None +--| +--| Purpose : Prints a string according to format specification. +--| +--| Parameters : +--| ll - input_output, LINE, +--| format - input STRING, +--| arg - input STRING, +--| +--| Result : formated LINE. +--| +--| NOTE : This will be called in the fprint to print each +--| individual argument. +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE print_str (VARIABLE ll : INOUT LINE; + CONSTANT format : IN STRING; + CONSTANT arg : IN STRING + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE arg_copy : STRING(1 TO arg'LENGTH) := arg; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE non_nul_str : STRING(1 TO arg'LENGTH); + VARIABLE len : INTEGER := 0; + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- call procedure S_Machine to split the format string + S_Machine(fw, precis, justfy, fmt); + + IF ((precis = 0) OR (precis > arg'LENGTH)) THEN + precis := arg'LENGTH; + END IF; + + -- check for the null argument + IF ((arg'LENGTH = 0) AND (fw = 0)) THEN + return; + + ELSIF ((arg'LENGTH = 0) AND (fw /= 0)) THEN + result(1 TO fw) := (OTHERS => ' '); + + ELSIF (arg'LENGTH /= 0) THEN -- argument is not null + -- copy arg until NUL character to the non_nul_str; + FOR i IN 1 TO precis LOOP + EXIT when (arg_copy(i) = NUL); + len := len + 1; + non_nul_str(len) := arg_copy(i); + END LOOP; + + IF ( len > fw) THEN + fw := len; + END IF; + + IF (justfy = '1') THEN + result(1 TO len) := non_nul_str(1 to len); -- modifying + FOR i IN len + 1 TO fw LOOP + result(i) := ' '; + END LOOP; + ELSE + FOR i IN 1 TO fw - len LOOP + result(i) := ' '; + END LOOP; + result(fw - len + 1 TO fw) := non_nul_str(1 to len); -- modifying + END IF; + END IF; + WRITE(ll, result(1 TO fw)); + RETURN; + + -- That's all + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : print_str +--| +--| Overloading : None +--| +--| Purpose : writes a string according to format specification to an +--| ascii_text file +--| +--| Parameters : +--| asc_file - input, ASCII_TEXT, +--| format - input STRING, +--| arg - input STRING, +--| +--| Result : formated LINE. +--| +--| NOTE : This will be called in the fprint to print each +--| individual argument. +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE print_str (VARIABLE asc_file : OUT ASCII_TEXT; + CONSTANT format : IN STRING; + CONSTANT arg : IN STRING + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE arg_copy : STRING(1 TO arg'LENGTH) := arg; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE non_nul_str : STRING(1 TO arg'LENGTH); + VARIABLE len : INTEGER := 0; + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- call procedure S_Machine to split the format string + S_Machine(fw, precis, justfy, fmt); + + IF ((precis = 0) OR (precis > arg'LENGTH)) THEN + precis := arg'LENGTH; + END IF; + + -- check for the null argument + IF ((arg'LENGTH = 0) AND (fw = 0)) THEN + return; + + ELSIF ((arg'LENGTH = 0) AND (fw /= 0)) THEN + result(1 TO fw) := (OTHERS => ' '); + + ELSIF (arg'LENGTH /= 0) THEN -- argument is not null + -- copy arg until NUL character encountered or precison to the non_nul_str; + FOR i IN 1 TO precis LOOP + EXIT when (arg_copy(i) = NUL); + len := len + 1; + non_nul_str(len) := arg_copy(i); + END LOOP; + + IF (len > fw) THEN + fw := len; + END IF; + + IF (justfy = '1') THEN + result(1 TO len) := non_nul_str(1 to len); -- modifying + FOR i IN len + 1 TO fw LOOP + result(i) := ' '; + END LOOP; + ELSE + FOR i IN 1 TO fw - len LOOP + result(i) := ' '; + END LOOP; + result(fw - len + 1 TO fw) := non_nul_str(1 to len); -- modifying + END IF; + END IF; + + FOR i IN 1 TO fw LOOP + WRITE(asc_file, result(i)); + END LOOP; + + RETURN; + + -- That's all + END; + + + +-- ----------------------------------------------------------------------------- +-- ----------------------------------------------------------------------------- +-- V I S I B L E ROUTINES START HERE +-------------------------------------------------------------------------------- +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a boolean. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : A boolean true or false. +--| +--| NOTE : +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 5) := " TRUE"; +--| VARIABLE OK : BOOLEAN +--| +--| OK := From_String (s_flag); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN boolean IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : boolean ; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String -- input string has zero length. Boolean case" + severity ERROR; + RETURN FALSE; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN FALSE; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN FALSE; + END IF; + ch := str_copy(index); + CASE ch IS + WHEN 'F' => IF ((str'length - index) < 4 ) THEN + result := FALSE; + assert false + report " From_String --- input string has too few characters." + severity ERROR; + ELSIF ( ((str'length - index) = 4 ) AND + (str_copy(index TO index+4) = "FALSE") ) THEN + result := FALSE; + ELSIF ( (str_copy(index TO index + 4) = "FALSE") + AND( (str_copy(index + 5) = NUL) OR + Is_White( str_copy(index + 5) ) ) ) THEN + result := FALSE; + ELSE + result := FALSE; + assert false + report " From_String --- mismatch in boolean " + severity ERROR; + END IF; + + WHEN 'T' => IF ((str'length - index) < 3 ) THEN + result := FALSE; + assert false + report " From_String --- input string has too few characters " + severity ERROR; + ELSIF ( (( str'length - index ) = 3) AND + (str_copy(index TO index + 3 ) = "TRUE")) THEN + result := TRUE; + ELSIF ((str_copy(index TO index + 3) = "TRUE") + AND( (str_copy(index + 4) = NUL) OR + Is_White( str_copy(index + 4) ) ) ) THEN + result := TRUE; + ELSE + result := FALSE; + assert false + report "From_String --- mismatch in boolean " + severity ERROR; + END IF; + + WHEN OTHERS => result := FALSE; + assert false + report " From_String --- cannot find a boolean " + severity ERROR; + + END CASE; + RETURN result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a bit. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : bit. +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_val : bit; +--| +--| b_val := From_String (" 100"); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN bit IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := str; + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : bit ; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has zero length" + severity ERROR; + RETURN '0'; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN '0'; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN '0'; + END IF; + + ch := str_copy(index); + CASE ch IS + WHEN '1' => result := '1'; + WHEN '0' => result := '0'; + WHEN OTHERS => assert false + REPORT "From_String(str(" & To_String(index) & ") => " + & To_String(ch) & ") is an invalid character " + severity ERROR; + result := '0'; + END CASE; + RETURN RESULT; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a Severity_Level. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Severity_Level +--| +--| NOTE : +--| +--| Use : +--| VARIABLE str10 : String(1 TO 10) := " WARNING"; +--| VARIABLE sev : severity_level; +--| +--| sev := From_String (str10); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN severity_level IS + + VARIABLE str_copy : STRING (1 TO str'LENGTH):= To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : SEVERITY_LEVEL ; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has zero length " + severity ERROR; + RETURN NOTE; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN NOTE; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN NOTE; + END IF; + + ch := str_copy(index); + CASE ch IS + WHEN 'N' => result := NOTE; + IF ((str'length - index) < 3 ) THEN + assert false + report " From_String --- input string has too few characters." + severity ERROR; + + ELSIF ( (( str'length - index ) = 3) AND + (str_copy(index TO index + 3 ) = "NOTE")) THEN + result := NOTE; + ELSIF ((str_copy(index TO index + 3) = "NOTE") + AND( (str_copy(index + 4) = NUL) OR + Is_White( str_copy(index + 4) ) ) ) THEN + result := NOTE; + ELSE + assert false + report " From_String --- mismatch in string " + severity ERROR; + END IF; + + WHEN 'W' => result := NOTE; + IF ((str'length - index) < 6 ) THEN + assert false + report " From_String --- input string has too few characters." + severity ERROR; + + ELSIF ( (( str'length - index ) = 6) AND + (str_copy(index TO index + 6) = "WARNING")) THEN + result := WARNING; + ELSIF ((str_copy(index TO index + 6) = "WARNING") + AND( (str_copy(index + 7) = NUL) OR + Is_White( str_copy(index + 7) ) ) ) THEN + result := WARNING; + ELSE + assert false + report " From_String --- mismatch in string " + severity ERROR; + END IF; + + WHEN 'E' => result := NOTE; + IF ((str'length - index) < 4 ) THEN + assert false + report " From_String --- input string has too few characters." + severity ERROR; + + ELSIF ( (( str'length - index ) = 4) AND + (str_copy(index TO index + 4) = "ERROR")) THEN + result := ERROR; + ELSIF ((str_copy(index TO index + 4) = "ERROR") + AND( (str_copy(index + 5) = NUL) OR + Is_White( str_copy(index + 5) ) ) ) THEN + result := ERROR; + ELSE + assert false + report " From_String --- mismatch in string " + severity ERROR; + END IF; + + WHEN 'F' => result := NOTE; + IF ((str'length - index) < 6 ) THEN + assert false + report " From_String --- input string has too few characters." + severity ERROR; + + ELSIF ( (( str'length - index ) = 6) AND + (str_copy(index TO index + 6) = "FAILURE")) THEN + result := FAILURE; + ELSIF ((str_copy(index TO index + 6) = "FAILURE") + AND( (str_copy(index + 7) = NUL) OR + Is_White( str_copy(index + 7) ) ) ) THEN + result := FAILURE; + ELSE + assert false + report " From_String --- mismatch in string " + severity ERROR; + END IF; + + WHEN OTHERS => result := NOTE; + assert false + report " From_String --- cannot find a severity-level " + severity ERROR; + END CASE; + return result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a character. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Character +--| +--| NOTE : +--| +--| Use : +--| VARIABLE str10 : String(1 TO 10) := "WARNING "; +--| VARIABLE ch : character; +--| +--| ch := From_String (str10); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN character IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := str; + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : character; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has a null range " + severity ERROR; + RETURN NUL; + + END IF; + -- left most character of the string is returned + result := str_copy(1); + IF (result = NUL) THEN + assert false + report " From_String --- First character is a NUL " + severity ERROR; + END IF; + return result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an Integer. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Integer +--| +--| NOTE : +--| +--| Use : +--| VARIABLE n : Integer; +--| +--| n := From_String ("32 56"); +--| This statement will set n to integer 32. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN INTEGER IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := str; + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : INTEGER := 0; + VARIABLE neg_sign : boolean := false; + VARIABLE invalid : boolean := false; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has zero length " + severity ERROR; + RETURN INTEGER'LEFT; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN INTEGER'LEFT; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN INTEGER'LEFT; + END IF; + ch := str_copy(index); + -- check for - sign or + sign + IF (ch = '-') Then + neg_sign := NOT neg_sign; + index := index + 1; + ch := str_copy(index); -- get_char + elsif (ch = '+') then + index := index + 1; + ch := str_copy(index); -- get_char + END IF; + + -- Strip off leading zero's + While ( (ch = '0') AND (index < str'LENGTH)) LOOP + index := index + 1; + ch := str_copy(index); -- get_char + END LOOP; + For i in index TO str'LENGTH LOOP + ch := str_copy(i); + if (Is_Digit(ch)) then + result := result * 10 + ( CHARACTER'POS(ch) + - CHARACTER'POS('0') ); -- to digit + elsif ((Is_White(ch)) OR (ch = NUL)) THEN + exit; + else + invalid := TRUE; + result := INTEGER'LEFT; + ASSERT FALSE + REPORT "From_String(str(" & To_String(i) & ") => " + & To_String(ch) & ") is an invalid character " + SEVERITY ERROR; + exit; + end if; + end loop; + if ( neg_sign AND (not invalid) )THEN + result := - result; + END IF; + return result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a real. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : real value +--| +--| NOTE : +--| +--| Use : +--| VARIABLE n : real ; +--| +--| n := From_String (" -354.78"); +--| This statement will set n to real value -354.78. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN REAL IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := str; + VARIABLE index : Natural; + VARIABLE digit_val : Integer; + VARIABLE power : Integer; + VARIABLE integ_part : Integer := 0; + VARIABLE fract_part : Integer := 0; + VARIABLE r : real := 0.0; + VARIABLE ch : character; + VARIABLE neg_sign : boolean := false; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has zero length " + severity ERROR; + RETURN REAL'LEFT; + + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN REAL'LEFT; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN REAL'LEFT; + END IF; + ch := str_copy(index); + -- check for - sign or + sign + IF (ch = '-') Then + neg_sign := NOT neg_sign; + index := index + 1; + ch := str_copy(index); -- get_char + elsif (ch = '+') then + index := index + 1; + ch := str_copy(index); -- get_char + END IF; + + -- Strip off leading zero's + While ( (ch = '0') AND (index < str'LENGTH)) LOOP + index := index + 1; + ch := str_copy(index); -- get_char + END LOOP; + + -- convert the integeral part by going through the loop + -- until '.' is encountered + + WHILE ((ch /= '.') AND (index < str'LENGTH)) LOOP + + if (Is_digit(ch)) THEN + integ_part := integ_part * 10 + ( CHARACTER'POS(ch) + - CHARACTER'POS('0') ); -- to digit + else + ASSERT FALSE + REPORT "From_String(str(" & To_String(index) & ") => " + & To_String(ch) & ") is an invalid character " + SEVERITY ERROR; + return real'LEFT; + end if; + index := index + 1; + ch := str_copy(index); + END LOOP; + -- convert the fractional part to real value + -- + if ( ch = '.') THEN + index := index + 1; + END IF; + power := 0; + For i IN index TO str'LENGTH LOOP + ch := str_copy(i); + if (Is_digit(ch)) THEN + power := power + 1; + fract_part := fract_part * 10 + ( CHARACTER'POS(ch) + - CHARACTER'POS('0') ); -- to digit + elsif ((Is_White(ch)) OR (ch = NUL)) THEN + exit; + else + ASSERT FALSE + REPORT "From_String(str(" & To_String(i) & ") => " + & To_String(ch) & ") is an invalid character " + SEVERITY ERROR; + return real'LEFT; + end if; + end loop; + + r := real(integ_part) + real(fract_part) / 10.0 ** power; + if neg_sign THEN + r := - r; + END IF; + return r; + END; +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_ulogic. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_ulogic +--| +--| NOTE : +--| +--| Use : +--| VARIABLE u_val : std_ulogic ; +--| +--| u_val := From_String (" 100"); +--| This statement will set u_val equal to the value '1'. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_ulogic IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : std_ulogic; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has zero length " + severity ERROR; + RETURN 'U'; + END IF; + -- find the position of the first non-white character. + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN 'U'; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN 'U'; + END IF; + ch := str_copy(index); + CASE ch IS + WHEN 'U' => result := 'U'; + WHEN 'X' => result := 'X'; + WHEN '0' => result := '0'; + WHEN '1' => result := '1'; + WHEN 'Z' => result := 'Z'; + WHEN 'W' => result := 'W'; + WHEN 'L' => result := 'L'; + WHEN 'H' => result := 'H'; + WHEN '-' => result := '-'; + WHEN OTHERS => + result := 'U'; + ASSERT FALSE + REPORT "From_String(str(" & To_String(index) & ") => " + & To_String(ch) & ") is an invalid character " + SEVERITY ERROR; + END CASE; + return result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_ulogic_vector. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_ulogic_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE u_vector : std_ulogic_vector( 7 DOWNTO 0) ; +--| +--| u_vector := From_String (" 0-ZU1010 1010"); +--| This statement will set u_vector equal to "0-ZU1010". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_ulogic_vector IS + VARIABLE str_copy : STRING ( 1 to str'LENGTH ) := To_Upper(str); + VARIABLE invalid : boolean := false; + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE i, idx : Integer; + VARIABLE r : std_ulogic_vector(1 TO str'length); + VARIABLE result : std_ulogic_vector(str'length-1 downto 0); + BEGIN + if (StrLen (str) = 0) THEN + assert false report " From String --- input string has zero length "; + return ""; + end if; + -- find the position of the first non-white character. + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN ""; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN ""; + END IF; + i := 0; + FOR idx IN index TO str'length LOOP + i := i + 1; + ch := str_copy(idx); + CASE ch IS + WHEN 'U' => r(i) := 'U'; + WHEN 'X' => r(i) := 'X'; + WHEN '0' => r(i) := '0'; + WHEN '1' => r(i) := '1'; + WHEN 'Z' => r(i) := 'Z'; + WHEN 'W' => r(i) := 'W'; + WHEN 'L' => r(i) := 'L'; + WHEN 'H' => r(i) := 'H'; + WHEN '-' => r(i) := '-'; + WHEN NUL => i := i - 1; -- last index was the non-NUL + exit; + WHEN OTHERS => IF (NOT Is_White(ch)) THEN + -- a non binary value was passed + ASSERT (invalid) + REPORT "From_String(str(" & To_String(idx) & ") => " + & To_String(ch) & ") is an invalid character " + SEVERITY ERROR; + invalid := TRUE; + else + i := i - 1; -- last index was the non-white + EXIT; -- found a white space ! + END IF; + END CASE; + END LOOP; + if invalid THEN + for k in 1 to i loop + r(k) := 'U'; -- fill with 'U's + end loop; + end if; + result (i-1 downto 0) := r(1 to i); + return result(i-1 downto 0); + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_logic_vector. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_logic_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE logic_vect : std_logic_vector( 7 DOWNTO 0) ; +--| +--| logic_vect := From_String (" 0-ZU1010 1010"); +--| This statement will set logic_vect equal to "0-ZU1010". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_logic_vector IS + VARIABLE str_copy : STRING ( 1 to str'LENGTH ) := To_Upper(str); + VARIABLE invalid : boolean := false; + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE i, idx : Integer; + VARIABLE r : std_logic_vector(1 TO str'length); + VARIABLE result : std_logic_vector(str'length-1 downto 0); + BEGIN + if (StrLen (str) = 0) THEN + assert false report " From String --- input string has zero length "; + return ""; + end if; + -- find the position of the first non-white character. + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN ""; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN ""; + END IF; + + i := 0; + FOR idx IN index TO str'length LOOP + i := i + 1; + ch := str_copy(idx); + CASE ch IS + WHEN 'U' => r(i) := 'U'; + WHEN 'X' => r(i) := 'X'; + WHEN '0' => r(i) := '0'; + WHEN '1' => r(i) := '1'; + WHEN 'Z' => r(i) := 'Z'; + WHEN 'W' => r(i) := 'W'; + WHEN 'L' => r(i) := 'L'; + WHEN 'H' => r(i) := 'H'; + WHEN '-' => r(i) := '-'; + WHEN NUL => i := i - 1; -- last index was the non-NUL + exit; + WHEN OTHERS => IF (NOT Is_White(ch)) THEN + -- a non binary value was passed + ASSERT (invalid) + REPORT "From_String(str(" & To_String(idx) & ") => " + & To_String(ch) & ") is an invalid character" + SEVERITY ERROR; + invalid := TRUE; + ELSE + i := i - 1; -- last index was the non-white + EXIT; -- found a white space ! + END IF; + END CASE; + END LOOP; + if invalid THEN + for k in 1 to i loop + r(k) := 'U'; -- fill with 'U's + end loop; + end if; + result (i-1 downto 0) := r(1 to i); + return result(i-1 downto 0); + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_BinString +--| +--| Overloading : None +--| +--| Purpose : Convert from a Binary String to a bit_vector. +--| +--| Parameters : +--| str - input , binary string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 7 DOWNTO 0) ; +--| +--| b_vect := From_BinString (" 01101111 1010"); +--| This statement will set b_vect equal to "01101111". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_BinString ( CONSTANT str : IN STRING + ) RETURN bit_vector IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE i, idx : Integer; + VARIABLE invalid : boolean := false; + VARIABLE r : bit_vector(1 TO str'length); + VARIABLE result : bit_vector(str'length - 1 DOWNTO 0) ; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_BinString --- input string has a zero length "; + RETURN ""; + ELSIF (str(str'LEFT) = NUL) THEN + assert false + report " From_BinString --- input string has nul character " + &" at the LEFT position " + severity ERROR; + RETURN ""; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_BinString --- input string is empty "; + RETURN ""; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_BinString -- first non_white character is a NUL "; + RETURN ""; + END IF; + + i := 0; + FOR idx IN index TO str'length LOOP + i := i + 1; + ch := str_copy(idx); + CASE ch IS + WHEN '0' => r(i) := '0'; + WHEN '1' => r(i) := '1'; + WHEN NUL => i := i - 1; -- last index was the non-NUL + exit; + WHEN OTHERS => IF (NOT IS_White(ch)) THEN + -- a non binary value was passed + ASSERT (invalid) + REPORT "From_BinString(str(" & To_String(idx) & ") => " + & To_String(ch) & ") is an invalid character" + SEVERITY ERROR; + invalid := TRUE; + else + i := i - 1; -- last index was the non-NUL + exit; + end if; + END CASE; + END LOOP; + -- check for invalid character in the string + if ( invalid ) THEN + r(1 TO i) := (OTHERS => '0'); + end if; + result(i-1 DOWNTO 0) := r(1 TO i); + return result(i - 1 DOWNTO 0); -- return slice of result + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_OctString +--| +--| Overloading : None +--| +--| Purpose : Convert from an Octal String to a bit_vector. +--| +--| Parameters : +--| str - input , Octal string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 15 DOWNTO 4) ; +--| +--| b_vect := From_OctString (" 1735 1010"); +--| This statement will set b_vect equal to "001111011101". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_OctString ( CONSTANT str : IN STRING + ) RETURN bit_vector IS + CONSTANT len : Integer := 3 * str'LENGTH; + CONSTANT oct_dig_len : Integer := 3; + VARIABLE str_copy : STRING (1 TO str'LENGTH) := To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE i, idx : Integer; + VARIABLE invalid : boolean := false; + VARIABLE r : bit_vector( 1 TO len) ; + VARIABLE result : bit_vector(len - 1 DOWNTO 0) ; + CONSTANT bin_zero : bit_vector(1 to 3) := "000"; -- this done for Mentor unsupported feature + CONSTANT bin_one : bit_vector(1 to 3) := "001"; + CONSTANT bin_two : bit_vector(1 to 3) := "010"; + CONSTANT bin_three : bit_vector(1 to 3) := "011"; + CONSTANT bin_four : bit_vector(1 to 3) := "100"; + CONSTANT bin_five : bit_vector(1 to 3) := "101"; + CONSTANT bin_six : bit_vector(1 to 3) := "110"; + CONSTANT bin_seven : bit_vector(1 to 3) := "111"; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_OctString --- input string has zero length "; + RETURN ""; + ELSIF (str(str'LEFT) = NUL) THEN + assert false + report " From_OctString --- input string has nul character" + & " at the LEFT position " + severity ERROR; + RETURN ""; -- null bit_vector + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_OctString --- input string is empty "; + RETURN ""; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_OctString -- first non_white character is a NUL "; + RETURN ""; + END IF; + + i := 0; + FOR idx IN index TO str'length LOOP + ch := str_copy(idx); + EXIT WHEN ((Is_White(ch)) OR (ch = NUL)); + CASE ch IS + WHEN '0' => r(i+1 TO i+oct_dig_len) := bin_zero; + WHEN '1' => r(i+1 TO i+oct_dig_len) := bin_one; + WHEN '2' => r(i+1 TO i+oct_dig_len) := bin_two; + WHEN '3' => r(i+1 TO i+oct_dig_len) := bin_three; + WHEN '4' => r(i+1 TO i+oct_dig_len) := bin_four; + WHEN '5' => r(i+1 TO i+oct_dig_len) := bin_five; + WHEN '6' => r(i+1 TO i+oct_dig_len) := bin_six; + WHEN '7' => r(i+1 TO i+oct_dig_len) := bin_seven; + WHEN NUL => exit; + WHEN OTHERS => -- a non binary value was passed + ASSERT (invalid) + REPORT "From_OctString(str(" & To_String(idx) & ") => " + & To_String(ch) & ") is an invalid character" + SEVERITY ERROR; + invalid := TRUE; + END CASE; + i := i + oct_dig_len; + END LOOP; + -- check for invalid character in the string + if ( invalid ) THEN + r(1 TO i) := (OTHERS => '0'); + end if; + result(i - 1 DOWNTO 0) := r(1 TO i); + return result(i-1 DOWNTO 0); -- return slice of result + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_HexString +--| +--| Overloading : None +--| +--| Purpose : Convert from a Hex String to a bit_vector. +--| +--| Parameters : +--| str - input , Hex string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 15 DOWNTO 4) ; +--| +--| b_vect := From_HexString (" 3DD 1010"); +--| This statement will set b_vect equal to "001111011101". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_HexString ( CONSTANT str : IN STRING + ) RETURN bit_vector IS + + CONSTANT len : Integer := 4 * str'LENGTH; + CONSTANT hex_dig_len : Integer := 4; + VARIABLE str_copy : STRING (1 TO str'LENGTH) := To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE i, idx : Integer; + VARIABLE invalid : boolean := false; + VARIABLE r : bit_vector(1 TO len) ; + VARIABLE result : bit_vector(len - 1 DOWNTO 0); + CONSTANT bin_zero : bit_vector(1 to 4) := "0000"; -- this done for Mentor unsupported feature + CONSTANT bin_one : bit_vector(1 to 4) := "0001"; + CONSTANT bin_two : bit_vector(1 to 4) := "0010"; + CONSTANT bin_three : bit_vector(1 to 4) := "0011"; + CONSTANT bin_four : bit_vector(1 to 4) := "0100"; + CONSTANT bin_five : bit_vector(1 to 4) := "0101"; + CONSTANT bin_six : bit_vector(1 to 4) := "0110"; + CONSTANT bin_seven : bit_vector(1 to 4) := "0111"; + CONSTANT bin_eight : bit_vector(1 to 4) := "1000"; + CONSTANT bin_nine : bit_vector(1 to 4) := "1001"; + CONSTANT bin_ten : bit_vector(1 to 4) := "1010"; + CONSTANT bin_eleven : bit_vector(1 to 4) := "1011"; + CONSTANT bin_twelve : bit_vector(1 to 4) := "1100"; + CONSTANT bin_thirteen : bit_vector(1 to 4) := "1101"; + CONSTANT bin_fourteen : bit_vector(1 to 4) := "1110"; + CONSTANT bin_fifteen : bit_vector(1 to 4) := "1111"; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_HexString --- input string has zero length "; + RETURN ""; + + ELSIF (str(str'LEFT) = NUL) THEN + assert false + report " From_HexString --- input string has nul character" + & " at the LEFT position " + severity ERROR; + RETURN ""; -- null bit_vector + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_HexString --- input string is empty "; + RETURN ""; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_HexString -- first non_white character is a NUL "; + RETURN ""; + END IF; + + i := 0; + FOR idx IN index TO str'length LOOP + ch := str_copy(idx); + EXIT WHEN ((Is_White(ch)) OR (ch = NUL)); + CASE ch IS + WHEN '0' => r(i+1 TO i+ hex_dig_len) := bin_zero; + WHEN '1' => r(i+1 TO i+ hex_dig_len) := bin_one; + WHEN '2' => r(i+1 TO i+ hex_dig_len) := bin_two; + WHEN '3' => r(i+1 TO i+ hex_dig_len) := bin_three; + WHEN '4' => r(i+1 TO i+ hex_dig_len) := bin_four; + WHEN '5' => r(i+1 TO i+ hex_dig_len) := bin_five; + WHEN '6' => r(i+1 TO i+ hex_dig_len) := bin_six; + WHEN '7' => r(i+1 TO i+ hex_dig_len) := bin_seven; + WHEN '8' => r(i+1 TO i+ hex_dig_len) := bin_eight; + WHEN '9' => r(i+1 TO i+ hex_dig_len) := bin_nine; + WHEN 'A' | 'a' => r(i+1 TO i+ hex_dig_len) := bin_ten; + WHEN 'B' | 'b' => r(i+1 TO i+ hex_dig_len) := bin_eleven; + WHEN 'C' | 'c' => r(i+1 TO i+ hex_dig_len) := bin_twelve; + WHEN 'D' | 'd' => r(i+1 TO i+ hex_dig_len) := bin_thirteen; + WHEN 'E' | 'e' => r(i+1 TO i+ hex_dig_len) := bin_fourteen; + WHEN 'F' | 'f' => r(i+1 TO i+ hex_dig_len) := bin_fifteen; + WHEN NUL => exit; + WHEN OTHERS => -- a non binary value was passed + ASSERT (invalid) + REPORT "From_HexString(str(" & To_String(idx) & ") => " + & To_String(ch) & ") is an invalid character" + SEVERITY ERROR; + invalid := TRUE; + END CASE; + i := i + hex_dig_len; + END LOOP; + -- check for invalid character in the string + if ( invalid ) THEN + r(1 TO i) := (OTHERS => '0'); + end if; + result(i - 1 DOWNTO 0) := r(1 TO i); + return result(i - 1 DOWNTO 0); -- return slice of result + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.1 +--| Overloading : None +--| +--| Purpose : Convert a boolean to a String. +--| +--| Parameters : +--| val - input value, BOOLEAN, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a boolean. +--| +--| NOTE : +--| Default is right justified +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 5); +--| VARIABLE good : BOOLEAN := TRUE; +--| +--| s_flag := To_String ( good, "%5s" ); +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BOOLEAN; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE buf_str : STRING(1 TO 5) := (OTHERS => ' '); + VARIABLE str_len : INTEGER; + VARIABLE fw : INTEGER; + VARIABLE precis1 : INTEGER; + VARIABLE justfy : BIT; + CONSTANT FALSE_STR : STRING(1 to 5) := "FALSE"; -- for mentor unsupported feature + CONSTANT TRUE_STR : STRING(1 to 4) := "TRUE"; + + BEGIN + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- procedure S_Machine will issue the proper error messages. + S_Machine(fw, precis1, justfy, fmt); + + CASE val IS + WHEN FALSE + => + str_len := 5; + buf_str(1 TO str_len) := FALSE_STR; + + IF ((precis1 = 0) OR (precis1 > str_len)) THEN + precis1 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis1; + END IF; + + IF (precis1 >= fw) THEN + return(buf_str(1 TO precis1)); + ELSE + result(precis1 + 1 TO fw) := (OTHERS => ' '); + + END IF; + WHEN TRUE + => + str_len := 4; + buf_str(1 TO str_len) := TRUE_STR; + + IF ((precis1 = 0) OR (precis1 > str_len)) THEN + precis1 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis1; + END IF; + + IF (precis1 >= fw) THEN + return(buf_str(1 TO precis1)); + ELSE + result(precis1 + 1 TO fw) := (OTHERS => ' '); + + END IF; + + END CASE; + + IF (justfy = '1') THEN -- left jsutify + return (buf_str(1 TO precis1) & result(precis1 + 1 TO fw)); + ELSE -- right justified + return( result(precis1 + 1 TO fw) & buf_str(1 TO precis1)); + END IF; + + -- That's all + + END; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.2 +--| Overloading : None +--| +--| Purpose : Convert a bit Value to a String. +--| +--| Parameters : +--| val - input bit. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a bit. +--| +--| +--| Use : +--| VARIABLE bit_string : String(1 TO 5); +--| +--| bit_string := To_String ( '1', "%1s"); +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BIT; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis, justfy, fmt); + + IF (fw < 1) THEN + fw := 1; + END IF; + -- fill result from 1 to fw with blanks + result(1 TO fw) := (OTHERS => ' '); + + CASE val IS + + WHEN '1' => + IF (justfy = '1') THEN -- left justify + result(1) := '1'; + ELSE -- right justify + result (fw) := '1'; + END if; + + WHEN '0' => IF (justfy = '1') THEN -- left justify + result(1) := '0'; + ELSE -- right justify + result (fw) := '0'; + END if; + END CASE; + RETURN result(1 TO fw); -- return a slice. + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.3 +--| Overloading : None +--| +--| Purpose : Convert a Character to a String. +--| +--| Parameters : +--| val - input character. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Note : This function allows to see the non-printable characters. +--| FOR non_printable characters if precision is less than +--| 3 it will be automatically set to 3. +--| +--| Default precision will be set to eigther 3 or 1 +--| +--| Result : STRING representation of a character. +--| +--| +--| Use : +--| VARIABLE ascii_char : String(1 TO 5); +--| +--| ascii_char := To_String ( d, "%3s"); +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN CHARACTER; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + VARIABLE str2 : STRING(1 to 2); + VARIABLE str3 : STRING(1 to 3); + + + + BEGIN + -- + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis, justfy, fmt); + + -- since purpose of this routine to see input characters even if + -- they are non_printable, precision 3 for non_printable and 1 for + -- graphic characters. + + IF ((val >= NUL AND val <= USP) AND (fw < 3)) THEN + fw := 3; + ELSIF ((val = DEL) AND (fw < 3)) THEN + fw := 3; + ELSIF (fw = 0) THEN + fw := 1; + END IF; + + FOR i IN 1 TO fw LOOP + result(i) := ' '; + END LOOP; + + CASE val is + WHEN NUL => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "NUL"; + ELSE -- right justify + str3 := "NUL"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN SOH => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "SOH"; + ELSE -- right justify + str3 := "SOH"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN STX => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "STX"; + ELSE -- right justify + str3 := "STX"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN ETX => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "ETX"; + ELSE -- right justify + str3 := "ETX"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN EOT => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "EOT"; + ELSE -- right justify + str3 := "EOT"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN ENQ => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "ENQ"; + ELSE -- right justify + str3 := "ENQ"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN ACK => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "ACK"; + ELSE -- right justify + str3 := "ACK"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN BEL => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "BEL"; + ELSE -- right justify + str3 := "BEL"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN BS => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "BS"; + ELSE -- right justify + str2 := "BS"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN HT => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "HT"; + ELSE -- right justify + str2 := "HT"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN LF => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "LF"; + ELSE -- right justify + str2 := "LF"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN VT => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "VT"; + ELSE -- right justify + str2 := "VT"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN FF => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "FF"; + ELSE -- right justify + str2 := "FF"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN CR => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "CR"; + ELSE -- right justify + str2 := "CR"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN SO => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "SO"; + ELSE -- right justify + str2 := "SO"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN SI => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "SI"; + ELSE -- right justify + str2 := "SI"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN DLE => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DLE"; + ELSE -- right justify + str3 := "DLE"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN DC1 => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DC1"; + ELSE -- right justify + str3 := "DC1"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN DC2 => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DC2"; + ELSE -- right justify + str3 := "DC2"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN DC3 => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DC3"; + ELSE -- right justify + str3 := "DC3"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN DC4 => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DC4"; + ELSE -- right justify + str3 := "DC4"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN NAK => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "NAK"; + ELSE -- right justify + str3 := "NAK"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN SYN => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "SYN"; + ELSE -- right justify + str3 := "SYN"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN ETB => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "ETB"; + ELSE -- right justify + str3 := "ETB"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN CAN => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "CAN"; + ELSE -- right justify + str3 := "CAN"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN EM => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "EM"; + ELSE -- right justify + str2 := "EM"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN SUB => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "SUB"; + ELSE -- right justify + str3 := "SUB"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN ESC => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "ESC"; + ELSE -- right justify + str3 := "ESC"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN FSP => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "FSP"; + ELSE -- right justify + str3 := "FSP"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN GSP => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "GSP"; + ELSE -- right justify + str3 := "GSP"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN RSP => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "RSP"; + ELSE -- right justify + str3 := "RSP"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN USP => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "USP"; + ELSE -- right justify + str3 := "USP"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN DEL => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DEL"; + ELSE -- right justify + str3 := "DEL"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN OTHERS => + IF (justfy = '1') THEN -- left justify + result(1) := val; + ELSE -- right justify + result (fw) := val; + END if; + END CASE; + RETURN result(1 TO fw); -- return a slice + END; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.4 +--| Overloading : None +--| +--| Purpose : Convert a severity-level to a string. +--| +--| Parameters : +--| val - input severity-level. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a severity-level. +--| +--| Use : +--| VARIABLE s_level : String(1 TO 7); +--| VARIABLE message : SEVERITY_LEVEL := NOTE; +--| +--| s_level := To_String (message, "%7s"); +--|------------------------------------------------------------------ + FUNCTION To_String ( CONSTANT val : IN SEVERITY_LEVEL; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE buf_str : STRING(1 TO 10); -- severity-level is maximum 7 characters + VARIABLE str_len : INTEGER; + VARIABLE fw : INTEGER; + VARIABLE precis2 : INTEGER; + VARIABLE justfy : BIT; + CONSTANT NOTE_STR : STRING(1 to 4) := "NOTE"; -- fix for mentor unsupported feature + CONSTANT WARNING_STR : STRING(1 to 7) := "WARNING"; + CONSTANT ERROR_STR : STRING(1 to 5) := "ERROR"; + CONSTANT FAILURE_STR : STRING(1 to 7) := "FAILURE"; + + BEGIN + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis2, justfy, fmt); + + CASE val IS + WHEN NOTE + => + str_len := 4; + buf_str(1 TO str_len) := NOTE_STR; + + IF ((precis2 = 0) OR (precis2 > str_len)) THEN + precis2 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis2; + END IF; + + IF (precis2 >= fw) THEN + return(buf_str(1 TO precis2)); + ELSE + result(precis2 + 1 TO fw) := (OTHERS => ' '); + + END IF; + + WHEN WARNING => + str_len := 7; + buf_str(1 TO str_len) := WARNING_STR; + + IF ((precis2 = 0) OR (precis2 > str_len)) THEN + precis2 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis2; + END IF; + + IF (precis2 >= fw) THEN + return(buf_str(1 TO precis2)); + ELSE + result(precis2 + 1 TO fw) := (OTHERS => ' '); + END IF; + + WHEN ERROR => + str_len := 5; + buf_str(1 TO str_len) := ERROR_STR; + + IF ((precis2 = 0) OR (precis2 > str_len)) THEN + precis2 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis2; + END IF; + + IF (precis2 >= fw) THEN + return(buf_str(1 TO precis2)); + ELSE + result(precis2 + 1 TO fw) := (OTHERS => ' '); + END IF; + + WHEN FAILURE => + str_len := 7; + buf_str(1 TO str_len) := FAILURE_STR; + + IF ((precis2 = 0) OR (precis2 > str_len)) THEN + precis2 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis2; + END IF; + + IF (precis2 >= fw) THEN + return(buf_str(1 TO precis2)); + ELSE + result(precis2 + 1 TO fw) := (OTHERS => ' '); + END IF; + + END CASE; + IF (justfy = '1') THEN -- left jsutify + return ( buf_str(1 TO precis2) & result(precis2 + 1 TO fw)); + ELSE -- right justified + return (result(precis2 + 1 TO fw) & buf_str(1 TO precis2)); + END IF; + + -- That's all + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.5 +--| Overloading : None +--| +--| Purpose : Convert an integer into a String according +--| format specification. +--| +--| Parameters : +--| val - input value, INTEGER, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of an integer. +--| +--| NOTE : Format string has same meaning a in C language. +--| That if format is "%d " will convert an integer to +--| a string of length equal to number of digits in the +--| given inetger argument. While "%10d " return +--| a string of length 10 and if the number of digits +--| in the integer are less than 10 it will pad the +--| string with blank on the left because default +--| justification is right. if number of digits are +--| larger than 10 it will return 10 leftmost digits. +--| +--| +--| +--| USE : +--| VARIABLE str : STRING(1 TO 10); +--| VARIABLE val : INTEGER := 2750; +--| +--| str := TO_String(val, "%10d"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN INTEGER; + CONSTANT format : IN STRING := "%d" + ) RETURN STRING IS + VARIABLE buf : string(max_string_len DOWNTO 1) ; -- implicitly == NUL + VARIABLE rbuf : string(max_string_len DOWNTO 1) ; + VARIABLE result : string(1 TO max_string_len) ; + VARIABLE str_index : integer := 0; + VARIABLE ival : integer; + VARIABLE format_cpy : STRING(1 TO format'LENGTH) := format; + VARIABLE indx : INTEGER; + VARIABLE fw : INTEGER; -- field width + VARIABLE precis : INTEGER; + VARIABLE justy : BIT := '0'; + + BEGIN + -- convert to positive number + ival := ABS(val); + IF ival = 0 then + str_index := str_index + 1; + buf(str_index) := '0'; + ELSE + int_loop : LOOP + str_index := str_index + 1; + CASE (ival MOD 10) IS + WHEN 0 => buf (str_index) := '0'; + WHEN 1 => buf (str_index) := '1'; + WHEN 2 => buf (str_index) := '2'; + WHEN 3 => buf (str_index) := '3'; + WHEN 4 => buf (str_index) := '4'; + WHEN 5 => buf (str_index) := '5'; + WHEN 6 => buf (str_index) := '6'; + WHEN 7 => buf (str_index) := '7'; + WHEN 8 => buf (str_index) := '8'; + WHEN 9 => buf (str_index) := '9'; + WHEN OTHERS => null; -- do nothing + END CASE; + ival := ival / 10; + EXIT int_loop WHEN ival=0; + END LOOP; + END IF; + + -- call procedure D_Machine to split the format string into + -- field width, and justification(left or right) and precision + D_Machine(fw, precis, justy, format_cpy); + + IF (precis > str_index) THEN -- pad with zeros to make up precision + buf(precis DOWNTO str_index + 1) := (OTHERS => '0'); + str_index := precis; + END IF; + + -- Handle the negative numbers here... + IF val < 0 then + str_index := str_index + 1; + buf (str_index) := '-'; + END IF; + + -- return the result according to field width and justification + IF (fw > str_index) THEN + case justy IS + WHEN '0' => + buf(fw DOWNTO str_index + 1) := (OTHERS => ' '); + return buf(fw DOWNTO 1); + WHEN '1' => + rbuf(fw - str_index DOWNTO 1) := (OTHERS => ' '); + result(1 TO str_index) := buf(str_index DOWNTO 1); + indx := str_index; + FOR i IN fw DOWNTO str_index+1 LOOP + indx := indx + 1; + result(indx) := ' '; + END LOOP; + return result(1 TO fw); + WHEN OTHERS => + ASSERT NOT WarningsOn + report " To_String --- error in justification " + SEVERITY WARNING; + return buf(str_index DOWNTO 1); + end case; + ELSE -- fw is lessthan or equal to std_index + return buf(str_index DOWNTO 1); + END IF; + + -- That's all + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.6 +--| Overloading : None +--| +--| Purpose : Convert a real number to a String. +--| +--| Parameters : +--| val - input value, REAL, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a real number. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 10); +--| VARIABLE val : REAL := 67.560 +--| +--| str := TO_String(val, "%10.3f"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN REAL; + CONSTANT format : IN STRING := "%f" + ) RETURN STRING IS + VARIABLE tbuf : string(max_string_len DOWNTO 1) ; -- implicitly == NUL + VARIABLE rbuf : string(max_string_len DOWNTO 1); + VARIABLE result : string(1 TO max_string_len); + VARIABLE str_index : Natural := 0; + VARIABLE rval : real; + VARIABLE int_val : INTEGER; + VARIABLE frac_digits : INTEGER; + VARIABLE fract_val : INTEGER; + VARIABLE format_cpy : string(1 TO format'length) := format; + VARIABLE fw_actual : integer; -- actual field width + VARIABLE indx : integer; + VARIABLE pr_actual : integer; -- actual precision + VARIABLE fw : integer; -- field width + VARIABLE precis : integer; -- precision + VARIABLE justy : BIT := '0'; -- justification + VARIABLE neg_sign : BOOLEAN := false ; + BEGIN + -- Handle the negative numbers here... + if val < 0.0 then + neg_sign := NOT neg_sign; + end if; + + rval := ABS (val); + int_val := i_TRUNC(rval); + i_Frac(rval, fract_val, frac_digits); + + -- call procedure F_Machine to split the format string into + -- field width, precision, and justification + + F_Machine(fw, precis, justy, format_cpy); + + -- convert fractional part to a string + IF fract_val = 0 then + str_index := str_index + 1; + tbuf(str_index) := '0'; + ELSE + fract_loop : LOOP + str_index := str_index + 1; + + CASE (fract_val MOD 10) IS + WHEN 0 => tbuf (str_index) := '0'; + WHEN 1 => tbuf (str_index) := '1'; + WHEN 2 => tbuf (str_index) := '2'; + WHEN 3 => tbuf (str_index) := '3'; + WHEN 4 => tbuf (str_index) := '4'; + WHEN 5 => tbuf (str_index) := '5'; + WHEN 6 => tbuf (str_index) := '6'; + WHEN 7 => tbuf (str_index) := '7'; + WHEN 8 => tbuf (str_index) := '8'; + WHEN 9 => tbuf (str_index) := '9'; + WHEN OTHERS => null; -- do nothing + END CASE; + fract_val := fract_val / 10; + EXIT fract_loop WHEN fract_val=0; + END LOOP; + END IF; + -- add leading zeros of fractional part + + FOR i IN 1 to 6 - frac_digits LOOP + str_index := str_index + 1; + tbuf(str_index) := '0'; + END LOOP; + + pr_actual := str_index; -- actual precision of give real number + + IF (precis > str_index) THEN + rbuf(precis - str_index DOWNTO 1) := (OTHERS => '0'); + rbuf(precis DOWNTO precis - str_index + 1) := tbuf(str_index DOWNTO 1); + ELSE + rbuf(precis DOWNTO 1) := tbuf(str_index DOWNTO str_index - precis + 1); + END IF; + + -- decimal point + str_index := precis + 1; + rbuf(str_index) := '.'; + + -- integer part of a real number + + IF int_val = 0 then + str_index := str_index + 1; + rbuf(str_index) := '0'; + ELSE + int_loop : LOOP + str_index := str_index + 1; + + CASE (int_val MOD 10) IS + WHEN 0 => rbuf (str_index) := '0'; + WHEN 1 => rbuf (str_index) := '1'; + WHEN 2 => rbuf (str_index) := '2'; + WHEN 3 => rbuf (str_index) := '3'; + WHEN 4 => rbuf (str_index) := '4'; + WHEN 5 => rbuf (str_index) := '5'; + WHEN 6 => rbuf (str_index) := '6'; + WHEN 7 => rbuf (str_index) := '7'; + WHEN 8 => rbuf (str_index) := '8'; + WHEN 9 => rbuf (str_index) := '9'; + WHEN OTHERS => null; -- do nothing + END CASE; + int_val := int_val / 10; + EXIT int_loop WHEN int_val=0; + END LOOP; + END IF; + -- negative sign + IF neg_sign THEN + str_index := str_index + 1; + rbuf(str_index) := '-'; + END IF; + fw_actual := str_index; -- actual field width of real + IF (fw <= fw_actual) THEN + return rbuf(fw_actual DOWNTO 1); + ELSIF (justy = '0') THEN -- right justify + For i In fw DOWNTO fw_actual + 1 LOOP + rbuf(i) := ' '; + END LOOP; + return rbuf(fw DOWNTO 1); + ELSIF (justy = '1' ) THEN -- left justify + result(1 TO fw_actual) := rbuf(fw_actual DOWNTO 1); + indx := fw_actual; + For i In fw - fw_actual DOWNTO 1 LOOP + indx := indx + 1; + result(indx) := ' '; + END LOOP; + return result(1 TO indx); + END IF; + -- That's all + END; +--+----------------------------------------------------------------------------- +--| Function Name : To_OctString +--| hidden +--| Overloading : None +--| +--| Purpose : Convert a bit_vector to a octal String. +--| +--| Parameters : +--| val - input, BIT_VECTOR, +--| +--| Result : STRING representation of a bit_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : BIT_VECTOR (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_OctString ( CONSTANT val : IN BIT_VECTOR; + CONSTANT format : IN STRING := "%o" + ) RETURN STRING IS + CONSTANT reslen : INTEGER := val'LENGTH; + CONSTANT oct_bits : INTEGER := 3; + VARIABLE last_bits : INTEGER; + VARIABLE oct_len : NATURAL; + VARIABLE loc_result : STRING(1 TO reslen); + VARIABLE oct_result : STRING(1 TO reslen) := (OTHERS => ' '); +-- VARIABLE oct_str : STRING(1 TO oct_bits); -- Intermetrics can't handle this on the case statement below! + VARIABLE oct_str : STRING(1 TO 3 ); + VARIABLE bv : BIT_VECTOR(1 TO reslen) := val; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + VARIABLE str_type : CHARACTER; + VARIABLE index : INTEGER; + + BEGIN + -- + -- convert Bit_Vector to string without taking care of format + + FOR i IN reslen DOWNTO 1 LOOP + IF ( bv(i) = '1') THEN + loc_result(i) := '1'; + ELSE -- bv(i) = '0' + loc_result(i) := '0'; + END IF; + END LOOP; + + -- call procedure SOX_Machine to split the format string into + -- field width, precision, and justification(left or right), and + -- string_type ( binary, octal or hex) + + SOX_Machine(fw, precis, justfy, str_type, fmt); + -- set the field width and precison propoerly + IF ((precis = 0) OR (precis > reslen)) THEN + precis := reslen; + END IF; + + last_bits := precis MOD oct_bits; + IF (last_bits = 0) THEN + oct_len := precis / oct_bits; + ELSE + oct_len := precis /oct_bits + 1; + END IF; + + index := precis; + FOR i IN oct_len DOWNTO 1 LOOP + IF ( i = 1) AND (last_bits /= 0) THEN + oct_str(1 TO oct_bits - last_bits) := (OTHERS => '0'); + oct_str(oct_bits - last_bits + 1 TO oct_bits) := loc_result(1 TO last_bits); + ELSE + oct_str := loc_result(index - 2 TO index); + END IF; + CASE oct_str IS + WHEN "000" => oct_result(i) := '0'; + WHEN "001" => oct_result(i) := '1'; + WHEN "010" => oct_result(i) := '2'; + WHEN "011" => oct_result(i) := '3'; + WHEN "100" => oct_result(i) := '4'; + WHEN "101" => oct_result(i) := '5'; + WHEN "110" => oct_result(i) := '6'; + WHEN "111" => oct_result(i) := '7'; + WHEN OTHERS => null; + END CASE; + index := index - oct_bits; + END LOOP; + + IF (fw < oct_len) THEN + fw := oct_len; + END IF; + + IF (oct_len >= fw) THEN + return(oct_result(1 TO oct_len)); + ELSE + result(oct_len+1 TO fw) := (OTHERS => ' '); + END IF; + + -- Now according to justification return the result; + IF (justfy = '1') THEN -- left justify + return (oct_result(1 TO oct_len) & result(oct_len+1 TO fw)); + ELSE -- right justify + return( result(oct_len + 1 TO fw) & oct_result(1 TO oct_len)); + END IF; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_HexString +--| hidden +--| Overloading : None +--| +--| Purpose : Convert a bit_vector to a octal String. +--| +--| Parameters : +--| val - input, BIT_VECTOR, +--| +--| Result : STRING representation of a bit_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : BIT_VECTOR (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%4x"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_HexString ( CONSTANT val : IN BIT_VECTOR; + CONSTANT format : IN STRING := "%x" + ) RETURN STRING IS + CONSTANT reslen : INTEGER := val'LENGTH; + CONSTANT hex_bits : INTEGER := 4; + VARIABLE last_bits : INTEGER; + VARIABLE hex_len : NATURAL; + VARIABLE loc_result : STRING(1 TO reslen); + VARIABLE hex_result : STRING(1 TO reslen) := (OTHERS => ' '); +-- VARIABLE hex_str : STRING(1 TO hex_bits); -- Intermetrics can't handle this on the case statement below! + VARIABLE hex_str : STRING(1 TO 4 ); + VARIABLE bv : BIT_VECTOR(1 TO reslen) := val; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + VARIABLE str_type : CHARACTER; + VARIABLE index : INTEGER; + + BEGIN + -- + -- convert Bit_Vector to string without taking care of format + + FOR i IN reslen DOWNTO 1 LOOP + IF ( bv(i) = '1') THEN + loc_result(i) := '1'; + ELSE -- bv(i) = '0' + loc_result(i) := '0'; + END IF; + END LOOP; + + -- call procedure SOX_Machine to split the format string into + -- field width, precision, and justification(left or right), and + -- string_type ( binary, octal or hex) + + SOX_Machine(fw, precis, justfy, str_type, fmt); + -- set the field width and precison propoerly + IF ((precis = 0) OR (precis > reslen)) THEN + precis := reslen; + END IF; + + last_bits := precis MOD hex_bits; + IF (last_bits = 0) THEN + hex_len := precis / hex_bits; + ELSE + hex_len := precis /hex_bits + 1; + END IF; + + index := precis; + FOR i IN hex_len DOWNTO 1 LOOP + IF ( i = 1) AND (last_bits /= 0) THEN + hex_str(1 TO hex_bits - last_bits) := (OTHERS => '0'); + hex_str(hex_bits - last_bits + 1 TO hex_bits) := loc_result(1 TO last_bits); + ELSE + hex_str := loc_result(index - 3 TO index); + END IF; + CASE hex_str IS + WHEN "0000" => hex_result(i) := '0'; + WHEN "0001" => hex_result(i) := '1'; + WHEN "0010" => hex_result(i) := '2'; + WHEN "0011" => hex_result(i) := '3'; + WHEN "0100" => hex_result(i) := '4'; + WHEN "0101" => hex_result(i) := '5'; + WHEN "0110" => hex_result(i) := '6'; + WHEN "0111" => hex_result(i) := '7'; + WHEN "1000" => hex_result(i) := '8'; + WHEN "1001" => hex_result(i) := '9'; + WHEN "1010" => hex_result(i) := 'A'; + WHEN "1011" => hex_result(i) := 'B'; + WHEN "1100" => hex_result(i) := 'C'; + WHEN "1101" => hex_result(i) := 'D'; + WHEN "1110" => hex_result(i) := 'E'; + WHEN "1111" => hex_result(i) := 'F'; + WHEN OTHERS => null; + END CASE; + index := index - hex_bits; + END LOOP; + + IF (fw < hex_len) THEN + fw := hex_len; + END IF; + + IF (hex_len >= fw) THEN + return(hex_result(1 TO hex_len)); + ELSE + result(hex_len+1 TO fw) := (OTHERS => ' '); + END IF; + + -- Now according to justification return the result; + IF (justfy = '1') THEN -- left justify + return (hex_result(1 TO hex_len) & result(hex_len+1 TO fw)); + ELSE -- right justify + return( result(hex_len + 1 TO fw) & hex_result(1 TO hex_len)); + END IF; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.8 +--| Overloading : None +--| +--| Purpose : Convert a bit_vector to a String. +--| +--| Parameters : +--| val - input, BIT_VECTOR, +--| +--| Result : STRING representation of a bit_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : BIT_VECTOR (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BIT_VECTOR; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + CONSTANT reslen : INTEGER := val'LENGTH; + VARIABLE loc_result : STRING(1 TO reslen); + VARIABLE bv : BIT_VECTOR(1 TO reslen) := val; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + VARIABLE str_type : CHARACTER; + VARIABLE index : INTEGER; + + BEGIN + -- call procedure SOX_Machine to split the format string into + -- field width, precision, and justification(left or right), and + -- string_type ( binary, octal or hex) + SOX_Machine(fw, precis, justfy, str_type, fmt); + CASE str_type IS + WHEN 's' => + -- convert Bit_Vector to string without taking care of format + FOR i IN reslen DOWNTO 1 LOOP + IF ( bv(i) = '1') THEN + loc_result(i) := '1'; + ELSE -- bv(i) = '0' + loc_result(i) := '0'; + END IF; + END LOOP; + -- set the field width and precison propoerly + IF ((precis = 0) OR (precis > reslen)) THEN + precis := reslen; + END IF; + + IF (fw < val'LENGTH) THEN + fw := val'LENGTH; + END IF; + + IF (precis >= fw) THEN + return(loc_result(1 TO precis)); + ELSE + result(precis+1 TO fw) := (OTHERS => ' '); + END IF; + + -- Now according to justification return the result; + IF (justfy = '1') THEN -- left justify + return (loc_result(1 TO precis) & result(precis+1 TO fw)); + ELSE -- right justify + return( result(precis+1 TO fw) & loc_result(1 TO precis)); + END IF; + + WHEN 'o' | 'O' => return(To_OctString(val, format)); + + WHEN 'x' | 'X' => return(TO_HexString(val, format)); + + WHEN OTHERS => --ASSERT false + --report " To_String (bit_vector case)-- format error " + --SEVERITY ERROR; + return result; + END CASE; + END To_String; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.10.2 +--| Overloading : None +--| +--| Purpose : Convert an std_ulogic to a String. +--| +--| Parameters : +--| val - input std_ulogic. +--| +--| Result : STRING representation of std_ulogic. +--| +--| Use : +--| VARIABLE str_ovf : STRING(1 TO 4); +--| VARIABLE overflow : std_ulogic; +--| +--| str_ovf := TO_String(vect, "%4s"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_ulogic; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justify : BIT; + + BEGIN + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis, justify, fmt); + + IF (fw < 1) THEN + fw := 1; + END IF; + -- fill result from 1 to fw with blanks + result(1 TO fw) := (OTHERS => ' '); + CASE val IS + WHEN 'U' => IF (justify = '1') THEN -- left justify + result(1) := 'U'; + ELSE -- right justify + result(fw) := 'U'; + END IF; + + WHEN 'X' => IF (justify = '1') THEN -- left justify + result(1) := 'X'; + ELSE -- right justify + result(fw) := 'X'; + END IF; + + WHEN '0' => IF (justify = '1') THEN -- left justify + result(1) := '0'; + ELSE -- right justify + result(fw) := '0'; + END IF; + + WHEN '1' => IF (justify = '1') THEN -- left justify + result(1) := '1'; + ELSE -- right justify + result(fw) := '1'; + END IF; + + WHEN 'Z' => IF (justify = '1') THEN -- left justify + result(1) := 'Z'; + ELSE -- right justify + result(fw) := 'Z'; + END IF; + + WHEN 'W' => IF (justify = '1') THEN -- left justify + result(1) := 'W'; + ELSE -- right justify + result(fw) := 'W'; + END IF; + + WHEN 'L' => IF (justify = '1') THEN -- left justify + result(1) := 'L'; + ELSE -- right justify + result(fw) := 'L'; + END IF; + + WHEN 'H' => IF (justify = '1') THEN -- left justify + result(1) := 'H'; + ELSE -- right justify + result(fw) := 'H'; + END IF; + + WHEN '-' => IF (justify = '1') THEN -- left justify + result(1) := '-'; + ELSE -- right justify + result(fw) := '-'; + END IF; + + WHEN OTHERS => -- An unknown std_ulogic value was passed + ASSERT FALSE + REPORT "To_String - Unknown std_ulogic value" + SEVERITY ERROR; + END CASE; + RETURN result(1 TO fw); + END To_String; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| +--| Overloading : None +--| +--| Purpose : Convert an std_logic_vector to a String. +--| +--| Parameters : +--| val - input std_logic_vector. +--| +--| Result : STRING representation of std_logic_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : std_logic_vector (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_logic_vector; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + CONSTANT reglen : INTEGER := val'LENGTH; + VARIABLE loc_result : STRING(1 TO reglen); + VARIABLE slv : std_logic_vector(1 TO reglen) := val; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- Convert to string without taking care of the format. + FOR i IN reglen DOWNTO 1 LOOP + CASE slv(i) IS + WHEN 'U' => loc_result(i) := 'U'; + WHEN 'X' => loc_result(i) := 'X'; + WHEN '0' => loc_result(i) := '0'; + WHEN '1' => loc_result(i) := '1'; + WHEN 'Z' => loc_result(i) := 'Z'; + WHEN 'W' => loc_result(i) := 'W'; + WHEN 'L' => loc_result(i) := 'L'; + WHEN 'H' => loc_result(i) := 'H'; + WHEN '-' => loc_result(i) := '-'; + WHEN OTHERS => -- An unknown std_logic value was passed + ASSERT FALSE + REPORT "To_String -- Unknown std_logic_vector value" + SEVERITY ERROR; + END CASE; + END LOOP; + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis, justfy, fmt); + -- set the field width and precison propoerly + IF ((precis = 0) OR (precis > reglen)) THEN + precis := reglen; + END IF; + IF (fw < val'LENGTH) THEN + fw := val'LENGTH; + END IF; + IF (precis >= fw) THEN + return(loc_result(1 TO precis)); + ELSE + result(precis+1 TO fw) := (OTHERS => ' '); + END IF; + -- Now according to justification return the result; + IF (justfy = '1') THEN -- left justify + return (loc_result(1 TO precis) & result(precis+1 TO fw)); + ELSE -- right justify + return( result(precis+1 TO fw) & loc_result(1 TO precis)); + END IF; + END To_String; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| +--| Overloading : None +--| +--| Purpose : Convert an std_ulogic_vector to a String. +--| +--| Parameters : +--| val - input std_ulogic_vector. +--| +--| Result : STRING representation of std_ulogic_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : std_ulogic_vector (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_ulogic_vector; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + CONSTANT reglen : INTEGER := val'LENGTH; + VARIABLE loc_result : STRING(1 TO reglen); + VARIABLE slv : std_ulogic_vector(1 TO reglen) := val; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- Convert to string without taking care of the format. + FOR i IN reglen DOWNTO 1 LOOP + CASE slv(i) IS + WHEN 'U' => loc_result(i) := 'U'; + WHEN 'X' => loc_result(i) := 'X'; + WHEN '0' => loc_result(i) := '0'; + WHEN '1' => loc_result(i) := '1'; + WHEN 'Z' => loc_result(i) := 'Z'; + WHEN 'W' => loc_result(i) := 'W'; + WHEN 'L' => loc_result(i) := 'L'; + WHEN 'H' => loc_result(i) := 'H'; + WHEN '-' => loc_result(i) := '-'; + WHEN OTHERS => -- An unknown std_logic value was passed + ASSERT FALSE + REPORT "To_String -- Unknown std_logic_vector value" + SEVERITY ERROR; + END CASE; + END LOOP; + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis, justfy, fmt); + -- set the field width and precison propoerly + IF ((precis = 0) OR (precis > reglen)) THEN + precis := reglen; + END IF; + IF (fw < val'LENGTH) THEN + fw := val'LENGTH; + END IF; + IF (precis >= fw) THEN + return(loc_result(1 TO precis)); + ELSE + result(precis+1 TO fw) := (OTHERS => ' '); + END IF; + -- Now according to justification return the result; + IF (justfy = '1') THEN -- left justify + return (loc_result(1 TO precis) & result(precis+1 TO fw)); + ELSE -- right justify + return( result(precis+1 TO fw) & loc_result(1 TO precis)); + END IF; + END To_String; +-- +-- character Handling Functions +-- +--+----------------------------------------------------------------------------- +--| Function Name : Is_Alpha +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a letter of the alphabet. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a letter of the +--| alphabet, false otherwise. +--| +--| +--| Use : VARIABLE ch : character; +--| +--| While (Is_Alpha(ch)) LOOP +--| -- do somthing +--| END LOOP; +--| +--| See Also : Is_Digit, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Alpha ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + + VARIABLE result : BOOLEAN := false; + BEGIN + IF ( (c >= 'a' AND c <= 'z') OR ( c >= 'A' AND c <= 'Z')) THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + END Is_Alpha; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Upper +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is an upper case letter. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is an upper case letter of +--| the alphabet, false otherwise. +--| +--| Use : VARIABLE ch : character; +--| +--| IF (IS_Upper(ch)) THEN +--| +--| -- do somthing +--| ELSE +--| -- do alternate action +--| END IF; +--| +--| See Also : Is_Digit, Is_Alpha, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Upper ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + VARIABLE result : BOOLEAN := false; + BEGIN + IF ( c >= 'A' AND c <= 'Z') THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + END Is_Upper; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a lower case letter. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a lower case letter of +--| the alphabet, false otherwise. +--| +--| +--| See Also : Is_Digit, Is_Upper, Is_Alpha +--|----------------------------------------------------------------------------- + FUNCTION Is_Lower ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + VARIABLE result : BOOLEAN := false; + BEGIN + IF ( c >= 'a' AND c <= 'z' ) THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + END Is_Lower; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Digit +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a digit 0-9. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a digit, false +--| otherwise. +--| +--| +--| See Also : Is_Alpha, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Digit ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + VARIABLE result : BOOLEAN; + BEGIN + IF (c >= '0' and c <= '9') THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + END Is_Digit; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Space +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a blank, tab or newline. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a blank or tab(HT), +--| false otherwise. +--| +--| +--| See Also : Is_Digit, Is_Upper, Is_Lower, Is_Alpha +--|----------------------------------------------------------------------------- + FUNCTION Is_Space ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + VARIABLE result : BOOLEAN; + BEGIN + IF (c = ' ' OR c = HT ) THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + END Is_Space; +--+----------------------------------------------------------------------------- +--| Function Name : To_Upper +--| 1. +--| Overloading : None +--| +--| Purpose :Convert a character to upper case. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : Character converted to upper case. +--| +--| +--| See Also : To_Lower, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Upper ( CONSTANT c : IN CHARACTER + ) RETURN CHARACTER IS + VARIABLE result : CHARACTER := c; + BEGIN + IF ( c >= 'a' and c <= 'z') THEN + result := CHARACTER'VAL( CHARACTER'POS(c) + - CHARACTER'POS('a') + + CHARACTER'POS('A') ); + END IF; + RETURN result; + END To_Upper; +--+----------------------------------------------------------------------------- +--| Function Name : To_Upper +--| 1. +--| Overloading : None +--| +--| Purpose :Convert a string to upper case. +--| +--| Parameters : +--| val - input, string to be converted +--| +--| Result : string . +--| +--| +--| See Also : To_Lower, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Upper ( CONSTANT val : IN String + ) RETURN STRING IS + VARIABLE result : string (1 TO val'LENGTH) := val; + VARIABLE ch : character; + BEGIN + FOR i IN 1 TO val'LENGTH LOOP + ch := result(i); + EXIT WHEN ((ch = NUL) OR (ch = nul)); + IF ( ch >= 'a' and ch <= 'z') THEN + result(i) := CHARACTER'VAL( CHARACTER'POS(ch) + - CHARACTER'POS('a') + + CHARACTER'POS('A') ); + END IF; + END LOOP; + RETURN result; + END To_Upper; +--+----------------------------------------------------------------------------- +--| Function Name : To_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Convert a Character to lower case. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : Character converted to lower case. +--| +--| See Also : To_Upper, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Lower ( CONSTANT c : IN CHARACTER + ) RETURN CHARACTER IS + VARIABLE result : CHARACTER := c; + BEGIN + IF ( c >= 'A' and c <= 'Z') THEN + result := CHARACTER'VAL( CHARACTER'POS(c) + - CHARACTER'POS('A') + + CHARACTER'POS('a') ); + END IF; + RETURN result; + END To_Lower; +--+----------------------------------------------------------------------------- +--| Function Name : To_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Convert a String to lower case. +--| +--| Parameters : +--| val - input string to be converted. +--| +--| Result : string +--| +--| See Also : To_Upper, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Lower ( CONSTANT val : IN STRING + ) RETURN STRING IS + VARIABLE result : string (1 TO val'LENGTH) := val; + VARIABLE ch : character; + BEGIN + FOR i IN 1 TO val'LENGTH LOOP + ch := result(i); + EXIT WHEN ((ch = NUL) OR (ch = nul)); + IF ( ch >= 'A' and ch <= 'Z') THEN + result(i) := CHARACTER'VAL( CHARACTER'POS(ch) + - CHARACTER'POS('A') + + CHARACTER'POS('a') ); + END IF; + END LOOP; + RETURN result; + END To_Lower; +--+----------------------------------------------------------------------------- +--| Function Name : StrCat +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Concatenate two string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Concatenated string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrCat ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN STRING IS + CONSTANT len_l : INTEGER := StrLen(l_str); + CONSTANT len_r : INTEGER := StrLen(r_str); + CONSTANT len_result : INTEGER := len_l + len_r; + VARIABLE l : STRING ( 1 to l_str'length) := l_str; + VARIABLE r : STRING ( 1 to r_str'length) := r_str; + VARIABLE result : STRING (1 to len_result); + BEGIN + If (len_result /= 0) THEN + result (1 to len_l) := l ( 1 to len_l); + result (len_l+1 to len_result) := r ( 1 to len_r ); + RETURN result; + else + return ""; + end if; + + END StrCat; +--+----------------------------------------------------------------------------- +--| Function Name : StrNCat +--| 1.2.2 +--| Overloading : None +--| +--| Purpose : Concatenate upto n characters of r_string to l_string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Concatenated string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNCat ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : INTEGER + ) RETURN STRING IS + CONSTANT len_l : INTEGER := StrLen(l_str); + CONSTANT len_result : INTEGER := len_l + n; + VARIABLE l : STRING ( 1 to l_str'length) := l_str; + VARIABLE r : STRING ( 1 to r_str'length) := r_str; + VARIABLE result : STRING (1 TO len_result); + + BEGIN + IF (len_result = 0) THEN + return ""; + END IF; + IF ((n <= 0) OR (r_str'LENGTH = 0)) THEN + result(1 TO len_l) := l(1 To len_l); + ELSE + result(1 TO len_l) := l(1 TO len_l); + FOR i IN 1 TO n LOOP + result(len_l + i) := r(i); + EXIT when ((r(i) = NUL) OR + (i >= r_str'LENGTH)); + END LOOP; + END IF; + RETURN result; + END StrNCat; +--+----------------------------------------------------------------------------- +--| Function Name : StrCpy +--| 1.2.3 +--| Overloading : None +--| +--| Purpose : Copy r_string to l_string. +--| +--| Parameters : +--| l_str - output, STRING, target string +--| r_str - input, STRING, source string +--| +--| Result : +--| +--| NOTE : If the length of target string is greater than +--| the source string, then target string is padded +--| with space characters on the right side and when +--| the length of target string is shorter than the +--| length of source string only left most characters +--| of the source string will be be copied to the target. +--| +--| +--| USE : +--| Variable s1: string(1 TO 8); +--| +--| StrCpy(s1, "123456789A"); +--| s1 will hold "12345678" +--|----------------------------------------------------------------------------- + PROCEDURE StrCpy ( VARIABLE l_str : OUT STRING; + CONSTANT r_str : IN STRING) IS + VARIABLE l_len : integer := l_str'LENGTH; + VARIABLE r_len : integer := r_str'LENGTH; + VARIABLE r : STRING ( 1 to r_len) := r_str; + VARIABLE result : STRING (1 to l_len); + VARIABLE indx : integer := 1; + BEGIN + +-- removed because it is not needed and because other routines call strcpy +-- and they should not generate a strcpy error +-- assert (l_len > 0) +-- report "StrCpy: target string is of zero length " +-- severity ERROR; + + while ( (indx <= r_len) and (indx <= l_len) and (r(indx) /= NUL) ) loop + result(indx) := r(indx); + indx := indx + 1; + end loop; + if (indx <= l_len) then + result(indx) := NUL; + end if; + l_str := result; + return; + END StrCpy; +--+----------------------------------------------------------------------------- +--| Function Name : StrNCpy +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy at most n characters of r_string to l_string. +--| +--| Parameters : +--| l_str - output, STRING, target +--| r_str - input, STRING, source +--| n - input, Natural, number of characters to +--| to be copied. +--| +--| Result : l_string holds the result. +--| +--| NOTE : If n is less than or equal to zero then a srting +--| filled with blanks is returned. +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE StrNCpy ( VARIABLE l_str : OUT STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : IN NATURAL + ) IS + VARIABLE l_len : integer := l_str'LENGTH; + VARIABLE r_len : integer := r_str'LENGTH; + VARIABLE r : STRING ( 1 to r_len) := r_str; + VARIABLE result : STRING (1 to l_len); + VARIABLE indx : integer := 1; + BEGIN + +-- removed - for reason see strcpy +-- assert (l_len > 0) +-- report "StrNCpy: target string is of zero length " +-- severity ERROR; + + while ( (indx <= r_len) and (indx <= l_len) and (r(indx) /= NUL) and (indx <= n) ) loop + result(indx) := r(indx); + indx := indx + 1; + end loop; + if (indx <= l_len) then + result(indx) := NUL; + end if; + l_str := result; + return; + END StrNCpy; +--+----------------------------------------------------------------------------- +--| Function Name : StrCmp +--| +--| Overloading : None +--| +--| Purpose : Compare left input string to right input string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : INTEGER, returns an integer less than 0 if the left string +--| is less than the right string, returns integer 0 if the +--| the string are equal and returns an integer greater than +--| 0 if the left string is greater than the right string. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION StrCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN INTEGER IS + VARIABLE ls : STRING(1 TO l_str'LENGTH) := l_str; + VARIABLE rs : STRING(1 TO r_str'LENGTH) := r_str; + VARIABLE lv, rv : INTEGER; + VARIABLE i : INTEGER := 1; + BEGIN + WHILE ( (i <= ls'LENGTH) and (i <= rs'LENGTH) and (ls(i) /= NUL) and (rs(i) /= NUL) ) LOOP + if ( ls(i) /= rs(i) ) then + return (CHARACTER'POS(ls(i)) - CHARACTER'POS(rs(i))); + end if; + i := i + 1; + END LOOP; + + if ( i > ls'LENGTH) then + lv := 0; + else + lv := CHARACTER'POS(ls(i)); + end if; + + if ( i > rs'LENGTH) then + rv := 0; + else + rv := CHARACTER'POS(rs(i)); + end if; + + return (lv - rv); + END StrCmp; +--+----------------------------------------------------------------------------- +--| Function Name : StrNCmp +--| +--| Overloading : None +--| +--| Purpose : Compare at most n characters of left input string +--| to right input string. Returns an Integer. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| n - input, Natural, +--| +--| Result : Returns an integer less than 0 if left_most n +--| characters of the left string is less than the +--| right string, returns integer 0 if both strings +--| are equal, and returns an integer greater than 0 +--| if the left string is greater than the right string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : IN Natural + ) RETURN INTEGER IS + VARIABLE ls : STRING(1 TO l_str'LENGTH) := l_str; + VARIABLE rs : STRING(1 TO r_str'LENGTH) := r_str; + VARIABLE i : INTEGER := 1; + VARIABLE lv, rv : INTEGER; + BEGIN + IF ( n <= 0) THEN + RETURN (0); + ELSE + WHILE ( (i <= ls'LENGTH) and (i <= rs'LENGTH) and (ls(i) /= NUL) and (rs(i) /= NUL) and (i <= n) ) LOOP + if ( ls(i) /= rs(i) ) then + return (CHARACTER'POS(ls(i)) - CHARACTER'POS(rs(i))); + end if; + i := i + 1; + END LOOP; + + if ( i > n ) then + return 0; + end if; + + if ( i > ls'LENGTH) then + lv := 0; + else + lv := CHARACTER'POS(ls(i)); + end if; + + if ( i > rs'LENGTH) then + rv := 0; + else + rv := CHARACTER'POS(rs(i)); + end if; + + return (lv - rv); + END IF; + END StrNCmp; +--+----------------------------------------------------------------------------- +--| Function Name : StrNcCmp +--| +--| Overloading : None +--| +--| Purpose : Compare to strings and determine whether left input +--| string is less than, equal to or greater than right +--| input string. The comparison is Not case sensitive. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Returns an integer less than 0 if left_most n +--| characters of the left string is less than the +--| right string, returns integer 0 if both strings +--| are equal, and returns an integer greater than 0 +--| if the left string is greater than the right string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNcCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN INTEGER IS + + VARIABLE ls : STRING(1 TO l_str'LENGTH); + VARIABLE rs : STRING(1 TO r_str'LENGTH); + VARIABLE lv, rv : INTEGER; + VARIABLE i : INTEGER := 1; + + BEGIN + -- convert both strings to upper case + ls := To_Upper(l_str); + rs := To_Upper(r_str); + + WHILE ( (i <= ls'LENGTH) and (i <= rs'LENGTH) and (ls(i) /= NUL) and (rs(i) /= NUL) ) LOOP + if ( ls(i) /= rs(i) ) then + return (CHARACTER'POS(ls(i)) - CHARACTER'POS(rs(i))); + end if; + i := i + 1; + END LOOP; + + if ( i > ls'LENGTH) then + lv := 0; + else + lv := CHARACTER'POS(ls(i)); + end if; + + if ( i > rs'LENGTH) then + rv := 0; + else + rv := CHARACTER'POS(rs(i)); + end if; + + return (lv - rv); + END StrNcCmp; +--+----------------------------------------------------------------------------- +--| Function Name : StrLen +--| +--| Overloading : None +--| +--| Purpose : Returns length of a string. +--| +--| Parameters : +--| l_str - input, STRING, +--| +--| Result : Natural +--| +--| NOTE : +--| This is in fact same as String'LENGTH provided +--| by VHDL. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION StrLen ( CONSTANT l_str : IN STRING + ) RETURN NATURAL IS + VARIABLE len : natural := 0; + BEGIN + length_check : for i in l_str'range loop + EXIT length_check WHEN l_str(i) = NUL; + len := len + 1; + end loop; + return len; + END StrLen; +-- +-- FILE I/O +-- + +--+----------------------------------------------------------------------------- +--| Function Name :Copyfile +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy one ASCII_TEXT file to an other ASCII_TEXT file. +--| +--| Parameters : +--| in_fptr -- input, ASCII_TEXT, source file +--| out_fptr -- output, ASCII_TEXT, destination file +--| +--| NOTE : +--| +--| USE : +--| file romdata : ASCII_TEXT IS IN "NEW_ROM.dat"; +--| file dest_file : ASCII_TEXT IS OUT "SAVE_ROM.dat"; +--| +--| Copyfile(romdata, dest_file); +--|----------------------------------------------------------------------------- + PROCEDURE Copyfile ( VARIABLE in_fptr : IN ASCII_TEXT; + VARIABLE out_fptr : OUT ASCII_TEXT + ) IS + VARIABLE ch : character; + BEGIN + WHILE NOT ENDFILE(in_fptr) LOOP + READ(in_fptr, ch); + WRITE(out_fptr, ch); + END LOOP; + RETURN; + END Copyfile; + +--+----------------------------------------------------------------------------- +--| Function Name :Copyfile +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy one TEXT file to an other TEXT file. +--| +--| Parameters : +--| in_fptr -- input, TEXT, +--| out_fptr -- output, TEXT +--| +--| NOTE : +--| This is combination of READLINE() and WRITELINE() +--| procedures provided in the standard +--| TEXTIO package. +--| +--| USE : +--| file in_f : TEXT IS IN "data_in"; +--| file out_f : TEXT IS OUT "save_data"; +--| +--| Copyfile(in_f, out_f); +--|----------------------------------------------------------------------------- + PROCEDURE Copyfile ( VARIABLE in_fptr : IN TEXT; + VARIABLE out_fptr : OUT TEXT + ) IS + VARIABLE ll : LINE; -- LINE is declared in TEXTIO + + BEGIN + WHILE NOT ENDFILE(in_fptr) LOOP + READLINE(in_fptr, ll); -- call procedure from TEXTIO + WRITELINE(out_fptr, ll); + END LOOP; + DEALLOCATE(ll); + RETURN; + END Copyfile; + +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Convert up to 10 arguments to a file according to +--| the format specifications give by a format string. +--| +--| Parameters : +--| file_ptr - output ASCII_TEXT, destination file +--| format - input STRING, format control specifications. +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : formated TEXT. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE file_ptr : OUT ASCII_TEXT; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := "" ; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := "" ; + CONSTANT arg10 : IN STRING := "" + ) IS + VARIABLE arg : STRING(1 TO max_string_len); + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE index : INTEGER := 0; + VARIABLE ch : CHARACTER; + VARIABLE lookahead : CHARACTER; + VARIABLE tokn : STRING(1 TO max_token_len); + VARIABLE ArgNum : INTEGER RANGE 1 TO 11; + BEGIN + -- + IF (format'LENGTH = 0) THEN + assert false + report " fprint --- format string is null " + severity ERROR; + return; + END IF; + + ArgNum := 1; + WHILE (true) LOOP + index := index + 1; + ch := fmt(index); + + IF (index < format'LENGTH) THEN + lookahead := fmt(index+1); + ELSE + lookahead := ' '; + END IF; + + IF (( ch = '%') AND (lookahead = '%')) THEN + index := index + 1; -- print % character + WRITE(file_ptr, ch); + + ELSIF ((ch = '\') AND (lookahead ='n')) THEN -- new line + index := index + 1; + ch := LF; + WRITE(file_ptr, ch); + + ELSIF (ch = '%') AND (lookahead /= '%') THEN + -- format %s expected + EXIT WHEN (ArgNum > 10); -- only first 10 argments will be printed + tokn := (OTHERS => ' '); -- fill token with blank space + get_token(fmt, index, tokn); + + -- select argument number 1 to 10 + Case ArgNum IS + WHEN 1 => + IF (arg1 /= "") THEN + print_str(file_ptr, tokn, arg1); + ELSE + EXIT; + END IF; + + WHEN 2 => + IF (arg2 /= "") THEN + print_str(file_ptr, tokn, arg2); + ELSE + EXIT; + END IF; + WHEN 3 => + IF (arg3 /= "") THEN + print_str(file_ptr, tokn, arg3); + ELSE + EXIT; + END IF; + WHEN 4 => + IF (arg4 /= "") THEN + print_str(file_ptr, tokn, arg4); + ELSE + EXIT; + END IF; + WHEN 5 => + IF (arg5 /= "") THEN + print_str(file_ptr, tokn, arg5); + ELSE + EXIT; + END IF; + WHEN 6 => + IF (arg6 /= "") THEN + print_str(file_ptr, tokn, arg6); + ELSE + EXIT; + END IF; + WHEN 7 => + IF (arg7 /= "") THEN + print_str(file_ptr, tokn, arg7); + ELSE + EXIT; + END IF; + WHEN 8 => + IF (arg8 /= "") THEN + print_str(file_ptr, tokn, arg8); + ELSE + EXIT; + END IF; + WHEN 9 => + IF (arg9 /= "") THEN + print_str(file_ptr, tokn, arg9); + ELSE + EXIT; + END IF; + WHEN 10 => + IF (arg10 /= "") THEN + print_str(file_ptr, tokn, arg10); + ELSE + EXIT; + END IF; + WHEN 11 => -- should not happen + Assert false + Report "fprint -- ASCII_TEXT, arguments > 10 " + SEVERITY ERROR; + END CASE; + ArgNum := ArgNum + 1; + + ELSIF (ch /= '%') THEN -- printable characters + WRITE(file_ptr, ch); + END IF; + EXIT WHEN (index = format'LENGTH); + END LOOP; -- end of while true loop + + -- That's it + END fprint; + +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Print up to 10 arguments to a file according to +--| the specifications given by a format string. +--| +--| Parameters : +--| file_ptr - output TEXT, destination file +--| line_ptr - INOUT LINE, pointer to a string. +--| format - input STRING, format control specifications. +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : formated TEXT. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE file_ptr : OUT TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := "" ; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := "" ; + CONSTANT arg10 : IN STRING := "" + ) IS + VARIABLE arg : STRING(1 TO max_string_len); + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE index : INTEGER := 0; + VARIABLE ch : CHARACTER; + VARIABLE lookahead : CHARACTER; + VARIABLE tokn : STRING(1 TO max_token_len); + VARIABLE ArgNum : INTEGER RANGE 1 TO 11; + + BEGIN + -- check for null format string + IF (format'LENGTH = 0) THEN + assert false + report " fprint --- format string is null " + severity ERROR; + return; + END IF; + -- initialize index to 0 and ArgNum to 1 + index := 0; + ArgNum := 1; + WHILE (true) LOOP + index := index + 1; + ch := fmt(index); + + IF (index < format'LENGTH) THEN + lookahead := fmt(index+1); + ELSE + lookahead := ' '; + END IF; + + IF (( ch = '%') AND (lookahead = '%')) THEN + index := index + 1; -- print % character + WRITE(line_ptr, ch); + + ELSIF ((ch = '\') AND (lookahead ='n')) THEN -- new line + index := index + 1; + WRITELINE(file_ptr, line_ptr); + DEALLOCATE(line_ptr); + ELSIF (ch = '%') AND (lookahead /= '%') THEN + -- format %s expected + EXIT WHEN (ArgNum > 10); -- only first 10 argments will be printed + tokn := (OTHERS => ' '); -- fill token with blank space + get_token(fmt, index, tokn); + + -- select argument number 1 to 10 + Case ArgNum IS + WHEN 1 => IF (arg1 /= "") THEN + print_str(line_ptr, tokn, arg1); + ELSE + EXIT; + END IF; + + WHEN 2 => IF (arg2 /= "") THEN + print_str(line_ptr, tokn, arg2); + ELSE + EXIT; + END IF; + WHEN 3 => IF (arg3 /= "") THEN + print_str(line_ptr, tokn, arg3); + ELSE + EXIT; + END IF; + + WHEN 4 => IF (arg4 /= "") THEN + print_str(line_ptr, tokn, arg4); + ELSE + EXIT; + END IF; + + WHEN 5 => IF (arg5 /= "") THEN + print_str(line_ptr, tokn, arg5); + ELSE + EXIT; + END IF; + + WHEN 6 => IF (arg6 /= "") THEN + print_str(line_ptr, tokn, arg6); + ELSE + EXIT; + END IF; + + WHEN 7 => IF (arg7 /= "") THEN + print_str(line_ptr, tokn, arg7); + ELSE + EXIT; + END IF; + + WHEN 8 => IF (arg8 /= "") THEN + print_str(line_ptr, tokn, arg8); + ELSE + EXIT; + END IF; + + WHEN 9 => IF (arg9 /= "") THEN + print_str(line_ptr, tokn, arg9); + ELSE + EXIT; + END IF; + + WHEN 10 => IF (arg10 /= "") THEN + print_str(line_ptr, tokn, arg10); + ELSE + EXIT; + END IF; + + WHEN 11 => -- should not happen + Assert false + Report "fprint -- TEXT, arguments > 10 " + SEVERITY ERROR; + END CASE; + -- increment the argument number + ArgNum := ArgNum + 1; + + ELSIF (ch /= '%') THEN -- printable characters + WRITE(line_ptr, ch); + END IF; + EXIT WHEN (index = format'LENGTH); + END LOOP; -- end of while true loop + -- That's it + END fprint; +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.2 +--| Overloading : None +--| +--| Purpose : Print up to 10 arguments to a string buffer according to +--| the specifications given by a format string. +--| +--| Parameters : +--| string_buf - output STRING, +--| format - input STRING +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : STRING representation of arguments. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE string_buf : OUT STRING; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := ""; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := "" ; + CONSTANT arg10 : IN STRING := "" + ) IS + VARIABLE rbuf : STRING(1 TO string_buf'LENGTH); + VARIABLE arg : STRING(1 TO max_string_len); + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE index : INTEGER := 0; + VARIABLE buf_indx : INTEGER := 0; + VARIABLE ch : CHARACTER; + VARIABLE lookahead : CHARACTER; + VARIABLE tokn : STRING(1 TO max_token_len); + VARIABLE ArgNum : INTEGER RANGE 1 TO 11; + + BEGIN + -- check for null format string + IF (format'LENGTH = 0) THEN + assert false + report " fprint --- format string is null " + severity ERROR; + return; + END IF; + + index := 0; + ArgNum := 1; + WHILE (true) LOOP + index := index + 1; + buf_indx := buf_indx + 1; + ch := fmt(index); + + IF (index < format'LENGTH) THEN + lookahead := fmt(index+1); + ELSE + lookahead := ' '; + END IF; + + IF (( ch = '%') AND (lookahead = '%')) THEN + rbuf(buf_indx) := ch; + index := index + 1; -- print % character + + ELSIF ((ch = '\') AND (lookahead ='n')) THEN -- new line + ch := LF; + rbuf(buf_indx) := ch; + index := index + 1; + + ELSIF (ch = '%') AND (lookahead /= '%') THEN + -- format %s expected + EXIT WHEN (ArgNum > 10); -- only first 10 argments will be printed + tokn := (OTHERS => ' '); -- fill token with blank space + get_token(fmt, index, tokn); + + -- select argument number 1 to 10 + + Case ArgNum IS + WHEN 1 => + IF (arg1 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg1); + ELSE + EXIT; + END IF; + + WHEN 2 => + IF (arg2 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg2); + ELSE + EXIT; + END IF; + WHEN 3 => + IF (arg3 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg3); + ELSE + EXIT; + END IF; + WHEN 4 => + IF (arg4 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg4); + ELSE + EXIT; + END IF; + WHEN 5 => + IF (arg5 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg5); + ELSE + EXIT; + END IF; + WHEN 6 => + IF (arg6 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg6); + ELSE + EXIT; + END IF; + WHEN 7 => + IF (arg7 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg7); + ELSE + EXIT; + END IF; + WHEN 8 => + IF (arg8 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg8); + ELSE + EXIT; + END IF; + WHEN 9 => + IF (arg9 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg9); + ELSE + EXIT; + END IF; + WHEN 10 => + IF (arg10 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg10); + ELSE + EXIT; + END IF; + + WHEN 11 => -- should not happen + Assert false + Report "fprint -- String buffer, arguments > 10 " + SEVERITY ERROR; + END CASE; + -- increment the argument number + ArgNum := ArgNum + 1; + + ELSIF (ch /= '%') THEN -- printable characters + rbuf(buf_indx) := ch; + END IF; + EXIT WHEN ((index >= format'LENGTH) OR ( buf_indx >= string_buf'LENGTH)) ; + END LOOP; -- end of while true loop + + IF (buf_indx > string_buf'LENGTH) THEN + string_buf := rbuf; + ELSIF (buf_indx = string_buf'LENGTH) THEN + string_buf := rbuf; +-- If (rbuf(buf_indx) = ' ') THEN +-- string_buf(buf_indx) := NUL; +-- end if; + ELSE + string_buf(1 TO buf_indx) := rbuf(1 To buf_indx); + string_buf(buf_indx + 1) := NUL; + END IF; + + return; + -- That's it + END fprint; + +--+----------------------------------------------------------------------------- +--| Function Name : ffgetc +--| +--| Overloading : Text, ASCII_TEXT +--| +--| Purpose : to read the next character from a file +--| +--| +--| Parameters : result - output character -- returned char +--| eof - output BOOLEAN -- TRUE if end of file reached +--| stream - in ASCII_TEXT -- file +--| +--| Notes : returns with eof true if end of file is reached +--| +--|----------------------------------------------------------------------------- + + PROCEDURE ffgetc ( VARIABLE result : OUT CHARACTER; + VARIABLE eof : OUT BOOLEAN; + VARIABLE stream : IN ASCII_TEXT + ) IS + + VARIABLE end_file : BOOLEAN; + + BEGIN + end_file := ENDFILE(stream); + if (not end_file) then + READ(stream, result); + end if; + eof := end_file; + return; + END; + + +--+----------------------------------------------------------------------------- +--| Procedure Name : scan_for_match +--|.hidden +--| Overloading : TEXT and ASCII_TEXT +--| +--| Purpose : To scan file skipping over blank spaces and newline +--| characters until a non-whitespace character is found. +--| If that character matches match_char then mismatch is +--| return false otherwise its TRUE. +--| +--| handles all three END_OF_LINE_MARKERS (LF, CR, and CR & LF) +--| +--| Parameters : fptr : IN ASCII_TEXT +--| match_char : IN CHARACTER +--| eof : INOUT BOOLEAN +--| mismatch : OUT BOOLEAN +--| +--|----------------------------------------------------------------------------- + + + procedure scan_for_match ( VARIABLE fptr : IN ASCII_TEXT; + CONSTANT match_char : IN CHARACTER; + VARIABLE eof : INOUT BOOLEAN; + VARIABLE mismatch : OUT BOOLEAN ) is + + VARIABLE ch : CHARACTER; + VARIABLE cont : BOOLEAN; + + begin + if ( END_OF_LINE_MARKER = (LF, ' ') ) then + mismatch := FALSE; + ffgetc (ch, eof, fptr); + while ( (is_space(ch) or ( (ch = LF) and (match_char /= LF) ) ) and (not eof) ) loop + ffgetc (ch, eof, fptr); + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + elsif ( END_OF_LINE_MARKER = (CR, ' ') ) then + mismatch := FALSE; + ffgetc (ch, eof, fptr); + while ( (is_space(ch) or ( (ch = CR) and (match_char /= CR) ) ) and (not eof) ) loop + ffgetc (ch, eof, fptr); + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + else -- END_OF_LINE_MARKER = CR & LF + mismatch := FALSE; + cont := TRUE; + ffgetc (ch, eof, fptr); + while ( cont ) loop + while ( (is_space(ch) or ( ( (ch = CR) or (ch = LF) ) and (match_char /= CR) ) ) and (not eof) ) loop + ffgetc (ch, eof, fptr); + end loop; + CONT := FALSE; + if ( (match_char = CR) and (ch = CR) ) then + ffgetc(ch, eof, fptr); + cont := (ch /= LF); + if (not cont) then + return; + end if; + end if; + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + end if; + return; + end; + + +--+----------------------------------------------------------------------------- +--| Procedure Name : get_fw +--|.hidden +--| Overloading : NONE +--| +--| Purpose : get the field width from the format string +--| assumes index is pointing at first digit +--| will end with index pointing a forth character +--| or first non-digit, which ever comes first +--| +--| Parameters : fmt : IN STRING +--| index : INOUT INTEGER +--| +--| +--|----------------------------------------------------------------------------- + + procedure get_fw ( VARIABLE fmt : IN STRING; + VARIABLE index : INOUT INTEGER; + VARIABLE field_width : INOUT INTEGER ) is + + variable count : integer := 3; + variable fw : integer := 0; + + begin + while ( (count > 0) and is_digit(fmt(index)) ) loop + fw := (fw * 10) + (CHARACTER'POS(fmt(index)) - 48); + index := index + 1; + count := count - 1; + end loop; + field_width := fw; + return; + end; + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| 1.2.3 +--| Overloading : TEXT, ASCII_TEXT, string_buffer +--| +--| Purpose : To read text from a file according to specifications +--| given by the format string and save the results into +--| the corresponding arguments. +--| +--| Parameters : +--| file_ptr - input ASCII_TEXT, +--| format - input STRING, +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg19 - output STRING, +--| arg20 - output STRING +--| arg_count - input integer, -- # of arguments in calling procedure +--| +--| Result : STRING representation given ASCII_TEXT. +--| +--| Note: This procedure extracts upto twenty arguments +--| from a line in a file. +--| If a %s(or whatever) is used without a digit then a space +--| must the string in the file inorder for the next argument to +--| be read in or for a match with the next literal to occur properly +--| +--| NOTE that when there is a %t if a time unit follows in the format string +--| it is skipped over (i.e. not treated as a matching string). +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; -- hold format + VARIABLE index : INTEGER := 1; -- index into fmt + VARIABLE fmt_len : INTEGER; -- length of format + VARIABLE ch : CHARACTER; -- present character read from file + VARIABLE fchar : CHARACTER; -- present format character + VARIABLE look_ahead : CHARACTER; -- next format character + VARIABLE mismatch : BOOLEAN := FALSE; -- TRUE if mismatch between format literal + -- and file character + VARIABLE eof : BOOLEAN := FALSE; -- TRUE if end of file + VARIABLE field_width : integer; -- field width + VARIABLE string_type : CHARACTER; -- type of string specified by format + VARIABLE arg_num : INTEGER := 0; -- number of argument currently being read + VARIABLE arg : string(1 to MAX_STRING_LEN+1); -- used to temporarily hold argument + VARIABLE premature_end : BOOLEAN := FALSE; -- true if end of file reached prematurely + VARIABLE t_follow : string(1 to 5); -- checks for time_unit following %t + VARIABLE ii, jj : INTEGER; + + BEGIN + -- make return strings empty + arg1(arg1'left) := NUL; + arg2(arg2'left) := NUL; + arg3(arg3'left) := NUL; + arg4(arg4'left) := NUL; + arg5(arg5'left) := NUL; + arg6(arg6'left) := NUL; + arg7(arg7'left) := NUL; + arg8(arg8'left) := NUL; + arg9(arg9'left) := NUL; + arg10(arg10'left) := NUL; + arg11(arg11'left) := NUL; + arg12(arg12'left) := NUL; + arg13(arg13'left) := NUL; + arg14(arg14'left) := NUL; + arg15(arg15'left) := NUL; + arg16(arg16'left) := NUL; + arg17(arg17'left) := NUL; + arg18(arg18'left) := NUL; + arg19(arg19'left) := NUL; + arg20(arg20'left) := NUL; + + index := Find_NonBlank(fmt, index); + fmt_len := StrLen(fmt); + if ( index > fmt_len ) then + assert FALSE + report "fscan (ASCII_TEXT) -- empty format string." + severity ERROR; + return; + end if; + + eof := ENDFILE(file_ptr); + + while ( (not eof) and (index <= fmt_len) ) loop + + fchar := fmt(index); + look_ahead := NUL; + mismatch := FALSE; + if (index < fmt_len) then + look_ahead := fmt(index+1); + else + look_ahead := ' '; + end if; + + + if ( (fchar = '\') and (look_ahead = 'n') ) then -- \n + if ( END_OF_LINE_MARKER = (LF, ' ') ) then + scan_for_match (file_ptr, LF, eof, mismatch); + else + scan_for_match (file_ptr, CR, eof, mismatch); + end if; + index := index + 2; + elsif ( (fchar = '%') and (look_ahead = '%') ) then -- check for literal % + scan_for_match (file_ptr, '%', eof, mismatch); + index := index + 2; + elsif (fchar = '%') then + if (arg_num = arg_count) then + assert FALSE + report "fscan (ASCII_TEXT) -- number of format specifications exceed argument count" + severity ERROR; + return; + end if; + arg_num := arg_num + 1; + field_width := 0; + index := index + 1; + if (is_digit(look_ahead)) then + get_fw (fmt, index, field_width); + end if; + if (index <= fmt_len) then + string_type := fmt(index); + index := index + 1; + else + assert FALSE + report "fscan (ASCII_TEXT) -- error in format specification" + severity ERROR; + return; + end if; + + case string_type is + when 'c' => if (field_width = 0) then + field_width := 1; + end if; + ii := 1; + while (field_width > 0) loop + ffgetc(ch, eof, file_ptr); + exit when ( eof ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + end loop; + arg(ii) := NUL; + premature_end := ( eof and (ii = 1) ); + + when 'd' | 'f' | 's' | + 'o' | 'x' | 'X' | + 't' => -- skip over time unit if it follows %t + if ( string_type = 't') then + t_follow := (others => ' '); + ii := index; + jj := 2; + if ( (ii < fmt_len) and is_space(fmt(ii)) ) then + ii := ii + 1; + while ( (ii <= fmt_len) and (not is_space(fmt(ii))) and (jj <= 5) ) loop + t_follow(jj) := fmt(ii); + ii := ii + 1; + jj := jj + 1; + end loop; + if ( strcmp(t_follow, " fs ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ps ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ns ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " us ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ms ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " sec ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " min ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " hr ") = 0 ) then + index := index + 3; + end if; + end if; + end if; + if ( field_width = 0 ) then + field_width := MAX_STRING_LEN + 1; + end if; + ffgetc (ch, eof, file_ptr); -- skip over carrage return and line feed and spaces + while ( (is_space(ch) or (ch = LF) or (ch = CR) ) and (not eof) ) loop + ffgetc(ch, eof, file_ptr); + end loop; + ii := 1; + loop + exit when ( eof or is_space(ch) or (ch = LF) or (ch = CR) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, file_ptr); + end loop; + if ( (string_type = 't') and (not eof) and (field_width > 1) and (ch /= LF) and (ch /= CR) ) then + arg(ii) := ' '; + ii := ii + 1; + field_width := field_width - 1; + ffgetc(ch, eof, file_ptr); + loop + exit when ( eof or is_space(ch) or (ch = LF) or (ch = CR) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, file_ptr); + end loop; + end if; + arg(ii) := NUL; + premature_end := ( eof and (ii = 1) ); + + when others => assert FALSE + report "fscan (ASCII_TEXT) -- error in format specification" + severity ERROR; + return; + end case; + case arg_num is + when 1 => strcpy(arg1, arg); + when 2 => strcpy(arg2, arg); + when 3 => strcpy(arg3, arg); + when 4 => strcpy(arg4, arg); + when 5 => strcpy(arg5, arg); + when 6 => strcpy(arg6, arg); + when 7 => strcpy(arg7, arg); + when 8 => strcpy(arg8, arg); + when 9 => strcpy(arg9, arg); + when 10 => strcpy(arg10, arg); + when 11 => strcpy(arg11, arg); + when 12 => strcpy(arg12, arg); + when 13 => strcpy(arg13, arg); + when 14 => strcpy(arg14, arg); + when 15 => strcpy(arg15, arg); + when 16 => strcpy(arg16, arg); + when 17 => strcpy(arg17, arg); + when 18 => strcpy(arg18, arg); + when 19 => strcpy(arg19, arg); + when 20 => strcpy(arg20, arg); + when others => assert FALSE + report "fscan (ASCII_TEXT) -- internal error" + severity ERROR; + return; + end case; + else -- compare for literal + scan_for_match (file_ptr, fchar, eof, mismatch); + index := index + 1; + end if; + + if (mismatch) then + assert NOT WarningsOn + report "fscan (ASCII_TEXT) -- format string literal mismatch" + severity WARNING; + return; + end if; + + index := Find_NonBlank(fmt, index); + end loop; + + index := Find_NonBlank(fmt, index); + assert ( not (WarningsOn and ( (eof and (index <= fmt_len)) or premature_end) ) ) + report "fscan (ASCII TEXT) -- unexpected end of file" + severity WARNING; + + + END fscan; + + +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING ; + VARIABLE arg19 : OUT STRING + ) IS + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, + arg17, arg18, arg19, dummy_arg20, 19); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING + ) IS + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, + arg17, arg18, dummy_arg19, dummy_arg20, 18); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING + ) IS + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, + arg17, dummy_arg18, dummy_arg19, dummy_arg20, 17); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING + ) IS + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 16); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING + ) IS + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 15); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING + ) IS + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 14); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING + ) IS + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, + dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 13); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING + ) IS + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 12); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING + ) IS + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, dummy_arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 11); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING + + ) IS + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, dummy_arg11, dummy_arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 10); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ) IS + VARIABLE dummy_arg10 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, dummy_arg10, dummy_arg11, dummy_arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 9); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ) IS + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, dummy_arg9, dummy_arg10, dummy_arg11, dummy_arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 8); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ) IS + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + dummy_arg8, dummy_arg9, dummy_arg10, dummy_arg11, dummy_arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 7); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ) IS + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, + dummy_arg7, dummy_arg8, dummy_arg9, dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 6); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ) IS + VARIABLE dummy_arg6 : STRING(1 TO 10); + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, + dummy_arg6, dummy_arg7, dummy_arg8, dummy_arg9, dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 5); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ) IS + VARIABLE dummy_arg5 : STRING(1 TO 10); + VARIABLE dummy_arg6 : STRING(1 TO 10); + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, dummy_arg5, + dummy_arg6, dummy_arg7, dummy_arg8, dummy_arg9, dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 4); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ) IS + VARIABLE dummy_arg4 : STRING(1 TO 10); + VARIABLE dummy_arg5 : STRING(1 TO 10); + VARIABLE dummy_arg6 : STRING(1 TO 10); + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, dummy_arg4, dummy_arg5, + dummy_arg6, dummy_arg7, dummy_arg8, dummy_arg9, dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 3); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ) IS + VARIABLE dummy_arg3 : STRING(1 TO 10); + VARIABLE dummy_arg4 : STRING(1 TO 10); + VARIABLE dummy_arg5 : STRING(1 TO 10); + VARIABLE dummy_arg6 : STRING(1 TO 10); + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, dummy_arg3, dummy_arg4, + dummy_arg5,dummy_arg6,dummy_arg7,dummy_arg8,dummy_arg9,dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 2); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ) IS + VARIABLE dummy_arg2 : STRING(1 TO 10); + VARIABLE dummy_arg3 : STRING(1 TO 10); + VARIABLE dummy_arg4 : STRING(1 TO 10); + VARIABLE dummy_arg5 : STRING(1 TO 10); + VARIABLE dummy_arg6 : STRING(1 TO 10); + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, dummy_arg2, dummy_arg3, dummy_arg4, + dummy_arg5,dummy_arg6,dummy_arg7,dummy_arg8,dummy_arg9,dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 1); + return; + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : ffgetc +--| +--| Overloading : Text, ASCII_TEXT, string_buf +--| +--| Purpose : to read the next character from a file +--| +--| +--| Parameters : result - output character -- returned char +--| eof - output BOOLEAN -- TRUE if end of file reached +--| stream - in TEXT -- file +--| ptr - inout line -- line buffer +--| +--| +--| Result : next character from the specified file. +--| returns LF if the end of the line is reached. +--| return with eof true if end of file is reached +--| +--|----------------------------------------------------------------------------- + + PROCEDURE ffgetc ( VARIABLE result : OUT CHARACTER; + VARIABLE eof : OUT BOOLEAN; + VARIABLE stream : IN TEXT; + VARIABLE ptr : INOUT LINE + ) IS + + BEGIN + eof := FALSE; + if ( ptr = NULL) then + if ( not ENDFILE(stream) ) then + READLINE(stream, ptr); + read(ptr, result); + else + result := NUL; + eof := TRUE; + end if; + elsif ( ptr.all'LENGTH = 0 ) then -- vantage ENDLINE function does not compile + if ( not ENDFILE(stream) ) then + READLINE(stream, ptr); + result := LF; + else + result := NUL; + eof := TRUE; + end if; + else + read(ptr, result); + end if; + return; + END; + + +--+----------------------------------------------------------------------------- +--| Procedure Name : scan_for_match +--|.hidden +--| Overloading : TEXT and ASCII_TEXT and string_buf +--| +--| Purpose : To scan file skipping over blank spaces and newline +--| characters until a non-whitespace character is found. +--| If that character matches match_char then mismatch is +--| return false otherwise its TRUE. +--| +--| Parameters : fptr : IN TEXT +--| lptr : INOUT LINE +--| match_char : IN CHARACTER +--| eof : INOUT BOOLEAN +--| mismatch : OUT BOOLEAN +--| +--|----------------------------------------------------------------------------- + + + procedure scan_for_match ( VARIABLE fptr : IN TEXT; + VARIABLE lptr : INOUT LINE; + CONSTANT match_char : IN CHARACTER; + VARIABLE eof : INOUT BOOLEAN; + VARIABLE mismatch : OUT BOOLEAN ) is + + VARIABLE ch : CHARACTER; + + begin + mismatch := FALSE; + ffgetc (ch, eof, fptr, lptr); + while ( (is_space(ch) or ( (ch = LF) and (match_char /= LF) ) ) and (not eof) ) loop + ffgetc (ch, eof, fptr, lptr); + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + return; + end; + + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| 1.2.3 +--| Overloading : None +--| +--| Purpose : To read text from a file according to specifications +--| given by the format string and save the results into +--| the corresponding arguments. +--| +--| Parameters : +--| file_ptr - input TEXT, +--| line_ptr - input_output LINE, +--| format - input STRING, +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg19 - output STRING, +--| arg20 - output STRING +--| arg_count - input integer, -- # of arguments in calling procedure +--| +--| Result : STRING representation given TEXT. +--| +--| Note: This procedure extracts upto twenty arguments +--| from a line in a file. +--| If a %s(or whatever) is used without a digit then a space +--| must the string in the file inorder for the next argument to +--| be read in or for a match with the next literal to occur properly +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; -- hold format + VARIABLE index : INTEGER := 1; -- index into fmt + VARIABLE fmt_len : INTEGER; -- length of format + VARIABLE ch : CHARACTER; -- present character read from file + VARIABLE fchar : CHARACTER; -- present format character + VARIABLE look_ahead : CHARACTER; -- next format character + VARIABLE mismatch : BOOLEAN := FALSE; -- TRUE if mismatch between format literal + -- and file character + VARIABLE eof : BOOLEAN := FALSE; -- TRUE if end of file + VARIABLE field_width : integer; -- field width + VARIABLE string_type : CHARACTER; -- type of string specified by format + VARIABLE arg_num : INTEGER := 0; -- number of argument currently being read + VARIABLE arg : string(1 to MAX_STRING_LEN+1); -- used to temporarily hold argument + VARIABLE premature_end : BOOLEAN := FALSE; -- true if end of file reached prematurely + VARIABLE t_follow : string(1 to 5); -- used to check for time unit following %t + VARIABLE ii, jj : INTEGER; + + BEGIN + -- make return strings empty + arg1(arg1'left) := NUL; + arg2(arg2'left) := NUL; + arg3(arg3'left) := NUL; + arg4(arg4'left) := NUL; + arg5(arg5'left) := NUL; + arg6(arg6'left) := NUL; + arg7(arg7'left) := NUL; + arg8(arg8'left) := NUL; + arg9(arg9'left) := NUL; + arg10(arg10'left) := NUL; + arg11(arg11'left) := NUL; + arg12(arg12'left) := NUL; + arg13(arg13'left) := NUL; + arg14(arg14'left) := NUL; + arg15(arg15'left) := NUL; + arg16(arg16'left) := NUL; + arg17(arg17'left) := NUL; + arg18(arg18'left) := NUL; + arg19(arg19'left) := NUL; + arg20(arg20'left) := NUL; + + index := Find_NonBlank(fmt, index); + fmt_len := StrLen(fmt); + if ( index > fmt_len ) then + assert FALSE + report "fscan (TEXT) -- empty format string." + severity ERROR; + return; + end if; + + eof := ENDFILE(file_ptr) and ( (line_ptr = NULL) or (line_ptr.all'LENGTH = 0) ); -- vantage ENDLINE function does not compile + + while ( (not eof) and (index <= fmt_len) ) loop + + fchar := fmt(index); + look_ahead := NUL; + mismatch := FALSE; + if (index < fmt_len) then + look_ahead := fmt(index+1); + else + look_ahead := ' '; + end if; + + + if ( (fchar = '\') and (look_ahead = 'n') ) then -- \n + scan_for_match (file_ptr, line_ptr, LF, eof, mismatch); + index := index + 2; + elsif ( (fchar = '%') and (look_ahead = '%') ) then -- check for literal % + scan_for_match (file_ptr, line_ptr, '%', eof, mismatch); + index := index + 2; + elsif (fchar = '%') then + if (arg_num = arg_count) then + assert FALSE + report "fscan (TEXT) -- number of format specifications exceed argument count" + severity ERROR; + return; + end if; + arg_num := arg_num + 1; + field_width := 0; + index := index + 1; + if (is_digit(look_ahead)) then + get_fw (fmt, index, field_width); + end if; + if (index <= fmt_len) then + string_type := fmt(index); + index := index + 1; + else + assert FALSE + report "fscan (TEXT) -- error in format specification" + severity ERROR; + return; + end if; + + case string_type is + when 'c' => if (field_width = 0) then + field_width := 1; + end if; + ii := 1; + while (field_width > 0) loop + ffgetc(ch, eof, file_ptr, line_ptr); + exit when ( eof ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + end loop; + arg(ii) := NUL; + premature_end := ( eof and (ii = 1) ); + + when 'd' | 'f' | 's' | + 'o' | 'x' | 'X' | + 't' => -- skip over time unit if it follows %t + if ( string_type = 't') then + t_follow := (others => ' '); + ii := index; + jj := 2; + if ( (ii < fmt_len) and is_space(fmt(ii)) ) then + ii := ii + 1; + while ( (ii <= fmt_len) and (not is_space(fmt(ii))) and (jj <= 5) ) loop + t_follow(jj) := fmt(ii); + ii := ii + 1; + jj := jj + 1; + end loop; + if ( strcmp(t_follow, " fs ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ps ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ns ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " us ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ms ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " sec ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " min ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " hr ") = 0 ) then + index := index + 3; + end if; + end if; + end if; + if ( field_width = 0 ) then + field_width := MAX_STRING_LEN + 1; + end if; + ffgetc (ch, eof, file_ptr, line_ptr); + while ( (is_space(ch) or (ch = LF) ) and (not eof) ) loop + ffgetc(ch, eof, file_ptr, line_ptr); + end loop; + ii := 1; + loop + exit when ( eof or is_space(ch) or (ch = LF) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, file_ptr, line_ptr); + end loop; + if ( (string_type = 't') and (not eof) and (field_width > 1) and (ch /= LF) ) then + arg(ii) := ' '; + ii := ii + 1; + field_width := field_width - 1; + ffgetc(ch, eof, file_ptr, line_ptr); + loop + exit when ( eof or is_space(ch) or (ch = LF) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, file_ptr, line_ptr); + end loop; + end if; + arg(ii) := NUL; + premature_end := ( eof and (ii = 1) ); + + when others => assert FALSE + report "fscan (TEXT) -- error in format specification" + severity ERROR; + return; + end case; + case arg_num is + when 1 => strcpy(arg1, arg); + when 2 => strcpy(arg2, arg); + when 3 => strcpy(arg3, arg); + when 4 => strcpy(arg4, arg); + when 5 => strcpy(arg5, arg); + when 6 => strcpy(arg6, arg); + when 7 => strcpy(arg7, arg); + when 8 => strcpy(arg8, arg); + when 9 => strcpy(arg9, arg); + when 10 => strcpy(arg10, arg); + when 11 => strcpy(arg11, arg); + when 12 => strcpy(arg12, arg); + when 13 => strcpy(arg13, arg); + when 14 => strcpy(arg14, arg); + when 15 => strcpy(arg15, arg); + when 16 => strcpy(arg16, arg); + when 17 => strcpy(arg17, arg); + when 18 => strcpy(arg18, arg); + when 19 => strcpy(arg19, arg); + when 20 => strcpy(arg20, arg); + when others => assert FALSE + report "fscan (TEXT) -- internal error" + severity ERROR; + return; + end case; + else -- compare for literal + scan_for_match (file_ptr, line_ptr, fchar, eof, mismatch); + index := index + 1; + end if; + + if (mismatch) then + assert NOT WarningsOn + report "fscan (TEXT) -- format string literal mismatch" + severity WARNING; + return; + end if; + + index := Find_NonBlank(fmt, index); + end loop; + + index := Find_NonBlank(fmt, index); + assert ( not (WarningsOn and ( (eof and (index <= fmt_len)) or premature_end) ) ) + report "fscan (TEXT) -- unexpected end of file" + severity WARNING; + + END fscan; + +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING ; + VARIABLE arg19 : OUT STRING + ) IS + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, arg18, + arg19, dumy_arg20, 19); + return; + END fscan; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING + ) IS + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, arg18, + dumy_arg19, dumy_arg20, 18); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING + ) IS + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, dumy_arg18, + dumy_arg19, dumy_arg20, 17); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING + ) IS + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, dumy_arg17, dumy_arg18, + dumy_arg19, dumy_arg20, 16); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING + ) IS + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, dumy_arg16, dumy_arg17, + dumy_arg18, dumy_arg19, dumy_arg20, 15); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING + ) IS + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 14); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING + ) IS + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 13); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING + ) IS + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 12); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING + ) IS + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, dumy_arg12, + dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 11); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING + ) IS + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 10); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ) IS + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 9); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ) IS + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, dumy_arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 8); + return; + END; +--|--------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ) IS + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, dumy_arg8, dumy_arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 7); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ) IS + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 6); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ) IS + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 5); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ) IS + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 4); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ) IS + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 3); + return; + END; + + + +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ) IS + VARIABLE dumy_arg3 : STRING(1 TO 10); + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, dumy_arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 2); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ) IS + VARIABLE dumy_arg2 : STRING(1 TO 10); + VARIABLE dumy_arg3 : STRING(1 TO 10); + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, dumy_arg2, dumy_arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 1); + return; + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : ffgetc +--| +--| Overloading : Text, ASCII_TEXT, string_buf +--| +--| Purpose : to read the next character from a file +--| +--| +--| Parameters : result - output character -- returned char +--| eof - output BOOLEAN -- TRUE if end of file reached +--| stream - in string -- file +--| ptr - inout INTEGER -- index into string buf +--| +--| Notes : returns with eof true if end of string is reached +--| : assumes a string starting at an index of 1 +--| +--|----------------------------------------------------------------------------- + + PROCEDURE ffgetc ( VARIABLE result : OUT CHARACTER; + VARIABLE eof : OUT BOOLEAN; + VARIABLE stream : IN STRING; + VARIABLE ptr : INOUT INTEGER + ) IS + + VARIABLE end_file : BOOLEAN; -- refers to end of string + + BEGIN + end_file := ( (ptr > stream'LENGTH) or (stream(ptr) = NUL) ); + if (not end_file) then + result := stream(ptr); + ptr := ptr + 1; + end if; + eof := end_file; + return; + END; + + +--+----------------------------------------------------------------------------- +--| Procedure Name : scan_for_match +--|.hidden +--| Overloading : TEXT and ASCII_TEXT and string_buf +--| +--| Purpose : To scan file skipping over blank spaces and newline +--| characters until a non-whitespace character is found. +--| If that character matches match_char then mismatch is +--| return false otherwise its TRUE. +--| +--| handles all three END_OF_LINE_MARKERS (LF, CR, and CR & LF) +--| +--| Parameters : str : IN STRING +--| ptr : INOUT INTEGER +--| match_char : IN CHARACTER +--| eof : INOUT BOOLEAN +--| mismatch : OUT BOOLEAN +--| +--|----------------------------------------------------------------------------- + + + procedure scan_for_match ( VARIABLE str : IN STRING; + VARIABLE ptr : INOUT INTEGER; + CONSTANT match_char : IN CHARACTER; + VARIABLE eof : INOUT BOOLEAN; + VARIABLE mismatch : OUT BOOLEAN ) is + + VARIABLE ch : CHARACTER; + VARIABLE cont : BOOLEAN; + + begin + if ( END_OF_LINE_MARKER = (LF, ' ') ) then + mismatch := FALSE; + ffgetc (ch, eof, str, ptr); + while ( (is_space(ch) or ( (ch = LF) and (match_char /= LF) ) ) and (not eof) ) loop + ffgetc (ch, eof, str, ptr); + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + elsif ( END_OF_LINE_MARKER = (CR, ' ') ) then + mismatch := FALSE; + ffgetc (ch, eof, str, ptr); + while ( (is_space(ch) or ( (ch = CR) and (match_char /= CR) ) ) and (not eof) ) loop + ffgetc (ch, eof, str, ptr); + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + else -- END_OF_LINE_MARKER = CR & LF + mismatch := FALSE; + cont := TRUE; + ffgetc (ch, eof, str, ptr); + while ( cont ) loop + while ( (is_space(ch) or ( ( (ch = CR) or (ch = LF) ) and (match_char /= CR) ) ) and (not eof) ) loop + ffgetc (ch, eof, str, ptr); + end loop; + CONT := FALSE; + if ( (match_char = CR) and (ch = CR) ) then + ffgetc(ch, eof, str, ptr); + cont := (ch /= LF); + if (not cont) then + return; + end if; + end if; + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + end if; + return; + end; + + + + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| 1.2.4 +--| Overloading : TEXT, ASCII_TEXT, and string_buf +--| +--| Purpose : To read text from a string buffer according to +--| specifications given by a format string and save +--| the result into corresponding arguments. +--| +--| Parameters : +--| string_buf - input string, +--| format - input STRING, +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg91 - output STRING, +--| arg20 - output STRING, +--| arg_count - input INTEGER - number of argumetns passed to fscan +--| +--| Result : STRING representation given TEXT. +--| +--| Note: This procedure extracts upto twenty arguments +--| from a string buffer. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ) IS + VARIABLE str_buffer : STRING(1 TO string_buf'LENGTH) := string_buf; -- hold string buffer + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; -- hold format + VARIABLE index : INTEGER := 1; -- index into fmt + VARIABLE str_indx : INTEGER := 1; -- index into str_buffer + VARIABLE fmt_len : INTEGER; -- length of format + VARIABLE ch : CHARACTER; -- present character read from string buffer + VARIABLE fchar : CHARACTER; -- present format character + VARIABLE look_ahead : CHARACTER; -- next format character + VARIABLE mismatch : BOOLEAN := FALSE; -- TRUE if mismatch between format literal + -- and string buffer character + VARIABLE eof : BOOLEAN := FALSE; -- TRUE if end of string buffer + VARIABLE field_width : integer; -- field width + VARIABLE string_type : CHARACTER; -- type of string specified by format + VARIABLE arg_num : INTEGER := 0; -- number of argument currently being read + VARIABLE arg : string(1 to MAX_STRING_LEN+1); -- used to temporarily hold argument + VARIABLE premature_end : BOOLEAN := FALSE; -- true if end of string buffer reached prematurely + VARIABLE t_follow : string(1 to 5); -- used to check for time unit following %t + VARIABLE ii, jj : INTEGER; + + BEGIN + -- make return strings empty + arg1(arg1'left) := NUL; + arg2(arg2'left) := NUL; + arg3(arg3'left) := NUL; + arg4(arg4'left) := NUL; + arg5(arg5'left) := NUL; + arg6(arg6'left) := NUL; + arg7(arg7'left) := NUL; + arg8(arg8'left) := NUL; + arg9(arg9'left) := NUL; + arg10(arg10'left) := NUL; + arg11(arg11'left) := NUL; + arg12(arg12'left) := NUL; + arg13(arg13'left) := NUL; + arg14(arg14'left) := NUL; + arg15(arg15'left) := NUL; + arg16(arg16'left) := NUL; + arg17(arg17'left) := NUL; + arg18(arg18'left) := NUL; + arg19(arg19'left) := NUL; + arg20(arg20'left) := NUL; + + index := Find_NonBlank(fmt, index); + fmt_len := StrLen(fmt); + if ( index > fmt_len ) then + assert FALSE + report "fscan (String Buffer) -- empty format string." + severity ERROR; + return; + end if; + + eof := ( (str_indx > str_buffer'length) or (str_buffer(str_indx) = NUL) ); + + while ( (not eof) and (index <= fmt_len) ) loop + + fchar := fmt(index); + look_ahead := NUL; + mismatch := FALSE; + if (index < fmt_len) then + look_ahead := fmt(index+1); + else + look_ahead := ' '; + end if; + + + if ( (fchar = '\') and (look_ahead = 'n') ) then -- \n + if ( END_OF_LINE_MARKER = (LF, ' ') ) then + scan_for_match (str_buffer, str_indx, LF, eof, mismatch); + else + scan_for_match (str_buffer, str_indx, CR, eof, mismatch); + end if; + index := index + 2; + elsif ( (fchar = '%') and (look_ahead = '%') ) then -- check for literal % + scan_for_match (str_buffer, str_indx, '%', eof, mismatch); + index := index + 2; + elsif (fchar = '%') then + if (arg_num = arg_count) then + assert FALSE + report "fscan (String Buffer) -- number of format specifications exceed argument count" + severity ERROR; + return; + end if; + arg_num := arg_num + 1; + field_width := 0; + index := index + 1; + if (is_digit(look_ahead)) then + get_fw (fmt, index, field_width); + end if; + if (index <= fmt_len) then + string_type := fmt(index); + index := index + 1; + else + assert FALSE + report "fscan (String Buffer) -- error in format specification" + severity ERROR; + return; + end if; + + case string_type is + when 'c' => if (field_width = 0) then + field_width := 1; + end if; + ii := 1; + while (field_width > 0) loop + ffgetc(ch, eof, str_buffer, str_indx); + exit when ( eof ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + end loop; + arg(ii) := NUL; + premature_end := (eof and (ii = 1) ); + + when 'd' | 'f' | 's' | + 'o' | 'x' | 'X' | + 't' => -- skip over time unit if it follows %t + if ( string_type = 't') then + t_follow := (others => ' '); + ii := index; + jj := 2; + if ( (ii < fmt_len) and is_space(fmt(ii)) ) then + ii := ii + 1; + while ( (ii <= fmt_len) and (not is_space(fmt(ii))) and (jj <= 5) ) loop + t_follow(jj) := fmt(ii); + ii := ii + 1; + jj := jj + 1; + end loop; + if ( strcmp(t_follow, " fs ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ps ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ns ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " us ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ms ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " sec ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " min ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " hr ") = 0 ) then + index := index + 3; + end if; + end if; + end if; + if ( field_width = 0 ) then + field_width := MAX_STRING_LEN + 1; + end if; + ffgetc (ch, eof, str_buffer, str_indx); -- skip over carrage return and line feed and spaces + while ( (is_space(ch) or (ch = LF) or (ch = CR) ) and (not eof) ) loop + ffgetc(ch, eof, str_buffer, str_indx); + end loop; + ii := 1; + loop + exit when ( eof or is_space(ch) or (ch = LF) or (ch = CR) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, str_buffer, str_indx); + end loop; + if ( (string_type = 't') and (not eof) and (field_width > 1) and (ch /= LF) and (ch /= CR) ) then + arg(ii) := ' '; + ii := ii + 1; + field_width := field_width - 1; + ffgetc(ch, eof, str_buffer, str_indx); + loop + exit when ( eof or is_space(ch) or (ch = LF) or (ch = CR) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, str_buffer, str_indx); + end loop; + end if; + arg(ii) := NUL; + premature_end := ( eof and (ii = 1) ); + + when others => assert FALSE + report "fscan (String Buffer) -- error in format specification" + severity ERROR; + return; + end case; + case arg_num is + when 1 => strcpy(arg1, arg); + when 2 => strcpy(arg2, arg); + when 3 => strcpy(arg3, arg); + when 4 => strcpy(arg4, arg); + when 5 => strcpy(arg5, arg); + when 6 => strcpy(arg6, arg); + when 7 => strcpy(arg7, arg); + when 8 => strcpy(arg8, arg); + when 9 => strcpy(arg9, arg); + when 10 => strcpy(arg10, arg); + when 11 => strcpy(arg11, arg); + when 12 => strcpy(arg12, arg); + when 13 => strcpy(arg13, arg); + when 14 => strcpy(arg14, arg); + when 15 => strcpy(arg15, arg); + when 16 => strcpy(arg16, arg); + when 17 => strcpy(arg17, arg); + when 18 => strcpy(arg18, arg); + when 19 => strcpy(arg19, arg); + when 20 => strcpy(arg20, arg); + when others => assert FALSE + report "fscan (String Buffer) -- internal error" + severity ERROR; + return; + end case; + else -- compare for literal + scan_for_match (str_buffer, str_indx, fchar, eof, mismatch); + index := index + 1; + end if; + + if (mismatch) then + assert NOT WarningsOn + report "fscan (String Buffer) -- format string literal mismatch" + severity WARNING; + return; + end if; + + index := Find_NonBlank(fmt, index); + end loop; + + index := Find_NonBlank(fmt, index); + assert ( not (WarningsOn and ( (eof and (index <= fmt_len)) or premature_end) ) ) + report "fscan (String BUffer) -- unexpected end of string" + severity WARNING; + + END fscan; + + +--|--------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING ; + VARIABLE arg19 : OUT STRING + ) IS + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, arg18, + arg19, dumy_arg20, 19); + return; + END; +--|--------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING + ) IS + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, arg18, + dumy_arg19, dumy_arg20, 18); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING + ) IS + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, dumy_arg18, + dumy_arg19, dumy_arg20, 17); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING + ) IS + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, dumy_arg17, dumy_arg18, + dumy_arg19, dumy_arg20, 16); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING + ) IS + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, dumy_arg16, dumy_arg17, + dumy_arg18, dumy_arg19, dumy_arg20, 15); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING + ) IS + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 14); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING + ) IS + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 13); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING + ) IS + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 12); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING + ) IS + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, dumy_arg12, + dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 11); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING + ) IS + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 10); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ) IS + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 9); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ) IS + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, dumy_arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 8); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ) IS + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, dumy_arg8, dumy_arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 7); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ) IS + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 6); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ) IS + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 5); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ) IS + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 4); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ) IS + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 3); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ) IS + VARIABLE dumy_arg3 : STRING(1 TO 10); + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, dumy_arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 2); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ) IS + VARIABLE dumy_arg2 : STRING(1 TO 10); + VARIABLE dumy_arg3 : STRING(1 TO 10); + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, dumy_arg2, dumy_arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 1); + return; + END; + +--+---------------------------------------------------------------------------- +--| Function Name : fgetc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read the next character from a file of type +--| ASCII_TEXT. +--| +--| Parameters : +--| stream - input ASCII_TEXT, +--| +--| Result : Returns the ordinate value of the character read. If +--| end of file is reached then return - 1 +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE n : Integer; +--| FILE f_in : ASCII_TEXT IS IN "design.doc"; +--| +--| fgetc(n, f_in); +--| +--| Will return ordinal value of character in integer n +--|----------------------------------------------------------------------------- + PROCEDURE fgetc ( VARIABLE result : OUT INTEGER; + VARIABLE stream : IN ASCII_TEXT + ) IS + VARIABLE ch : CHARACTER; + BEGIN + IF ( NOT ENDFILE(stream)) THEN + READ(stream, ch); + result := CHARACTER'POS(ch); + ELSE + result := -1; -- end of file + END IF; + return; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fgetc +--| +--| Overloading : None +--| +--| Purpose : To read the next character from a file of type TEXT. +--| +--| Parameters : +--| stream - input TEXT, +--| ptr - INOUT, LINE +--| Result :Integer, the ordinate value of the character being read. +--| -1 when end of file (EOF). +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| +--| USE: : +--| VARIABLE n : Integer; +--| FILE f_in : TEXT IS IN "design.doc"; +--| +--| fgetc(n, f_in); +--| +--| Will return ordinal value of character in integer n +--| +--| Problems : When reading last line of file, if it is terminated with +--| an end of line marker then when the end of the last line is +--| reached the final eol will not be returned (instead -1 will be +--| returned). +--| +--|----------------------------------------------------------------------------- + PROCEDURE fgetc ( VARIABLE result : OUT INTEGER; + VARIABLE stream : IN TEXT; + VARIABLE ptr : INOUT LINE + ) IS + VARIABLE ch : character; + + BEGIN + if ( (ptr /= NULL) and (ptr'LENGTH /= 0) ) then + READ(ptr, ch); + result := CHARACTER'POS(ch); + elsif ( not ENDFILE(stream) ) then + if ( ptr /= NULL) then -- ptr'length = 0 + READLINE(stream, ptr); + result := 10; -- ascii code for LF (line feed) + else -- ptr = null (this should mean its at the beginning of the file) + READLINE(stream, ptr); + READ(ptr, ch); + result := CHARACTER'POS(ch); + end if; + else + result := -1; -- end of file + end if; + return; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fgets +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read, at most, the next n characters from a file +--| of type ASCII_TEXT and save them to a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| +--| n -- input, Natural, number of +--| characters to be read. +--| stream -- input, ASCII_TEXT, input file. +--| +--| result : string +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 100); +--| FILE f_in : ASCII_TEXT IS IN "design.doc"; +--| +--| fgets(str_buf, 50, f_in); +--| +--| Will read in at most 50 characters from the file +--| design.doc and place them in str_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgets ( VARIABLE l_str : OUT STRING; + CONSTANT n : IN NATURAL; + VARIABLE stream : IN ASCII_TEXT + ) IS + VARIABLE ch : CHARACTER; + VARIABLE lstr_cpy : STRING(1 TO n); + VARIABLE index : NATURAL := 0; + BEGIN + IF (n=0) THEN + if (l_str'LENGTH > 0 ) then + l_str(l_str'LEFT) := NUL; + end if; + return; + ELSE + assert ( not (WarningsON and ENDFILE(stream)) ) + report "fgets (ASCII_TEXT) -- attempt to read past end of file" + severity WARNING; + + while ( NOT ENDFILE(stream) ) LOOP + READ(stream, ch); + index := index + 1; + lstr_cpy(index) := ch; + EXIT when ((index >= n) OR (ch = END_OF_LINE_MARKER(1))); + END LOOP; + END IF; + + -- determine the length of string and place charcaters + IF (l_str'LENGTH <= n) THEN + l_str := lstr_cpy(1 TO l_str'LENGTH); + ELSE + l_str(1 TO n) := lstr_cpy; + l_str(n+1) := NUL; + END IF; + + RETURN; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fgets +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read, at most, the next n characters from a file +--| of type TEXT and save them to a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| n -- input, Natural, number of +--| characters to be read. +--| stream -- input, TEXT, input file. +--| line_ptr -- inout LINE, +--| +--| result : string +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 100); +--| FILE f_in : TEXT IS IN "design.doc"; +--| +--| fgets(str_buf, 50, f_in); +--| +--| Will read in at most 50 characters from the file +--| design.doc and place them in str_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgets ( VARIABLE l_str : OUT STRING; + CONSTANT n : IN NATURAL; + VARIABLE stream : IN TEXT; + VARIABLE line_ptr : INOUT LINE + ) IS + + VARIABLE ch : character; + VARIABLE str : STRING( 1 TO n+1); + VARIABLE counter : integer := 0; + + BEGIN + -- + if ( (line_ptr = NULL) or (line_ptr'LENGTH = 0) ) then + if (ENDFILE(stream)) then + assert (not WarningsON) + report "fgets (text) -- attempt to read past end of file" + severity WARNING; + str(1) := NUL; + strcpy(l_str, str); + return; + else + READLINE(stream, line_ptr); + end if; + end if; + for i IN 1 to n loop + exit when ( (line_ptr = NULL) or (line_ptr'LENGTH = 0) ); + READ(line_ptr, ch); + str(i) := ch; + counter := counter + 1; + end loop; + str(counter + 1) := NUL; + strcpy(l_str, str); + RETURN; + END; + +--+--------------------------------------------------------------------------- +--| Function Name : fgetline +--| +--| Overloading : None +--| +--| Purpose : To read a line from the input ASCII_TEXT file and +--| save into a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| stream -- input, ASCII_TEXT, input file +--| +--| result : string. +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE line_buf : string(1 TO 256); +--| FILE in_file : ASCII_TEXT IS IN "file_ascii_in.dat"; +--| +--| fgetline(line_buf, in_file); +--| +--| Will read a line from the file +--| file_ascii_in.dat and place into line_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgetline ( VARIABLE l_str : OUT STRING; + VARIABLE stream : IN ASCII_TEXT + ) IS + VARIABLE ch : character := ' '; + VARIABLE indx : integer := 0; + VARIABLE str_copy : STRING(1 TO max_string_len); + BEGIN + -- + IF ENDFILE(stream) THEN + assert Not WarningsOn + report " fgetline (ASCII_TEXT) --- end of file, nothing to read." + severity WARNING; + if (l_str'LENGTH > 0 ) then + l_str(l_str'LEFT) := NUL; + end if; + return; + ELSE + while ( (not ENDFILE(stream)) and (ch /= END_OF_LINE_MARKER(1)) ) loop + READ(stream, ch); + indx := indx + 1; + str_copy(indx) := ch; + end loop; + -- determine the length and place characters + IF (l_str'LENGTH <= indx) THEN + l_str := str_copy(1 TO l_str'LENGTH); + ELSE + l_str(1 TO indx) := str_copy(1 TO indx); + l_str(indx+1) := NUL; + END IF; + RETURN; + END IF; + + END; + +--+--------------------------------------------------------------------------- +--| Function Name : fgetline +--| +--| Overloading : None +--| +--| Purpose : To read a line from the input TEXT file and +--| save into a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| stream -- input, TEXT, input file +--| +--| result : string. +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| USE: : +--| VARIABLE line_buf : string(1 TO 256); +--| FILE in_file : TEXT IS IN "file_text_in.dat"; +--| +--| fgetline(line_buf, in_file); +--| +--| Will read a line from the file +--| file_text_in.dat and place into line_buf. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fgetline ( VARIABLE l_str : OUT STRING; + VARIABLE stream : IN TEXT; + VARIABLE line_ptr : INOUT LINE + ) IS + VARIABLE str_copy : STRING(1 TO max_string_len + 1); + VARIABLE ch : character; + VARIABLE indx : NATURAL := 0; + BEGIN + If ( (line_ptr /= NULL) and (line_ptr'LENGTH > 0) ) then + NULL; + elsif ( not ENDFILE(stream) ) then + READLINE(stream, line_ptr); + else + assert NOT WarningsOn + report " fgetline (TEXT) --- end of file, nothing to read." + severity WARNING; + l_str(l_str'left) := NUL; + return; + end if; + while ( (line_ptr /= NULL) and (line_ptr'length /= 0) ) loop + READ(line_ptr,ch); + indx := indx + 1; + str_copy(indx) := ch; + end loop; + str_copy(indx + 1) := NUL; + strcpy(l_str, str_copy); + return; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fputc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose :To write a character to an ASCII_TEXT file. +--| +--| Parameters : +--| c -- input, CHARACTER, +--| stream -- output ASCII_TEXT, +--| +--| Result : +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| This procedure is equivalent to VHDL WRITE(stream, c). +--| +--| USE: : +--| VARIABLE str12 : string(1 TO 12); +--| FILE out_file : ASCII_TEXT IS OUT "file_ascii_out.dat"; +--| +--| str12 := "0123456789ab"; +--| FOR i IN 1 TO 12 LOOP +--| fputc(str12(i), out_file); +--| END LOOP; +--| +--| Will write all the 12 characters to file +--| file_ascii_out.dat +--|----------------------------------------------------------------------------- + PROCEDURE fputc ( CONSTANT c : IN CHARACTER; + VARIABLE stream : OUT ASCII_TEXT + ) IS + BEGIN + WRITE(stream, c); -- built_in write + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fputc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a character to a TEXT file. +--| +--| Parameters : +--| c -- input, CHARACTER, +--| stream -- output, TEXT, +--| line_ptr -- INOUT LINE +--| +--| Result : +--| +--| Note: : The STD TEXTIO package has declared TEXT as a +--| file of STRING. This is not same as file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str12 : string(1 TO 12); +--| VARIABLE l : LINE; +--| FILE out_file : TEXT IS OUT "file_text_out.dat"; +--| +--| str12 := "0123456789ab"; +--| FOR i IN 1 TO 12 LOOP +--| fputc(str12(i), out_file, l); +--| END LOOP; +--| fputc(LF, out_file, l); -- line feed +--| +--| Will write contents of the str12 to file +--| file_text_out.dat. The characters will be kept in +--| the line pointer l untill line feed character is +--| encouneterd. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputc ( CONSTANT c : IN character; + VARIABLE stream : OUT TEXT; + VARIABLE line_ptr : INOUT LINE + ) IS + + BEGIN + if ( (c = LF) or (c = CR) ) THEN + WRITELINE(stream, line_ptr); + DEALLOCATE(line_ptr); + else + write(line_ptr, c); + END IF; + RETURN; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fputs +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a string to an ASCII_ TEXT file. +--| +--| Parameters : +--| l_str -- input, string +--| stream -- output, ASCII_TEXT, +--| +--| Result : +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 256); +--| FILE out_file : ASCII_TEXT IS OUT "file_ascii_out.dat"; +--| +--| fputs(str_buf, out_file); +--| +--| Will write contents of str_buf to the file +--| file_ascii_out.dat +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputs ( CONSTANT l_str : IN STRING; + VARIABLE stream : OUT ASCII_TEXT + ) IS + VARIABLE str_copy : String (1 TO l_str'LENGTH) := l_str; + VARIABLE ch : character; + BEGIN + FOR i IN 1 TO l_str'LENGTH LOOP + ch := str_copy(i); + exit when (ch = NUL); + write (stream, ch); + END LOOP; + + write (stream, END_OF_LINE_MARKER(1)); + return; + + END fputs; + +--+----------------------------------------------------------------------------- +--| Function Name : fputs +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a string to a TEXT file. +--| +--| Parameters : +--| l_str -- input, string, +--| stream -- output, TEXT, +--| line_ptr -- INOUT LINE, +--| +--| Result : +--| +--| Note: : The STD TEXTIO package has declared TEXT as a +--| file of STRING. This is not same as file of CHARACTERS. +--| USE: : +--| VARIABLE str_buf : string(1 TO 256); +--| VARIABLE lptr : LINE; +--| FILE out_file : TEXT IS OUT "file_text_out.dat"; +--| +--| fputs(str_buf, out_file, lptr); +--| +--| Will write contents of str_buf to the file +--| file_text_out.dat +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputs ( CONSTANT l_str : IN STRING; + VARIABLE stream : OUT TEXT; + VARIABLE line_ptr : INOUT LINE + ) IS + + + BEGIN + FOR i IN l_str'RANGE LOOP + exit when (l_str(i)= NUL); + WRITE(line_ptr, l_str(i)); + END LOOP; + WRITELINE(stream, line_ptr); + DEALLOCATE(line_ptr); + RETURN; + END fputs; + +--+----------------------------------------------------------------------------- +--| Function Name : Find_Char +--| +--| Overloading : None +--| +--| Purpose : TO find a given character in a string and +--| return its position. +--| +--| Parameters : +--| l_str - input STRING, +--| c - input Character, +--| +--| Result : NATURAL number representing the position of character +--| in the string. returns 0 if character not found in the +--| string. +--| +--| USE: : +--| VARIABLE str14 : string(1 TO 14); +--| VARIABLE indx : integer; +--| +--| str14 :="This is a test"; +--| indx := Fid_Char(str14, 'i'); +--| +--| Will assign value of 3 to the variable indx. +--|----------------------------------------------------------------------------- + FUNCTION Find_Char ( CONSTANT l_str : IN STRING; + CONSTANT c : IN CHARACTER + ) RETURN NATURAL IS + VARIABLE result : NATURAL := 0; + VARIABLE index : INTEGER := 0; + VARIABLE lstr_cpy : STRING(1 TO l_str'LENGTH) := l_str; + BEGIN + While ( index < l_str'LENGTH) LOOP + index := index + 1; + IF (lstr_cpy(index) = NUL) THEN + EXIT; + END IF; + IF ( c = lstr_cpy(index)) THEN + result := index; + EXIT; + END IF; + END LOOP; + RETURN result; + END; +--+----------------------------------------------------------------------------- +--| Function Name : Sub_Char +--| +--| Overloading : None +--| +--| Purpose : To subtitute a new character at a given position +--| of the input string. +--| +--| Parameters : +--| l_str - input STRING, +--| c - input Character, +--| n - input Natural, position at which character +--| is to be substituted. +--| Result : STRING +--| +--| USE: : +--| VARIABLE str14 : string(1 TO 14); +--| VARIABLE indx : integer; +--| +--| str14 :="This is a test"; +--| IF ((indx = Find_Char(str14, 't')) /= 0) THEN +--| str14 := Sub_Char(str14, 'T', indx); +--| END IF; +--| +--| Will assign the value "This is a Test" to str14. +--|----------------------------------------------------------------------------- + FUNCTION Sub_Char ( CONSTANT l_str : IN STRING; + CONSTANT c : IN CHARACTER; + CONSTANT n : IN NATURAL + ) RETURN STRING IS + VARIABLE result : STRING(1 TO l_str'LENGTH) := l_str; + BEGIN + IF (n <= l_str'LENGTH) THEN + result(n) := c; + ELSE + ASSERT NOT WarningsOn + REPORT " Sub_Char --- n out of range " + SEVERITY WARNING; + END IF; + RETURN result; + END Sub_Char; + + + + + + + + + + + + + + + + + + + + + + + + +--+----------------------------------------------------------------------------- +--| Function Name : T_Machine +--| hidden +--| Overloading : None +--| +--| Purpose : Finite State automaton to recognise a time format. +--| format will be broken into field width, precision +--| and justification (left or right) and time_unit (tu); +--| +--| Parameters : fwidth -- output, INTEGER, field width +--| precision -- output, INTEGER, precison +--| justify -- OUTPUT, BIT +--| '0' right justified, +--| '1' left justified +--| t_unit -- output, STRING, time unit of +--| result +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : +--| +--| NOTE : +--| This procedure is +--| called in the function To_String. +--| +--| Use : +--| VARIABLE fmt : STRING(1 TO format'LENGTH) := format; +--| VARIABLE fw : INTEGER; +--| VARIABLE precis : INTEGER; +--| VARIABLE justfy : BIT; +--| VARIABLE tu : STRING(1 TO 2); +--| +--| T_Machine(fw, precis, justy,i tu, fmt); +--| +--|----------------------------------------------------------------------------- + + PROCEDURE T_Machine ( VARIABLE fwidth : OUT INTEGER; + VARIABLE precison : OUT INTEGER; + VARIABLE justify : OUT BIT; + VARIABLE t_unit : OUT time_unit_type; + CONSTANT format : IN STRING + ) IS + VARIABLE state : INT8 := 0; + VARIABLE fmt : STRING(1 TO format'LENGTH); + VARIABLE ch : CHARACTER; + VARIABLE index : INTEGER := 1; + VARIABLE fw : INTEGER := 0; + VARIABLE pr : INTEGER := -1; + VARIABLE tu : STRING(1 TO 3) := (others =>' '); + VARIABLE tu_indx : INTEGER := 0; + VARIABLE e_flag : boolean := false; + + BEGIN + fmt := To_Lower(format); + -- make sure first character is '%' if not error + ch := fmt(index); + IF (fmt(index) /= '%') THEN + ASSERT false + REPORT " Format Error --- first character of format " & + " is not '%' as expected." + SEVERITY ERROR; + return; + END IF; + justify := '0'; -- default is right justification + WHILE (state /= 3) LOOP + if (index < format'LENGTH) THEN + index := index + 1; + ch := fmt(index); + CASE state IS + WHEN 0 => IF (ch ='-') THEN + state := 1; -- justify + ELSIF (ch >= '0' AND ch <= '9') THEN -- to_digit + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 2; -- digits state + ELSIF (ch = 't') THEN + state := 3; -- end state + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = '%') THEN + state := 5; + ELSE + state := 6; -- error + END IF; + + WHEN 1 => justify := '1'; -- left justfy + IF (ch >= '0' AND ch <= '9') THEN -- to_digit + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = 't') THEN + justify := '0'; -- %-t is equivalent to %t + state := 3; + ELSE + state := 6; -- error + END IF; + + WHEN 2 => -- digits-state + IF (ch >= '0' AND ch <= '9') THEN + fw := fw * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = 't') THEN + state := 3; + ELSIF (ch = '.') THEN + state := 4; + ELSE + state := 6; + END IF; + + WHEN 3 => -- t state + -- fromat successfully recognized, exit now. + EXIT; + + WHEN 4 => -- . state + IF (ch >= '0' AND ch <= '9') THEN -- to_digit + pr := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 7; + ELSE + state := 6; -- error + END IF; + + WHEN 5 => -- print % + EXIT; + + WHEN 6 => -- error state + -- print error message + ASSERT false + REPORT " Format Error --- expected %t format. " + SEVERITY ERROR; + EXIT; + + WHEN 7 => -- precision + IF (ch >= '0' AND ch <= '9') THEN + pr := pr * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSIF (ch = 't') THEN + state := 3; + ELSE + state := 6; -- error + END IF; + END CASE; + ELSE + assert false + report " Format Error: Observed =" & fmt &LF + & " Expected = %t unit (detected by T_Machine) " + severity ERROR; + e_flag := true; + exit; + END IF; + END LOOP; + + IF (Not e_flag) THEN + index := index + 1; + if (index < format'LENGTH) then + ch := fmt(index); + end if; + while ((index < format'LENGTH) AND Is_Space(ch)) LOOP + index := index + 1; + ch := fmt(index); + END LOOP; + + if (index < format'LENGTH) then + If (ch >='a' AND ch <='z') THEN + tu(1) := ch; + tu(2) := fmt(index + 1); + if (format'Length >= index + 2) then + tu(3) := fmt(index+2); + end if; + END IF; + end if; + -- this case statement decides the time unit. + CASE tu IS + WHEN "fs " => t_unit := t_fs; + WHEN "ps " => t_unit := t_ps; + WHEN "ns " => t_unit := t_ns; + WHEN "us " => t_unit := t_us; + WHEN "ms " => t_unit := t_ms; + WHEN "sec" => t_unit := t_sec; + WHEN "min" => t_unit := t_min; + WHEN "hr " => t_unit := t_hr; + WHEN OTHERS => ASSERT false + REPORT " Format error --- time unit is not specified " + & "correctly in the format string " + SEVERITY ERROR; + END CASE; + END IF; + -- decide field width (fwidth) + IF (fw > max_string_len) THEN + fwidth := max_string_len; + ELSE + fwidth := fw; + END IF; + -- decide precision + IF (pr = -1) THEN + precison := 6; -- use default precision + ELSE + precison := pr; + END IF; + RETURN; + END T_Machine; + +--+----------------------------------------------------------------------------- +--| Function Name : Default_Time +--| hidden +--| Overloading : None +--| + +--| Purpose : Convert 64 bit Time value to a String with +--| default length of 12. + + +--| +--| Parameters : +--| val - input, TIME, +--| +--| Result : STRING representation of TIME. +--| +--| NOTE : This function converts input time to an appropriate +--| time units such that it can be represented in a string +--| length 7 (xxx.xxx). Then 4 places for unit + +--| ( hr, min, sec, ms ps etc.) are needed and one more for + +--| sign ( -/+ ). IF time is positive then sign position is +--| left blank. This way this function will return a string +--| of length 12. +--| signXXX.XXX Unit ( sign takes one location and units 3). +--| +--| +--|----------------------------------------------------------------------------- + + + FUNCTION Default_Time ( CONSTANT val : IN TIME + ) RETURN STRING IS + VARIABLE tval : time; + VARIABLE ival : integer := 0; + VARIABLE fval : integer := 0; + VARIABLE same_unit : Boolean := false; + VARIABLE sign : character := ' '; + VARIABLE prefix : string(1 to 7) := " . "; + VARIABLE suffix : string(1 to 4) := " "; + VARIABLE digit : integer range 0 to 9; + type char10 is array (Integer range 0 to 9) of character; + CONSTANT lookup : char10 := ( '0','1','2','3','4','5','6','7','8','9'); + BEGIN + -- Handling sign + IF ( val < 0 ns ) THEN + sign := '-'; + tval := - val; + ELSE + sign := ' '; + tval := val; + END IF; + -- selecting proper unit dynamically + + -- check for 0 time (whether input time is 0 fs, 0 ps, 0 ns etc) + + -- it will be treated as 0 ns / 1000000 internally. We will provide default + -- time as 0.000 ns. + -- + IF (tval = 0 ns) then + ival := 0; + suffix := " ns "; + + ELSIF ( tval >= 1 hr ) then + ival := (tval / 1 min ); -- gives it in terms of 60's + -- of min + suffix := " hr "; + fval := (ival mod 60); + ival := (1000 * (ival/60)) + ( fval * 1000 / 60); + ELSIF ( tval >= 1 min ) then + ival := (tval / 1 sec); -- gives it in terms of 60's of sec + suffix := " min"; + fval := ival mod 60; + ival := (1000 * (ival/60)) + (fval * 1000 / 60); + + ELSIF ( tval >= 1 sec ) then + ival := tval / 1 ms; -- gives it in terms of 1000's of ms + suffix := " sec"; + ELSIF ( tval >= 1 ms ) then + ival := tval / 1 us; -- gives it in terms of 1000's of us + suffix := " ms "; + + + ELSIF (tval >= 1 us) then + ival := tval / 1 ns; -- gives it in terms of 1000s of ns + suffix := " us "; + + + ELSIF ( tval >= 1 ns) THEN + suffix := " ns "; + if ( (1 ns / 1000) = 0 ns ) then + ival := tval / (1 ns); + same_unit := TRUE; + else + ival := tval / (1 ns / 1000); -- gives it in terms of 1000s of 1 ns / 1000 + end if; + + + + ELSIF ( tval >= (1 ns / 1000) ) THEN + suffix := " ps "; + if ( (1 ns / 1000000) = 0 ns ) then + ival := tval / (1 ns / 1000); + same_unit := TRUE; + else + ival := tval / (1 ns / 1000000); -- gives it in terms of 1000s of 1 ns / 1000000 + end if; + + ELSIF ( tval >= (1 ns / 1000000) ) THEN + ival := tval / (1 ns / 1000000); + suffix := " fs "; + same_unit := TRUE; + END IF; + -- converting to XXX.XXX format + IF ( same_unit ) THEN + prefix(5 TO 7) := (OTHERS => '0'); + ELSE + FOR i IN 7 DOWNTO 5 LOOP + digit := ival mod 10; + ival := ival / 10; + prefix (i) := lookup(digit); + END LOOP; + END IF; + FOR i IN 3 DOWNTO 1 LOOP + digit := ival mod 10; + ival := ival / 10; + prefix (i) := lookup(digit); + END LOOP; + -- get rid of leading zero's + leading_zero_kill : FOR i IN 1 to 2 LOOP + exit leading_zero_kill WHEN (prefix(i) /= '0'); + IF (prefix(i) = '0') THEN + prefix (i) := ' '; + END IF; + END LOOP; + if (prefix(2) = ' ') then + return ( " " & sign & prefix(3 to 7) & suffix); + elsif (prefix(1) = ' ') then + return ( ' ' & sign & prefix(2 to 7) & suffix); + else + RETURN (sign & prefix & suffix); + end if; + END Default_Time; + +--+----------------------------------------------------------------------------- +--| Function Name : Time_String +--| hidden +--| Overloading : None +--| + +--| Purpose : Convert 64 bit Time value to a String based upon fs + +--| +--| Parameters : val - input, TIME positive val, +--| + +--| Result : A STRING of length 20 representing TIME. + +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION Time_String ( CONSTANT val : IN TIME ) RETURN STRING IS + + + CONSTANT buf_len : INTEGER := 20; + + TYPE t_to_int_type is array (1 to 6) of integer; + + VARIABLE t_to_int : t_to_int_type := (others => 0); + VARIABLE tbuf : STRING(1 to buf_len) := (others => '0'); + VARIABLE ival : integer; + VARIABLE tval : time := val; + VARIABLE i, index : integer; + VARIABLE min_str_index : integer; + VARIABLE time_unit : time; + VARIABLE min_time_unit : time; + VARIABLE start_int_ind : integer; + VARIABLE num, counter : integer; + + BEGIN + -- identify minimum time unit + min_time_unit := 1 ns / 1000000; + if ( min_time_unit > 0 ns ) then -- fs + start_int_ind := 1; + else + min_time_unit := 1 ns / 1000; + if ( min_time_unit > 0 ns ) then -- ps + start_int_ind := 2; + else -- ns + min_time_unit := 1 ns; + start_int_ind := 3; + end if; + end if; + + -- get minimum string index + min_str_index := 1; + + if (min_time_unit = (1 ns / 1000)) then + min_str_index := 4; + elsif (min_time_unit = 1 ns) then + min_str_index := 7; + end if; + + + -- get starting time_unit and starting integer array index + time_unit := min_time_unit; + for i in 1 to (((buf_len - min_str_index)/3)-1) loop + time_unit := time_unit * 1000; + start_int_ind := start_int_ind + 1; + end loop; + -- start_int_ind now is at the maximum value + + -- get integer equivalent + -- start with maximum time_unit and work down to minimum + i := start_int_ind; + while time_unit > 0 ns loop + t_to_int(i) := tval / time_unit; + tval := tval - t_to_int(i) * time_unit; + time_unit := time_unit/1000; + i := i - 1; + end loop; + index := i + 1; + + -- convert intpeger array to a string + i := buf_len - min_str_index + 1; + counter := 0; + while i > 0 loop + if (counter mod 3 = 0) and (index <= start_int_ind) then + num := t_to_int(index); + index := index + 1; + end if; + tbuf(i) := CHARACTER'VAL(CHARACTER'POS('0') + (num mod 10)); + num := num/10; + i := i - 1; + counter := counter + 1; + end loop; + return tbuf; + END Time_String; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a time. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Time +--| +--| NOTE : +--| +--| Use : +--| VARIABLE t : time ; +--| +--| t := From_String (" 893.56 ns"); +--| This statement will set t to time 893.56 ns. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN TIME IS + VARIABLE result : TIME; + VARIABLE fract_t : TIME; + VARIABLE state : INT8; + VARIABLE str_copy : STRING (1 TO str'LENGTH):= To_Upper(str); + VARIABLE index : Natural; + VARIABLE power : Natural := 0; + VARIABLE num : Integer := 0; + VARIABLE fract_num : Integer := 0; + VARIABLE ch : character; + VARIABLE neg_sign : boolean := false; + VARIABLE tu : string(1 To 3) := (OTHERS => ' '); + VARIABLE tu_indx : INTEGER := 0; + VARIABLE parse_err : BOOLEAN := FALSE; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has a null range " + severity ERROR; + RETURN TIME'LEFT; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN TIME'LEFT; + ELSIF (str_copy(index)=NUL) THEN + assert false + report " From_String -- first non_white character is a NUL "; + RETURN TIME'LEFT; + END IF; + ch := str_copy(index); + -- check for - sign or + sign + IF (ch = '-') Then + neg_sign := NOT neg_sign; + index := index + 1; + ch := str_copy(index); -- get_char + elsif (ch = '+') then + index := index + 1; + ch := str_copy(index); -- get_char + END IF; + + -- Strip off leading zero's + While ( (ch = '0') AND (index < str'LENGTH)) LOOP + index := index + 1; + ch := str_copy(index); -- get_char + END LOOP; + -- if all zero's make sure that final zero remains + if ( (NOT Is_Digit(ch)) and (index > 1) and (str_copy(index - 1) = '0') ) then + index := index - 1; + ch := str_copy(index); + end if; + WHILE (true) LOOP + CASE state IS + WHEN 0 => IF (ch >= '0' AND ch <= '9') THEN -- to_digit + num := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 1; + ELSIF (ch = '.') THEN + state := 2; + ELSE + state := 4; -- error + END IF; + + WHEN 1 => -- + IF (ch >= '0' AND ch <= '9') THEN + num := num * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 1; + ELSIF (ch = '.') THEN + state := 2; + ELSIF ((Is_White(ch)) OR (ch = NUL)) THEN + state := 3; + ELSE + state := 4; -- error + END IF; + + WHEN 2 => -- . state + IF (ch >= '0' AND ch <= '9') THEN + fract_num := fract_num * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + power := power + 1; + state := 2; + + ELSIF ((Is_White(ch)) OR (ch = NUL)) THEN + state := 3; + ELSE + state := 6; -- error + END IF; + + WHEN 3 => -- space between time value and unit + IF ((Is_White(ch)) OR (ch=NUL)) THEN + state := 3; + ELSIF (ch >= 'A' AND ch <= 'Z') THEN + tu_indx := tu_indx + 1; + tu(tu_indx) := ch; + state := 5; + ELSE + state := 4; + END IF; + + WHEN 4 => -- error state + ASSERT false + REPORT " From_String --- invalid character encountered " + SEVERITY ERROR; + parse_err := TRUE; + EXIT; + + WHEN 5 => -- end state + IF ((ch >= 'A' AND ch <= 'Z') AND (tu_indx < 3)) THEN + tu_indx := tu_indx + 1; + tu(tu_indx) := ch; + state := 5; + ELSIF ( IS_White(ch) OR (tu_indx = 3) OR (ch=NUL)) THEN + exit; + ELSE + state := 4; + END IF; + WHEN OTHERS => ASSERT false + REPORT " From_String(time) --- time string in incorrect format" + SEVERITY ERROR; + parse_err := TRUE; + exit; + + END CASE; + index := index + 1; + EXIT when index > str'LENGTH; + ch := str_copy(index); + END LOOP; + + if (parse_err) then + return TIME'LEFT; + end if; + + IF (neg_sign) THEN + num := - num; + fract_num := - fract_num; + END IF; + -- this case statement decides the time unit. + CASE tu IS + + WHEN "FS " => + if (1 ns / 1000000) /= 0 ns then + fract_t := (fract_num * (1 ns / 1000000)) / (10 ** power); + result := (num * (1 ns / 1000000)) + fract_t; + else + if (1 ns / 1000) /= 0 ns then + result := num / 1000 * (1 ns / 1000); + else + result := num / 1000000 * 1 ns; + end if; + end if; + + + WHEN "PS " => + if ( 1 ns / 1000) /= 0 ns then + fract_t := (fract_num * (1 ns / 1000)) / (10 ** power); + result := (num * (1 ns / 1000)) + fract_t; + else + result := num / 1000 * 1 ns; + end if; + + WHEN "NS " => + fract_t := (fract_num * 1 NS) / (10 ** power); + result := (num * 1 NS) + fract_t; + WHEN "US " => + fract_t := (fract_num * 1 US) / (10 ** power); + + result := (num * 1 US) + fract_t; + + + WHEN "MS " => + fract_t := (fract_num * 1 MS) / (10 ** power); + result := (num * 1 MS) + fract_t; + + + WHEN "SEC" => + fract_t := (fract_num * 1 SEC) / (10 ** power); + result := (num * 1 SEC) + fract_t; + WHEN "MIN" => + fract_t := (fract_num * 1 MIN) / (10 ** power); + result := (num * 1 MIN) + fract_t; + WHEN "HR " => + fract_t := (fract_num * 1 HR) / (10 ** power); + result := (num * 1 HR) + fract_t; + + + WHEN OTHERS => + + ASSERT false + REPORT "From_String --- time base not specified or incorrectly specified" + SEVERITY ERROR; + + + return TIME'LEFT; + END CASE; + return result; + END From_String; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.7 +--| Overloading : None +--| +--| Purpose : Convert Time to a String. +--| +--| Parameters : +--| val - input, TIME, +--| +--| Result : STRING representation of TIME. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN TIME; + CONSTANT format : IN STRING := "" + ) RETURN STRING IS + + VARIABLE tbuf : STRING(max_string_len DOWNTO 1) ; -- implicitly == NUL + VARIABLE str_len : NATURAL; -- actual length of time string + VARIABLE rbuf : STRING(max_string_len DOWNTO 1); + VARIABLE result : string(1 TO max_string_len); + VARIABLE r_index : Natural := 0; + VARIABLE t_index : Natural := 0; + VARIABLE str_index : Natural := 0; + VARIABLE tval : TIME; + VARIABLE ival : INTEGER; + VARIABLE period_loc : NATURAL; + VARIABLE left_digits : NATURAL; + VARIABLE format_cpy : string(1 TO format'length) := format; + VARIABLE pr_actual : integer; -- actual precision + VARIABLE indx : integer; + VARIABLE fw : integer; -- field width + VARIABLE precis : integer; -- precision + VARIABLE justy : BIT := '0'; -- justification + VARIABLE tunit : time_unit_type; + VARIABLE suffix : STRING(1 TO 4); + VARIABLE neg_sign : BOOLEAN := false ; + BEGIN + + -- IF no format is specified then the result will be provided + -- in the dynamic default time unit. + IF (format = "") THEN + return(Default_Time(val)); + END IF; + -- handle sign + IF ( val < 0 ns ) THEN + neg_sign := NOT neg_sign; + tval := - val; + ELSE + tval := val; + END IF; + -- convert time to string without any format + -- by calling Time_String(). first determine the length + + str_index := 20; + + tbuf(str_index downto 1) := Time_String(tval); + + -- call procedure T-Machine to split format string into field width fw + -- precision, justification and desired time unit ( time unit in which + -- the result string is to be represented). + T_Machine(fw, precis, justy, tunit, format); + + -- determine the desired output time unit and insert the decimal point + -- at proper location in the string and save the result int rbuf. + CASE tunit is + + WHEN t_sec | t_min | t_hr => + period_loc := 16; + + rbuf(period_loc - 1 DOWNTO 1) := tbuf(period_loc -1 DOWNTO 1); + rbuf(period_loc) := '.'; + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + + suffix := " sec"; + + WHEN t_ms => + period_loc := 13; + + rbuf(period_loc - 1 DOWNTO 1) := tbuf(period_loc -1 DOWNTO 1); + rbuf(period_loc) := '.'; + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + + suffix := " ms "; + WHEN t_us => + period_loc := 10; + rbuf(period_loc - 1 DOWNTO 1) := tbuf(period_loc -1 DOWNTO 1); + rbuf(period_loc) := '.'; + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + suffix := " us "; + + WHEN t_ns => + period_loc := 7; + + rbuf(period_loc - 1 DOWNTO 1) := tbuf(period_loc -1 DOWNTO 1); + + rbuf(period_loc) := '.'; + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + suffix := " ns "; + + WHEN t_ps => + period_loc := 4; + + + rbuf(period_loc - 1 DOWNTO 1) := tbuf(period_loc -1 DOWNTO 1); + + rbuf(period_loc) := '.'; + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + + suffix := " ps "; + + WHEN t_fs => + period_loc := 1; + rbuf(period_loc) := '.'; + + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + + suffix := " fs "; + + WHEN OTHERS => null; + END CASE; + str_index := str_index + 1; -- to take care of decimal point + + -- kill leading zero's + Kill_ZERO : LOOP + EXIT Kill_ZERO WHEN (rbuf(str_index) /= '0'); + IF (rbuf(str_index) = '0') THEN + str_index := str_index - 1; + END IF; + END LOOP; + + -- keep one zero before the decimal point + IF (rbuf(str_index) = '.') THEN + str_index := str_index + 1; + rbuf(str_index) := '0'; + END IF; + + -- insert the negative sign if it exists + IF neg_sign THEN + str_index := str_index + 1; + rbuf(str_index) := '-'; + END IF; + + -- calculate the number of digits including negative sign in the + -- string to the left of decimal point + left_digits := str_index - period_loc; + IF (precis /= 0) THEN + str_len := left_digits + 1 + precis; + ELSE + str_len := left_digits; + END IF; + + -- copy rbuf to tbuf according to the desired format + -- first copy the precison part + -- check if precision > period_loc -1 + IF (precis > period_loc - 1) THEN + t_index := precis + 1; + FOR i IN period_loc downto 1 LOOP + tbuf(t_index) := rbuf(i); + t_index := t_index - 1; + END LOOP; + tbuf(t_index downto 1) := (OTHERS => '0'); + ELSIF (precis = period_loc - 1) THEN + tbuf(precis + 1 downto 1) := rbuf(period_loc downto 1); + ELSE -- copy as much portion you can + r_index := period_loc; + FOR i IN precis + 1 downto 1 LOOP + tbuf(i) := rbuf(r_index); + r_index := r_index - 1; + END LOOP; + END IF; + -- copy the part to the left of period + tbuf(str_len DOWNTO str_len - left_digits + 1) := + rbuf(str_index DOWNTO period_loc + 1); + + -- match the desired field width + -- ** was (fw > str_index) + IF (fw > str_len) THEN + case justy IS + WHEN '0' => -- right justification + tbuf(fw DOWNTO str_len + 1) := (OTHERS => ' '); + result( 1 TO fw) := tbuf(fw DOWNTO 1); + return (result(1 TO fw) & suffix); + WHEN '1' => + result( 1 TO str_len) := tbuf(str_len DOWNTO 1); + result(str_len + 1 TO str_len + 4) := suffix; + indx := str_len + 4; + for i IN fw - str_len DOWNTO 1 LOOP + indx := indx + 1; + result(indx) := ' '; + end LOOP; + return result(1 TO indx); + WHEN OTHERS => -- left justification + ASSERT NOT WarningsOn + report " To_String --- error in justification " + SEVERITY WARNING; + result(1 TO str_len) := tbuf(str_len DOWNTO 1); + return (result(1 TO str_len) & suffix); + end case; + ELSE -- fw is lessthan or equal to std_len + result(1 TO str_len) := tbuf(str_len DOWNTO 1); + return (result(1 TO str_len) & suffix); + END IF; + -- That's all + END To_String; +-- +-- end of the std_iopak body +END std_iopak; diff --git a/src/hdl/pkg/iopakp.vhd b/src/hdl/pkg/iopakp.vhd new file mode 100644 index 0000000..9542fde --- /dev/null +++ b/src/hdl/pkg/iopakp.vhd @@ -0,0 +1,2596 @@ +-- ---------------------------------------------------------------------------- +-- +-- Copyright (c) Mentor Graphics Corporation, 1982-1996, All Rights Reserved. +-- UNPUBLISHED, LICENSED SOFTWARE. +-- CONFIDENTIAL AND PROPRIETARY INFORMATION WHICH IS THE +-- PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS. +-- +-- +-- PackageName : std_iopak +-- Title : Package for STD_IOPAK +-- Purpose : This package contains additional support for +-- : performing text IO. +-- : +-- Comments : +-- : +-- Assumptions : none +-- Limitations : none +-- Known Errors: none +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- Mentor Graphics Corporation owns the sole copyright to this software. +-- Under International Copyright laws you (1) may not make a copy of this +-- software except for the purposes of maintaining a single archive copy, +-- (2) may not derive works herefrom, (3) may not distribute this work to +-- others. These rights are provided for information clarification, +-- other restrictions of rights may apply as well. +-- +-- This is an "Unpublished" work. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> License NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- This software is further protected by specific source code and/or +-- object code licenses provided by Mentor Graphics Corporation. Use of this +-- software other than as provided in the licensing agreement constitues +-- an infringement. No modification or waiver of any right(s) shall be +-- given other than by the written authorization of an officer of The +-- Mentor Graphics Corporation. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> Proprietary Information <<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- This source code contains proprietary information of Mentor Graphics +-- Corporation and shall not be disclosed other than as provided in the software +-- licensing agreement. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Warrantee <<<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- Mentor Graphics Corporation MAKES NO WARRANTY OF ANY KIND WITH REGARD TO +-- THE USE OF THIS SOFTWARE, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS +-- FOR A PARTICULAR PURPOSE. +-- ---------------------------------------------------------------------------- +-- Modification History : +-- ---------------------------------------------------------------------------- +-- Version No: | Author: | Mod. Date: | Changes Made: +-- v1.000 | M.K.Dhodhi | 10/26/91 | Production Release +-- v1.100 | M.K.Dhodhi | 11/19/91 | Compatible w/ vantage 3.650 Release +-- v1.110 | wdb | 01/27/92 | compatible w/Intermetrics +-- v1.111 | M.K.Dhodhi | 02/13/92 | fixing bug in T0_String input time +-- | fixing comment in SOX_Machine +-- v1.111 | M.K.Dhodhi | 03/06/92 | production release +-- v1.200 | M.K.Dhodhi | 04/21/92 | stand alone version +-- v1.300 | M.K.Dhodhi | 08/03/92 | production release +-- v1.140 | M.K.Dhodhi | 11/05/92 | fixing real 0.0 case for To_String +-- | | and an extra loop in default time. +-- v1.150 | M.K.Dhodhi | 11/17/92 | extending fscan upto 20 arguments. +-- | fixing default 0 time. +-- v1.160 | M.K.Dhodhi | 02/11/93 | Fixing Find_char +-- v1.700 B | W.R. Migatz | 05/03/93 | Beta release - changes to all f routines (not fprint) +-- | modified str*cpy and str*cmp +-- | fixed memory leak +-- v1.700 | W.R. Migatz | 05/25/93 | production release - change to fscan with %t to allow time unit +-- v1.800 | W.R. Migatz | 07/28/93 | combining into 1 file, mentor support, and From_String(time) bug fix +-- v2.000 | W.R. Migatz | 07/21/94 | production release - fix bug in fprint, fs ps ns timing changes +-- v2.100 | W.R. Migatz | 01/10/96 | production release +-- | Initialization banner removed +-- v2.110 | W.R. Migatz | 04/02/96 | Fixed Find_Char and To_String(TIME) bugs +-- | Find_char did not stop at a NUL character +-- | To_String(TIME) did not handle a precision of 0 +-- v2.2 | B. Caslis | 07/25/96 | Updated for Mentor Graphics Release +-- ---------------------------------------------------------------------------- + +Library ieee; +Use ieee.std_logic_1164.all; -- Reference the STD_Logic system +Use STD.TEXTIO.all; + +PACKAGE std_iopak is + + -- ************************************************************************ + -- Display Banner + -- ************************************************************************ + CONSTANT StdIOpakBanner : BOOLEAN; + + + + TYPE ASCII_TEXT IS file of CHARACTER; + + TYPE time_unit_type is (t_fs, t_ps, t_ns, t_us, t_ms, t_sec, t_min, t_hr); + + CONSTANT max_token_len : INTEGER := 32; + CONSTANT max_string_len : INTEGER := 256; + CONSTANT END_OF_LINE_MARKER : STRING(1 TO 2); + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a boolean. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : A boolean true or false. +--| +--| NOTE : +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 5) := " TRUE"; +--| VARIABLE good : BOOLEAN +--| +--| good := From_String (s_flag); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN boolean; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a bit. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : bit. +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_val : bit; +--| +--| b_val := From_String (" 100"); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN bit; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a Severity_Level. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Severity_Level +--| +--| NOTE : +--| +--| Use : +--| VARIABLE str10 : String(1 TO 10) := " WARNING"; +--| VARIABLE sev : severity_level; +--| +--| sev := From_String (str10); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN severity_level; +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a character. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Character +--| +--| NOTE : +--| +--| Use : +--| VARIABLE str10 : String(1 TO 10) := "WARNING "; +--| VARIABLE ch : character; +--| +--| ch := From_String (str10); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN character; +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an Integer. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Integer +--| +--| NOTE : +--| +--| Use : +--| VARIABLE n : Integer; +--| +--| n := From_String ("32 56"); +--| This statement will set n to integer 32. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN INTEGER; +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a real. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : real value +--| +--| NOTE : +--| +--| Use : +--| VARIABLE n : real ; +--| +--| n := From_String (" -354.78"); +--| This statement will set n to real value -354.78. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN REAL; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_ulogic. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_ulogic +--| +--| NOTE : +--| +--| Use : +--| VARIABLE u_val : std_ulogic ; +--| +--| u_val := From_String (" 100"); +--| This statement will set u_val equal to the value '1'. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_ulogic; +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_ulogic_vector. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_ulogic_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE u_vector : std_ulogic_vector( 7 DOWNTO 0) ; +--| +--| u_vector := From_String (" 0-ZU1010 1010"); +--| This statement will set u_vector equal to "0-ZU1010". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_ulogic_vector; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_logic_vector. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_logic_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE logic_vect : std_logic_vector( 7 DOWNTO 0) ; +--| +--| logic_vect := From_String (" 0-ZU1010 1010"); +--| This statement will set logic_vect equal to "0-ZU1010". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_logic_vector; + +--+----------------------------------------------------------------------------- +--| Function Name : From_BinString +--| +--| Overloading : None +--| +--| Purpose : Convert from a Binary String to a bit_vector. +--| +--| Parameters : +--| str - input , binary string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 7 DOWNTO 0) ; +--| +--| b_vect := From_BinString (" 01101111 1010"); +--| This statement will set b_vect equal to "01101111". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_BinString ( CONSTANT str : IN STRING + ) RETURN bit_vector; +--+----------------------------------------------------------------------------- +--| Function Name : From_OctString +--| +--| Overloading : None +--| +--| Purpose : Convert from an Octal String to a bit_vector. +--| +--| Parameters : +--| str - input , Octal string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 15 DOWNTO 4) ; +--| +--| b_vect := From_OctString (" 1735 1010"); +--| This statement will set b_vect equal to "001111011101". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_OctString ( CONSTANT str : IN STRING + ) RETURN bit_vector; +--+----------------------------------------------------------------------------- +--| Function Name : From_HexString +--| +--| Overloading : None +--| +--| Purpose : Convert from a Hex String to a bit_vector. +--| +--| Parameters : +--| str - input , Hex string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 15 DOWNTO 4) ; +--| +--| b_vect := From_HexString (" 3DD 1010"); +--| This statement will set b_vect equal to "001111011101". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_HexString ( CONSTANT str : IN STRING + ) RETURN bit_vector; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.1 +--| Overloading : None +--| +--| Purpose : Convert a boolean to a String. +--| +--| Parameters : +--| val - input value, BOOLEAN, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a boolean. +--| +--| NOTE : +--| Default is right justified +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 5); +--| VARIABLE good : BOOLEAN := TRUE; +--| +--| s_flag := To_String ( good, "%5s" ); +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BOOLEAN; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.2 +--| Overloading : None +--| +--| Purpose : Convert a bit Value to a String. +--| +--| Parameters : +--| val - input bit. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a bit. +--| +--| +--| Use : +--| VARIABLE bit_string : String(1 TO 5); +--| +--| bit_string := To_String ( '1', "%1s"); +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BIT; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.3 +--| Overloading : None +--| +--| Purpose : Convert a Character to a String. +--| +--| Parameters : +--| val - input character. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Note : This function allows to see the non-printable characters. +--| +--| Result : STRING representation of a character. +--| +--| +--| Use : +--| VARIABLE ascii_char : String(1 TO 5); +--| +--| ascii_char := To_String ( d, "%3s"); +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN CHARACTER; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.4 +--| Overloading : None +--| +--| Purpose : Convert a severity-level to a string. +--| +--| Parameters : +--| val - input severity-level. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a severity-level. +--| +--| Use : +--| VARIABLE s_level : String(1 TO 7); +--| VARIABLE message : SEVERITY_LEVEL := NOTE; +--| +--| s_level := To_String (message, "%7s"); +--|------------------------------------------------------------------ + FUNCTION To_String ( CONSTANT val : IN SEVERITY_LEVEL; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.5 +--| Overloading : None +--| +--| Purpose : Convert an integer into a String according +--| format specification. +--| +--| Parameters : +--| val - input value, INTEGER, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of an integer. +--| +--| NOTE : Format string has same meaning a in C language. +--| That if format is "%d " will convert an integer to +--| a string of length equal to number of digits in the +--| given inetger argument. While "%10d " return +--| a string of length 10 and if the number of digits +--| in the integer are less than 10 it will pad the +--| string with blank on the left because default +--| justification is right. if number of digits are +--| larger than 10 it will return 10 leftmost digits. +--| +--| +--| +--| USE : +--| VARIABLE str : STRING(1 TO 10); +--| VARIABLE val : INTEGER := 2750; +--| +--| str := TO_String(val, "%10d"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN INTEGER; + CONSTANT format : IN STRING := "%d" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.6 +--| Overloading : None +--| +--| Purpose : Convert a real number to a String. +--| +--| Parameters : +--| val - input value, REAL, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a real number. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 10); +--| VARIABLE val : REAL := 67.560 +--| +--| str := TO_String(val, "%10.3f"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN REAL; + CONSTANT format : IN STRING :="%f" + ) RETURN STRING; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.8 +--| Overloading : None +--| +--| Purpose : Convert a bit_vector to a String. +--| +--| Parameters : +--| val - input, BIT_VECTOR, +--| +--| Result : STRING representation of a bit_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : BIT_VECTOR (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BIT_VECTOR; + CONSTANT format : IN STRING :="%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.10.2 +--| Overloading : None +--| +--| Purpose : Convert an std_ulogic to a String. +--| +--| Parameters : +--| val - input std_ulogic. +--| +--| Result : STRING representation of std_ulogic. +--| +--| Use : +--| VARIABLE str_ovf : STRING(1 TO 4); +--| VARIABLE overflow : std_ulogic; +--| +--| str_ovf := TO_String(vect, "%4s"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_ulogic; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| +--| Overloading : None +--| +--| Purpose : Convert an std_logic_vector to a String. +--| +--| Parameters : +--| val - input std_logic_vector. +--| +--| Result : STRING representation of std_logic_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : std_logic_vector (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_logic_vector; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| +--| Overloading : None +--| +--| Purpose : Convert an std_ulogic_vector to a String. +--| +--| Parameters : +--| val - input std_ulogic_vector. +--| +--| Result : STRING representation of std_ulogic_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : std_ulogic_vector (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_ulogic_vector; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Alpha +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a letter of the alphabet. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a letter of the +--| alphabet, false otherwise. +--| +--| +--| Use : +--| +--| See Also : Is_Digit, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Alpha ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Upper +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is an upper case letter. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is an upper case letter of +--| the alphabet, false otherwise. +--| +--| +--| See Also : Is_Digit, Is_Alpha, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Upper ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a lower case letter. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a lower case letter of +--| the alphabet, false otherwise. +--| +--| +--| See Also : Is_Digit, Is_Upper, Is_Alpha +--|----------------------------------------------------------------------------- + FUNCTION Is_Lower ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Digit +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a digit 0-9. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a digit, false +--| otherwise. +--| +--| +--| See Also : Is_Alpha, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Digit ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Space +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a blank, tab or newline. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a blank or tab(HT), +--| false otherwise. +--| +--| +--| See Also : Is_Digit, Is_Upper, Is_Lower, Is_Alpha +--|----------------------------------------------------------------------------- + FUNCTION Is_Space ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN; +--+----------------------------------------------------------------------------- +--| Function Name : To_Upper +--| 1. +--| Overloading : None +--| +--| Purpose :Convert a character to upper case. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : Character converted to upper case. +--| +--| +--| See Also : To_Lower, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Upper ( CONSTANT c : IN CHARACTER + ) RETURN CHARACTER; +--+----------------------------------------------------------------------------- +--| Function Name : To_Upper +--| 1. +--| Overloading : None +--| +--| Purpose :Convert a string to upper case. +--| +--| Parameters : +--| val - input, string to be converted +--| +--| Result : string . +--| +--| +--| See Also : To_Lower, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Upper ( CONSTANT val : IN String + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Convert a Character to lower case. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : Character converted to lower case. +--| +--| See Also : To_Upper, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Lower ( CONSTANT c : IN CHARACTER + ) RETURN CHARACTER; +--+----------------------------------------------------------------------------- +--| Function Name : To_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Convert a String to lower case. +--| +--| Parameters : +--| val - input string to be converted. +--| +--| Result : string +--| +--| See Also : To_Upper, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Lower ( CONSTANT val : IN STRING + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : StrCat +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Concatenate two string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Concatenated string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrCat ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : StrNCat +--| 1.2.2 +--| Overloading : None +--| +--| Purpose : Concatenate upto n characters of r_string to l_string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Concatenated string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNCat ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : INTEGER + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : StrCpy +--| 1.2.3 +--| Overloading : None +--| +--| Purpose : Copy r_string to l_string. +--| +--| Parameters : +--| l_str - output, STRING, target string +--| r_str - input, STRING, source string +--| +--| Result : +--| +--| NOTE : If the length of target string is greater than +--| the source string, then target string is padded +--| with space characters on the right side and when +--| the length of target string is shorter than the +--| length of source string only left most characters +--| of the source string will be be copied to the target. +--| +--| +--| USE : +--| Variable s1: string(1 TO 8); +--| +--| StrCpy(s1, "123456789A"); +--| s1 will hold "12345678" +--|----------------------------------------------------------------------------- + PROCEDURE StrCpy ( VARIABLE l_str : OUT STRING; + CONSTANT r_str : IN STRING + ); +--+----------------------------------------------------------------------------- +--| Function Name : StrNCpy +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy at most n characters of r_string to l_string. +--| +--| Parameters : +--| l_str - output, STRING, target +--| r_str - input, STRING, source +--| n - input, Natural, number of characters to +--| to be copied. +--| +--| Result : l_string holds the result. +--| +--| NOTE : If n is less than or equal to zero then a srting +--| filled with blanks is returned. +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE StrNCpy ( VARIABLE l_str : OUT STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : IN NATURAL + ); +--+----------------------------------------------------------------------------- +--| Function Name : StrCmp +--| +--| Overloading : None +--| +--| Purpose : Compare left input string to right input string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : INTEGER, returns an integer less than 0 if the left string +--| is less than the right string, returns integer 0 if the +--| the string are equal and returns an integer greater than +--| 0 if the left string is greater than the right string. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION StrCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN INTEGER; +--+----------------------------------------------------------------------------- +--| Function Name : StrNCmp +--| +--| Overloading : None +--| +--| Purpose : Compare at most n characters of left input string +--| to right input string. Returns an Integer. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| n - input, Natural, +--| +--| Result : Returns an integer less than 0 if left_most n +--| characters of the left string is less than the +--| right string, returns integer 0 if both strings +--| are equal, and returns an integer greater than 0 +--| if the left string is greater than the right string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : IN Natural + ) RETURN INTEGER; +--+----------------------------------------------------------------------------- +--| Function Name : StrNcCmp +--| +--| Overloading : None +--| +--| Purpose : Compare to strings and determine whether left input +--| string is less than, equal to or greater than right +--| input string. The comparison is Not case sensitive. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Returns an integer less than 0 if left_most n +--| characters of the left string is less than the +--| right string, returns integer 0 if both strings +--| are equal, and returns an integer greater than 0 +--| if the left string is greater than the right string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNcCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN INTEGER; +--+----------------------------------------------------------------------------- +--| Function Name : StrLen +--| +--| Overloading : None +--| +--| Purpose : Returns length of a string. +--| +--| Parameters : +--| l_str - input, STRING, +--| +--| Result : Natural +--| +--| NOTE : +--| This is in fact same as String'LENGTH provided +--| by VHDL. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION StrLen ( CONSTANT l_str : IN STRING + ) RETURN NATURAL; + +--+----------------------------------------------------------------------------- +--| Function Name :Copyfile +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy one ASCII_TEXT file to an other ASCII_TEXT file. +--| +--| Parameters : +--| in_fptr -- input, ASCII_TEXT, source file +--| out_fptr -- output, ASCII_TEXT, destination file +--| +--| NOTE : +--| +--| USE : +--| file romdata : ASCII_TEXT IS IN "NEW_ROM.dat"; +--| file dest_file : ASCII_TEXT IS OUT "SAVE_ROM.dat"; +--| +--| Copyfile(romdata, dest_file); +--|----------------------------------------------------------------------------- + PROCEDURE Copyfile ( VARIABLE in_fptr : IN ASCII_TEXT; + VARIABLE out_fptr : OUT ASCII_TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name :Copyfile +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy one TEXT file to an other TEXT file. +--| +--| Parameters : +--| in_fptr -- input, TEXT, +--| out_fptr -- output, TEXT +--| +--| NOTE : +--| This is combination of READLINE() and WRITELINE() +--| procedures provided in the standard +--| TEXTIO package. +--| +--| USE : +--| file in_f : TEXT IS IN "data_in"; +--| file out_f : TEXT IS OUT "save_data"; +--| +--| Copyfile(in_f, out_f); +--|----------------------------------------------------------------------------- + PROCEDURE Copyfile ( VARIABLE in_fptr : IN TEXT; + VARIABLE out_fptr : OUT TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Convert up to 10 arguments to a file according to +--| the format specifications give by a format string. +--| +--| Parameters : +--| file_ptr - output ASCII_TEXT, destination file +--| format - input STRING, format control specifications. +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : formated TEXT. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE file_ptr : OUT ASCII_TEXT; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := ""; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := ""; + CONSTANT arg10 : IN STRING := "" + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Print up to 10 arguments to a file according to +--| the specifications given by a format string. +--| +--| Parameters : +--| file_ptr - output TEXT, destination file +--| line_ptr - INOUT LINE, pointer to a string. +--| format - input STRING, format control specifications. +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : formated TEXT. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE file_ptr : OUT TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := ""; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := ""; + CONSTANT arg10 : IN STRING := "" + ); +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.2 +--| Overloading : None +--| +--| Purpose : Print up to 10 arguments to a string buffer according to +--| the specifications given by a format string. +--| +--| Parameters : +--| string_buf - output STRING, +--| format - input STRING +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : STRING representation of arguments. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE string_buf : OUT STRING; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := ""; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := ""; + CONSTANT arg10 : IN STRING := "" + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| +--| Overloading : None +--| +--| Purpose : To read text from a file according to specifications +--| given by a format string and save the results into +--| the corresponding arguments. +--| +--| Parameters : +--| file_ptr - input ASCII_TEXT, input file +--| format - input STRING, format control specifications. +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg19 - output STRING, +--| arg20 - output STRING, +--| arg_count - number of arguments passed to fscan +--| +--| Result : STRING representation of given text. +--| +--| +--| Note: This procedure extracts upto twenty arguments +--| from a line in a file. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING + ); +--|----------------------------------------------------------------------------- + + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING + ); +--|----------------------------------------------------------------------------- + + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING + ); +--|----------------------------------------------------------------------------- + + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| 1.2.3 +--| Overloading : None +--| +--| Purpose : To read text from a file according to specifications +--| given by the format string and save the results into +--| the corresponding arguments. +--| +--| Parameters : +--| file_ptr - input TEXT, +--| line_ptr - input_output LINE, +--| format - input STRING, +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg19 - output STRING, +--| arg20 - output STRING, +--| arg_count - input INTEGER +--| +--| Result : STRING representation of given text. +--| +--| Algorithm : +--| Read a line from the file into variable l ( which is aline). +--| split the format string into small tokens consisting of +--| printable characters and control format. +--| depending on control format read from l. Read an other line +--| from the file when length of l has become zero. and format +--| +--| +--| Note: This procedure extracts upto twenty arguments +--| from a line in a file. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read text from a string buffer according to +--| specifications given by a format string and save +--| the result into corresponding arguments. +--| +--| Parameters : +--| string_buf - input String, +--| format - input STRING, +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg19 - output STRING, +--| arg20 - output STRING, +--| arg_count - input INTEGER - the number of arguments passed to fscan +--| +--| Result : STRING representation given TEXT. +--| +--| Note: This procedure extracts upto twenty arguments +--| from a string buffer. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fgetc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read the next character from a file of type +--| ASCII_TEXT. +--| +--| Parameters : +--| stream - input ASCII_TEXT, +--| +--| Result : Returns the ordinate value of the character read. If +--| end of file is reached then return - 1 +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE n : Integer; +--| FILE f_in : ASCII_TEXT IS IN "design.doc"; +--| +--| fgetc(n, f_in); +--| +--| Will return ordinal value of character in integer n +--|----------------------------------------------------------------------------- + PROCEDURE fgetc ( VARIABLE result : OUT INTEGER; + VARIABLE stream : IN ASCII_TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fgetc +--| +--| Overloading : None +--| +--| Purpose : To read the next character from a file of type TEXT. +--| +--| Parameters : +--| stream - input TEXT, +--| ptr - INOUT, LINE +--| Result :Integer, the ordinate value of the character being read. +--| -1 when end of file (EOF). +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| +--| USE: : +--| VARIABLE n : Integer; +--| FILE f_in : TEXT IS IN "design.doc"; +--| +--| fgetc(n, f_in); +--| +--| Will return ordinal value of character in integer n +--|----------------------------------------------------------------------------- + PROCEDURE fgetc ( VARIABLE result : OUT INTEGER; + VARIABLE stream : IN TEXT; + VARIABLE ptr : INOUT LINE + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fgets +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read, at most, the next n characters from a file +--| of type ASCII_TEXT and save them to a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| +--| n -- input, Natural, number of +--| characters to be read. +--| stream -- input, ASCII_TEXT, input file. +--| +--| result : string +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 100); +--| FILE f_in : ASCII_TEXT IS IN "design.doc"; +--| +--| fgets(str_buf, 50, f_in); +--| +--| Will read in at most 50 characters from the file +--| design.doc and place them in str_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgets ( VARIABLE l_str : OUT STRING; + CONSTANT n : IN NATURAL; + VARIABLE stream : IN ASCII_TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fgets +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read, at most, the next n characters from a file +--| of type TEXT and save them to a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| n -- input, Natural, number of +--| characters to be read. +--| stream -- input, TEXT, input file. +--| line_ptr -- inout LINE, +--| +--| result : string +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 100); +--| FILE f_in : TEXT IS IN "design.doc"; +--| +--| fgets(str_buf, 50, f_in); +--| +--| Will read in at most 50 characters from the file +--| design.doc and place them in str_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgets ( VARIABLE l_str : OUT STRING; + CONSTANT n : IN NATURAL; + VARIABLE stream : IN TEXT; + VARIABLE line_ptr : INOUT LINE + ); + +--+--------------------------------------------------------------------------- +--| Function Name : fgetline +--| +--| Overloading : None +--| +--| Purpose : To read a line from the input ASCII_TEXT file and +--| save into a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| stream -- input, ASCII_TEXT, input file +--| +--| result : string. +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE line_buf : string(1 TO 256); +--| FILE in_file : ASCII_TEXT IS IN "file_ascii_in.dat"; +--| +--| fgetline(line_buf, in_file); +--| +--| Will read a line from the file +--| file_ascii_in.dat and place into line_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgetline ( VARIABLE l_str : OUT STRING; + VARIABLE stream : IN ASCII_TEXT + ); + +--+--------------------------------------------------------------------------- +--| Function Name : fgetline +--| +--| Overloading : None +--| +--| Purpose : To read a line from the input TEXT file and +--| save into a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| stream -- input, TEXT, input file +--| +--| result : string. +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| USE: : +--| VARIABLE line_buf : string(1 TO 256); +--| FILE in_file : TEXT IS IN "file_text_in.dat"; +--| +--| fgetline(line_buf, in_file); +--| +--| Will read a line from the file +--| file_text_in.dat and place into line_buf. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fgetline ( VARIABLE l_str : OUT STRING; + VARIABLE stream : IN TEXT; + VARIABLE line_ptr : INOUT LINE + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fputc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose :To write a character to an ASCII_TEXT file. +--| +--| Parameters : +--| c -- input, CHARACTER, +--| stream -- output ASCII_TEXT, +--| +--| Result : +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| This procedure is equivalent to VHDL WRITE(stream, c). +--| +--| USE: : +--| VARIABLE str12 : string(1 TO 12); +--| FILE out_file : ASCII_TEXT IS OUT "file_ascii_out.dat"; +--| +--| str12 := "0123456789ab"; +--| FOR i IN 1 TO 12 LOOP +--| fputc(str12(i), out_file); +--| END LOOP; +--| +--| Will write all the 12 characters to file +--| file_ascii_out.dat +--|----------------------------------------------------------------------------- + PROCEDURE fputc ( CONSTANT c : IN CHARACTER; + VARIABLE stream : OUT ASCII_TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fputc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a character to a TEXT file. +--| +--| Parameters : +--| c -- input, CHARACTER, +--| stream -- output, TEXT, +--| line_ptr -- INOUT LINE +--| +--| Result : +--| +--| Note: : The STD TEXTIO package has declared TEXT as a +--| file of STRING. This is not same as file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str12 : string(1 TO 12); +--| VARIABLE l : LINE; +--| FILE out_file : TEXT IS OUT "file_text_out.dat"; +--| +--| str12 := "0123456789ab"; +--| FOR i IN 1 TO 12 LOOP +--| fputc(str12(i), out_file, l); +--| END LOOP; +--| fputc(LF, out_file, l); -- line feed +--| +--| Will write contents of the str12 to file +--| file_text_out.dat. The characters will be kept in +--| the line pointer l untill line feed character is +--| encouneterd. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputc ( CONSTANT c : IN character; + VARIABLE stream : OUT TEXT; + VARIABLE line_ptr : INOUT LINE + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fputs +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a string to an ASCII_ TEXT file. +--| +--| Parameters : +--| l_str -- input, string +--| stream -- output, ASCII_TEXT, +--| +--| Result : +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 256); +--| FILE out_file : ASCII_TEXT IS OUT "file_ascii_out.dat"; +--| +--| fputs(str_buf, out_file); +--| +--| Will write contents of str_buf to the file +--| file_ascii_out.dat +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputs ( CONSTANT l_str : IN STRING; + VARIABLE stream : OUT ASCII_TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fputs +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a string to a TEXT file. +--| +--| Parameters : +--| l_str -- input, string, +--| stream -- output, TEXT, +--| line_ptr -- INOUT LINE, +--| +--| Result : +--| +--| Note: : The STD TEXTIO package has declared TEXT as a +--| file of STRING. This is not same as file of CHARACTERS. +--| USE: : +--| VARIABLE str_buf : string(1 TO 256); +--| VARIABLE lptr : LINE; +--| FILE out_file : TEXT IS OUT "file_text_out.dat"; +--| +--| fputs(str_buf, out_file, lptr); +--| +--| Will write contents of str_buf to the file +--| file_text_out.dat +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputs ( CONSTANT l_str : IN STRING; + VARIABLE stream : OUT TEXT; + VARIABLE line_ptr : INOUT LINE + ); +--+----------------------------------------------------------------------------- +--| Function Name : Find_Char +--| +--| Overloading : None +--| +--| Purpose : TO find a given character in a string and +--| return its position. +--| +--| Parameters : +--| l_str - input STRING, +--| c - input Character, +--| +--| Result : NATURAL number representing the position of character +--| in the string. returns 0 if character not found in the +--| string. +--| +--| USE: : +--| VARIABLE str14 : string(1 TO 14); +--| VARIABLE indx : integer; +--| +--| str14 :="This is a test"; +--| indx := Fid_Char(str14, 'i'); +--| +--| Will assign value of 3 to the variable indx. +--|----------------------------------------------------------------------------- + FUNCTION Find_Char ( CONSTANT l_str : IN STRING; + CONSTANT c : IN CHARACTER + ) RETURN NATURAL; +--+----------------------------------------------------------------------------- +--| Function Name : Sub_Char +--| +--| Overloading : None +--| +--| Purpose : To subtitute a new character at a given position +--| of the input string. +--| +--| Parameters : +--| l_str - input STRING, +--| c - input Character, +--| n - input Natural, position at which character +--| is to be substituted. +--| Result : STRING +--| +--| USE: : +--| VARIABLE str14 : string(1 TO 14); +--| VARIABLE indx : integer; +--| +--| str14 :="This is a test"; +--| IF ((indx = Find_Char(str14, 't')) /= 0) THEN +--| str14 := Sub_Char(str14, 'T', indx); +--| END IF; +--| +--| Will assign the value "This is a Test" to str14. +--|----------------------------------------------------------------------------- + FUNCTION Sub_Char ( CONSTANT l_str : IN STRING; + CONSTANT c : IN CHARACTER; + CONSTANT n : IN NATURAL + ) RETURN STRING; +-- +-- related to time +-- +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a time. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Time +--| +--| NOTE : +--| +--| Use : +--| VARIABLE t : time ; +--| +--| t := From_String (" 893.56 us"); +--| This statement will set t to time 893.56 us. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN TIME; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.7 +--| Overloading : None +--| +--| Purpose : Convert Time to a String. +--| +--| Parameters : +--| val - input, TIME, +--| format - input string +--| +--| Result : STRING representation of TIME. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN TIME; + CONSTANT format : IN STRING := "" + ) RETURN STRING; + +END std_iopak; + + + + diff --git a/src/hdl/pkg/qlaser_dac_dc_pkg.vhd b/src/hdl/pkg/qlaser_dac_dc_pkg.vhd new file mode 100644 index 0000000..eef161e --- /dev/null +++ b/src/hdl/pkg/qlaser_dac_dc_pkg.vhd @@ -0,0 +1,30 @@ +---------------------------------------------------------------------------------------- +-- Project : qlaser FPGA +-- File : qlaser_dac_dc_pkg.vhd +-- Description : Version package file. +-- Author : akozyra +---------------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; + +package qlaser_dac_dc_pkg is + +---------------------------------------------------------------------------------------- +-- Constants +---------------------------------------------------------------------------------------- + +-- Addresses +constant C_ADDR_SPI0 : std_logic_vector(2 downto 0) := "000"; +constant C_ADDR_SPI1 : std_logic_vector(2 downto 0) := "001"; +constant C_ADDR_SPI2 : std_logic_vector(2 downto 0) := "010"; +constant C_ADDR_SPI3 : std_logic_vector(2 downto 0) := "011"; +constant C_ADDR_SPI_ALL : std_logic_vector(2 downto 0) := "100"; +constant C_ADDR_INTERNAL_REF : std_logic_vector(2 downto 0) := "101"; +constant C_ADDR_POWER_ON : std_logic_vector(2 downto 0) := "110"; + +-- Commands +constant C_CMD_DAC_DC_WR : std_logic_vector(3 downto 0) := "0011"; +constant C_CMD_DAC_DC_INTERNAL_REF : std_logic_vector(3 downto 0) := "1000"; +constant C_CMD_DAC_DC_POWER : std_logic_vector(3 downto 0) := "0100"; + +end package qlaser_dac_dc_pkg; diff --git a/src/hdl/pkg/qlaser_pkg.vhd b/src/hdl/pkg/qlaser_pkg.vhd new file mode 100644 index 0000000..89bd4ab --- /dev/null +++ b/src/hdl/pkg/qlaser_pkg.vhd @@ -0,0 +1,146 @@ +------------------------------------------------------------------------------- +-- Filename : qlaser_pkg.vhd +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use work.qlaser_dac_dc_pkg.all; +-- use work.qlaser_dac_ac_pkg.all; + +-------------------------------------------------------------------------------- +-- FPGA constant definitions +------------------------------------------------------------------------------- +package qlaser_pkg is + +-- FPGA internal (PLL) clock freq expressed in MHz +constant C_CLK_FREQ_MHZ : real := 100.0; +-- Clock period +constant C_CLK_PERIOD : time := integer(1.0E+6/(C_CLK_FREQ_MHZ)) * 1 ps; + +constant C_NUM_CHAN_DC : integer := 32; -- Number of DC channels +constant C_NUM_CHAN_AC : integer := 32; -- Number of AC (pulse) channels + +-------------------------------------------------------------------------------- +-- FPGA Addresses +-- Main blocks. Decoded from upper 4 bits of address [15:12] +-------------------------------------------------------------------------------- +constant ADR_BASE_DC : std_logic_vector( 3 downto 0) := X"0"; -- Registers to load DC DAC values +constant ADR_BASE_PULSE : std_logic_vector( 3 downto 0) := X"1"; -- RAMs for Pulse output start/stop times +constant ADR_BASE_MISC : std_logic_vector( 3 downto 0) := X"2"; -- Misc, LEDs, switches, power control + +-------------------------------------------------------------------------------- +-- Define the number of internal blocks that are addressed by the CPU +-------------------------------------------------------------------------------- +constant C_NUM_BLOCKS : integer := 3; +type t_arr_cpu_dout is array (0 to C_NUM_BLOCKS-1) of std_logic_vector(31 downto 0); +type t_arr_dout_ac is array (0 to C_NUM_CHAN_AC-1) of std_logic_vector(15 downto 0); + + +-------------------------------------------------------------------------------------------------------------------------- +-- 'DC' DAC block registers. 32 16-bit DAC outputs [5:3] +constant C_ADDR_CH_SPI0 : std_logic_vector(2 downto 0) := "000"; +constant C_ADDR_CH_SPI1 : std_logic_vector(2 downto 0) := "001"; +constant C_ADDR_CH_SPI2 : std_logic_vector(2 downto 0) := "010"; +constant C_ADDR_CH_SPI3 : std_logic_vector(2 downto 0) := "011"; +constant C_ADDR_CH_SPI_ALL : std_logic_vector(2 downto 0) := "100"; +constant C_ADDR_INTERNAL_REF : std_logic_vector(2 downto 0) := "101"; +constant C_ADDR_POWER_ON : std_logic_vector(2 downto 0) := "110"; + +-------------------------------------------------------------------------------------------------------------------------- +-- Individual DAC data registers +constant ADR_DAC_DC0 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "000"; -- +constant ADR_DAC_DC1 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "001"; -- +constant ADR_DAC_DC2 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "010"; -- +constant ADR_DAC_DC3 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "011"; -- +constant ADR_DAC_DC4 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "100"; -- +constant ADR_DAC_DC5 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "101"; -- +constant ADR_DAC_DC6 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "110"; -- +constant ADR_DAC_DC7 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "111"; -- + +constant ADR_DAC_DC8 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI1 & "000"; -- +constant ADR_DAC_DC9 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI1 & "001"; -- + +-- constant ADR_DAC_DC6 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI2 & "000"; -- +-- constant ADR_DAC_DC7 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI2 & "001"; -- +-- etc. etc. +-- constant ADR_DAC_DC6 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI3 & "110"; -- +-- constant ADR_DAC_DC7 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI3 & "111"; -- +constant ADR_DAC_DC30 : std_logic_vector(15 downto 0) := ADR_BASE_DC & X"01E"; -- +constant ADR_DAC_DC31 : std_logic_vector(15 downto 0) := ADR_BASE_DC & X"01F"; -- + +constant ADR_DAC_DC_ALL : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_CH_SPI_ALL & "000"; -- Write all channels +constant ADR_DAC_DC_IREF : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_INTERNAL_REF & "000"; -- +constant ADR_DAC_DC_POWER_ON : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_POWER_ON & "000"; -- +constant ADR_DAC_DC_STATUS : std_logic_vector(15 downto 0) := ADR_BASE_DC & X"000"; -- Reading any address returns SPI interface busy status (this was 32 bit, but decleared as 16, so I changed to 16) + + +-------------------------------------------------------------------------------------------------------------------------- +-- 'Pulse' DAC block registers. +-- The block has a set of block registers and contains 16 'channels' +-- Each channel has a 40-bit memory to specify 24-bit time and a 16-bit level. +-- Initially just using the MSB of the level to drive a single pin output +-- +-------------------------------------------------------------------------------------------------------------------------- +-- Block-level registers +-- CPU_ADDR(11) = '0' selects local regs +-- CPU_ADDR(11) = '1' selects the channel specified in reg_ctrl(3 :0) +-- Then CPU_ADDR(10:1) selects RAM word address (1024 address MAX) +-- CPU_ADDR(0) selects MSB or LSB of 40-bit RAM word (time or amplitude) +-------------------------------------------------------------------------------------------------------------------------- +-- Addresses for block-level registers. +------------------------------------------------------------------------------------------------------------------------- +constant ADR_DAC_PULSE_CTRL : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"800"; -- 4:0 select channel RAM for CPU read/write. Bit 8 is rising edge internal trigger +constant ADR_DAC_PULSE_STATUS : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"801"; -- R/O Level status for output of each channel +constant ADR_DAC_PULSE_RUNTIME : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"802"; -- Max time for pulse train +constant ADR_DAC_PULSE_CH_EN : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"803"; -- Enable bit for each individual channel +constant ADR_DAC_PULSE_TIMER : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"804"; -- R/O Current timer value (used by all channels) +------------------------------------------------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------------------------------------------------- +-- Pulse Channel offsets +-------------------------------------------------------------------------------------------------------------------------- +constant ADR_DAC_PULSE0 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"000"; -- Base address of a 16-word x 40-bit RAM +constant ADR_DAC_PULSE1 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"040"; -- +constant ADR_DAC_PULSE2 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"080"; -- +constant ADR_DAC_PULSE3 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"0C0"; -- +-- +constant ADR_DAC_PULSE4 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"100"; -- +constant ADR_DAC_PULSE5 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"140"; -- +constant ADR_DAC_PULSE6 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"180"; -- +constant ADR_DAC_PULSE7 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"1C0"; -- +-- +constant ADR_DAC_PULSE8 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"200"; -- +constant ADR_DAC_PULSE9 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"240"; -- +constant ADR_DAC_PULSE10 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"280"; -- +constant ADR_DAC_PULSE11 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"2C0"; -- +-- +constant ADR_DAC_PULSE12 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"300"; -- +constant ADR_ADC_PULSE13 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"340"; -- +constant ADR_DAC_PULSE14 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"380"; -- +constant ADR_DAC_PULSE15 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"3C0"; -- +-- +-- etc. etc. +constant ADR_DAC_PULSE28 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"700"; -- +constant ADR_DAC_PULSE29 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"740"; -- +constant ADR_DAC_PULSE30 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"780"; -- +constant ADR_DAC_PULSE31 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"7C0"; -- + + + +-------------------------------------------------------------------------------------------------------------------------- +-- Misc block registers +-------------------------------------------------------------------------------------------------------------------------- +constant ADR_MISC_VERSION : std_logic_vector(15 downto 0) := ADR_BASE_MISC & X"000"; -- HDL code version +constant ADR_MISC_LEDS : std_logic_vector(15 downto 0) := ADR_BASE_MISC & X"001"; -- LEDs +constant ADR_MISC_LEDS_EN : std_logic_vector(15 downto 0) := ADR_BASE_MISC & X"002"; -- LEDs enable +constant ADR_MISC_SW_IN : std_logic_vector(15 downto 0) := ADR_BASE_MISC & X"003"; -- Read board switch settings (if present) +constant ADR_MISC_DEBUG_CTRL : std_logic_vector(15 downto 0) := ADR_BASE_MISC & X"004"; -- Select debug output from top level to pins + + +end package; + +package body qlaser_pkg is + +end package body; + diff --git a/src/hdl/tb/tb_cpubus_dacs_pulse_channel_pd.vhdl b/src/hdl/tb/tb_cpubus_dacs_pulse_channel_pd.vhdl new file mode 100644 index 0000000..770c704 --- /dev/null +++ b/src/hdl/tb/tb_cpubus_dacs_pulse_channel_pd.vhdl @@ -0,0 +1,394 @@ +----------------------------------------------------------- +-- File : tb_cpubus_dacs_pulse_channel.vhd +----------------------------------------------------------- +-- +-- Testbench for CPU bus peripheral. +-- +-- Description : Pulse output control of Qlaser FPGA +-- Block drives AXI-stream to JESD DACs +-- +---------------------------------------------------------- +library ieee; +use ieee.numeric_std.all; +use ieee.std_logic_1164.all; +use std.textio.all; + +use work.std_iopak.all; + + +entity tb_cpubus_dacs_pulse_channel is +end tb_cpubus_dacs_pulse_channel; + +architecture behave of tb_cpubus_dacs_pulse_channel is + +signal clk : std_logic; +signal reset : std_logic; +signal enable : std_logic; +signal start : std_logic; +signal cnt_time : std_logic_vector(23 downto 0); +signal busy : std_logic; +signal cpu_wr : std_logic; +signal cpu_sel : std_logic; +signal cpu_addr : std_logic_vector(15 downto 0); +signal cpu_wdata : std_logic_vector(31 downto 0); +signal cpu_rdata : std_logic_vector(31 downto 0); +signal cpu_rdata_dv : std_logic; + +-- AXI-stream output interface +signal axis_tready : std_logic := '1'; -- Always ready +signal axis_tdata : std_logic_vector(15 downto 0); +signal axis_tvalid : std_logic; +signal axis_tlast : std_logic; + +-- Halts simulation by stopping clock when set true +signal sim_done : boolean := false; + +-- Crystal clock freq expressed in MHz +constant CLK_FREQ_MHZ : real := 100.0; +-- Clock period +constant CLK_PER : time := integer(1.0E+6/(CLK_FREQ_MHZ)) * 1 ps; + +-- Block registers +constant ADR_RAM_PULSE : integer := 0; -- base address for pulse RAM, TODO: this constant should eventually go to qlaser_pkg +constant ADR_RAM_WAVE : integer := 512; -- + + + + +------------------------------------------------------------- +-- CPU write procedure. Address in decimal. Data in hex +------------------------------------------------------------- +procedure cpu_write( + signal clk : in std_logic; + constant a : in integer; + constant d : in std_logic_vector(31 downto 0); + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +begin + wait until clk'event and clk='0'; + cpu_sel <= '1'; + cpu_wr <= '1'; + cpu_addr <= std_logic_vector(to_unsigned(a, 16)); + cpu_wdata <= std_logic_vector(d); + wait until clk'event and clk='0'; + cpu_sel <= '0'; + cpu_wr <= '0'; + cpu_addr <= (others=>'0'); + cpu_wdata <= (others=>'0'); + wait until clk'event and clk='0'; +end; + +------------------------------------------------------------- +-- CPU write pulse definition RAM +-- Use 96 bit data to make three 32-bit writes +------------------------------------------------------------- +procedure cpu_write_pulsedef( + signal clk : in std_logic; + + constant num_entry : in integer; + + -- TODO: Partial ? list of parameters + constant pulsetime : in integer; -- Pulse time in clock cycles + constant timefactor : in real; -- Fixed point time scale factor + constant gainfactor : in real; -- Fixed point gain value. Max value 1.0 is hex X"8000". Gain 0.5 is therefore X"4000" + constant wavestartaddr : in integer; -- Start address in waveform RAM + constant wavesteps : in integer; -- Number of steps in waveform rise and fall + constant wavetopwidth : in integer; -- Number of clock cycles in waveform top between end of rise and start of fall + + + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +-- Vectors for converted values +variable slv_pulsetime : std_logic_vector(23 downto 0); -- For 24-bit pulse time +variable slv_timefactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point timestep +variable slv_gainfactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point gain +variable slv_wavestartaddr : std_logic_vector( 9 downto 0); -- For 10-bit address i.e. 1024 point waveform RAM +variable slv_wavesteps : std_logic_vector( 9 downto 0); -- For 10-bit number of steps i.e. 0 = 1 step, X"3FF" = 1024 points +variable slv_wavetopwidth : std_logic_vector(16 downto 0); -- For 17-bit number of clock cycles in top of waveform + +variable slv_entry_data : std_logic_vector(95 downto 0); -- Vector for entire memory entry + +-- constant ADR_PULSE_DEF : integer := to_integer(unsigned(X"?????")); -- Use address of pulse definition RAM from qlaser_pkg +-- Define the number of fractional bits +constant BIT_FRAC : integer := 4; -- TODO: this should be defined in qlaser_pkg +begin + + -- Convert each field into its std_logic_vector equivalent + slv_pulsetime := std_logic_vector(to_unsigned(pulsetime, 24)); + slv_timefactor := std_logic_vector(to_unsigned(integer(timefactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_gainfactor := std_logic_vector(to_unsigned(integer(gainfactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_wavestartaddr := std_logic_vector(to_unsigned(wavestartaddr, 10)); + slv_wavesteps := std_logic_vector(to_unsigned(wavesteps, 10)); + slv_wavetopwidth := std_logic_vector(to_unsigned(wavetopwidth, 17)); + + + --etc, etc. + + -- Build full entry out of component fields. Final length should be 96 bits. + slv_entry_data := "000" & slv_pulsetime & slv_timefactor & slv_gainfactor & slv_wavestartaddr & slv_wavesteps & slv_wavetopwidth; -- This might not correct + + -- Write 96-bit entry in 3 writes. (Address is an integer) + cpu_write(clk, ADR_RAM_PULSE+(4*num_entry) , slv_entry_data(31 downto 0), cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + cpu_write(clk, ADR_RAM_PULSE+(4*num_entry)+1 , slv_entry_data(63 downto 32), cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + cpu_write(clk, ADR_RAM_PULSE+(4*num_entry)+2 , slv_entry_data(95 downto 64), cpu_sel, cpu_wr, cpu_addr, cpu_wdata); +end; + +------------------------------------------------------------- +-- CPU write procedure. Address and Data in decimal +------------------------------------------------------------- +procedure cpu_write( + signal clk : in std_logic; + constant a : in integer; + constant d : in integer; + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +begin + cpu_write(clk, a , std_logic_vector(to_unsigned(d,32)), cpu_sel, cpu_wr, cpu_addr, cpu_wdata); +end; + + +------------------------------------------------------------- +-- CPU read procedure +------------------------------------------------------------- +procedure cpu_read( + signal clk : in std_logic; + constant a : in integer; + constant exp_d : in std_logic_vector(31 downto 0); + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0); + signal cpu_rdata : in std_logic_vector(31 downto 0); + signal cpu_rdata_dv : in std_logic +) is +variable v_bdone : boolean := false; +variable str_out : string(1 to 256); +begin + wait until clk'event and clk='0'; + cpu_sel <= '1'; + cpu_wr <= '0'; + cpu_addr <= std_logic_vector(to_unsigned(a, 16)); + cpu_wdata <= (others=>'0'); + while (v_bdone = false) loop + wait until clk'event and clk='0'; + cpu_sel <= '1'; + if (cpu_rdata_dv = '1') then + if (cpu_rdata /= exp_d) then + fprint(str_out, "Read exp: 0x%s actual: 0x%s\n", to_string(to_bitvector(exp_d),"%08X"), to_string(to_bitvector(cpu_rdata),"%08X")); + report str_out severity error; + end if; + v_bdone := true; + cpu_sel <= '0'; + cpu_addr <= (others=>'0'); + end if; + end loop; + wait until clk'event and clk='0'; + wait until clk'event and clk='0'; +end; + +------------------------------------------------------------- +-- CPU read pulse definition RAM +-- Use 96 bit data to make three 32-bit writes +------------------------------------------------------------- +procedure cpu_read_pulsedef( + signal clk : in std_logic; + + constant num_entry : in integer; + + -- TODO: Partial ? list of parameters + constant pulsetime : in integer; -- Pulse time in clock cycles + constant timefactor : in real; -- Fixed point time scale factor + constant gainfactor : in real; -- Fixed point gain value. Max value 1.0 is hex X"8000". Gain 0.5 is therefore X"4000" + constant wavestartaddr : in integer; -- Start address in waveform RAM + constant wavesteps : in integer; -- Number of steps in waveform rise and fall + constant wavetopwidth : in integer; -- Number of clock cycles in waveform top between end of rise and start of fall + + + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +-- Vectors for converted values +variable slv_pulsetime : std_logic_vector(23 downto 0); -- For 24-bit pulse time +variable slv_timefactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point timestep +variable slv_gainfactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point gain +variable slv_wavestartaddr : std_logic_vector( 9 downto 0); -- For 10-bit address i.e. 1024 point waveform RAM +variable slv_wavesteps : std_logic_vector( 9 downto 0); -- For 10-bit number of steps i.e. 0 = 1 step, X"3FF" = 1024 points +variable slv_wavetopwidth : std_logic_vector(16 downto 0); -- For 17-bit number of clock cycles in top of waveform + +variable slv_entry_data : std_logic_vector(95 downto 0); -- Vector for entire memory entry + +-- constant ADR_PULSE_DEF : integer := to_integer(unsigned(X"?????")); -- Use address of pulse definition RAM from qlaser_pkg +-- Define the number of fractional bits +constant BIT_FRAC : integer := 4; -- TODO: this should be defined in qlaser_pkg +begin + + -- Convert each field into its std_logic_vector equivalent + slv_pulsetime := std_logic_vector(to_unsigned(pulsetime, 24)); + slv_timefactor := std_logic_vector(to_unsigned(integer(timefactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_gainfactor := std_logic_vector(to_unsigned(integer(gainfactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_wavestartaddr := std_logic_vector(to_unsigned(wavestartaddr, 10)); + slv_wavesteps := std_logic_vector(to_unsigned(wavesteps, 10)); + slv_wavetopwidth := std_logic_vector(to_unsigned(wavetopwidth, 17)); + + + --etc, etc. + + -- Build full entry out of component fields. Final length should be 96 bits. + slv_entry_data := "000" & slv_pulsetime & slv_timefactor & slv_gainfactor & slv_wavestartaddr & slv_wavesteps & slv_wavetopwidth; -- This might not correct + + -- Write 96-bit entry in 3 writes. (Address is an integer) + cpu_read(clk, ADR_RAM_PULSE+(4*num_entry), slv_entry_data(31 downto 0), cpu_sel, cpu_wr, cpu_addr, cpu_wdata, cpu_rdata, cpu_rdata_dv); + cpu_read(clk, ADR_RAM_PULSE+(4*num_entry) + 1, slv_entry_data(63 downto 32), cpu_sel, cpu_wr, cpu_addr, cpu_wdata, cpu_rdata, cpu_rdata_dv); + cpu_read(clk, ADR_RAM_PULSE+(4*num_entry) + 2, slv_entry_data(95 downto 64), cpu_sel, cpu_wr, cpu_addr, cpu_wdata, cpu_rdata, cpu_rdata_dv); + +end; + + +------------------------------------------------------------- +-- Delay +------------------------------------------------------------- +procedure clk_delay( + constant nclks : in integer +) is +begin + for I in 0 to nclks loop + wait until clk'event and clk ='0'; + end loop; +end; + + +---------------------------------------------------------------- +-- Print a string with no time or instance path. +---------------------------------------------------------------- +procedure cpu_print_msg( + constant msg : in string +) is +variable line_out : line; +begin + write(line_out, msg); + writeline(output, line_out); +end procedure cpu_print_msg; + + +begin + + ------------------------------------------------------------- + -- Unit Under Test + ------------------------------------------------------------- + u_dac_pulse : entity work.qlaser_dacs_pulse_channel + port map ( + clk => clk , -- in std_logic; + reset => reset , -- in std_logic; + + enable => enable , -- out std_logic; + start => start , -- out std_logic; + cnt_time => cnt_time , -- out std_logic_vector(23 downto 0); -- Set to '1' while SPI interface is busy + + busy => busy , -- out std_logic; -- Set to '1' while SPI interface is busy + + -- CPU interface + cpu_wr => cpu_wr , -- in std_logic; + cpu_sel => cpu_sel , -- in std_logic; + cpu_addr => cpu_addr( 9 downto 0) , -- in std_logic_vector(11 downto 0); + cpu_wdata => cpu_wdata , -- in std_logic_vector(31 downto 0); + + cpu_rdata => cpu_rdata , -- out std_logic_vector(31 downto 0); + cpu_rdata_dv => cpu_rdata_dv , -- out std_logic; + + + -- AXI-Stream interface + axis_tready => axis_tready , -- in std_logic; -- Clock (50 MHz max) + axis_tdata => axis_tdata , -- out std_logic_vector(15 downto 0); + axis_tvalid => axis_tvalid , -- out std_logic; -- Master out, Slave in. (Data to DAC) + axis_tlast => axis_tlast -- out std_logic; -- Active low chip select (sync_n) + ); + + + ------------------------------------------------------------- + -- Generate system clock. Halt when sim_done is true. + ------------------------------------------------------------- + pr_clk : process + begin + clk <= '0'; + wait for (CLK_PER/2); + clk <= '1'; + wait for (CLK_PER-CLK_PER/2); + if (sim_done=true) then + wait; + end if; + end process; + + + ------------------------------------------------------------- + -- Reset and drive CPU bus + ------------------------------------------------------------- + pr_main : process + variable v_ndata32 : integer := 0; + variable v_ndata16 : integer := 0; + begin + -- Reset + reset <= '1'; + enable <= '0'; + start <= '0'; + cnt_time <= (others=>'0'); + + cpu_sel <= '0'; + cpu_wr <= '0'; + cpu_wdata <= (others=>'0'); + cpu_addr <= (others=>'0'); + + cpu_print_msg("Simulation start"); + clk_delay(5); + reset <= '0'; + + clk_delay(5); + enable <= '1'; + + + clk_delay(20); + + + ---------------------------------------------------------------- + -- Load pulse RAM with a series of pulse start times + ---------------------------------------------------------------- + v_ndata32 := 128; -- Time for first pulse + cpu_print_msg("Load pulse RAM"); + for NADDR in 0 to 15 loop + -- cpu_write(clk, ADR_RAM_PULSE + NADDR , v_ndata32 + (NADDR*(1024+32)), cpu_sel, cpu_wr, cpu_addr, cpu_wdata); -- TODO: rn don't know how to make it write three difference places, for now I', just gonna manually write it + cpu_write_pulsedef(clk, NADDR, v_ndata32 + (NADDR*(1024+32)), 1.0, 1.0, 0, NADDR*32, 512, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + end loop; + cpu_print_msg("Pulse RAM loaded"); + clk_delay(20); + + ---------------------------------------------------------------- + -- Read back Pulse RAM. + ---------------------------------------------------------------- + v_ndata32 := 128; -- Time for first pulse + for NADDR in 0 to 15 loop + cpu_read_pulsedef(clk, NADDR, v_ndata32 + (NADDR*(1024+32)), 1.0, 1.0, 0, NADDR*32, 512, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + end loop; + clk_delay(20); + + wait for 10 us; + + cpu_print_msg("Simulation done"); + clk_delay(5); + + sim_done <= true; + wait; + + end process; + +end behave; + diff --git a/tools/sim/README.md b/tools/sim/README.md index 8b13789..07c6b38 100644 --- a/tools/sim/README.md +++ b/tools/sim/README.md @@ -1 +1,2 @@ +Please put your modelsim.ini file in this directory and compile modelsim in this directory. diff --git a/tools/sim/compile.bat b/tools/sim/compile.bat new file mode 100644 index 0000000..90718fc --- /dev/null +++ b/tools/sim/compile.bat @@ -0,0 +1,2 @@ +echo off +vsim -c -quiet -do compile.do \ No newline at end of file diff --git a/tools/sim/compile.do b/tools/sim/compile.do new file mode 100644 index 0000000..90e2eb3 --- /dev/null +++ b/tools/sim/compile.do @@ -0,0 +1,8 @@ +vlib work + +vcom ../../src/hdl/ip_gen/*.vhd* +vcom ../../src/hdl/pkg/*pkg.vhd +vcom ../../src/hdl/pkg/iopakp.vhd +vcom ../../src/hdl/pkg/iopakb.vhd +vcom ../../src/hdl/modules/*.vhd* +vcom ../../src/hdl/tb/*.vhd* \ No newline at end of file diff --git a/tools/sim/run.do b/tools/sim/run.do new file mode 100644 index 0000000..e54505a --- /dev/null +++ b/tools/sim/run.do @@ -0,0 +1,13 @@ +do compile.do + +vsim -voptargs="+acc" -lib work tb_cpubus_dacs_pulse_channel + +do waves_do/pp_rw_cpu.do + +view wave +view structure +view signals + +run -all + +# End diff --git a/tools/sim/waves_do/pp_rw_cpu.do b/tools/sim/waves_do/pp_rw_cpu.do new file mode 100644 index 0000000..918713f --- /dev/null +++ b/tools/sim/waves_do/pp_rw_cpu.do @@ -0,0 +1,34 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/reset +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/clk +add wave -noupdate -radix unsigned /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cnt_time +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/busy +add wave -noupdate -radix binary /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_addr +add wave -noupdate -radix hexadecimal /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_wdata +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_wr +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_sel +add wave -noupdate -radix hexadecimal /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_rdata +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_rdata_dv +add wave -noupdate -radix unsigned /tb_cpubus_dacs_pulse_channel/u_dac_pulse/ram_pulse_addra +add wave -noupdate -radix hexadecimal /tb_cpubus_dacs_pulse_channel/u_dac_pulse/ram_pulse_dina +add wave -noupdate -radix hexadecimal /tb_cpubus_dacs_pulse_channel/u_dac_pulse/ram_pulse_douta +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/ram_pulse_we +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {480433536 fs} 0} +quietly wave cursor active 1 +configure wave -namecolwidth 150 +configure wave -valuecolwidth 172 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits fs +update +WaveRestoreZoom {0 fs} {1953088753 fs}