Node Overlap Removal by Growing a Tree Lev Nachmanson1 , Arlind Nocaj2 , Sergey Bereg3 , Leishi Zhang4 , and Alexander Holroyd1 1 Microsoft Research, Redmond, USA University of Konstanz, Konstanz, Germany 3 The University of Texas at Dallas, Richardson, USA 4 Middlesex University, London,UK [email protected], [email protected], [email protected], [email protected], [email protected] 2 Abstract. Node overlap removal is a necessary step in many scenarios including laying out a graph, or visualizing a tag cloud. Our contribution is a new overlap removal algorithm that iteratively builds a Minimum Spanning Tree on a Delaunay triangulation of the node centers and removes the node overlaps by ”growing” the tree. The algorithm is simple to implement yet produces high quality layouts. According to our experiments it runs several times faster than the current state-of-the-art methods. 1 Introduction Removing node overlap after laying out a graph is a common task in network visualization. Most graph layout algorithms [23] consider nodes as points that do not occupy any geometrical space. In practice, nodes often have shapes, labels, and so on. These shapes and labels may overlap in the visualization and affect the visual readability. To remove such overlaps a specialized algorithm is usually applied. The main contribution of this paper is a new node overlap removal algorithm that we call Growing Tree, or GTree further on. The basic idea is to first capture most of the overlap and the local structure with a specific spanning tree on top of a proximity graph, and then resolve the overlap by letting the tree ”grow”. We compare GTree with PRISM [6], which is widely used for the same purpose. Needing more area than PRISM, our method preserves the original layout well and is up to eight times faster than PRISM. To compare the two algorithms we implemented GTree in the open source graph visualization software Graphviz 1 , where PRISM is the default overlap removal algorithm. On the other side, GTree is the default in MSAGL2 , where we also have an implementation of PRISM. We ran comparisons by using both tools. 1 2 http://www.graphviz.org/ https://github.com/Microsoft/automatic-graph-layout 2 Related Work There is vast research on node overlap removal. Some methods, including hierarchical layouts [4], incorporate the overlap removal with the layout step. Likewise, force-directed methods [5] have been extended to take the node sizes into account [17, 16, 24], but it is difficult to guarantee overlap-free layouts without increasing the repulsive forces extensively. Dwyer et al. [2] show how to avoid node overlaps with Stress Majorization [7]. The method can remove node overlaps during the layout step, but it needs an initial state that is overlap free; sometimes such a state is not given. Another approach, which we also choose, is to use a post-processing step. In Cluster Busting [18, 8] the nodes are iteratively moved towards the centers of their Voronoi cells. The process has the disadvantage of distributing the nodes uniformly in a given bounding box. Imamichi et al. [15] approximate the node shapes by circles and minimize a function penalizing the circle overlaps. Starting from the center of a node, RWorldle [22] removes the overlaps by discovering the free space around a node by using a spiral curve and then utilizing this space. The approach requires a large number of intersection queries that are time consuming. This idea is extended by Strobelt et al. [21] to discover available space by scanning the plane with a line or a circle. Another set of node overlap removal algorithms focus on the idea of defining pairwise node constraints and translating the nodes to satisfy the constraints [20, 11, 19, 13]. These methods consider horizontal and vertical problems separately, which often leads to a distorted aspect ratio [6]. A Force-transfer-algorithm is introduced by Huang et al. [14]; horizontal and vertical scans of overlapped nodes create forces moving nodes vertically and horizontally; the algorithm takes O(n2 ) steps, where n is the number of the nodes. Gomez et al. [9] develop Mixed Integer Optimization for Layout Arrangement to remove overlaps in a set of rectangles. The paper discusses the quality of the layout, which seems to be high, but not the effectiveness of the method, which relies on a mixed integer problem solver. Dwyer et al. [3] reduce the overlap removal to a quadratic problem and solve it efficiently in O(n log n) steps. According to Gansner and Hu [6], the quality and the speed of the method of Dwyer et al. [3] is very similar to the ones of PRISM. The ProjSnippet method [10] generates good quality layouts. The method requires O(n2 ) amount of memory, at least if applied directly as described in the paper, and the usage of a nonlinear problem solver. In PRISM [6, 12], a Delaunay triangulation on the node centers is used as the starting point of an iterative step. Then a stress model for node overlap removal is built on the edges of the triangulation and the stress function of the model is minimized. GTree also starts with building this Delaunay triangulation, but then the algorithms diverge. 3 GTree Algorithm An input to GTree is a set of nodes V , where each node i ∈ V is represented by an axis-aligned rectangle Bi with the center pi . We assume that for different i, j ∈ V the centers pi , pj are different too. If this is not the case, we randomly shift the nodes by tiny offsets. We denote by D a Delaunay triangulation of the set {pi : i ∈ V }, and let E be the set of edges of D. On a high level, our method proceeds as follows. First we calculate the triangulation D, then we define a cost function on E and build a minimum cost spanning tree on D for this cost function. Finally, we let the tree “grow”. The steps are repeated until there are no more overlaps. The last several steps are slightly modified. Now we explain the algorithm in more detail. We define the cost function c on E in such a way that the larger the overlap on an edge becomes, the smaller the cost of this edge comes to be. Let (i, j) ∈ E. If the rectangles Bi and Bj do not overlap then c(i, j) = dist(Bi , Bj ), that is the distance between Bi and Bj . Otherwise, for a real number t let us denote by Bj (t) a rectangle with the same dimensions as Bj and with the same orientation, but with the center at pi + t(pj − pi ). We find tij > 1 such that the rectangles Bi and Bj (tij ) touch each other. Let s = kpj − pi k, where kk denotes the Euclidean norm. We set c(i, j) = −(tij − 1)s. See Figure 1 for an illustration. s pj pi overlapping nodes Bj d d = tij s cij = s − d dist(Bi , Bj ) Bi cij = dist(Bi , Bj ) non overlapping nodes Fig. 1: Cost function cij for edges of the Delaunay triangulation. For overlapping nodes −cij is equal to the minimal distance that is necessary to shift the boxes along the edge direction so they touch each other. Having the cost function ready, we compute a minimum spanning tree T on D. the set of vertices V for which the cost, P Remember that it is a tree with 0 c(e), is minimal, where E is the set of edges of the tree. We use Prim’s 0 e∈E algorithm to find T . The algorithm proceeds by growing T , similar to the growth of a tree in nature. It starts from the root of T . For each child of the root overlapping with the root, it extends the edge connecting the root and the child to remove the overlap. To achieve this, it keeps the root fixed but translates the sub-tree of the child. The edges between the root and other children remain unchanged. The algorithm recursively processes the children of the root in the same manner. This process is described in Algorithm 1. The number tij in line 5 of Algorithm 1 is the same as in the definition of the cost of the edge (i, j) when Bi and Bj overlap, and is 1 otherwise. Algorithm 1: Growing T 1 2 3 4 5 6 Input: Current center positions p and root r Output: New center positions p0 p0r = pr GrowAtNode (r) function GrowAtNode (i) foreach j ∈ Children(i) do p0j = p0i + tij (pj − pi ) GrowAtNode (j); The algorithm does not update all positions for the child sub-tree nodes immediately, but updates only the root of the sub-tree. Using the initial positions of a parent and a child, and the new position of the parent, the algorithm obtains the new position of the child in line 5. In total, Algorithm 1 works in O(|V |) steps. The choice of the root of the tree does not matter. Different roots produce the same results modulo a translation of the plane by a vector. Indeed it can be (a) iteration 1 (d) iteration 4 (b) iteration 2 (e) iteration 5 (c) iteration 3 (f) final overlap free graph with original shapes Fig. 2: Overlap removal process with the minimum spanning tree on the proximity graph, where the latter here is a Delaunay triangulation on rectangle centers. The blue edges form a tree; there are four different trees in the figure. The tree edges connecting overlapped nodes are thick and solid. In each iteration the thick edges are elongated and the dashed tree edges shift accordingly. Overlap is completely resolved in four iterations. shown that after applying the algorithm, for any i, j ∈ V the vector p0j − p0i is defined uniquely by the path from i to j in T . While an overlap along any edge of the triangulation exists, we iterate, starting from finding a Delaunay triangulation, then building a minimum spanning tree on it, and finally running Algorithm 1. See Figure 2 for an example. When there are no overlaps on the edges of the triangulation, as noticed by Gansner and Hu [6], overlaps are still possible. We follow the same idea as PRISM and modify the iteration step. In addition to calculating the Delaunay triangulation we run a sweep-line algorithm to find all overlapping node pairs and augment the Delaunay graph D with each such a pair. As a consequence, the resulting minimum spanning tree contains non-Delaunay edges catching the overlaps, and the rest of the overlaps are removed. This stage usually requires much less time than the previous one. It is possible to create an example where the algorithm will not remove all overlaps. However, such examples are extremely rare and have not been seen yet in practice of using MSAGL or in our experiments. MSAGL applies random tiny changes to the initial layout which prevents GTree from cycling. 4 Comparing PRISM and GTree by Measuring Layout Similarity, Quality, and Run Time Our data includes the same set of graphs that was used by the authors of PRISM to compare it with other algorithms [6]. The set is available in the Graphviz open source package3 . We also used a small collection of random graphs and a collection of about 10,000 files residing here4 . For the experiments we use a modified version of Dot, where we can invoke either GTree or Prism for the overlap removal step, and we also used MSAGL, where we implemented PRISM and GTree. MSAGL was used only to obtain the quality measures. We ran the experiments on a PC with Linux, 64bit and an Intel Core i7-2600K [email protected] with 16GB RAM. Some of resulting layouts can be seen in Figures 3, 5, 6. One can try to resolve overlap by scaling the node centers of the original layout. If there are no two coincident node centers this will work, but the resulting layout may require a huge area if some centers are close to each other. We consider the area of the final layout as one of the quality measures, and usually PRISM produces a smaller area than GTree, see Table 1. In addition to comparing the areas, we compare some other layout properties. Following Gansner and Hu [6], we look at edge length dissimilarity, denoted as σedge . This measure reflects the relative change of the edge lengths of a Delaunay Triangulation on the node centers of the original layout. The other measure, which is denoted by σdisp , is the Procrustean similarity [1]. It shows how close the transformation of the original graph is to a com3 4 http://www.graphviz.org https://www.dropbox.com/sh/4q0k89yrv4x3ae3/AAA3xyKFRhLyyHXcG9jpcgata?dl=0 PRISM original layout GTree Fig. 3: Comparison between PRISM, original, and GTree layouts. In four top rows the initial layouts were generated randomly. At the bottom are the drawings of nodes of graph ”root” which was initially laid out by the Multi Dimensional Scaling algorithm of MSAGL. In our opinion, the initial structure is more preserved in the right column, containing the results of GTree. bination of a scale, a rotation, and a shift transformation. PRISM and GTree performs similar in the last two measures as Table 1 shows. To distinguish the methods further, we measure the change in the set of k closest neighbors of the nodes. Namely, let p1 , . . . , pn be the positions of the node centers, and let k be an integer such that 0 < k ≤ n. Let I = {1, . . . , n} be the set of node indices. For each i ∈ I we define Nk (i) ⊂ I \ {i}, such that |Nk (p, i)| = k, and for every j ∈ I \ Nk (p, i) and for every j 0 ∈ Nk (p, i) holds kpj − pi k ≥ kpj 0 − pi k. In other words, Nk (p, i) represents a set of k closest neighbors of i, excluding i. Let p01 , . . . , p0n be transformed node centers. To see how much the layout is distorted nearby node i, we intersect Nk (p, i) and Nk (p0 , i). We measure the distortion as (k − m)2 , where m is the number of elements in the intersection. One can see that if the node preserves its k closest neighbors then the distortion is zero. Our experiments for k from 8 to 12 show that under this measure GTree produced a smaller error, showing less distortion, on 8 graphs from 14, and on the rest PRISM produced a better result, see Table 2. GTree produced a smaller error on all small random graphs from other collections5 . Table 1: Similarity to the initial layout (left) and number of iterations for different graph sizes and different initialization methods (right). PR stands for PRISM Graph dpd unix rowe size ngk10 4 NaN b124 b143 mode b102 xx root badvoro b100 σedge σdisp area PR GTree PR GTree PR GTree 0.34 0.22 0.29 0.39 0.30 0.56 0.55 0.67 0.54 0.71 0.75 1.09 0.88 0.84 0.28 0.19 0.26 0.37 0.30 0.44 0.53 0.70 0.50 0.77 0.70 1.19 0.92 0.98 0.37 0.24 0.23 0.24 0.27 0.73 0.97 1.12 0.59 1.43 1.65 2.89 2.27 3.08 0.36 0.20 0.24 0.26 0.30 0.51 0.83 0.93 0.53 1.27 1.42 2.45 2.42 3.14 0.82 0.84 2.38 2.38 0.68 0.73 1.09 1.28 0.00 0.00 4.03 4.34 5.52 6.22 3.62 3.88 1.53 2.29 4.50 6.62 6.21 9.57 34.58 91.87 25.68 47.43 20.64 37.38 init. layout: Graph |V | dpd 36 unix 41 rowe 43 size 47 ngk10 4 50 NaN 76 b124 79 b143 135 mode 213 b102 302 xx 302 root 1054 badvoro1235 b100 1463 neato |E| 108 49 68 55 100 121 281 366 269 611 611 1083 1616 5806 PR GTree 4 3 5 7 6 8 14 21 37 60 83 95 40 80 7 4 4 3 3 3 4 6 8 24 18 18 20 24 SFDP PR GTree 3 12 13 9 14 24 30 37 11 113 50 99 50 136 6 5 7 5 7 6 12 12 6 19 19 22 23 28 We ran tests on the graphs from a subdirectory of the same site called “dot files”, let us call this set of graphs collection A. Each graph from A represents the control flow of a method from a version of the .NET framework. A contains 10077 graphs. The graph sizes do not exceed several thousands. We used the Multi Dimensional Scaling algorithms of MSAGL for the initial layout in this test. The results of the run are summarized in Table 3. 5 https://www.dropbox.com/sh/4q0k89yrv4x3ae3/AAA3xyKFRhLyyHXcG9jpcgata?dl=0 Table 2: k closest neighbors error, the Multi Dimensional Scaling algorithm of MSAGL was used for the initial layout. PR stands for PRISM. Graph dpd unix rowe size ngk10 4 NaN b124 b143 mode b102 xx root badvoro b100 k=8 k=9 k = 10 k = 11 k = 12 PR GTree PR GTree PR GTree PR GTree PR GTree 7.75 6.06 8.56 7.05 6.28 8.09 4.68 6.09 6.76 7.4 11.83 8.95 11.03 11.44 13.49 12.39 16.91 11.46 15.99 14.62 15.68 15.65 17.09 15.7 16.18 15.15 18 19.25 9.61 7.36 10.51 8.8 7.09 9.95 5.47 6.47 7.52 9.26 14.46 11.5 13.22 13.56 16.31 14.99 20.58 13.95 19.61 18.78 19.01 19.45 20.89 19.36 20.16 18.98 22.11 23.65 9.5 8 10.95 10.02 7.49 10.49 6.28 7.57 8.28 11.38 17.32 13.88 14.76 15.54 19.49 17.93 24.68 16.85 23.38 22.77 23.05 23.37 25.48 23.3 24.37 23.28 26.79 28.69 10.14 8.5 11.66 10.54 9.12 11.4 6.89 8.13 10.72 13.74 19.88 16.37 15.91 17.32 23.11 21.04 29.54 19.92 27.28 26.77 26.98 27.35 30.48 27.66 29.18 28.03 32.03 34.46 9.97 7.64 13 11.41 11.05 12.51 8.26 10.02 11.92 14.66 22.17 19.7 18.23 20.04 26.53 24.43 34.48 22.56 32.15 31.45 31.29 32.47 35.74 32.83 34.29 33.29 37.44 40.5 Table 3: Statistics on collection A. Here k-cn stands for k-closest neighbors, and “iters” stands for the number of iterations. Each cell contains the number of graphs for the measure on which the method performed better. We can see that PRISM produced a layout of smaller area than the one of GTree on 8498 graph, against 1579 graphs where GTree required less area. From the other side, GTree gives better results on all other measures. The columns of k-cn and “iters” do not sum to 10077, the number of graphs in A, because some of the results were equal for PRISM and GTree. Method PRISM GTree k-cn σedge σdisp area 3237 4741 4114 8498 4088 5336 5963 1579 iters time 46 7 9986 10070 Runtime Comparison Both methods remove the overlappiteratively using the proximity graph. However, while PRISM needs O(|V | · |V |) time to solve the stress model, GTree needs only O(|V |) time per iteration with the growing tree procedure. Therefore, GTree is asymptotically faster in a single iteration. In addition, as Table 1 (right) shows, GTree usually needs fewer iterations than PRISM, especially on larger graphs. The overall runtime can be seen in Figure 4. It shows that GTree outperforms PRISM on larger graphs. In Figure 5 we experiment with the way we expand the edges. Instead of the formula p0j = p0i +tij (pj −pi ), which resolves the overlap between the nodes i and j immediately, we use the update p0j = p0i + min(tij , 1.5)(pj − pi ). As a result, the algorithm runs a little bit slower but produces layouts with smaller area. Overlap Removal Method Graph |V| |E| dpd 36 108 0.01 0.00 unix 41 49 0.00 0.00 rowe 43 68 0.01 0.01 size 47 55 0.00 0.01 ngk10_4 50 100 0.00 0.00 NaN 76 121 0.01 0.00 b124 79 281 0.01 0.01 b143 135 366 0.03 0.00 mode 213 269 0.08 0.02 b102 302 611 0.19 0.07 xx 302 611 0.27 0.05 root 1054 1083 1.19 0.21 badvoro 1235 1616 0.58 0.26 b100 1463 5806 1.46 0.37 Time in s 2 1 PRISM GTree ● PRISM GTree ● ● ● ● ●● 0 ● ● ● ● ● ● ● ● ● ● ● 0 500 1000 1500 Graph size |V| Fig. 4: Runtimes for PRISM and GTree. 48398d080dfcccced48da1980 6282bc21f6 cfdf1932665dcb4cd3c 866808df de34214b4c258c9333ec3 51e045ca826077ae765 964b86fc1bba0e d13da6273c9b4da 16c3ae29c0bc713 8e24e9b4e 0f6784e49852c0be0da23b16 a97ef281eafc34b1630d450a1df a7c99ccf6ddf6f5ebbe c4fd8 842bc5775657c1e0d67 4cc20a0b7651e486 66c0220688a999aaf7f1702d1 03716a2c341e5edaa31 c1c30f30d40c4f1f84924622f b79798b186d6b82288e8be4017d f2b6201774de40a29b504b1f716 47e0067f4d853afd2012f04daa8 72cbb37db85ed3c6eda5dcf8 431430c49 56292d076643 d58478d9c273ad4f4b2e091324 f95344b0ae31693f3a2746597d4 1562abef0d8241 658d208447d8ec5d6de8 f2c7b3bb4d44f977d0ab8a42351 b9ae94e6935503603341ecf4 fcbd9ad14139718bc6fcc8b4 4ff4e275c710c3b a387210a27b 81dabfaba8 5c81103c751345d0ee0f4bd 21407f8a6d7 81dabfaba8 d7203571944b 6a8f5bafb1 69f4ecb77d 952316a1a5a785 37d80ae421dba4a70730338860 bf01c8a262 e82f47b8d4949ba4af69b38cbc19 33ff9e43d5ab 99bd3e7feeb710 63b079bd5847 e079d2c ef13d45b1277ac9a0444adb 26a185dde9a93dd 92fb5d4a0805 ac487676a04e4 21407f8a6d7 1ff8ff951ee9 88d8b220746882d 4e8259973f1f 6a8f5bafb1 81dabfaba8 533E f496bcf0889b301d77819c f8128d574c356631b8a9 9696c0950295d8cb5 1a220eb692c e079d2c f0bd1521 f7b22b9640 c5d5be3942 f8ff39eab120851f143bf19 4f0cbd3fbf0cb1e8c e8ebe1bf5f421c1223 11180ae7706510211bc4 d4f958b03a98 67b6a4dca3a6d c2f32e2cf9 81dabfaba8 a27037332d9fa5c43bcfe94c0 f6e6236b48bc3 32c958c9997 fa2afbd869 f52a45620969f0df4e6ae1dcd7 4c82921f4ad3f07066540 ef8b68bb5772f3 40f253cd228f7ac2d0aee 60d0128bdb61ae40e98638bd1391 e33792703 ff07977fca5513098d220d1eb3a 383f5c65cc6c25aa0a0e6dbb 24431c3eb075102f07cc2c1be 3b2f08d52e4bca3f9ca7bbbd6 f78e145a127014eb43345a0c fb039d7a2a9fe73b5f468eba9 89a36b13f8c344b 12fcb26b3de00ef98719c2ca 5256925081c812 a7fe7 b06bbfa920aa95dd 675E 403126 8fb60d769e4c387 1562abef0d8241 d370c12dbc e64f22a31 99da1f8a5 46e412a3 f33ec11db496f7bfcb024f 52a6c2063bccd83110c32 e920b915087 86633c26be93ada8b af0268dddd c4f31ea3844e12da27ad47c6 666f11bb45c3a8dcf26e1ed79 3089106e3b b9 c90f755c8b6612d 663E e920b915087 3089106e3b 317E 51e045ca826077ae765 e842 e03b8bc0435a d378760b814eaecb6efe636e0efc4 b69e426d974e1907e88 b5c747cc9 e842 c4d32527b670afb370d643 b5c747cc9 a97ef281eafc34b1630d450a1df 9652ab8b55fdb2a36d1f3fe020 e851f5ddd920 b656f0ed2202b8e46eb 7528dd86b 0f6784e49852c0be0da23b16 4f2e020854dfacce46a12 431430c49 66c0220688a999aaf7f1702d1 842bc5775657c1e0d67 800422ab81d804eef3e7b91dfba91 b79798b186d6b82288e8be4017d 03716a2c341e5edaa31 4cc20a0b7651e486 72cbb37db85ed3c6eda5dcf8 f2b6201774de40a29b504b1f716 f5d636e14a6cd716362158d d58478d9c273ad4f4b2e091324 45ba4d4c61c9601a26d59e47e0260 c96782ef56711c5d6a3f69 3cdc90c57243373efaba65a e3bdbca0e2256fffa8a59018 47e0067f4d853afd2012f04daa8 1f5df34ad75a55a76ef4afa0a47 f66fe4df3d189e69ce10c9c f841118350a27b7ea29a9c9d 658d208447d8ec5d6de8 1322fb0818783e6f9a4f173d47c52 910b00285f11bb90d0a15641 4a38abc630c82b0c48dfbf5271 f95344b0ae31693f3a2746597d4 56292d076643 f2c7b3bb4d44f977d0ab8a42351 75ba8d840070942eb4e737849 e343cea291b79a2ed4e c1c30f30d40c4f1f84924622f 383f5c65cc6c25aa0a0e6dbb 1562abef0d8241 4c82921f4ad3f07066540 24431c3eb075102f07cc2c1be ff07977fca5513098d220d1eb3a b9ae94e6935503603341ecf4 f52a45620969f0df4e6ae1dcd7 fcbd9ad14139718bc6fcc8b4 3b2f08d52e4bca3f9ca7bbbd6 40f253cd228f7ac2d0aee 11180ae7706510211bc4 f78e145a127014eb43345a0c 60d0128bdb61ae40e98638bd1391 4f0cbd3fbf0cb1e8c e8ebe1bf5f421c1223 4ff4e275c710c3b ef8b68bb5772f3 fb039d7a2a9fe73b5f468eba9 37d80ae421dba4a70730338860 d4f958b03a98 5c81103c751345d0ee0f4bd 67b6a4dca3a6d e33792703 f6e6236b48bc3 a387210a27b 33ff9e43d5ab 952316a1a5a785 e82f47b8d4949ba4af69b38cbc19 bf01c8a262 63b079bd5847 d7203571944b a27037332d9fa5c43bcfe94c0 e079d2c 32c958c9997 99bd3e7feeb710 21407f8a6d7 e079d2c 1a220eb692c f496bcf0889b301d77819c fa2afbd869 26a185dde9a93dd f8ff39eab120851f143bf19 f8128d574c356631b8a9 6a8f5bafb1 81dabfaba8 ef13d45b1277ac9a0444adb 9696c0950295d8cb5 81dabfaba8 69f4ecb77d 92fb5d4a0805 21407f8a6d7 8fb60d769e4c387 c2f32e2cf9 81dabfaba8 f0bd1521 f713a8b311ffa05ce3683ad10 ac487676a04e4 4e8259973f1f f7b22b9640 675E 1ff8ff951ee9 12fcb26b3de00ef98719c2ca c5d5be3942 89a36b13f8c344b 88d8b220746882d fbdc3ca37406f66635c8b226e a7fe7 b06bbfa920aa95dd 2d7b7fb6c9ad6821752651f7 533E6a8f5bafb1 5256925081c812 81dabfaba8 14a3c17f3d a3ff993 73ca543bf1 3b1563a23eb9 d370c12dbc a0befe6dd1ca7b165786835 403126 30cc206b1878485 07f8a9e55a16beddb3c9153b0 5f865c374cb3fe976dd376b8 23ad1 6448451ac2ceade90715378b 81dabfaba8 5807acd8d58e006f43 86276bb1e23f2c7ffcbe82a0 052bb6e3 b23526044 80874aa8 a7fe7 f29dfb9 6a8f5bafb1 57c77c341f94afddef07e6 96325ea 9f24ba80192c339a64c0 341E01 151E c935c7f4d1090ac 4e3cfd27a 1de26f6b12b0d292f94184 e4b45b7a2f884d3734bfd5985656 531806429433 30d6138b63eb 6a8f5bafb1 5e9156098c064 369E e49aaa5cc4e44355d6a0 47b2da3d b62cd1d0a0 1727041c622518c9dd24f7c211 41a8b095c7fd3 b36e0be6f67fc25286127456 a8e9 3ba7afb0e48ae1 319bc900218b 5ce1fcfb042b 151bcc2a8de7ea634 8cbcf5cb5 290907417e13 5eea496cc301b2a9721 0da9135 47ebc3f17 fa90ddf10bd574 1d529eb4 78cc16f965adc5f712ea2372c6 8d0d8314d211d80 247e407f45b353f8 f20f7f513e 6c541cad8de1b15 585E07 e64f22a31 20f234fdcd0e1fc50261ce8 d4f7b7fba7afcf7a72397353ec 2a47a6a27 30417faf916 eff3468631dd4 e8386a8e1c8a 81dabfaba8 fe821bce 23ad1 3cfae 761e0f72f95 efb52b499303115c33fd d285240b89cb 39d025b265f9790490781cb201 e3fd0c7b3 534E 15d44ab97 162d8039483d8 619E 7e494b f787d827958c 010957669f3770aac 0f167280 f22c27c0f0a54e 0f940646 8cbae42a3900 67219ef689f0146b544 0fabab47 23ad1 78b2d75d00166 653ae44d45dcadeb481b53027d a8e9 c110ba7 cf5a6049ad 8606837526d81cdec 285E ddfeabe456a9de5f5784 99da1f8a5 f603819d560c5603259aa05dca 5e80f85274 6f578c5128 dcc5d5e9d6c4e 71cf45dd4e91bcca945137b40e 0a185946ee443342b07d8e1 fc73 1b82200 1333074979f2d0b ad9142a65f5eab78b4ca5e 65fd8495 815cc0b83d733b3cadc253f7 c0f34a6003e048573fd 0bc7f8f513e0e74b270 6ba0776fc8e 85a34bc9616ff fb58e11 381E 49704867bee95 e1fa7f549e5a0893bb42da5 87a7e69a72412 cca7040e47789 82d201 78c8463ea a3781072b 459E b1ffbabb24d71f67d1e0ce23c51 233E cc3f63d 62f36ea98a e618df70814a 3f9ddf1ffbc0d38b 3b63cdc0f 32c4684b55361 e3a76d31ca59a bd7aca295ca a9012b7bb5 23ad1 46e412a3 683E a54d477232 78 8462bb2eec1a62d19a15865e57c92 102f1 370E 3b0c08dd2ca 5e80f85274 aac615ae78 bf141dbce e3e284d0cc803d98d674f9c3f6d 3dafb9a29c00 acacfc83af504 0f5db6ce12751ddcc64e 38fa61352f5086d2cb51 e287d497450664a4c0f4efc338 632E 342E 6b1bb9b0e d495de0b35f6 c96cb3 422E 696E a8e9 e06cc38155ff6781cf944d745 2f43cba12702078b4e0d3bfdae2bc f3c4311de0e931f08c232b 6a3c6921b0aeceda3 8f95518f48528 b7b899dc8bc6a32b28cb098fa16 87a7e69a72412 90dccb18c0 bbb13dc62adf2de2a42b6 620E 155d892827c33ed3cae3 a849f9d352e 31055116421c96b37f72a262bb 65fd8495 549fa15d68f0b3bee6192f888cd8 713db1c1 616d8a7b 4d22e1 a8e9 a7a7f3681dad1250b01cf80bc17 8c7cd9b93b1cbe48e1 a164d9f60fbbdd 16a795a1d63f30df 550E f36cce089 300E 444E 97a7eea3f ca3d67754cf62fdafbf0a1e0 4348f3abcb7716 c10cb9baf4dcb43e24 3eca1f94dc181 07 684E 51192117f9b4 b46b0756dba915943839e90a55 a2984b7a11e49440420058c1d80 be9c5958196ed 460E ee3b6be71d59b e17fea65 c8fc17180bea86 cfff3acd8e9d f9df653b86fb8df 8be0efdd94a6383e87fbfded4f 3c1edc8de4795936 234E50f4d9b97aefe bb828f1a326 382E e65185ca 454E 8a9eb2806b0aa 2043b477ac0393676a4309514d0 354E 89a2505da6179a80202d4a6c3 8d5137b16a 69ce90c9b2 8292af691429f8d9ed481ff71ffd 558d8534f92fddfe 357679fea1e2f 34d06d1ed6 062fc905b9eb35 8f9cdc26798117dd3e9ee4a8770 ff5c9b242337c ef42184297591d 238805e2194c3 a5a 6bbd5b422edb8e358dcc20eecf9 162E e84330eef281284a 22bd92e302816 582E 35b941379e1af658078cffb83a2 2ced414a91575a48f2dd29a 630E 380E a8f0fe2eb7bc1471 a141a557a60912051f3c135 06eff1db45cdf ac6e99186 09847696ae bdec8c86db51b9 ea920d9f5b295119 6d52dd1b198bb aebb7b91b d66f542ef1ce4d02c59bec65e 09e64744536c5e1 6819fd5a6cdd280dd fd28c194a46fde909b019c52f d17f8f4eeb8e63d 4a9d79c960b8d33e39251e5f66 c b701e7 331675c046693f 212af4 2c514b0cd8f7d3 28533c 615cd6b5e3d21c e1d01ef89f 5fdf a3b6df27179b175c88fa4c9cf9f 8c932e1e502dca 74e86 2ef209509e2a 7204950f6233bf9c9e1f00d4a870 c8a6c26d4fd9f 75b14f1719d 881d373 a4c7d0 10a7d61c201c67a5e78542807cd 73e6ed83012 587E 2e31175cbd52fcd08360fe86d20 75eea05672a5 70815f0352b43dc1562133ab6eb 38f162cf917ce7298663a1f1c607 8304a439f91fc90b3fe8dd35be8 4e12f7ff0918 345d26b3f821fe 801E67513d e9 bce 4f2de229621272 85221d5e9e 6bf214d9e7fa5f2df ccceeef40edda787e0b91491c8c8566892cd9a0889 aff6d7896e0e142bbc3e78 69 8b98c3ddbe0b336 af4a1fac3e2076 73d12 b082f7a5ff 6577 9fe716e738eaea34e 648E de9efa12873949 7ab64a969 c71043819b6a79 8896166adc0 c338481d79773 02c2ba83680ab57f236a33d702 5997cb0c083422 ef2d4636934472 ef6361295eba07 330342f283ef2 5782807b5f575e0a8 588E 4ad5d68f07981a a031c9192ae8e75 d4b2 19398d3cd6b9c674f 316Ef2e7cc d2498 876d120b38b0e88817 bc4824f07a9d2bba6 084d4bfa5853e 020df871874cd be7d637c50c 7c0ab977f5a3c4ab6d625f5033 52126553e52385d16 85fc23f1c88b4 d9f4abac731a9e 462E e4ae306d9bd669c70 8e2d970b2f820ee35 a2c4b1d72e2da483a86ae0c62e5 cd62a9caef7 3acbf8a1537e4e1a1 eedc819a68add6 cf 2d886da042b5384b4 9fe65061641 4f6f7f 4c52fdd8e396692 e5 8d6e6e0cd9b842a47 47cd70f 31f2f9aef958979f9f3532b9b f2a57e4d4f0cec516891e3 964cb56d8f69ff058 20949455f573f c4507c22d19 cef12b6 affb2d716803a2d3e 6505e29f4a11d9530 f1b0d754353a6 f4bef37b6a94bfd00 a7167d5eb5408b3839903 f28b78d4803c c21eb96fe100a1efaa128181b7 825c7994d5da13afe519861818 4995c71223c9f6067324d387a2 360E 548c0081a62132b44 bd2484 28f7bfc40c88e6a c471b6fdbfb852661 3aeb78ea51020a44f2d2615436dae e1e8c 8c8b5bde6 57948adb5dead 8be752bc95d436a90493bec9 418E a738ba39 a84844dfd0052b3b5 d2647f8b6d8661d08 c54f0fc1e05 15b3ad672cd2f713a 9ccd974150a18260b207b6584caa 57f7fd2eecec93c8b 4f35e206816c3bd22 a9497e0757b0969bde707ed5 ee91c97828 fff03efcd 9dd5bf47f 724dabdce9744d061 4dbf4395236fb03ed d 3bec1c012b498 3089106e3b 503737b64d432c60d6ac557e0e6 541ab86a2e 298E 2e1313c baba65f670ee34a88 8d52f183ec 51e74bec5513083bb 00cbeb87c182ca0785f 660ffeb76fc59 c72df69b40156a3254 9937ccba1469 c3bbf401938827 086bdbdb31bd777fb65dd6dd2d0e79ab6c66dc 6331b3f 96deede0c6b44119 ac34ec0f0488b17ec 536264e787cf70469 297E bba6e6e194ccf dd84fe6a65cfac7bca03ebd 9f 00d0dd018fe879f96 6a91 f722890f70a32dce3baff371a3089106e3b 86569bffb49adf6b3d0ebac 05fed5e 8b092 7c13bf753da 04904a458422a5b9 18083a711d 84e4ede82074 fb16636aae 1467f017b74e 7c1767485953d9c2 76E 248df40dae 459236f07c73814faf5 7e74e1587f3a4d208 b9 682E 450d3a2d49cbfd 58e3dcc618 82a65ed4b69 b2babf3244213 af4abb0d6a99 c4f31ea3844e12da27ad47c6 792fd6f9df1fa1e33 b074e 681E 81 44cbb41a9cfc15497eacd294 5ba4693031 30c3f3bf8463d3843dc57d8e98 63a3d4fb9d38a0182be6e39e76 99237fce1358 3711 ff9d64ddf49a20f 3b0a8a1c2e5050bd 664E 06209 ac284d73563 4856000a6802ddfc121ef40432297 3dafe1619016463f521f 8066f87a88f4e 64ef1d545 bfc6564cbdeeffac00a141c90f755c8b6612d 472a156cf2b55f 609E ab48d1f65812bc0f8ab6941c3b5 275afb2b215b966d9fac51b96b9 a54092a3033f7d5e41e0a76c1 cab04b7c14a 5c6a2 3b6b2c549de670d7bf5fc0ee 1112164c2f7a 332E 1ebeec 817 274Ee8b ca5af2 318E 663E 699e3db878047 b38049e00 6a91 eee44624da 9b6c ce 0a963fef991ecbe29a71f00ed5a3 9 1b34fb150 617809d979f 4dccb 84e4ede82074 666f11bb45c3a8dcf26e1ed79 1d792d81508E 2759e82e30d6d 9c1305d59c37e9be9f13d7d049c 0a49c95f107c0aa57c9b5748 9be88247 cab04b7c14a 07283 a9058241db5b6b6c25569acdf5 4e4a79111d 1a830d9f 51ec95518d1b3 69f2611acc42c36ed7cc 1ed67841 52f247fc3b 2573e1bf51f1b307f4640 3089106e3b e153c6e676c7369b285b4e9033a 654E 340E 317E 7c7c 593caebf2037317648bb451aa798593dcf973b110d00cecdc1e756 6472c2861e0e0dd681 e7ef998 2ef949c4a39b f72564578be 3aa0ce5efcf79bc3ecced1886e89 4f05b 244E 8fa622d9f842c5572a545ed72982 376E 256E626E c3c93c700edc0cb4f95f03c04 49E 0efbd 8cd4d ffd1b1af3b6864078f3 a96e47ff37983425a3e452095 1d4ea80c7194689d69f9592186 c5255d 00265 e03b8bc0435a a bf 5c609b12c b5f038f79a3 320Ebb828f1a32694da691e20e3 226E73ba1714ee a7e89580 c32d2697e8 fe6be3206549f5b5564acde84783 86e9b0428 3a8173d6c 969a58db14386cb9d2f51ec b473716 97c9d726e27304311901a52ce 84e4ede82074 731857fe189fb398e80a0594 8c8b5bde6 793E a7d2 6a80cbe 00880e6f50c765ebc1f85d3e9 dea1d1 375E 975fedfb64df 3dcf8f454 647f55670 8a f 8b06a67a 6e186b 40b49a5a9bb256c7a3286e56 81bcc35f82891 ffccaa9e3 5a7a610a8a 32b98f11f3d01d6 319E 2601085bde1b2450d64509f36 2e53009d4a375 908f9ad506eae9ab6ada185e3 296E 644E 93ea0 d93a80739fc1edb41a11b7294 8f143077e 484E 1b13908a9f0763c0ae54af9062080 1c08373 638E df61d5f5fc 17dafa5ebaafd48440e3 32979f8cf86 4379b5ed 629e42 56e1a896 200E 8ea965ab6ee8dedb6c3333e9 1ed5d7f63b8c6 672E27709106 2dd8cc4d693415f93c0f8fc 6c998bf2a5edd c5acd20cad2 b354cd9e9dbb0bfa 294E 24dfe1a997a c6b5321a 262E 351dd0aefe480c 5a0b4b906a eb8 65a1 254E 66abc181ac4 59a8b435ccd 6c93f24516f01d 3089106e3b d378760b814eaecb6efe636e0efc4 cab04b7c14a 6c89dc59ee7aaebbbd6bb64 a9a36ef02f bb92d1da1f38d52f8ff 90cc275011c2013c61eb11 1c08373 f0d99f1695e93c4a13 8f7c875500073 474E 428E 4b683 383db224d7508ef072bea21d0 336E a49284e9 2832ed5cea6 33e1def0f45e707 46f754ea06f070dbc023e571a876 35b8742610 eb8 52f247fc3b e4dba079d5fcb1f165920a3bf ebd8ffc2ac3a90efb8af9 efe092824916a5637ee35d439589 3a0ff0 04767 d382 aeb8 be8f4199f cab04b7c14a 171192dc1f8e6ea551548a910c00 65694ca6d575 eccf7c722ddf ee91c97828 e1e4c23db39d8bd633c3a cab04b7c14a 768E 37f57e81ebed95 408E 406E 6bce02baf91781a831e1b95 668d636002 1172dca23 552E eb8483E 4c6c8c 637E 444189d179b5db71fe 3089106e3b 400E 634E 6c632ad9c42228bb337 504E 402E404E e2a5d11499b7e 3f16509139c7dad5163b91799 448E b630e1af6ae1997f0e8ba750 b12441ecff15fa12c 216E cab04b7c14a 629e42 eb8 46969c4 0668 901b2105a902ee7791 438E 214E ca5af2 88ebe2e8782c c0b727 617809d979f cab04b7c14a 4f04c39708f 476E c29ce10bb8d19b498355aa04 3b4fdad8e0429d112 d886e4b76537a99bc71b8a9331c94 34c8c8dc0f6e41c7e7b2 1f4f0fdf 199E 358E 0acc5bb8ca4 dca32af03698c988b22 644f112bb0aa452ee7040a 69fdd1a1f4768c5efe7 e7ef998 398E be6b73bd46a7a5183e8c91a ae32701 cab04b7c14a 236E 1e1fbbe14ac24e0518 6a80cbe 23c1ec53358d237c1 278E eccfe5ff0af70fe9fbec8b2360f90 45827dbdd8 335E 4c6c8c 1aaaab063 966d271c22e75c7538 be8f4199f 412E 4c6c8c be8f4199f 2 3bbfc7bfdbbb1ba1bfad7517 aa868f65c34cdb64f1fad19a 45827dbdd8 84e4f1c582427a98d7b b4dfef6 d8f4a9e463a1e89217f 0acc5bb8ca4 4f8c642b53c349c687534bda35db 784E 1927c743a0d440a5a0 bac77c3f414a 427E be8f4199f dd2ba36 d0eb84 3219b6b71443 cd856f 5f2592b20f13356b7fc8b42 2342b759c03 499f6985db294c 6b5aaa4bdf44b2c898854 d12bd75c24b110ef90cdd35d3 473E eb8 e4e2f4e6d 421 8e69341faa4489 1c08373 4c6c8c 45827dbdd8 bb5e89c8963 ea890ccca2f7c2107351 79b69c612 4280833ef80172 fbba7215e7c13173a60206 6139fa6adc88d 16c508ab98483d430bbe da0d7bbcf3002f5daf56e299b8a8ecea892 05d4b1ed6a6135eec3abd3f2 08769f73d31c1a99be2d9363f 396b16a892fe 9d8988c0945d6 c0174bbe7ae8460aed10cc9e3aefac763 3f0a2b4eb62f 76889f7d35e 4280833ef80172 e3aefac763 1d163eac141def176461c 7e493ee44b28 731E 4280833ef80172 ad1dd724f1c3e 396b16a892fe db6c4213a717bc 50023f6f88 4280833ef80172 11f088bfd8 a153512d9823c2a62e0e5e9f7 460aed10cc9 230cc6bbc66b24eae94fa03d bbe0a8f93dc1 e3aefac763 396b16a892fe 3828a2c682419423cf b5e86c73d1198f 837ebf4bde22e1f1535cb662 08dade990b2282 5be631dff7b97697be7dc0a2f07f2 50962c93b4cb293f5beb59eb 83c397b8bf7f 4280833ef80172 b5e86c73d1198f 83c397b8bf7f 460aed10cc9 83c397b8bf7f 391256c872 460aed10cc9 71a48d11b2e7e56b1df128bd 3b566eaa70ed401479d43a9 797E 460aed10cc9 18115fa32ff1cb99 a6a196a504c3a7657d1fa41 6236a67933a619a6a3d48 173fd00917644f0f1f3e3 f490de272a7f6e4af346d40 a5520019b8a73bc141b5fd416a 04390dec6f1779353c07f5 3e814305b42beb41b8c706 97284d4c3a5d499853f0e 01db23a60422ba93a68611cc0 11bb8ed3ae227d3acefc 0b8694c9ef9b27b9c3d8 d6125ef42bd9958 e0ad365c2fb444358201 0c72a426929600000f5 f4c69e5e212f89348122e8 88a4f0337c2189c3fc7b31 4399cf78123dedd0dfe9776104 81e20155999fa64e0ae6fd 9e650e89bb 5d69639a5e3bdd3d 3d475ea3aeca51b60212dd e7a887d88c2318beba51 71512ec7d43f958f2b6da fe4e848cb5291ee59a2 f62b136b2171 6fb7a84e370ef70feac5cb 275a0407e33e9b8aa9cdd051 293a225dc56dd1e0564e6bb 805004328dad9d315d 89ced1a7906d58d687d5a04 46125fcc583c0f494a3a1d3 678bf739c344b9ad41da1 cd1e9af3dec2 df5dba74c75b228de48c 4a36db80f1ab1e97 16da5f1301b36df4df0f 284f14a259991806654e743124d3a6ed3381a6341c6 21dff35936370ae5f 30d9d350943c0e3ff7594b50 af9c489df53 b07bbdc8cca5985d4c4 dd12f26f8d9bb55 d550a7f392c787661aadd48 5838586c293d455 3ef07ae75d29a707 1c07453d584f3d14b1876fdb da24f74aad2ff519009d1f38c 6d4a4a5a5af91b895272c30 6b3f3fa236bb90592d23a 3703059dbc5a8 23f94655294d3ff537f2915fa d 53069e384a2 8a46e6 4727c415d06bcbef 8e307415fb435445ced7 8df f9d09 38b3b0d9 c360aaeb167487c9578a8f 8df 3eecb304bab2136a76deda 53069e384a2 a2eab7c9fa641e5f 53069e384a2 ff 21dff35936370ae5f 8bdb6a91c6dee925b557c705b3 bf65cfddeb00ff847feae0c 46f754ea06f070dbc023e571a876 3aeb78ea51020a44f2d2615436dae 7c13bf753da 3089106e3b 171192dc1f8e6ea551548a910c00 51ec95518d1b3 6bce02baf91781a831e1b95 4f05b 1c08373 dca32af03698c988b22 2832ed5cea6 be8f4199f 34c8c8dc0f6e41c7e7b2 eccfe5ff0af70fe9fbec8b2360f90 4f8c642b53c349c687534bda35db 84e4f1c582427a98d7b 69fdd1a1f4768c5efe7 c5255d 86e9b0428 484E 4c6c8c 2e53009d4a375 c6b5321a 65a1 200E 0acc5bb8ca4 d382 aeb8 3b566eaa70ed401479d43a9 71a48d11b2e7e56b1df128bd be8f4199f 173fd00917644f0f1f3e3 cd856f eb8 04390dec6f1779353c07f5 84e4f1c582427a98d7b d886e4b76537a99bc71b8a9331c94 04767 eb8 4c6c8c cd856f 38b3b0d9 4c6c8c cab04b7c14a 617809d979f b12441ecff15fa12c 644f112bb0aa452ee7040a 23c1ec53358d237c1 1f4f0fdf ae32701 1e1fbbe14ac24e0518 2 cab04b7c14a 3bbfc7bfdbbb1ba1bfad7517 e7ef998 6a80cbe b4dfef6 1927c743a0d440a5a0 3219b6b71443 dd2ba36 9d8988c0945d6 499f6985db294c 784E 6b5aaa4bdf44b2c898854 4280833ef80172 e3aefac763 396b16a892fe d886e4b76537a99bc71b8a9331c94 966d271c22e75c7538 1aaaab063 4280833ef80172 bb5e89c8963 396b16a892fe bf65cfddeb00ff847feae0c ca5af2 c0b727 be6b73bd46a7a5183e8c91a d0eb84 427E 4c6c8c 45827dbdd8 1172dca23 3b4fdad8e0429d112 b630e1af6ae1997f0e8ba750 88ebe2e8782c 421 2342b759c03 473E 1c08373 bb92d1da1f38d52f8ff 668d636002 e2a5d11499b7e 4f04c39708f cab04b7c14a 444189d179b5db71fe bac77c3f414a eb8 6c89dc59ee7aaebbbd6bb64 e4dba079d5fcb1f165920a3bf 52f247fc3b eccf7c722ddf cab04b7c14a 637E 901b2105a902ee7791 412E 45827dbdd8 08769f73d31c1a99be2d9363f 4280833ef80172 396b16a892fe 4280833ef80172 460aed10cc9 c0174bbe7ae8 50023f6f88 460aed10cc9 e3aefac763 460aed10cc9 83c397b8bf7f 4280833ef80172 01db23a60422ba93a68611cc0 83c397b8bf7f 7e493ee44b28 e3aefac763 e4e2f4e6d 8e69341faa4489 79b69c612 fbba7215e7c13173a60206 6139fa6adc88d da0d7bbcf30 3f0a2b4eb62f 16c508ab98483d430bbe ad1dd724f1c3e b5e86c73d1198f a153512d982 11f088bfd8 3828a2c682419423cf 83c397b8bf7f 3c2a62e0e5e9f7 837ebf4bde22e1f1535cb662 797E 460aed10cc9 76889f7d35e 02f5daf56e299b8a8ecea892 731E db6c4213a717bc bbe0a8f93dc1 5be631dff7b97697be7dc0a2f07f2 b5e86c73d1198f 460aed10cc9 0b8694c9ef9b27b9c3d8 391256c872 a5520019b8a73bc141b5fd416a f490de272a7f6e4af346d40 97284d4c3a5d499853f0e d6125ef42bd9958 88a4f0337c2189c3fc7b31 e0ad365c2fb444358201 0c72a426929600000f5 f62b136b2171 71512ec7d43f958f2b6da 81e20155999fa64e0ae6fd fe4e848cb5291ee59a2 e7a887d88c2318beba51 6fb7a84e370ef70feac5cb 89ced1a7906d58d687d5a04 df5dba74c75b228de48c 4a36db80f1ab1e97 dd12f26f8d9bb55 d550a7f392c787661aadd48 3ef07ae75d29a707 1c07453d584f3d14b1876fdb 6d4a4a5a5af91b895272c30 3124d3a6ed3381a6341c6 b07bbdc8cca5985d4c4 8df 21dff35936370ae5f d 8e307415fb435445ced7 c360aaeb167487c9578a8f 4727c415d06bcbef 46125fcc583c0f494a3a1d3 8df 53069e384a2 8a46e6 30d9d350943c0e3ff7594b50 f9d09 38b3b0d9 5838586c293d455 6b3f3fa236bb90592d23a 3703059dbc5a8 af9c489df53 293a225dc56dd1e0564e6bb 284f14a259991806654e74 678bf739c344b9ad41da1 53069e384a2 cd1e9af3dec2 275a0407e33e9b8aa9cdd051 16da5f1301b36df4df0f 805004328dad9d315d 9e650e89bb 4399cf78123dedd0dfe9776104 5d69639a5e3bdd3d f4c69e5e212f89348122e8 3d475ea3aeca51b60212dd 8bdb6a91c6dee925b557c705b3 275a0407e33e9b8aa9cdd051 46125fcc583c0f494a3a1d3 a9a36ef02f cab04b7c14a a49284e9 ebd8ffc2ac3a90efb8af9 cab04b7c14a 216E 05d4b1ed6a6135eec3abd3f2 3e814305b42beb41b8c706 11bb8ed3ae227d3acefc 3eecb304bab2136a76deda 53069e384a2 30d9d350943c0e3ff7594b50 ff 21dff35936370ae5f a2eab7c9fa641e5f 4869e993f2bb10f 53069e384a2 da24f74aad2ff519009d1f38c a78eb40ae56aaa9 8bdb6a91c6dee925b557c705b3 ff 21dff35936370ae5f 23f94655294d3ff537f2915fa da24f74aad2ff519009d1f38c 23f94655294d3ff537f2915fa 2dd8cc4d693415f93c0f8fc 93ea0 27709106 262E 254E 3a0ff0 37f57e81ebed95 552E 476E 398E aa868f65c34cdb64f1fad19a 0acc5bb8ca4 be8f4199f 1d163eac141def176461c 50962c93b4cb293f5beb59eb 173fd00917644f0f1f3e3 04390dec6f1779353c07f5 c360aaeb167487c9578a8f 3eecb304bab2136a76deda 8df 8a46e6 4727c415d06bcbef 91ecbe29a71f00ed5a3 32979f8cf86 638E 672E 1b13908a9f0763c0ae54af9062080 2601085bde1b2450d64509f36 66abc181ac4 634E 214E be8f4199f be8f4199f d8f4a9e463a1e89217f ea890ccca2f7c2107351 08dade990b2282 8e307415fb435445ced7 d 8df 3703059dbc5a8 af9c489df53 f9d09 768E 404E 438E 278E 855d26296eda4eb7 3124d3a6ed3381a6341c6 5838586c293d455 6b3f3fa236bb90592d23a ee91c97828 402E 504E 358E 236E d12bd75c24b110ef90cdd35d3 6236a67933a619a6a3d48 21dff35936370ae5f f62b136b2171 cd1e9af3dec2 4399cf78123dedd0dfe9776104 11f088bfd8 3c2a62e0e5e9f7 53069e384a2 53069e384a2 df5dba74c75b228de48c b07bbdc8cca5985d4c4 6d4a4a5a5af91b895272c30 408E 448E 5f2592b20f13356b7fc8b42 230cc6bbc66b24eae94fa03d a6a196a504c3a7657d1fa41 9e650e89bb e4e2f4e6d 76889f7d35e ad1dd724f1c3e a5520019b8a73bc141b5fd416a 71512ec7d43f958f2b6da 293a225dc56dd1e0564e6bb 406E 400E eccfe5ff0af70fe9fbec8b2360f90 3b566eaa70ed401479d43a9 18115fa32ff1cb99 1927c743a0d440a5a0 fe4e848cb5291ee59a2 294E b354cd9e9dbb0bfa 351dd0aefe480c 4379b5ed efe092824916a5637ee35d439589 aeb8 45827dbdd8 3bbfc7bfdbbb1ba1bfad7517 16c508ab98483d430bbe a153512d982 97284d4c3a5d499853f0e 644E 56e1a896 8f7c875500073 4b683 428E f0f45e707 d382 3089106e3b 0668 199E 335E 4f8c642b53c349c687534bda35db 71a48d11b2e7e56b1df128bd 23c1ec53358d237c1 499f6985db294c 02f5daf56e299b8a8ecea892 88a4f0337c2189c3fc7b31 f490de272a7f6e4af346d40 46969c4 0acc5bb8ca4 966d271c22e75c7538 8e69341faa4489 fbba7215e7c13173a60206 284f14a259991806654e74 d550a7f392c787661aadd48 296E c5acd20cad2 6c93f24516f01d 95e93c4a13 474E 33e1de 65694ca6d575 629e42 8b06a67a 40b49a5a9bb256c7a3286e56 8c8b5bde6 df61d5f5fc f55670 908f9ad506eae9ab6ada185e3 6c998bf2a5edd 59a8b435ccd f0d99f16 4c6c8c eb8 503737b64d432c60d6ac557e0e6 7e74e1587f3a4d208 ffd1b1af3b6864078f3 00880e6f50c765ebc1f85d3e9 319E 6a80cbe 0a963fef9 2ef949c4a39b bb828f1a326 226E 0a49c95f107c0aa57c9b5748 69f2611acc42c36ed7cc a96e47ff37983425a3e452095 c32d2697e8 f c6b5321a 65a1 336E 483E eb8 644f112bb0aa452ee7040a 1f4f0fdf 784E 200E 24dfe1a997a 35b8742610 be8f4199f 320E 73ba1714ee 2759e82e30d6d 52f247fc3b a7e89580 0efbd a7d2 8a 275afb2b215b966d9fac51b96b9 9c1305d59c37e9be9f13d7d049c b38049e00 e7ef998 f72564578be 94da691e20e3 b473716 647 9937ccba1469 dd84fe6a65cfac7bca03ebd ab48d1f65812bc0f8ab6941c3b5 ca5af2 cab04b7c14a 07283 340E 256E a 617809d979f 817 1b34fb150 626E 8593dcf973b110d00cecdc1e756 593caebf2037317648bb451aa79 c3c93c700edc0cb4f95f03c04 69fdd1a1f4768c5efe7 3b4fdad8e0429d112 cab04b7c14a 637E b12441ecff15fa12c cab04b7c14a b4dfef6 5d69639a5e3bdd3d 484E 5a0b4b906a 2832ed5cea6 34c8c8dc0f6e41c7e7b2 dca32af03698c988b22 e7ef998 79b69c612 3828a2c682419423cf 837ebf4bde22e1f1535cb662 16da5f1301b36df4df0f 1c07453d584f3d14b1876fdb a78eb40ae56aaa9 171192dc1f8e6ea551548a910c00 46f754ea06f070dbc023e571a876 6bce02baf91781a831e1b95 3f16509139c7dad5163b91799 4f04c39708f 52f247fc3b a49284e9 b630e1af6ae1997f0e8ba750 3219b6b71443 da0d7bbcf30 731E 391256c872 676bbe7d1c1fb71742df534ce8 6aae8d25951 cd0d985a366cad7e 90cc275011c2013c61eb11 e2a5d11499b7e 66abc181ac4 cab04b7c14a cab04b7c14a ebd8ffc2ac3a90efb8af9 cab04b7c14a 6a80cbe dd2ba36 3f0a2b4eb62f b5e86c73d1198f 89ced1a7906d58d687d5a04 4a36db80f1ab1e97 855d26296eda4eb7 4869e993f2bb10f a77622f2ff77ffeeb2 6aae8d25951 383db224d7508ef072bea21d0 6c632ad9c42228bb337 1b13908a9f0763c0ae54af9062080 617809d979f cab04b7c14a ae32701 6b5aaa4bdf44b2c898854 6139fa6adc88d e3aefac763 db6c4213a717bc 797E eb8 1c08373 91ecbe29a71f00ed5a3 8b06a67a 1172dca23 668d636002 df61d5f5fc 4379b5ed f ca5af2 2 d0eb84 e3aefac763 bbe0a8f93dc1 678bf739c344b9ad41da1 3ef07ae75d29a707 8c8b5bde6 320E 93ea0 638E 27709106 262E c0b727 1e1fbbe14ac24e0518 1aaaab063 421 7e493ee44b28 83c397b8bf7f 83c397b8bf7f 460aed10cc9 dd12f26f8d9bb55 a78eb40ae56aaa9 eccf7c722ddf 254E 88ebe2e8782c be6b73bd46a7a5183e8c91a 460aed10cc9 50023f6f88 b5e86c73d1198f 5be631dff7b97697be7dc0a2f07f2 460aed10cc9 e4dba079d5fcb1f165920a3bf 319E 1ebeec 332E 508E 793E d93a80739fc1edb41a11b7294 d378760b814eaecb6efe636e0efc4 0a963fef9 e1e4c23db39d8bd633c3a a7e89580 6a80cbe c0174bbe7ae8 e3aefac763 460aed10cc9 4280833ef80172 8a 644E 672E 444189d179b5db71fe 901b2105a902ee7791 aa868f65c34cdb64f1fad19a 4280833ef80172 4280833ef80172 83c397b8bf7f 460aed10cc9 805004328dad9d315d b38049e00 ffd1b1af3b6864078f3 32979f8cf86 6c89dc59ee7aaebbbd6bb64 94da691e20e3 3a0ff0 37f57e81ebed95 476E 398E 4c6c8c 4280833ef80172 396b16a892fe 396b16a892fe e7a887d88c2318beba51 73ba1714ee 226E 296E 65694ca6d575 552E 634E 214E 278E 412E 9d8988c0945d6 396b16a892fe e0ad365c2fb444358201 81e20155999fa64e0ae6fd f4c69e5e212f89348122e8 3d475ea3aeca51b60212dd 294E b354cd9e9dbb0bfa 768E 404E 438E 236E 427E 4280833ef80172 bb5e89c8963 0b8694c9ef9b27b9c3d8 d6125ef42bd9958 0c72a426929600000f5 6fb7a84e370ef70feac5cb 676bbe7d1c1fb71742df534ce8 cd0d985a366cad7e 402E 504E 448E 358E 4c6c8c 45827dbdd8 01db23a60422ba93a68611cc0 3e814305b42beb41b8c706 11bb8ed3ae227d3acefc 56e1a896 351dd0aefe480c ee91c97828 400E 2342b759c03 473E 1c08373 a6a196a504c3a7657d1fa41 6236a67933a619a6a3d48 a7d2 f55670 908f9ad506eae9ab6ada185e3 efe092824916a5637ee35d439589 f0f45e707 3089106e3b bac77c3f414a 216E 50962c93b4cb293f5beb59eb 18115fa32ff1cb99 647 793E c5acd20cad2 8f7c875500073 4b683 406E 408E 04767 4c6c8c be8f4199f be8f4199f 45827dbdd8 230cc6bbc66b24eae94fa03d 08dade990b2282 3089106e3b 275afb2b215b966d9fac51b96b9 0a49c95f107c0aa57c9b5748 00880e6f50c765ebc1f85d3e9 c29ce10bb8d19b498355aa04 bb828f1a326 a7167d5eb5408b3839903 9ccd974150a18260b207b6584caa 609E cab04b7c14a 3dcf8f454 459236f07c73814faf5 18083a711d ac284d73563 b074e e8b 1ed67841 654E a9497e0757b0969bde707ed5 541ab86a2e 297E 81 58e3dcc618 eee44624da 1d792d81 32b98f11f3d01d6 2dd8cc4d693415f93c0f8fc a9a36ef02f bb92d1da1f38d52f8ff 0efbd a 8593dcf973b110d00cecdc1e756 593caebf2037317648bb451aa79 6c93f24516f01d 428E 474E 33e1de 336E 45827dbdd8 335E 08769f73d31c1a99be2d9363f 1d163eac141def176461c 2ef949c4a39b c32d2697e8 40b49a5a9bb256c7a3286e56 2601085bde1b2450d64509f36 cab04b7c14a e7ef998 340E 626E 256E 8f143077e bd2484 9dd5bf47f 298E 9ab6c66dc 06209 274E 699e3db878047 6a91 49E 1d4ea80c7194689d69f9592186 97c9d726e27304311901a52ce 6e186b 5a7a610a8a 2e53009d4a375 a96e47ff37983425a3e452095 ac284d73563 609E 617809d979f 52f247fc3b f72564578be 508E 1ed67841 654E 8cd4d dea1d1 1ed5d7f63b8c6 a2c4b1d72e2da483a86ae0c62e5 c21eb96fe100a1efaa128181b7 4c52fdd8e396692 360E 418E c54f0fc1e05 248df40dae 450d3a2d49cbfd 76E 44cbb41a9cfc15497eacd294 3aa0ce5efcf79bc3ecced1886e89 5c609b12c 3a8173d6c 86e9b0428 975fedfb64df 629e42 1c08373 02c2ba83680ab57f236a33d702 876d120b38b0e88817 f2a57e4d4f0cec516891e3 28f7bfc40c88e6a 8c8b5bde6 cf 4f6f7f e1e8c bdbdb31bd777fb65dd6dd2d0e7 7c1767485953d9c2 a54092a3033f7d5e41e0a76c1 9b6c 84e4ede82074 375E e03b8bc0435a ffccaa9e3 de9efa12873949 e5 f1b0d754353a6 47cd70f 9fe65061641 31f2f9aef958979f9f3532b9b 6a91 472a156cf2b55f 5ba4693031 a9058241db5b6b6c25569acdf5 00265 c5255d 81bcc35f82891 020df871874cd 2a9caef7 086 b2babf3244213 792fd6f9df1fa1e33 ff9d64ddf49a20f d2498 d9f4abac731a9e 85fc23f1c88b4 5997cb0c083422 3bec1c012b498 d 536264e787cf70469 1467f017b74e 99237fce1358 6577 c71043819b6a79 084d4bfa5853e 7ab64a969 eedc819a68add6 19398d3cd6b9c674f f28b78d4803c c471b6fdbfb852661 15b3ad672cd2f713a 2e1313c 9f 00d0dd018fe879f96 376E 17dafa5ebaafd48440e3 4e12f7ff0918 8b98c3ddbe0b336 588E 330342f283ef2 cd6 8e2d970b2f820ee35 f4bef37b6a94bfd00 825c7994d5da13afe519861818 724dabdce9744d061 51e74bec5513083bb ac34ec0f0488b17ec 1112164c2f7a 4e4a79111d 244E bf 8ea965ab6ee8dedb6c3333e9 69 8896166adc0 e4ae306d9bd669c70 a84844dfd0052b3b5 96deede0c6b44119 8066f87a88f4e 51ec95518d1b3 6472c2861e0e0dd681 b5f038f79a3 969a58db14386cb9d2f51ec 731857fe189fb398e80a0594 9937ccba1469 7e74e1587f3a4d208 459236f07c73814faf5 69f2611acc42c36ed7cc 18083a711d cab04b7c14a ca5af2 07283 1d792d81 fe6be3206549f5b5564acde84783 503737b64d432c60d6ac557e0e6 a9497e0757b0969bde707ed5 dd84fe6a65cfac7bca03ebd 2759e82e30d6d 297E 9dd5bf47f 81 817 1b34fb150 eee44624da 6a91 8fa622d9f842c5572a545ed72982 9ccd974150a18260b207b6584caa ab48d1f65812bc0f8ab6941c3b5 9c1305d59c37e9be9f13d7d049c 541ab86a2e 360E 298E 1ebeec 332E e8b 274E 699e3db878047 b074e 58e3dcc618 06209 6c998bf2a5edd 95e93c4a13 59a8b435ccd f0d99f16 24dfe1a997a 5a0b4b906a 199E 0acc5bb8ca4 05d4b1ed6a6135eec3abd3f2 418E 9ab6c66dc 450d3a2d49cbfd 76E 44cbb41a9cfc15497eacd294 472a156cf2b55f a54092a3033f7d5e41e0a76c1 a9058241db5b6b6c25569acdf5 a7167d5eb5408b3839903 c21eb96fe100a1efaa128181b7 eedc819a68add6 f1b0d754353a6 28f7bfc40c88e6a 248df40dae 6a91 7c1767485953d9c2 b2babf3244213 5ba4693031 9b6c 49E 8f143077e 0668 629e42 eb8 46969c4 d12bd75c24b110ef90cdd35d3 ea890ccca2f7c2107351 c54f0fc1e05 bdbdb31bd777fb65dd6dd2d0e7 086 536264e787cf70469 1467f017b74e dea1d1 35b8742610 483E eb8 d8f4a9e463a1e89217f 5f2592b20f13356b7fc8b42 3bec1c012b498 d 724dabdce9744d061 2e1313c 9f 5a7a610a8a eb8 3f16509139c7dad5163b91799 c29ce10bb8d19b498355aa04 bd2484 8c8b5bde6 e1e8c ff9d64ddf49a20f c3c93c700edc0cb4f95f03c04 32b98f11f3d01d6 cf 4c52fdd8e396692 9fe65061641 15b3ad672cd2f713a a84844dfd0052b3b5 51e74bec5513083bb 3aa0ce5efcf79bc3ecced1886e89 b473716 3dcf8f454 97c9d726e27304311901a52ce 6e186b 3a8173d6c 31f2f9aef958979f9f3532b9b f28b78d4803c c471b6fdbfb852661 792fd6f9df1fa1e33 99237fce1358 1112164c2f7a 1d4ea80c7194689d69f9592186 8cd4d 376E 5c609b12c 00265 eb8 e1e4c23db39d8bd633c3a 6c632ad9c42228bb337 244E 6472c2861e0e0dd681 bf 1a830d9f 57f7fd2eecec93c8b 8066f87a88f4e 4e4a79111d 9 ce 5c6a2 9be88247 ac34ec0f0488b17ec 00d0dd018fe879f96 63a3d4fb9d38a0182be6e39e76 64ef1d545 3711 664E 318E 629e42 baba65f670ee34a88 4f35e206816c3bd22 96deede0c6b44119 bba6e6e194ccf 04904a458422a5b9 4856000a6802ddfc121ef40432297 682E 82a65ed4b69 375E 1c08373 4f6f7f 47cd70f f4bef37b6a94bfd00 d9f4abac731a9e e5 2a9caef7 cd6 affb2d716803a2d3e 825c7994d5da13afe519861818 d2647f8b6d8661d08 4dbf4395236fb03ed af4abb0d6a99 8b092 6331b3f 05fed5e 84e4ede82074 81bcc35f82891 ffccaa9e3 1ed5d7f63b8c6 23dc3a52fed9c119610b5e8 71e6b af0268dddd d7c27cc6f7b02a31eb64d a849f9d352e 32fe7eee5283 87a7e69a72412 916c686a1e82dba72524a 71e6b 665b76844ff78fc2cf66ca2 a849f9d352e 87a7e69a72412 34d7bb6af4fcd8d630de72500c8 3db761b596844f133c be233fafa38d931d894 deb3089920548bf1ecb23f0d 32fe7eee5283 a849f9d352e af0268dddd c71aa521578164debd0c5 e920b915087 87a7e69a72412 78 f33ec11db496f7bfcb024f 52a6c2063bccd83110c32 597E b4ce21e0a3df1d097277d6 71e6b a849f9d352e 84907547f36d0ff7 e920b915087 86633c26be93ada8b 08500a6044 af0268dddd 26fa7360ab81be9d4434a 01938827 c4507c22d19 8d52f183ec 7c7c b5f038f79a3 975fedfb64df 90cc275011c2013c61eb11 383db224d7508ef072bea21d0 85fc23f1c88b4 8e2d970b2f820ee35 3acbf8a1537e4e1a1 6505e29f4a11d9530 345d26b3f821fe affb2d716803a2d3e 6505e29f4a11d9530 baba65f670ee34a88 bba6e6e194ccf 63a3d4fb9d38a0182be6e39e76 9 1a830d9f 4f05b 7c7c 587E 8c932e1e502dca ccceeef40edda78 5782807b5f575e0a8 bc4824f07a9d2bba6 3acbf8a1537e4e1a1 57f7fd2eecec93c8b 4f35e206816c3bd22 4dbf4395236fb03ed 04904a458422a5b9 af4abb0d6a99 4856000a6802ddfc121ef40432297 64ef1d545 9be88247 317E d4b2 52126553e52385d16 d2647f8b6d8661d08 3aeb78ea51020a44f2d2615436dae 7c13bf753da 8b092 3711 ce 3089106e3b 7e0b91491c8c8566892cd9a0889 aff6d7896e0e142bbc3e78 2ef209509e2a a4c7d0 67513d 9fe716e738eaea34e ef6361295eba07 4ad5d68f07981a 548c0081a62132b44 964cb56d8f69ff058 20949455f573f c3bbf4 682E 82a65ed4b69 318E 84e4ede82074 2573e1bf51f1b307f4640 7204950f6233bf9c9e1f00d4a870 331675c046693f 212af4 28533c 8304a439f91fc90b3fe8dd35be8 801E 57948adb5dead 4995c71223c9f6067324d387a2 01938827 6331b3f 05fed5e 664E 5c6a2 4dccb 3b6b2c549de670d7bf5fc0ee 666f11bb45c3a8dcf26e1ed79 e153c6e676c7369b285b4e9033a a031c9192ae8e75 8d6e6e0cd9b842a47 2d886da042b5384b4 c4507c22d19 a738ba39 8d52f183ec 84e4ede82074 681E 663E bfc6564cbdeeffac00a141 3dafe1619016463f521f 02c2ba83680ab57f236a33d702 020df871874cd 52126553e52385d16 8d6e6e0cd9b842a47 548c0081a62132b44 ef2d4636934472 7c0ab977f5a3c4ab6d625f5033 c338481d79773 be7d637c50c 462E cef12b6 ee91c97828 3089106e3b 660ffeb76fc59 3089106e3b fb16636aae 3b0a8a1c2e5050bd c90f755c8b6612d 30c3f3bf8463d3843dc57d8e98 7e0b91491c8c8566892cd9a0889 876d120b38b0e88817 a2c4b1d72e2da483a86ae0c62e5 f2a57e4d4f0cec516891e3 084d4bfa5853e bdec8c86db51b9 615cd6b5e3d21c aebb7b91b fd28c194a46fde909b019c52f b082f7a5ff 73d12 38f162cf917ce7298663a1f1c607 6bf214d9e7fa5f2df f2e7cc 316E a849f9d352e 08500a6044 b9 c4f31ea3844e12da27ad47c6 7204950f6233bf9c9e1f00d4a870 aff6d7896e0e142bbc3e78 de9efa12873949 c71043819b6a79 d2498 648E 78 597E 71e6b e920b915087 fff03efcd f722890f70a32dce3baff371a 86569bffb49adf6b3d0ebac d66f542ef1ce4d02c59bec65e a3b6df27179b175c88fa4c9cf9f 2ef209509e2a ccceeef40edda78 6577 af4a1fac3e2076 e9 87a7e69a72412 b4ce21e0a3df1d097277d6 c72df69b40156a3254 35b941379e1af658078cffb83a2 a141a557a60912051f3c135 ef42184297591d bdec8c86db51b9 331675c046693f 587E 4e12f7ff0918 8b98c3ddbe0b336 7ab64a969 af0268dddd f33ec11db496f7bfcb024f 84907547f36d0ff7 00cbeb87c182ca0785f 2043b477ac0393676a4309514d0 8292af691429f8d9ed481ff71ffd 3c1edc8de4795936 69ce90c9b2 ac6e99186 212af4 615cd6b5e3d21c 345d26b3f821fe 69 8be752bc95d436a90493bec9 a2984b7a11e49440420058c1d80 c10cb9baf4dcb43e24 be9c5958196ed bb828f1a326 e84330eef281284a ea920d9f5b295119 8c932e1e502dca a4c7d0 67513d 86633c26be93ada8b 31055116421c96b37f72a262bb 16a795a1d63f30df 07 50f4d9b97aefe ff5c9b242337c 630E 6d52dd1b198bb 28533c 588E 26fa7360ab81be9d4434a 2f43cba12702078b4e0d3bfdae2bc af0268dddd a8e9 f36cce089 354E 357679fea1e2f 582E aebb7b91b 8304a439f91fc90b3fe8dd35be8 801E 85a34bc9616ff 8462bb2eec1a62d19a15865e57c92 0f5db6ce12751ddcc64e 8f95518f48528 bbb13dc62adf2de2a42b6 ee3b6be71d59b f9df653b86fb8df 234E 8d5137b16a 34d06d1ed6 67219ef689f0146b544 f603819d560c5603259aa05dca 3f9ddf1ffbc0d38b acacfc83af504 aac615ae78 a8e9 684E 444E 382E fd28c194a46fde909b019c52f 5997cb0c083422 330342f283ef2 19398d3cd6b9c674f 20f234fdcd0e1fc50261ce8 ddfeabe456a9de5f5784 dcc5d5e9d6c4e ad9142a65f5eab78b4ca5e 32c4684b55361 683E 620E 616d8a7b 300E 8f9cdc26798117dd3e9ee4a8770 b082f7a5ff 73d12 bc4824f07a9d2bba6 52a6c2063bccd83110c32 653ae44d45dcadeb481b53027d 162d8039483d8 1333074979f2d0b 233E 381E cc3f63d 696E 422E e17fea65 964cb56d8f69ff058 57948adb5dead c3bbf4 84e4ede82074 3b0a8a1c2e5050bd 84e4ede82074 4dccb 3089106e3b 8ea965ab6ee8dedb6c3333e9 17dafa5ebaafd48440e3 964b86fc1bba0e 8e24e9b4e ee91c97828 a738ba39 fb16636aae 681E 969a58db14386cb9d2f51ec 731857fe189fb398e80a0594 d93a80739fc1edb41a11b7294 cfdf1932665dcb4cd3c 866808df de34214b4c258c9333ec3 d13da6273c9b4da 16c3ae29c0bc713 c4fd8 d4f7b7fba7afcf7a72397353ec 619E a8e9 49704867bee95 a031c9192ae8e75 20949455f573f 4995c71223c9f6067324d387a2 e920b915087 c71aa521578164debd0c5 5e9156098c064 5eea496cc301b2a9721 3cfae 370E 3dafb9a29c00 342E 4348f3abcb7716 2d886da042b5384b4 c338481d79773 e49aaa5cc4e44355d6a0 a8e9 07 285E e3a76d31ca59a 8c7cd9b93b1cbe48e1 7c0ab977f5a3c4ab6d625f5033 af4a1fac3e2076 f2e7cc be7d637c50c 462E cef12b6 660ffeb76fc59 bfc6564cbdeeffac00a141 2573e1bf51f1b307f4640 8fa622d9f842c5572a545ed72982 fe6be3206549f5b5564acde84783 48398d080dfcccced48da1980 6282bc21f6 a7c99ccf6ddf6f5ebbe 316E fff03efcd 3b6b2c549de670d7bf5fc0ee e153c6e676c7369b285b4e9033a a849f9d352e 08500a6044 deb3089920548bf1ecb23f0d 1727041c622518c9dd24f7c211 369E 585E fb58e11 713db1c1 162E 881d373 4f2de229621272 8896166adc0 5782807b5f575e0a8 e4ae306d9bd669c70 70815f0352b43dc1562133ab6eb 6bf214d9e7fa5f2df 648E 87a7e69a72412 71e6b f722890f70a32dce3baff371a f29dfb9 9f24ba80192c339a64c0 01 b62cd1d0a0 6c541cad8de1b15 f22c27c0f0a54e b3cadc253f7 90dccb18c0 ca3d67754cf62fdafbf0a1e0 4a9d79c960b8d33e39251e5f66 75b14f1719d 75eea05672a5 d4b2 af0268dddd 78 597E 8be752bc95d436a90493bec9 00cbeb87c182ca0785f 86569bffb49adf6b3d0ebac 341E d285240b89cb b1ffbabb24d71f67d1e0ce23c51 e618df70814a 2c514b0cd8f7d3 c8a6c26d4fd9f 9fe716e738eaea34e ef6361295eba07 4ad5d68f07981a ef2d4636934472 bce a849f9d352e b4ce21e0a3df1d097277d6 84907547f36d0ff7 26fa7360ab81be9d4434a c72df69b40156a3254 96325ea 151bcc2a8de7ea634 f787d827958c 8606837526d81cdec 09847696ae d17f8f4eeb8e63d 5fdf 85221d5e9e 2e31175cbd52fcd08360fe86d20 38f162cf917ce7298663a1f1c607 73e6ed83012 20f234fdcd0e1fc50261ce8 67219ef689f0146b544 85a34bc9616ff 2f43cba12702078b4e0d3bfdae2bc 2043b477ac0393676a4309514d0 d66f542ef1ce4d02c59bec65e a3b6df27179b175c88fa4c9cf9f ea920d9f5b295119 4a9d79c960b8d33e39251e5f66 881d373 75b14f1719d 4f2de229621272 85221d5e9e 2e31175cbd52fcd08360fe86d20 8462bb2eec1a62d19a15865e57c92 a2984b7a11e49440420058c1d80 35b941379e1af658078cffb83a2 a141a557a60912051f3c135 ef42184297591d ac6e99186 2c514b0cd8f7d3 c8a6c26d4fd9f 75eea05672a5 70815f0352b43dc1562133ab6eb f603819d560c5603259aa05dca bbb13dc62adf2de2a42b6 c10cb9baf4dcb43e24 8292af691429f8d9ed481ff71ffd 3c1edc8de4795936 69ce90c9b2 e84330eef281284a 6d52dd1b198bb 5fdf 10a7d61c201c67a5e78542807cd 73e6ed83012 bce 0f5db6ce12751ddcc64e be9c5958196ed bb828f1a326 ff5c9b242337c 630E 09847696ae d17f8f4eeb8e63d e1d01ef89f 74e86 32fe7eee5283 3f9ddf1ffbc0d38b a8e9 31055116421c96b37f72a262bb 07 357679fea1e2f 582E 34d06d1ed6 6819fd5a6cdd280dd 09e64744536c5e1 3db761b596844f133c a849f9d352e 8f9cdc26798117dd3e9ee4a8770 16a795a1d63f30df 50f4d9b97aefe 354E 382E 8d5137b16a 162E f36cce089 a8e9 234E 300E e17fea65 6bbd5b422edb8e358dcc20eecf9 be233fafa38d931d894 e4b45b7a2f884d3734bfd5985656 ddfeabe456a9de5f5784 dcc5d5e9d6c4e ad9142a65f5eab78b4ca5e 4348f3abcb7716 ca3d67754cf62fdafbf0a1e0 89a2505da6179a80202d4a6c3 06eff1db45cdf a8f0fe2eb7bc1471 b701e7 c 87a7e69a72412 665b76844ff78fc2cf66ca2 34d7bb6af4fcd8d630de72500c8 6448451ac2ceade90715378b 5807acd8d58e006f43 a7a7f3681dad1250b01cf80bc17 06eff1db45cdf 2ced414a91575a48f2dd29a 22bd92e302816 10a7d61c201c67a5e78542807cd a8f0fe2eb7bc1471 6819fd5a6cdd280dd 09e64744536c5e1 e1d01ef89f b06bbfa920aa95dd ac487676a04e4 12fcb26b3de00ef98719c2ca 6bbd5b422edb8e358dcc20eecf9 89a2505da6179a80202d4a6c3 062fc905b9eb35 558d8534f92fddfe 238805e2194c3 af0268dddd b701e7 78b2d75d00166 e3e284d0cc803d98d674f9c3f6d 8be0efdd94a6383e87fbfded4f cfff3acd8e9d e65185ca 454E 65fd8495 a5a 8d0d8314d211d80 e8386a8e1c8a 7e494b d495de0b35f6 549fa15d68f0b3bee6192f888cd8 b46b0756dba915943839e90a55 c8fc17180bea86 5e80f85274 71e6b 32fe7eee5283 87a7e69a72412 32fe7eee5283 fa90ddf10bd574 30417faf916 97a7eea3f 3eca1f94dc181 51192117f9b4 460E 87a7e69a72412 a849f9d352e a849f9d352e 87a7e69a72412 e9 30c3f3bf8463d3843dc57d8e98 3dafe1619016463f521f 761e0f72f95 815cc0b83d733 62f36ea98a 3b0c08dd2ca 6b1bb9b0e 4d22e1 550E 23ad1 78 6a3c6921b0aeceda3 8a9eb2806b0aa 380E c 71e6b 74e86 a849f9d352e a0befe6dd1ca7b165786835 f8128d574c356631b8a9 a7fe7 6ba0776fc8e e287d497450664a4c0f4efc338 a164d9f60fbbdd 65fd8495 87a7e69a72412 459E 0a185946ee443342b07d8e1 0bc7f8f513e0e74b270 e1fa7f549e5a0893bb42da5 e06cc38155ff6781cf944d745 155d892827c33ed3cae3 c96cb3 0f940646 5e80f85274 71cf45dd4e91bcca945137b40e 38fa61352f5086d2cb51 f3c4311de0e931f08c232b d7c27cc6f7b02a31eb64d a54d477232 632E bf141dbce 23ad1 010957669f3770aac 86276bb1e23f2c7ffcbe82a0 b7b899dc8bc6a32b28cb098fa16 a3781072b cca7040e47789 102f1 23ad1 78cc16f965adc5f712ea2372c6 247e407f45b353f8 39d025b265f9790490781cb201 5f865c374cb3fe976dd376b8 deb3089920548bf1ecb23f0d a849f9d352e 916c686a1e82dba72524a 89a36b13f8c344b e82f47b8d4949ba4af69b38cbc19 403126 052bb6e3 3b1563a23eb9 ef13d45b1277ac9a0444adb bf01c8a262 5256925081c812 37d80ae421dba4a70730338860 a7fe7 5ce1fcfb042b 6f578c5128 a9012b7bb5 bd7aca295ca 81dabfaba8 3e048573fd 78c8463ea 3b63cdc0f 8cbcf5cb5 b36e0be6f67fc25286127456 07f8a9e55a16beddb3c9153b0 30cc206b1878485 57c77c341f94afddef07e6 be233fafa38d931d894 675E 531806429433 41a8b095c7fd3 290907417e13 fc73 c0f34a600 6a8f5bafb1 82d201 47b2da3d 8fb60d769e4c387 f713a8b311ffa05ce3683ad10 fbdc3ca37406f66635c8b226e 2d7b7fb6c9ad6821752651f7 1de26f6b12b0d292f94184 3db761b596844f133c c71aa521578164debd0c5 15d44ab97 8cbae42a3900 4e3cfd27a 30d6138b63eb f8ff39eab120851f143bf19 a27037332d9fa5c43bcfe94c0 916c686a1e82dba72524a 34d7bb6af4fcd8d630de72500c8 cf5a6049ad c110ba7 1727041c622518c9dd24f7c211 d4f7b7fba7afcf7a72397353ec 653ae44d45dcadeb481b53027d 683E acacfc83af504 8f95518f48528 ee3b6be71d59b f9df653b86fb8df 444E 8be0efdd94a6383e87fbfded4f 062fc905b9eb35 2ced414a91575a48f2dd29a 32c4684b55361 aac615ae78 cfff3acd8e9d 22bd92e302816 5e9156098c064 162d8039483d8 233E 684E 8c7cd9b93b1cbe48e1 b46b0756dba915943839e90a55 d7c27cc6f7b02a31eb64d 1ff8ff951ee9 4e8259973f1f 3ba7afb0e48ae1 2a47a6a27 efb52b499303115c33fd 0f167280 21407f8a6d7 151E f20f7f513e eff3468631dd4 fe821bce e3fd0c7b3 b23526044 6a8f5bafb1 cc3f63d 3dafb9a29c00 620E 90dccb18c0 713db1c1 e65185ca 558d8534f92fddfe 238805e2194c3 1333074979f2d0b 381E 696E 342E 616d8a7b d495de0b35f6 454E a5a 380E 5eea496cc301b2a9721 a8e9 285E 370E 422E e3e284d0cc803d98d674f9c3f6d 62f36ea98a 549fa15d68f0b3bee6192f888cd8 97a7eea3f 8a9eb2806b0aa 87a7e69a72412 71e6b 619E 3cfae 49704867bee95 b1ffbabb24d71f67d1e0ce23c51 e618df70814a cca7040e47789 a7a7f3681dad1250b01cf80bc17 af0268dddd 32fe7eee5283 23dc3a52fed9c119610b5e8 e49aaa5cc4e44355d6a0 07 f22c27c0f0a54e b3cadc253f7 fb58e11 e3a76d31ca59a 6ba0776fc8e e287d497450664a4c0f4efc338 6b1bb9b0e c8fc17180bea86 71e6b a849f9d352e b7b899dc8bc6a32b28cb098fa16 e4b45b7a2f884d3734bfd5985656 585E f787d827958c 8606837526d81cdec 3e048573fd 102f1 3b0c08dd2ca 38fa61352f5086d2cb51 f3c4311de0e931f08c232b 155d892827c33ed3cae3 9f24ba80192c339a64c0 a8e9 d285240b89cb 78b2d75d00166 815cc0b83d733 a3781072b 78c8463ea a54d477232 e851f5ddd920 f496bcf0889b301d77819c 4f0cbd3fbf0cb1e8c e8ebe1bf5f421c1223 92fb5d4a0805 c935c7f4d1090ac 319bc900218b 73ca543bf1 534E 0fabab47 1b82200 e33792703 fb039d7a2a9fe73b5f468eba9 23dc3a52fed9c119610b5e8 665b76844ff78fc2cf66ca2 47ebc3f17 0da9135 23ad1 81dabfaba8 80874aa8 5c81103c751345d0ee0f4bd e06cc38155ff6781cf944d745 26a185dde9a93dd 6448451ac2ceade90715378b 5807acd8d58e006f43 369E 6c541cad8de1b15 e8386a8e1c8a 7e494b 6f578c5128 fc73 99da1f8a5 a9012b7bb5 632E 3eca1f94dc181 51192117f9b4 c4d32527b670afb370d643 f52a45620969f0df4e6ae1dcd7 11180ae7706510211bc4 b9ae94e6935503603341ecf4 40f253cd228f7ac2d0aee 60d0128bdb61ae40e98638bd1391 e1fa7f549e5a0893bb42da5 e842 56292d076643 ff07977fca5513098d220d1eb3a 99bd3e7feeb710 e079d2c 1a220eb692c a0befe6dd1ca7b165786835 f29dfb9 01 b62cd1d0a0 8d0d8314d211d80 30417faf916 761e0f72f95 341E 151bcc2a8de7ea634 5ce1fcfb042b fa90ddf10bd574 2a47a6a27 15d44ab97 96325ea 531806429433 41a8b095c7fd3 3ba7afb0e48ae1 290907417e13 f20f7f513e 8cbae42a3900 cf5a6049ad e3fd0c7b3 c110ba7 c0f34a600 a164d9f60fbbdd 550E 460E 431430c49 4c82921f4ad3f07066540 9696c0950295d8cb5 63b079bd5847 14a3c17f3d 1d529eb4 24431c3eb075102f07cc2c1be b5c747cc9 f2c7b3bb4d44f977d0ab8a42351 d4f958b03a98 33ff9e43d5ab e079d2c 383f5c65cc6c25aa0a0e6dbb f95344b0ae31693f3a2746597d4 67b6a4dca3a6d d7203571944b c2f32e2cf9 88d8b220746882d 6a8f5bafb1 a3ff993 3b2f08d52e4bca3f9ca7bbbd6 f78e145a127014eb43345a0c 952316a1a5a785 81dabfaba8 21407f8a6d7 81dabfaba8 533E e343cea291b79a2ed4e c1c30f30d40c4f1f84924622f f7b22b9640 c5d5be3942 4a38abc630c82b0c48dfbf5271 75ba8d840070942eb4e737849 7528dd86b f0bd1521 81dabfaba8 658d208447d8ec5d6de8 910b00285f11bb90d0a15641 c4fd8 f6e6236b48bc3 6a8f5bafb1 f841118350a27b7ea29a9c9d a7c99ccf6ddf6f5ebbe 534E 0fabab47 3b63cdc0f bd7aca295ca c96cb3 4d22e1 5e80f85274 65fd8495 a849f9d352e b69e426d974e1907e88 319bc900218b 47ebc3f17 6a8f5bafb1 1b82200 82d201 46e412a3 bf141dbce 78 87a7e69a72412 6a3c6921b0aeceda3 0a185946ee443342b07d8e1 0bc7f8f513e0e74b270 eff3468631dd4 efb52b499303115c33fd fe821bce 0f167280 30d6138b63eb 8cbcf5cb5 23ad1 0f940646 65fd8495 23ad1 87a7e69a72412 459E 71cf45dd4e91bcca945137b40e e842 0da9135 1d529eb4 e64f22a31 b23526044 6a8f5bafb1 47b2da3d 23ad1 5e80f85274 010957669f3770aac 51e045ca826077ae765 1322fb0818783e6f9a4f173d47c52 1f5df34ad75a55a76ef4afa0a47 f66fe4df3d189e69ce10c9c ef8b68bb5772f3 247e407f45b353f8 39d025b265f9790490781cb201 cfdf1932665dcb4cd3c 0f6784e49852c0be0da23b16 72cbb37db85ed3c6eda5dcf8 45ba4d4c61c9601a26d59e47e0260 47e0067f4d853afd2012f04daa8 a387210a27b 4ff4e275c710c3b 964b86fc1bba0e b5c747cc9 4cc20a0b7651e486 d58478d9c273ad4f4b2e091324 32c958c9997 69f4ecb77d 81dabfaba8 78cc16f965adc5f712ea2372c6 de34214b4c258c9333ec3 8e24e9b4e 9652ab8b55fdb2a36d1f3fe020 66c0220688a999aaf7f1702d1 b79798b186d6b82288e8be4017d fa2afbd869 81dabfaba8 151E c935c7f4d1090ac 23ad1 81dabfaba8 80874aa8 4e3cfd27a 800422ab81d804eef3e7b91dfba91 fcbd9ad14139718bc6fcc8b4 e3bdbca0e2256fffa8a59018 a7fe7 052bb6e3 73ca543bf1 d370c12dbc fbdc3ca37406f66635c8b226e 2d7b7fb6c9ad6821752651f7 07f8a9e55a16beddb3c9153b0 86276bb1e23f2c7ffcbe82a0 1de26f6b12b0d292f94184 b36e0be6f67fc25286127456 6282bc21f6 866808df 16c3ae29c0bc713 4f2e020854dfacce46a12 f2b6201774de40a29b504b1f716 03716a2c341e5edaa31 c96782ef56711c5d6a3f69 3b1563a23eb9 14a3c17f3d a3ff993 f713a8b311ffa05ce3683ad10 30cc206b1878485 5f865c374cb3fe976dd376b8 57c77c341f94afddef07e6 48398d080dfcccced48da1980 d13da6273c9b4da a97ef281eafc34b1630d450a1df b656f0ed2202b8e46eb 842bc5775657c1e0d67 f5d636e14a6cd716362158d 3cdc90c57243373efaba65a c4d32527b670afb370d643 e851f5ddd920 1322fb0818783e6f9a4f173d47c52 f66fe4df3d189e69ce10c9c 800422ab81d804eef3e7b91dfba91 910b00285f11bb90d0a15641 e343cea291b79a2ed4e b69e426d974e1907e88 e842 b5c747cc9 1f5df34ad75a55a76ef4afa0a47 45ba4d4c61c9601a26d59e47e0260 4a38abc630c82b0c48dfbf5271 75ba8d840070942eb4e737849 e3bdbca0e2256fffa8a59018 e842 b5c747cc9 9652ab8b55fdb2a36d1f3fe020 b656f0ed2202b8e46eb 4f2e020854dfacce46a12 f5d636e14a6cd716362158d c96782ef56711c5d6a3f69 3cdc90c57243373efaba65a f841118350a27b7ea29a9c9d 7528dd86b 676bbe7d1c1fb71742df534ce8 bf65cfddeb00ff847feae0c 855d26296eda4eb7 6aae8d25951 a2eab7c9fa641e5f 4869e993f2bb10f a77622f2ff77ffeeb2 9c9e2e0f2da8758e436c cd0d985a366cad7e a77622f2ff77ffeeb2 9c9e2e0f2da8758e436c 9c9e2e0f2da8758e436c (a) initial layout (b) PRISM (c) GTree Fig. 5: root graph with 1054 nodes and 1083 edges. (a) initial layout with NEATO, (b) applying PRISM, (c) applying GTree. 5 Conclusion & Future Work We proposed a new overlap removal algorithm that uses the minimum spanning tree. The algorithm is simple and easy to implement, and yet it preserves the initial layout well and is efficient. Although we introduced our approach in the context of graph visualization, our method can also be used for any other purpose where overlap needs to be resolved while maintaining the initial layout. Finding a measure of how well an overlap removal algorithm preserves clusters of the initial layout seems to be an interesting challenge. GTree GTree original original PRISM PRISM Fig. 6: Results for GTree and PRISM initialized with SFDP. From top to bottom and left to right: b100, b102, b124, b143, badvoro, dpd, mode, - NaN, ngk10 4, root, rowe, size, unix, and xx. To make the original drawings more readable they have been changed; In most cases the nodes were diminished and the edges removed. The drawings were scaled differently. Bibliography [1] I. Borg and P. Groenen. Modern multidimensional scaling: Theory and applications. Springer, 2005. [2] T. Dwyer, Y. Koren, and K. Marriott. Ipsep-cola: An incremental procedure for separation constraint layout of graphs. IEEE Trans. Vis. Comput. Graph., 12(5):821–828, 2006. [3] T. Dwyer, K. Marriott, and P. J. Stuckey. Fast node overlap removal. In Graph Drawing, pages 153–164. Springer, 2006. [4] C. Friedrich and F. Schreiber. Flexible layering in hierarchical drawings with nodes of arbitrary size. In V. Estivill-Castro, editor, ACSC, volume 26 of CRPIT, pages 369–376. Australian Computer Society, 2004. [5] T. M. J. Fruchterman and E. M. Reingold. Graph drawing by force-directed placement. Software - Practice and Experience, 21(11):1129–1164, 1991. [6] E. R. Gansner and Y. Hu. Efficient, proximity-preserving node overlap removal. J. Graph Algorithms Appl., 14(1):53–74, 2010. [7] E. R. Gansner, Y. Koren, and S. C. North. Graph drawing by stress majorization. In J. Pach, editor, Graph Drawing, volume 3383 of Lecture Notes in Computer Science, pages 239–250. Springer, 2004. [8] E. R. Gansner and S. C. North. Improved force-directed layouts. In S. Whitesides, editor, Graph Drawing, volume 1547 of Lecture Notes in Computer Science, pages 364–373. Springer, 1998. [9] E. Gomez-Nieto, W. Casaca, L. G. Nonato, and G. Taubin. Mixed integer optimization for layout arrangement. In Graphics, Patterns and Images (SIBGRAPI), 2013 26th SIBGRAPI-Conference on, pages 115–122. IEEE, 2013. [10] E. Gomez-Nieto, F. San Roman, P. Pagliosa, W. Casaca, E. Helou, M. Ferreira de Oliveira, and L. Nonato. Similarity preserving snippet-based visualization of web search results. 2013. [11] K. Hayashi, M. Inoue, T. Masuzawa, and H. Fujiwara. A layout adjustment problem for disjoint rectangles preserving orthogonal order. Systems and Computers in Japan, 33(2):31–42, 2002. [12] Y. Hu. Visualizing graphs with node and edge labels. CoRR, abs/0911.0626, 2009. [13] X. Huang and W. Lai. Force-transfer: A new approach to removing overlapping nodes in graph layout. In M. J. Oudshoorn, editor, ACSC, volume 16 of CRPIT, pages 349–358. Australian Computer Society, 2003. [14] X. Huang, W. Lai, A. Sajeev, and J. Gao. A new algorithm for removing node overlapping in graph visualization. Information Sciences, 177(14):2821–2844, 2007. [15] T. Imamichi, Y. Arahori, J. Gim, S.-H. Hong, and H. Nagamochi. Removing node overlaps using multi-sphere scheme. In I. G. Tollis and M. Patrignani, editors, Graph Drawing, volume 5417 of Lecture Notes in Computer Science, pages 296–301. Springer, 2008. [16] W. Li, P. Eades, and N. S. Nikolov. Using spring algorithms to remove node overlapping. In S.-H. Hong, editor, APVIS, volume 45 of CRPIT, pages 131–140. Australian Computer Society, 2005. [17] C.-C. Lin, H.-C. Yen, and J.-H. Chuang. Drawing graphs with nonuniform nodes using potential fields. J. Vis. Lang. Comput., 20(6):385–402, 2009. [18] K. A. Lyons, H. Meijer, and D. Rappaport. Algorithms for cluster busting in anchored graph drawing. J. Graph Algorithms Appl., 2(1), 1998. [19] K. Marriott, P. J. Stuckey, V. Tam, and W. He. Removing node overlapping in graph layout using constrained optimization. Constraints, 8(2):143–171, 2003. [20] K. Misue, P. Eades, W. Lai, and K. Sugiyama. Layout adjustment and the mental map. J. Vis. Lang. Comput., 6(2):183–210, 1995. [21] H. Strobelt, M. Spicker, A. Stoffel, D. Keim, and O. Deussen. Rolled-out wordles: A heuristic method for overlap removal of 2d data representatives. In Computer Graphics Forum, volume 31, pages 1135–1144. Wiley Online Library, 2012. [22] H. Strobelt, M. Spicker, A. Stoffel, D. A. Keim, and O. Deussen. Rolled-out wordles: A heuristic method for overlap removal of 2d data representatives. Comput. Graph. Forum, 31(3):1135–1144, 2012. [23] R. Tamassia. Handbook of Graph Drawing and Visualization (Discrete Mathematics and Its Applications). Chapman & Hall/CRC, 2007. [24] X. Wang and I. Miyamoto. Generating customized layouts. In F.-J. Brandenburg, editor, Graph Drawing, volume 1027 of Lecture Notes in Computer Science, pages 504–515. Springer, 1995.
© Copyright 2026 Paperzz