【python之旅】python的面向对象
一、面向过程 VS 面向对象
1、编程范式
编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,实现一个任务的方式有很多种不同的方式, 对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式。不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式。
两种最重要的编程范式分别是面向过程编程和面向对象编程。
2、面向过程编程(Procedural Programming)
Procedural programming uses a list of instructions to tell the computer what to do step-by-step.
面向过程编程依赖你猜到了procedures(过程),一个procedure包含一组要被进行计算的步骤,面向过程又被称为top-down
languages,就是程序从上到下一步步执行,一步步从上到下,从头到尾的解决问题
。基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个小问题或子过程,这些子过程再执行的过程再继续分解直到小问题足够
简单到可以在一个小步骤范围内解决。
这样做的问题也是显而易见的,就是如果你要对程序进行修改,对你修改的那部分有依赖的各个部分你都也要跟着修改,如果程序开头你设置了一个变量值为1,如果其它子过程依赖这个值为1的变量才能正常运行,那如果改了这个变量,那这个子过程也要修改,假如又有一个其它子程序依赖这个子过程,那就会发生一连串的影响,随着程序越来越大,这种编程方式的维护难度会越来越高。
如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程的方式是极好的,但如果你要处理的任务是复杂的,且需要不断迭代和维护的,那还是用面向对象最方便了。
3、面向对象编程(Object-Oriented Programming)
OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。
- 世界万物,皆可分类
- 世界万物,皆为对象
- 只要是对象,就肯定属于某种品类
- 只要是对象,就肯定有属性
二、面向对象的几个核心特性如下
1、Class(类)
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
2、Object(对象)
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同
3、Encapsulation(封装)
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
4、Inheritance(继承)
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
5、Polymorphism(多态)
多态是面向对象的重要特性,简单说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。
对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作,
他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”,
因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。
多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定
三、面向对象编程(Object-Oriented Programming )介绍
- 写重复代码是非常不好的低级行为
- 你写的代码需要经常变更
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author :GU
class Dog:
def __init__(self,name):
self.name = name
def bulk(self):
print("%s: wang wang wang!" % self.name)
d1 = Dog("test1")
d2 = Dog("test2")
d3 = Dog("test3")
d1.bulk()
d2.bulk()
d3.bulk()
####执行结果;
test1: wang wang wang!
test2: wang wang wang!
test3: wang wang wang!
一个简单的类
开发正规的程序跟那种写个运行一次就扔了的小脚本一个很大不同就是,你的代码总是需要不断的更改,不是修改bug就是添加新功能等,所以为了日后方便程序的修改及扩展,你写的代码一定要遵循易读、易改的原则(专业数据叫可读性好、易扩展)。
先用非OOP的方式写出游戏的基本角色
#role 1
name = 'Alex'
role = 'terrorist'
weapon = 'AK47'
life_value = 100
money = 10000 #rolw 2
name2 = 'Jack'
role2 = 'police'
weapon2 = 'B22'
life_value2 = 100
money2 = 10000 #role 3
name3 = 'Rain'
role3 = 'terrorist'
weapon3 = 'C33'
life_value3 = 100
money3 = 10000 #rolw 4
name4 = 'Eric'
role4 = 'police'
weapon4 = 'B51'
life_value4 = 100
money4 = 10000
roles = {
1:{'name':'Alex',
'role':'terrorist',
'weapon':'AK47',
'life_value': 100,
'money': 15000,
},
2:{'name':'Jack',
'role':'police',
'weapon':'B22',
'life_value': 100,
'money': 15000,
},
3:{'name':'Rain',
'role':'terrorist',
'weapon':'C33',
'life_value': 100,
'money': 15000,
},
4:{'name':'Eirc',
'role':'police',
'weapon':'B51',
'life_value': 100,
'money': 15000,
},
} print(roles[1]) #Alex
print(roles[2]) #Jack
- 被打中后就会掉血的功能
- 开枪功能
- 换子弹
- 买枪
- 跑、走、跳、下蹲等动作
- 保护人质(仅适用于警察)
- 不能杀同伴
def shot(by_who):
#开了枪后要减子弹数
pass
def got_shot(who):
#中枪后要减血
who[‘life_value’] -= 10
pass
def buy_gun(who,gun_name):
#检查钱够不够,买了枪后要扣钱
pass
继续按照这个思路设计,再完善一下代码,游戏的简单版就出来了,但是在往下走之前,我们来看看上面的这种代码写法有没有问题,至少从上面的代码设计中,我看到以下几点缺陷:
- 每个角色定义的属性名称是一样的,但这种命名规则是我们自己约定的,从程序上来讲,并没有进行属性合法性检测,也就是说role 1定义的代表武器的属性是weapon, role 2 ,3,4也是一样的,不过如果我在新增一个角色时不小心把weapon 写成了wepon , 这个程序本身是检测 不到的
- terrorist 和police这2个角色有些功能是不同的,比如police是不能杀人质的,但是terrorist可能,随着这个游戏开发的更复杂,我们会发现这2个角色后续有更多的不同之处,但现在的这种写法,我们是没办法 把这2个角色适用的功能区分开来的,也就是说,每个角色都可以直接调用任意功能,没有任何限制。
- 我们在上面定义了got_shot()后要减血,也就是说减血这个动作是应该通过被击中这个事件来引起的,我们调用 get_shot(),got_shot()这个函数再调用每个角色里的life_value变量来减血。 但其实我不通过got_shot(),直接调用角色roles[role_id][‘life_value’] 减血也可以呀,但是如果这样调用的话,那可以就是简单粗暴啦,因为减血之前其它还应该判断此角色是否穿了防弹衣等,如果穿了的话,伤害值肯定要减 少,got_shot()函数里就做了这样的检测,你这里直接绕过的话,程序就乱了。 因此这里应该设计 成除了通过got_shot(),其它的方式是没有办法给角色减血的,不过在上面的程序设计里,是没有办法实现的。
- 现在需要给所有角色添加一个可以穿防弹衣的功能,那很显然你得在每个角色里放一个属性来存储此角色是否穿 了防弹衣,那就要更改每个角色的代码,给添加一个新属性,这样太low了,不符合代码可复用的原则
class Role():
def __init__(self,name,role,weapon,life_value=100,money=15000):
#构造函数
#在实例化时做一些初始化工作
self.name = name ###实例变量(静态属性),作用域就是实例本身
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money def shot(self): ##类的方法,功能(动态属性)
print("shooting...") def got_shot(self):
print("ah...,I got shot...") def buy_gun(self,gun_name):
print("%s just bought %s" %(self.name,gun_name)) r1 = Role('Alex','police','AK47') #把一个类变成一个具体的对象的过程叫实例化(初始化一个了类,生成一个角色)
#
r2 = Role('Jack','terrorist','B22') #生成一个角色(相当于role的一个实例)
r1.buy_gun("AK47")
#执行结果:
Alex just bought ak47
- 代码量少了近一半
- 角色和它所具有的功能可以一目了然看出来
class Role(object): #定义一个类, class是定义类的语法,Role是类名,(object)是新式类的写法,必须这样写,以后再讲为什么
def __init__(self,name,role,weapon,life_value=100,money=15000): #初始化函数,在生成一个角色时要初始化的一些属性就填写在这里
self.name = name #__init__中的第一个参数self,和这里的self都 是什么意思? 看下面解释
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money
上面的这个__init__()叫做初始化方法(或构造方法), 在类被调用时,这个方法(虽然它是函数形式,但在类中就不叫函数了,叫方法)会自动执行,进行一些初始化的动作,所以我们这里写的 __init__(self,name,role,weapon,life_value=100,money=15000)就是要在创建一个角色时给它设 置这些属性,那么这第一个参数self是干毛用的呢?
初始化一个角色,就需要调用这个类一次:
r1 = Role('Alex','police','AK47’) #生成一个角色 , 会自动把参数传给Role下面的__init__(...)方法
r2 = Role('Jack','terrorist','B22’) #生成一个角色
我们看到,上面的创建角色时,我们并没有给__init__传值,程序也没未报错,是因为,类在调用它自己的__init__(…)时自己帮你给self参数赋值了,
r1 = Role('Alex','police','AK47’) #此时self 相当于 r1 , Role(r1,'Alex','police','AK47’)
r2 = Role('Jack','terrorist','B22’)#此时self 相当于 r2, Role(r2,'Jack','terrorist','B22’)
- 在内存中开辟一块空间指向r1这个变量名
- 调用Role这个类并执行其中的__init__(…)方法,相当于Role.__init__(r1,'Alex','police',’AK47’),这么做是为什么呢? 是为了把'Alex','police',’AK47’这3个值跟刚开辟的r1关联起来,是为了把'Alex','police',’AK47’这3个值跟刚开辟的r1关联起来,是为了把'Alex','police',’AK47’ 这3个值跟刚开辟的r1关联起来,重要的事情说3次, 因为关联起来后,你就可以直接r1.name, r1.weapon 这样来调用啦。所以,为实现这种关联,在调用__init__方法时,就必须把r1这个变量也传进去,否则__init__不知道要把那3个参数跟谁关联 呀。
- 所以这个__init__(…)方法里的,self.name = name , self.role = role 等等的意思就是要把这几个值 存到r1的内存空间里。
def buy_gun(self,gun_name):
print(“%s has just bought %s” %(self.name,gun_name) )
上面这个方法通过类调用的话要写成如下:
r1 = Role('Alex','police','AK47')
r1.buy_gun("B21”) #python 会自动帮你转成 Role.buy_gun(r1,”B21")
- 上面的这个r1 = Role('Alex','police','AK47’)动作,叫做类的“实例化”, 就是把一个虚拟的抽象的类,通过这个动作,变成了一个具体的对象了, 这个对象就叫做实例
- 刚才定义的这个类体现了面向对象的第一个基本特性,封装,其实就是使用构造方法将内容封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的内容
2、类变量
a、什么是类变量,类变量有什么用途?
aaarticlea/png;base64,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" alt="" width="414" height="161" />
b、类变量的用途:
大家共用的属性,为了节约内存
B、面向对象编程的增删改
#########修改==============
class Role():
n = 123
def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money def shot(self):
print("shooting...") def got_shot(self):
print("ah...,I got shot...") def buy_gun(self,gun_name):
print("%s just bought %s" %(self.name,gun_name)) r1 = Role('Alex','police','AK47') #把一个类变成一个具体的对象的过程叫实例化(初始化一个了类,生成一个角色)
r1.name = "test1"
print(r1.n,r1.name)
r2 = Role('Jack','terrorist','B22') #生成一个角色
r2.name = "test2"
print(r2.n,r2.name)
###执行结果
123 test1
123 test2
=================添加===================
class Role():
n = 123
def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money def shot(self):
print("shooting...") def got_shot(self):
print("ah...,I got shot...") def buy_gun(self,gun_name):
print("%s just bought %s" %(self.name,gun_name)) r1 = Role('Alex','police','AK47') #把一个类变成一个具体的对象的过程叫实例化(初始化一个了类,生成一个角色)
r1.name = "test1"
r1.bullet_prove = True
print(r1.n,r1.name,r1.bullet_prove)
###执行结果:
123 test1 True
只是对r1的添加
=================删除====================
class Role():
n = 123
def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money def shot(self):
print("shooting...") def got_shot(self):
print("ah...,I got shot...") def buy_gun(self,gun_name):
print("%s just bought %s" %(self.name,gun_name)) r1 = Role('Alex','police','AK47') #把一个类变成一个具体的对象的过程叫实例化(初始化一个了类,生成一个角色)
r1.name = "test1"
r1.bullet_prove = True
print(r1.weapon)
del r1.weapon
print(r1.n,r1.name,r1.bullet_prove,r1.weapon)
##执行结果:
Traceback (most recent call last):
File "C:/Users/Administrator/PycharmProjects/s14/day6/cs.py", line 51, in <module>
print(r1.n,r1.name,r1.bullet_prove,r1.weapon)
AttributeError: 'Role' object has no attribute 'weapon'
AK47
因为删除了weapon所以后面在打印就会报错
增删改
C、析构函数
作用:
在实例释放、销毁的时候执行的,通常用于做一些收尾工作,如关闭数据库连接,关闭打开的临时文件
class Role():
n = 123
def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money
def __del__(self):
print("%s 彻底死了" %self.name)
def shot(self):
print("shooting...") def got_shot(self):
print("%s ah...,I got shot..." %self.name ) def buy_gun(self,gun_name):
print("%s just bought %s" %(self.name,gun_name)) r1 = Role('Alex','police','AK47')
r1.buy_gun("Ak47")
r1.got_shot()
del r1 ###在程序结束前执行
r2 = Role('Jack','terrorist','B22')
r2.got_shot()
#在程序或者实例释放的时候执行 ##执行结果:
Alex just bought Ak47
Alex ah...,I got shot...
Alex 彻底死了
Jack ah...,I got shot...
Jack 彻底死了
三、类成员的修饰符
类的所有成员在上一步骤中已经做了详细的介绍,对于每一个类的成员而言都有两种形式:
- 公有成员,在任何地方都能访问
- 私有成员,只有在类的内部才能方法
私有属性和公有属性的定义不同:私有属性命名时,前两个字符是下划线。(特殊成员除外,例如:__init__、__call__、__dict__等)
class C:
def __init__(self):
self.name = '公有属性'
self.__foo = "私有属性"
如何让私有属性可读,在类里面定义一个公有属性去调用私有属性,然后再外面调用刚刚定义的公有属性
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA3EAAACsCAIAAABaXrJ3AAAgAElEQVR4nOydd1wTZx/A71VrtbXb7mG1lYqjttZqHVStuEeddbd1r9ZVZ6vmSCDMAIGw9957770JGwIEwg6QvXdy7x+sAAFRULR9vp/7h/Dkuecud8997/csCAEAAAAAAAAAAMYHNNkFAAAAAAAAAAC88ACnBAAAAAAAAACMF+CUAAAAAAAAAIDxApwSAAAAAAAAADBegFMCAAAAAAAAAMYLcEoAAAAAAAAAwHgBTgkAAAAAAAAAGC/AKQEAAAAAAAAA4wU4JQAAAAAAAABgvACnBDzv0NIsjMOIrWzZZBfkMSDa/nwrtFmhVE12QQAAAAAAeEYApwQ819DSLPRs3KNKqAKJcrLL8hjQqxNsbm64EdICtBIAAAAA/xHG5JQiJifGLOi0SX330y7O00LUSsyL906gTHY5AI8FLd3y5NlbNhn1rGcplI2lCZ41DJF8nDJIr3a7e2A9Pl8GrBIAAAAA/wVGdUqxqDU2detWb90Nrovmms4/VtwyEbvktXcHory2bvXu24Iv3a2snYicNcGsTXO5s1V37fKdx865lD+tvQCeArQ0wz2XH/hmNfKfvlGyyLkWEVEGIZEGIZF3HG1vZnbwZGPYKY/sER6NDYk0CIk0CIlwrObI1b8kbA67uG3FteAWBbBKAAAAAPzrGdUpFXJBGzXcl3jlRxT0yoQ4paSjsvLvtY5aX1l8fTY3Pr7Wm5Cwcw7mtXecjt55Slop4VDr4vF3Dn7z5YbjwClfIGhphnv2nXPMaeLIn8HeJNzuqpbWsqaWssq0W9Z2f2U82imZdZkmARHOpU3Eppayppay3PBTrsH2VRz1+KawOeySzsJzQS0gVgkAAACAfzuPbvvmU2n2ByfGKaUMWoy+67uvmH61Pz22SYwgslZi6cWFKAgy+2ZjZsH4Mh8FVmUU9sC6f6dTcsrSc4hlDYKJzJNVGJdeXtcmmsg8HxNamuGeZXvuR5V1PetulKxStI39zUc7ZWeIpws6s7VNrOrVxYakYxaEv3Jog9u6hc22u2ZrG+QpVMAqAQAAAPCv5lk6pby7uua+jj70HmEtukGMIAiiEnN5NTkNCQlNucUszrgyHw0eKQF3fNu/0ynJoTZeIeGl7InMs8YT6xaTVsubyDwfswTuv/ygc8Q2g/JMgpSDGKNTUnOu4L08W2WyflUUMiqaW+vY0qHyyPDc/dJnxwJbQagSAAAAAP9qnqVTytrLyv9YhII+tFlnNiE9M8fKv9gpW6If3MEaBU2oUzYEXL5sZJ80iU5Z47Br8drTTgWt/Gc/1nuMTtmQ/Cvez58qG8NIHobn7mlv7/EA7d8AAAAA+FcDnPIFhlMW8vDo0hUn7k+gUzILPK7u1lpxznxUp2TmRqZWNlLFQz5m5ISnVDV1Dv34calx2L34453Y9AbmJEwfNPFOiTA8d41FKlVKeR5u0+Yt226EdTxWkQEAAAAAeA4Y5pRySXdx4XldD11dT11dT11d7y26gTtWj+SUCnZbi/3Z/sSeujuDz5mRaepJpEJKeu4ZXQ9dXXedlTafzoKhl7FvzXfs+0rguZsVpPEcAYuc5XZHt599587fswsOditgDiQZcEphS2EA9tfepPsvwz5FLE15dldEE673Z3nwKjZwQNr45Aw31LGe/5xF2QaEBZv/qaurq6t76C+z8NzCZMf7R3v+eR7tnN32JEfUlu2MOT9wREfv34dNglNS6vh9CVrSbVFndXV1f/xO68M3X5753twlK9f3pb5qFVE2dMonNtEP8+cBXTVu2CVU0welaYwzvPmbrq6uzjfzZr/20isfai1b1Z/nLZeM+t7TycxzvnN2r67O0k03PXMHenEychz+Or1HV2fpptu+hU3DOnfWhtw6f3hg76etrLAPgkvJdInG46eFXflu7jfnvcvbhaOcpaaKNKuIcHRQ72ZTWh6UVtvClyqGJ+2qIERF96VMTuwSi0fRxVGdklwcaxQSjg4KR3u6HTJ3uOwTptdXAPsqtnwkaSw3WDL1rWspo89VqVLIc+5+BEFTpr17wAdIJQAAAABeNAY5pZwvKHYKWfOt+QezzU9YUJKTyWE+WUe19GfNgjU4pVBADkvUWWW7RMvqFJ6SnEyJ8Cm6vA4z6yPCjt9jfKv7kinl/C56fjIlObne3yFpz+co6G3Lr8/nJSdTkpMpycktBUQ290lLzyJnuT44dPKebWByD4F2mHM/vvPZuv0nPaoHkvU45cofL9xDXzl50cw7OTk5OTnSxfTGoV2H//YuHqSVAkqOt94B3X0nbpkGJycnJydHOGKvHNTZeNGw1yvlvO7GRMLlnQvnrtlvHFXf3NaSZn9hu/Y8neMWCW10Ric52+XuL8cOHoaDKxtoo0mRRtqynTF/nb1p7hHWe0RuqN/2rXz3w923rFJb+8vYXV+en5ycnJzsen/v6h/WHn/oENGbPLm4to2lFidkE/0wf+zafvou3iOyL0lykNGNY3t/feBf0DxQPn5HFTE3OTk5Odnhrw1LV+heNHGP6ktf0tDNk/Ykk9AbSvOdr65duO6UXeaAU0poZGKe0x8rv/rxrFPeYKesDbl9/sINI8+QmN7cCBfW/Lj0g9m/2mY1aI6utvqd/XbOfmzGyGFKWkpiAj61NIfcUtnSVtnSVlkUd93L+zQhPo0pGBwkFRRlJ5hEZMbUN5X1pCxIuBcQ/jCLwpZokE8EeYRT8pgd1a1tlS1tlfmRxy09rUqbSpvbespQz5GOqIxky7VTp2yye0SgUimnumyH/jf1pW/+yZ/M8VEAAAAAADwJak4pFrVFJnz7ucGrs81P2rY1shEEUcnEworYkmvrhsUpZeL2zOzDX5nNnuP2MLy9iYMgCCIXS0iJhZfWoKa/Yr7+eGn10H1NdNu3qKPIG3dh/z+BDf0BLymvuzLS9PKJPbsMkgcClTxSAu741598t+eOW2pJNbUn3icXkGLMTu3S+d06d0AqBZRM+z+P7jyICqpsZvZolJxPoyTb3vxVd9MlXGpz76mqiTA4dmjP9cAaBEEQUXUo+vDWTecd8jgIgiCtKV521mZh5Mf2SQThVvn/fe/6HceMTm7fQoTCbnKW05/bD557EFTOH/aFGv8ru3fuHaXtuy7g6s7F01desEmlDIx2kTJTzA5u2H3OJrVBQyHLnI6s23ZitLZvou3eVVsGOSWCIAhSbL3j+81DnJKeabjv3N/OCbVccZ/DcVuI0fo/L9j9IKicqjFQWWKpu+jD/eb5lBEOik3JfBiZk93GlfTP+yjm1NdlP7AP9W/mqnfBpJTF/eOXENnQzekPIYrZtcWxZ1z8vOoFQo1W+RTavnuccpUZ6ZGN3/Sa5JSUVGLrOJVSxeUqo6Nlx4+PLxsAAAAAAB6DfqdU8rtarHcZQ9MNP9mSnKv2NNfYn1LYRfe9jJs1w0Rrb3a5WmRIzqAnohwhCP3RIm/7oVI50U7Jb0i3uXN4G5zAUP9UIezIjfaxtI7p7P+IR0rAHV+/Yq9xMkOqlrI9x/X6wRX7DRK6ej8QUDLs/9y5/sBdX9JgWxK3pTv9ufXHbdfce+WNXuh565fdR1AxLQiCIJREszM/fnfofkQDgiC8Mn9vDzu/iidZnZqRbXfhwuU7viWDdE7Grgqwd/WLLh7eTv9IpxR0ksryU4j1HexB+lbh/rvu9iPGsdUaQsQT6pTtIVfXHkH5EtsH7V7SnW123y61RvN0RWS3o19/emRkp+yuiLsWnFfKEg0aEy4XlGelRrTxef2myKc4e7tgsto7JYNdTlyLd3Q6H09miDVJ5SQ65QSgolIV5uYyXV35Dz/If/jhae8OAAAAAIB++pxSLqHmZOjOQk1/y3ybWbt6+6Emp5R1Vpeefhc1432rvVaDB2oIuRU+YXMh1PSPbHbadSGDmGinVDCrYsxOLJ2z+dzDyHr1z4U8djdVTR9HGKMz1CkF9YkWp9av+vmfsEYpMhh5Z577XztXb7roWNDTAN6Z7XLt5LEzdrkcBOnMCkL/Mv+Ln4+h41oQXlWot4e9H/EJopQIImtNMD2381vtY/o+Beo96mRsGp3J5A2fV+eRTjkISoLJrV83bNiwYcP32h+8teRZOKWkxuXUhjXLv7vuWdyivi9Jd2snV6h57slWv7PfzvnpThSpe+jP0IO0i2jo4X/HJyuXLVRXVSmfw5QqBtasac+75eDjVM/lDVXHFjcnl+O2yfk8iQbxf2pOeTSQ/zSdUhkdLb94sUcl+7entzsAAAAAAIbQ55QiQaN34CwInvGuxS9uTPUUGpxSJmxMTPgBQk192eCDhc4bNrgPbOtcVizGvQrB0HvWPxg2D97XhI/7VojY7Tneemc3vqu1fMOGDRuOXoGjyBrSjdEpqXkeN3UX655yJg53GXlDovnp1d/svRXSY69yarbLrXO//eFcxOGXJ0bZXTm47+Tx8455nNYUb28XmxTqkx2RjNNRF2V8bPfaeUt/2LBhw4aLxn6Fo2U1JqekJJrd/m3Dhg0bvj/8h6FzQGpqaqrznS3frX8WTolIaPVE96vfrVzxzcq1GzZs2HDPt6T1Ef1nJamolVpzDtsWNY+QUC5opZZbO/vc8g5+GBgGB+bkc0TDW9FZVXGXbZ0ueAQ/CAiDA9U3vwt420O46GSuSIO0Pg2nTL/x9tRF6BLlU5j3XEWlKpycZHv2DLFJ4JQAAAAAeMb0OaVQQHb2hcbolBIBOTLmawg1Y7bFln8q09KaNGw57cSWIXPKPJW5hKR8OqU8LS3W2+LK1vlvvKu1fP3uM3dc8gYdwhidsjXL6cqPC7ad86rUsJ/mVOuLaxbt+tOvt0VfTo4zPndwyx/Oqblp8ZH+trZ6Zw9uu+aWlhEfGRoQ1/IkLd+9COmU6qK0tAirazuXzftg3tcr1x/62yG5TqPhPdIpWcW+er+t+nD9iZtWgWlppeROjgRBnmHbN4IgCMJrKyvKTUsL0tu36JPP5i1dsWb975aJ9TTNo74RBOHG3Vz+xeY7kSMFKhEEQSTdXV2k1vbs9JALBNc/vYMfBCTGdgiEah7YVRZ9ycYTV0gubm6vah2+MVgKpQZtfApOWfDg06mL7+ZMcJhSSSTKb9/WqJLqm2zPHvnFi/KLFxXm5gonJ4WTk5JIVBKJqrq6iSwNAAAAAP7z9DmlVNQSHTUfQo3JKZXiloLM7RBq6rtWa01bkbHyNOenVIjY7bWF6elx3hY39i9dsve6ulaO0SmZpcGoPd+vPWqRMbzjIr8qHHN41Q9HDOL72qTFNeH6J48fuGvtnBQbHFRYFor+bde2q2iTgNjQkMpxKGUfMk5HXVleenqE1bX9ut+u/9NGk+Q9wilZxe7Xdmot2HzGJpHMUVe4Z+uUvUho5JKC7PT0IL29y7//br9R/IhayY27ufzr3Q9j6ugjS2UPMgGT3NFR3Vbn6e91wys2qn1AK7vKoi/Z+LpTePwRRnhrZuKdsuD+Z1MX380RTIxSqrhchb//SIHJJ9hkuro90ilHo3ulMz29xzsnorwAAAAA+K/Q55QqaVdl7m4INeVN3DKDQcKnsT9lV23lH1+goNdwiy6UD+k1ifB51YEJu49FeVcN+ccEOyWLXJbqZ58zaIAOohCxyUn2N07uP2Sa0S+VY3RKeXeR772fN++8EjA8gtOe5XBl/9qD6Mimfl0U10QYnDupo3vdNiSoWCiuDkX/dmLNusv4sJCSJxy225oVEZ8QVzPY5WScjkLP2/uOXUaHVQ2zPA1O2ZSUlF9a2jNFZV3A1Z2L52y/51vYPbgv5mM6ZX1kZH5dXf/5HLtTkoKsIotqugYHrCV0coLJgeUHMWGVXSNJZbHZL8uXXXUvax8+1p2WnFNH4YoHH5CczWj0DfA0yGuj9U0+Ke0sQju4onLbmRq6bXbFEtuFGqcTmnCnLLj/6bTdts2CcRulqq5OjkZPlEo+3tYjnbdv90pndHRvsJP7xPOAAQAAAODfRv+4b5WI1ul13ByaZvDhyqjY/jHTcnFbZta2d1HQFKO5K1ML+xLLGLSEf5ygqZi3F3uiEtVVR9pZWfLnYivtg5nFQx83E+yU3LoMR/1zFwOHCqCiLd/T4I8dDwYGfo/RKRG5oCbK5Oz6lb/pJVIGpeSTE8xP7d990iabrRaBpBd43jr4xWfbLtsnURGElud2Y/8Xc7ZfcUzpRJ6MzjT72xh926yhE17LKnyv/nnnjs/wgd8dCdijG/b9aZ/Z3vdJU4RPZGp6XY+rVXqf36Y9Q/cv99whnTL7nbK5IDatpLpZfURRS9itbSsP3w8u6Z86vd7XISyP2NIfM2wOurLhu6P6MZXq06bTs4wPLPvom8FOSfG9ug/jkd04dC13SYb+j7/oeZdoHviNIIiEFnrj2+UHDeIbmENDlcy4qFCfGiZraCxYTkzx1suidIn6TFEuSI/zvOSSmsMVD8mjgZgSTGYJNPrgBDtle9CxT7++nEQbQ5BSpZRlG/+4bv1Pfwa3a/q/kkicwPDkxG6y48d7W9idnBROTgp//17ppD5hz2IAAAAAvHAMzE+pkkvbCgtPzIdfmmG+Zn9BGYIgcklnXs6RRWavQjAEoV9+xXztwTC3Hi9TyFnV9dhD5lOnG7y/wu+0ZyeCIIhU2Jyedegb64Vf+Zhk84eFoCbYKfkNGTYXv39n2YEb9tkDwUpRa7HP3d/2/GqUPCAjXcUB/2xdotEpdRduveQ7sI6PhNuQaHNl37LNl0wT+rSyqzTM5Lc1O44+8CoePIe5vDPb5dqh3UewsS0yBJFTsxz//OXn48ZxrU/a8s3Itr+wZ9nnP/1JiFcLVnLKQ1BHj543CizjDxv4LWuOwvzyk+5JXByZjyAI0pTk4h4Q1j9zj7DW797ORZ9/dAAdVN5niI1xhjeOLtN6/80lR4xjqwt8XKNy8lrUA3ZSsv+NTau3XnXJaRUiCILUR1o4hSSTaANeJq3zvvzjykW/41PJvZZLz7TB2t7av/DLzz+Yv/T7G+598wC1h1xd+8PSxfsN40hqIUlamvmRtQceRBCpmgd+IwiCINxW72urf7jtXtYxJFTJSYnyue7ub1bYwVBbD4fVkGfgHhHYylLvtSjgUHz8fe74xsVQhaLetPyCjFjLjJom/gir3ozNKRmlYScsfR/plG1Bp7XW/hHRMpYgpUohy7r9AQRNmfbOPi+NUokgCIIoo6NlGzdOukQ+tnSCbp0AAADwb0d9HR2VXCIiZ1TjjltOn4n7WsdVZ43z8mU2n34bcHQD6rX3LU8RWvKKqP0zwihlMgalKdglZt1LmFlzbHV0XHXWOH23zPbrHclRRLp6TzleR7ffPVcdHZfvv7X+6BUYmm7wxlw7HR1XHR3Pw+ez0gat5PgYKDqK/fVPLt506uq5rSt1dHR0dNauXauz+qe9R285pZI6e4NljJokuwtLv/rkzZlvvjd/w5l77gVMBEGETXk+8N6v53/0xsw339fac8MovrEvVwGjhRTjir18cJlODyt2nbiE8y+rbWcPi4yR40yMUVe8e+ailFOzHG3xxn5P3plSVhV46+KZbQeOnzi6aZVOHz9s/vUGLow4aHmcga9w2hPMT+5ep/3tKh0dHZ3f71rFV9EF/e4pY7eRQvV2bVo1/+sVvdmdum/hG5sZYXZmi863i77bfskitqJrcBhPymwOR+/drLNk+WodHR2ds3quGWS2aJB2MpvSrH7VXbdyWc+J1zl42zK0KMzgFIpgF5CYWdXCEvacBGmW0cafL5w9+8uOXRtW9x/Rim2XTHwyGzii4ZMjqcNtTTA6s+kiIaV5UKxSUZrm9yAu3TYkTD8g5KF/73Y3MDWmvpMmUww2QTmL0Z2fHnbbN/gfv56UAYT8xmqmZIhRMuuyjIPDHviHPPT2/N3C5riD399+IQ/9Qx7EVrZI1fLk1bmEhKP8Q+44Ox4yt7/oGXzfP+Shf8iD7FapYpg3tged1jphUjwmo0QQRKnoctsJ/W/qS98+KBy194SKy1U4OU26Jk6wdIJunQAAAPCCM3S9b5Vczm6mZmW19G457QUVrCZSS14htUVD1ymlRMCr6U+c1ZKV215SLxgSoZSLJe01amkGtrbiMuYjh2GMiEzA6KCUkyjN9cVZA+SXVDWz1GJqPFpTZf//SmtaWTIEQRRCVltt/7eKq+q7B0UgJdzOxor+HInVIy2yKGZ3UNso9F4BkPNptG4qYxxroIgYzU3N9eR6UmWh2hEVVjfRhoco+xHSG6uJvUnLG6icofFhYTe5ijiQWwWliytFZKzWmrL8rKzi2naWhvVkBF21FUW9X6hspvOH/0ZSZlMlMa//FJE7uWIOldLJ4g1eS5vfUVXX2tpUU1qcN1CELGIDjT9KiLIfCY3seXfzBYckirpVCrn0Vq6gm95N7qCS2vu2Ls5IkUeZgNlA7exP2SZQDNc/KZ9Bpqrl1r91c0XqUwDJ+S3UztrhyZiiYfsuwK3a87d3LX3sQ3NUKiY5Kzs7p6JD0+vDsNRU6qR1r5ysDXTrBAAAgOeYoU4JADxX8NrKg7B7rjunNQ/rWPk8U4DbcMTAp6RN+BSmpByEkkgcPtX5f3YD3ToBAABgEgFOCXje4bWVkdoYotHHzDxnsBtzKzqeulD2o4yOHj58Rz2Bqq5OWVysYUtLUzg6atzkFy5o3J7bcUJjkk7QrRMAAACeGsApnx4deZ76p1c/mlNot5y2yS4s4MVH4eSkPnzn2RdAs7YWFyujozWbKw43orlO0jgk0K0TAAAAnhjglE8PMbu9oSL30VSQNY+/AQAeFxWX29/JcrLL8lRQcbkjmavCz09zwBWNHslcn1A9QbdOAAAA0ARwSgDg34aKSpVfvDjZpXiBUVGpI5rrSF0Fbt3qV1UFDtfzYW/vAtCtEwAA/DcATgkAAAAAAAAAGC/AKQEAAAAAAAAA4wU4JQAAAAAAAABgvACnBAAAAAAAAACMF+CUAAAAAAAAAIDxApwSAAAAAAAAADBeBpxSoVCwWKxJLAoAAAAAAAAA4AVlwCnlcjmNRpvEogAAAAAAAAAAXlCAUwIAAAAAAAAAxgtwSgAAAAAAAADAeAFOCQAAAAAAAAAYL8ApAQAAAAAAAADjBTglAAAAAAAAAGC8AKd8rmGX+Dt6ecdUcwd/zEzIid1vZ7fULli/ojaiJPl3N7uldp43Csi1kskpJwAAALw4tOK93FbZ2S21i4sSdPlGua9xsFtq52fXIRYpJ6dAKqWc4vX7KZ/Wydk9ADBBAKd8fmET/W3tLF3TG9kihfrnlLr03x2xM2AYQjlciIk8EWT/KhqGYPT6mOJMzmQVFgAAAF4MCrOcFxiip8AwhPLzrIpdZI6dCsMQrH+6gs+VT0J5VEpFo+dvRyxTG+jSSdg9ADBxAKd8TmGXBDy4cfWOW3rLYKFEhG0u0R5fYGAINvkpIuZmqO8yLAaC4W8Ckv3ahQLFCNkBAIBHIqGnFsZut/W5lEFqmOyyvGDwyWZhvmtswx1aGM/7yhmcirMEo1f0YAhleZ6Yf9PO4jW0HgTDO9Ip1XylQvXMy6NSNHqcWLQTnfYshVIq5hdmh7uQeM9ul4D/BMAphyCpTy36a5vL8VtF+czJKwW7xOf2w7t6gUXsoUZZRIzbZWkwDUU4kEiMqck85WY+o1coRf8xoWy3D/Baa2u7xNZ2iU9mJkck6/mYW3Xb23V5TCVFIJvc8gFGRdzUXny55+dz8j6RVtfd87GMW1Gd8rN74MWSzmdVEgm5seimh+0SW9slNlZzTA2no6y2R5VUPepr7S1lcKDtElvb/XG5iWOoK1opRfcCbJfY9m8B94oaX/CWTn5qZvgeZ9sltrZLCBazDTBTUW7o+s5xP0U6nIN91vXe2hnJTGGvanFr/vF1XxFVVssbj3txQsLtPtHX+x/KXb+hPbc4UMsIM2W8QpmLXfHdN0uWLHmYKpGrtZ1n63+LzlQoR89UpWj0OPTpSftGxlM3SoVUVF8UfcPd7y8Pvxtu3ped3AxLx9CypRDTW4qM3P3+8vD7y8PvbmC0Zz3/aRcV8MICnHIw/O5Y06BF0/U+/THUKls4SYVgl/jcuXTulnNax9BahklCBdu/qkc4kFhayGhwiPH8Ut9sY2R2DO2/JpTcqHj3xYborUk1Xgmen+PM5kSU1fOlCIIUZ7l8ZYQ/W9ZFkz37gANgjMi7umseuJp8YeV0JavCIMDyFSuP34mdCIKw6E0WfmYLHMNcup7ZK4FKLBG00rsru7vzqvP+cDeF4LE4JSezMHq9PgqC4Rl2QQ9qRpdKdkZR4l5z0zdtvS7m1VZ2N3unBq02xrxp6vFXUWPLxB3JM0fB5bHrad2V3d2pOcHLLQ2gCXBKbmyS1zdGmM0Jle6JPvPNcZ+FESu5EgRBSnI8lpjgTxI7OqTjuLVb07+3MJwKu+s3dHYxy87bms6E8RdLmuuETyyUrb6nF1wkFJWWVzpc0jrhVi/ryyj7zqY72ezRlVKlpLgf/Fjnbt6zsDSVSikWsFvpzNbuzsrypKuERzulXMyryo/+2z8+lMJspTNbqa35WWGnPSI864BWAjQCnHIwCkGxf9LOTwy/25cS1TJBvbU5nZmZDamlojEmZ5f43tl78CQ6uHJIjBJhJmSErrL0OJtFIgmlpJqUo3YWWyJzExhi8ST1K5802nN0bUymWQZ7UnkcYfV1Au4Ng0BPOk+ItJk6WrxjGR5CF4iBUj63iJk5eQFvG5p/F1xQKeaV1MT/qIdb7pdfiYjqKNkHTCxWhxPJk/GOxKFWo/1wY3NKRR0p6wQBBcGwlnesZ8dovfA41Ip//PAzjR2PZNTUSRQIIsgtjN5sCkMo2xPpNeSJPIJJo6MyZp01dgKcsiNvh53ZSxaBzq1slpB0287iLYMAp04OH2m3cLV6zzLUt5MnevJbuxXvYvWmVbgbhUZXKPPT7OcY4C+VtDWJlU9eg+bAX6y7nTDlLHMAACAASURBVEaTKhGEn//3+p2OZKlChSBIi/d+XbhQOKpS9hjla4c8n36McjBKCbM56+ajnVLGZlY7ufk6VPP4PTekhNdUFHHUztuigjvqFwH/WYBTDkEl5gla6+mUNoFgojprN9V5+Ra75AjGmDoBe2rf9j/thgcpETmXz2lgcLrFMgWCSMT8FiajVfDfE0oEoZaFLMQZQB7ZxWyxCqHo2Zi/DWN/L6GXlER8Z2awPb21SfyIBifAJCLmUP2jrSETm/VpTTJESGpM34HSm+Pgj6/r8I+z/9LGHVMvmYyREo/llIhMKupg0apotAbO6AM7xCVliT9b6EGEgL8ruxUIgiBKkYjXTKdV0ZjtAsm/Y1DGRDllZ0X4txZYyD0jiyFSIU1YB/y7MPZ4UWdRafRqC+zWFErd6Jb2CKTdDHoNky9QqlQIIuAzamnMbtk4hBJBWh23vXoykCVRIAiCkK3Wv7Xdvl6qUCEtLjtPenSNPopcqUi/9+GsZc8mSDl4z2NzSpmgvSLhsnNUfH8YXqWUiXhtLA7jP/jYAYwJ4JRPndbkXBiOdRijUzbFoo/v2fGHY1bXf6sx+7EoSHP6wlgP8s4r50gQhO7sg38fAx/ML7ltZzVbz828g8sDRvkcw6I347zRkKntTxktCCJtbis+jUN9bOdwOTPnsKHZUo/UjEnqCvtYTjlmhPnFsdtMUZBN4MNq+oTl+pwxUU5ZlOGqbaIHeWXnM0UIwnAPsPlEH96bU3TLweYDPVfjFhb7Obu10/56d+a5UEGPU0ojz8zUwVVKFars+zvQOezRm9NVivQbb09Zhi559q8VY3RKKb+VGHPaOTaJ/awKBnjheSGdklFLy/QrrR5bYlpFnRkq9HZI91hz72wLsM/4y7l5hB5Skpp4UphHbePYMuNUVOsfJyzaFTVGp2yKRR9fufoEJqp+IpSSXJN2zisIW93+zMY7TBhc0gM/9+U2NgsJXkZkJmNwHCg72W6eEdznlCxPf6sP9OGDgYFzjIwWhZRV8WX/wXdomVQUE2e30iU9b6JzFvKZ/lGOm/xyiWP/jlxQX5/2M4Gw0MZhU0BS3ODBpUxak5EHqt8pW9pLLliiPjY3/9nH50MLx3OFXWPtJjLRPKZTcnJLU44QfK5m11FGSwaccjC8Wkyg5wobm4UEL/1aWtfgWzs31WmBCdznlCyfYJtP9eG9AQHzTEwWBhNLuNLn7dZO+HPWzHMhvU6JJFzuccqsO5vQRcJHKKUy/cbbU6b+HjEJkepJcUpJV01+AMatfCLyAjy3vFBOKeIQAxK3axPmz3XeeTSXyOhOwodqaxO0tQna2u7HrpbVDCQVVMZkn9QmaGsT5n+Oe2ep2zHnDgRBBI1NLjfdtbUJ2tqep+5V1g2k5xGDMk70ZPWlxQcLXA8b1w+TUG6+d+pRbau5H7scv1lWg3By3VOO9O7d5bf7pUXqU2i0Njn97a+tTdD63OztWehprxp98Ll1X1H9blk3NGs+Qnae0+UtP2y55pI3vocPPSotcieBMM/MaBba8UpxVUBh3CFngjahd9sSW5xBHzY9uoBCiPJbTRhIpk0gaHskeLaw+gcr0RqyTvs6ag9JQyBsT0r6y9v7p74/dyRVlXGGxJp4CalBWx3UvuWZEtXNE49wAJ1VkSstsFNgGIIxPySQ6gd3RGgo9Ftghulzyhasg8U7MPw6FjsVdjdsZXJGaRxrzdJ1dRhe/v057czHflqxfIMdltoMzap3i4+/b2OzqP9Pv0KKSr1UTHc/64HENjaL/Ys1jNVQKaW0gkNDcraxXx5cojZeWCkU194lEBZYW3+MxbxpFBbakXtALf0yZ3czjcNAlBJaa/Y+9Zwd3bZlqw9EltGY5dcIhK+s8B9gDT+3iYtkN5p6qeXs5nNv6Gz8vUj4tPB425dhGIL13rR0vjE4mYDd7hZq3ueUwjpK5h40ahoaPcvAYrFbSrJk5B9CSEvJCx1+tlf5Rlo2TED74Vicsr2lDBXQs1+rz0yNZqII+xIqSMPTianhWRE/EQjaBOvPzYxnoWEIYzjbHN9XZr/bhQ2afhYRsSz1pIva0blG4kidT9p3jR6RGrFD/VwFZYZ28BBEkJUfc9Cp/3P3W8Smxn6z4TdaRfqtGlYP+LSxRhm0OHan7KqOWWdl2HNrr4itquQNurUpxUFf4/T7nLLV1NnqPT34NSx2qp4bmkJnjnJrt+XsdNdQNe3Lauka5YoaNzW41a9cCO91yhb7LTPWmlWS3fde9Ox+xOzpKhXFev2UKcuMRwuOKBXyklSfa2692w1PP7OSCr+Yag2nWCHj12dcde1J6XfHLzljlKtmVKeUCLlZST7X3HyuuXr9YedwyMLhrEtvAW75R7o/wegcTnOxyyXtr76c+926LWb5CIdS4HRBu4fvtx0xSOwa9g1Re2nQwx3aamw8dNl34FTRaxLxp7W1tTcdu2oTFG9xSltbW1t784kbQcWUXI87W7W1tbVX779EyBz6HO0qDTP6tS/LNYeuOeYwHvtoAKPyQjmlUiFi84rCCy+txX3xlfexK+4H7xZnkugkEp0YX27wq73OsbiAXq9UirmCVhKdRGoKNAtb+aXrMeemxiwi5o9QTEBrcXTRzR3mn64Nsczujx0qRWx+C4lOIrVH2MRsXe6oySkVQha/Miznoq7L+k2BZy8Hn7xVnEqik0j0JJfkX3+0PnBXTStlUgaVTSLRSSSy43Vf3dVBer6tJBKdRKKTSOwO+kidqBjZdhd0dx0fd5hSzuVzi4pjt9saQrD+W2a4D42t9sXnR7bTSTXp+5zNp2NNVkcWZTAGtLK2IvE3N9xsrP6a8JzAJjqJTifR6VkFET/a4N43d7ld2tosRRAEkUsExKLw1XgsBMMQyvFSYY1jovvXpvB0Q8PX0S7Xi0hhucHLLQ2mG/qaU2gDjk0tPunn9LGR/qa40thWOolOD4hz1DIz/MgSf6Goo1mTV8poBcdszF6BYQhlca6UOmSkp6whYamlEWQTH88USDmlp6xMX4VhCIYht6xizogdfQqzPNdaG71kFe7e3F5Jp5PodI9Qs7f1YQiGZwSWtYsetwufgsVhuAYYzEDDEMrLitpVTa+/b4uZpgdDVjGRbA6VTnfyQ0/Tgw/kd1ezhAO/eGPCAgL+PQx8qJBOotNraDR7H9T/9E2+tLHVU4t3KZXy5HjrryxNZmH0jxf1/iLVXdSQaKsp+mYLHYJ9+86vUiVp62wPiMRDsN4UPcOPLXDvGQe70emkbmpuWcQSPb23rZzXZQwSGLGIGxpt9aW58Tsm5hdK6CR6d2ET8Rxeb7oxfrVHdGjvc0YlV4iaWhscQi0gWO8ljPHHePwCK0/jRjqpgxKa5DoFjfnAzkujVqqknGJiyHwUCoL1P7MNcqUNupxVgu6kNFcIi18dXdUl4xDLIpeiUBAMQya2G1MbR3rNYNCarIMtPrGwXRWal9lzfVYXXHBAQTA81dL1WCH1MX8+DYzFKWVSUSebTqLTk4uTDtrAEDyCUyplHAGngU4n0dsC0kN1jGHIyvtSfn3P70iiszuE0mGzOtSbx3nPMTX6ISDBiUwn0emxORGbrQ3eMbM4kFyS8yTLGci5fE4jKeOAizkEw9+HZPq2CTgyJYIoBUJuQrrfD+YwZB9mUtHSIZL23GGk8oQTbrjZWMza8Lzg5t6rLjM/fC0B9765y52ytpYRaq6xO6WcVnTK3nwWDEMo81PFbS2SQbe2vDF5pZUxRIgN7+ZJuOUXbHGv9dzarunZzBEtrTjH5ycb45etwhwb2yrodBKd7hVu+T4WhmB4hj+x4WlOKyaNOjdrk1WNWKZCECT1+tvfw/nVDttPBXDkjxBZlbLWbNWUqSdHDFOq5PImD3c/bG5zO5PVzmS10+kNRRFHbFzP2qUNjvWppBJadJjfnfCisp6UtO7agqjTboEPczs05z2qU6qUCgGP1c5ktXe1F2eFn3QMD2pm9ZShg81lPoGhK6QiZkN6mOlRnfkLTt1D/7btgFkMiUQikfJiPO5s/WzNQXWtFLWXBj3Y9u1Pu645ZpD6KEkMMP5ty6aTpik9V5dczGvO8ry/V2vma9/sOEVIIBHj3P4+qP36B0t3HIf9CkjFsc5/H9y+/aL/wK3Jb8hw/uvAzl/1fLN78kwPwF3e9unmM/fD6x/7iAAj8kI5JYIgCMIjU6x/tZi90P2qV2srrbcvv1Iqq08u/GOj1Y4L6tFKBEHE1bGZhza6brqSE2abElzOpQuUytYml6uOX/4U6lwy/O4QV4SnHVyl0SkRBEHYpRX391q8stTnslNje3evGsoEncEPA37eHOWUP/xNnhFrELJHN3Jsbd8NkQ+PLF/9GzZuAmZc7q7POOxoDMEwZOpxNb+uViiVqBBELk7PCVptDk+3CrEk0/reOGk+ER7aaBhC2V8paeof7y6XUnB+Dp/C6KXhhZnM3qqPWh2/ycYQQuH2p1QT+XJBU/o2e1MIhnWiynLYcklz5hZ7MwhldbmktaWnJufVGfg5vI+xOJxZVciV9UQDRUJOeLyjljE8yyTIrp2loV5TiDvZzDo6nURndUsU8iHhCRkV74t/D2t0mkgjFoUuNTOYAsMQyuJMWVdMmvd6R8ICAmGBtReumcsdkJlWrJ3ZG7DlhfLubnlvzFAoYKaluryLRUN2KXkC6RN4vKAycJY+GkLZ47pkMpWiLMXuZbQeZJNWqVCqEJadM3oq7O0rUouuMIuO4LAQyvpuHb2z72HC59LsfFAQrDfbIimr9zOVTF5/BYuCYL2X9QNC+x87KgWHlb8XhZqmb7JfLTCukInzkwkQDEMY7DtBxHomX9iTWszMz/SA9PRet3TE9VmlXCrIy/T8EIt+w9TVkMKiyRAEQZRKaUs7GeMOT0WbfeORXdSXs1TIiom1gmAYwpjM9czIZPG4CgRRKRndDfddUVOw5svDKzTYnEopkfApdDqJzmhg87hDzqxS3NiUf8QCPcfJ37q2wz/G5mUYhmCDuY5hZjWNdmHWCwiEBQSH7SHpSQON5sJqcsYefYP5zhHunb13vVwubW4qve+Dg4xstyfVjr/yeqy2b0Zr6W1PkxGdcoCxtX2L2v2T/BZicevCMqL6pgaTSgRZ+eGb8fBMQ7cbxc3tj31ACIIgiLzNPsxtLgwvCMyK6+5/jRQkp/mvMDbdmVJVIuivBru9wt0XoGEIZX+ttLm1vx6QNJr62H8Co78JL8phalagx2j7Vkq62KyeW7tLIh92a3faBBA+MjT6tZBaWBzxfU9jBcrid2J7VIbfJqfeW9ukkc0auKjaTBwt3oEtzhA72mXKvlublZHu/rERBrJNSueKn+KQL0Hor7M/vZMglCmR7DsffA/nxd3dgc5lK1TNnscXL9ResOCQK0VTeFWlTLz8ypSpF+I0Z6tSKtpKws9EVNLEioHPJNzG2vS/rMLi1KpMhUxckOJ92S+3nNd3nCqVQsisyQ8/7hgQ3KYp90lo+xa1l3pfXjr94+83G0ZTWpg9r44KaXth4F/7tDfei+2XSkZ1AnbX9I+/24rLG/jZlLK2fO+/9i7dgUrou7z45HTr31d8tfYPjzK2GFG2F/jcXPfp97tMEul8OaJsy/O8fuD7PfqJvbdcV1kI+sxP++54lzH6Gr3kIk55KObM+m8P3o4AVjlhvHhOKWhssjvltGxbejp/kBHK21q9rjtprQ/zGCSVElJC9vGF+tqbw91yhb0Xk1zGpXEobXyuhtWxx+KULhvPFOby1J+TzETTsH3rw6wzh4vjYzlld4b12Q07J9QpUbYnsmqqpANvzRVFYZvwMGQeYFzb1RdiknP4HAqDUcvg0CRytfq3wyHQZR4MawXlpfa1lfc5pfPf1e2dKgRpy9nliINQuN/zmxokCNKWvc0BB6EszxW39IQ2KwoDVpujp5gH2Tcz1YfOiBuS1xKMIdjgUF7riLGpEVFweZU3CLhPTC0/M8VOR+tBMAxZRFilBizHY6fhQ51L4zbjTD/ChfuzhL2d8zjEo+ZGM1DW9xu4HLWfTiauvIgzmmmdmCl4orHG0srfDDDTYMz5GqlUiaRGGr6MhiG0sw1NoUDI1wz0plollykHmr0zY01mwjBklViifvmoVJxSHwiGp6JNblH6P5N00um1DEYdg6926ShF4orfUahp+oabcwYEpc8pMa8ZB3vx1Z76KhmTkb8LhZqCNVmU1COVcja34qIRerqh2bb0VvVToZQLSRVh2ih4lqnthcreZ02fU2I/to4K4on7Az5cNtXaGwXp4xYFER9/4m6VXM7Oq4zTxejPNrP40BANwTBkYPmNR4xhrPNsE4vlfnFW6f7a+lZbwomVPd+QsXKLwxajsIvdYyPUHoNKBTunNHq1oc3WhJrxByofyynZ7eX3vM0myimb6jJPOuhPM3H7s7CpS61ik1JLrnrjIVh/XVRB+hOuvCqnVCbusjF8CevxT0Vb76Nb0GAa6PiRfbhdA1OtDUDO4WmsB9rt/Z3nwvBXwfnpw/vMIAgygXMJIUoev/qOncUcE4tPTQ1f7r21w3ApgausDV+yDLEpjttuafaxWZgnndd7X3BKfrcyfRVldaeWxRx0a1dfsTSZZR2X1L8gwlNB0J38cMu8hQu0vvpk3e3kroRbmzDFAkUGrLVNL6a6ptbp5If7XBuHW6VKWYn9dlSnpOT6H/UvHfIcUkj45RmJkQMDseXCLiLazglfPbj+Usn5rFIM3ulKhqZQ5WQ55fqvVj+MYqlX94yaJOxRrTVXQ/rfmBQSAaOttrG5bVA6pLss/OHhxRtvR/Td53xyuvXvm1bvIxTKEQRBqMUBdw98ve1ORI9EdxT43Ppl2S5UbCeCIIigIcX6zJ7Nh61zBveiklNSbM6vWbLzSiCQyoniBXVKlx9+HjZigEtLNA+Yr+X6u4d67wwJKSH7+ArrLbfLGzRXhkMYi1O6/Xx1SDR0opySkW13QXftrts+xeNfuLvPKR2vFFPUn/qanHLIN8uvh7hrWVtrWVu8j9V/SbNTuj4kdXQh/U5pcaawmSId7pRUez+HOWj4y6CCHObgVi5myWkHi1kwPMs3L5f52FKJIDIGm9XAYNQxGGkZnp+bYLamV5r4WH9gAG/LaGsWdhK8LGZjDE6WMuk9zxNFl7UH7i005m1z/O6sFtpAA46MzmKS2UKRUvVEI0qloYEGM9Dw6+F1QgXD3gXzkh4MwZiNOTQZI0cXrfdtQqtoIOPGvwxhCIa/TWof/JBTKagp36BQkB763WhN4z2UCmFdnJa1tZa19Xwrs9dheASn1H/TJCplcM4iEcPeAwXpYd+zTspHELmUn5vh/BqMfsvM3apzSPxQzmBUX7FE/U/fdGFwWc+jqM8pjT636Y+hIsh4nRJBEJVUJmpnMOoYjHJKtVGA+fs2ThfSCy7boD+w8TCo55IoecdxenOdApx6xpepxHUNuUdx8MsGRtqeYabk/j5dSolU2MZktwul449FTZ5TMmPTg1dg4A/dop2aBr2tIrwG81Dn92B4hnMUofEJawUFq/qhr+07sP6WxPJCHoIgSG15zC4CZnUUMZM1cktmV9nVYDf1euCZOCWCIDImh91za6dn+miZ6m9KLTPytf0UC29Oa6rnd9r7Wn2AMThR3E3teXtSdNt6W76HwbyNs9yZ0dQxENeTMdgsMlsgfMJbe+zlZbeR6+vq6upamPUeey95dQspHntmH/HoFikRRFD4z5r376Qphp7n3rbvn2xG6FuvUorasq5aul71zBl8LapkYrVFeBUyXk3Cb4Sg8KGXllzArzLF2Z92y9HUM2OSnFJ3yXqz/EEfD3fKQTBr06xPa2lpaWl9Meejdz4Z5pRb1x6wL0EQpMcpD32z40FMT4XR45S74bhOBEEQaoH3nV9++PlB9NC9tGY5Xf1xOpDKCeRf5JRKbqFf/Pp5zr84qF83ElJC9vEtLkfs28b2yJlcp1TUBN05sOyH0yYJTWMq7Wg8rlPSG3Mv+DlqWVtrWZi+hvf9m1hfwqjBeNt/Oh6n5FXddLF6C4anG5p9ZmnVY0W9G97sTX30FBiGPDMz6eNZsogTFGrzkb6beU3GL9amr8JuFlQuT6VIjrX+GAu/FlTa15tKweWxMtLcPjREv2xkPs/KSsvaWiu6ijruZjFShv0rGD3IIDyhO3e7IXoKDEMwPMMpJznX9TW03okK6cDoT2bOhp7/mlgOOhXW1vMtjGfAMKSHnh5a25+zSqmozffRsrbWsrb6Emc80y4xiUGroObuGzFOOdwpEbGI6+WHgmCDd3ExaQgiFnJ8AtAQjHkb5+0ybGoDPq/bxgsFwYaf2ibnIgjyFJ2yH1l7R/l1G7OvncIsiqO+Q5ss9UjNlKu6qLUPXVDTLJwOFvRKpUwmplDKYV/cVIzB2zi8lrW1llvQ5dLh3fufnElzSlGLc7T7ZzA8zcDoA3P84NvE/D1D/WkwDNmH4+qfdLlYJSsyyXeZITyTEIon0/kIzTfKcyHa7o9iSvMwpaQ15pzzdeirB/zul5BLGdV6nnafPDun7IcbGuEwx8DVqCL9qC3uddjVpJXFVinSEmw/N4RnBRRXcXulkstjZ2Z4fmaMedkINxdvpWVtrRVV0SR89lNStbhcN8jjyFUp115fbljWs6KOLOLk1A3WwyKVKpUk9Nf/TXn1SvJImakUIiqt1BDneN7V+4qr702v3OHDeZRySUOO30Gc/Wkn7yuu6pvXn86uJ3D2Jx3Sy4Zn/bw7JbM+g3BGS0tL64tV2/YbhdTV1dXlRthe3v24TtkbpxTUJuB+XTRj1jsfz9MazLxP339zJrRg61mvyvEfIgBB/lVOifCKAxN1NTrlNteecd9jYHKdEpFW+t3cu2P3bW/iuAOVj+WUpIqEI45Gr2L0PvdOcqun1rP5bJlCOVrb99icklNx1Rn/Bgx/GZAV2tRVz2Rq2Lgi0ZMui4YgCNKW+aO18eLQsqqquG8sjP6H8nGg8QQIQs73/twYA/kU1qu1BcvEPAqLWc9sxLqavoGGIazpXLzVfK/sIuGTdKbszbMjdbU+egrKHpcd+joGvdTKaoqeHoQOvRKqPxX28RWpzahMy1wDwxAMfxtP1nwqmExyX2mVSnlSLP4zY8wUtP6qxIZ6JrOBK5I9ou370U4pErLd/VAjOaWAz3D0QUGw4SfWCZkIgjwDpxQxMnP8PsE7nsuois7wnA6bLfPMKkIQPqPZPhgH4Rx2ZA90CFMqZBw+u57ZmVyeuh+HgtD6s0zM59t7n8oiT0jNNWlOKWiyj3T7GIY/cgkzqWrXfG1wBGzZE1+kSmFL3jFXc0jP6rec+rq20gue1l96pYR0DF3YoaY8/lBPPeCT7EHu7KsHnmXbtxrtOZtsTReFEImVCSutjKegvKypbC6CNBb6fWXaP+1DL3IJr4nFrGdSjD1w72BgyMB0Dh4/3zMzm/c0O1MOIev+TpNigVzZbLfppZOhgt4OR3EXpr7yR4JiaLBUpeL5HxolUNmTRspmcToYjIJkr4M4x3Mu3jc841PUO3/IJXWZvketA32bOVS2hq2LI9Lwiz3PTilqKw28t+GjxSvXPQytr29q7WBLEGSktu+xOSWvJtbk6Iolm6655NZrormje1xryAPU+Bc5pZCRZhOyZonn7XD1G+AFc0pEVul365fde+/5P2oh1kfyGE7ZXfGHD2EmGv7cO8mnmaM2rdq4nVLZbOph+xEMT/fMTKU9lfXTi9Od5hm5G7UyOQ0JiywMoT6nbC7ynWsy1Cn7UHB5bAqLSW5M3WSCnY4x+tgjq/CJtVJBNbLXn66HeccY+z/Yx42c+D1abwqMfR0LQ1YpZQq1+ISi6mRPnDLsUQ0tKqW4PvZDLDwFrb8qqbF9oDnvcZ1SKRC06NuiILThB2459QgiE/OS4ixHcEoFm9P4wAYFYYzneuf3dOl92k7JpjeZ+5gvdktJYVET0tyhPqcUMFucQy2HOGX/2ZHJxN1sJrmzwSfVdy6MfsXc9beJ0MpJc0pld3CS/9cwPM0hzKTuSYORo6Nosw91nQujZ3kkwVG+W6zM96VVlwsHa053+UVv65lo+HOfZL8Wrtqb3uQ4JTHTbYGJG4ZCZzYmf4c3hvqcsoUYuMBMf4hT9qHk8dkUFpNMSd+OM3oZY/SRe3o279ksy9TssfeSd7dQgSBk/I8vnY+SDjjllHPRw5wSUSl5AYemvLrVcRSp7EsqE/M62ew2WoOLq/159wGt7HHKY4SQaNaoGQzh+XVKUXuJz1+rPtH+/pxL6aCfd9xOuer7vej4iWzWAGjkX+SU3R0hD9zmrwmwKVJvznkenbI5tSE9hTxCRSJrSzA/o/vLJXza+JoUH8MpSSWRm6zQEAz/GFuWx1Gv+cbtlAgrINx5vgEMWUX6tHOG9prsKDji7XR+hOmExgSn8rK92WvuWUUcsZJecABvMqPPKXOTbD8xhPudsr08QsfBx7yFz1O/OhRialPaJhPsS2gHoxaB4AmnsVNEhxjMQMMQDENWyURJm0HPjEIwDPlXCAY1eXUZE+D/wTDkkN00JA+VSk6O0yIQUI0IgiBKpTwh3ACC4WkYg/M16q77uE4pZ/PKfkejIH3jT6LqZAiiUohbaqMXoeCZxvgTJUMeFbJuRvExNOplY4s9ub1zUT9dp5RxyypiV5oTNqQ0iqXMvKKQL1GmPU7J6CJjPdH9Tilit/sl+GwLSU9WnxxPpRBxWwNSfObCxt/5piSNe4bKyetPyc/Ii9hgDEM479ulbUMf84xaw2ivA0kl2eN6zVQU5YduMIchfaM3sfozzX3Q1VTmYMupIYZvxKMhGF4XV14wqB6YDKfkVl93snjDLT2LKVIyio4SzF7pc8r8VMd5xv1LHiAdldEbnXyMKRy2+o2ikHQ2Z+wwM3wZbY+hcLnPYKr0ZpcdZwLZUgWCILKofl92CgAAIABJREFUM9N/sqqX91h53IWp3xlVaBj7rVLy8u4te/WDuxnD/6VQNHtFVA55CKlUcjazwdXD2aCsr4lJKeM0Z1zHuxiWDe8crxBKWoJyNXVUfH6dklGTiN01e/6aS76Ng18Ensgpe/tTKlnl4ZiDP6w6bJI2/A6kFhenh4X1T1ZNLfSFD3/5wy/XnXLB1JVPwgvqlHZfb4qPGXS/Caqi0vfNtd14o2zwWJxJd0pBnkvsjl1BcFT/BcpKiCJFRXaN1NlHIS7zuX5w74EHQRXjeoaM3SnLC0M2WMIQDGsH5ybT1KN6/U6ZfD/Uf0dEdnyX4DGdUikgp2ywMYHQhqvjKsu56gfd4eTv9Bk+2LGFpWEpRW71PW+XJXj8F3h3/XoGfYQ4Q0d56NdmhHNlnV0yFaIk/0PAvYmyuU9msxQc7wDL9/ThhTG1LSIFgiBNhT6fGWPfcknP5g8OWijqbuCMX0FZP6QI+E/64BFWBr6qj4ZgGPIr5yrk5al2PUPRfykVD54qRcEp8fsfDEMY458LBoWjlEryPVPsSzaJRT0z+yjk4YEoCIanYPS35KlHIPqdErs+rdrG13ZZchOiNpfQK0aWD9VeVqQSfkiEySwY/ZqJq0lHz8lXSQS0oAjL/+kZfm6Xql6/i4Qs3zDjWTD2Q3xUVN8Ypid0Sjm/rjZlGx7/Bd52nW9C9AizL4s5HX7RjloOoa7dckTFr6xP2YzCarvERPJkza0lF61Qr1u5/lnOQhBEwGy2D7GcbmK/L3XwjaniFlXFr0cZLvUacS9jZ/KcUiWmlt7wsYLQBgv9U0OogwbGxqWH/GDhcbWoqXN8YiRlVv7jbfMODEMwvDKiKJU5dNhIWUHwOgsYgmHtkLxUuno90O+UKQ9D/LdF5CR1D63oHsMpuSSUv9tSPP4LvDtM6u4a4damVkZ8b25zmtjeLlUhykbY3vIdFOFOLZ2m4PgHEz42gBdEVdfz5QiCNBf7zzfFvumcmjpkfLey/g7e9HWU9d9kDmd88/2Ohcx/dhrksXtDkzVmK177I76nK3WzzYapv4eJNU7XrpIwvQ5PeWu329AIg0qh6ArwcvMYFnlQyEQZUQ4PBiYSU8lEnNhgu9OuOUN6W8okImJmTGSnphM8YU7Ja69wv/jFF99v3Gv3iGW2xuiUtKo49LYpc77fbVs6+Pv9TtnQUl0Y6ZPS/RhxSkQppaTaXV63eOflgNrB2VKL4gMdzeOa+i53ao7LjY0zoKkz5m6+YA+s8gl4QZ3ScvpMw+/2RHn3VvyCqrjMQ+8TdHZmJDOHtGDyivwTN2lPmFO2phde1iFodMo13/rfCxv+zFB1Zxf+sd1h519EIhtBEKQ5tczbszi7Y5RKTiYo9rpx4MI4Q5WPcEo9l1vlLT2vfFJGxV0vwtsw/JKBzYUCSs+KGtVlsYddcbN7x32HHLOz/cI1MbidN8Qpu2viNxIMR3ZKBJGLSwtDllkYTMeafByUn8sQIQiCcEkP/RznYPAn85saNNW21MqIFb3r6KBXxJPqhvb76qHN3MXqXXxEEI0vRhAEkVdme881xr4ZXFLfXnjS2uQV2B3Xwe4RVnl9zDxTLIQx/NA8Iogr6ntos/3DbD/T1/ufZ27NeFZ0lFX+boCZBsMHS4RSJSKrCZ6B0YNQ1gYdiqE9RWWClARrCIZnGJt/0TtjlErJyN9nafqmns3D5r7JelRKFiX2GxQKgvVeN/PxZCEIgijk0rgYy7mWpq/B8DR9/bUpaWcMDN6OrEfUnPJ/enqz8Q6nS1gIgkglgrBI8/cM4JlGZhfLBwK0KpWSzWwz9oCnok0WOocHshEEQURCtl+4+bsGmHdwnuYt/efnUU4JG893SisYdj4k/O6wONvpvevoOF2r0qh7oobmnEOm+BWhxAYlgiAqLoNiHWDxkrnzweyawpLIb/VMvvFMS5cqEQRR8TrCklwgPcxMQ7ufI/smGEKkza3EK/aGM80c92Q1Cccdi5rEuYQQhbSBlHHUyXiageF7HvH2FDaCIIiw1TPRb4mhxbaowgzuoybRfiRKdmSSzzJDGELZaxydI2WU3/awfguGXzKwvVTYROmpB0pjfnHBzTbQnwbDXwWHHrO1meeWFN4xNCY8dqfsrI7R6V1HB7182Do6fbRbe9h8iA/zoXKFKgRB5NW5fgtMsW8EFlW0Fp23NXsNdjNqYbJVKgRB5OT4heaGENrwA/Mw396ZWREE4QRHOMwz0JvikVXCeZoL6fSSeXuzAbGvByUi4/gdf2enU71cqWpy3PLKkUD+SCsAqfidzkdefX9oqFKlUNACPQi/OfqYlXPUPpU1F0VetI/PUjsilUrJZZGdXZ3+8EpI7U2rlIg7I8P9zQqpmu+KsTmlXMQpTfMfzSl5rSUOR1+FoKlvzF19LXLU2bxY5Czc3jkanXLXp8t2EHqVVMGpT8Ef/urlLzYc86joS0NKtvxtzifvv/Xx4o23I8rKS+Pt7QoVj+OUCCKXdOb73v9l8YLtF/tX1+HXpdjcv3DSNKZB1P84ltMKfO9s+xSCPlhz1DRlzCs6A/p5QZ3S6VvdOLuw7As6lvPm4efNs/h4ufs+/bqOrv71afjlUZnH51nOm2fx8XuGM1/Sn/Uubt48/LzlPuetGjXV67yigLTD8yznzbP85H2jV2dgZr1tNmceft48j9MPqvv6vnHyPJL3fmj8+gz0K2+YLjuc4JYvRBCEW1ljcs7hw3ewL083eON9t8tGQ5cCV0okJX7Jx9YafzQHP28eftu59PAKyYiLvfQgEzREW5w9dx0TVv5EsUp6eErYRjOjWRg9CNZ/wwS3NqogmSZBBBSbaN+lJtiZaBiC9d8wxf2SXlPCQxCljMXv8Ih2X2yInmVs9qklfh4e/4kJdmN0gVNa5Hpr7EtY7Cy089WSpkJS+jEX3EyMHgTrv2XqfzM+UNe550/0a8aOt+IjNrkQXsGgIRj9urHTnQpqz5Q5cqmwg1P9j7P1+/pGH5pbzMPj51mYvm4VbFnb1i4dNp85giAIIqcVnrAxexWGIZTFhTIqVaYhUUdl+Hc4gx3pLZS+2XrkEn5IlNWHpiaf4oxn6eEvlXS09c2BjDTGf2GGhWAYgg3etbCYi8fPw+Pn4c3fNUB/HVleyBTJxzXfSLe5vf502ArTJperEERW+SsGPQXlHyJVDv+dZWJuI6voMAoFYc3m9RTD3PgVQkIqa9DEmSqFqIVed9sK9T9Yf7Y5ft7/2zvvuCbu/49TFxasta2/Tm3rqP3W2qrVtmqHs25ttSqiqHW31brbWrUtoojISpgiG1mKAxmK4AZkgxA2ZLNHdnK5y43fHwkhgSBbpLyfj+eDR7j73CefC5fkxec+9zk6fQyNNurcmc1pNZExzkYnTw49a/emzZVgOUbpzE851OriqouWJraOY+n0MTSn161Pv2J3LUQoamg2dxFJSIQVDx8FDrSy/j915U6O/2dnN+ZGDkekTZ9oTcOTPU6Ob9pYGVmeHHTq7DivgEMMEYXL2aX3Fzs6jLS2NLI8OfjU2Un+oW76gx5JVJSZdW2C+j46HuH+dQYOd0RcdemmxxhXv1OlmmmASELF5eYe8jllctbu7XP2H3le961ENGcdpJWRd/2MLC2NLK2MrW3f0fz5aKPtz4129f01o7K680PmlMWlqb9508bS6e872r1ibWVkaWVic24UnT6WTl8YcS9S//OinJN9PIQ2lk5/38FuhLWVkeUp07N2o+n0sbQLG+Oz0nXGDHOZaUeCaWPptHfO2ZictDQ6deYVO8exdPpY2oUt93KyWtzUHFcp6yRMj+iLH50686q941g6fayT/Uh64J6kwmIFquzK4amB4OXHf+9uY3Q+6gJLYOD1IjCBtMI/ym/imabPgXdsz8yPSfO+f+MbZ/XngM/BbA5X08Upibt/ZaEHfSyd/q6dzVCrk0aWp1+xd3yPTh9Lp29L4ZYaunG7qi5jR+N9dHZk8LmogR2rzI/6inZmyT1WsZxofGvLIm66vWtv+4697UtW9F3pPLb2zcWK+9jJRv3WHuno9L7OW/uTG9mJdXLsKXd07CY4Aav2BNfo3uBbUXffevGY8ePGjl5wMr5G9pQWkNLquGNzR5vp91USuDIh0v3QvScXQ/z3egeq3eNz8bfLKQxx88tuSBIXC2qT74Rs9dSUPBAQ6lsgEeiHaRxVFKVE7PEK3Osd8Mv5C+aObhbu/nu9A/f4hf19u0hnKI2ynptq5RW4x8t/p4u7mdP57RcC93oH7gm8eqbZ7aoIATPBdqGRkck7kyx8Slp9C4rYaRe2j377VZOBQ4a+9uHcVeqkh1TkXv17wai3XjUZZPzia9NWbPbLoSiKVCGS4ru+vy80ee2dsWpmLttAj2cy7odZb/x4xJsfzzOzvJacFWtv/tbIl0yGmk79YU/IA8ZNm3Wvjxg2xOSVL9bu84lO8Nn31esjTI1Nxn23nf5AvWcEKhcy7/n/vX7KW++p633/27U/eyVUCxV6o4tQmSAr3MrCYsnPgTk9373936OPZkqfGd8npSDKOr6QxRKyWEIWT1KjN60boZQpqliNa7VyJdWGL54kEIm8smV5lri6XnsLNQIRN5XhVsrFCEFRFIGigmqRtnxNA9rypDamQGorNBtW1CLtmeMCR8SpF48cPml5tTNnwHGpXMoXClmN8mWIHCcpAhPKJFyd5ZUKtPFTh1AopBWiplUsobBKgcqVimqxiCUUsoQSAYajmKJK86uQJZTWySTlYm15cZ1cym9aK67Tu0mGSiQV83QqZ4nlUrz1D3sCrROLOEIhSyhuQFv09qlrVMr4ImGNUm8tohDzNHshFmA6kU6l4OvvndYKhaor152rX3CxRMgWikWagfhYvVDIEshavygJqxMIdNvA1plOXAtJ4SKxXlPZQlE9RqKIWP0rR6SZ0V07nvJl28gImd4mXJHc8GhVklQpZfovhYivd4NKEseVNbrPLhLXKgmKIjFMXq77FGKJsNnXCUmgqKYMTyI3OFCVJHCpXMyTSEU62+I4JpQ2HrQSeVMnC4HLFVKDfz6uWCroQhczRZEohtS0cmyUS3WmAqQoiqJUmLJOYrCwqEquREjdkkht6yVbyYi4XCHTfW1ZImkD2uUeSm3tGFIjEbEkCmmrVRJyhbS8+ecAJldq3/hSAYbjuoUNvW4sobAaURn6T5CiCLReIla/tetbe2ujsnKRsAbR+4cTUUga38LiBoxo+rOoFOVNHzv6fz4FZvBf1m4HE1fVy5v9V4qJK9ksFotVIWrz814p4Ppse2O1fqoklXJxgxKTScU1oiZrW7vfF0liiLSpmFhioAOYJFGdMk2KJfV6lyiSuAqpN1BM2tD8InpCpRTXsFgcXnmd4XNJ6lIYIqpmaeDwK9S3siFVSml9eeNiXkWV9iYkOKoQVrFYTauqxUqKVCGSOj6LxSmvEshRVCbQlOBV1kgUSu2v/MoakUwhquWzWCwWi1uhFxkJTN64hsVisfhVdQau4KQkjIhTx/fu8s169pNR/Qfoe5myNrf45FInQ3MJ/dfA5IL00D/+sraO6NrASuA/z1PmEgIA4LmHlNWUBu19f12LgZXAs6YiNfDo/tV7fZN78jbx/2H6VKaUC9ODb815+9yIF62MTWzf/jps18Wq3m5Tz4LJBQ1CgQx9BlctAn0UQo4UHHJ0fMvmlJGl5YCTZ950dvvsSlYXJw0AAODZQirqOVViyDG9iaTwNv3Yz1vPRBbUQ6LsJH0qU5KEUiqv4Ig4asultRIY7wD0d0gSrReJODrypc9mQj7gGVMX/eDGQien99rhmru5qV2+EB4A+hUEKhc11NWJEQgWnaZPZUoAAID+Cy5H5JUiEbcdVjcNlQYAAHhGQKYEAAAAAAAAugpkSgAAAAAAAKCrQKYEAAAAAAAAugpkSgAAAAAAAKCrQKYEAAAAgJ4FwzD1z8LCQvVjFEV1HxcVFakfA0DfBTIlAAAAAPQsTCZTKpWWlZUJhcKysjLtY/VyJpMpEAiYTKZMJuvtlgJA54FMCQAAAAA9i0KhyM/PVygUJEnqPpbL5QUFBQqFgiAIuVxeWFjY2y0FgM7T9zKlUqkUCoW93QoAAAAAaC8kSapUKpIk23zcyw0FgC7Q9zIlgiACgaC3WwEAAAAAAAA0AZkSAAAAAAAA6CqQKQEAAAAAAICuApkSAAAAAAAA6CqQKQEAAAAAAICuApkSAAAAAAAA6CqQKQEAAAAAAICuApkSAAAAAAAA6CqQKQEAAACgz6JCkeT4QNsnot5uCABApgQAAACAPgWhQsuSw39y9d7q5r3VzWuLq5dlRjvuL0egQl7yscatdnqH0HLFPd9YoP8AmRIAAAAA+hq4CpUiiFQhrWY9OkRvO1PiqLwg8covPlFR1YgUQaQSASv9hsX5YIiVQPcBmRIAAAAA+iikSlaedKTtTKmSSPLdzgd4lWAYSVEURWHy6uyo9a7+Z7PhpDnQXUCmBAAAAIA+SjszpQqpY8Ru84i42dC0JYljciWqxMkebyTQX4BMCQAAAAB9lPZmSkVtzs0t52/cgm9PoAeBTAkAAAAAfZT+mClrcnLifHxyurNKcV50RBDtUkF31tkfgUwJAAAAAD1PZuyFzS4at7heOJGWeT40q7JlOZJAi+M3OatLem3zuB7zlK+8p2ZKTCl7GK2ux3MT3X2do/sGTbUXtnkFO+Z0cCQlWlcWc2zW8OHDhw8fPmbKt3+HZ3lsHD58+PDhb02cuTcoszDizxnqleM//84pTWdDYVkSzWy4hlFT5h2JqDBQvZybFrhv+nAdPp67zjOrqYCMleT967Thw18ynTh3rUdWzZMIq+8bi366+Cf/XIOtrkwLOb5MW+XYuRZ2d2t0Vpc/9v9j8fCXTE2mrPw5KI/iJ3ofXqgpO37RTpdHdR17jfo5kCkBAAAAoGdhnXfx/OtxtQJF1cryb65z8tjgFJehV4wk8LrrIV7bQtOZ6pKIQsCIMXfx2XWHY7jiNvopSZUKVaCoQi7mZUZv9oiIrEEb24B1fCQlSahqixLsVr46dvI/d2QIhtcVPbBdPnL89JN3FRhOYKKylIB/fvji5F2pDMXVmyCVueFH5k/6ek9woVgsFovFnMybp1a8+MFXK1x1dl3OywjaP/2dqfMPhBaJG6nKiXfd/u205Seiq7SvDqpgJgT/Pm/M2HFLl2/5csWxqyVisVgsrsiMtts0adKSrfq5Ulp8x3n75Hdnrf7nWqlYLBaLy1PDT63/6L05m+zuNsYdAkeRyschx39YMuvr9Rs3/7hqT2CGWCwWi/NiHHd/8+6Cna4QK9sPZEoAAAAA6Ekq0y6tjyxCdDMcoZJXJh92CItoumiGIgk89ZbnpqBUFqZTVKUU5Eavd/bxYRmq+lmf+yZF3HTatvGfnU6iKIoihewUB/N3P90ZyqcoihKx8q5a7ghk4Y2lhcwkp60ffbnrYgmiIrU7WfUk2mrp6OlLm1JlfUHcmWUDRk1b5JTatOMkUZV9/cS6SQuORlU1NUBaet9ly4TXPln45zWmQqmplSRwXlLg4fkT5m9uSpWSoninn1bM3+CRqkC15VRo2V2PfXMmLf8lJF9bpyg3wmrt+IETl+72z1QgGEFRFEURODPOaefqb7fQH0KobC+QKQEAAACgJylPCV0bmN78fC+Bs5Jir9VrfydVtel/0Tyciwn9/kMCVRbYOXpsjTPUVfnMx1Mqa4qvH5oz/gubZIqiKBEnnbbq9Q9nnE2mKAqpynt0fteZpMbmI5W5lw4s+vSrMwkqvT0i6wriTy8ZNXUhvTFUkgSOIlKZXKHJcxpqcqMszT+e97vuqXJp6QPXrQtn/OCS1qzSitTg3+eOn7PRVx0qJcXxTlu++XzlP1HlenVSpDD3xqm1s2aut9X2VYpyI6zWLlm4wy9bpVuWc8/llx+/3uR4vw9Eo+cEyJQAAAAA0JOQdalHHD0snOMzmi3H8aZgRBJYcex6p7Dr9c22JlC0yNHe3cLtXraBqp/5NTpITeHV44s/3hbCpygxt9Bvy+RJcz+cdS6FQqryH3nuPpPQ1EtZluhgMW76rlBesyrqi+6eWfaCbqjUpS4/zmbVsGHDhg0zNRk6ZKShTLlo1mqPrGabSYriHC0+GD/HwjdX/ZvT5q+mrfgnpqL5GX5SxLhxet3MGWa2dzSZR5QbYbV22ZLdQXl6BSFTdhjIlAAAAADQo5AEihU72btvcPa0cPbc5Hwns2URkuA+Dllj72ZO97RwbqaHmYO7hauBrXrjum91qPx0eyhfWc1Jd9/3l/2xJZ/uDOOLWHnXLHeEcLXlKnLC9n3ywoBBxiam+pi8OHTIQKN3psx3Sm2qtr4g/uwqU1NTU5MPZi53eiSTyWTs1CvH1rU3U5KVaSF/zBs329wrm6KoytTgP+Z/MHejd3bLQaMkP9F7/7f/W7TzIkO9ADJldwGZEgAAAAB6HFKlUilVKlZS8Bp7tw3085tcLt/QHUxJEpykEDOnsCs1KqXKgKgKJwzV+uznEhJzM5wtRn+y3T+Dk+53xu1+ipPFe1N3BaSz0vxsgjjaDKeoyAn9bcaYz3YElsgNoUCUjaea5dz0wL1TjMdM/84+QWdFq+e+DWVKqjIt9M/5jZmyIjXo97kfzLUwOOUQP9HnwOwPF+4IhEzZzUCmBAAAAIBnBUngSpVKidVc8nczdw7XxsrGTHlJ96qddlTXC5mSFHHSads/+PxoKOfWGesEASvZccN7U83OPrp11iapqVtQUZET+tvMsdN/vsR/en1ybnrAnk9f+3DWb5dYegMaO5QppcV3aJtnTll6IrqSoihxQaz9xhnTvz8ZW93i+ST50TbmM79YY31bsw4yZXcBmRIAAAAAehCWe3BGeYtRfSpVzaUAt6Op2u8zEqtOPuzocTyt5TccgaqYXvFsA3X3zpznIk46bcf/vfnzMRvrBIIUspIdt7/x5u5jtjaJupFQUZ4d/OuMsV/8Gl7eooaGoqLbzs7pFEVRVF1BnPWyER9+ve8KT/9V6lCmrEoPO7pg/LdmF7JIiqIoccEtuw2L523ybdlRWf7Y9+DaL388HVulebr2Z0rOPec9c14cs3C3ewJcDG4AyJQAAAAA0IM0XA10cy1tvpQkiZRo1z9SmrolCRxLjHTb4NJ83CSuwtJuX71RZ2g6yW7LlLLqYh+LoUPfGD/lVGJbO0Qpa4quHfxk2HuTtwVxKQqpyg/fP+mlMVN3Ng2mVDeuoeTB2eVvfTLHMVV/+4bijKs2+8O56gRal3/79FKj0dMWazKmFm2mLGHlJIZ5RlVSmkw589OFf+lOMERRVZmXjy98Y+rS45GN6Z0sTw48PHfCdz8F6M+FLi6Isd2wbOFWvyfa6+vbnSk5d2m7Zw0wemHAqHk73SBVtgQyJQAAAAD0IA3XAt3W09x1uiQpiiL5KZfMnWJT9CYOIlVYVai/u4XrlaiGxiWqmqshXv+k1hMGZyhvX6bEURnjQcjTMqW8utjbfKCRkZHJGxMsLnJbKaUFqS64enzxpJ8uckiKopCqvEt/Lfl0m85gSk3rSDk3I/DXSa/+76t9VzSdlQp+VvCJH7/df5nTOAknKWMne+/4aMC7XyzXTllZl3fLeoWx8ZBBr3087/eI7JwnN93dMkhKkyk/fGHAoAlz1ntpLoSvzrxyYvHgD2av80hXEToX0gsZ0Wc3TPho0fYAzcBJqjw54PcF78xYc+pmuc4UoLyEC799O9Fgpvxq0sr9YdpbNpIN6SFHV7xnZPTWnG3OMG1lSyBTAgAAAEBPkhbteiSpJDzQfQPNo8mLaRy8ZVAkcQwtTQg2c9IUs3Dx8ijBVc2mrFShpYmh5k4eG2ge5k5u6xxc1zm5b6B5bHD22nXlSVMHHoGKeElHnDw20DzWO7qudXBbr35qN7/9D5pN8COrKji/xsjoxdfHmfmy2r7BjpiTHvz79NOJ6pJIFeO+27YzSQa2I0lCwk4L/PWTwUOM1bw3bYFDEqbS3XWSxKueRJ1cMmBQY6Fxs1Y6pygbCu+7b/to4OA3piw6GsEnKarx3PfM722C4523fqwuPGTIhNnr3NMwrPmdgUgCx9gJfofnN1Y75ONFW30yUazphecn+hyaN3jQwAEvDBg4aNTsTQ73aimKEuVctzKboFk8eMqPhy4XNtaoKr11btuOVYcuF3T0NkT9AMiUAAAAANCTkASOkyRB4CpcR4JsLZSQJKFTkjDYQ6lfpqlw82pJEjdUrGWaJUlChaIopp/2Wt8nksCbMhxJkoSq1Xs9kiSBY2gjGGawJEngKrR5IZIkVBiKopiqscHa8ZSZBK7CdIq31mpSr2JM1aygXtsw7fOQerWrdF4uYVbYXycOHLoEkdIAkCkBAAAAAOgbVGdfP7FwrKG5hJ4JnLv0n39efehSXruCd78DMiUAAAAAAM89Muaj8zs/HjRwwAsvvDBg4KAPZptdMHBnoZ5DmH35xJ6fttLuVRkYswBQFGRKAAAAAAD6AurxA43g+LOOdiRJEK0MRQAoioJMCQAAAAAAAHQdyJQAAAAAAABAV4FMCQAAAAAAAHQVyJQAAAAAAABAV4FMCQAAAAAAAHQVyJQAAAAA0FOgKJqbm4ui6FMeK5VKBoPR8jGCIHl5eS0fKxSK/Px83ccYhpEkKZfLCwoKWj6WyWSFhYVPedx7Lw/wnwIyJQAAAAD0CBKJpLi4uM2fJSUlYrG4PT9LS0tFIlGbP4VCYVlZWZs/mUymQCBgsVi9/ToB/xGaZcqaXmxKO4FMCQAAAPQJGAwGiiqpjvdQKlvpoUQQbQ8lqemhRFGKJBUKRUFBAYahLXsrCwvb6K2Efsp+CNlI91ZrRGF8tSqEX1tTqf31uRWRlQvqK3q9GSAIgiD4H1CFVJWXU2C/8scfNxkZGRkZGQUFOHfjsQSZEgRBEAT7r5Ap+6FEHQdlAAAViklEQVSQKTVCpgRBEATB7hIyZT8UMqVGyJQgCIIg2F1CpuyHQqbUCJkSBEEQBLtLyJT9UMiUGiFTgiAIgmB3CZmyHwqZUiNkShAEQRDsLiFT9kO1mTLAz5lA2z5ISCVbhXDJtkpCpgRBEATB/itkyn6oNlN+aH7sVk5+m7Eyy33Z9n9PPygofHqshEwJgiAIgs+fSi6u4D2DJ3pWmZLkcVVsDsHv7Tj1XMsnuFwVl0f29BNpM+Wf8wfu/vtEbE5Bm32QWe7LtrUVKyFTgiAIguDzIcrD5RxczsGlLOT+ZY+/4gRoe2Ilj1BwNBvKObiCR3bkSXsyU5J8HsZiIkwmwsxkBFvtm7rlcjq/ja34PJzDUrLYKl5bJRsLI0z1UzDRPplZ+QSXg6pfpbL4sF07jv3inJ7fw0+qM57yn9h/Fx05Q09mc9s4bNDMqD9nH7K7kMlrtSRkShAEQRB8DkR5eFlsmLmTxwaaxwYndzOndmVKlKOsyUg65OixgeaxgeZh4eLzb3y9vK18oGMPZkpmRZzHwU+MhxobDx0yZPDA4ePazpR82eOIC+bjRnww86BX+tO760geV3A32GndBGNj46HGxsZDXp82/7cbaX0tVvIZj89tXfqu8VBjY+PBgwYOGLX82WZKZ4ofdHLlyv3nLhbUt3Ww8fyOfbfssEt4qcBwSciUIAiCIPhcySNkOSmHHdvOlEoOkhMVssn1RnQBhfEpjKOsfRhtRvM+eUfYrg5OPvWMzn0r0mKDtkxrR6Ys5UQ67J7wwgsjJsz7xa/yaVGsqDjUavP0T1Ycuqhuf2W0259fvTp1wYGY7HZ0cD6H8vl1V613fjXtmWdKjF8dffj7tdsco++J2zoDXhmx97tVOz3uJkgNlYRMCYIgCIJdVS4ulYtK5aLSZo87ZXszJS4uzXeg+3imNi7hoLWPbm1y9be+J+qjmbJcnhLl/9Oktz+Zc9Q/6ynFyKybl/eu/3qFbXbjkqqb5/+e9/bMpb/HQqZs0+ZzCaFxPuYzdxxxTuVw2zhg0FiP7z/bcdwrm2/gAINMCYIgCIJd9bU3Jpq8PN7k5fHC2oKXR/5P/Vil4HSqtnZmSi5a//DWRuerN/K70vLnLFO20+pbnsdXTFy8L+BpfZl9y97MlBg/58KqOYtWO968L2nzYh3XxTO+M/O4Z6CrEjIlCIIgCHabxsPGoDJW1yrp35mST3A5KJONP3VYZP/MlCSPi3O5LQaM8nEOF+d15GpxA3OeZ9lvnD1nk11wUUNbPdzpZ3748tvtrlfKWoyqhEwJgiAIgp1VycEk7CZl3BdHfIBIDWZKHq5TUvW0eYLaypSI+kmZ8or7MRudr1zN1W1Ahy76pp6XTEnyuGhZsbS4WFqcnHrh730zd1/PbFmST3DZiuJiaXEx85rz70v/t+AXz9Ji9VYl8jLDMZTkcZSamoulJWUIm9u5mXpILlu3HqWmHj7BYSGlmjYoWBydNvBxDktR2rhJcbG0uBRhc4nOZEo+zmYqSorZgbTwi6FZBdpNuBizTFacHO3gERseL2pRJ8FhNjWglIlqZykykCnROG+zGYs2/nsnr7CNYwa95bZi6ndbbRKKi5utgkwJgiAIgp2RkLOxxKveW509N9E9N9E9N9HcDsbMOrz7cSm72Rx+pIKDiRNvb6RpS4aF5WASDmG45qdmSoStfBiuqcfCyX2tg5t5Y7Vb3Do0klLt85Ep6++H2i42HWZqavriUONBIz4ynCmf5PgdWWmqLmY8ZNCAgYOHmpqaDjM1HWb6zqxlLUZS8nk4m1kWbn/kW5Nh6q3emb7msC+7jKnidXgXuJdP75v14tDBA18YMHDw6Nm/nL1eX15OlRdkue//ceyQwYMGDTF+f9l2u8d5/MYgm/7AdsfyMZqnHmZqajp0qsWBC3l6ubN9mZKfm2C9afG7xoMHvvfDfo+mTJl7hb7+mzHGgwa9v+ykt36m5HPRstJ0e/NlEzUNMPngB2vvmzXqZzeUKTNjjs2fsubXsOTMtiYVyog4NGvi2oORmdnNSkKmBEEQBMGOi3JL6fQLx2NrZRzNNyuacm8rfU/I4ZhEtt6NSRBOTai3+0a/TI4m7ZHK5HgLJ/d1l4plBi+J6M/nvmWPb3hvmNZKpmyyHee++Xh+fNTRH775fOXZsCfqhRWR9D+/NZ747Rrvm+xW+wufYkHc5QNLx01cdNDjvk5nJ78s8NiOjSuP+SY0ReRIhwNz3xo9+yevG3nahQ3RjgfnTV+89VxSrqFda/Pc9333AwsX6GXK8nKKz8932bxsfrNMycPSAk8v/3z2mhM37xepi+U5Wyz7cNCcbecepXLJVjPljB/psQ+kbRz5GRGHZk2cYe75IFGmvwoyJQiCIAh2XE7c5Y2Xi0Vsvb5GNH+G7eGgy7mEUruQhz+65LreRxso1ZJIctx6BzeHJENdlZApu54pSV5akuOutVOWWTcGSk2svOF0ZNb4BWb2TzreVUmVl3PDTv68dOYWy8vV2r5GPiOVftLx6NnHjKYGs4JP7J4x7Buz32MSdfNfQuTBH76fs903Ks9A5d2XKUlOrK/ZnBWrjkWrA2VjyTwns+/GfXnA8Tp/NWRKtZApQRAEwd6Xd+eKhffjnBJUobfc+IMlt67kNGVKlJF22MGV9rj55iiv1NHe1exSqYGBlZApu54pxfcv2q2aM2+tQ26zVekRvjtmfPDNOt/b3M7sS8olusXS2Wv/vZPN0wQ4RlSQs5O7d0Krm/A4yrIScVGRuDD20q/LV/R0puTzq4P/XDtt2X776/xmNcQ5bPl6zDc7HJJmrmolU85a43z7Ybsy5awNXg+S5PqrIFOCIAiCYMdFC7JPunptcIiJL1EIWKiIpUL4VMvrvpWPY9c5BAdnK0UsVEelkFloZ+9m5ng7GTJlD2RKfvkN+pElHy/97UJJYaFI1/vBbpunG42bvZ12p1P7knrv5KavJy456H6PKC+nyvn1Uc5BTmciElq0lsdRlhaLCgtFsZ7//jj9pZdeevklUxPjwe/3eKbk5TqZL5qz+IT7DV6zfY+wNp/5ntHM3QFjvmqZKTOijs77bO3eyylZbR356dcOzJq0/nB01pNmqyBTgiAIgmAn5Vxw893m7LWZ5rZWEy6HjRirlynZt0PXObhtoHttcTbgVtd7aZApeyBTFhUG/b1x7MDBxibDhw8f0dLJS/a63evcvohiPU4s/m7VTrc8XjnFZ6Q6O/vb+JTolyG5bMUdz+M/TBlqMmzE8Bk7jl5klj+rc9/8J/FHV8x4ffBQk2EvG9z3BftCx3/dIlMqbrqvmbF0i9W9guZXczdXEUVb+tninXaPS0qarYJMCYIgCIJdk3fn2nYXry3OFzY6Wph/phA3z5QhlxkdqRAyZXdkyn8spn268nBQ9+9dwe1L+xavWLwj9A4Hz40Ocnb08NU/8c3n1lw7t3f2KOPP1p4KTNRZ/gwz5bQVp/3uilvbhZbX6OApZ9Z9O28rLaxU2MYBgydZLvtyzm7P62xR81WQKUEQBEGwwxJSFq5svlAYFfhL8KGLoU+aVnHjLq13CA7NNThtECFlwzU6PZIpi4tDLDd//umKA/7lLSfu4XFUHBbK7fTuFGS771s1feZPlmFJgS4Xz9kk5ek3lRHlt2Pu6Hfm/GYf1aCXGp9Npsy5d/yHWdOWW3nHC1vuO5eFcriqVc0zJSfDdcXcpWaucY/aGEyJcVIdFsxassnn0WN5i7WQKUEQBEGww7Ld/ZILmC1j5Rtmu2iHbtYpGicJQvOzjjm5HoypkbdIh3JWkcs1toHU2G2ZkkS5SiGjoSZPKGa3Vua/mSnLpY9C6eu+nL5g/400jv4qnirl6kM/esj9zt8lUnTb4+8lX8xZvfn3E44XbCLqmxVICrReM/mtrzd5XM/VT43aTMlQsdlYs9nX28yUD84fWjR/1T73TN21PHa248bFc/Su0akN/3vj59N/PHQhO4+nXwlXedPBPzAy7ZvVepmSkEW5r/vql2MeWeVtHPaE7IbT8s9/tQrIqzSwFjIlCIIgCHZYwXU/D/sH0nr9jkYl56WFG52P3q5X6Ew8mXbdy8Ix5l4ZKmsKiKSMiTwIvxJpMA62O1PWPox5aqZU1Dz2Xm1kZPrquwcuKlvEX7V9MlPyq26e/2vZ0+enzMpw37f0w6/NT0dIyzia2Sj5XKws8e4FZ7d/Ltd2aY9S7v678auBA0Z/beERwWi+Njnk3Pppgycu+eP8HbRxxiKcXSYtjAn5ZdnyOdt9Ix8l+vjHBEQLOpQpGddc1s9cZXbiVkLj5Jp8DpIWYvvD52+/t/Ao/Rq/tHEud/79S9sWTZ6xxTn4kUKbXPkcRVGU1++OkaEPJXrnvpUs9uV9K81/cY1vq5NSyWKF7F64bq/BTkoKMiUIgiAIdkLhDf/zG+nn/4jmV5coBExEbf6tjYH741P15zzH+IIbAd4/0UKCszXFGsoqwvy8/7kjbBYZlRylgIkIyuTVGYkHHT3+vFXVUIYImIiApdJNhChPJWIi9SXi9Mjgjc7h4U801QqbnUkvE7LdfjI2MjIyfvXdFQFMw/G0BzMln+CyZAWMegajPP7y+fWTx3yy3vdObj2D0VBQKGPpdaGRXLaiiFHPYPBig2hrJk/4fEvgvdx6BkNQWITonKQmeRykuKCekZruc8x88ofzdrnlMxj1DIawsBhpeS67+NHd0xunjp6+at/5QgajnsGoT4688ufObev+vZfT+U5KtdzQf3d9+e6CzWcf57WsKj/Tbf/a8S9+vmJ3UDSjnsGoZzCyPA9unfHKqy+ZjJuz2Tk49JKn/83gx+pXScUsEecz6hmMkoDjm7+cvHCrzZ0kRj2DISgqVXJ1KuczEm02L3r3i53HvLPVu5MQaHfo1MHvZ837xPTlEa8s+9UxKb2xcE64k9k3YyestHS/zlYXfuBjtXLdn1ahRcV64ynpWKnX39+v/tP5clsjKblosfsfi3847nWD02IkpVrIlCAIgiDYcTNu+J+ML7se6LfT1Xubq+331me/P312JX3RZ5Or+E/qqhh1VfrX5XDvXN3q4r3NVa2PZ2rzClEezoy7olNGq+/PQTl8bSLk4aKc9BMti7kH7o/i6YdUZV3GpZ2vjnz7vUmb6NxWujx7MFMyq+54Hf3i1ZGvNnfMlLlH/bJ0Czc8uOSwwkDJKbNXecc15SrZ4wifrZ+1LDb9O/PAOwZjYnFx6Ondk7Ulp/641S2/W/Yu5bKr7al//FqdlpId8s+vXze1cL7FsdgkviCGfnTZRyNfnWi2zzVD0xmZl+K4e/X/DOz71NVHrsQV6FXLZyTabFk+obHMJ+ts/e6meZ4O8Q3IK2rRBn7OA0uzReO1FS782z1G062rzZQBnoevn1jyl6NnFr+NA14lfhR+ZN5fLobPequFTAmCIAiCXXXU+5+NfHPSyDcnoTLWW6OnqB+rFJxeb1ibPpNz3+DzpTZT7p9nsve09YOCojYOEklhIn357jMOyS3mD9IVMiUIgiAI9l8hU/ZDtZly8pZ/77cVKCmMn+O99jdbh+TSpwVKCjIlCIIgCPZjeaiMXfik5klb5jLqi8oU7SqZJyjl9Hgq6g4Jdpk0vx17lFcgZXbqRo7PrS3np+wWIVOCIAiCYL+1tKbIZcPI10e25bjJ03fa+axrR8kJny+ziun92NQOKyKdj3/Xjj368sdjPo96vbWQKXtAyJQgCIIg2F3Cue9+KGRKjZApQRAEQbC7hEzZD4VMqREyJQiCIAh2l5Ap+6GQKTVCpgRBEATB7hIyZT8UMqVGyJQgCIIg2F1CpuyHQqbUCJkSBEEQBLtLyJT9UMiUGiFTgiAIgmB3CZmyH9pjmVJVqRZXVtbXVWt/fW5VyqtEgj7QThAEQRB8/sWVtVVVFNiv3LVr36hRo0aNGnUt3LcbjyUjCgAAAAAAAAC6BmRKAAAAAAAAoKtApgQAAAAAAAC6CmRKAAAAAAAAoKtApgQAAAAAAAC6CmRKAOgchFIqEspQkuzk9phcKMdaXylR4p2smKJIElcqlESnt2+regJXysUSRNVTT9ANkDimlMtkCNaBV4HEMSWi6NAmfRRcqcRUqq7sJ66UyRRKFdGJo59AURXRsQ0JFFE+ZRuVQiKWKLCn1alSiOUo0ek3KwAA7QIyZW9CKKUisUjac1/+PQAqqakTShBVv/pwxuQikbx5eqx55Gl9KjilXoppl+NKiVAoQdoTBnEkO/Tf0AyDsZJEJOlh7vEsUeuZ86kQGFKdEvOQLer4sUUSmEIqlj11M1Ih4D8KcXS/WfD8pkpSUV308Kq//80nNe3N5oRKzMm6fzsyPq++WaokcRSRiYUiqVz53zjucV5yUlZeQRWC4Z3cH5zzKDgk6gGDL+5wFURdRlouj1cp7ACcxJgHBRUNSsOpkSiNdXXwuP6kSoy1mjqLIp2uJHOrJZ1KwQAAtBPIlL0GoZRw7nvauXmEZwt7uy0dIC/o5/2n7WOeVPWnWMm+42IfllxVI1SotMESyws/Y+vgRAt8XK1Sf61icla8h9VJl5tsRZtfXBgv1sXqrCOdHstsvorEZBnB/1qeOkdzuc3qXHsJTMF/4Hna2tbnPr9DqRJHRMyHgc4Bj7itx0oSEfATAqxsXP1Ckvida1+PQyqqix6G0axtvcJjn9S0YwNChVYXJEX6nnM4HxqTwpbpVSbjP4kLptk4h8Smc+Tq4gSB453vR+4ChAqRy+QKtLNhkKIoCucnXw1wsz0fmcasU3aqESjrYdAFuq29w+UkVq28Y9vWZVw97+xg7+hEayeO586csrK2tb+aUSs21FyiJjmY5uTg4HefJVIY/qOoiiJpDvZ2jv4PuW3+m4XJRaIunH4AgH5NuzIlgePiWiGvRvnc9kq0BYEp5BKBBO3tdmghEEnZbVdrmnPYswyUKlQhRpTKrnwdURRF5QXt2GNpdyu3Du2Vb9VegR1HP3fa0jm6VKLpw8Lyws/Y3ihUNp5AxGTCzEvnHJ1pdDrtZgn+9FCJydIvnXUMSm1ouYpUycpuuZw6Rw9NN7C2vRConHfX/d9TNo4hGR07wFBpfUaYta3Txcc1hr97SUTITwijez98jvIkSRC47qlcdaT09Y/IbE+epAiVsqY45eZF3+t382opQoUqEZ0T4KSM9yQuyD/0NqNOXRpTynlsDotb/oxPkhMYIpNU5SdE3YhNLKpG2rmFWCiS6vdH4rzkqwFX43J5ks42pOFJlK+7V1QmT9jhjnSiLuPqeZfLSdz69uwARVEUUZsa5kq7klYlMpx/iZrkYJrj1cw63c93TCEWCQVizflwrCiS5uBzly1pzz9YnHsX3CJSKwQKiJUA0GH+HwUZN6Do4c4LAAAAAElFTkSuQmCC" alt="" width="559" height="109" />
私有属性和公有属性的访问限制不同:
静态字段
- 公有静态字段:类可以访问;类内部可以访问;派生类中可以访问
- 私有静态字段:仅类内部可以访问;
class C: name = "公有静态字段" def func(self):
print (C.name) class D(C): def show(self):
print (C.name) C.name # 类访问 obj = C()
obj.func() # 类内部可以访问 obj_son = D()
obj_son.show() # 派生类中可以访问
公有静态字段
class C: def __init__(self):
self.__foo = "私有字段" def func(self):
print (self.foo) # 类内部访问 class D(C): def show(self):
print (self.foo) # 派生类中访问 obj = C() obj.__foo # 通过对象访问 ==> 错误
obj.func() # 类内部访问 ==> 正确 obj_son = D();
obj_son.show() # 派生类中访问 ==> 错误
私有字段
方法、属性的访问于上述方式相似,即:私有成员只能在类内部使用
普通字段
- 公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问
- 私有普通字段:仅类内部可以访问;
ps:如果想要强制访问私有字段,可以通过 【对象._类名__私有字段明 】访问(如:obj._C__foo),不建议强制访问私有成员。
class C: def __init__(self):
self.foo = "公有字段" def func(self):
print self.foo # 类内部访问 class D(C): def show(self):
print self.foo # 派生类中访问 obj = C() obj.foo # 通过对象访问
obj.func() # 类内部访问 obj_son = D();
obj_son.show() # 派生类中访问
公有字段
class C: def __init__(self):
self.__foo = "私有字段" def func(self):
print self.foo # 类内部访问 class D(C): def show(self):
print self.foo # 派生类中访问 obj = C() obj.__foo # 通过对象访问 ==> 错误
obj.func() # 类内部访问 ==> 正确 obj_son = D();
obj_son.show() # 派生类中访问 ==> 错误
私有字段
私有方法:
class Role():
n = 123
def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money
def __shot(self):
print("shooting...") def got_shot(self):
print("%s ah...,I got shot..." %self.name ) def buy_gun(self,gun_name):
print("%s just bought %s" %(self.name,gun_name)) r1 = Role('Alex','police','AK47')
r1.__shot()
##执行结果;
Traceback (most recent call last):
File "C:/Users/Administrator/PycharmProjects/s14/day6/cs.py", line 49, in <module>
r1.__shot()
AttributeError: 'Role' object has no attribute '__shot'
##因为方法已经私有化,在外面是无法调用的
私有方法
四、类的封装:
封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
- 将内容封装到某处
- 从某处调用被封装的内容
第一步:将内容封装到某处
self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1
当执行 obj2 = Foo('alex', 78 ) 时,self 等于 obj2
所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存。
第二步:从某处调用被封装的内容
调用被封装的内容时,有两种情况:
- 通过对象直接调用
- 通过self间接调用
1、通过对象直接调用被封装的内容
上图展示了对象 obj1 和 obj2 在内存中保存的方式,根据保存格式可以如此调用被封装的内容:对象.属性名
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age
obj1 = Foo('wupeiqi', 18)
print (obj1.name) # 直接调用obj1对象的name属性
print (obj1.age) # 直接调用obj1对象的age属性 obj2 = Foo('alex', 73)
print (obj2.name) # 直接调用obj2对象的name属性
print (obj2.age) # 直接调用obj2对象的age属性
2、通过self间接调用被封装的内容
执行类中的方法时,需要通过self间接调用被封装的内容
class Foo: def __init__(self, name, age):
self.name = name
self.age = age def detail(self):
print self.name
print self.age obj1 = Foo('wupeiqi', 18)
obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18 obj2 = Foo('alex', 73)
obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78
五、继承
继承是指这:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或“超类”。
继承概念的实现方式有三类:实现继承、接口继承和可视继承。
- 实现继承是指使用基类的属性和方法而无需额外编码的能力;
- 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
- 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。
继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。
例如:
猫可以:喵喵叫、吃、喝、拉、撒
狗可以:汪汪叫、吃、喝、拉、撒
如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实现他们所有的功能,如下所示:
class 猫: def 喵喵叫(self):
print '喵喵叫' def 吃(self):
# do something def 喝(self):
# do something def 拉(self):
# do something def 撒(self):
# do something class 狗: def 汪汪叫(self):
print '喵喵叫' def 吃(self):
# do something def 喝(self):
# do something def 拉(self):
# do something def 撒(self):
# do something
伪代码
上述代码不难看出,吃、喝、拉、撒是猫和狗都具有的功能,而我们却分别的猫和狗的类中编写了两次。如果使用 继承 的思想,如下实现:
动物:吃、喝、拉、撒
猫:喵喵叫(猫继承动物的功能)
狗:汪汪叫(狗继承动物的功能)
class 动物: def 吃(self):
# do something def 喝(self):
# do something def 拉(self):
# do something def 撒(self):
# do something # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 猫(动物): def 喵喵叫(self):
print '喵喵叫' # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 狗(动物): def 汪汪叫(self):
print '喵喵叫'
伪代码
class Animal: def eat(self):
print "%s 吃 " %self.name def drink(self):
print "%s 喝 " %self.name def shit(self):
print "%s 拉 " %self.name def pee(self):
print "%s 撒 " %self.name class Cat(Animal): def __init__(self, name):
self.name = name
self.breed = '猫' def cry(self):
print '喵喵叫' class Dog(Animal): def __init__(self, name):
self.name = name
self.breed = '狗' def cry(self):
print '汪汪叫' # ######### 执行 ######### c1 = Cat('小白家的小黑猫')
c1.eat() c2 = Cat('小黑的小白猫')
c2.drink() d1 = Dog('胖子家的小瘦狗')
d1.eat()
代码实例
所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。
注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。
学习了继承的写法之后,我们用代码来是上述阿猫阿狗的功能:
class Animal: def eat(self):
print "%s 吃 " %self.name def drink(self):
print "%s 喝 " %self.name def shit(self):
print "%s 拉 " %self.name def pee(self):
print "%s 撒 " %self.name class Cat(Animal): def __init__(self, name):
self.name = name
self.breed = '猫' def cry(self):
print '喵喵叫' class Dog(Animal): def __init__(self, name):
self.name = name
self.breed = '狗' def cry(self):
print '汪汪叫' # ######### 执行 ######### c1 = Cat('小白家的小黑猫')
c1.eat() c2 = Cat('小黑的小白猫')
c2.drink() d1 = Dog('胖子家的小瘦狗')
d1.eat()
代码实例
那么问题又来了,多继承呢?
- 是否可以继承多个类
- 如果继承的多个类每个类中都定了相同的函数,那么那一个会被使用呢?
1、Python的类可以继承多个类,Java和C#中则只能继承一个类
2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先
- 当类是经典类时,多继承情况下,会按照深度优先方式查找
- 当类是新式类时,多继承情况下,会按照广度优先方式查找
经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。
class D: def bar(self):
print 'D.bar' class C(D): def bar(self):
print 'C.bar' class B(D): def bar(self):
print 'B.bar' class A(B, C): def bar(self):
print 'A.bar' a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> D --> C
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()
经典类多继承
class D(object): def bar(self):
print 'D.bar' class C(D): def bar(self):
print 'C.bar' class B(D): def bar(self):
print 'B.bar' class A(B, C): def bar(self):
print 'A.bar' a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()
新式类多继承
经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
注意:在上述查找过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
六、多态
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
class Animal:
def __init__(self, name): # Constructor of the class
self.name = name
def talk(self): # Abstract method, defined by convention only
raise NotImplementedError("Subclass must implement abstract method") class Cat(Animal):
def talk(self):
return 'Meow!' class Dog(Animal):
def talk(self):
return 'Woof! Woof!' animals = [Cat('Missy'),
Dog('Lassie')] for animal in animals:
print animal.name + ': ' + animal.talk()
【python之旅】python的面向对象的更多相关文章
- Python之旅Day7 面向对象&异常处理
########################################面向对象初识######################################### 面向对象简介 面向对象编 ...
- 【Python之旅】第六篇(七):开发简易主机批量管理工具
[Python之旅]第六篇(七):开发简易主机批量管理工具 python 软件开发 Paramiko模块 批量主机管理 摘要: 通过前面对Paramiko模块的学习与使用,以及Python中多线程与多 ...
- Python之旅Day1 数据类型初识(数字|字符串|列表|数据运算) 编码 表达式(if...else|for|while)
初识PYTHON Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum(吉多·范罗苏姆)于 ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
- 简学Python第六章__class面向对象编程与异常处理
Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群 群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...
- 简学Python第七章__class面向对象高级用法与反射
Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群 群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...
- 开始 Python 之旅
开始 Python 之旅 课程来源 本课程基于 Python for you and me 教程翻译制作,其中参考了 Python tutorial 和 The Python Standard Lib ...
- Python快速学习05:面向对象
系列文章:[传送门] Python对象是Python语言的核心部分.Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称O ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
随机推荐
- 配置好maven后,设置tomcat:run运行程序
1.要在intellij idea使用maven,同样是先要配置maven的路径,不过intellij idea已经集成maven插件了,省去了安装的麻烦 2.创建maven web项目 点击fini ...
- (转)在javascript中关于submit和button提交表单区别
原文来自:http://www.jb51.net/article/42236.htm submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了,submit和b ...
- 开源免费天气预报接口API以及全国全部地区代码!!(国家气象局提供)
国家气象局提供的天气预报接口 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data ...
- VoltDB公布4.0版本号,大步提高内存实时分析速度,进军操作数据库市场
号称世界上最快的关系数据库的VoltDB与2014年1月29号(美国东部时间)公布下一代数据库4.0版本号.新的版本号有非常多地方的改进,大步挺高系统性能.在过去的13年,VoltdDB号称自己公司较 ...
- value must be omitted for boolean attributes
jsx文件中 html5一些标签的属性是boolean的,<div hidden="true">是不被允许的,要改成<div hidden>或<div ...
- PHP中用mysqli面向过程打开连接关闭mysql数据库
代码如下: <meta http-equiv="content-type" content="text/html" charset="utf-8 ...
- Spring定时任务,Spring4整合quartz2.2,quartz-scheduler定时任务
Spring4整合quartz2.2,quartz-scheduler定时任务,Spring定时任务 >>>>>>>>>>>>& ...
- readonly时禁用删除键,readonly按删除键后页面后退解决方案
readonly时禁用删除键, readonly按删除键后页面后退解决方案 >>>>>>>>>>>>>>>&g ...
- ADO.Net技术
Connection对象 1.连接数据库 通过SqlConnection对象的State属性判断数据库的连接状态: public override ConnectionState State{ get ...
- PHP如何解决网站大流量与高并发的…
首先,确认服务器硬件是否足够支持当前的流量. 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻 ...