Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

For #342 - adds a backbone diagram as requested

  • Loading branch information...
commit b3eac614b9675141676c4d57de3530b86cb32f9f 1 parent f7cc62b
@addyosmani authored
View
BIN  backbone-fundamentals.epub
Binary file not shown
View
6 backbone-fundamentals.md
@@ -361,6 +361,10 @@ This completes our first encounter with Backbone.js. The remainder of this book
### Implementation Specifics
+The picture below shows the typical HTTP request/response lifecycle for client-side MVC using Backbone:
+
+![](img/backbone_mvc.png)
+
#### Models
* The built-in capabilities of Models vary across frameworks; however, it's common for them to support validation of attributes, where attributes represent the properties of the Model, such as a Model identifier.
@@ -369,7 +373,7 @@ This completes our first encounter with Backbone.js. The remainder of this book
* A Model may have multiple Views observing it for changes. By *observing* we mean that a View has registered an interest in being informed whenever an update is made to the Model. This allows the View to ensure that what is displayed on screen is kept in sync with the data contained in the model. Depending on your requirements, you might create a single View displaying all Model attributes, or create separate Views displaying different attributes. The important point is that the Model doesn't care how these Views are organized, it simply announces updates to its data as necessary through the framework's event system.
-* It is not uncommon for modern MVC/MV* frameworks to provide a means of grouping Models together. In Backbone, these groups are called "Collections." Managing Models in groups allows us to write application logic based on notifications from the group when a Model within the group changes. This avoids the need to manually observe individual Model instances. We'll see this in action later in the book. Collections are also useful for performing any aggregate computations across more than one model.
+* It is not uncommon for modern MVC/MV* frameworks to provide a means of grouping Models together. In Backbone, these groups are called Collections. Managing Models in groups allows us to write application logic based on notifications from the group when a Model within the group changes. This avoids the need to manually observe individual Model instances. We'll see this in action later in the book. Collections are also useful for performing any aggregate computations across more than one model.
#### Views
View
4 backbone-fundamentals.rtf
@@ -321,11 +321,13 @@ var todoView = new TodoView(\{model: myTodo\});\par}
{\pard \ql \f0 \sa180 \li0 \fi0 While in this instance events help us relate Backbone to the MVC pattern, we will see them playing a much larger role in our SPA applications. Backbone.Event is a fundamental Backbone component which is mixed into both Backbone.Model and Backbone.View, providing them with rich event management capabilities. Note that the traditional controller role (Smalltalk-80 style) is performed by the template, not by the Backbone.View.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 This completes our first encounter with Backbone.js. The remainder of this book will explore the many features of the framework which build on these simple constructs. Before moving on, let\u8217's take a look at common features of JavaScript MV* frameworks.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 \b \fs28 Implementation Specifics\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 The picture below shows the typical HTTP request/response lifecycle for client-side MVC using Backbone:\par}
+{\pard \ql \f0 \sa180 \li0 \fi0 {\pict\pngblip 89504e470d0a1a0a0000000d49484452000003e7000001620806000000941ca9fe0000000473424954080808087c086488000000097048597300000b1200000b1201d2dd7efc0000001c74455874536f6674776172650041646f62652046697265776f726b7320435336e8bcb28c00000015744558744372656174696f6e2054696d650033312f332f3133614c947a0000200049444154789cecdd7d7c9b777defff77eeb85b6389524a1717a4a45d1b7707aca4ccded97a90ecba1d834364bb9cad405ad9a1edd680633bb44dda94f8065212bac5760c8171135b49b8d9686d2bc0d8a8634b8cf3d8ec431bf9c7394bda1f6de4d2047e0768647b034a9be8f7877c5d9164c9967c77f9e6f57c3cfc68235d371fc9d7f7f2f5f9deae88c56231010000000000cbacb43a000000000000963b927300000000002c46720e0000000080c548ce0100000000b018c93900000000001623390700000000c06224e70000000000588ce41c00000000008b919c03000000006031927300000000002c46720e0000000080c548ce0100000000b018c93900000000001623390700000000c06224e70000000000588ce41c00000000008b919c03000000006031927300000000002c46720e0000000080c548ce0100000000b018c93900000000001623390700000000c06224e70000000000588ce41c8bda2f7ef10b7ded6b5fb33a0c00000000981192732c6a3ffbd9cf74f050bbeeafa9d12f7ff94babc30100000080692139c7a2f7fb6fbf56bf7bddeb55b373a77ef39bdf581d0e00000000e48ce41c8bde9ad7bd4ebb1f7f5c57bec3a13f71bb75e6cc19ab4302000000809c909c63c9a86968d0bdbb77ebc1471fd50f7ef843abc30100000080ac919c63c958b56a956e2bafd04776d4aaeaa31fd5d1e3c7ad0e0900000000b2b2daea0080d976f32db7e8cbdff9aef6d5d7e957172ea8bea6c6ea909694152b5668c58a15568701ccbb582ca6582c667518000060892239c792f48eebae53c3e73eaf838f3caca1a1211dfcec6775e595575a1dd692b062c50a3dfbda45abc300e6dd8dab57591d02000058c2e8d68e256bdd3bdea1bf39fe35bde1ad57ebaeea6afde77ffea7d52101000000405a24e758f26a1b1b759dcba5f75754e8d4a9535687030000000013909c63c95bbd668d6a1a1af597f7dfaf1d0f3ca0debe3eab4302000000802424e75836cabce5fae4e73eafbb7d3efdc3134f581d0e000000009848ceb1acacbff1461d3dd9a7634f3ca1864f7d4afff11fff6175480000000040728ee5c771fdf57af8608b86ce9cd1b6fbeeb33a1c000000002039c7f2f4d66baed1e3c78eebf7ae7e9bb65456eadcb97356870400000060192339c7b2f689c71ed3e65b6fd5f6fa9dfaf18f7f6c753800000000962992732c6baf7fc31bf491fbb7eb7d5b3fa2db6ebf5ddffece77ac0e09000000c032b4daea008085a0f4bf7f40f9df73e8f39f6ad6c8d898b67ee8435687040000006019a1e51c1877e3bbdea51d4dcdfafa934feaa1871fd6af7ffd6bab4302000000b04c909c0309aebfe926edeff4ebb9175f54f5bdf791a003000000981724e7408a37bee94d6afebb2fe9cd6f7fbbfee2235bf5939ffcc4ea90000000002c7124e7401a6f7cd39bf489c71ed39fbcff7ddaf6577fa5e79e7bceea90000000002c6124e7c024fec7b68feaa3bb77cb5d52a2c0b7bf6d75380000000096289273600a7f726b99bef28fdfd3578e1d53dbe73ea7dffdee775687040000006089612935497ebf5fc11ffed0ea30300dbffecfffd4c58b17e7fc3c37bcf39ddaf5b707f590cfa7b367cfaaf56fff76cecf0900000060f958118bc562560761b5c71e7b4ccfffea65dde6f55a1d0aa6e19a6baf55bed3392fe77ae5b7bf55d3c73fae55affe4ead8f3fae6baeb9665ecebb90ac5cb952cfbe36f71522c04273e3ea55ba74e992d561000080258a9673496bd6acd15bae7eab6ebee516ab43c102f7fa37bc419f3c74485fffc2616dafafd7673ff5295d7ffdf5568705000000609163cc3990a337bee94dfae8271e504965a56e71bb150e87ad0e09000000c02247720e4cd37beff8a03efda52fe9c14f7e525d3d3d5687030000006011a35b3b3003ee3f7f9faefefd756afde4a37a261c56c39e3d5ab3668dd56101000000586468390766a8c0e552eb37ff5e83e1b01e6d68b03a1c000000008b10c939300bdef87bbfa7c7bef2559dfdfffeafbc1ffca05e7cf145ab4302000000b088909c03b3c476e595daf7e52fabf03defd15f6eddaa9ffdec67568704000000609120390766d95d1fafd14776ecd07b4a4af4831ffed0ea70000000002c024c0807cc813fabbc43575dfd36ed6f6d552412d187efbc53ab5753dc00000000a447b600cc919b6fb9456fbeea2a3d70f75dfac9f3cfab99c9e2000000006440b776600e6dd8b8519ddf7f4a675efca9763ef490464747ad0e09000000c00244720eccb13cbb5d0f1d38a0918b97f4d73535faf9cf7f6e75480000000016189273601ed8aebc52bb1f7f5ceb5d2efd37b75bfffb7fff6fab4302000000b080909c03f3e8ee9a1daaddb74f8f3435a93f14b23a1c000000000b0413c24dc34030a8c15050456e8f8a3d9e8cdbb537354a926a1a1acd7db255e4f6e4b4fd54e7586bb7abd8ed5181cb95d5f1a68a37d7e3216ee5ca95fab3ca3bf4e6b75ca5c6cf7c46fffe7ffe8f3eb67dbbd5612147d9948f8242d7a4f7070000002011c9f9340c86826a6f6e56cd5e4d9e9c37374b8a27cec63ed9aad9abdcb6cff21c1b0b0b75bcaf5f7976fba4db651b6f91dbadc35ddd531e6fb13b1789685f7dbd7cb5b5b3927015b9dd5a7fe38dfaeb2d1f50746c4c7b76ed9a79909837d9968f6ccbdb6c1a8d46b5afbe5e953e1f95030000008b08c9f93ca9f455a9c8ed497a6ddfce7a9d191ad223070faaa030b905fa5aa733a7ed1355dced53a5cf97f4dad84854879a9a74666848db2b2b74bcaf3fabb8d31d4b924e0f85d5ded4a4c15048feb656d534346675bcc5aacbdfa9de1301f96a6b67ed986fbde61a7df1c4b7f5f8430feaeeea6d3af8f86775d55557cddaf161bd5ccbdb4cf5067ab4abba5a63232369cb2d000000162e92f37992ef742adfe94c7acd684dcbd4fd35d7ed0dd73a1d69df2f727bf4eeb75ca9c15048a3d16856ad79998e55ecf1a8a0d0a5bb6e2d55675bdb924fcee7ca5bafb9469f3d7a4cad7bf7ea8ebffc4b854e9eb43a24e4e8d8c9be0965642018d4ae6dd53a3f3cacc15048e7229109e5792e9c0e8735363232e7e7010000c0ec23395f46f2ec7615b9dd1a0c85743a1c9e71975763ff74c9c04030a82ebf5fe78623cab3d955e471abd25735a14260341a8db74a070292a44a9f4f95be2ab537352adfe954a5afca3cde6028a84a5fd584242775db5c6348dc4e92cabcdea4edbafc9d1a189fbcadcbefd7602838eb951175cdcdea686dd10d1b37eaf8d1a32a2a2a9ad5e3637e157b3cbac3e733bbbebf94929c9f8b44d4d9d6a6d343614952bec399b61b7ae2d8f6d46bdf98d3c2b8f613af53e9f2b59aba5f6ab9282bf7a62d3b89e7358e5dec765311070000304748ce9799d16874d68e35100c4a92d6391c49afefaaae56f7517fd26bbd2702eaf2fb93c6df8e46a3da5a5aa2334343e676462b637b73b38adc6e336930c6f816b93d1393f3946d7389a137d0a3ed959549db0d86426a6f6ad289674e29dfe91c4f72e2498f71ccb94850aaebeaf5077ff8876adcbf5f357ff5577aefedb76bc58a15b37e1ecc8fd3e1cbd77562855097bf53bbb76d4bd93aa4eea37e55dcedd3818e0ef3d5c4b1eda9d7fee5d7dde309f4e5eb54ba7cad26ee97a95c74b6b525958bc4f30e8442e67147a35192730000803942723e0303a19034de7ab5180c04833a3334a4b5365bd6ade62f4586cd243c516f20a02e7fa724e9d19616f3f5f6a646751ff5ab6c8b57350d0d2a70b9341a8dcadfd6aaf6e6e6a4f1b7ede363e0cbb678b5a7a545f94ea73adb5af5d8ce9d33fa9cb9c4f0e9fa7aadb5d974b8ab5bc51e8f399956f751bf3adbdab4a7a5457b0eb6a8b3ad4ddd47fd538ef79fa95b6ebb5d57fffe3a6d7bdf9faba9a141f7dd7bef9c9d0bb3c368a14ef4542060563aad7338cc550d7a033d6662beb1b0503b1a1ab4d66697bfad4dbd2702ea3eea579eddae3d09652a5bc618732391aeb8dba76b9d0e5d3b9e981be54292cab678e5abad3593f0c9c6c62726fc7379ed0300002c7724e7333098d0a2b490a4ab34381d1e52ef8978d7f1aa1c2635eb3eea9fd0d26658e770e8404787cabce5e66b4ffafdf119dcbbbbcdd7f2ec76b3b5adbdb959a7c36115b85ceaf2776a9dc391b46d556d9dc6a2d19c66aa4f954b0ce787879392a73cbb5d073a3a74add3617eae02974bd73ae3bd03e66379ac1bfecb7fd1b7fef5dff4d9871ed44be7cfeba14f7c42575c71c59c9e13d397a97c48d25a9b4d5fe8ba7c1d7ebabede7c3db1a5bad8e3d1d6d292f8048b87da54555b9bf318f54a5f95ce4522e63d29b59bfc93fe789c1b0b0bcdb261bcdfdedc9c716cfc3a87435febebd75abb5de722919c6202000040f648ce6720d34ce686bb6e2d9dc7682ecb5469b0d66653556d6d4edd528bdc6e15bbdde6bf9ff4fb757e7858655bbc49c9af149f8ceafcf0b0ae753acdf1b0895e8a0c4b9206c65b19e3334a574dd8aed25735ede43c97180a5c2e730c7ec986f52af396abd8e35699b7dcf2aebb6fcbcf57dda73ead47eeb947effac33fd4073ff8414be3416ed6da6caa6968489abbe05c24a2f3c3f1ebafcc5b3e61ee834a9fcf2cb703a1a02a9d55b3168f512ea4780553626f98b50971a43bef1d3e9f99b0e7b96839070000982b24e73390692673aba5ab34c8b3dbcdd6e15ca44e0055d3d0a8ada525ea3d11d0aeeaeaa4f1b1c678f6a97a148c45a3e6b67976db84f76732ab752e3148d281231ddab5ad5a83a150422f816d495dedad70fec517f5c83df7e84f8bfe88c47c8133666b3f178998d7d2d8c888bafcfea4caa797125a9d8d9e1889f21d4ef3ff67bb853a71ae89c97ac3a43b6fea928e000000981b24e74bd05c571a1ceeea56c986f5ea3eead76de5dea46eedd2d43d0aae753a931295b9904d0c52bc22e0785fbf4e87c3eaf2fb35108a8fcbef3d11d0bf0f85157ce1ec9cc699ceff3338a8af3cfe596dfd1f1f64ccf92292ef74ea7057b739c9e199a121edaeae9ed0c3c46aa9bd6192dff3cc6f3000000030919c2367c6b8eced9595da555dadfe173c492df3a787c22af6744cd86f341ad55834aa7ca7d3ec4afb542030a10bf9e97038eb58525bfa728961341a556fa047f90ea78a3d1eed19df77341ad5eeea6af59e086820189cd7de11bd811ef95b5ad4f8e8a37aefedb7cfdb79313bf2ec761defeb57c986f51a1b1951ef89807a033de343263ce676e9ae7b63394169ea2439d796f5c45e33f90e67d2b9cf45227a29125990bd80000000969395560780c5a9cc5bae22b75b6323236a6f6a9274791df5334343e64cee89b65756a8e4ba0d1a08069567b7ab6c8b37edb6c6f112ad35973e0b24bd7e2865db5c6290a4dddbb669d7b6eaa46ebf7976bb79bed471c173e9898e23fac2a73ea5a35ff90a89f92266545e193e5d5f6f5e5f1577c77b73a45e9ff19e1bf17f6f2c2c3413e5c4f1e089d77eea759fced848f2355d34de5ade7dd46f56808d46a3fa486989eebab55437ac5a39ab4b2d020000203724e798b60347e20988ff509bf9b0bfe7608bd6da6cdabd6d9bb69696a8bda951fbeaebe5d9b05e83a150bc4bed78e251d3d0606ebbabba5aed4d8df26c586f4e1897e8b6f1aef3fe436de6b65b4b4b747a68622b7bb631e4d9edaab8dba7f3c3c3dab27993da9b1acde3761f8dcff89e3a4e7fdfcefab413cdcdc4d8c8881edbb95303fff44feafed6b774c30d37cceaf131ffcabce52adbe295249d1f1e96bfad5592b4a7257e6d4af18aa12d9b37696b6989bc376fd6d8c888d6da6c66b9922e5ff752fcdadfb279933c1bd6ab37d093f6bc897324ecaaae36af7f295e2e0cde9b376b6b6989b66cde644e1457b377efbc56460100002019c939a62ddfe954cddebd92e249ab14ef3e7bbcafdf9c05bdbdb959fe436d3a3f3c2cdf8e5a1d4e5856cad8769dc3a1eea37eb537376b2c1a4d6a754c3cd7fe2347b4d66633b71d8d46931299d4e36613c39e961633416f6f6e3697942a72bb93b6abf45569adcda6334343e6526cb3e553351fd7eb5efd9dbe71f4a8aebbeeba593b2eacb5bfa3c34cc48d6b26cf6e57ff0b67935ad08d890b8bdc6e1defeb4fee829e70dd1bdb1b5de7d3317ab448f14a9fa435ca5d2e1d3bd9a7758ef8647483a190ce0f0fc76796dfbbd7f2150a00000096bb15b1582c667510567bfcf1c7f58b4b9774ef830f591dca92628c659534e578d6d3e1b046a35173bb1b56ad3493955446b7f86c669fcf3686d168d44cb80b5cae8c2d884677f8d9189ffbc299336ad8be5db7badfa3863d7bf4bad7bd6ec6c79c0f2b57aed4b3af5db43a8c25c1b89eae753a275d19c0b83eb3bdee8df29469fb5cca262ebb71f52a5dba74c9ea300000c01245722e92f38568b2e47c2938f5afffaa8e837fabbff8c00774d7d6ad5abd7af1cccd48728ee58ae41c0000cca5c59311004bc40ffef99f547fe79dface77bfabf7dc728bd5e100000000580048ce8179f2daabafeac9ce0efdaf9327353830a08d1b375a1d12000000800582e41c0bd273179756d7d1dfbdf28a3ef3894f68e467e7d5ded222e724e38b010000002c3f24e7c01c1b79f9653d72cf47f5f6b7bd4ddfeeee9e7a0700000000cb0e4ba90173e8853367d4b87dbb6e292ad2e75a5bad0e07000000c00245cb393047068241b53736a876fb767df8ce3bad0e07000000c00246720ecc81ef7cf31bfafae73ea7038f3da652d69106000000300592736016bdf2dbdfaaa3e5a07e120ecbff95afe8a69b6eb23a24000000008b00c939308b3ef3894fe8c24b2fe968c7115d75d55556870300000060916042386016bcf8fcf3faab2d1fd0b56fb6eb1fbef17512730000000039a1e51c98a1f32fbea8439ffca42adeff7efdf53df768cd9a355687040000006091a1e51c98817febefd3fbdff54efda5778b6aeebf9fc41c000000c0b4d0720e4cc3c5d75ed377fefe9bfac18913fa4130a8cd9b375b1d1200000080458ce41c9886b6c6469dfe5f83faca17bea0ebafbfdeea70000000002c7224e7922e5dbaa49fbe705683a190d5a12047976297b4e1861b75f5ba75f372bed1685407f7ec51f4fc39059f7a6a5ece0900000060e95b118bc562560761b5e79f7f5e1fbdf75ebdfef5afb73a14e4e8d7bffeb52ead5aa5cede93737eae7391885a1edda3ebf2f3b577cf1ed9edf6393fe742b472e54a3dfbda45abc300e6dd8dab57e9d2a54b568701000096285ace255d77dd750af6f5591d06a6616868481fdbb973cecf1379ee393db075ab767cfc63fa6855d59c9f0f000000c0f242720e4ce15fbeffcf3adcdcac8647f7a8b2bcdcea70000000002c4124e74006175f7b4d47db0f69e0e4497deee041fdf11fffb1d5210100000058a248ce810cbef4d903fa515f9f9ef8e63775f5d5575b1d0e00000080256ca5d501000bcd2f7efe73edb9e71efde617bfd0937ffff724e600000000e61cc93990e0c22f7fa94fd57c5c7f706dbe1edfb74f6f7deb5bad0e09000000c03240720e8cfb3fcf3ca32d9b5c7a7f5999f63537eb8a2baeb03a2400000000cb0463ce0149ffd6dfa7bfffc21774fcd8319595965a1d0e000000806586e41ccbdedfedff8cbe7decb8bef1b5e3dabc79b3d5e100000000588648ceb16cfdee9557d4ded4a4f3cf3dab534fff486f7ad39bac0e09000000c03245728e65e9e55ffc428fefdaa52bd6acd6912f7d89c41c00000080a598100ecbce2f7efe73fdd5960fe8ddffe50fd5f9e52febaaabaeb23a2400000000cb1cc9399695c150480f6efd88eef5f9b4fb8107ac0e070000000024d1ad1dcbc8b7bff1757def1bdfd0a7f6ee55a9c763753800000000602239c7b2f0b5c39fd7d73ff739fde377bea3ebafbfdeea70000000002009c93996b4b191117daeb9592b7ffb1bf5f5f6eada6bafb53a24000000009880e41c4bd66f7ff31b357d6cbbde66b7eb6f0e1c505e5e9ed52101000000405a4c088725e9b91fff581f76bf477f78dd75fad2e1c324e60000000016345aceb1e43cfdc31faaebc8113dfad043fae01d77581d0e000000004c89e41c4b4ae06bc7f5c54f7f5a47befa55bde7965bac0e0700000000b242728e25e1d5dffd4ec73ed7aea78341fdf33ffea3aebbee3aab435ab262b1986e5cbdcaea308079178bc5ac0e0100002c6124e758f42e5ebca8e61d3bf4bbe8057de5f061bde31defb03aa4258d0405000000987d4c0887456dcd9a353afbecb35a7ff5d5eafa877f203107000000b028ad88d10c8645eebbdffdae6ebffd76ad59b3c6ea5000000000605a48ce0100000000b018ddda0100000000b018c93900000000001623390700000000c06224e70000000000588ce41c00000000008badb63a0000407acf3fffbc9e78e209ad5c99b91ef5d5575f557e7ebe7c3edf3c4606000080d9c6526a00b040794a4bf5fb7f7083debe617dc66d7ef57f7fa14ba323eaf8f297e73132000000cc365ace0160817afdeb5fafff7ee79d2a72bb336ef3f40f7fa87f3e76741ea3020000c05c60cc3900000000001623390700000000c06224e70000000000588ce41c00000000008b919c03000000006031927300000000002c46720e000bd46b172fead2a58b5687010000807940720e000bd4effddeef69d5aad55687010000807940720e0000000080c548ce0100000000b018c93900000000001623390700000000c06224e700b040ad5ebd5aab56adb23a0c000000cc0392730058a0fef33ffe43afbdf69ad561000000601e909c03000000006031927300000000002c46720e0000000080c548ce0100000000b018c9390000000000165b6d7500403682c1a082c160daf7ec76bb3c1e8f5c2ed7a4c78846a3eae9e9514f4f8fa2d1a824c9e3f1a8bcbc3ce3be89e7b5dbedaaababcb78fcc6c646f3ffabaaaae4743a278dc70a8d8d8d723a9daaaaaab23a1460419a491931ee170bb1fc53f60100580462c022d0d0d0109334e98fdbed8e5db87021edfedddddd319bcd96715fafd79b76dfd4f34e76fcc4edfafbfb67f3e3cf1ae37b9a8eb367cfc6bc5eef82fd6c4bd1edef7d6fec785f7fecb98b9732fe7c23f48358d53df7581dea9231933262dc2f166219a1ec0300b0f0d1ad1d8b8acfe7537f7f7fd24f4b4b8b0a0b0b150a85e4f178cc5671434f4f8f2a2a2a343232229fcfa753a74e29168be9c2850beae8e890c3e150201090c7e3c9785e9bcd661e2b1da375ddd86e29eaecec542010b03a0c00f38cb20f00c0fc2039c7a2e2743ae5f178927eeaeaea140e87e5f57a35343494d4f53c1a8d9add383b3a3ad4d9d9697661b7dbedaaaaaa52381c566161a186868692baa6272a2f2f97a48c5deb7b7a7ae47038a6ec5a0f00000000e9909c63c9e8ecec9424f9fd7eb3f5bcb3b3d36c31cf34d6d26eb79bfbb6b6b6a6ddc6e974cae170a46d390f87c31a1e1e9eb4e53d9d6030a8c6c64645229109ef3536369a31199fc3a838e8ecec342b265a5b5b27f41430b4b6b6266d9749341a556767a7cacbcb932a3c122b223a3b3bcd7f27c692fa79aaaaaacc71fc99624bdc6eaacf80e521f19aeae9e931afc5c4eb36180c9aafd7d5d5a52d37c6fed95c8752f665c4387fb6c79d0a659fb28f856baaebb4a7a72763f90d87c36a6c6c34cb4c62594fbc8755555565bc872596c9aaaaaab48d0294256009b3ba5f3d900d632c674343c3a4dbb9ddeea4319fc6bfbbbbbba73c476161e184f1a289e7adadad4d3b9eb4a5a5c53c47eaf9b3f94ce9b655caf850e3b8460c893f8585854963e12f5cb8607e96c41f9fcf37e1b867cf9e8d391c8e8c63f13b3a3a92ce9ff893c838f654b1a58ecd377e6c365bececd9b3537e67cbcd7219733ed9f55d5b5b1bebe8e8487bcda4ce0191ed75984b19c9e5b8d98e39a7ec53f6b13065739d1af7a396969609fb1be5e1d4a953b158ec72594f574e52affd4ce5d728ffb9c40860f1a2e51c4b8ad17a6dd43487c3e1a4d7b3d9d7d827d3fba9ade7462b97d1f57d2eb5b5b5a9a5a545b1584c67cf9e35bbf227b68eb5b6b66a6868483e9f4f67cf9e552c1653474747da56ffbaba3a0d0f0fabb6b656172e5c30c7e2b7b4b448ba3c037d6b6bab7c3e9f24a9a5a545fdfdfde6311a1b1be5f7fbe5f57a93c6f337343468686828e97ba9abab93cd66537f7fbfb99dcfe7d3c8c8c8942d9758fa3a3b3bcd6be3d4a953b2d96c6a6b6b535d5d9d3a3a3accebbeb0b05023232349d7b4711d1616169ad7e1d9b367e5f3f9265c87b994915caeefb944d907e65e36d7a9715d27f67031641ae2e6f7fbcdf29be9da37caafd7eb35cb6f7f7fbf791f349e4d284bc01237cf9501c0b464db729eba9dd2b4f4e4728ed4d76c365bcce17098ef5fb8702126c5677b8fc526b6dc6773be5c5acf523fff850b17620e872366b3d9ccd752634c3d5fe2716b6b6bcdd85319e79c2a5e87c391711668631fa3154152cce1704c68f16c686830b7c165cbade53cb5878bd15a9c7add1b2d4789afdb6cb6b4ade989c737aeb15cca482ed7f75cb69c53f681b997ed75eaf57a6392925aaa8dfb52622bb7510e125f8bc5e23d5752cba4517e53cfdddddd9db45a02650958da58e71cc881c7e351201050241291d3e9345ba4721d6f3e5da9e3e68d35defd7ebf59ab3e323292767c7d5555959a9a9a925e4bad650f06838a46a30a0683197b102432c6db3b9dceb463518d3175c160502e974b6eb75ba150484ea7d31c53575e5e9e71223e2c2fa9add076bb5dd2c4f265bc6e0887c3e6dc12a9ef49f16b3f140a993d6ab22d23b95edf7389b20fccbd6cafd3aaaa2a050201f5f4f49893d01a2de98993d21a52ef6d4ea733e9dfc63dacbcbc7cc23dacbcbc3c697fca12b0b4919c6349311e2a8d3f7c0e8743c3c3c366329dcbbee994979727fd413692f3f9eada9a2e36e3b5c4c960d22528e9f68d46a36a6d6d556767a7868787738ec7386728145228149a72bbcece4e3351f2fbfdf2fbfdaaaeae96d7eb556b6beb94bfa3a5eefcf9f37af5d557cd7fffeed55775297669cafd5ef9ed6f27fcfedef296b7e88a2bae98f5181722e3faca74fd24961163db6cca48aed7f75ca2ec03732fdbebb4bcbc5c369b4d9d9d9daaabab53341a552010506161e1b4aee5a9ee61d38911c0e244728e2525758cb9d1b29458bb9d89d1aa36592b78e298766356e3e9fe315e08cacbcb150a85e47038e4f57ae572b9e4743ae572b954575737e94377a2c966c3972e3f70389d4eb365ce98057a686848814040e17038e3ecb5cbc1f7bfff7d556dfba8deb17ebdb47285f9fa5557bf6dd2fdaeb9f65a9dffe52f755fcd0ef3b5732ffd548d8f3ca20f7ef0837316ef7292edf5bd9850f6818972b94ecbcbcbe5f7fbcd99d8a5893d5cac8e11c0e243728e25c3680172bbdde60361555595fc7ebf5a5b5b55555595b655498a77f11c191949da371da7d3a9c2c2420502017399b6d9eed23ed91fd670383ca1fb6c62d77aa3f6dd58ea2575dfd47f87422179bdbcf2003f0000200049444154deb4134665f307de88251c0ea7fd1e8c964aa7d3a96834aa9e9e1e73ad7aa35badb1167d20105030189cb721020bcd2db7dca23fb8f106fdd99d77ea7f7cf49eacf7cb773af5e5effea3f9efef7cf31bfae7af7f635925e6c67598eeba375e37b69b6cdbd43292cbf53d1b28fb138f03cc975caf53e3f9a2a7a767c6bde812cb53bab8cacbcb555555a5f2f272ca12b0c4315b3b9604a36b99a4a407538fc723afd76bae439eeea1b3b5b555f5f5f5e6ff4fc5f8a3973a736bae8c8a82d487e3c9c68da5be67d4987bbd5ef3986eb75b4343431366924ddd77b2eebd8d8d8d5975759dec7c52fcbb59bf7ebdd9aa505d5dadaaaaaa09dd708d1832559e2c076f7ad39bf4d5bffb3bf57677eb27fffeefd33ac6f04f7ea26f1f3fae839f3d30cbd12d6c935d8746eb92cd6693c7e3c9a98ce47a7de712af44d9a7ec63a1c9e53af5783c72381ceaecec342bbba65b51679427a3f53b516b6bab42a1901913650958da6839c7a26274e14a644ca422491d1d1d136a8c3b3b3bcd2e9c2e974be5e5e5e61fd09e9e1e0d0d0d99fb6633a9537979b9dadada343434643ef04f477979b9eaebebd5d6d666b63019933265120c06e5743a555555a5482422bfdf2f9bcd96f4f0dddadaaa4d9b36a9babadadc3eddc3b3c7e391cd6693dfef57341a95cbe5325b0e86878765b3d9343232a268349af4c7beaeae2e69f299d6d656793c1e555757abb3b3d36cc5338ee376bbcdefc8e7f3c9eff7cbe57299ddff82c1a042a190dc6ef79c4faab5d05d7ffdf5fac85ffc85da1b1bd4f60fdfca69dfdffcfad7dafbd77f2ddf873fa49b6eba698e225cb812afc39e9e1eb95c2e452211f5f4f4686464441d1d1de6759c6d19493dee54d777b628fb55e667a2ec63a1b0dbed395fa7c6f380f1ff33d1d8d8a89292126ddab4493e9fcfbc2f844221d96c36b3f71f650958e2ac9e2e1ec886b11c49ba1f87c311f3f97c592d5fe4703826eceff57a332e3f926909379bcd96b4849a2197a5d462b158aca3a3c33c96a458616161ecd4a953199753eaeeee4edadee170a48dbdbfbf3fe9b3da6cb6b4c73d75ead484efc4e170c4babbbbcdcf6e2c6f75f6ecd9a473279ef7d4a953668c893fb5b5b549cbbd5cb87021e6f3f9266ce776bbd32e81b51cbdf2ca2bb1bbb76d8b351d3e3ce9126aa93f9fd8b72ff6a1ad77c55e7df555ab3f42ce5297ee32645ac2abbfbf3f6db99cec7a4e956d19318e9bcdf59ded526ab118659fb28f8528d7ebd4285b92d2be9fcbb289b1d8c4f26b6c9358e6284bc0d2b622168bc5b24fe581c52f128998dddb17cab8ac603028bbdd9eb1c6dbe3f128140a29168b291a8d2a1c0e4fbabd211c0e2b1a8d4ef9398dedb239e66413e765fbdd1a9f418a8fb5a31b5eb29ffffce7bae1c61bf5b560481b0b0ba7dc3efc6fffa6bfdbf7697dbda343575f7df53c44b8b019d7e16c9691c4e34ab377efa0ec53f6b1f0647b9d86c361b3a53b53ef9be930caa5d3e9ccd8559eb2042c4d24e7c02290f8808ee5e1647fbf1e3fd4aebd9fffbcde7acd35936ebbd5e351c3230feb7def7def3c4587f942d90716aebaba3ab5b5b5a9bbbb7bde965405b0b431211c002c40b79694e85d3715a8a3a525e336972e5d52cb273fa9cd85ef2231078079d2d8d86826e60e8783c41cc0ac2139078005eac1ba3abd128daaef3bdf4efbfed33ffca14e7677e9c0be7df31c19002c5f3d3d3d6a6b6b93cd664bbb1c21004c17ddda016001fbf18f7facdbfffccff5fd679fd31bdef846f3f5f32fbea8a68f6dd7679b9af4ee77bfdbc20801607931e65860ac3780d946720e000b5cd3a73fadf073ffaf3ef5c52feaf56f788324a9f1631fd34d4e87f6ecda657174000000980d746b078005aee1d147f59b975fd6f7bef50f92a47f7af209bd3a36aa9afbefb73832000000cc96d55607000098dae39f794c0f3735e9adbffffbfa4c5d9d7e100a292f2fcfeab0000000304b6839078045e09def7ca73ef0def7aa69fb76edfbcc6774fdf5d75b1d12000000661163ce016091f8cd6f7ea3175f7c5137de78a3d5a10000006096919c03000000006031bab503000000006031927300000000002c46720e0000000080c548ce0100000000b018c93900000000001623390700000000c06224e70000000000588ce41c00000000008bad9e8d83ac58b1422b56ac988d43018b4a2c16532c16b33a8c794579c772b55cca3b651ccbd55228e3945fc01ab375ff98b5e4fcd9d72ecec6a18045e5c6d5abac0e61de51deb15c2d97f24e19c772b514ca38e517b0c66cdd3fe8d60e0000000080c548ce0100000000b018c93900000000001623390700000000c06224e70000000000588ce41c00000000008b919c03000000006031927300000000002c46720e0000000080c548ce0100000000b018c93900000000001623390700000000c06224e70000000000588ce41c00000000008b919c03000000006031927300000000002c46720e0000000080c548ce0100000000b018c93900000000001623390700000000c06224e70000000000588ce41c00000000008b919c030000000060b1d5560700000030957391889e0af4683018d2e848549254ec76abd257a57ca77346c71e080635180a4a52d2f132bd6e8585144baa74bf9b8242978a3d6e9579cb33ee371a8daabda949a787c2e63e55b5b50beab30173e97438acd1e8f8fdcce3b136182c082b62b1586ca60759b972a59e7dede26cc4032c2a37ae5ea54b972e591dc6bca2bc63b95a2ee57d2196f1f6a646b53737677cbf66ef5ed53434cecaf18f9dec331f9233bd3e9746a351edabaf57a5cf97743e2b62c9c654bf9b8d85853a70a443052ed784f7b66cdea433434349affde8572f2bcf6e9ff538b3b114caf8422cbf736d6b69890643a1b4ef15b9ddaaf4f954e9ab9ad139da9b1a67748f49d5d9d6aaf6a6268d8d8c24bd5e71b74f7b5a5a2c2b0398bed9ba7fd0ad1d00002c58bbaaab9392bf8d85852a72bbb5cee1305f6b6f6e567b53a305d1cdaede408f4a36ac57f751bfd5a164655f7d7dd2ef669dc3a122b75b456eb7f9da99a1216d2d2dd1b9482469dfd3e1b099986f2c2cd4b1937d3adcd54552825935180a69f7b66dda555d3dadfd4f87c3f26c583f690554ae3adb5af5d8ce9d13127349ea3eead7d6d292593b17161f92730000b0200d048366a26a2470279e39a5e37dfd0abe70568f1c3c686edbdedc6c760f5dac4e87c3691fd825a9a6a151cf5dbca4e72e5e5a10ade603c1a0fc87da24496b6d36ed3f7244c117ceea785fbf8ef7f5eb47bf7a59655bbc92a4b19111edda969c1c25feae6ef37a55ecf14cda051e988a718f307e1e3978d0acc4eb3eea576fa027e763f6067a747e787856e3ec6c6b33e3ed7ffe053d77f1927ef4ab975571b74f52bc426b3ab1626960cc3900005890fce30fb192d2768daeaaadd35834aaf6e666adb5d934180a262578e7221175b6b599639af31dce09ddc5676220185497dfaf73c311e5d9ec2a2bf766ec3edb1be8d1533d019d1b8e489a385ebecbdfa98184aeb95d7ebf064341739ba9c69c67fb59538f331a8daab3ad4de78623ca7738b5a3a121ab31df89bf9bc35ddd13ce9367b7eb7077b7d9e5783014d2e97058052e57fcb3062f7fd68150486a6a5491dbb3202a1eb038e5d9ed49d74fb1c7a34a5f95b66cdea4f3c3c33ad4d494747fe80df4a8abd39f344f42e29c07a965b2bda951f94ea759c6a7da3f1323d92f767bcc6df3ec76ed696931ef0fe92a1abbfc9deaed096874249af17ed3e5efd4b9482429ce4caf27be5650e8d2be9df5ca7738cd6ef5a3d168fc9c81c0a49f2ff5de53e68dc7452f98e961cc3930034b617c5aae28ef58ae964b795f4865fc8655f10e7e456eb78ef7f5a7dd66341ad558343ae181b1cbdfa9dddbb6a5dda7e26e9f0e747498ff9ece98f35dd5d569bb9f6f2c2cd4f1befea407d34cdbaeb5d974bcaf5f052e57c671b3c679278b65ba9fb5e26edf84b8d6da6c3af1cca929130ce377b3b1b050279e399571bbde408fb657564aba3c3740a6cf3ad3b903666a2994f185547ee78b713d65ba4f18ddc8a5cb731a649a2b21f1fa4f779d1ae7c866ff4c12e75a30c6c42726eaa946a3516dafac485b66cab67875b8bb7bcaef22ddebc66beb1c0e8d45a366af9d1ffdea658d45a3dab279d3849e3ca99fef7438acada52513b64b771f5cea18730e000096ac8160d0fcffe28431cca9f2ecf6090fb5bd811e3359dd5858a8c35d5d3a76b2cfec66dd7dd4af7df5f5d38eadbda9d14c6acbb67875ec649f6af6ee9514ef92babdb262d26df71f39a2b5369bc6464674fff8b6953e5fd258ed8abb7daad9bb57d74e9124cfe4b3761ff5ab66ef5e1d3bd9679e7b6c64c4ec769b49f2efc633e9b64509ef1bad90953e9fd98537be8d5b357bf7266d0bcc9682c2cb3d6e8cd9d18d6bbce26e9f8e9dec936f47ada4f8f5ffd47897f2d43259b377af2a7dbeacf7cf64cfc116f3ff8d31f125d76d888f6d6f6a9cd06adeded46426e6467935ee37bd270233ba9749975bf28bdc6e6d2c2c549eddae7df5f51a1b193187ac1ceeea32ef59879a9acc7defafacd0d8c88879ef31ee6d678686661cd77245720e2c00af5ebca8071f7e58d1591e2ff9b36854bb1f7e58172f2eaf5a746021a29ccf9f4f8f3f141a2dd365de72157b3c3adcdd6d3e6cfb0fb54d98a42c5b4ffa2f8f833fdc1defd25dd3d0683e300f8642e6b18d87f8750e87b96da5af4a350d0d2a72bb7587cfa77391882a7d55499510953e9f6a1a1aa76cc19ec967f5eda8554d43a38a3d1e1d3872b975dde89e9a8d3cbb6d8af727b69c55faaa54e9bb9c9c17bbdd661c8b09657af13ad0d1a19abd7bb5a7a545c51e8ff6b45c4e98c7c67f9fa965b2a6a1d1ec129ecdfe99147b3c0a3cfd4c52e22fc593e4f6e6666dd9bc29a9bc76f93b258d57d88d97939a8646b382cb787f268cb9228ef7f56b341a55ef897857f69a860655faaa54e62d574d4383cab67875ad333e8e7f20183413fb03473a54e62d57a5afcafc2e16cbc4960b0dc939b000dc575babbfd9bf5ff659eefef306bb5d07f6ef576d6dedac1e1740ee28e7f3e35c24623e309679cb2724878949e1c0f8d8eb5c9c0e87cde31714ba34100c9a3f6b13ce35100a264df0765bca646755b5753aded79f55029ec94c3f6b99d76bfe3f6b8be78e32bd38e5d9ed6622d91be8d1befa7a6dd9bc69def697a40297cb9c3871ff9123aab8dba7b5b67845d7f9e161b3d579201834ef2189e539f1df63232349bd5972b5cee130e7f3c8b3db753a7cb9722eb1d741556d9d0e77779b434f0613ee29bd819e7857ffa6c6e4f9246610d772c58470f32871129674b29908e55c24a2a7023d1a0c869226a028f6b833ce726a4cf89028754cd7b9486442cd1b13b3cc8f1f0c0eeadb4f3c31a7e7f8d6134fc8e7f3e98ffee88fe6f43c88eb6c6b356bce271b3f9958367db5753a1d0e4f3ae113162fca79ee12bb739f0e0f65dcee5c24a2d3436115b93dcab3dbf552c2df3ba3852751bec399b46fae12bb9c761ff5676c1d3a1789249d6baa16e6e998ebcf9a49b6bf9bf8fb971ff413e359ec28d38b47624f102309dd575f6fae36301dd3dddfb85f9d0e8755d3d0a83cbb7dbc274995a40e731cb8d1723d1fa61a3a938dd95c6a6eb923399f4783a1e014176fb3d6391c3a70a4236d529c69f289c15048fe436dda5858987636dbf88cafc99348a43ef80fa489ad66af48cee7d8abafbda6fbeebd570fb5b468d7873f3c67e779f8e041dd73efbd7ae6e9a7b56ad5aa393b0fe24e8787cc07f64c955ca3d1a839a66b9dc3a19a86c6a47b44d12493c36071a19c4f4fbed3a9750e87ce0f0f6b2014d468349ab68bf4a1a626b3bcc5c745cedf0444456e77c6f1f04b79fc74e2efa6f74420e3ef4652d29250c59ecc73072c2694e9c52571e9b23cbb5dbd811e33b12edbe25565954f05852e955cb721abe3cd64ff8150d09c23a2c0e59ad0b05650e84a7a664f4c9c8d99dcd3fd7baa043b97652613cb72e2398c86bc22b747052e57524f2163a23dcc1cddda1798f3c3c3baebd6d2a49a66295e4397983caf733854e476278d57393334a4ada52559d58ea7766f4bec8282f9b3afb55557beed6d7adf873e34a7e729fbf087657feb5bd536c5243f981db7955fee2adae54fdfaad61be8c9d8dd154b0be57cfaee48e8b6b9afbe7ec203666fa027a9e53ab532eca9c0c4d6a7de84d7a69340275680e73b9cf1b1e6e33f95be2a15b93de6b8d0c46d535b980782416d2d2dd1befafa6977fd9cebcf3a993b12bad8eeaeae4efbf07f3a1c369f5dd6da6c4b661d73caf4c2341a8d260d33e9f2776a6b698939f463474383a4e4de1cfb3be263a573495e67b27f6219d8555d9d5479d5e5ef347bb11acff746459814af8834ce331a8d9a13b315b9dd132af38d89ef8cff376687cf4681cb659e33f119e6505393da9b9b75d7ada592929f5d127bdf6e2d2dd1cd57be59bbaaabb33e272e2339b7c8b1937d7aeee225f327f0f433e6ccaa92ccd95ba5f81f70a386ce983531f8c25973e2861ffdea6573dfb19111edda96b93018852d3519379275e37dccbd678787d5f299cfe8935ffca2f9daaf66f9e73f12ceb7fb8b5fd4a7f7edd34f7ffad3b9fd605099b7dc1c3bd69b61d6d6de9ecb0fcd55e3e30a6b1a1acd7b02bd569606caf9ccd434346a6361a1a47817f22d9b37c52bab9b1ab5bda2c25ca24b8acf626cb4dc1813259d191a4a7a683c1d0e9bffde585838ad729667b79b0fcedd47fde683fa6834aa8f9496e8ae5b4b75c3aa95666bb2b16def8940d243bdbfadcdecf996aec5696c24bb87fdb9fcac93f1d5d65dbecf9d0868cbe64dea6c6bd54030a8de408f765557cb7bf36673fbaadada25d1b246995eb8ce0c0de9ae5b4bcd9fdddbb699add01577fbccc438b1d26ccbe64dda5a5a9274adbe141936ff3fb17578cbe64df26c589fd3fea9f2ec7673e2c8b191116dafacd40dab56ea86552bb57bdb36b3d2be666f83b98f3159e3f9e161956c58afada5252ad9b05ee78787b5d6664b9afddd9847626c64242936a3ac66cba8c8180c85e4d9b05e5b366f322b427d3b6acd55328cfce3b19d3bcdef673014d2d8c8880a5c85399d137124e70b4481cba5c3dddde6457e7e78d87ca8f727d4981eeeea36678a34e4d9ed49b3b20e8642135ade0d378d4fec90d8729e38a1cc4d09133f60eec424dd77fffdaa7ef041bd7dc37837a8152b74d52cffbc63c50a69c50a49d2dbafbb4e55f5f5fad8c73f6edd075f468c8780b1919109097ae24ca81b0b0bcd1aef8160d09c50255d0f98816050bbaaabb5b5b444db2b2a26cc1361ec9bfa7ae27153ef0d99f6c1cc51ce67c7f1be7e33413f3f3c2cffa136b53737278dc934663136ec6969311f46776fdb96f4906a2c0f94383b79ae121f86bd376fd6d6d2126dd9bcc9fc5b9a5851b0e7e0e5588c6d3d1bd69bf157dced331ff6135bbf8cb2dede74f973a58d658e3f6b267976bb8ef7f5274d62f5d8ce9dbaebd6526dafac4cead190fafb59ac28d38b4f91dbadfd478ee840c7e53250e62d37973e3b3f3cacc150481577fbf4c8c18392e295eaa30933b61b0d57678686747e7838a7fdd3a96968d423070fa66d10db5858a86327fb922ad38a3d1e1d3bd9175f8f7c64c44c7ed7391c3aded79f545910efbde336633b1d0e6bff91231386bc4ea5d257a5470e1ed45a9b4de78787cd9677df8edaa499e9f777742455101a1506357bf7aaaab62ea773228e31e70b8cafb6d6fc837d3a1c5699b73ce9217eb29aefaada5ab386b037d093b6201679dcea3d11d0f9e1e1f864354e6752a26ebc8fb975e45bdfd24bc3c36a7be001f3b51f5fba34e7e7bdeba187f4972e97babbbb55515131f50e98b6dbcabde6c3e9533d81a4ae6c89c97ae2ecab938d39df555d3d61e2a9de130175b6b5e9785ffff80cab43ea3d11d05a9b2da912afbdf9f21aa9a3d111ed19bf37247639351e2a307b28e7b323cf6ed789674e8d77f9bc3c87ca5a9b4dc56e8fcacabd692badfb5f38ab7df5f5ea3eea4fead259e4766bcfc1969c1f561315b85c3a76b24fbbb6559b0fe7464c55b5b54989a8312bf3be9df51a0c8592c693a63ee89679cb55e4f69b0fdf83a1d0a46bbccfc7679d4c81cb659e3b71a88e616361a17634342c99eeec94e985e9785f7fcefbec696951556dad5e8a4474add369febd4d4d28f3ec76055f386b0e3d31ca52b6fb6752555ba7aaf189608d443ef138a98a3d1e055f386b6e9f67b7a72dd746a599b15d81cb654e3a976aaaefcd8831f1b3a7f67ec9b3db75a0a3437b5a5acccaff74db217b2b62b1586ca60759b972a59e7d8db518a79238a15b6aad58a21b56c53b3414b9ddaad9db608eed48fd239e6a341ad5bbdf72a5b9af51e88c991f2529f0f43366d79bfd478ea8d257653ef4afb5d974b8abdb3c5fcddebd4ba2a67b2eddb87a952ee5f887f917a3a32ab8f146b57675c9f55fffeb1c4596d9a97ff917edfed087f4ec9933bae28a2b72de9ff29ebd9baf7cb3d972f5f4cb17ccd7b757549895608993a864ba4724be5eb6c52b5f6d6d4a221f2fef5dfe4e73a21963ffc4fb82147f583ef1cca909c7ed7ffe0526a09b422ee57d3197f3a558c68d87cbc91e7ea7eb5c2462ce9a9ecd8a2bd96c3bd503f864e6f2b34e2531d1588c0fe89395f1c552a69762f9051683e9e404e9d0ad7d11996a19966cfe0816b85c66173463dcb9d1725ebc8467965d286292ea1f7e58255bb658f2c75d9236fdb7ffa63ffdb33fd3a38f3e6ac9f99713a3a63ab16b7b6297f6b22ddeaccaed93e313b26c2c2cd4e1ee6e157be2134e19e3d60643219d8b44525ae703e3ef05938e756668c87c783626904aec5a8f99a39c2f3cc59ef8447173719de73b9de6f1676bdb02976bc28472d99acbcf3a1523ee628f67d125e693a14c03982f24e7cb9091840f848249e3cd8b96c812270bd9530303faa7ae2ed51f3860691cb58f3faeaf7de31b7ae699672c8d63a94becb2ded5194fb013c7769725ccea9ec9e970d82ca30585aea499681327aa19080593269f322add8c4a3863ccae74793c9cd1fdf536efd471207b94736069a14c03982f24e70b4ce2245079367bd2ba85a9cbb0a44a9ce829dfe1ccb89d91849f1f1e4e4a1468399f7b75f7deabddadad96b728d8aebc524d8f3faefbeebbcfd23896bac4e5488cb5808d654952c785679238a94cf7517fd24cb48feddc69be67dc3b8c995acf0c0de95c24a2a7c65bec8bdd1e33411f088692c6bd2f95f1a00b05e51c585a28d300e60b13c22d30a993b319eb1b9e1f1e361fee33fd71487cd82e9ea415bc206146f62713d62f2c70b9a6bdd62ab2f3d52f7d49deca4afde97bdf9bf3b216b3e9d5975f56d3830fea7bdffb9e65312c17b779cbcda510fd6dad666bf57412e222b73be3e450c61ac6b779cbcda4bdcbdf69b6ba9779bdcab3db74666828e93eb3cee198b3c9a2962bca39b0b450a601cc175ace1790d16854879a9acc7fdf36fef07e4742d7d8ddd5d5699767489c7579adcd36e9837fe25837b34bfb14b3c16276fcd73ffe63957bbd6a7bf861cb625821e9d0430fe9ce3befd4e6cd9ba7dc1e3393d8b5bd33615944636df3a92426cef90e677cacf9f84f7cc994f8f873a35ce73b9d660b7962e55bb1c763de17ce0f0f9b09fa6db49acf3aca39b0b450a601cc175ace2d125f0e2668fefba5c870d23224be1db5e6642ebeda3a75b6b5c527953a11d096cd9b54555bab824297c646a27aaa2790b4c452556ded945daf8adceea4e55ca65aaa05b3e7f1fdfb75c3c68ddae2f3e95dc5c5f37efee1fff93ff5fdef7d4f67ce9c99f7732f4746d7f6f3c3c366f9cea5b5da18473e180aa9fba83f5ef65d2e8d46a3fa48698959c19638eb7ba5cfa7c776eebcdc6abec56bc6b2d666d3d8c848528b3a661fe51c585a28d300e603c9b94552d72b4e54e476272d9966ac59b8b5b4c47ca84e1c6b9aa8e26e5f56cb9f15a724e7458c379f37369b4dad2d2d6abaef3e7df3e9a7b57af5fc15c335afbeaa07eebb4f870e1dd2dab56be7edbccbdd1d3e9fd9b3c5f8772ef61c6c319740f4debc59456eb75e4a98ccb166efdea40ab9d4f92312277b2cf3969bf79fb5365b56334c237794736069a14c03980f24e70b48d916afcacabd6927892a70b9d4ffc259edabaf4f6a61376c2c2cd48e8686acc7b1c693f1cbc9020fe8f3eb4377dea9239d9d3ad6d2a2ea071f9424bd73e54a29169bfd93ad58a11f5fbaa41592bef5b77fabf54ea7eeb8e38ed93f0f32aaf4552525e7d94c0497a8c0e5d2b1937ddab5ad5ae78787cd8ab5b5369baa6a6b2754c825b6d64bc9c97ab1c76d26e74c0437b728e7c0d24299ce6c20185c50cf92a3d1a84e87c32a70b9e67c22bf816050d73a9d8b7a49d27391885e8a449467b7a7edd9773a1c4e3bac36ddf6c6b1e6e3bb4f67341ad5b9f1f32f462b62b199df5156ae5ca9675fbb381bf1204b8985c4aa8b1fd28dab57e9d2a54bd3daf7ecd9b3dafcee77ebef9f7946eb1c0ebd73c50acd42714c7241d2952b56e8c7b1985e894474fbcd37ebe9a79f9673067f4028efd632fee84954aacdb7e994f7c558ce9773193f178924ad6222c52bb353cb5a97bf336975154959f55acbd54030680e81abf4554debe1bfbda951527c3e8a5c2b06979b6ccaf8422fd35694df7df5f59294d4ebd36a03c1a0eebab554c74ef665fdb7f27438ac7d3beb75bcaf3fa773ddb06aa56af6ee9d937bc07cd95e51a1de1301adb5d9f4f4cb1726bcbfb5b424a9c76da2750e871e6d69312bfcdb9b1ad5dedc9cd3779fc9747f275b366fcaa9d17236cc24274844cbf922b5586b8370d9faf5ebf5c0030fe8331ffb98dabff39d393dd71b253db87dbb1e7ae8a11925e6b05efe22af9d5f6e28e78bcb4b9148522f1749aab87b78c203e6a1a626b3678a612e1ecc074341339e22b7677ac9b9b9bf9be47c1650a6939d0e87d5e5ef54ff0b67ad0e65c67a033d1913d0a5ec5c24a2de13016d2c2cd499a12175f93b33de2b8e9dec4bde7738a27df5f5da555dad13cfb866fdf964babf933d075bb46b5bb58adc9e45d780c96ced80851e7ae001fdfcec593df5e493737a9e7ffbd6b7f4d24f7faa9d19e62a00307728e78b5be2d28352fc41363531c7f24299be6cdfce7a55faaad22640e722110d04833a1d0ee774ccd3e1b00682c1b4dda8b3d96f32464cb91e3fdbfd8c6da67b9cd16874ca63241e27d7ef361da3b7d017babab5cee15057c24a2fa98a3d9ea49f4a5f95f6b4b4686c64444f252ce99c8be97e16e3bb4ab75fb1279e94fbdb5aa715939548ce010bad59b3465ffdf2977560c78e393dcf437575fae217bfa8356bd6cce979004c44395f9cd6391c92e24b0f2676614f4cd68d6db0bc50a6e34e87c31a0c85262c0d3a1a8d6a7b45854aaedba0bb6e2d95f7e6cdf26c583f65f2351a8d6acbe64df2debc5977dd5aaa920debb5afa468c6580000171549444154be5e37ac5a3969b23a1a8d6a6b6989b9dfcd57be59a787c269b73162baebd652bdfb2d57aa733c7933ba624bf16eeac67090a9f6bb7cfc116dd9bcc9dc26f5f366739c2e7fa74a36ac37dfbff9ca374f186633ddef76324ffafd2a72bb95ef74ea0e9f4f83a1d084613b93c977382549633956a64cf55932fd4ea4f8508a77bfe5ca49bf83aadadaa4256c170b9273c0627ff2277fa20fbcfffd7372ec378cfff77def7b9ffef44fff744ece01606a94f3c5e7a6c2cbc3c71213f281e0e50919af9da20b6797bf53db2b2ab4b5b4445b4b4bd4d9d69ab1d56d2018d4aeea6a6d2d2dd1aeeaeaac1299ceb656f3d8fbeaeb737aa03e1789a8bda9d1dcdf38c6542d7688a34cc797055ee7704ce8cabcbdb24203a1a06af6eed5b1937dda7fe488f2ec766d2d2d99b4d5797b6585ce45227ae4e0411d3bd9a7326fb9fc87a64eaeb65756e87438acfd478ec4c739bb3d135635da575fafc150c88ce9705797361616eab19d3b752e125191dba3a2f165856bf6ee3557319a6a3f8311e7e1ae2e1deeea92a4a4cf3bd571ce4522dabd6d9b8add1ef3fd7ca753bbb76d4bfacea6fbdd66d21be8d1f9e161558eaf22637467cf25a935e6c5c875c8ed549f25d3efa4bda951fe436daab8db67ee37168deafeca8aa4e317bb3df165a8a7d9a26f15c69c030bc0e1cf7f5e972e5e54341a957d16c7c6bc128d6adbb66d3a7cf8f0ac1d13c0f450ce17970257a10642418d8d8c682018321f5a8d44bdd8edd1e848fa8761a395ecccd050d2eb83a190da9b9a74bcaf3fe941b6cbdfa9dddbb6256c1952f751bf361616a63dfee970d85c5e35f1d8fe436dda7fe4c89463cbd3ed9f780cdf8eda0535b9d742b5dccbf4e9a17052259674b9353d7532b0326fb94a36ac5797bf5355b575138f35be5fe2f55becf1682c1a55ef8940e61832ec674c7066c8b3db274cdab6d666d75db796eaa54844c51e8f0643c178029db0cd54fb191513eb1c0e1defeb37bbf71714ba5472dd06f3f34e751c436595cffcde0a0a5d491583d3fd6e27d3d5e9d75a9bcd9c382ddfe95491dbad2e7f67da7b4062ebb5240d84421a0c85b4b1b030a7c9d7b2fd2ce97e279d6df1c4fc404787f95a9eddaea77a023a97f03bc9773ab5d666d3e9707851ad4e43720e2c006bd6acd157bffad5593faedd6e9f93e302c81de57cf129767bd47b22603e20278e372ff2b8d51b489f342426e6468b8f3171d2d8c888b69696e8c433a794ef749a2d6652bc357e4f4b8bf21d4ef9dbdad2262546e23f3632626e9f67b7eb505393ce0c0d69f7b66dca7738279d25f9feca8aa4fdf31d4e8d8d44cd63f80fb5a9cceb654588292cf7326db4042732ca4a3ca90a26bdb7d66ed76030943681345a375393a8ca2adfa4c9b971bea9f633124d63c593d343e18ce53751b6fbdde62d4f1a779fef746a6361a17a030155d5d64d799c02974b6b6d366dafac5491dbad32af57b779cb932adaa6fbdd66624c0457e47627f5d42928746930144a3b315cea8499eb1c0e55dcedcbb9326fba9f652018af30bdaddc9bf47a99b73c6d025ee072692014524d4ed1598be41c0000208d228f5bbd2702e6b8f3c456ac62b727ed437a97bf3329314f6cf1c9773875d7ada51a1b19d1a1a6261de8e8489a44694f4b4b52eb9f67c3fa0993cff5067acc16ef031d1de6036991dba3920deb353632a22ebf7fd2c4da38e65abb5dc509b3c0e73b9cea0df4a8c0e59ab2cb3e908e31ee383589334c755da54e2cb7d636798f04e37c53ed773a1cd6fd951549e5299b3923b2dd2fcf6e4bf3dae518a63a4e9eddaee37dfddab733defd7d3014d2633b77aac8edd6e1ae6ee5d9ed33fe6e5319e3d9074321dd756b699af7fd1392f3e72ece7ca93069e6d7c954d7c56246720e00009046f1f8184729ded29338de3cd3f84a631b49131e6c8b3d1ead7338747e78f872cb51c2f6a92d3fb7a51973dbdb73b94260adcd9e34463cdfe9d499a1a10933cca732964c3a3f3cac92eb36689dc3a162b747c51eb77ce35d708199f8d1af5ecee93a5a3bbe6d62b76429be545736fb8d46a349e71b4b187262f436c9773ab5a3a141f90ea70a5c2e9d0e87d326a5d3d96f343a9276ff6b1dceac8f53e072e9785fbf5911d8db1350ef8980f6d5d72775e1cef5bbcda4b3ad4deb1c0e1d38d231e13da3e7cee970784e976f9eee67194b33a468ae639d2f4c080700009086d1d5548a27dd89e3cd33494c26d2adf96bb408192d6889e3d6531f52d3b5c6256e6fccea6cfc182df6532df576e04887f9b98cedbb8ffab57bdb36bdfb2d576a5f7dfda4fb0352bc92e7a548f2b5665430659a653cd3e45cb765d86fb265bda4cb653175bfa7122ab14e87c31a1b19d19e83f19e29c6325ba9dda953e5b25fea3262a7c3619d191a5291c79dd5717a033dbaf9ca379b951395be2a1deeee5691db6dde53a6fbdda6d3e5efd4d8c888aa6a6b272c8f56ecf1a8a6a141526e13c3e562ba9fa5d8e3d15a9b2de9f72bc5bbbb7b6fde3ce1782f45222a285c5c093b2de70000001914b8e2e32f07424133e92d70a59fa86dbea58ef7cd5681cba5fe17ceaa37d0a3de9e8039f19dc17fa84d79765b52977c205541a16bc29265052e978adceef159c88755e6f526cd67e01b5f766d20181f6b6c5c63f94ea77c3b6ad5dedcac9722c3bad6e930271b9b348684f38d8dcff0dd1b082425774685d8be9df5da73303e36bacbef57f7d1f4897f6fa0470585ae9cf61b1b4f2a7db5b5e6fc126b6d3655faaacc2edc931da7a0d0a5b19111dd5f59a11d0d0d5a6bb35f9e0c6dbc9c4ff7bb4dc7a8f4c834796481cb353e66be47a3d1d99f1c32dbcf62307e27f94ea7aa6a6bcdeef0953e9fce0d4774a8a92969623b299ee89f1f1e5e30f7eb6cd1720e00009041f1f8523e89add14593b49c1bdb4b9ad0fa331a8d9ac986b1445062ab4eeaf269a7c3c9b3bda76e5fe9ab524d43a3f953e4f698af4de57438ac62b74787bbbbf5f4cb17d4fffc0b7ae4e041f3fd81299222e0b672afce0c0d4d58c2ef7057b7cab678e53fd4a6bb6e2dd5f6ca4a9d8b44b4ffc811732e84c15070c278e33d2d2df2eda8556fa047edcdcd1a8d4693aec94c0e77c55b98db9b9b75d7ada5eaf2779a2dbf523cf1df7fe488ce0c0d99bd4c0642411deeead25a9bcd9c3ba2cc5b6e4eca76a8a929ebfda478597c6938a2bb6e2dd5ee6ddbb4767c0c799edd9ed5718c6dce4522da5e59a9bb6e2d557b73b37c3b6a93caf374bfdb44e722110d86422adbe29db44b79a5cf37a74b9165f359527f279254d3d028df8e5a751ff59bdfb7a4a4d9f2fffff6ee1fb6912bbf03f84fbe6b1db2760c907680fca9285f806b491fae3e725d1b20d51a70c4ad025c6169bb5416f70ab72481d4bb54ea2022cb18b8135919296249402e6544f9dae426c562c614ff48a2a4f5acc8cf07206c49338f23617eb3f3e57bf35ec4ea4906df753b4992240f6de4bdf7de8bfff8dfff7b8ce38127e56f7efeb3f8f39f1f67728ca742bdb3adb6a5deb7b9c6ff7d38cc9e014d27739bfd5e2a9d14e9f35f7d9a85edf47b7f3c3f8f4fffeae3887833ec77f686f11ff7f6b2deb26f5ebd8a5fd71bd7dafff56feaf1cdebd70bc71211d99243abb6efbdec646b3bcf2e85f6d73f7bd30ff3cb6a357b9e353dbe0f4aa5f8973f9c66c7f7dd781cf5bfff4544c4c25245db60136afca7aedfdac71f456b7f7fe9ccdae9cce41171ebccff3f4ca7f1a7e974e151907f3d1ec4179f7d16c7bfffc3adcf137f371ec70fd369fcddeeeed2d0f9c3741adf8dc7f117c5e2cab6966d7397fd52e91c10cb7edfbbb693b6b1eaf788b8fd6ffbf9af3e8d7ffeb7931b8ff55d71dbefb2eaef76dbdff38b67cfe2fd62f127bb8e3dd6f543388707d8847fc8d7a5ded956db52efdb5ce3cbc279c48f0137e2c7901bb13c9c47bc590b38edb94a278ffbaf9965d8e683ef6c3b1f944af161b91cdf8e46f17ea1900d379f5d0f78760de7d9edd3f73bf9fe2cbba99f0fe7ab8e2f22ae0d21be4b18da349b50e33f75fdbeeaf7e2772f5ec4f0fbb307b5937e30f4dbafbfce82fe0fd3697cf1d9b3f86e3c8edfffcfe5631cee5648ff6e4f259cbf0de9879027fff9fdd2b93fde86c7ba7e18d60e0070835fce0c559f1db6beca970787f1cdab57f141a9147fbaba8a6f47a3f8ef8b8b78bf50882fbffa6aa127271d961bf166f87cfa9c696beeb9cbd43f75bbd1fc87fd6bdba7c7393fb473d5f1fdf6ebafaf1d5fdac6df562a5b19ccb99fcf9aadf8b05c5e98886b5db3cf20ffe6179fc4e7bffa343efdf8a3f876345a7b0ded6df7c7f3f3ecd9f66df5bb172fe2cbafbefac982f963d2730e0fb0099fb2af4bbdb3adb6a5ded5f8e35a67686fbaed4dc359e7a543603f2c97ef75239a0e057e481b9b62136a3c8ffafd613a8d57fdded2a1edf769277d96fb2f4be5f8acd9bcb56e60d6639d8feb32ac1dde019bf00ff9bad43bdb6a5bea5d8db3ad36a1c6d52fe4c3b076000000d810c239000000e44c38070000809c09e70000009033e11c00000072269c03000040ce8473000000c899700e0000003913ce0100002067c239000000e44c38070000809c09e70000009033e11c00000072269c03000040ce8473000000c899700e0000003913ce0100002067c239000000e44c38070000809c09e70000009033e11c00000072b6932449f2e0467676626767e7318e079e942449e2114ae84951ef6cab6da97735ceb6da841a57bf908fc7ba7e3c4a3807000000eecfb076000000c899700e0000003913ce0100002067c239000000e44c38070000809c09e70000009033e11c00000072269c03000040ce8473000000c899700e0000003913ce0100002067c239000000e44c38070000809c09e700000090b39fe77d00b08ee17018c3e170e9cf8ac562d46ab5d8ddddbdb18de9741a83c1200683414ca7d38888a8d56ad1683456ee3bfbbec56231daedf6caf60f0f0fb3ff6fb55a512e976f3c1ee0e93a3c3c8c72b91cad566bed7dd3eb8aeb04001011b193244992f741c05d1d1e1ec68b172f6edca65aadc660308862b1b8f0b3c16010ad562baeaeae96ee5bafd7a3d7eb2dec3bffbe9797972bdb7ff6ec59f6f5c9c949d46ab51b8ff729393f3f8f76bb1ded767ba37e2fb8af9d9d9da856ab2b3f34bc497a5dd9a4eb846b0400dc9f61ed3c49cd66334e4e4eaebd8e8e8ea252a9c468348a5aad96f58aa7d2e07c757515cd66334e4f4f234992b8bcbc8c6eb71ba552298e8f8f6fbca12c140a595bcba437e8e9769ba6d7ebc5f1f171de8701bca35c2300e0fe84739ea472b91cb55aeddaabdd6ec7783c8e7abd1e93c9e4dad0f3e9749a0d3bed76bbd1ebf5b221ecc562315aad568cc7e3a8542a31994cae0d4d9fd56834222256f6920d068328954ab70ead07000098259cb3717abd5e4444f4fbfdacf7bcd7eb653de6ab9e0d2d168bd9be9d4e67e936e572394aa5d2d29ef3f1781c171717f71eca993e7b9a3effdee974aef5fe0f0683383c3c8cf3f3f3a5fb1f1e1e2e1cf76d6da6dba4ed0e87c368341a51abd5a2d56a5d7baf5eaf977d28d1ebf5163ec0987daf5aadb6f4bde031cc9e7f83c1203b6767cfffd973b9dd6eafac9bf451979b6a24d5e974ae9ddf37b94bedadcb350200365c024fc8c1c1411211c9c1c1c18ddb55abd52422929393936b5fbf7efdfad6f7a8542ad7f69d7fdffdfdfd859f2749921c1d1d65ef31fffeb769369b49442cbc2a954a7279799924499274bbdd242292a3a3a385fd4f4f4f9388489acde65a6dcefe6ecbb62f140ac9d9d9d9b5bfe1ec2bf5faf5eba5ef35bb3f3c96f45c4c6b71f6b5bfbf9fd5cafcb9387bde27c9dd6be4f2f232bb2eccbed2fdabd5eabdda4d6bef2ed709d70800d87c7aced94869ef75da8b331e8faf7dff2efba6fbacfaf97cef79daeb9e0e7dbfabc3c3c3e8f7fb51afd7af3d077f70701093c9246b2ffdefb21ebbf47be936776d7356bfdf8fa3a3a36cdb66b31957575759db9d4e279acd6644441c1d1dc5c9c949b66fbbdd8e42a1102727272bf787c7d6ebf5b273eef4f4340a8542bc7cf932daed7674bbdd489224cececea252a9c4d5d5d5b59a4d6ba452a9643572767616cd6673a1463a9d4e4c269368369b71767616499244b7db5d3a82e63eb5771bd70800d812b97c2400f774d79ef3f9ed62ae1767ddf798ff5ea150484aa552f6f3cbcbcb2422927abd9e24c962cffd4d4aa5d242cfdbfcfb9e9e9e2649f2634f57fa756afe78d66933fd7a7f7fffda766767670bbd82ab7afa222229954a0b3d930707070bc70a0fb56a244cda933e7f7d487b6d67bf5f281496f6a6cfb69f9ebbf3f5954aeb61b646ee537bb75d275c2300603b58e71ceea156abc5f1f1719c9f9f47b95cce7ad0d67dde3c7d4ebd5c2e2f9d842e7d9e73381cc6eeee6e341a8de8f7fbd1e974b29efac16010575757d9b3f4ebb6999aef295b67dde56ab51aa3d128cae572f63c6aa3d15839b11e3c86f973365dde70be0ee7973d1c8fc7d91c14cb96446cb55a311a8db29137b3f535bfddec128bf7adbd9bb84600c0f610ced948e990f4f4e6b1542ac5c5c54516a6d7d9779946a311c7c7c731180ca2dd6e67e17cdd21abe96448a3d12846a3d1addb351a8d8509e9d21bf0f4c67bdd361f43afd7cb024dbfdf8f7ebf1f7b7b7b51afd7a3d3e9ac75130f6f5b7aeeaf3a2fd3ef4fa7d36cdb65217e7effb7517bae1100b03d847336d2fc33e6b55a2dfafd7e16a66f92f696ddd40b3efb4c7bbbdd8ee17018954ae5de379837cd221f713d04341a8d78f9f265f47abdec43824aa5b2d013b74e9b0f552e9763381cc6783cce666c9e4c26717c7c1ce3f178e5ecd1b089de46edb94600c0e613ced938bd5e2f2e2e2ea25aad663797ad562b1bead96ab596f68245bc99d0e8eaeaeadabecb94cbe5a8542a717c7c9c2dd3769f25d4d29be5f178bc74ffb4e76ef6585aad56bc7cf932068341d6b3357b837d9f361f623a9dc66030c8d69e4f27774ad7963f3e3e8ee17078ef25e6e0b1a535922e3d362fed75deddddbd71dbf94923df46edb94600c0f6305b3b1ba5d7eb653de3b337d2b55a2deaf57ab60ef9b25e9a4ea713cf9f3fcffeff36e98de4fc2cc8eb28168b51ad5663329964434f67351a8df8e8a38fb2defc883737d6e90703cb86d3dfa7cd87dadbdb8b56ab756d186cb158cc3e0459f56108e4e1a61a497b760b8542d46ab51bb79d0feb6fa3f65c2300607be839e7494a8745ce4a27798a88e876bb0bbd30e910cfd168944d9c94f60c0d0683984c26d9be7799ac291d3a3a994cb21bf9fbe8743a51abd5626f6f2f7abd5ed46ab5aca7291d0130df76abd58ae7cf9fc768348a7abdbed0c3759f36d7d16eb7b3c99c8ac562349bcde8f7fbb1bbbb9bf5d00d87c3188d4651ad56ef3cf915fc54666b643018c4eeee6e9c9f9f6793a775bbdd2c30763a9df8e4934f626f6f2f86c36194cbe5a5a176beddc7aa3dd70800d812794f170feb4897e959f62a954a49b3d9bc7559a2838383a4542a2dec5fafd7572ee9b36a09b742a1706d09b5d43a4ba92549929c9e9e66fbccbef6f7f7972ef5942edd161149b7db7d509b372de71473cb249d9d9d65bf73cc2cb5747979992de134fbaa56ab4b8f1f1e223dafe7ad3a974f4e4e96d6efe9e9e9c2b5a0542a2d2cd196b631bb6da150484e4f4f176a246df7a1b537cf35020036df4e9224c923647c7872cecfcfb3e1edefcab38e6fe398de469bab26cd9b4ea7d973b8bbbbbb86aaf224a435522c166fedc11d8fc7319d4eef544b4fa59e5d2300e0dd209c03000040ce4c08070000003913ce0100002067c239000000e44c38070000809c09e70000009033e11c00000072269c03000040ce8473000000c899700e0000003913ce0100002067c239000000e44c38070000809c09e70000009033e11c00000072269c03000040ce8473000000c899700e0000003913ce0100002067c239000000e44c38070000809c09e70000009033e11c00000072269c03000040ce8473000000c899700e0000003913ce0100002067c239000000e44c38070000809c09e70000009033e11c00000072269c03000040ce8473000000c899700e0000003913ce0100002067c239000000e44c38070000809c09e70000009033e11c00000072269c03000040ce8473000000c899700e0000003913ce0100002067c239000000e44c38070000809c09e70000009033e11c00000072269c03000040ce8473000000c899700e0000003913ce0100002067c239000000e4ecff01b800f9a34b9b965b0000000049454e44ae426082}\par}
{\pard \ql \f0 \sa180 \li0 \fi0 \b \fs24 Models\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 \bullet \tx360\tab The built-in capabilities of Models vary across frameworks; however, it\u8217's common for them to support validation of attributes, where attributes represent the properties of the Model, such as a Model identifier.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 \bullet \tx360\tab When using Models in real-world applications we generally also need a way of persisting Models. Persistence allows us to edit and update Models with the knowledge that their most recent states will be saved somewhere, for example in a web browser\u8217's localStorage data-store or synchronized with a database.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 \bullet \tx360\tab A Model may have multiple Views observing it for changes. By {\i observing} we mean that a View has registered an interest in being informed whenever an update is made to the Model. This allows the View to ensure that what is displayed on screen is kept in sync with the data contained in the model. Depending on your requirements, you might create a single View displaying all Model attributes, or create separate Views displaying different attributes. The important point is that the Model doesn\u8217't care how these Views are organized, it simply announces updates to its data as necessary through the framework\u8217's event system.\par}
-{\pard \ql \f0 \sa180 \li360 \fi-360 \bullet \tx360\tab It is not uncommon for modern MVC/MV* frameworks to provide a means of grouping Models together. In Backbone, these groups are called \u8220"Collections.\u8221" Managing Models in groups allows us to write application logic based on notifications from the group when a Model within the group changes. This avoids the need to manually observe individual Model instances. We\u8217'll see this in action later in the book. Collections are also useful for performing any aggregate computations across more than one model.\sa180\par}
+{\pard \ql \f0 \sa180 \li360 \fi-360 \bullet \tx360\tab It is not uncommon for modern MVC/MV* frameworks to provide a means of grouping Models together. In Backbone, these groups are called Collections. Managing Models in groups allows us to write application logic based on notifications from the group when a Model within the group changes. This avoids the need to manually observe individual Model instances. We\u8217'll see this in action later in the book. Collections are also useful for performing any aggregate computations across more than one model.\sa180\par}
{\pard \ql \f0 \sa180 \li0 \fi0 \b \fs24 Views\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 \bullet \tx360\tab Users interact with Views, which usually means reading and editing Model data. For example, in our Todo application, Todo Model viewing happens in the user interface in the list of all Todo items. Within it, each Todo is rendered with its title and completed checkbox. Model editing is done through an \u8220"edit\u8221" View where a user who has selected a specific Todo edits its title in a form.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 \bullet \tx360\tab We define a {\f1 render()} utility within our View which is responsible for rendering the contents of the {\f1 Model} using a JavaScript templating engine (provided by Underscore.js) and updating the contents of our View, referenced by {\f1 this.el}.\par}
View
6 chapters/02-fundamentals.md
@@ -195,6 +195,10 @@ This completes our first encounter with Backbone.js. The remainder of this book
### Implementation Specifics
+The picture below shows the typical HTTP request/response lifecycle for client-side MVC using Backbone:
+
+![](img/backbone_mvc.png)
+
#### Models
* The built-in capabilities of Models vary across frameworks; however, it's common for them to support validation of attributes, where attributes represent the properties of the Model, such as a Model identifier.
@@ -203,7 +207,7 @@ This completes our first encounter with Backbone.js. The remainder of this book
* A Model may have multiple Views observing it for changes. By *observing* we mean that a View has registered an interest in being informed whenever an update is made to the Model. This allows the View to ensure that what is displayed on screen is kept in sync with the data contained in the model. Depending on your requirements, you might create a single View displaying all Model attributes, or create separate Views displaying different attributes. The important point is that the Model doesn't care how these Views are organized, it simply announces updates to its data as necessary through the framework's event system.
-* It is not uncommon for modern MVC/MV* frameworks to provide a means of grouping Models together. In Backbone, these groups are called "Collections." Managing Models in groups allows us to write application logic based on notifications from the group when a Model within the group changes. This avoids the need to manually observe individual Model instances. We'll see this in action later in the book. Collections are also useful for performing any aggregate computations across more than one model.
+* It is not uncommon for modern MVC/MV* frameworks to provide a means of grouping Models together. In Backbone, these groups are called Collections. Managing Models in groups allows us to write application logic based on notifications from the group when a Model within the group changes. This avoids the need to manually observe individual Model instances. We'll see this in action later in the book. Collections are also useful for performing any aggregate computations across more than one model.
#### Views
View
BIN  img/backbone_mvc.fw.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  img/backbone_mvc.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
6 index.html
@@ -650,12 +650,16 @@ <h3 id="client-side-mvc---backbone-style"><a href="#TOC">Client-Side MVC - Backb
<p>While in this instance events help us relate Backbone to the MVC pattern, we will see them playing a much larger role in our SPA applications. Backbone.Event is a fundamental Backbone component which is mixed into both Backbone.Model and Backbone.View, providing them with rich event management capabilities. Note that the traditional controller role (Smalltalk-80 style) is performed by the template, not by the Backbone.View.</p>
<p>This completes our first encounter with Backbone.js. The remainder of this book will explore the many features of the framework which build on these simple constructs. Before moving on, let’s take a look at common features of JavaScript MV* frameworks.</p>
<h3 id="implementation-specifics"><a href="#TOC">Implementation Specifics</a></h3>
+<p>The picture below shows the typical HTTP request/response lifecycle for client-side MVC using Backbone:</p>
+<figure>
+<img src="img/backbone_mvc.png"><figcaption></figcaption>
+</figure>
<h4 id="models"><a href="#TOC">Models</a></h4>
<ul>
<li><p>The built-in capabilities of Models vary across frameworks; however, it’s common for them to support validation of attributes, where attributes represent the properties of the Model, such as a Model identifier.</p></li>
<li><p>When using Models in real-world applications we generally also need a way of persisting Models. Persistence allows us to edit and update Models with the knowledge that their most recent states will be saved somewhere, for example in a web browser’s localStorage data-store or synchronized with a database.</p></li>
<li><p>A Model may have multiple Views observing it for changes. By <em>observing</em> we mean that a View has registered an interest in being informed whenever an update is made to the Model. This allows the View to ensure that what is displayed on screen is kept in sync with the data contained in the model. Depending on your requirements, you might create a single View displaying all Model attributes, or create separate Views displaying different attributes. The important point is that the Model doesn’t care how these Views are organized, it simply announces updates to its data as necessary through the framework’s event system.</p></li>
-<li><p>It is not uncommon for modern MVC/MV* frameworks to provide a means of grouping Models together. In Backbone, these groups are called <q>Collections.</q> Managing Models in groups allows us to write application logic based on notifications from the group when a Model within the group changes. This avoids the need to manually observe individual Model instances. We’ll see this in action later in the book. Collections are also useful for performing any aggregate computations across more than one model.</p></li>
+<li><p>It is not uncommon for modern MVC/MV* frameworks to provide a means of grouping Models together. In Backbone, these groups are called Collections. Managing Models in groups allows us to write application logic based on notifications from the group when a Model within the group changes. This avoids the need to manually observe individual Model instances. We’ll see this in action later in the book. Collections are also useful for performing any aggregate computations across more than one model.</p></li>
</ul>
<h4 id="views"><a href="#TOC">Views</a></h4>
<ul>
Please sign in to comment.
Something went wrong with that request. Please try again.