zope bible phần 6 ppt

65 208 0
zope bible phần 6 ppt

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

295 Chapter 10 ✦ Creating a Multi-User AddressBook <td><input type=text name=”title”></td> </tr> <tr> <td colspan=2><input type=submit value=”Add Addressit”></td> </tr> </table> </form> <dtml-var standard_html_footer> This code is almost completely identical to the addAddressbookForm.dtml file, except for different labels on the form, and a different target ( manage_addAddressit) for the form. Next add an indexAdressit.dtml file to the same folder, with the code from Listing 10-2. Listing 10-2: IndexAddressit.dtml <dtml-var standard_html_header> <dtml-unless SelectedGroup> <dtml-call “REQUEST.set(‘SelectedGroup’, ‘All’)”> </dtml-unless> <dtml-unless start> <dtml-call “REQUEST.set(‘start’, 1)”> </dtml-unless> <dtml-unless sort_by> <dtml-call “REQUEST.set(‘sort_by’, ‘LastName,FirstName,MiddleInitial’)”> </dtml-unless> <form action=”.” method=”post”> <table border=0 cellpadding=2 cellspacing=0 width=”100%”> <tr> <td colspan=5> <table border=”0” cellpadding=”0” cellspacing=”0” width=”100%”> <tr> <td align=”right”> <input type=”submit” name=”index_html:method” value=”View”> <select size=1 name=”SelectedGroup”> <option value=”All”>All Groups <dtml-in listGroups> <option value=”&dtml-sequence-item;”<dtml-if Æ SelectedGroup><dtml-if “_[‘sequence- Æ item’]==SelectedGroup”>selected</dtml-if></dtml-if>><dtml-var Æ sequence-item> Continued e4857-3 Ch10.F 3/1/02 9:40 AM Page 295 296 Part II ✦ Building Zope Products Listing 10-2 (continued) </dtml-in> </select> </td> </tr> </table> </td> </tr> <tr> <td colspan=5> <p align=center> <dtml-in “listEntriesByGroup(_[‘SelectedGroup’])” Æ previous size=20 start=start sort_expr=”sort_by”> <dtml-in previous-batches mapping> [<a href=”&dtml-absolute_url;?start=&dtml-batch-start- Æ number;&sort_by=&dtml-sort_by;&SelectedGroup=&dtml- Æ SelectedGroup;”><dtml-var batch-start-number> - Æ <dtml-var batch-end-number></a>] </dtml-in> </dtml-in> <dtml-in “listEntriesByGroup(_[‘SelectedGroup’])” Æ size=20 start=start sort_expr=”sort_by”> <dtml-if sequence-start> [<dtml-var expr=”_[‘sequence-index’]+1”> - </dtml-if> <dtml-if sequence-end> <dtml-var expr=”_[‘sequence-index’]+1”>] </dtml-if> </dtml-in> <dtml-in “listEntriesByGroup(_[‘SelectedGroup’])” next size=20 start=start sort_expr=”sort_by”> <dtml-in next-batches mapping> [<a href=”&dtml-absolute_url;?start=&dtml-batch-start- Æ number;&sort_by=&dtml-sort_by;&SelectedGroup=&dtml- Æ SelectedGroup;”><dtml-var batch-start-number> - Æ <dtml-var batch-end-number></a>] </dtml-in> </dtml-in> </p> </td> </tr> <tr> <th><a href=”&dtml-absolute_url;?sort_by=LastName,FirstName, Æ MiddleInitial&SelectedGroup=&dtml-SelectedGroup;”>Name</a></th> <th><a href=”&dtml-absolute_url;?sort_by= Æ Title&SelectedGroup=&dtml- SelectedGroup;”>Title</a></th> <th><a href=”&dtml- absolute_url;?sort_by=Company&SelectedGroup=&dtml- Æ e4857-3 Ch10.F 3/1/02 9:40 AM Page 296 297 Chapter 10 ✦ Creating a Multi-User AddressBook SelectedGroup;”>Company</a></th> <td>&nbsp;</td> </tr> <dtml-in “listEntriesByGroup(_[‘SelectedGroup’]) Æ “ size=20 start=start sort_expr=”sort_by”> <tr <dtml-if sequence-even>bgcolor=”#CCCCCC”</dtml-if>> <td><a href=”&dtml-absolute_url;”><dtml-var title></td> <td><dtml-var Title>&nbsp;</td> <td><dtml-var Company>&nbsp;</td> <td><a href=”&dtml- absolute_url;/editEntryForm”>Edit</a></td> </tr> </dtml-in> </form> </table> <dtml-var standard_html_footer> This code is very similar (but not identical) to the equivalent method for an AddressBook. Basically, the differences are that this screen does not have the con- trols for adding or deleting Entries directly, and it uses a <dtml-var absolute_url> to correctly construct the links to the Entries (and their edit screens) inside their respective AddressBooks. (This is also why we took such care to wrap the entries with the AddressBooks from which they came in the Addressit class’s listEntries ByGroup method; otherwise, absolute_url wouldn’t work correctly.) And we’ve removed the standard_addressbook_header. Now, you can refresh the Addressit product, and try instantiating some objects! Adding AddressBooks Adding an Addressit object is just like adding an AddressBook. Choose Addressit from the drop-down menu, and fill in the resulting form with the id of test. Click the Add Addressit button. You are returned to the folder to which you added the Addressit, so click on the test object to see its management screen, which should look like the one shown in Figure 10-1. As you can see, the interface looks like an ordinary folder, except that in place of a drop-down box to add objects, only an Add AddressBook button appears. This is because AddressBooks are the only type of object that can be added to the Addressit object, and the Zope management interface detects that only one kind of object is addable, so it displays a button instead of a drop-down. e4857-3 Ch10.F 3/1/02 9:40 AM Page 297 298 Part II ✦ Building Zope Products Figure 10-1: The Addressit Management Interface Add a couple of AddressBooks to the Addressit (call them 01 and 02), and you see them listed in the interface, just like an ordinary folder, as shown in Figure 10-2. You can see that the Addressbooks are displayed here much as they would be in an ordinary folder. Clicking through to the individual AddressBooks reveals the usual management interface for the Addressbooks, and clicking through the View tab reveals the normal user interface for the AddressBook. (Hah! I could tell you thought I was going to pull out another screenshot!). Go ahead and add some entries and some groups to each AddressBook (give each AddressBook a Musician group), and assign some of the Entries to groups. Now that you’ve populated the AddressBooks with users and groups, you can check out the Addressit’s user interface. Click on the View tab in the Addressit object to see how the AddressBook contents are being aggregated. You should see something similar to the view shown in Figure 10-3. e4857-3 Ch10.F 3/1/02 9:40 AM Page 298 299 Chapter 10 ✦ Creating a Multi-User AddressBook Figure 10-2: The Addressit Management Interface, with two AddressBook instances Figure 10-3: The Addressit index_html view e4857-3 Ch10.F 3/1/02 9:40 AM Page 299 300 Part II ✦ Building Zope Products As you can see from the screenshot, the Musicians group name appears twice. This is because a Musicians group is defined in each AddressBook. Oops. The solution is simple: Eliminate duplicates from the Group list. Edit the Addressit class’s listGroups method (not the AddressBook class’s!) to read as follows: def listGroups(self): “Returns a list of Groups from all AddressBooks” AllGroups = [‘Unfiled’] for Object in self.objectValues(): for Group in Object.listGroups(): if Group in AllGroups: continue AllGroups.append(Group) return AllGroups What we’ve changed here is the comparison operation in the innermost loop. Whereas before it was checking to see if the Group in question was another Unfiled group, now it only checks to see if the group already exists in the AllGroups list, and if so, it skips appending it. You can see the result in Figure 10-4. Figure 10-4: The Addressit index_html View, with redundant groups eliminated e4857-3 Ch10.F 3/1/02 9:40 AM Page 300 301 Chapter 10 ✦ Creating a Multi-User AddressBook Public and Private AddressBooks At this point, the Addressit folder can aggregate any AddressBooks within it into a single navigable interface. However, it is doing so indiscriminately, which wasn’t quite what we wanted. We wanted a user’s private AddressBook to be seamlessly merged into a single view with any public AddressBooks. Adding a Public attribute to the AddressBook class The first step to getting this working is to add a Public attribute to the AddressBook class that defaults to off. First, edit the AddressBook.py file as follows. Add a Public variable to the __init__: def __init__(self, id, title): self.id = id self.title = title self.ContactTypeList = [‘Email’, ‘Home’, ‘Mobile’, ‘Work’, ‘Pager’, ‘ICQ/IM’, ‘URL’, ‘Extension’] self.Entries = {} self.LastEntryID = 0 self.GroupList = [‘Unfiled’] self.Public = 0 Next, change the editAddressBook method to change the value of the property depending on when the box is checked: def editAddressBook(self, title, REQUEST, Public = None): “A method to edit Address Book Properties” self.title = title self.Public = Public Edit the mainAddressBook.dtml as follows: <dtml-var manage_page_header> <dtml-var manage_tabs> <form method=post action=editAddressBook> <table border=0 cellspacing=0 cellpadding=5> <tr> <td>Title:</td> <td><input type=text name=”title” value=”&dtml-title;”></td> </tr> <tr> <td>Public:</td> e4857-3 Ch10.F 3/1/02 9:40 AM Page 301 302 Part II ✦ Building Zope Products <td><input type=”checkbox” name=”Public” <dtml-if Æ Public>checked=”checked”</dtml-if>></td> </tr> <tr> <td colspan=2><input type=submit value=”Edit AddressBook”></td> </tr> </table> </form> </body> </html> <dtml-var manage_page_footer> Using the Public attribute In order to use the Public attribute to control the visibility of the AddressBooks, you need to change the Addressit class’s listEntriesByGroup and listGroups methods to skip non-public AddressBook instances, so edit those two Addressit.py methods as follows: def listGroups(self): “”” Returns a list of Groups from AddressBooks “”” AllGroups = [‘Unfiled’] for Object in self.objectValues(): if not Object.Public: continue for Group in Object.listGroups(): if Group in AllGroups: continue AllGroups.append(Group) return AllGroups def listEntriesByGroup(self, group = “All”): “”” Returns Entries from AddressBooks that match the Group “”” AllEntries = [] for Object in self.objectValues(): if not Object.Public: continue for Entry in Object.listEntriesByGroup(group=group): WrappedEntry = Entry.__of__(Object) AllEntries.append(WrappedEntry) return AllEntries e4857-3 Ch10.F 3/1/02 9:40 AM Page 302 303 Chapter 10 ✦ Creating a Multi-User AddressBook Save the changes you’ve made to all three files, and refresh the product. Edit each AddressBook management interface at least once (whether you set the Public prop- erty on or off), in order to create and set the Public property; otherwise, you get an error when you view the Addressit because listEntriesbyGroup and listGroups both expect AddressBook instances to have a Public property. You can now test your Addressit. Which AddressBooks are incorporated into the Addressit View depends on which have their Public property set. Incorporating the user’s private AddressBooks Aggregating all public AddressBooks still isn’t quite what we want. We also want the user’s personal AddressBook to be merged into the public ones when they’re view- ing the Addressit object, even though it’s not set to be public. The trick is to figure out how to distinguish which AddressBooks belong to the par- ticular user viewing the page. Fortunately, Zope has a fairly well developed security system that we can leverage. We can simply check for AddressBook objects that the user has a certain role for. We can choose one of two roles, Owner or Manager, to make the distinction. Either will work, but there are tradeoffs. The Manager role is currently the role that has the Manage AddressBook permission, which enables the user to add, edit, and delete Entries and groups. So it’s easy to detect this role in determining whether to include a non-public AddressBook in the aggregation. On the other hand, the Owner role is a bit of a more natural fit, because we are looking for Addressbooks that are Owned by the current user. The decision in this case becomes simpler when you realize that the user is unlikely to have an Owner role on an AddressBook unless he or she instantiated it himself or herself, whereas a Manager role is a prerequisite to being able to use the AddressBook at all. Therefore, we’ll go with the Manager role. So, we need to edit the listGroups and listEntriesByGroup methods in the Addressit class as follows: def listGroups(self): “”” Returns a list of Groups from all AddressBooks “”” AllGroups = [‘Unfiled’] for Object in self.objectValues(): if not Object.Public: if not self.REQUEST.AUTHENTICATED_USER.has_role([‘Manager’], Æ Object): continue for Group in Object.listGroups(): if Group in AllGroups: continue AllGroups.append(Group) return AllGroups e4857-3 Ch10.F 3/1/02 9:40 AM Page 303 304 Part II ✦ Building Zope Products def listEntriesByGroup(self, group = “All”): “”” Returns Entries from all AddressBooks that match the Group “”” AllEntries = [] for Object in self.objectValues(): if not Object.Public: if not self.REQUEST.AUTHENTICATED_USER.has_role([‘Manager’], Æ Object): continue for Entry in Object.listEntriesByGroup(group=group): WrappedEntry = Entry.__of__(Object) AllEntries.append(WrappedEntry) return AllEntries After making this change, a user will be presented with an aggregated view only of public AddressBooks and ones that the user has a Manager role on. Unfortunately, we don’t actually have a way of giving a user the manager role, because AddressBooks don’t yet have a security tab. We can fix that too by changing the manage_options class property (which defines what tabs are displayed in the management view) of the AddressBook class (in AddressBook.py) from: manage_options=( {‘label’:’Edit’, ‘action’:’manage_main’ }, {‘label’:’View’, ‘action’:’index_html’} ) To the following: manage_options=( {‘label’:’Edit’, ‘action’:’manage_main’ }, {‘label’:’View’, ‘action’:’index_html’} )+SimpleItem.manage_options This causes the AddressBook class to not simply override the SimpleItem’s class attribute with its own tabs, but to extend them instead. As the SimpleItem class adds the RoleManager class’s Security tab to the Item class’s History and Undo tabs, the AddressBook now has all of these, in addition to the Edit and View tabs defined in the AddressBook class itself. In any case, after refreshing the product, you will find that the AddressBook manage- ment interface now has all the above-mentioned tabs, and that the security tab (which has a local-roles interface) enables you to assign a user a local role of Manager on an AddressBook to a user. Furthermore, the Addressit object now dis- plays in a single aggregated view all public AddressBooks and whatever non-public AddressBooks the user has management privileges on. The user of course has to be authenticated (logged in) in order for this to work. e4857-3 Ch10.F 3/1/02 9:40 AM Page 304 [...]... thus completing the separation Chapter 18 discusses Zope Presentation Templates, and how they can be used to build user interfaces Zope 2.5 is the first version to include Page Templates in the base distribution 315 g4857-3 Ch11.F 3 16 3/1/02 9:40 AM Page 3 16 Part III ✦ Zope Management It is anticipated that in the future, most new development with Zope will use Page Templates for Presentation, and Python... these steps: 1 While logged into Zope, select Version from the drop-down menu of addable objects 2 Zope displays the add version page Name your version “Updates” and set the title to “Navigation Updates.” Click the Add button 325 g4857-3 Ch11.F 3 26 3/1/02 9:40 AM Page 3 26 Part III ✦ Zope Management 3 Zope returns you to the Root Folder’s management screen and your new Version labeled “Updates” appears... now, you should be fairly familiar with Zope s containment hierarchy, as exposed in the Zope Management Interface by the file browser However, Zope objects are not merely contained within their parent objects, they also acquire their attributes This is a little easier to show then to talk about, so we’ll walk you through a short demonstration: 1 Make sure your Zope site has an index_html method in it... any other Zope object Go to the Content screen of any folder in Zope From the list of available objects, select Version Zope will prompt you for the id and optional Title of the new version When finished, click the Add button Notice that the version you just added appears in the content list with a red diamond icon To create a version called “Updates,” follow these steps: 1 While logged into Zope, select... refresh the product, you’ll find that any AddressBook instances now have a help link on their Edit tabs that pops up the Zope help with the Addressit help document You can in this way add separate help topics for each tab you define in any of your objects Adding an Icon Zope icons are all 16 16 pixel GIFs Adding one to a product is simple First, add the icon to the product folder In this case, the icon file... 2 Zope displays the Join/Leave page Click the Save/Discard tab 3 If there are any changes to be saved Zope will give you a text widget where you can make a comment about the changes you’ve made If there are no changes to be made, Zope will inform you of this 4 Enter in a note such as, “Added link to the product section,” and click the Save button Alternately, you can click the Discard button and Zope. .. are displayed in one place CrossReference Extending Zope with new object types is covered in Chapter 16, which discusses ZClasses, and in chapters 6 through 10, which show you how to build Python Products Separation of Presentation from Logic For a long time, the only way to add logic (behavior) to a Zope Web site was by using DTML or External Python Methods DTML was certainly easier to use, as it could... do When you join a version, Zope sets a special cookie that your browser will pass back with every request This cookie tells Zope that you are working in version that is different from the default version everyone else sees The management screens will inform you that you are working a version by cleverly stating, “You are working in version /version name.” (See Figure 11 -6. ) You can join or leave a... 11 -6: Joining a version To join the version in our sample project, follow these steps: 1 From the Root Folder click the object with the red diamond labeled “Updates.” 2 Zope displays the Join/Leave view for the Updates object 3 Click the button labeled “Start Working in Navigation Updates.” If you are already working in a version the button will be labeled “Quit Working in Navigation Updates.” 4 Zope. .. the Addressit user interface to a user that has his or her own AddressBook look like the one shown in Figure 10-5 Figure 10-5: The Addressit index_html method 305 e4857-3 Ch10.F 3 06 3/1/02 9:40 AM Page 3 06 Part II ✦ Building Zope Products Finishing Touches The Addressit application is now functionally complete, but it is lacking a few finishing touches before it is ready to be distributed as a product . src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABCYAAANpCAIAAABYYK9fAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42u3dS4+k51338bvOxz73zLjHsccmxAw4JEKKhBCILEgkNpFQxCuAF8B7gi3LrGCBrEhICMTBiZIANk7iTDKZQ09XV9V917mexU99q59E6AmPPDixP5+F1e5DdU13L+qr6/pfV+Nb775bAAAAvBxNPwIAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAPh6N/X7vpwAAALwkVjkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACSHHwEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHH4EAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHL4EQAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMA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. src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABCYAAANpCAIAAABYYK9fAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42u3dS4+k51338bvOxz73zLjHsccmxAw4JEKKhBCILEgkNpFQxCuAF8B7gi3LrGCBrEhICMTBiZIANk7iTDKZQ09XV9V917mexU99q59E6AmPPDixP5+F1e5DdU13L+qr6/pfV+Nb775bAAAAvBxNPwIAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAPh6N/X7vpwAAALwkVjkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACSHHwEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHH4EAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHL4EQAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMA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. src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABCYAAANpCAIAAABYYK9fAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42u3dS4+k51338bvOxz73zLjHsccmxAw4JEKKhBCILEgkNpFQxCuAF8B7gi3LrGCBrEhICMTBiZIANk7iTDKZQ09XV9V917mexU99q59E6AmPPDixP5+F1e5DdU13L+qr6/pfV+Nb775bAAAAvBxNPwIAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAPh6N/X7vpwAAALwkVjkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACSHHwEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHH4EAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHL4EQAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMA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

Ngày đăng: 14/08/2014, 06:22

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan