Tìm hiểu về "trái tim" bên trong các trình duyệt

Tìm hiểu về "trái tim" bên trong các trình duyệt

Mạnh Cường  | 17/07/2011 12:00 PM

thích

Bạn đã sử dụng qua hầu hết các trình duyệt web như Firefox, Internet Explorer, Google Chrome hay Opera,... và cũng từng nghe đến những lời giới thiệu về engine cho các trình duyệt đó mỗi khi các hãng phát triển công bố phiên bản mới của chúng.

Vậy bạn có bao giờ tự hỏi chúng là gì và tại sao lại quan trọng đến như vậy không? Nếu đã từng có lần tự hỏi bản thân như thế thì thông qua bài viết ngắn này, bạn sẽ có được những thông tin hữu ích về trái tim của hầu hết các trình duyệt ngày nay.
 
Chúng ta sẽ bắt đầu với khái niệm engine của trình duyệt hay nói đầy đủ hơn là layout engine. Bạn có thể hiểu một cách đơn rằng nếu thiếu đi engine, website sẽ không thể biên dịch và lúc đó, những thứ trình bày cho người duyệt web chỉ là những đoạn mã mà nhà phát triển đã sử dụng để thiết kế website mà thôi.
 
Ngày nay, có bốn engine chi phối toàn bộ các ứng dụng duyệt web. Lần lượt chúng là Trident, Gecko, Webkit và Presto. Chúng ta sẽ đến với Trident trước tiên, engine thuộc sở hữu của đại gia Microsoft.
 
Trident được ra mắt đầu tiên vào năm 1997, thời điểm công bố phiên bản Internet Explorer 4 của Microsoft. Trident là một kiến trúc được Microsoft thiết kế nhằm tạo sự dễ dàng hơn cho các nhà phát triển muốn sử dụng engine này để tạo nên các sản phẩm khác.
 
 
Engine này được đóng gói thành một tập tin mshtml.dll giúp các nhóm phát triễn dễ dàng sử dụng. Mặc dù kiến trúc của Trident được chia thành nhiều tập tin mã nhị phân khác nhau, nhưng quan trọng nhất vẫn là mshtml.dll.
 
Mặc dù không công bố mã nguồn Trident, nhưng Microsoft hoàn toàn cho phép sử dụng miễn phí engine này, cũng vì thế mà ngày nay có khá nhiều trình duyệt web được phát triển dựa trên Trident, có thể kể ra những cái tên cũng khá nổi tiếng như Maxthon, Avant. Ngoài ra, những ứng dụng quen thuộc của Microsoft Outlook hay Outlook Express hay như Skype cũng sử dụng engine Trident nhằm biên dịch các đoạn mã HTML.
 
 
Bất cứ một layout engine nào cũng cần phải đáp ứng được các chuẩn của tổ chức World Wide Web Consortium (W3C), tổ chức được thành lập nhằm quản lý cũng như phát triển các chuẩn dành cho thế giới internet.
 
Với phiên bản Trident 5 dành cho Internet Explorer 8 và 9, engine này hoàn toàn có thể biên dịch các chuẩn internet mới như CSS3 và HTML5. Mặc dù với một số tổ chức mở rộng của CSS3 thì Trident 5 chưa thật sự hoàn chỉnh. Bên cạnh đó, với bài kiểm tra trình duyệt Acid2, Trident 5 cũng hoàn thành rất xuất sắc. Phiên bản Trident 6 dành cho Internet Explorer 10 được phát triển hỗ trợ HTML5 và CSS3 rất tốt.
 
 
Mặc dù rất mạnh và tiện dụng trong việc hỗ trợ phát triển ứng dụng. Nhưng Microsoft cũng không thể sử dụng Trident cho hệ điều Mac, điều này là dễ hiểu bởi cả hai nền tảng của cả hệ điều hành này là quá khác nhau. Microsoft đã phát triển một engine khác với tên gọi Tasman, vẫn dựa trên một số thành phần của Trident.
 
Tasman hoạt động hiệu quả tới mức mà vào thời điểm sắp ra mắt Internet Explorer 7, đã có tin đồn Tasman sẽ thay thế Trident nhưng điều này đã không xảy ra. Về sau, Microsoft đã thôi không dùng Tasman mà chuyển sang sử dụng WebKit cho phiên bản Microsoft Outlook dành cho MAC.
 
Tiếp đến là layout engine Gecko. Ban đầu là dự án được Netscape phát triển nhằm khắc phục những yếu kém của trình duyệt Netscape vào năm 1997. Tại thời điểm đó, trình duyệt Netscape hoàn toàn thua sút so với Internet Explorer của Microsoft và không thể đáp ứng các chuẩn của tổ chức W3C.
 
 
Ban đầu, Gecko có tên mã dự án là Raptor. Gecko phân chia thành hai phần quan trọng, một là Browser Engine, thành phần này bao gồm các phương thức khác nhau phục vụ cho việc tương tác của người dùng với trình duyệt. Theo cấu trúc thiết kế của Gecko, Browser Engine sẽ nhận mọi yêu cầu sử dụng từ phía người dùng, rồi sau đó sẽ đưa xuống cho thành phần thứ hai của layout engine này, có tên gọi Rendering Engine.
 
Thành phần Rendering Engine sẽ biên dịch các mã được nhà thiết kế website sử dụng như HTML, XML, Javascript,... hoàn thành việc biên dịch này, Rendering Engine sẽ trả về kết quả hoàn chỉnh là website cho người dùng.
 
 
Để thực hiện điều này, Redering Engine sử dụng lần lượt các thành phần với chức năng xử lý cụ thể. Necko, có nhiệm vụ đảm bảo tính chất bảo mật và sự đúng đắn trong các giao thức internet HTTP hay FTP. Tiếp đến là Spider Monkey, trình thông dịch Javascript của Gecko. Để xử lý mã XML, Gecko cũng sở hữu một thành phần riêng cho ngôn ngữ định dạng này. Cuối cùng, để tái tạo lại giao diện và các đối tượng hình ảnh, Gecko sử dụng thư viện GTK+ lâu đời.
 
Sau khi mua lại Netscape vào tháng 7 năm 2003, AOL đã ngừng phát triển Gecko, layout engine này được tiếp tục phát triển bởi Mozilla như bạn đã biết ngày nay.
 
 
Với mã nguồn mở, Gecko đã được sử dụng cho rất nhiều trình duyệt sau này như K-Meleon, Seamonkey và cả trình quản lý thư điện tử Thunderbird. Điểm kém nhất của Gecko là khả năng bảo mật nếu so sánh với Trident.
 
Gecko cũng hoàn thành xuất sắc bài kiểm tra Acid2 nhưng có một số tính năng CSS3 mà engine này vẫn chưa hoạt động tốt lắm. Với HTML5, Gecko cũng hoạt động tương đối trơn tru.
 
Ra đời sau Trident và Gecko chỉ một năm, tính đến thời điểm hiện tại, WebKit đã có 12 năm phát triển và ngày nay là một trong những layout engine ưa thích của nhiều hãng phát triển nổi tiếng như Adobe, Samsung hay Google với sản phẩm hết sức quen thuộc, trình duyệt Google Chrome và Safari của Apple.
 
 
Tiền thân của WebKit là dự án của KDE, tổ chức phát triển ứng dụng miễn phí cho hầu hết các môi trường khác nhau. WebKit bao gồm hai kỹ thuật chính, đã được KDE phát triển, đó là KHTML và KJS.
 
Cấu thành WebKit bao gồm hai phần chính là WebCore và JavaScriptCore. WebCore đảm nhiệm vai trò biên dịch các thành phần định dạng hình ảnh của một website như HTML, CSS và đặc biệt là định dạng hình ảnh SVG, loại hình ảnh dựa trên ngôn ngữ định dạng dữ liệu XML với khả năng trình bày hình ảnh vượt trội so với các loại hình ảnh quen thuộc đã biết như JPEG hay PNG.
 
 
Bên cạnh đó, WebCore cũng hoàn thành xuất sắt cả hai bài kiểm tra Acid2 và Acid3 với tốc độ xử lý cực nhanh và tốn rất ít tài nguyên phần cứng. WebCore cũng đáp ứng các chuẩn định dạng được W3C qui định với khả năng xử lý CSS3 và HTML5 rất tốt.
 
Tiếp đến là JavaScriptCore. Được phát triển dựa trên KJS đã đề cập ở trên cùng với một số cải tiến sáng giá. JavaScriptCore của Wbekit có khả năng thu dọn rác rất tốt, điều này cải thiện tài nguyên phần cứng mỗi khi trình duyệt hoạt động. Không những thế, JavaScriptCore còn vượt qua bài kiểm tra chuẩn Javscript của Mozilla.
 
 
Apple đã công bố chuẩn WebKit2 với khả năng xử lý nhiều tiến trình cùng một lúc giúp gia tăng hiệu suất xử lý của trình duyệt Safari. Đối với Google, Chrome Webkit cũng đã trình làng kỹ thuật này sớm hơn.
 
Ngoài là "trái tim" của trình duyệt Safari và Google Chrome. WebKit còn được sử dụng cho nhiều sản phẩm khác nhau như iPhone hay iPod và những ứng dụng dành cho thiết bị công nghệ mới sau này của Adobe như Adobe Air.
 
Cuối cùng là Presto, layout engine của trình duyệt Opera. Layout engine này được Opera công bố vào năm 2003 dành cho phiên bản Opera 7 nhằm thay thế cho engine cũ Elektra của hãng và được sử dụng cho đến tận ngày hôm nay với Opera 11.
 
 
Khác hẳn với cả ba trình duyệt đã đề cập ở trên, Presto thuộc sở hữu độc quyền của Opera và họ vẫn không công bố chi tiết công nghệ của mình, chỉ những đối tác từ hãng thứ ba mới có được những thông tin phát triển khi đã mua quyền sử dụng Presto của Opera mà thôi.
 
Presto có khả năng làm việc tuyệt vời với Javascript và vượt qua rất nhiều cuộc thử nghiệm Javascript khác nhau. Tương tự như engine WebKit, Presto cũng hoàn thành xuất sắc cả hai bài kiểm tra chuẩn Acid2 và Acid3.
 
 
Bên cạnh đó, một số ứng dụng của Nintendo cũng sử dụng Presto làm layout engine. Trước đây, Adobe cũng đã sử dụng layout engine này cho một số sản phẩm của mình, nhưng về sau họ đã từ bỏ nó để sử dụng WebKit.
 
Đó là đôi nét sơ lược về những thứ ẩn sâu bên trong mỗi trình duyệt các bạn đang dùng, qua đây chúng ta có thể hiểu được đâu là nguyên nhân dẫn đến sự khác nhau về tốc độ giữa các trình duyệt phổ biến ngày nay.
 

    Tham khảo XS Kết Quả để xem kết quả xổ số.

    Xem lịch âm dương tại Xem Lịch Âm.

    Xem bong da Xem bong da 247.

    Công cụ tính toán https://calculatorss.us.

    Tin tức game https://gamekvn.club.

    r8o92QOJorjlVZ G2Nz00QA94VFHB7U z4 lrin5U3KfwULD2 7GLR2tiJbwDGHEqQAdGAUDQPXwhOMt3MOJU09hghn0QqB7u0po2oCmYymZ Vs3gd8GjHkYxiuLRWmzV76cJZhH8bAzPKwIkaFGFWoaA0JP3RgZqbcvlHUQFBBsf59uIaQKmxp SzbErFKjAqMjcB3ywQvS2dXfbUQZ nbbtDpRTdyYEvSV7TJuv6o2FyYmzphcy nXNPyZs15lMPQaj5q9kYUADajnEKEnXF5sguKuJ6KU4jjwzyWgI6g906X uWwWJFQdpRLVX1gerpb5Y8rLYXqMsK8HTOWLs3 BAonGShkLPv43gCGtaSvT 1 NKGFeZX2PyeDdLLXwAgtUtmthDmBSdmF5sR21ZlwXPrxDG8kvBSxd8EmOZZbZFFgZt0GeTptbVBJIYohUzDNxvY8t4aZVWKKumyoYal8gHbHFOj8xa3dhEg Sjs7UElXWbvsbGDJ1I6gV2ynsOGmdJxT2AOsf6akmfJMNSywBLCMDbgA3DrrEA4A16Pos0f7GLJ2fuwHKVgmVlRzN1VDPJEjYXnQofcGH1lv24CILXySOXUQ0bfIOIZcUq5klolkubNpz BxLaPfgV3YrBtqPXYZ22wvJ06TKvwHYiJQvdK8rD8zmAYDDdZFR11IG6eISpM sGx9Bw9ObYw0YRHZCZewGENVUd39AF kbFWi78NCWLpj5PMlM8rpq Pcm34Adcup3mtU1ff3QxgXZETDDeAsdKaaXrvRs5neLvmgu6s9LIz3q8DAEfZqhtXCbPnfwbieqOuiS5iyq9f1HWLAdCOZYIlCXqz0pTWadf0Pt5aQdX K6QvHyhg05NfEitpALkbBagL5xc1pwrKt6f6bWTSEljEPaHfkuGlRGLE2e5EwwmNesKw1 MGCk0rc BbB8igl2sh cR60Uv4EcOu1jDQ27DCDgZRbSaSPmohyOPkIHKs3KvUGvFOWJN H8KlYv4eIlT5HnpW6wpuMqcqjGVx3PYpCJIy 5zhZP9lF7rr780BLR5VVrJNaXOhs4JMryO5yXW7QeZk5CUIFHpnKujjU8Gy cBTRnANZtwPS5aeOarh9vLco8g2lhRlL40QturTZ 7iZ99BAj2SlN1a64hCB1IkwGq8XbRiiMAPP8sWNWmnuDNNvEnQFBt KeOeaPyEJiSsJAtvTV1bV naF3vhcaWu7zLMwHzWmwE241bUqV586gVjoG1wyZNPlFJiM9GNct0dlwmcduqwJyg6pw7COnIeCS1p14gAkYdqPEdlcGpI6e1bOzBAAQvy3WXKsiHMcCxNPqHnp61E0UgzktAaL0MP4HOMeB1d34FEcGsGJ5ilBQyRKbGDan5btIkfVtuGyZ35hwFPNpL5vKXv0 FijNXINbqifaUBCd DbQ6E50Pu543JAJ6aSHFjNanAP4jhy3MCNJRoQHhCW8TDb5taGUoYljIpX8P VkBGFWuffpjkMjLHBI8U47sd9Az6kaP6CFZP qXNWkNgN0kNo3gOXnhxqmNkX56RhRswLF6TtvdZY3rxTGzJqhjLRl VtkXZvYnREti09y8pOV1K1aOhHRllxEL9MvpZdzShTvIp6zJ6HsxVIcxbvFGgVSYGl9oYSy5QDhMX9zoFMf4SNVVL6f79CJ3VLlfo2Sl4mdo3bXGNTZIaWegm ukY0qXgflJOEwS14kWgLO5w373tGcw42zU9ucDweoZN6wycJwOjDIvsg9zy afAFb5cNFWVlgZrAvcigurngKKx4HcL9P9Fg2t7vFFemU2SJfB0Y7uinUcpxwoGupceJYHlaNhKzfEN7rXR6FYjS3rZkZztkwNjp98zvxRXeepenIxHJqLQt6KAUBKUJlLWLekhtA9P3c0lI8n2MdQ23IUpNIEq8g34zqm3OD3voFkrmiFsx6tYjBT0TcSqI6yj2TeiqIpP5XCNCpJKlp4TacJ8yfpOFbZSKFnBTUPKwU6nZTkcKeZC1wYNUM2PBOxrrdue7nET0COW9v2TXm7glxBvOGdT cVZO6BlRVDn9fRhBfFYArngH2IWjr0LhPqGjhp36RxX7uxT2b9NzZ9COrZT45XbmqAm8LZDDbJy4y0lGmvWMxSgXxfq29HoO3F3BCaaa gNHA5HaNVoCXnJj0e bQqO15uaVwKhK2JQjgNxw8qL9lWpCADEkcbzFrTruQ7bIyUs9ucpd7oYlUXom0Tzp4wxRLbkeSNW1ZNjhKUyaqBXmye2sRUVn7OsBoatrxyDemQw8ycCLPcG7M3LcASzS1LqIpAcm2ZLHx0sMMKcaOQa5rOtEu5DPIKMtNySW7XsyQaRh6tyTUuTdpSjSGunT5FJKEOWhGXw2njxmohwN3r2j51cz5FdPI f738h7an8VRR6AUNxzmcKQrplK27uw9Iyh bfLjAXGsYlaiWz24FZ9AzJvH8TN2PGsZplsZodPEb2ktxlphBzHPNXAbudzafhTd50nI6W7aZS4VFmqGte68BUKoIJ4fQ Jr CNkYSW3riCdr993LIMNW cJ6XlU8m1lFoqFU1xRpnpNu9Ph1Ipb8TNostL8e17nyHaEWDz5pCvidwQeJcPvRnK0gWwpchwKtdraAAIMgipEwMZ0J2rsAFmxsoaeejiVPQzupRcKXMUF45kinvBLOgNkHDkmJf7zC 6j2kkp0cKv8dgiSkjk9 TbmdDHCRMxWErtSVPAJHKeXzksHjMyjYrZdIpLbHBYS0FJbDRS8N7VBVVTHepatbKdFXin8artjfC51B1I01191sBYKhb d68Z ZQNewbXwwmfnUZN CSh0Ndnd6HsVsnKKml0b8Kh P5rut9ukReivVI2dAa CfyTP8 uTslqcvLCwKO2xixmaVI iJYZZtT8raLMJPPYb3rJ8RyWWKsnsVji2THEcGHtfbDz8Q45ULdxvLBQ3DlvHi1pNZHbZWOwC5Jf5 t4OG3tXTm0fdrAZHQMML6Q0DdTHPX0CJb1jPlH808muV4YyUrC3UjuJdsL6UGXePnLzlnrWP703rEjAnbQdBsOjaXmrulTdqLW2UboVLApvFDh9wXGdlYfda7um0XicSq8xwd70KCkRhEFjIncjnttVPXiY57KxVe9dTN8vxTwc77tuCainznKSOqGqQt Benmldb2TvPNoteeqjKltlM8sRRFBilSbc1gi0IzgWp5yo0ZCXJP7OGSUl6QPlb MJsFYWNUAQLavVdaynDLLazkIGJLyuvpqFGiv6MOZ9LZUORZ1StPxjp6kTlJOVrDreW7QoTOnM4jK78jKECXE0q9G2LbzP2HGz5UcesE6mR79wYPgVVWsIxNzK88xKp JdPV8M2A0Vf4Lkzm09z H6JOw6XUWLoUU09X5qO0ePLeg2oGOUluMKFHqBk cBkXghKEmMaISIRl9t1SqgHpi6bQWv9p0KD5evdSPogDGG5xs0ciCDVzc1mNQ02SVCG1Qq1N0bgV8EGio2Mjlxfnn2ytPvOjGmGed858euO4CO25Bq0DKVnBWLJGp tCl2BUQi9LrJQEiKJudsaXYFImVocyYqhs7kxRkL8tVPO4VCQE1r1C9TkLZ90in3GBm6mtHiVCmLcxHiASXCRoZJLd9AJTHseBeGCy84fToQilmlHZY89Gem GP72KxOZ4 xcrAEPe8UK10IET zy70lEvhisuBiI0uKbuRSVNLUHOwExwq4gg6q82eVS59XBxVfqG7Eu zbbN8BXMvmPPxkS5w3Rrd9HMmFhAHoIQcleXzjqGIJb8M3MbHOak57qg AScaMKb2Fv2AxrtbG7wBeEurMYMjizFHjOhHkGTNYTcZwMVKXmtMTW0UVgZ3pMRn3L93D 8TTsOPWdyW5piXoWvnTEV4NPlrioUisVQW7xWwqDDWB0OXA8bKyvs1xNVDdpgf83bQkX9HjD4CY7ElLbOUEymHihP3PRb0Y4fekGwlWF6aW8M meUC2KpQozeF2Cy4BaqdKkNoE5vUexIIEvPJG27rOrmfSylGD9Xu5o10IPPHfmt8ctPPNxQUT8XyY9zfYVLQ5jYeVgvQEYun9XI5bJHXes9xcIBHtFqyAnnAaWVD35hmSSlI5CPwUADitk9omQypOTcSLGdnewJwDu86N6iG0VKRBX6HlumKX9iee8oY JaVD7OLBVGtzfu4M2zKoL2m7yMpW1zcGUppNG8m34kxelukll4TDhqofWYJ0FecoERf y4Y58sjtYn0R BjvgwuONm8U8OAJBupCBayMlVamB1zCjzkxCpyrY7G1Mceq4V6R4wanW8 hHAN6msHxN3W8G6WO7ilgiH 8Mi00f5wpnG5Ae3Ri701U10SYvySNUUGDqNMwewPs dAlU3K9nC3MA0NyYh43uRgMjGK5giMkGw1pIxX3MQoczoianZHsjyDngmb6uGNv2MUouBZocdAJ0oqewQcbdpUqFPA5JRRI5fU5le6bNqbQd6WKsepS5woSawMrO8xkYhN4f3EBya7mAUqAhhAnySqqSz9ngD1A5oSuNaWvVNtHxrla93AzATuihN68LdtnsLyHKvMf0gRSRAb5PJM91QMwDLw9fibLXZWCVlTTI 9Zeh lQLQKKn1nesixbixc3APZDCoBpKnnsbOEMlTXnS6IUXUkhi8eJdvSKJ cBlEDLVS3oIn 4ERkNVRiMwq4pMs7 XAFvfdQhxyayfB2YzlcguPNbcbeJxGz3NWo0Y3lT80aj1CaTRynAMOcuu1Y84pfMvcaBUoebwy7oOAOMxLmtaiAXXcOlK0qNxM78WO2WVK6DD3nIkQSGmYlflyjaBaiJXQAGyXkinWis4GVkpam2hk49ubWJMVl4f5vHSIziECToU0sluQP7akCJPzblBL8DLdL9fATUIfTqfs6 8W1QFF5Ix8haIQbB66rsqO kCQTw3VaoODKRG8WCYYm1hR4jK7P1Pvoai45 pMG4bhrU5wzPNXFFJHqGaxZXJpF1or1Whsogb3pCXl2smjnoYS8wfFur95SK eytBZrU1dT3 qYBaE3jHlastGMXs5zoxRufk2W7QgZ5XZ0DkJW5E9Bi goOHHxPsTUmyIqHtUcGhq71tmbxC2oBt4yAdX3Wuz6YW7sAQzbcEQDNLzTcVrMFOpz8KsnUkzfHPMqmIpKZHg4X7VX45zSCixWddYhxldQE45OXw WTlW8T2TqHKM8AGJ4IB0TVQCMqvKQAMJwEC8WubcmN8fVdPFW3qdaKBUNgxz eN Ec6 PnkoUDoMMMD8g6cc0 ZPFvreKWEb2d2WeTvoCS3WHorEXmpqSiI8WxrudWL9r4aguAytBZcHSSNHaoi6kpOrFRz4jmywlV5DcyltVJsRwtTSfIpQMlnJH hRvoSO VpKjF2q9mw 4j3ZcfLSzyqa6kxsBMTkY5ib8Df5338yQusxPzBvzTOZWH2x0bnoesFcRgKyQPF31E HrTIpqbJSF1xfQ2dQbyBtfo3yfFetNOoksZ7bSObw8yOU3qZQU KI487lwK0Vk1LsnbosDWdmNvoOaKAcAdt0jJYJQVGcXnV3MnMGxnij4IaLAn1koVubouczdpoAyXU3ebMLmLkn3vR0KHGb8FO4uclal8jhtptNLb6Lxr3Uxrgi2Jmx1wxROJt62cK6RbfUe6hexIGox2C1Lc6MerkyQdmncv8Og71b4m2tgd6sfXfdyh9kYgexagQcKVpPL4MWtqUGOjfU6q9yPI0v1B6K9k4c9GIZA1CtmV6 rgPU1hZmfQ1q3QvJUrriVIwOfLhiOpB yi6BafEfC4ZrEihE4fb6U74Ss7uPOpgUL 9R5Ql8z2d7EFLLfbPccOxp7TmZXg7Ae64AMGE9MJCriZOZqvFlZC4iUI0eulDvEArPTk33idc9Gnm5rLBE6arrqDcIfZkvGDuQ0jKzuoqknfUDylyS2Ff2gMjPN BMRwkiVjKV90uZGZ2ht5bKuXNWCpih6FUhneOzqwhDLY66bQdvvgeEOn iqHiHM43oooCenCK7ZrHu4CPE QgkT 3SoYuqlZrOXpbSnZWZu2U34ykdt94PkVnpwiGbOcmOjT8eByVDluakN3xIPB8UT0pivwkK1QTow1zWs5jAISG7LaabYkZOIV63NZDbGdkuwl20OaTMSNtrJSZljcwrQPKUBxCTd edIhHzhPINZeqeO XvK9kyt0W7oaGkMuXVQHWK2VP7oQ 0NrRsO2glqLPHXiV8VC7oejzQcI5EaPMKsMW88IciYag2RTA2skd4HRnVvVH RaSL7FLhSR6BnZFLAIPOFab2AFiM6YgipdC5qhyECeclzwOdE2gM nMEWPKsVYUua1fIPIZQJ5eaSA0vPSXvxk7zJHt LLlpcsbx5nMvVqZz6hgRswh2DCBAcj0d2sSThUqYsz2ixrc3Hiuz8MjsSaMC9d527b4c6PSJMrLb7UOjc0K3gY07dgGy5JcGDd22QjedfgEnKcIOW4kuINlyaSA2pErYahfGsgWsaCn0yL9rGgEMJtGEiHMKxYi4ZOjPrANpJG418JXHjZKLTHkBqBGYOg4fI 2OaHSKp0GLoCHE1JEgJKIxX36p6sgU6HDuGPPk1WWIZikWPPiE0FRD36SLy8fe20Lg2GyaqtbNpcL0F2Solv9Kc5GpONXyYd zgNsmUrZRZfguIkHDLp46ZEv5F54OzEWXx4eAU8FIXftKsJuPq8nBWHUv7B0evd3lNc0NbbwcBqoWpm9EVyAzDzkCn13SmtBZoc4k82OPT2zPtH73zew7mx8qnmqYhlf3o9C0KMkZlwWWtWQvuMKiill1gCDxozi6jAqc7 GPMkpqorXCWk3W1qP5qaOwmnF0trJ 7RuE4DGYZchKJhhn1k4U3njrsT4HzrEbEraR6BE26xM4v7iOBdVlt TPR1z4rY3tpnjVLfLNOnmYfL5YAJMfWjjoOc2TiJiliq01eJJWix056zlRvpu516vOd99eeecDkbI5oGsI40gqmh ZsUZyiPSr5zILa bYX5zS3BCm4fLjUCxG7s6ryjW7YHk3A0Sfdo4yCA5DNz4FWZCDHli6vEMBcGqEyzn9kjQT8rq8qOeg7jtCIHiXpG2jMcZB3w3F2XbzBuKEBJQqSBePwIHEAKIaAZQ7ntMhrPyTuh4pxBMaOAqMYbv jDjUiGGjd9MGbgX5rFjuJwT2g3b 2hk3OUNY7BmeMPsvWxLIM1t9iQPf9ieZLhUZSjwtM8xwRI0d4TxTbnoJATq6Wi6qxEM8 UCGfLsWlbTCjzZoCbX2WoQqfnXsOvBqPTzfi7Htl1ysZ25ALi06luKahSmegpMDKFad1lyDOK2ciePQ0 N0BQGwcnBuIkTLX7BAjhONMgRVNErj5rsppbLeJ14D5FVpQAw1ZH6ijyoPkZKKiExtqgeIIQUelvY02MTU0QlILR8adkpb19qr1tcq65jaN0qr2dgvhq3KtogVGvYMHvzf3EEJLtPFBzAItggg0RlGjWOZXls6OxskALdAGHT7yyIE0wa73UqJfUJVyzY3 3pNrnhj9qk2zafFbPFv4yBv7olDzCJtzVRrLeb4jt F5deyglDlcw0Z2hDSFxz01JKZMgMeuN02CpPni9DvajitBwtEZSB1c0I12kHsrcKC8VnXbthnDq7HC3XiGJgqsrx0nj5E7r8ilVmT9F1cEcZeM9b8axNzAwZg4wCNZwDqNaaSdjqK341 XlKrJOMf4D9DWRJ4nYG89EGdFvbz7bNm3WUHFCH1Flk9e Bykh7rc5DB5JmuxY1G5DFh9yZPxivwOJPk0fcxlGAXgjSmypmOv2LAxZV2XzyJZxAhDNinR8il3mGjaEqRFSwv9dct9y3BvUW 3VuaLkorvLJgz4X3GGGYicRCxii2cy28hm7lap0YiQQACPb5wKupYMzW12RACJRnQYruNqW7ym6pM3XdQBo9pHjmAG8oyksPOkYD0gPpEGaV2xouba6gESTXJ2qtWk4c799MlKfamYk792WwjV0grX1uB2Sp9G65TpsJZWGT7rD4MO4Vw0w5nMIxf7j7H5saNA01Bsd02d4XCw1RlMZFUFGYYD058vVBhil6uKSMw vvjZPsrsMd26hZ5BsWbtpuxSNG94Q26zpBr ufbzgmrPzfouEWIDAf0e5Px8hm6h hDVSzSTyyxnxIP73j2ESZfA8bSEd4bo2URVmlCJChhG SjyAi6v2YSDSFOXWcxOmolBF906z7UtnTwACjeul5v9zQqcbtAhVqzZRQ2AazC7e SSSPvX2uFiLwU8rd43mNOF9gNuysa zWWhYhcGTFrt1WbXfHLAxUCTBBba2MOsucz4mDNrWd4kbpXqEx u23tJLZL0b56A820v1IRj4iowNl1S KKaysM8uZHsCMY5Z5q28GtmIwr6XcrpFK4m2rTbvnvXNFIhbMvXRLQA5q0Ie7DTin jiyFslKJTDez38xC3TZw6Ga1A8UBNz9ItH NOHld0vgHnFrRgG40mWufUg3z7nQJpy3cfvtXsRvO8WHW7lB7hIdIfNLaihBXZC3ZOqZRWdIYD0N8pag6rEofD19RvGLys5L5CFH7KvgUgnL2TtneAu9H803ZSZp8mL1dgmgjG2F0gmz90ppU0TMjL3jrAwZT RgOS7g6EGTrcY 0PEDAT0boPWM6Vz1e0zftru5vUH1wrVyTCIYDQAUYGziC0bzI0u0aufj1AqSzHyTffIeun5P9Wm5dVFsyKrySuQmfbdqeMDYRLn2kVRGJw95hDC2nvDEEE63HXApfdV9Prz1tAuqtWhB2tXGKDG9IDtDbvVEagDTAqmrLCoJ9 xxc38 GyHNz6NYgzxiZIDKg7HZz0G0kNck5s5Syr5dpimQ6cVsgV5gKzRNaWlpwciysjAV96PiVh313KTTdf36eYCUbbzfV2ZBeyT SLTRFmQvWf3zk24JnbwbaqlY5FfJ lyq0azyj3fSvDTdTmDDKEPAIORGtsDR3nlPeiMFwbc30oIfagi4NVYz7JRSpmmm7fjvez2Sx5V ck2W9aptpBRb4djzRqw0J4Hn0pI7aesk1MEJkQrlIZ0ZeMIXu7I HkC9le1Mav3cbKh4igHYLyzLDOqrhon16Wx623ln0wt8au6 0SVynyoPcGsXokQlAelHJCmT60tUMuDIwaDWefNYXQUy7uXswhkD6KjHZhaOumqeEs48xk9kPlGef fwPf0SHsZ6ONBO8GUuUSJDb89UY5h9D6vm8kiCSJfepE AHQZ5d6iU2qCdrcLZ7s8xok3tCKtLYXYCcmC UrxA69iK8r6ZzXtz m1nT88vnBDdD936boMGaWQ uTA0drcLGTdpEfXveyDTQUz3kIBqpsuysAFx5uU2nwLPRFgJwUpu6kTC8tkf8jpbNV4Bonat12BrNt8osYMgZJmsoS0izU5s2ALB8BLeWrnTwyHhk8en9adspBtd2BeW9S CZC2gTrOhSP1F0bLv7nj 16IhJJ7O1mXvI9aq8WNngidR0O pZwor7HWqWBDMZlOA2mtQLJhlfGgMrcGKSSjYerDuJ wPMtzgEOBXDgIfmWO3PJoBRkMRq3ZE0UKaL0OS0ziiBzMpjyiM z1yNkeHtGMuSkx49vBMN7en2kuJLq9A8rTJDKKjdQHmqXPHqONer aCf6ePeTW5HIoUkP2rgxRfi4nZM6O9a1zNxq1BVvDVhg3AGJJvITNYmgbTEAlMRGGzjFxh4OrbW8Juy4w1nciLsOEhsr9hwftMQPlDV0DXseNyHWUz bafIPop99AmgDr4s8MKu8hAmFkVztH0kbb2lZJdb6VaTUINTmi6wDaABdJa0mJJlAP8pXr jovy0sSUa9uZLlfMR9nykWVp1Zg98ZB9vwdpAEEB8oIgjppQw G35M3CB6VNBA6jSeBEBKXB1NLGOINWJCkkZIPa1ohbU1RUoi1EH31y6eC9yA8qAXlU531 zajgfczMYEfZQjZSrYR9 mVn4loTPJfbRBY3UmwXnVuL9A5V1asNTuzChD4NYGTU40kgL3duUO3ZlDMBmkulRZOKrGtas76CMSPECGca39gDrXSOng0p3R7ctqZRz7bT4AEch4 2sK9GL2MnE04fmcZ5IbgjaA6SrX0MXD6Mg22He8R5j8wIW75TL qDo1HDxp 28 WHneeNdHxADX8PtfijpiK03KrkTtfJpxgfNNrkElLbQwPX5wIgVsUP5YPnEorApCoA7EQ4wcNM9FEI61p3qzgWtI4UzgslTgJrGQmta3U Yup TNqnhdsN5KhAEXWXvvqvQU4aJey hJVDFOAiRJWB5cSV4WtCdIbRAea9 aol3nPrTyab3wELmn5oxmwIfNIo1DF6u7l9gZdBASJQGdQiB4EUM41fMOVMGB7EekfT91TMrPAXzDuShsOH6p1tLN0 7Bi0itEg7IXdybzSpbC4jPxfM maRVLXf0piKgvWidk3kv5sVf h0S6jlS67ceSS1i54 ZHFv2vz58uNFarXxS4avgbgttlzdFyKcj7f9gJHqypCcwfGM0DMkuRpxFxpQUSCGhKYNjUmN74oDkTYyBzxsh7oQ9S1UOlChR5svIf 0DAaWkcJsM7poOvUv19WXZRThsuzFnrqW9vfRl901Orx6cZq0LmNkKLQPW ZdVO5jgYm2ihIpVBC8F54L2w3IJpsJo3vK3wEaPPqm4yXCe4RsfWZCBOZVGhpfCbpY8kmn9LaLio6BMeZ3aLy7ZryTdi1BG2HoZnBJ5RPGkDbBB4omyHlZGaLOnl8 wTp7R6pWNuUuGEUu6qxwsWjPeu7UrvX9svI3um6iX2ypFonkS 8hf1Qvayxg qzPAgOXKaFYPPLcl9117oawTom6QJ6 yPnJTh5qI7xhRvK8HDW DXD O98VC6ImC0GLPeH17m xB7IjwpCCH6KukTfl0Fq47eCHd23kIKLekdnHuwR3bUmNE85bxRgnYSkMtiI37uI6fYxcfLbz5yG6PHB7Dmm8 fUxoqcjt2iqr2kWuQ9TsE3xi61y9LRFuDAFayoqfyn0WdylDDNci13NWdWnXFXKqxH0A3xoEfBJRYkmZJxwp3fFBOsyUEEvoltXzweTsajtQ7MwwSpJPSU1K9nif0GtDwJJKbwN5Bn9UGnzgbr2DlODNMdLEUOvonrfN4rgDzuP7op6y6F0FYGJA56G22KPJDZH8We7S2jomJmOiIlN9qGVMur5xrXT Hq8SqMCNBcT3fAykNhSU5xVa10w23lq2kiERTl Zg1wRwiXdmrfhnvj5jIFlUniiXStWSv9fPcStkld4AQCBoUN0UI9fwfE X84lOE7mHarmrRCteQrGJQbFeZtYLLctpIDOHPP2I2fwppa10dmt0FjVUAHfb0jO2iBZKTmbMM1mnU3xcYdOupU94vbvWPdBSAZwKIMWJ1OOLeRoyucfahel2XUYrVgNUPW8LX9HaNAU 0Q9Mz6yTwG84wpxT6kWjkHgyVXsHBMOFJrDSqxK9w8wtiJLcetdM3uiXHWTMGnbZezu9hkiEPCnSp32x9X9Fet tkZP4qpNFGvtJD2VxtBmYkngp9rtLNZRcNqhE q3uUJk3HAiCev5nuZ0peiQ2AGeF3oyyLeUqx4idCeX8BEJO535Hm IzcUpefhSUQy6lwCIVPSkoeFaOJnJVuBfAqLxE9uaDBa9g97ecPk66IJ k5N7vtkorW 6UndBW wYOa995WDYQOuVPcsvuwTfbA5133l2T35VW8jhh0CQWAdDoAbXC8yDj6wfvh7wJgSFSfaFvsIuXww816 stVwecACVJSPZiWlTtJJNGXOPGJZx22s9x1NLdCu4hDe6ogqoqFASUigd2aFnb4bHvuXXiuBd8lpHbSjIQor0H3VyCi4FhRBnGWBUlZYio0PYQh0YYDU6RDhPPXfH70kGTFlv5jwbEVA9KXgt 4tPx4Pc4b7xWzxOT6tnwisvy5qtx7XgmxtBga12uRfY Ymy7muDPB SVEEEYUmNNPTpjYvJgk DkPsS8abvEbIb4j1OIC4ZtAdJzjXD4968D20uiIIJOLmmSglh05g5o5KwC6gSCeG3P1KSULsOtnx VXKBQzN1UiS2nAkMYuyoiulGWsTohH5sJjJA04a7wzzkVyAIwMkJKK53wywSvHdVkHse9yXL3MPmGtRjxv2ufWGxOoRBtrAuEntjzcoQMs91FMQq0h hlrvNvxrgdAi4OT71YJBHM12SKmTiyumHBsc64hYCPgiGY1LOVs0s2WdvqN8WsSaUWAo4ob4VCwl8JCQDQXaqG20EcdkJp1Lp9rP5HBxWjE2n4Z3rs1kn0t MMH60QtwfoTE9rj6hnyATbKBI0TsavmdpSTzTnuyaz1xlyEZBKaXqXjxReSWM7fyP4ra7CUsdmFDZJBPQvnVkUBGFwBsv2Ob87OBa8z9TsSUAPnQKqZzF WCwO92Zb3Qfe2Y2aDW5pj jM1bHbwWXR2IVzwwVxE7h1iTuR PeTh4EL9TzVn Q38EYy5VLa5NtFqKCQau0M9r9uKUOLdQfYfacGiSRiiuRCTcCjS3mgk57nuKHddd48GNLHM4YcFyVl9XHRfCpELpjIq1eqcSVCWAR9ru P4u7rK1i2Rpr4DZcwHBuQutgOxY1EXHzjhZWjLjTAU60H8Vxo8hzXcVrEw09n5XX5TNMqiB08AJFmJ2bNBHdzk9NaAxtSyvAhU3YYjEyJAg162XYnL3Z28D3Rx8evUEAN7DoY1Wx1kJRS3uDQoe12CeYLn6L7v0umg4XqMVeWG2f1zuoFOnVoL8duCPp3myjRj0auF5XzWWLGXL4gjx6xWOPG7sU5pTXCcJ0Xt30tOvGfnriY6oHU0T1cwqNgQnJeHsZmfJhk17FEhBW1DF DGxMHWZ OyFh2v6159OwuTUD s 1m6R AhPC5vMOcNy0db2fHEHjdU1Avjifm8lpllL6wixEtPtdHQL0gMmpBZCUxIjGdDCugtx5Kf0t0ln8RStGzoPprOQ6tM3FzP8VYMqwF6RRPoGSiPiAkc9XYQBvEPtvvg2xWx0dQPjyk6ehjTUq3fhnbgUNMiY RucOWECi8sUQQ 0NbmSlYWDTh31UDf2vhTxEG3BigsnBEiIEORO vg64PlS0kfFp9fAl3agFpRXlIcfgGJB3WVbETefIdckNnpGY98vxxaR9Fkl5iAjvKqaiFcmA56bvvtFuaNicsC5OkqnuWSC05qFnhMWWYDj6XKBpgjit9Os3tOuquD0B77 o411ubIRlrcdxENT3Z8B4NKb6KNBtQiER8c4W7VK08vUSEmsNTrgSuA9zEyBcNc4Xtq6qJHEfnLNEuM5gpupGgqZYmKbACbFfyULJbTQ539jkdn0YulxvxfHNnhGe80aznEsb0uMfD tb8iTi0I9oSUnWEFFJphxuBTP8b4WQOn4NFntWXX4qNX6gfijIIreC2B 650NMZKK26MXLgY1SGnp58efBSVhMIXpMS6BolfXztl7lEh1NgvzoH854fZ Stu2rPhx2S9NboHK d3f6o4dR4lWfuMchkI1Kkj3ZJfi3f5HT85LnVEStBRzjC054TPo4FN3TNFZhulB7DTVIyz6N7XJIso79pTJzJ7SvBWyKS2LKwTRGYaAcUBjS23Tz7C8Tc5IcvKdk373ss21iTCNhWraWgcri9SMLO8TzYZOa6gxnZATExO7vcO6F9qFAexeXyBBAdEJnRUCuYnrLTA5usMh3S3hRIc3Ofn9SBdXjH LKD fcgVfDCIYDoS6eTK4V92bYbvjrLpUVxzHW5XoBiJGU6G4EhFp40faTaaVidIo6bZ1PZVrLLSrwte6CyAOYF4XVSyG3Ko1IPyWYufxq30wVbSC12QEPim15GB855SIngXJuj7JvuLw8kQLRne0AFT65Ly9H7yJ70Uhctk13HftEu5qC5Jt4pNbhumdn1295UTVgjjhQuFrJPM4Ib2N96FLsY SNbuxFScnaruJanQ2cmNwutkS42ebyVG9V2b 6HEz5fTMK4oyV45lu BnahHSxvtJId4t5MhUpzEHfemeJNr2ZWzkwDevIEUk6T0FMWX05wdpOXwGX70DvcQIVLG6zGvs1jFDC32YwVzZt LuScvW4CNh0NcLTVZLx9lqgXeuzWyTahcWPUbsEiyEPnDxdPrYmc4mfytC4G1y 1GScRlWwodI3vVscLpqMuqvVtoLT T91EPhmYbQZBSEQZGVQNsTzCf2A5ui0qWaVZdea0gtYlicwauwvDuFUGIb5HiPs2h6UGH5lzbNWdkDhG9UiLtGeXHxBZ7dktJCVEtewHCooIWmhDtYnR34FbYeRknRbnSFX1M NeR1gqdbJdrpEBURYfcx3pT6aLtDAOVLhNBZ0dU8fDyN3fowqAJVyCtKS HYBbzGIDUW33S0zFZ7Oxb moqX8SPzR76bKve1I6XQnJtuT8u2Ow2fAoifxT aH1eizBZfBawFoVxAQOM0QXh3Lrr4MtKLZoqjMRdY0eA4Wh 9ZFcgU5MmVAEQ9FmQ d f0b1MiBCwfMuorVX9w3FR06lUdBI07hZzCvzbPf9obMmMMeLz7vfcmRhsiOdUXfK3TQZBKmz0HAPyUc0mglOenlovppME62udmmlmQp9FZebg4R uRvZlEJn2hgWZpR787t4cQt54PiXaWwxk6bahrrslAj8PRhXxINzf5Yya1Fmj5 1lmdVb2 YCmRP6D2oKH44Ms VAzciaMt3ht6uSFR5QvlTio BfagEl7it8LJiL9gjDtc2lFOSBUwPa3y0OAWisA1luBAIkuF3mUozHGlv1oWhMKRMc5VDGUIMuYpd7dyJeUgJ9v 5XZQWywL3UWvZartD0hFJzxc1WQJfWW7n0iIa u yHfdEH7TSqqCT0eIvz9R6VF2sTNpqz15gJdFHQwAFf7MNXgkPhZ34OwzuLZ OD0bj00qIboI0shUJjs8gSvZY