From 4a07c43b784a34c2976b253253ef4519613aebe9 Mon Sep 17 00:00:00 2001 From: Torgeir Helgevold Date: Sat, 16 Apr 2016 11:11:37 -0400 Subject: [PATCH 1/3] docs:(cookbook showing how to create a TreeView) working on getting tree view rendering wiring up tree more features styles added add/cancel styles http fixed styling added error handling docs clean-up starting article img text updated e2e text text text renamed rating fixed test typo update to rc 1 shim lint --- .../docs/_examples/cb-tree-view/e2e-spec.ts | 65 ++++++++++ .../docs/_examples/cb-tree-view/ts/.gitignore | 1 + .../ts/app/add-hero.component.html | 7 ++ .../cb-tree-view/ts/app/add-hero.component.ts | 32 +++++ .../cb-tree-view/ts/app/app.component.ts | 34 +++++ .../ts/app/hero-node.component.html | 5 + .../ts/app/hero-node.component.ts | 23 ++++ .../_examples/cb-tree-view/ts/app/hero.ts | 6 + .../_examples/cb-tree-view/ts/app/main.ts | 10 ++ .../cb-tree-view/ts/app/mock-data.json | 25 ++++ .../cb-tree-view/ts/app/tree-node.service.ts | 61 +++++++++ .../cb-tree-view/ts/app/tree-node.ts | 41 ++++++ .../ts/app/tree-view.component.html | 21 ++++ .../ts/app/tree-view.component.ts | 27 ++++ .../cb-tree-view/ts/example-config.json | 0 .../docs/_examples/cb-tree-view/ts/index.html | 27 ++++ .../docs/_examples/cb-tree-view/ts/plnkr.json | 0 .../docs/_examples/cb-tree-view/ts/sample.css | 56 +++++++++ public/docs/ts/latest/cookbook/_data.json | 5 + public/docs/ts/latest/cookbook/tree-view.jade | 119 ++++++++++++++++++ .../images/cookbooks/tree-view/add-hero.png | Bin 0 -> 28497 bytes .../images/cookbooks/tree-view/tree-view.png | Bin 0 -> 52582 bytes 22 files changed, 565 insertions(+) create mode 100644 public/docs/_examples/cb-tree-view/e2e-spec.ts create mode 100644 public/docs/_examples/cb-tree-view/ts/.gitignore create mode 100644 public/docs/_examples/cb-tree-view/ts/app/add-hero.component.html create mode 100644 public/docs/_examples/cb-tree-view/ts/app/add-hero.component.ts create mode 100644 public/docs/_examples/cb-tree-view/ts/app/app.component.ts create mode 100644 public/docs/_examples/cb-tree-view/ts/app/hero-node.component.html create mode 100644 public/docs/_examples/cb-tree-view/ts/app/hero-node.component.ts create mode 100644 public/docs/_examples/cb-tree-view/ts/app/hero.ts create mode 100644 public/docs/_examples/cb-tree-view/ts/app/main.ts create mode 100644 public/docs/_examples/cb-tree-view/ts/app/mock-data.json create mode 100644 public/docs/_examples/cb-tree-view/ts/app/tree-node.service.ts create mode 100644 public/docs/_examples/cb-tree-view/ts/app/tree-node.ts create mode 100644 public/docs/_examples/cb-tree-view/ts/app/tree-view.component.html create mode 100644 public/docs/_examples/cb-tree-view/ts/app/tree-view.component.ts create mode 100644 public/docs/_examples/cb-tree-view/ts/example-config.json create mode 100644 public/docs/_examples/cb-tree-view/ts/index.html create mode 100644 public/docs/_examples/cb-tree-view/ts/plnkr.json create mode 100644 public/docs/_examples/cb-tree-view/ts/sample.css create mode 100644 public/docs/ts/latest/cookbook/tree-view.jade create mode 100644 public/resources/images/cookbooks/tree-view/add-hero.png create mode 100644 public/resources/images/cookbooks/tree-view/tree-view.png diff --git a/public/docs/_examples/cb-tree-view/e2e-spec.ts b/public/docs/_examples/cb-tree-view/e2e-spec.ts new file mode 100644 index 0000000000..77a3fb033d --- /dev/null +++ b/public/docs/_examples/cb-tree-view/e2e-spec.ts @@ -0,0 +1,65 @@ +/// +'use strict'; +/* tslint:disable:quotemark */ +describe('Tree View', function () { + + beforeEach(function () { + browser.get(''); + }); + + it('should expand and collapse all nodes', function(){ + let expandAll = element(by.xpath('//button[text()="Expand All"]')); + let collapseAll = element(by.xpath('//button[text()="Collapse All"]')); + + expandAll.click() + .then(function(){ + expect(findHeroCount('Dr IQ')).toBe(1); + expect(findHeroCount('Bombasto')).toBe(1); + expect(findHeroCount('Celeritas')).toBe(1); + expect(findHeroCount('RubberMan')).toBe(1); + expect(findHeroCount('Tornado')).toBe(1); + expect(findHeroCount('Dynama')).toBe(2); + expect(findHeroCount('Magma')).toBe(1); + }); + + collapseAll.click() + .then(function(){ + expect(findHeroCount('Dr IQ')).toBe(0); + expect(findHeroCount('Bombasto')).toBe(0); + expect(findHeroCount('Celeritas')).toBe(0); + expect(findHeroCount('RubberMan')).toBe(0); + expect(findHeroCount('Tornado')).toBe(0); + expect(findHeroCount('Dynama')).toBe(0); + expect(findHeroCount('Magma')).toBe(0); + }); + }); + + function findHeroCount(name: string) { + let length = element.all(by.xpath('//div[text()="Name: ' + name + '"]')).count(); + return length; + } + + it('should add hero', function () { + let usaNode = element.all(by.xpath('//a[text()="USA"]')).get(0); + + usaNode.click().then(function() { + let name = element(by.xpath('//input[@placeholder="name"]')); + + let rating = element(by.xpath('//input[@placeholder="ranking"]')); + + name.sendKeys('New Hero'); + rating.sendKeys('10'); + + let addButton = element(by.xpath('//button[text()="Add Hero"]')); + return addButton.click(); + }) + .then(function(){ + let name = element(by.xpath('//div[text()="name: New Hero"]')); + expect(name).toBeDefined(); + + let rating = element(by.xpath('//div[text()="10"]')); + expect(rating).toBeDefined(); + }); + }); + +}); diff --git a/public/docs/_examples/cb-tree-view/ts/.gitignore b/public/docs/_examples/cb-tree-view/ts/.gitignore new file mode 100644 index 0000000000..cf44e148ba --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/.gitignore @@ -0,0 +1 @@ +**/*.js \ No newline at end of file diff --git a/public/docs/_examples/cb-tree-view/ts/app/add-hero.component.html b/public/docs/_examples/cb-tree-view/ts/app/add-hero.component.html new file mode 100644 index 0000000000..140fe2ce36 --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/add-hero.component.html @@ -0,0 +1,7 @@ + + + +
+ + +
diff --git a/public/docs/_examples/cb-tree-view/ts/app/add-hero.component.ts b/public/docs/_examples/cb-tree-view/ts/app/add-hero.component.ts new file mode 100644 index 0000000000..459cff3595 --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/add-hero.component.ts @@ -0,0 +1,32 @@ +// #docregion +import { Component, OnInit } from '@angular/core'; + +import { TreeNodeService } from './tree-node.service'; +import { Hero } from './hero'; + +@Component({ + selector: 'add-hero', + templateUrl: 'app/add-hero.component.html' +}) +export class AddHeroComponent implements OnInit { + + hero: Hero; + + constructor(private treeNodeService: TreeNodeService) { + } + + addHero() { + if (this.hero.name) { + this.treeNodeService.addHero(this.hero); + this.hero = new Hero(); + } + } + + cancel() { + this.treeNodeService.selectedNode.unselect(); + } + + ngOnInit() { + this.hero = new Hero(); + } +} diff --git a/public/docs/_examples/cb-tree-view/ts/app/app.component.ts b/public/docs/_examples/cb-tree-view/ts/app/app.component.ts new file mode 100644 index 0000000000..5371189f6b --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/app.component.ts @@ -0,0 +1,34 @@ +// #docregion +import { Component, OnInit } from '@angular/core'; + +import { TreeViewComponent } from './tree-view.component'; +import { TreeNode } from './tree-node'; +import { TreeNodeService } from './tree-node.service'; + +@Component({ + selector: 'my-app', + template: ` +
+

Hero locations

+ + + +
+ `, + directives: [TreeViewComponent], + providers: [TreeNodeService] +}) +export class AppComponent implements OnInit { + + private _nodes: Array = []; + + constructor(private _treeNodeService: TreeNodeService) { + } + + ngOnInit() { + this._treeNodeService + .getTreeNodes() + .then((nodes: Array) => this._nodes = nodes) + .catch((error: any) => console.log(error)); // TODO: Display error + } +} diff --git a/public/docs/_examples/cb-tree-view/ts/app/hero-node.component.html b/public/docs/_examples/cb-tree-view/ts/app/hero-node.component.html new file mode 100644 index 0000000000..4317158265 --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/hero-node.component.html @@ -0,0 +1,5 @@ + +
+
Name: {{hero.name}}
+
Ranking: {{hero.ranking}}
+
\ No newline at end of file diff --git a/public/docs/_examples/cb-tree-view/ts/app/hero-node.component.ts b/public/docs/_examples/cb-tree-view/ts/app/hero-node.component.ts new file mode 100644 index 0000000000..21dda2ea85 --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/hero-node.component.ts @@ -0,0 +1,23 @@ +// #docregion +import { Component, Input, OnInit } from '@angular/core'; + +import { Hero } from './hero'; + +@Component({ + selector: 'hero-node', + templateUrl: 'app/hero-node.component.html' +}) +export class HeroNodeComponent implements OnInit { + @Input() hero: Hero; + heroClass: string; + + ngOnInit() { + if (this.hero.ranking > 7) { + this.heroClass = 'hero-top'; + }else if (this.hero.ranking > 4) { + this.heroClass = 'hero-ok'; + }else { + this.heroClass = 'hero-low'; + } + } +} diff --git a/public/docs/_examples/cb-tree-view/ts/app/hero.ts b/public/docs/_examples/cb-tree-view/ts/app/hero.ts new file mode 100644 index 0000000000..8e3a7f97f9 --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/hero.ts @@ -0,0 +1,6 @@ +// #docregion +export class Hero { + + constructor(public name?: string, public ranking?: number) { + } +} diff --git a/public/docs/_examples/cb-tree-view/ts/app/main.ts b/public/docs/_examples/cb-tree-view/ts/app/main.ts new file mode 100644 index 0000000000..cda5d15792 --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/main.ts @@ -0,0 +1,10 @@ +// #docregion +import { bootstrap } from '@angular/platform-browser-dynamic'; + +import { AppComponent } from './app.component'; +import { HTTP_PROVIDERS } from '@angular/http'; + +import 'rxjs/Rx'; + +bootstrap(AppComponent, [HTTP_PROVIDERS]) + .catch((err: any) => console.error(err)); diff --git a/public/docs/_examples/cb-tree-view/ts/app/mock-data.json b/public/docs/_examples/cb-tree-view/ts/app/mock-data.json new file mode 100644 index 0000000000..3d2675c411 --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/mock-data.json @@ -0,0 +1,25 @@ +{ + "nodes":[ + { + "title":"USA", + "nodes":[ + { + "title":"New York City", + "nodes":[ + {"title":"Brooklyn","heroes":[{"name":"Dr IQ","ranking":10}]}, + {"title":"Manhattan","heroes":[{"name":"Bombasto","ranking":2}]}, + {"title":"Bronx","heroes":[{"name":"Celeritas","ranking":4}]}, + {"title":"Queens","heroes":[{"name":"RubberMan","ranking":6}]}, + {"title":"Staten Island","heroes":[{"name":"Dynama","ranking":8}]}] + } + ] + }, + { + "title":"Canada", + "nodes":[ + {"title":"Calgary","heroes":[{"name":"Tornado","ranking":3},{"name":"Dynama","ranking":8}]}, + {"title":"Ottawa","heroes":[{"name":"Magma","ranking":10}]} + ] + } + ] +} \ No newline at end of file diff --git a/public/docs/_examples/cb-tree-view/ts/app/tree-node.service.ts b/public/docs/_examples/cb-tree-view/ts/app/tree-node.service.ts new file mode 100644 index 0000000000..7b94c554ca --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/tree-node.service.ts @@ -0,0 +1,61 @@ +// #docregion +import { Injectable } from '@angular/core'; +import { Http } from '@angular/http'; + +import { TreeNode } from './tree-node'; +import { Hero } from './hero'; + +@Injectable() +export class TreeNodeService { + + private _root = new TreeNode('Hero Regions', [], []); + selectedNode: TreeNode; + + constructor(private _http: Http) { + } + + // #docregion build-tree + private _buildTreeRecursive(root: TreeNode, nodes: Array): TreeNode { + if (nodes) { + nodes.forEach(node => { + let heroes = (node.heroes || []).map((hero: any) => new Hero(hero.name, hero.ranking)); + let treeNode = new TreeNode(node.title, [], heroes); + root.nodes.push(this._buildTreeRecursive(treeNode, node.nodes)); + return treeNode; + }); + } + return root; + } + + getTreeNodes(): any { + return this._http.get('./app/mock-data.json') + .toPromise() + .then(res => { + let root = this._buildTreeRecursive(this._root, res.json().nodes); + return root.nodes; + }); + } + // #enddocregion build-tree + + addHero(newHero: Hero) { + this.selectedNode.heroes.push(newHero); + } + + // #docregion toggle-nodes + toggleNodes(nodes: Array, state: boolean) { + nodes.forEach(node => { + node.expanded = state; + this.toggleNodes(node.nodes, state); + }); + } + // #enddocregion toggle-nodes + + selectNode(node: TreeNode) { + if (this.selectedNode) { + this.selectedNode.unselect(); + } + + this.selectedNode = node; + this.selectedNode.select(); + } +} diff --git a/public/docs/_examples/cb-tree-view/ts/app/tree-node.ts b/public/docs/_examples/cb-tree-view/ts/app/tree-node.ts new file mode 100644 index 0000000000..1a8e6dc51b --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/tree-node.ts @@ -0,0 +1,41 @@ +// #docregion +import { Hero } from './hero'; + +export class TreeNode { + + expanded: boolean = false; + selected: boolean = false; + + constructor(public title: string, public nodes?: Array, public heroes?: Array) { + } + + getIcon() { + if (this._hasChildren()) { + if (this.expanded) { + return '-'; + } + return '+'; + } + return ''; + } + + toggle() { + this.expanded = !this.expanded; + if (this.expanded === false) { + this.selected = false; + } + } + + select() { + this.selected = true; + this.expanded = true; + } + + unselect() { + this.selected = false; + } + + private _hasChildren() { + return (this.nodes.length + this.heroes.length) > 0; + } +} diff --git a/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.html b/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.html new file mode 100644 index 0000000000..6780250a3b --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.html @@ -0,0 +1,21 @@ + + \ No newline at end of file diff --git a/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.ts b/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.ts new file mode 100644 index 0000000000..739124f8f7 --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.ts @@ -0,0 +1,27 @@ +// #docregion +import { Component, Input } from '@angular/core'; + +import { AddHeroComponent } from './add-hero.component'; +import { HeroNodeComponent } from './hero-node.component'; +import { TreeNode } from './tree-node'; +import { TreeNodeService } from './tree-node.service'; + +@Component({ + selector: 'tree-view', + + directives: [TreeViewComponent, // Notice: TreeViewComponent reference inside TreeViewComponent + AddHeroComponent, + HeroNodeComponent], + + templateUrl: './app/tree-view.component.html' +}) +export class TreeViewComponent { + @Input() nodes: Array; + + constructor(private _treeNodeService: TreeNodeService) { + } + + select(node: TreeNode) { + this._treeNodeService.selectNode(node); + } +} diff --git a/public/docs/_examples/cb-tree-view/ts/example-config.json b/public/docs/_examples/cb-tree-view/ts/example-config.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/cb-tree-view/ts/index.html b/public/docs/_examples/cb-tree-view/ts/index.html new file mode 100644 index 0000000000..8ad0c173e4 --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/index.html @@ -0,0 +1,27 @@ + + + + + Tree view + + + + + + + + + + + + + + + + + Loading app... + + + diff --git a/public/docs/_examples/cb-tree-view/ts/plnkr.json b/public/docs/_examples/cb-tree-view/ts/plnkr.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/cb-tree-view/ts/sample.css b/public/docs/_examples/cb-tree-view/ts/sample.css new file mode 100644 index 0000000000..439f3b0cf1 --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/sample.css @@ -0,0 +1,56 @@ +ul{ + list-style-type: none; +} +#heroes > ul{ + list-style:none; + padding-left:0; +}​ + +.add-section{ + margin-left: 40px; + margin-bottom: 5px; +} +.add-section input{ + margin-right: 5px; +} +.add-section button{ + margin-right: 5px; + margin-top: 5px; +} +.hero-node{ + color:black; + border: 1px solid black; + margin-bottom: 2px; + padding: 5px; + width: 200px; + border-radius: 3px; +} + +.hero-low{ + background-color: red; +} + +.hero-top{ + background-color: green; +} + +.hero-ok{ + background-color: yellow; +} + +.hero-location{ + color: black; + font-size: 20px; +} + +.tree-node-icon{ + font-weight: bold; + cursor: pointer; + color:black; + font-size: 25px; +} + +.node-selected{ + font-weight: bold; + text-decoration: underline; +} \ No newline at end of file diff --git a/public/docs/ts/latest/cookbook/_data.json b/public/docs/ts/latest/cookbook/_data.json index f82d816cef..56109c2724 100644 --- a/public/docs/ts/latest/cookbook/_data.json +++ b/public/docs/ts/latest/cookbook/_data.json @@ -37,6 +37,11 @@ "basics": true, "hide": true }, + + "tree-view": { + "title": "Tree View", + "intro": "Creating a recursive tree view" + }, "dynamic-form": { "title": "Dynamic Forms", diff --git a/public/docs/ts/latest/cookbook/tree-view.jade b/public/docs/ts/latest/cookbook/tree-view.jade new file mode 100644 index 0000000000..ada153c416 --- /dev/null +++ b/public/docs/ts/latest/cookbook/tree-view.jade @@ -0,0 +1,119 @@ +include ../_util-fns + +:marked + Our hero agency has placed heroes in positions all over the world at this point. As an easy way to keep track of heroes by region we have created a tree view. + + In this cookbook we show how to load hero data from an external file and bind it to a recursive template in our tree view component. + + +:marked + ## Table of contents + + [Load Heroes and Regions](#load-heroes-and-regions) + + [Recursive Template](#recursive-template) + + [Adding Heroes](#adding-heroes) + + [Expand/Collapse All](#expand-collapse-all) + +:marked + **See the [live example](/resources/live-examples/cb-tree-view/ts/plnkr.html)**. + +.l-main-section + +:marked + ## Load Heroes and Regions + + We want to load the tree view data from an external file, so first we define a json schema to represent heroes and their regions. A sample of our schema can be found in `mock-data.json`. ++makeExample('cb-tree-view/ts/app/mock-data.json','','app/mock-data.json') + +:marked + In `TreeNodeService` we load the file using `Http` and traverse it recursively to create an object model representing the final tree data. + + Enabling our application to use `Http` requires some configuration, but don't worry we cover the setup in great detail here. ++makeExample('cb-tree-view/ts/app/tree-node.service.ts', 'build-tree', 'app/tree-node.service.ts (building tree)')(format=".") + +:marked + `_buildTreeRecursive()` in `TreeNodeService` maps the data from the file into `TreeNode` objects that we bind to the tree view. + + `TreeNode` is the view model for the nodes in the tree and adds support for operations like expand, collapse and selecting of nodes. + ++makeExample('cb-tree-view/ts/app/tree-node.ts','','app/tree-node.ts') + +.l-main-section + +:marked + ## Recursive Template + + To render the tree view we have created `TreeViewComponent`. + ++makeTabs( + `cb-tree-view/ts/app/tree-view.component.ts, + cb-tree-view/ts/app/tree-view.component.html` + , + null, + `app/tree-view.component.ts, + app/tree-view.component.html` +) + +:marked + There is something very interesting about `TreeViewComponent`. If we look at the `directives` array we see a reference to `TreeViewComponent` itself. This might seem surprising, but is necessary since `TreeViewComponent` has a reference to itself in the template. + + We see this self reference if we look at the template. Remember `tree-view` is the selector for our tree view, so using a `tree-view` element in the template means that the component refers to itself. + +:marked + The final tree view looks like this. +figure.image-display + img(src="/resources/images/cookbooks/tree-view/tree-view.png" alt="Tree-View") + +:marked + In addition to displaying a hero's name under a specific region we also include their ranking. Based on ranking there is a color code for the node. High performing heroes are displayed in green, mid level performers in yellow and heroes who are struggling are displayed in red. + + We are using `HeroNodeComponent` to display the hero nodes. + ++makeTabs( + `cb-tree-view/ts/app/hero-node.component.html, + cb-tree-view/ts/app/hero-node.component.ts`, + null, + `app/hero-node.component.html, + app/hero-node.component.ts` +) + +.l-main-section + +:marked + ## Adding Heroes + + We need the ability to add new heroes to the tree. Selecting a region in the tree will open up the following add hero view. + +figure.image-display + img(src="/resources/images/cookbooks/tree-view/add-hero.png" alt="Add Hero") + +:marked + We have created `AddHeroComponent` as a separate component for adding new heroes. Just type in the new hero's name and ranking and click "Add Hero". + ++makeTabs( + `cb-tree-view/ts/app/add-hero.component.html, + cb-tree-view/ts/app/add-hero.component.ts`, + null, + `app/add-hero.component.html, + app/add-hero.component.ts` +) + +:marked + As we can see, `AddHeroComponent` uses `TreeNodeService` to attach new nodes to the exiting set of nodes. + +.l-main-section + +:marked + ## Expand/Collapse All + + Tree nodes can be expanded or collapsed individually, but out of convenience we want a way to expand or collapse all nodes in a single operation. For that we have added "expand all" and "collapse all" buttons above the tree view. + + The `expanded` flag on `TreeNode` controls the visibility of a node, so to expand or collapse all nodes, we have to recurse over all `TreeNodes` and set the `expanded` flag accordingly. + ++makeExample('cb-tree-view/ts/app/tree-node.service.ts', 'toggle-nodes', 'app/tree-node.service.ts (Toggle nodes)')(format=".") + +:marked + [Back to top](#top) \ No newline at end of file diff --git a/public/resources/images/cookbooks/tree-view/add-hero.png b/public/resources/images/cookbooks/tree-view/add-hero.png new file mode 100644 index 0000000000000000000000000000000000000000..608497f0e68b1052c9c8c9d77645ea3f41860a95 GIT binary patch literal 28497 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 T>1!2%0RE)J%?@Z9 literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/tree-view/tree-view.png b/public/resources/images/cookbooks/tree-view/tree-view.png new file mode 100644 index 0000000000000000000000000000000000000000..003addd11b8049ff614550c8d545de1320127697 GIT binary patch literal 52582 zcmeFZRa9J2vo0E3gS$Hf0*$)`f?II6;O_1T?h%~E-QA&a2?Td{cL~zSY54a!dyjix z&lvaR_S330wWd^kC95O8C`!FYCPIGq?%jJC>CYOiSxH!cZX9sgDTeElX7=D--88OOyWEeCyHZmIg%k%-+*+V5fJX*yF)YJL5vxlPB zsE;BeSx;}B0Asx;5Zkx4zY{SBaP)0N_Uh4Vs-WKY8IQX%#aV-vzv(6j%0t%Li5&)p z8X+E-u9BXPV!HQkfqw{2f>!h&Dur%iTi&}~VJOom94Jym(>18-DavDX3U{pJzrD~J z*jU@BrgHBVpk*)`;KPAv#=3#?Lxd3@L>mwWS;C1s1E+cm_)rk` z%gamq{>uv}D(D}~*0CtsI~otG^=KO`bjUsct<W$DC^9KTTBqX9h_>PEKj3OktirLT^yJ{ELEJ~Xcf{uN17H%gcV<~ z85PVna|RmaYXx5)OsO1|K5QvcHOP;quiddmH@0gB*haKO>*u2|ucrB;=Vhr1Rp*fF~ zw1NEEZSTeK+S?qmx)H;-Dyy(rdT?L64c|%vy_N@yhG1e07#h>-g)+guPH+Ga0P{Lh z5He)apl-z`RL$3JUm1Y^F9s-DV_%l9T$`?luip=DH>22O2}+4P!n=YdWMF>n&5koS zY$D#HU-8OSo}HyfjZ1KhM){KQ7ju-mm{%}3K?apg5Y-@k3F+hWJ{URM_lW0+vY}|M zk_J4XwSWY~3+L1fdNews0Btgb2AfWaU)BKWxdZ5H;a(L-_ZC>De3y>9xKt ziT@yT8bk^z-6f{cgk)#d?@`n2Go}r z!iE;3poW$>x}$ax$)yfMI2ZvZUQDmZOU3#{*|)A9V*uh`hQa$0SD(RXq&ZguaT9XY z-boWdU4;h~z;VzyztHoFRMj?=gj|!?n)r2j<=N=B+-6bLxPT-wuR~fnl+SKFYjSbE zM@+r?)uH3t=m!&9xvs*q4*FX)CykRmQXMjlG|@a_W2l0%BEJ7TOqJ&tPv)m2;(V_Z zS5gd7mG|(;^Ej&E$EL)=&rB*y2lM-JgUx1WJ7IN~egl#RM~bR@?Ay5BZNJET4^j2q zub>WBu(QSEqWg7bsFNn}(fu;pm<6ye0bf-+8{>SF3~JEGbdXGBifEA_r)gG>qSfZH zz`$19rad6xGX915I$xYyG4lk_@mY#&UP{FGf>hP!Vt=2lc53gj{2Fs46_AmZC-9H7 z%I%@-W^$jp?kq#f$^;xWI+5#fT|o*;cE9t)*kT8 zDHMFs&m#=X4HD@1JfO&(3+;`X>y*JP3a7wl2>tG6Ht zf9xrm%y-j663ILq-7l`ArWNxP4E^`%Sec*GQ-_JzZ=Z7U=@^4+k!50fqN4&~@Z#Zv zx49Ggit~)Xbq_eU&wL=s@6h1kxpC2oo(1u&?OD+8wu|~&AcG%}kuxflc7VUu)>mL* zWAXPrNsemuhr7c4>@J6iQ=sNVpNByqdBE)_Z&`=nShweR`}+{hv>%3u_Xp!eEilc| z{|L8MoY};Fi3o}fWXyaZ4fqfnCMus}-jf+&EL)cb3=eJiq@j9{};8$986*viqEtCss!>gk!& z-e#XL=s2?Mt->28Vesd`4*y~O#TunS5ozn|Mt9O&htnY8(F1`d6wf+rd|0xPluzEz z%lgyK?Gr+L5Sdj)3C)*w0m$%*Pz3TP=or+vfIp9+3zHF#cbF*s)O2}BuTMz#5Rz9C zbS+i(4Z6A=k8I+uBP05ZEK-TGYThUxBarmt;(B+n`Yh3(*(oII8Q8z*l2JCrin z%Q^xMmD!b~V~*?5@poBKG|`nrB-Y5EGIp<Qiqb*PxBUe$4Cd(ZFZ zu;$)lu$+6f2+CE|561K`I?=m&2rb!hq(o^Gb~B3i200UF*w{+w&P@T)MZ|nqIEXg) zn5wyF62R;&M~W*4E)(i=Ym#e+PdNo{ge)2_#Q5Au5HV;PCOS$Yq96KF;pSE>!50+l zl-~2~$pw6(suxJ8jbze~OUc_gVDBJ{rqW zySc5{nzBqr?QwXp8fl^%NRzd!0&j&kH13ouuO#_T7{TYBA1MT)@BD;hAUUr2q7D}7^ z!g_pM+>1chnUvduaniM{0eZtc7fj%bMq$$PmdNvW{|oYd4k8zNS{B&g&K9I?+hPkt zfO(}%?8x+3l*_f5pqg6ay$({_dKz1T#lh;!gY8E%Vm=oGU9iG=05`|N-Bl>*w5Q*u z#HR(fV@IlopR(ruoIOms#gJomskgWXh@==W@YiR5 zSC^>R3GBW&(e!=w@#1?ySYPqSiVTpkffG(CkLhpwmF6_>%vA;aRX!;fKt{n-&^v_< z!Y{|{j{d*Vp3b?w7l%E}upkIvo*`({`7t@=>Y=^iAqa3e?|&cZaVsyRgvo0?@Q?KO zsASw-Qqt%+NrMWvP6iZfuS+&QPyeKAkhc}fH^P@u8Xx?z5G)UNyOmEoCY@UOU7-Aq zo$yPH1lyS&#V(yEFbJi4Z4xx7=*+N;kHs1*^dR!A^_M~iH z`ru6AjzlK!VNpZ=8~`1HLu@77T8>D|H7eSlP);2o`ZuMU2cHu}>bF*s&~d2TJ_BBR@Lp$DXt8%GkT z#dMNog1%NPw8R@2H7u?J6UFJd4@K1L?_XhozuN2XW%7cde`fnx&%%3G+qV{vxS%5( z;N$fJD46*1s^%#D$DVCK;GtxkC3^FH+Fx{knYF23T4o4-M@;OuN~TmFD69OTwSgCD z9u2+v&LyK8l;z4eYr;hqyr4^=hoNegMdQX3aLtM9nfTg3qYXA`-6GB}=ZGaI;wQ^% zB=7av6K>L$X#4hCN^j(~0)@R4s15C2DO<3=kXI&IKK1RY^%OjwjeQ?aXr_0nyRJJu zKZrdzKNjJuoW$;*N3ihsT=DAGc-=OUZikbi8`fDh#TWL?HDYh;Yp`pr@p_+Xc5*Ru z%*nJFAy}~C+oiMWv0!fv1&YN{%aUroG0qs@|Qb%tr2r!s&?lK-U;6;R5UqDsS-OzB|IhL;)e*nC^e3WEX3~?U3H^uH3hO+ zd3;#Rnl$fUd=)yulpg9g^b3}M3zcAAA*9fQm=Y( zuW8_A_VWtgJmp1u-f3hxavB3VL4m?XPDpSnDL%FH^3qu)n^jJ%#ypgCfQu>O8^k0> zg00!T1L(K>Hqye1fc3l|CJIhT7+kaxh_#u+dJoy4k=F`;C22F{Ddd=}heDY?O7UvE z+S|JjtNl6M2siijI0S9dLd<8+u^78CmiAkgcJOH{4T?>JCygqkj1zJGj7>gw(_4KN zJrp>b_5TS*U-X;goEh4pE3O=*I-+M+kja-gF9x-qkj+br#@;~B;K zaxQJZqtY+YA3Xo-x@+$=SKxATp_irIyj`UC&JLMC{;Y}* zJ)(ey7IKd95Vuz@0*nM4Ui@SoHtJ> z+8-*S>{-(V=E6k^pNw!({;1%^COv;PQOd|^v=)~2Ilcd=uPN?o{;+qQc3@#SJVScD zU;{AB$MlQV0bNZk<#n|EbCw?V5x8c5x|tO~EL=f!@^>mIk&lHe>vp8*Dk(@fp1IC$ zPpSwH2@m(#)jK-FYX@d=%86&jfnUi)gkOeyxhYB5?*fkhiF@L5$-$=L=&*lmY9(_e z!a5*-%EaXQk8VGw=aHN1-ipVUllym1;NgILrbPVxlc>*W4gSAR+X_R3zfEL_Jh|}S z|M_P9lUpA@DwXPN^2PI>d2!KGK;LJV&)b+^p6Ai7y;u-5;V}k#z+93o1lBEDbpa*%q_N2{w z;Bjz0_5w7}9w&VHE9IfAJ4}CYDd(VK^hnd*ABb7eMf_j63ZfbvO@PaHAlpfQOT@jqA#+c2dLKO1I9rsV!PDvOS7o1h#&pR-l{|z%cJrz=(=#tTJdEo(?xYaD6{bQErA34K^(bl zj?!66knmLs`cxkWU@Eg_Scuvt0J+D-{(;qxcZ1!JZ^e6n)b(hTDFTo@70@Q#dfJA* z^+2LueU2>jR61w3q?ND`(s)4Kx_rF@?z}v~h=CiO^4YNBeTuqn26sprx(9@^JYJab zU$H1V`lcKBcnGXq?NmqdV4;nO56{Z|y(IsOSfIbtCFe##U_%w*Nyj?Bb^pUHF8Mu;-=o9z z#}1Ru<=?_r5pm-?^#TVRe_gHjpH zReuzYC%epSB?BM0{u`v0r+!dZ-yv5GnCwPp#2&OkU3VXOa(&QWUWZCdZVP35{`mKo zNSDNw{=+ix)@b2K-`gdkHfjI5I8&9PXzddaDTG<*kqJ(GpIE-_61=um0Y|?lBCcln zJ5ffQ_w5FXWC3D7%NW;R8F~ zjz(^~oN`OYjgX{+cH&fQwX1}t1~Szhkq!k1lM&6{Lq? zCR#T(ee>$bxz)(lf|Kh-o61S@(Kazq=%drviZ64g!eE#cxIV3F-5qXb)<3zT>EVwS zSFGLx_8K3iUHc{#(CdV2v91_zrB~t_?jvv|Ba89XS#&9#CCc#}bv;WgcRiO+>y52C zz_aFy%^_VzKAv`cRcP3m_sCIql$*96a$ynw{oS6N1CY`{rs>)|+@QzV<%zyw%Fqiw z;D+U4fcvA@v|)rCoCt!n5JzQmD!vCEgJ;H)PL8HQPkORlTDRfFyGs!(rjzDdd+S!P zeM@V3%(K(kfD@^AjDbHkDT8R!CN|3h>+TtS<})tv<;chNV6yev+DLw@>S=3f|FD!T z-vAL)W4P+i4PAy(;INwjYvgu(Dxr&Kl!4EcP^dfzA&vP)VE^m++QHC8lGT!h?!G}B z@l)ro1P`7GT-Il(SOLAp$#U{F*$vI{=f2*0@HmQRk?xfAi>C*127aK$(n?)nHM|E_ zh(5nu0TrKERt;kBZrnZ5Ke{bVMnk?E&i0?<`)=0(0oTk;JLpqDkEVSck}<(h!Y9D9 zXr@W#br1b_w*x4oS;&X}3TIwgzoR`x z_~nAIrBivQB~Z>yB8H9YDB zsXHGZ4V=5(4|B38r@P;>&cXSdJoGPCr={Wf>bl`AsB;TIW;s}TinTgA-BzD($L1zu7Bo7IXXPVvaSdt3pml zbAn4@uyhA(MCs%680(n}BQX;p5u2YqL-{-h^!PmMR;lg_Rmp7Mli3CsnFy$N=+`d% zsdXMn)UT$7Wef?N@xa+@s^+e&9NXHk&k>Rt;iGt_qDlvUWmsXh6{qYLh zbb!r;Nktq{jXS7}@A>fX@DE*c|Neb@>nz1c+2>isB`3YsL`%rR8_~trbNO>K0?>GJ zXSQtGY4nn5IckTsqjL30U;W;l8IVu{$PfGHf1(%AeV5ff~~oT zKVZJX?%%YK0E(HHj@g$tj5ZAkj})3y)4mZkG!Ve{QK=MF_6@G5LcrX#ZQkcs;!7f= zV$zOP!Y8CxWUqpaF_4)W^ZO0v|M>~2SR+`@&HyP17PW?;eAU_?SZ{p)s;e9n_o3YO-2fm$3s~Y%!Y>Emb@f-FI2(yi7>J_-_u&#fhw0xxQ z%BNZSN%_XA6f~Us<7c_6U+er*rOo^KgVFu|SfdMNJRH-KF|D^#7ejo*%_+IqQfGx} z4KrolpOB)DrG_6sU<7D9;-7E!(r@~pZxCCnYL>24qTg~Z$cY)0?~`nfk7vb4l)tkh zfvj*})K^puxT zXD{YjQ?EJLJ>nah1-H>*tv+;h2^6{5e(UdtFRITtgOjHe{De?H0L?tTx}Bw?$<$oG zxwW17ZyLVTg?F6$)Rp@I&I;%?ansl2j{t&-XE4 z)>EqzLBDQMX=BWyPFnHMOcwKtmM-w(_CT8yIGyJgB4qi!s1*L zvReK;JEi+ttYtaHadhBEM;?;c-hVfmbNqud)AD3z?-Y!5_qwlHFAPZ0V5(R6@4DwZ zjfJo?!){M<(%esSR^s(r(fcp=(9p(xKhk2pG3c4;CQp`(M%dRavAm&sM#WJJpy6~RxP{e99r z^RlynRup2UPyCMOynmF&5j&WdlV-xON>RT=zTM}0nlJlir3+nnes(Jh#PxNW$r8cybCkEWgT5U}E*0u1dqZlK`OOJ7YcQd7Xko|8g+TvW#YKH&XM`n}V zF{O9iT}bT)!{zY`;Q+g6Q%;NRy@}b-HA?!O{?nps zfNp>p(%P~*^{4jtg7O*~+YJ9DX(aaUhB0fRW!{dWJZ$9G;=<%WX~VaD*inSY)#glN z!pv7u+9@VV0)h*tdE@v0gQ5*A@-^hug(0d>5RbqyBnS^;9L6QOYEVfija-B`SFx6a zhEY>jmnats`ptjOm^}V))IDtBZRyVyK#2537x#MH;Y`bOYXv3FszJvmIuo=SDB%w^ z7TBm@qNA!R{&A%7uRt*VjTU@D$x6N#a_AP|WUqwO4LLb-VIh-tYxHeevwUPJIUq2iG6sN z^R+1vVCO*Ci+eU=C!WniV_S zw@ZuF4~tLrN15*584w}Ujd|}q8SrO;5`My4APn|7lzjMxL1IbNu5=0B&LdD==6X>>dZM;WgK zQLP*~e(8%~Xu_HC-_?@s!T2K|`_^!NHOHV@a~jL!EscvfPW|YO!cFvCyv-b!1-7eB zAIP>@mY<{8-I?(w;^Hpt);s0rTIve0VL!DDdD64rGVyNGYWkILjFc9y&PbX>O?g%l zh4EdY5z0Bl(j6WgQ9HCU*;h)lm|mdC$Rpz5L$o$wMqG1GtDVI}gSiIP_F0z>*K834 z3{tddoaAI9xvd3SAbRH0R2rfeeJC?#7!R{Rd0aN4h&STL+Mk+h4f}?49}(frk9A3? zy&E-y731mNW9PhIP@Q4U+)sWLL}@MI!^O2c#!pguE(WGdjK17bZ|RwnQYbuZa{We@x+t|8iw_SsqY94~5ks_6>M_t8|E2o}9ib{R_7<)l4*lfC=+b3#e zY#yT~j6L)Qcv=aFC7fyO8}kFWn>`cKdo56$gm<6s#kwrRCe~K(j9g2jrj*+b2~F7I zToT~(r4fHaL6v1{C?*pf$GW?^Nwj{P+&E?DtWuCeb zwUAB}*E$vQ97PGNDf3PzZ{<|%YnxphTb7Z!OS6%K1d026@y(bg4w_`thj*JW`hLa@ zC6YO?30+4wDk*!ss2xKcTz0#TXsa9t*`*`gcJcUdw_v2kW~3X0$Mu|ui;Q^V+@!Fu za|7ka&&EZUY!-IY*7jg!i-tKjBdnQATHgcB`jfhc1 zF@SD?lU7YH&||E-hvQ*XqQ{4up^QdUJ8wEb&Q8K90k&%xNk3*MIcGIg80}B5Ju7>* zz^%35wc~0vOrP;6?Ipcf3>q&3W_}ky&`&^Y2rvvF_$J+E5!=g})xWy^Ew|GL!z1%?(TY%BrPHL@hu0g`$kOA7%$eM{{M{%6Z@G@&hbmpr{$2|CU$QikE^7ew0RaVjFgDXvEgt zSIxl0lD`!=5*ri;U~>!$DbH&LQg!FMCS`n<{dH6_DXeB4f%-P=XNt+IZSp-+Ca=Y% z8~u+1-*LJ?oyPxE6fZgFYQ+}2W)>@sT6_i%*GS$!NMskUj$ZH;758+csDJ5aB3V(O zzOu6FKPto3MN&2T7>F`4sgs&`sbeiPnZE<%WzTj(k9}`tWzm?#-X^SVE2o0^8!rgi z`Eh1ixIsE9>fh#&DMxE=Ox1QS@Syp7>p_8^lSPFYzh1S_UT!v=j-FN)+^=5n`h@vu zeX_RAY`+BqMl$6;@TfgLAIbaaL(?cIWO@1c%-m5$=Y@Mq7CFqX`1Lg8(ZeIb?g`l` zj=cr$!RB8zS<}8QedJMKPN&U`4LfxZ%vr%*DCuV}Enb+)&+k7Y*HI7fACYUlJt^q7 zJHe4BQX0v!%Ok_@#A8Vz&PhRJp%8yaB5Z5=4#|&Wj1Yz6^H0|p8L_cBp{<2OqPqGy zW*xw~k#Ak%#=G9Tg_W_N`_COcrU;;^&J!<{rcGYh-g-7SQs3C(SQa8~s>vk-zFn=f z>v1(H&E0waTE9ETP)euSdYU~jaA)6x)eXg8V#Zh8!L1;6>Tc~mtqLB*IaS~#$#3W& zWNugt%WeM4Agl;1ZYZf3QO&GY|5X)Tw_CrsxN}H%X+4MUi~df|5#b&_(z{r_09*kaKSw3lZ;QQX>;?8SSj__xa_CO}g_AvsZiibLFW>N%H_k1w__&C~L- zs8Y|#0ELUtu&gAG@3Vemdo!iM2b5}W%~pFeUy&Q5;tzO<-?pFT{e@D7^x-SW7UA+5 zQXYlJYE1v1Owa$(oSxQA9e#F)Fc<6ypmE*cyVlQ>`mO=EgE$ z)UA{VvZ}RdjW;VxN_DwEoeJa@y!`yB(S9@GA`SwV~!+BIsft6)EQVaJr4@* zQ0`<}eCawkEhrwRib)R0_=KCfSnhE3^P!oFMe#8~@i^y@opC|%SYsE0EB~a3;u?c3HkrvG8Y7UmuVZMzKZAWK_)?bp`?SWt&EMUG=`roo9~zO&A>=09%f=ZD z5ynp7yBn@yu{g1h1AibXlpyC(x4yXF0mJlyY@#tf=-(v}LK3A+i7onG)Ya$$|0eL+ z61wGMCf_#p`M1Rktg?Ufxn(+W5bYo#Q;{o zE?+h^6X&iSwg0c3p%5f%1v0g74Kxs>u0;;PPDfiBB=zSmV;pxe0Z*9*fNtNrVUu>=tf8j1GXC;?hVEwN5pZkctvaPsHG2nTxz{NlM z2IYC7QZ5Fxf4fE-vi~F@!MVLDAvxO5U@UR=vNFvJE3vjNs;CGpDe<;kWo0EN$eAr+ zEGaG)*Cvfs-@ZiM*x4ImHqEgqZ|CF?W2sYxv$`ssRnXaBD=#bgBUf-cLyY_=*qNVz z4omgf7=(BG0E0tt@l~(nj38}TJjfKLAe4p?l1eP<)gjxYB8eO6P5{6mZ}1{~?5+bu z-mX{!0JnXAwgB=2nJou>yAM&zgXN&0;JO?K-s*Ub`fP?RT=MSeQ@ISWj*jGliPr!a468 zZu~18qX-rH0}J9$pa*pFNkg*5dV~{~s^YPRuVgf6_6~KCXdv2~QiDyn^z=OBYcmPb z{c=l8;>NzSm<%UTrgG!wLN=kX&-nGZ!i}pU9u6MIEP46hynJAjfo+?GUw_lJ`;9%b zBtp!Bph0qlSs!=~SIFj|)mp%ON`*y+@{1L$X$&a2;%v9rDfH>^Qo%~V+uXv-V(jBz zMWqSH#_ICDUjN0}LnUwI@xu}&OIksWiu{!mh3b@gl_Gn~0()jQnJdh;IzbqHv+r?R zVR4frvzfft*L8IDxk<^wN4iLgWX3;3p^e)qu(DuWNZfuEe(+Dq#cfIZxMrm_aWq&6 zIrD4~3(15blAb?|Z= z1J9#S5EVxeqd_D+^V@2GGiY z`aj=wm_Ep$1l2(@=#@}ZFPPwZjCFJ(ztH5EWjl+$<)Sx9I(LEPuK;(u)MJ&TV)?^!RXUk3B8g z=?3?(PDdg$`Ky!n6U1#n6d$Pp$HZe@<+ zvTcapriu#Hs(2{9qC5)H4Q^@^sO^L$3&0QdX`wdv&`JJW%z)^6H+bfRE1{W(Etd5gX;4M! zLuNbj0r(HrDoS8sd;O4-FH>+Jsw$#s5=50AU*gz6wgE9H=T!?!1Vly_eqTEUa|`{O zH^Jc}{*a+4qZBL}fzed(OvHb_hBn?KgpS`fuz82#k1U%Db9@bQ*%bKfkp-IjEt#30 zB$kzo_;^1SP_Rnx6X7u)u*dogz-5KZ0cs;jWoqfU(hjE?hQrV4A>VZ|ud+{aee83r zA+O~|05eXVMNMg8)}36Tlbx4Ty8l5s>w%RMR_9ChS1m@|0mJkFvPq^lU*Ra^bdC|~ zuzh^Fd(>5%bmf~Dj1Tf%hlqt`Ulqn+U?=VVrbR)TZqqf(zusXPnD1jH{Ox)=6xPD^2RA za)9VIf;7}8F&4z+7g!f#Lt71KsElG~Pprw}KG~P=z{-cUuG;gt_Zv~^GhWm-`Wt-H z5BbVhD7>>`tAQh;P3@qt^FGOM7=!FkH-$j6+OHKy4uqR#5Mug3mBKXB|!uYG@FHVj!QefH1vPcv9X8lzI=&Zs%yB zjag@YA0g%waIy{6v&ie=t@&<7KREgW!0uSY0T{E| zL3QH1Boo3nDA02$fg|Egfb`vSxu^I<7j89dv~uZc{Zk$ROR~6{h@x45a0M>amwBX( zi^ULc>R;N@kb&u{_=f-W>g8h@A-ItSlX3}cYf|utl~Ed*UaxD}^%6V!lGH%633PMk zEs!BJyzp-eBMQi)iO0+7$OE=41%gkU)?57I*`(=%dnli(PL*6BW)PPnx+%5`4qrE4F(&i)SuOQf13-P$}tYu75{Yl2^2;+^1NB@Rhrpzb;Y)k zl|?iS34A;-gUcm|z+4A0pqs+7!&`+U!w5WBP!y-PYtNlls`5G3k_~7^qk`%whOK5| z7mgKOsA8I0?z8}3W=lrG?UtOX4rO%^O+`hY^VkDvORTVp!pO$PzsHk{j%+0VSVs{P z3br`$Wve=*w9)U1(wRw2EoQ;PtFQa%JF$8G#yx^{2iit;DM}aCWj9v}}EMA*Oxa$NNm`>t#SE7h@o9_Vh_RwJM;8A&a0UoJ@~u4$NeYmGjkRTR@lLj_wSDf*;2lKP2FEgSau`R8F*4idY`*Gr}F zmv@({s;hpG%|a8`i=X+{476sb!QSh<5RYdYN8q14Ml)?bDr*ph6N}WqdhaUF-pv!5m9f7 zh2^0hJA-d|$j4gR$b@&BzZgk4kae8&zAvF?5=XiAEVR6h;%Qa%>zaJA%7yoK5xhYUj*5{fgnyJGVhf#Ie}Fl;3*e ze{}7TXeITW#LLBdi93#yJTvh=W7T}k)7~Qp{$6sWDpaiRYR|o?7Y1{bhkU|N6s9Il zM={&^a^$YVKJ)UKEDDw~-URw^jCtU1_QF|d|VTU=oyxvIfdOtOwHK%+J$Pyu%_TU zI79)lR>#~ASKSzH6D^0c`k?N(X77bVtP)nez27T%(^ z7_yT^Wo}YND#)S>KwrXDELWG?4wv_zTR5uKT8;9<8yAl40OQFZ>UWkHEt^U}t|R%; z>^*fUpCikbzxH?i40Q`3tI`$Rp24tL6Zu2LppjRdADv`rAr_cq$oq)n43$FySR>{9 zL=tZ;O#l&ON5%Cb3!@r?Ys4iYTCK9OG4Q!Gwv(&_3Jb)stCm{f$sgP8d%XnTumGeh zw)IHvF*&Ak_#ieCFTM~Mfo4sLfS^aLOVr@+3z&y|2Y&vD)+NA{>k=BP=IC@xlFaXp zAYS|TN>nC;sVT;(04A2NATSXg4OpT z0ccexjU1+`ZhZKoK1!zkK51nvUMh!m#y?k7z&|ihSGEG^f6Eto4YRs9{M>sL`kkPq z&{9UvZ*&g)@QA~%y_t1r6-9RmY5k$|!P-=g)W_%1FMQ&^wKGoUN`oQpZ!ZY=FeKYk zmi+M^`gj}kZbMrHA>&~91>=2)?{9pl`&yRDs}H#g3_<0roe*ciZ#Jlf8P$Gz%}_|Z z8}hj+1evYHMsB|)nfytHKu>nz<^_^PuA4cGC%!bizC?^7QRq97?YrdMbr}2s!*kUy zM5MeB$cgcU?1#H&NJKC1t?dhY9$?{O#Nl^SYRK%lwvD0(Cjys074)(SUOO;+-Z5lw zP6VCMyha`65zqBq_U8Bx1j0bSWa`uRBe%woG}sv5P@@5K&9rLUo}~BN+y;>#CIVj< zqvTt-v`-FVl3ZjEAEdlGP$=jj8@mTvO7Qk&F%AGyv(Lvq&*Dv7r$d$`6T9rI+MBp; zgVe-7YyOe(#-lSN1RJ1O6{-9tt}kA*W&WQ7rUG&?i7efIl-4Kcsk0Cvvy@L(O}Z&3 zl!onUPK+o{2;MZ6jBBiwoP9C$(3QKwL8XuL5GKgmUUqAw!VM99%fR_l=w=oH{mX@u zhfn4%4+e(ggH$a$dDi#TQ<8~g!SbR;`TVl#i*H_>5-uEdzjqoE%|nYyDt-uJ8>`Y& zb53hW#PE1Ar0@KbkC9eG{0#?TFW;BwBFEle!02N-L5>k}A$~eRM6nYM`PrR@->|#x zk9#D$k2f=P!%c{a(JtFRGB({ymkgLOaT%9)JU>7G z`V{eN%ZCc?KMlK?nw+h2R?F69qEct#$gOk%m8q;gV4V7MmX&L8r@Lk+r5#>%EF`@I zN91*}17g_^H#V|UXr2;`0%Kk5fc3{NWg+QOA;Z?rnP6Kd5h^0{1{D|MxXXn)hIx3jk`pFX)7-SeXC8#wFe zQhAD0wFTm?b5q{(x3gB-y5+Inc{UV^F`*`GcE!G3*@|oD@bia0xw?YysaOqTyhM$r z6+}k_v(a7u6~WHKjEl1F{8a7e6*}ndnWzlO75NPtR1}OwhY{(HArX;2(WPuyClS?} zTRR*fo_gpm7MAlwuO!)u3XGrBMw3|4AzR8WnmUPX(RKAx+_J_5>QA3AhbbK$mHhAj z0`P?d*c|o+ZgMmBV*8IJ)z>z66blzvBoGoHuAAw-*rOk{w1@7EG<7qT2V#{yc^22; z-dYjG@tKFse_hs`M3-*Kf6}XtVmCMOhh6@S^&8P1*2HprNt{Pf6TfzXWu(V|Ry?r;iY{*jg@8u^FHjQ<(p1n)~Alk)%T+;QuvbZ5oXwkRCUrx zr-2%`IG3YD9*7qy_YgPX;>t$szYI=3y>fS7yo$wGfoB#iSyb!(3fB$Em<9%ZYc|qL z!dTtE4fqAQPx_=2v8%r#B!8&1*t`80zr5CN;{&W3_}VJ#rTVt7B=6kP-SBYZO??#J zy;FF+Mk{Wmsy)f8kPXFPAcRia(4xUXfocs)wEAafmY+)U*G{WPMA3y_l7V+xl4Twx z7S#$5eksinmA=f%B`CKT_&~w*gY_>g9Ro?k7lJX^M=2$v@0OA4_Eb`06S88AY!jc} zNBmJ+8;4JDN=-+cM4mk^B~{oa6@Ag5!bwN^!b_4Z%^Pm4eY=nDwf5TU zoQ9J$=QE*vt5q(~o!6Wj&BPO79!$|;5T>8*|5^~D5NzFWY-9b2CD(Om^;CWks3#-N3rHaSrOdLd zGQcXG!>PpO!#DN55SO*?RF20${Uvi;G67oPmT%y zjOA0OqSB8#IK`HE#VzP_&GvT1CQrCFH1=_Z2@D2itx zbo6u#6NbIH3)qycJ}qA=jbHahv?j~xIMYwf4+*jE8Z~Pkb2p^b5KPf}END~HiGAI! z)1Bn47UCa5i(7u1sCBuC*l1i~P6UCz#Y8f@#zMGHt**NR1*48w&Ae{pd-|LfOO%4X zZ<^j*1wNEg&j^F>^hha2ooaYN$(KS${u*5jtoLGHGcli!29#_wh>9&5^V%U zCRpusNN?o0v!U635jTZSS{bAa`!7-_8VwKgh2A)z@6=q@QVu#Lc+NZmvA^MO1LYOx zkHR5oZ~h1J0-kwGE^P+cCaT@LJuixygofb4Y8^(t@=ObD>&b~3QR|xyl?~laZbxbc zfqq?Q=jI$iS1+QeHDo=0m^vHn1&hDh^DF8hjD~+P>Qk%mJK#>zEVMU|4#-;W^UW8f z&rX;()_-*}Ia#AosaY??e@+BbaRbXr`Zzv?Cn6*ZRf6Rz9m{+$_2r|R-x85)l|}x9WTyJH)a)&;I!iPuT+Zzh-Os1m@RTE z#AujprV|3fnc}z}EgGqV9g3V7>%6lebgf0Ve9XF2r+^v?wx~uUV_jWC1DC0^~q}5gxgO`8e53{7Ww({ zwenfd#E-*zC!R+58&_A96J0GWDkNxYc9!e!58j`go7G3!ZaH16V!rKA9hmC@^wf|P zsDC972VaW65P=vZfL+8P^^OO<5C}jK16-{+l_cK(T)Lb70QKP$N~HLwS9Oa4B!L-% z`k$ef7#)5yt^S2$UYW><5JTa0A1^ZZw3?eAlx{Y=pR+{}=Y};t-H}gT`Oeiu zKB2xSaO6(oe+tDVS5+=|iSW_xGLexHj?%cE0@fKJJ-6OX=d!Ki+*NaGO0e%d zE6?p}-JS*hzY?DuV~=e~`CI>~Alc~KT8{b%=g%ZTV^YVZDw?sJuzixrl4OelM2-Ze zqe35NB10d4lM&zFgdfMp+k{;GJ_rXl5;<=p3sJ*63i6H`JTaRMZ{XCH!IQwnIDoti z<`7c8arGMru>@BETV2pv`FAoJj6Bb0@}C=`M3TftF|T`Bf>stfN~yMyg}H+)jKKTq zXhuJn|40I(?~yJ>D+{|ZY9v{&xtfi@C`O-K2fj|Dv2(`@f|MY2cobm<+2KODOR-td znUPA2YVeqFNQd`0dNqd^G<73+AYe-nStp#LwFib?Kpt4A3vSJ)p15cR(E##FZ0ds8 z#yW05BgxsVh!v34s%Yf1S>XwA#1f)$5lOjx217mV@tM}WPDPao1mx^;g3d|XY*zs% z!8EB~tA~$DTCu*%;L1^0a0D5&d^2m$FsCR170-Nl$KhR*74y99=V;QX0C--v&fht? z`=_xN4a79j3#%T@5*e6KVGxmq+53(yI{Y0z70Inaqh6|=yL6}rT_v~#%2C{qK4R@E z$~9a8GT_gQ-EKk?jYlJDB(?!TZ+o3ZBvLQZV|1A+%}X2 z)-{%t+dhq`5RJHEYBKr1oo0VRWO?W%mZg+3Fzsug-e0^G%!fAw9DUWJC$xL^#L0%- z7deO1*w5q9lFI2s>zZahWwMVi5+*tFGn_Dur$g6+>;$fbxBBcK>5@%;1@bL+YsAD5 zz&0t5A^LZcRBujLFfZBc+Ho*)mceryVDiYi%StR7^*bi7vr06*ldR;Ia|DTMgA*j2 zrbYwCIY80hJK=+fj?X(4xP*q#qRZhrTvWbFz(=wCLf7u8QT{3!WX)cPf`33#K%d|( zCT`~>bVq_jQp9PBZ$H}8gU=l;TJ00+T|>I<&n7w>Sg3DpyG*sK_@>7m9-2nH7z{`H z>+;1B|LCahMD|`JdY1Z}A+wUB8Bb{0AkE8CwV2%~;WA9I$7Q0tIgGlvH*mxy?gx&& zps}Da?7F|**J%MvLG4c!acm(LN*(x|CY0hyblhl4sYk9N$&Lj~K>^ske@H&tzQZ^+ zDp0VcR(MpAlrH}$9plHhNZ%f(dZ=TH#BSmAgH(pj7 zn)TMkh+WcbhKpCm@+&(_09V1ed*R!0j87ctA0633$dv-_JLFo4I`G|#)GMSw+P<(I zCQ9HI-nF*MYe1MInAT#BpR%uR_@ep&NSu;-+-d4{Ykom((sYp`nqcsCz%FtZ63Y^3 zR^f09hPhgnz2K+?;*=VLojRy~2wZLVmRzr5?^`hhn-H_vIS?iV8Eq&LQ}zzntVI`e zo%@ajZmq3>t|<-*w^m`=3lf81GSni5#IDt1p}aTerFf?zl?Z~-*r$%gR0&(c7s)M_ z#u$>&C5p0+AvP8a>U`hT8LJWi=`{R{2;yB2jA0709uc}Z4!EdK42Wg`96hup3H#&T6aOt~=1p|IU%*wx_A0o)~g1F#G zv_l|#*J%T3#24U_&RZ+dZ!TgU#9o_iMB&Cl?}8y!oL-T zmiaWOu)zMddN=ZeNl~YXUETbZa7}K|z-mMlTT(~_7f}L#BcDmy0o8(zgpNrg+@5$G zWa_S;V_0*amRD}G@(2NRK%F9@y>}Y>H%E5M4t-}@ zE}aCU8c8Tgiovf%evZE6_ID`piuZ6FMz4vZA%r7sX~eg0j=qMHuNZWE9X;G!h=Jn3 zZIeZd^7&^oR27C&!FCG!r~P(S$g$2Hj`FMh7mu5gl}i zl>rrhqV_Bh`kO6o(yIuAe)@D#Ns$G(1BmB->Gg zR;ospA6W20M8E@FYgy##MHc z>9qCjJcm00V~!N$FJ1LI*n?+3W6fppTKmj`Xe z0UhufXSk^8VQP5|;`MOp!k_(B0ml{s^U;Es53}X9gJ2g!ve}d>o~m~%dnd(^G?yiU z%i;D<{90~Ch}-+md_CN~On)!|jSEQd0ENPVqQ8jf=)F8+5CIWXML*Z~eFv+#u8W4> zDM6bD+`?|iDa(-Nuy1iV(zU^NK^cP{EO|~Iba7`&hqw0f4cOv9o4&u0LjRI3Q;!JY zN+q=S_RgEge#q;7Wm(#``gpoo=RWwI5_}V)frb_DVdE-M8_Rj{ac4B%=J5 zfF#BY*cKNkP2;H>xZEL2V3)8VFq${m<;JI17K~tpzv7C?Y>%X4kiHD-3--dp20MS z8=JKt622N-r4(S%lDzH>SAQeb8ZRZ{1M%fo`|ahoYiXi~v;uiltMwknwE&HpF=g}y9)|0L6Yq37ER>sQ#6 zE?UAXsSnnrFBgz@{U%h7vHC2^$#t`*Xb|{v4F+S%bgRqit4CH3+Tm7XxfG|WUeM_? z#CN$VrR8p_^j(wLx#z=+iaF+A5<)cH;&hJwe9m}j5#(Ag{h~i&!g|d-ObyGO`|R+h zC=YxuvDz8@|B;S)+ZUX!Ka?~E`deM|gQyfm>S-?5!l5oTzqmMZK6U?Mio{$JP-EW` z6AR8Mz*171;HYiq7w5$GDADX9&_7PFtyyb|N&`_DoQL%y%J!Qz@H|YRW%XRt*oPiT#iLSZV-YhT<&7M^=JO&7@yD+2neIT zMUM01VOObkmY8T^_a5vUdcT9g|9Xd1P5f5bwGh$##^5+b?+4i>V36{bT2M6G*8(^LrG6aW^d?R;qW zt;!@1lMx4lJ%DZwQp7aBf?fyxCJXZ9gx~kPred|NYpc`w&4G*|I4Gz$k057 zpq_ke%e=*%W#ek-5tdK|w$+-mt1o(S(R!3T!4 zmmOd@{xdX*;P?B#VsEhvs-3=4%WUF)_-PuF-4@@}TK@fk-u_$f=0}5XlF0wVzgB4e zzx&thz7%f!^RK1UP5AHDX+7Z5R1sz$9k0+ ztrxtLce?~W>}!8Sj~vxi71__BgH5m8QJn4?q}txnVRmM!Kh*nmLXrw#?`MUu|h+gc-OqS>$nA=0w$A-J;?JM^$E0c%&++#k`z{{U2(7$wb~1$ePciMs8aU{UVC_S2+I<1 z%mpD36_W6>)0g_s-?D7~z2nAj3w1Z=~SLGpDfYU3VZx=<1EN=yaVkbhqe zWeM2S=YRWOma?l`EdDTfIAgw&?jJHV^d;K=%Tbom6$0m^Y}qOGm&5Z(iOsejZ6dbk zvEf^k?*56L#o1$|B$d_pk32x`sDHWb=Q`qIT!aa~2Pcmd>pN9Su3xMCid5F$R|7PK zx8A#xjq`t7qE2!NeVLYRm-8=}m(1fTJ`&)|C2x?AQoz*nD=6>2 z`1AB&aJ*~tAz7*@YbIX)WnN$WX$*PW0~9_Ve)%NSq|@8%A73keWlpV&ZdENcz8-ip z#4nsma6~!uI1)K=hI!Y}Iht7qCd?2hu@zNEj8?~-=Cl7}PktV-?;Qw~g1SwMivybhu zZZZpuf-(cJr}Gyb8OeY^_)`QxtW~BM`8^>4G__7rf=w3U#m$vU0QMb5+aO1$e z%>HW64`z3&wv20>NqynZ(%(=jAeAwf(s@VE0k-hZc&2yjm(sg`q}0Nr+6s5a1iA1p z1##ZJndh{BKc#9WGM-fP4{i~N0l0lNn%y@}+9t>gd6<~UW=GsB1~UPk3ELc!GiQv`tapNCsb%?q zj60y78xPw`@DshmyOi0udE@k_51uhud(;LBiUfzD^1dqF%aD5RR|=jsGxecOFvO2X zq(ICGg7l0!PiU`%5lQfG_>BppjKRrLH9e(=gPq$9pdr)5F@0lj@T#kjrKBdIj9@)XUb5nq;i3sY7w_>OEhh$6{kLfSo(x@40foF z{(T&nGl-ytJ>orXQ7$Z$A3SA)zAhaz)$!_0g1|MD53L63j!6MwS|BafT}f4MZ}X^NZ%6?W4VWVza#u^!XWy9i@Zm5g`h!pCcqY4(NDiM0Vo32G>PD|M4W3mJ zw7*70HzYQ9Tt}k5zO=b_!^q!_eTlB+H(D_p{+cy37$5fh_MlAByG5` zgn3Qx2+SsET{Ku-nngDGbOz%=-;w!@Q{l0XTiK5FI(~3p9$N0`eUM8XjInal#u4J9RLBl!Gn zl(15I7ACkfHW$qYyIpb5@f|+fknrG9VZ&6S*GJ4tuBBJ)2qMVRHxWXBVXczT5bZ&s z4rd(YOo)f%EloJEQ~G&U+;NY+Lcp43v-x+A z=3IjWesj&{Tl%gSS{%W2-q`yEHhI%=l?CSP!k>>_ zeE=KJQgMYDwS^A+VgdG9X~aePwPMXL@xqBUIrtkmf5umb5p!b|tV>@Nq9E4g7e(yG zAgFbW)52FjhU>Hw^&aBwvVfqOUakPL+Rg^Y81hhyxW9F>=v^P?BO{oiK4(S`0ji7h z4CZ#^XCM4DlE2_%%xKZM%?cX8MzV1!bOYN)Qsmt)nf+pRpf+oGwSiw@UOCr$&>0KC z<|WGzc6>j9Ug$$ZX{ur$L9|bpBGKR zEHL@3=XE2r;HjNxl3{ODp(Zez?47Ux?Kh!cnGDkR*}|`$iM|{=ob44N)o6W`jAWT^ ze;b%HVYpc?`;H-yb!uIm<-7GxmlfMI1yo}uJ=e;Sz@%|tRH=qHMwhK$!>qc+q5cO# zSA9uER+P5hUfxDkB;mDef-CVcNA{cxve?|FQEUF9O%b2Ow9=8|yj9@BKD$%Aj$9#M zO&`x9qe@8>Wh4s&P9Hzqw(kF?3jO@QRiPajvr(5wdfXJtzwA2vQ^ET?nl1?~OR?6; z(Bu-?W6PSG*}u}~UocmB<$&8r-ndg?Kr@kgw?@Tk2z!6fx_$L#oqXPl{;1`ASThLAH zI+Ci(c<{rkj|;-peU0je9hzG%&JMAh=vjl`?#ce;@wdephTNDYqtOfzzvkJZh}SoQ zWj1DwX$s@NW-*T{ksF$>L)ATj)rAihd?{J5()cg zD2TNlf~@+pc3SjC0v!QavyAY~w5YzXU}m$~pRpRcz9{2ItwNntU(4yD+lWfjtHU|Z zz@upe6nj_Npe?0Uol~}C2LoJV6-A8vkICl|C#iMS=Gf*e3*|=?7-m`wiam*1w|~gW z!f)7S_npHEerxD2t=C7wo`~K9Gh39mV%sMVV3sy;P<_kb99O;)0~#I6(y5j4f#d4JGCI# zy-P=&`Rz{WIQhL%@!(Ra7vB|G?t7(5zS zx({u-BH2)JlEfyDWq%ZB0hs2wP3nYHPUchEs!rJt(os}U-o{C=;;ty3>1ZzbsUy=y z;_l^%fBlc`ngNnzwO2dj`|2=`X*sbMwruXB!KA+U^N#D0ze}F9z!WR&32xY3RkTK7 zYzpuU_%O~7IB2)4Y;|87KIb-Bu5)a{gW)9GxKG``^K8p*Er2d4e5UmWm1mu3-hq90 z|KN#-khFb|@G?%;68N~xy9zIf3(U;KOM@;!m+tr4v2k_t^Z}G@e@vJNp5EOcCdZ=% zus$Y6T(V-yW#+qxa|M6JA1uV!S4YxA2>E`6=5O7&b`E0cB@4!-RBYw(CVKO@2Ma%W z=GsntS^3(@P5bD_E}L0Qj zQBwpN-ebR{wvY38iGPt(Z@6unDU=ICN$qUlFGcBgf^EuZYVJhooKB5-Hf?^AM%3BP zR#OKzf$FA>1FXo!R|i3-VdWEgtK-vS$_TK?X0W#$$KVD zrNp}r30VF=57umd7YjHQFX9xA;Kv8mzQAjK6XGnonL4YrV7u2I zA?ETyGkBeD26&-eCse-M#y?&1!S3I9`hbvf;R4rhkj%uYb0H!>@$g%Z&s;4ot98VM zFcjcr>dF^W3OfL90dB~!KbkrJjx-xn~+T=N@@ddh~ z@!*;BS8%1CEVEP7`H7#^*y3vvNt-Wkre4FxOrJY*DE-9snX4DbqtmaRvE`JA=XOHy znOYFrtzSn9_{HIXSEZ?f5JhX zKk0#aw?!^0PzD~v@;??ABJjPAiqy;jQNe}@X}xUMcj_wnq(6bzOW{CIjtTIpW&VA( zhWKYxD}7nPmw(-Czya3b5-*2E%D>NA3j<%IrLU3=^!X>qi4pd0)8;yA=$4)~VX)RR z#Ki69!J;Y$ccJKC@0#?w1A+>_;q>oI$hm7C}4 z0jGd~h@fB2qW$tT-|KX^X!FKem>g*F`>!vtZ=*9)3at+*diJ~29QRA5wmKm9kVwUOkw*Ahylx} znJ-WMi1AKN&)C4MGH1f(f`-& zD7J{yRZU{7uSSV>{rZK;qOilwWD)+jU%xx2mPLtYSfhy ztQp<;Wz-_48k$+G$y5dV7{Z(&PofnE?ebX5U^%#|KIyvC%Ty_YHStqlc~ZjVc8+l~ zS$ojt#L|`wcuWsyOI~!__k1B%o}gE%eR0EK4NVory4j6AbJ&eCIc0>lGWl*lEgh^^ zaBBX_7v0!Df{QvfbjxOgt!s`yE6i9Q*?BUk-`=~VizjMYX{}qgI#vJv=p=49!BW4< z@3~iWZ2zsIvU207(S53bEgRSfXs~y$)E?c>45g3G8}?L(H0$#{5c+oDx|PbuaddgdZDo{5x3Fz&a{PcKsLx@^7+U3|yG+jR?ndAr$A5G` zz;xf=;ZKr8KfW8>oUas3A&6EtM+HK|Di*v`^fQ(|gMg>H>A0kWlX6-dHo67}eE@b@ zYbyh~v1M(O5@9@!3;YIJl{=g$*^@ zZJNav+hnIG1NV93j>KgpA-PEyh`w8gfi3df;pfX8jd+`&2#@%JUQ3rqet2bMTsV5+ zmJR!{_8JjL1a+>Kx>xusnFE6ZNVPV-*o4lDnn`nl0x0l1i6(}BgmaPI`!Yy>4B!~( ziIK*>krp89OTn#g)zCShtH@BS!Y7Q0J4c+J&_V>-YzFC#Jy`hlctGlI%8$Od+=8H^w;I>^^rtOX# zPdJw~^>m!MK+B|iuW^=`!37mW&s3S$m_5Vb3%Ac+o_C`nEm z_TOBqL^VqDe3-NtQvkwd2k3OnC!0`m_3H|cz`?5hJ0FLN{fI{Ar-l2Fgyj~Q1PJ#) zR@~Ii&aIcw7XEW=t!f5%bl7+?Oj*sEI+z`G z!I#%u3`!5#zx||KT*S|H38}89**TDZe@1>XXK*8AURiO)wS$l5q8iui5SmLvE_pBC zBv!@JKG#B_n$gDd5=Orw!g#Bp^GUWUmaAW`bn4Npd2?=I@{#wg!{luuxf-wc{VI}E z$@DQGSZ@2f(yVk591#9x>ybCl&vn1fWbH=7xYJo)K1siHY1sCm<>$oTuir_TLIF%7 z>QbB$poI-<6C(SW>w)NTQ+)wI$^Y?Il<&_FJ>F7aQwD|tTSge)`KS^=6%;nuyOIol z!lz2-r?t-3elnaapRX zkTGudC}Ra5sY##jTSEw{TYm9=gYmeLC>>tez@D4nZ4mga9)7aR;N%>>BP z0v!Z6f#(bNYGzgn|A)|S^Z-R@edndA@egK~MFAu|iA>QfdV%CNOOl^a&(*6F{bKsG z)E#)LDIcKs()B;BkPR4Ps*@gHJ6e4HN$?B{}vV-DH8h2e*;d{m%OMS^J>OSy!>-@s^T;d=YA(C3IYzL2Gni#f%QH9{GM zuAN)J>*G1Tp8JXjpJys&u`)FjB%dWO!a=5_>Xr!dV;rf!xifXaef&_O8nYnYDx+E& zspKrrHbn>Uqcri)TOY_?oy0D_l^S7tcjWSY^LOu{dUZmf9U!=iXDnk=x1C8AgdgPG zpx#MLM#zv6Q1*`8v4EGBisUQ{o-sy?GoFYxkdM|j7OHE#w8`Gs30zDh z6l2-^vLYGzVt}JXCM83REAz2jhyn4|3Ih$t#6`>S4NLtGWkrvvv2dQo`U1l_onRZg zJk4tG7xn?NGN{*Li#~jjfEtW-x=5yjoGIbsf>`6zm15CVq9QAc^SzqT%IFTt0;d+| z+EJ}%T9jhM?_mP%?#bU08&$|fajQ$kZ?^H{_;;1}9pF=MWs>>`qw z6Y#NSigo2;L`NK+3CGm>$NY^hLb;?b`d(Y1a2v6HWkBp0Q?O|;(5>~V(t9AzaeYWO zm2F;t!x~7msWxX+Pf-oxmS;<6n+?vbAaW#0`P3ov{3g&>%dGZ&=K6}$ zC}FaYG-`Ig*Gpwpb(a=vJ}GF~*!|sLpM2ivzU^Z*)~vyi;Q|t#FyYzn2aTRSBG-x9 z8~mP+gu6cp!=sNfgA>Xr1Ry!XTBGLhRgXDf(33i?Z_}|L@b`*sx6HP9Xu%a{$}u&= zy*yYeioYM`6vdMuC`A#@>94uS7lsipl}3jUo83nZnbw_739=b*d24`2%bRdlb5f1}EZlq6=&c*zvp?@2S=C;Pxi?{)x~DgH zRkv5V-~;<80Gii!IJ~BeBR{*U4P@a(9Eyl@emL&BGiDgwkYg~2K;j>=KVjQbMVAoH zX9w9`8+qseW(t=9$|hU>I1Fw9G#jRO=d&$yor!V{F87tQHDzoWD29F1X@UG#W1qdy z7f}CT*l}2L*6w%*JOL3C;dy#u_*R-jGxl}!T+qJ9D5m89? zwR@lQdm0d6n(G(n$;KF6R`nk4(D0w>)6b>CnzT`!i-;?DkV7uG;`PWhF366_LDQ!+ z)M(ufGAeaQVZw3hcJ`}?sdKvb7FDfn#_jYZ(K1k`E5 zn;e@Pcnj6was_KiD_R*H+=6KR0xeQzr1;%mdyl$rGS#@q;Tu>@2A{>X%zi@QlwnSZ zwaF4(!|NB8+L}4r+8R{k`jk{e=6aDDYo6m)sQ~j2bcyF3MB0hPh-%vZAEq&Nx z9pFYr7=rD?k~0uf~0% z@F|@OP3q~2Z|hbJs? zzyThbS zz~rA)8c|JLh-04CT|mccS>$k$q@^@dT~BB^WmBNR{!{$;dOpCbHM*ySOKyBNPGWK? zLMH18VtS9i5EN;WKDd|Bm(cGv?=$Da$tqV}=7qc8*e%=nX1cvKd-$nw2EAM#EB*u7 z=stS6U36nmg2@nGUF1+cZTk#aO#N0M1w)Wk+M;2Br1)hTC8Q%4vd9x@Y^8-W*6I=! zx3D7|c0nRg@|#BrSPkEO(5sg$pev#}YD(DtiGVN?rFVU!#q+1&za;Zm@+BdSj@8V2 zK|dksmwEicrSe~rxfK19kP?wqzc4E-;AtQs&9+0!VYx>rImIb-)AjKnG}}imhIZRJ zHtf53sE|eW7X~fF%xac26}WwUvvcie{Z&kb26jhGXl2S#ZnY{k@KqGmkL^>Tw{kRz z)Zs`F!VQ=LD7yIRbYDSIe8RV3JcG1hQ7Otvy9yFlzeIcO6TNbYVnLdyGh=iJSQ*p_aL?R(iNf@!7lp z`D>D#V2gik6a`%V9&;?M+iy2q6HExxKARD{ul@_}`4iktyEZ9{Zgn}uqztIN!SkN$ zdk#=xaXac@Qyp0pdE=X1_?tfT3^i4%s=GLww1R7`PH$dQe9qznCYXY(kvu`HX_ZDK z-~?Q;RjB3f<}b3e4M_y4|)01hTS1M`lC(Haid($a(F}T z+4~KmA3ud7@xIL)xND)8cJmgQ{DUKtNsP(4WxrX>Wu5r9?Fp64NY7W{xUjwFnM($r zNO?{;t&Akh<;I!j{w}zzDaZ0z_Ae{L1K#2P2=EA?RdVBrU)c15`sTaq7BC(#i`6G)9)p{^s9k+jtKwIH??BYn|ObHXTy&I78v+&6YnAue) z*Nx&2n1ISEy=|dixY<7YVSgu#{oUZZEp;Py*Y@5N>RDv6BZompgWjowX&|`_@!>Uv zn;^Eb?jj2H#2?a8k{6{2bkkz_u5f`ZT^liCz)1=>I%Nr!poLnW$XjCb+@vYzhM?&O zF72Z{;iN?8S(Y>UY1!4gd26w=F`lDWBuZGjwkoG3SFFOw z01yAs{)X-U4&b`2;z9+fA3za?zMka0tqENgA9QU4q!!`0PH^hfm&koF1cQ;fWOyGw zPrFkkqSP22FTIKKFJUyKeRIadeixARm~#ZdOJ1z8Yhn%bL=TO-5oZF_PP`Xk3pHyL z%F(s`$cS<`>_bb-;tBR@IVCKCEiwA$gLi*_1Dn)}^yGGZ$$y$k#9*H|vXKMXakbC< zrT@ygUor-Jx*a_w{&mHkkrkc+>(d#3EN_{mIXx95-9>eOl3TOHnI(WW#z=ebqk;pD zx7P{Wb4>J~EBg;1lg~h2LHv`*a1YRbVem8`NfK@DD=>*(HAYX}K8o)k+P>D3O0p+4 zhl`UsKMdTw#+drxop5lNS}g%oB$4266{IPpM$TN{KEl}ClM3Luy>mn6KHM?N&ZI@W zCXxW#3?mi(%^$1$TF~pFMMRruZZ(QAiv9fa8G&u?S+(>g&FV^|`=)G`GP)qmiHNk2 zVJx21P5{2apu05c*~^I2t{SoZ%uzwQPH7}#fz8*^(QH&lT4Km%47Kc_K-`Np-?Q`+Y) zpViv3FifbGxXo9z^i#rdL#WvNX7X- zxwRX#t16F!9+mo^pvn6(?`X;@xxj-|usSa)3j-lOyX-&waCs3l3Gxc${S-k;4Xf8k)&U{(@#9#NpQ zY~}i*GwxK7Jdh};IqsC5_-5OLnd76Vs8RxY5ofU=&Ll)L(QCq4ld-Om58>XZBB7A` zbFr-gI}PkhGfSUwv968x`f&QI*P}X$e4)p3f&XbE8G11%mY)O1SZP&V(xH=M^$Fm=G|ESPXb#wU` zUiUjCbA4Ix*i{`;hhElVd2iP+{L`jLJLyVq`|-ynAQXSZOGZzt=WI<%7&0ETr7X*= zIKbw!Qp!%Z8a5JKS#`KQkNJp`WWxIX4Q=)>Qafgl+h_iWw(=0{=8#sbOiXEN+vlxV zS1*fb;>^6>1&@5V>AY$3F)2pEOuB=d!~Q3XO|+&U^O0#BDL4NxINM?B@Scrj;kA;3TIOn*cz00H*k7Si`<4yLXJIa06FXyn3=K`^EBH5aI7kx#*Tf|x$CKojA zu7<<7U?jGuHrIJ(VH0foI}Lb?;!-Jxg?L<%({_Yd4Ra|5y>XB0n@0 z8|gvqd;Ujtmd)&}V0Pp!fD}tF>xHvJ_Mnt&qW^QldhbCAC>pJ4@{1dSW~ z4a!sOHWy2Fahg)gl63l3T3$}wD<~e6rg56AW)z0J?fXBhUBy~QyWZmL&*&{e7@SgQ#Rp%yvNH7I3$bB zMc-_8B_t+H=o0y2YMNtgXt;j)B+A0U%9zHwe(lK_mm~tCerUSco;AU_zM*79X;sMu zk5HGQ1u|qUAB&;uv1Xu&CggZ+msbNY=L>+zKR5MOXXz4ThIA6MgLc~1(v7)DV`B~C z(WQ;qwlBJ5zNkvOKT8}~^CU{9{pg&#f8TBKMao6ZY;$^P0-`-+!GReEzi2HqLe$r+ z}CP_6#*Fm?==dy!h|e427Q`M}Zra5wvADvA@U>rQ-vqJ zQ{SDA$U-`^SSlOHXLDZhCu+AO9=txJGd@m&_^`DQ=N}QwtqAfB-Y)*ny8zl8VKVd! zDZvHTc;8c8#A?vd&hXoR;qz$ksZ|^oH0ojwC5lu0_;JR^?cq+$n~$myDmkEX(!@zy z@6aEKWn6xEnN?Ai_=A8C$Nu#EQ&ZNX!^+|Z*=}Y;%$!?I#}Yw%&g@U$u>7ZAh?KK> zOH0lg1}<*?P<6V5u@&jpi(6}{OqT}?HF$SDi!TzLW&#A++*al>zma)=$TAKLUIuj; z8o4p}X%U%r*ll_nJWTd>SmNK{!<2~N51akOR3k|{PWe>$=bM3x<(RK?_r9*8gakB5 zO<-WJ2*1@UKsM9QLYE)g!4Mn+=`5lf8P>O?qAAoP)^K$}LkFIn9|-w~ z{G$cW3i|C0TRx}?8vtJGZ?(<+A(GGm+OY*L`PS6s!ls5-%k-JD_gXmZa-Bgp0)w3S zyU*L#4hi0FM*EI3SUp4c+}vD;TGy~Ump4HhZ|4TK0#iGUSa@;7PFgt0aLq_*RS9qZb30UMoLCCiY}}uK3XdA zD8ngQ=WVGbWw2c5SjJC#xo&)c{0i=j|sMCIcMlC`c_OB%S3FRJ%(wLdz5?H*Rw&0@X zDe9}owteo>c8kgomQdfW6d6$a2pCwwf z11@Y7^6|&DYsTa3j3ZC^!~lWrnE*4Qq7C_UuHU!gTBir(d}bx$a3O@t5an;uPBuf* z#qjQt_ZE?p3K(wQ@WFYo&rI=m@GvcmJ>yKrIO*=vAMp6E9(i^OZ8diqT@Q=>9p?-@ z?Vm<{<)ia`5?hq_*K`qV9jbnmA*jJ~kVnYC*HKZ!LS8r#rNRuyf9#AH*2A$jaMg0+ zKPCqYtTu>{&Vus4a(Lj26i<9JU-ggl{U1*PMFq5g6-(J?=iAcrDK$N*wXKv)!~N=# zg61%x0Sq_GOZxhY6W7h~Zbr?L`=U2fXPMaLFbTO6&*x)Fq`t3S*`iW`=B>q7*}*qk zNqWY6Y2*UDnGXwN4G zlJpb&Pf;B!ypi_{y!)4)W^I$>$6~LZgBuJAl?i-ZpWO3Q{`IR0^<@_Ys$&0FVt~B# zYuH|~5a6Id)dmlsuM3F9H2+BZPhO1Cjr1jMhGr9$58I~gnf@!FlqcHp=U2}N52krV zcyZIqW!5t>XAE5L7)GmJ>J__Tt=Bz8_jEOS4R<;BGQ73oPM1c(xV|vk@UBD;Z;Jka zE}3AHJZ4?kn-{>VaLs}N^(@EEsUk=nYE)PKrsyV|p3Q+4&%|UuqkLl|TM4|M-+h*B zx1CgcV(s^NwG%PO9)!7CE6Wodqa~Rx)Pm$Ff(s{~c0(cZ1?7Qc_K`M6Y1mJy=t2O% zR;wf@Lg>(yIga%Qq@8xF=vy0Kz2t{z@Ry9PbK6ICea@o_XI+vfLH+)BZ66aWBc)~h zYT8Z$!u4z9fBRgW@s?Td7l`J+Wn2BXqCB+w-~IB_&IeXynF!X|nM_&`v>Kv6A-HL>^)*Fz+kyU7%H|WTj+n=L z87pc`7$r_~l!s~}WFHm^n}K{+^g*whqkZu&=62xG|Es;X3acs%w?+jPDJdW&At@jd zl8f#J2?r$cf4a} zlcrU)CS`aA8&$4acjT^~=*;%^)+zg?8+1roqi zkeKoyJ?Ll{RUJ|M^3-UVOh=?gHLneQn#`6p3sPHF^=Ihcy2u!o~ zPl0m;VjrU?cLZXJ!)J9Yd{Ow)(W+H1Z>_r~NgE-2c>Ad*BF^_g#r9)7W@tfX8SLu* zT`5xI6|u{xux%yGU0yFfQZAwT7I=CE;-vG@py>(m^l9kMA1ZPlCIqZg8K@OLW35ff zr+R^AQVhP8uyP{p{9fuH*bh704Pr~Firgn0=;?rnb*}Ox84UVO&UuzhFys(Ad|4J* zlw%KWeQhXncrE;87H@n;@DpFUL5zc63~jzW3H-$FM@B?X;=A9<8DcjdlH@W)ddpZ( zkTeOMK{(!5WbJLml+M@|{ZBP50tm#PKxy#LFQ{?bhqy6-w}yobq(OFeuG%NL;A=0? z$lH93EqiFcBHUUhRlfR_M&UFO@)5k3r*3q=YmiA;Q@J9n2P?B+LJ`8*0;@r=#U?#{ z#Y$(xLV!?(wnvHE(IsI@hQ&FOIVk{}pKj$XP|}vCFiC)T%;oUxd&A$p0(K##kTXt1 z>}|j7vkV#zkBsTMG1dh)9=9hHU}mEwsAWc$W2qyWZkE11`*6d0KP$HtXE$RMtUUHk z@z`%S?r=j$t4u~4>rbk#A_K2g1`!R(>ls-Uga{vgSnPY)**#HZ({jvFMjNzg=gg)$ zVPRqN>k+L-gYH+AJKr^p9TfN6xgaS9;I^FvX^>HT+rQ{_f!V_!Z; zvHm#U$-GuKmqDxe#2x)5$LzI+#33xvK@ZbUt5XRfA z?Hf0f@=4{tn8Ft*zedAnEo*-jYrp~xle~`zeg#zL`gw@Gp_>J+R5W71e9H8*HdZLh zYMKIPqIohQ5(26YQY?WRoAPx}IXSiFwT)fGR< z>eP+tmv%qA)O*KMsqOlWOui#QUc)>p9lU>fT)Lx&L;+_yNal_J>WP+%gnOlo?_eJY zlCEJr;f&Fu-Wn|NmeczgB%=hEq~bVydnet9>F)FSLSKNcuYKI5U$ePBXlt;k$c!XJQ#Uhcm|e_)HBCrKy2MkvR`08njn5 zu;abD^U{RyRkDc(U29tnwsMNa&#=vVIPSqW<+0P>p<8(~A}onz!T<|#O)$bFs6zIK z6qm^~2A^=)4Ci%rG|Ba($}Ngj1%Hz~UlohIeEf!bSXryqYn{#)`s2VTrK`VyL;>TT z6h_`pdR6wsX|=8cN@4^u0a#kB(u!`LyHtJC(IZLkj1QVa44;Z3T#91 zH?D*GwoR9bZfmUZUG?6W=$A|Ktx9=!LeH04UNP zu9zYZE>HhCY?rYNwqB?(_HlM&Q&x?>UYTOzch#W**>!5P!(cM590n1W#uXR2{_1fD zzc)W9Hpw^y%$c1oHuFjMzAEH~L+oS)Q%pt^PBg0%X$P+!%=4mU++E(oXP+m_PSF*n zbywLl;AW+LLe~u-UvY#dg!^-MuomY5JjQm9M_ARBs0zmu98lwLf_Y0C@V+fmXLv=+ zGRjKuBx++x6kEjPkf6xwIGN*@`(mUtfmN*yo9<`7uk`IxPv2z$d$~Xa%=upbO$}a& zfVbR}2b1bOW$DGGPB2Em(*+*vo$->+dQppu7HHWUwi4LTUZkC(3_cRg!+&^Z4e+FN zUgG}##}bW#ZceY?!a!*Y+g(B*W69+AMjRg)XyQqJECOD({o6=bW?CI?Tfw^JFaMnG zWsREjWzGX>b!9kzN&0NJFw=37-NXCmy6`AB!o&8s*8sr3k*96mn2?hK5>}hnAm=Hb z`)&2xv*kqNqUqP_K=$hMIsPAt+X6*#|39In0v^xFVv^+_it7tl%6}!wHlEiE<;S>C z-Ib&6tA;mTmx)73vpyLjS#By1`Mw8MB?Ax(iNFs!34?qTB&i9PklF{!aBV>sCl{%} zK)uTNDxJ$6+`%a*puFP*YFvv)%Xb&+S-BO+m=We~q-3lL<2}P|jSUV4)ZE^9*l@n0_me%@)m^5tL#m@agu~u~rhJ56>|Ke=9J14h< z_AiSl2nn)ydb});^13Gr%4QvSfXIjq^*o*QeU}+2H1skYPjvRQR&fmTWWDfngYC}2 z3AjWn0K2d2eI zm(oub+ktCj0C!D#Es_(99gp#qLTkv-z>_Yp1+s`;Zzo!+Dagr6Spfi=>B!`5Y@`Qu z$A*R<2|iY;+K~EG?%U}RwI;=0x*UyR2nM>s&1I`8j&q4KM~jiN(}uadQu)wO|30J#)kztSDYbv<^>j!>0)x%Kk_v8#0H zfkE>Z#)0x)>tfC;#nVvjAw6v#zTF*M>-?M>3*GPkszGCcto&Xsrx`p$?7{8mQIXF> zVU#oSI%7)BW7856`FVKOi0Y?kTrxD>+V3}DRolf)g(@Z%yf=Mx*o17 z>tEH|-e>o%GZfz$yU)41&ROtMZOn}ogr^S2oi)|t*}gQCr%Gj%L=Cmq2(ufhBd06! zi0gf)8CPLB7N}#QB$-9exab+3b3TmPMlK zL&)K`a;+s*1B}f4<^YjJ4RBF?vmS=ZY5Y@<5+cn7waoJ%{Zps$@_^G!qK99X++qB|29%)#Io|~pFT1!9P(VTMohV!b?q&_ox^Ad7PE)?Uz)sG6}h}>D(P&5oAUi+7x|DZ81DgnK zmpC@L;X99=>f=Ayk{4#Sp^pC6y`zq|>QaCt=mWaY0DvIg3JlyKYGn#stBUJ=dSDDlyM7@}C{$S5i9 z=f6#@H%Qed$|L1Nc~KiX-`Qz8QxBOOoh>xC+;d3>sZ|aOmE^WonyBimG!sKg-gKc< zsyW^%sH;i$4-dD#Y36x#Y@%ahf3;Z69rftAp1S_hyt1W=;vO-`?tmECYFNd@S(!RV zkOe~2F|vUhEFCcP2-tfM9%T($%RQpAQ3tlgWql5z>R))G1gYAwo1f=ZaZf5c!S)4S z&KagSnDoh3J4W2J$iez!ouPGoXt7-r!q3O>6|qVFdmRT<9OI*NPXcyZGnb9VT3mzU zuVm%b_V2=`LMzy?KK4*umz>(?#s)SAXo4dv_;GM%wvA6o119 zjZH+v`uvad7!NVA{3Etht7`8XhAI~u@nisojSrBB0KRC{5u|;8W%Cl}%~A19;g``l zJA8+cjr&{V?P9OX+uNH(-#R9|v~XL8;$-{NE9H?8rH^cKFAm>xvI9+r{D1~*<8zvs zE7`KBX13npcX9;X>8zF&g|3l~2?HLnCW{(sUpU{=Z*wk9!rpui0AL_gd{}oHIn~h$ zuf>WxpMv%f@s@ze;r{iEp!?-tA?vxejF%QGz$=1xLWmG8iM`gkDh3mmeUp_B#^fhW<6aqa!1RD8^mmwO_m9&0-vh(R4P0m>GI<&x=>VkbLTD~A(OKB@FS0lS z7s@35Sd#tMY~_KvsI4$aKH~39t{xy&UkSfAwr=AvUk$Lh>bB{;OQ>0XBV6+Z3ttyH zz;Up;p3Bsv@sov^C?a zRMz{;fH9@x?T^Jq4^@)XGMo6Hyk75}o}7h0^d|hKAswWW6_-j#5^Jv!Ci1Ih) z*iZv^%HjJH2*^%+OqurKKuqT2`{p@>G23@KCOxMef=HOL61%(EA~s*G`PUIfLcdK1 z=E1W3fWD5=_;dOF0|b>c4ukzFNc^PY=C=BvZ1r9}Yx~;BaOP3DEOU@_5xX5x|Hg;l z+%nNla$O?dN?)D58>8iffqSL$D zcN+C0n7NU+GM^(fjkF4e9)svDUS5+quaGsQBn)UO$3SAPskRJb8{Z121_tuQgA8cf z;<>r7X5BEAe!7Y(!8cOl_-F$UmJi3JqlbhvZ-~QgbW7jj7w^8LO zviy;{{GRzHJ-}r1zIm*FuknHJ*x<**l8y$cm*02n%QX{vv)0|g=AF<-&WDP`P{b=x zCHqr;T>{eDSbjR@fcSD~h1=I{CglQ2XhtOpLfGTnKDx`X&=Vzk3bkftjM3!x5XGQz z*|J_Qz_YF*Y|U(a8?>7z;v4rL@wkF9F52BxMX#eYnikDh(MsAXnLeUnvbA`)>%mvk zNWIj{rc6qOl4h`u^wuRL!edSbp|bg6Rx3SP!-+JPHVvE-6>!HyTlDCVjQ?SEPhYub z^Es9~>PWB2Ovx?`o5e_@|9C*_Ifv#$zwN?HjqlljdjOz|}+Xs2glf~oZRYu2dNkdGyuqut$sULljpmhA|;sp^4ax7W8&#Gj8Md;V8v z@d7U0UOV{-ugeE?&a?yb2CsS#rvweVGbM=q^DvsZ?BmPN4!&#Fwz2OnywaMb-8L10 zx(_0sj`{VnibgB5TF;c8y=L0}%1;&u_dC0?A%B!dt*99^Quiy9(t29&9PF#=-@B5> zEVvzPQx){c$3@WK3ATswMvsq+@Mg(4jOO7w* zwKlby51duHY!{L0$YfMg{Qw0L>ZFQ%3kBQnH@-z21-C6){TSku?CgO`{NLUK zad=7tE&V|eC1E<^r62Bl`s1Si%)}u*Qv8x{4WOETUP1VH5pkL4R zI6BiniLK8Tmo}ZT1vn4^RSG5n`lqkSlBE4(3YK!yvlgTzM0gfn-Xw!Y)W^MM&l?6$ zEgE+FJr2pU1A=*EVTOgI@c}h)2L}g(9fK67kyr2jX}v&=OcI8C%FyX!Z)N9CxnK`SJmWg*>im4{A> z4zuQ6=3iWo0pEGLBBq19(h@fmzUWcV&~Mi!4AS3E6)}6&WS(~CJk33a1S=sLADnx> z3N`zX6GX)x+pc*oL1KL*Ws9JSDR()vM!w50@;<*RGU66gxI7M) zS;_2-?ZenyJ}4H+v`?i8r6}5og_2<|&|u-J*Z5bGWZ#$mx{M|njG&*WtV#TNfdA+7 z%jBs%O^!k{%2P_n^m7Bw$*4;5iDvs*7sENu2}M8d0M+N{iXww=p00@Z*QT^LbfJ|^ z8FBmwh|WJY9=pzcqhE$f%@#;5H{wx}7~7(azY!g+edZ)gd$LyvVGJeNGDYW(R|L5t z_$;?_crZ_s9u+&|kJ3dp8lOE@`q%03;X`&9xXw-+;H|$7r%l?P&0P6SeEg%tdoU$v z2J}yC?tNp$JnhA~BQ+;eHNKo}ttrqjath+is&Gvy?c>CXp7(3!w`MHWeTNpe7_jc! z;fmNuZ%FyhRknO{Bc|jy_ZadVA-cj?EX4cV}=e9{@i!943BF zcynm&hHUIBS)A8A>C2_P%VXkDpLtd;Rc3dk@aA}tYxX)p=8@W>fKHc^-#p^kc=~vLfgBL z{J1wqHM6^&zPj84DJ(Sivqz?O`U5KCPzJ6m2uADF>0aRLb9bwT7ydQ&{BF23)ne4U z^gr4nb^3)@(61*81ko9P(U1RnaXKJ`eSj)O+8gBc_|yGzO7%=Bdvr75hfAoy_1lxC zI$%l%7=yLfaUb&l3|JJX)(r%9E}YsP6rWyRJ(NmYD1HP&kI-tNj%W0<+LyDoAl@i1 zX{kbrEDhd5efw;xXV=Rg4|pnfdl!s2j+VtEm^a9ew@Q@c&u-4M#=Pd1PLro~uSe|7 z*RQQEB^&KK3vqFMSYU;NckPP|InBf_IE`i1Sb=dWz{a1Tv$4;SC0GBL$teH;RfZg9 z^sgRmgThfO6;m01Q`Aq`K$5}sb+>egA*mBOqhoaX`Q`gu8AeP?%dUnG2NH~57Xwa; zB((y)GuDqQVTz205#RB^sAB|eU5~)jN6E(jRV&i{W67q_N!r?&wV&<_Yc<}>`mllcOjzw?Vb>e*G@0zN@R

RcvUw)%z$lJ)&n826c13OLOAK8=J@=v#{9+ock=slDga zmb%3Hs0Ym0=Qs6_qsYz|=pm3GjXqSn!ZvogGj_^NZd&Qc@XqNP4M+ruD1ykq+HwDB@! zlC6eycV4o%5ixzIqq;GX#h~SKV86Zu!Inm{aBQ!8YT;Mo@{``xUr(D?M#7C#er++@ zZ><<@q~D^~YVdWwT{r#~h<#DVQg0XyU)WJ>r}%<1{Z8&vwm?n$PzenBk-Bz@aMxzz+PR+42=p8}y+oXTQ0=0e3d|r^E#Fh|hJ$tnZ0x1JV~E`K*ASTNFWaVyKHKIqREwuc^6D{m(mh zUG3a33nrp`o!Zk_d2QYtD3)9;oz2vYP37B)W?@4O47A5!VowPEg&t<+bPM+dzPCM% z(r$HzYL8q2Pqm#Qa0W{ozAgvtdo=Qs_f8%|Jmzf|wKhdHyOm%s$QefyG%;3%HV(m5 zuE}I`VNd%0c7l$`k_eD?I1~X)n|sW%>gba2jz(sgMFPggj<80Suj(zYtFwiJYtTRek?9eOkEG2LcuE6_k3 z6f8iRtY_;;iS1nhYTuHmnHe!i;7Gm8{4DRAD=W`}TWcdGvw!;6Vj= z$;NI%N;Z-vCs5N7375J(L@+BN|1A*jPynar!Im~p@OMcFjbqGWbpPr)9Vi2-EKrF% z_ive}4=ts7zOTR1DEH@=F!#I9AlEr%_I#FuM6fjy#Dx8LY;6u|6g`Yo>0;(ZJQSz$s31(^^ zzn-cgkCTwYkjheS zV1>Yd2Q5^}D!8|O;R+5{t zDK1w81ExU3s!Sm1#l#2c1H^>^KdlxCl`(up14ZOC#1TKqb-}DQX#V{Icp_*o_6qdC za)~?53=Am}J^mw@U&NC{9#HC$9BF;J3i^{oZ_qidf!2S@Ev2gQH>KN}#_MR@k8{-_ z*iyjNCbI2g)DdC}+TCd)r4K01gO-Mr)(%$e3oRx?%%P$Ya^k=sgj{cdx%7cqI>NY% zy(sZlSXMYbgo)eN?dmp!nqgb%LkcuUVkHyuZ(}2Cu`2#oax3QD9MS##CgV6CQa`}~ z=jS_gwCC;y^4XMd+Mpe(wL%G=j3NE`P)zPh;EwAK_kdjgy5Z+ud1U#63TLiZiUwyy zaO6_HEr)H7GwNA!CX9H;_1{N33gvM}Fz-o)5UACFwp0+IN-MiB8e*0aNqt@5ZM1VD zahd8&3AvsXu_JJVS=_QAxdyLc5A>7tsB;O3emSs}AfXaMp%CXTyof`{Kohl$EeWTT;xvlb-8PVFgzJ0RjwO$4FeEe9((V9P@p4H zRzA)~RIU;J!~Z0(GF}vu0WUbkEEPMYjOnKgNUTJgo`7%YIAyAxkSrF^66KS_uQ3%J z@rEoJ#vL(t%AjTer8dENH?}09$I}=}K>Vv#C7Fod%MUFg6t+Ven^`!2XQSs9lSJfx zJLEw$HbaUeWBgy}te8EBe5R$EgN!4JmSl#P$|C~kO^#oHZ-77mI2(eEv6)t&fNd8b2Xa*{)&noCr@tAnqH_^+ z{oYI}itJ>1N5gJ=<+u+oOy?rFJN=^)vDbEanOU;j^Pu=_>H}Qm$`876f9OH*X=iME zAeUZwe|tU9+FW@5a7hL*#awqZb?5$XKG`#@!c4&(x{uBY-M8n+zCXZBdsAsmrEp{K ziWIAkaAI3auG}*l=H!pi7ntpBZ9;FrnfJjP#?tl(sZJq5N{Y)IfM+vojSH3(e>3b3xIlHRT)6^0NDa9 z<@OPk=vHLk)|>oX(vL$oFPUiS?^jiI{|XKe!6wcZsN>d=!0?UUQzX%^YZuZ&$lL?; z$}FxvIabYZf4`#tPpO*J`2>%!1BDZ!ny|;k%+q@~PGf`8w`nihEXQ5^7r|?wGu|ZZ z0et8AE)J|1y;Y2kBOT;)I|LcM^y`jNIOC?gb55&T`6iPIPEHIXw;`wd`(GPg{@>0h z6TJ3&VVg`7OU_YFpJ9}0Ur<-1S!(LRR>OPZX@aUeUR_p2t@v1SlTvu1S?r37sEMUY zFqbdXW)=aRW~aBn6JKH@Dbx@SI}pd-RWDz`WLkqyyP3_uP$RkSFxBZ3+)|3?vnXYhy6^k z5A&Avb>|0eNfnbu_){N(hxNK0cnLdPEh#hd zz_E{MQ@j`HDZto4ZALfBlsszl70nCk=t^M0VseP>Y1g^0Sf$Zlt4(vgZXYsUDAlF} zl$xvr1)f=(3@KA;)`gLbI#zteJN{rj;JZM;lwe+P-5YGS;K-p@>C-Py*iwCLKo$;< zI~#auoVhYek+t=aMEx@bQCU77hD4BG)zKUC{qB|db(Ww%sjDNhjsD-9A5aSTR1ssI zJ`XWbkWEuWAo@I;4_Zunh|F65Ol&*{4qnzE)++z!d~G3biUg3g@5Cx?xio}t#mC-i zi}v(OuDrMkedcgPH7>~VzUFWip)|QK3W-AZD#GOmwBDlt@ePKjiDC-4-`zt_4A^JU zdQmn*H_9WL)r4iTHPY1N#uPjqku#y0ZQSwvqUpjZ7GTeyZ2frTuu(%--_CKFBt)O$ zv8+T2VT;exr)ePod1~kbug5i#Xe0p1K0cw+f<5F2yZoKM)wNeInGCy_$;qM7h6_!;a%#7H|1jR`}L*S7H?#XS%EVnS<54lemDbOBLAUK zxGCFpXyCVFuFx~-$)6YC@z#SFv^gP3t9p={>Q$%7m|<% zfWMSTVN*1CsB|tT>`jpf>=DDm(l6Ar6(&O}e=hN(0&HW*q-535)kHrZo0(x-P!}kvc1-M*tt)&j%aD0O z@u8{mssRhC5z(Y1oo`4qz+4DGO52uiec8nPf_jRuNa4cmP4o7}Gh^^G+(Sw1HS-$8 z(ZvQ;GiuRsXK3f0WVjbXLGC@eg((Wwyl%+lE)r3+!#9;9Lh@r@`KqWx136kJ%RmX- z2=Yt5B)K`c50jSz8@O1l$kbEg>i}(M?W^sQf#E3r4FyvLqj!n62=s6Y3AD9OQRM=9 zOq6zQ0X=b9VUYt4DkX~Yg^~s5P4DJ~gdvO9BXhd{xMBxK0;-)W!P_oyXo9)Jb)5{X zW=eyMus)99O-I>xH8%Yeu|JK$9;F2%(udUz>1vsEZC~WEzWV_g5qQ-^0gtSFcecHR z4C)P?Edi(7#_sVuRQHLhPU!YinH9_1D z319&rmI6@CDkeD|q2!XUCLovG)znp$vd}r|IyIyAn(qoOCE$_)dLadbw2vsgSgjb- zZANgx2%!QVpo>f?5BJ90YJ;IHKc`(pO6N60jAkUO&D~eE{S@B{$E@Fx>9CHKexBID z5t1Cm_xQCnLH8nm8Wr3TOfIE?>tb{d0jD_k`O9 z<_)t8Apo_t7a?haYeZhU!uc>KN%oE$Vo0Zf0DiCx0*ycN$pUq{coI+p0-i*Ty07G6 zyy(bx*PyW7O;;Oh5foe7K6y=lQO;mIua*As5vv}F1mT%PCTEGVPWzkE;~+R; znKfFPU04{JaRzxmDHR3D)g`w0`atd|!3N_at7VUBCvwDK74QV!>PUMt-U$(>xijk9 z{UaYO0?I*U0gI))?|vfc3xS)){_$hFFbM`%@2mUDg4K zDYZ`%10zsJ_|~ z^Gv_z^7 zZvWO!P~|s=Kf5_X;GrmDHCUBLtU$pu}=}S?O>0aV#a+#Y|y5R0M?-A+D zY(3CW|Hcf0l=c*@F~K2;s;7Z@8I4(9d};sOjb$uZDA9IOr8D zQ~x4uuMRt9^6(44v?++)@)x@!0@4PZ#Ev}VXH_p~>l4bbBziG<**%Rl4l`cy+^shB z^F`_Ct^q&0iwpKN%7>{w2=H!Sg1$#1gC#qofQe4A;RKJ!KKvWE6AU0dq1;l>L6DQH+qeTH*!QiHeKtxo^AaO6IxeDf-aQhX~t%1|3SbnfIZ=U(a8Rfwm}2k zbIFVJ+7&_%=?y#@;auQXY#c!+*6+^bHV!TkiUXlQ#0mGar})NmJHEq{77MwV*vMON zFYZJ~#{R-g&w2X-o$8Le7c-(1+J!C8ns@TI+kiY`K%)D+DM zU+lZknBQCSTU(Vej2V5?sDShO1e%Ao=Z(ld97)>kgaU1C`HYNjUUV2o?qsTr82u{j z8~qB_gqK#7PJ^WBdYAug?6+|EHO-f?f0y_I6*v`>NT_7-*yMFF*w|us+&I}$;~9xv zUl(?%ZBd-Ix$p5m0JpX&_x0;1L^j?FQuP-;YA#XJQ4~TY0qZ58u#SM6wFk4!@~ikm zKYevsISB(wn~ly+EP~7oyki@2Y7gF#O%=OA^(CSpQtjEM^LE<9L@80)*I|mS={BK@ z=7z#t3-4-cqGu{ULFKUoxG~!YKJT)EBClKOgAo^7ocC5)Y5AW4nZrcv5La&TjB7i$ z;XJ>)N#?}6=N7Kqs9o>vW!jS2UYX7qg~% zo}LDJUtW10G~_v*v#IVa!rM9ehV#WL4Sbc}ZCrH0Ula}QS$`Gegs#jN!>^r*wJa1I z4)4g*lA7Q<)=rk%ikFvRB{fXjcWl*fpAa4~faJTVq6oB|#WU`b6+&`}Cqj7|@5PhV zej~VEs6uZ7&*v$nckkNhzn`7`VQ2@i#mPRa$IqxnjO#PvVyKLqMy&3w-sn<%kD990 zn!LA*^;zukq`Eew`#LY>JaRCe_C@C?t_%!&3x|On&e)_?dz-Z!94brSIxe-; z)zdnWt8Z;grQN9_E&?^YQ4S>3QLd*LoN5IbYZ5g$R4y? za9WO+TAz^iTpOFtAl<4Y;7`*~_X$Jf?XrhQ3Uy0fy)lJ#eP|UiFtSx2-*q`aJCvku zp-SB!j7f{^-`ubBARbQNB`f(0ra1w75lX7B+6yxSo@L>Ag^cjPMLL>-p@ZrFgdZBi zfjPG!a1p!@`5EX4 z^rY1U^_QAM4`W@G7Z-f#(M^o>iZe`pS1#QGy=%te{;T201JXAG6;71(PM>5u^5_8UOmhD|2Zem6~*9JfKzP>+4Q~*um~;E$8H@>sD9K$&zFA<5Z9-bD|50Z@=exD5aCL^KFnIrlY?}6Fv zt@++9z3_Kt(JTxse7(%OOS1y4$F+OQhezy#RN)<+};C}8qGTWq7}q~5!aQ@ zv1|pv-|s-1xz}6uMN@#U0F*e00EII*tDWi`U;$8+LV$3x{DuSIYC#JQd!Qfiyf|tq z`Zrv;LOY}_Tvlc^e?Pk|rdyt|$jc#vr*v92=oMeqdMAa#c!~8ROi)u}mj<*9WCKSJ z_r$k)r(vFZDjIh=Q0d_eE!y;_#Hd!BTe!VehpW3U!dUnakmv0tp8B0p|1-%|;`NEO zJ>ox*urkk@dJX^y(-Ro^IlQv0Q0S$7Q=LJM zN#^Y(-1vF^CQ1+rMk+%|c{o0;P{9fvv_eO*zsnvd7#SWd^^g9h3hh<>{4+WHZ}}ep zbh8K{^&;Z4N@tvoEJ3Gs)|>EVYkWqo5=s6fyDOkP2TC+(3{McAM+mrD*IKC-ycYfG zzR7y?E2L@cST<)`WP89A8kdHlaoWCPI$O#;>$(@cW+~F>xiC=iI(t)^ZGa7s$O35- z!8{gT&SPqq`&y4Jzq^S5A3lXwlD03Zyw!q}_g+DWJzIT$qs62;1F6+tHN{>LkqGtS z2Q_(7xk(teQ%<{(K2T!^&VJZ6!km0GY!W>Qrigb~v%0{2^$cgkwI4lu#W_3QOAo4* zCz2%fDe}U9aAO*r(4Efyu!aqcpRBy_f-A7vsyG5FvyYaDF@OnQfS@wZAzyu?nNQjX z^mnu5ax)c9*plQT#Cl0-jBidvKD&%8M$J z^I1k|9f}wj@%EbeT05Ze$LrgkPg0@uJFm)wA>QBV#+MAAoi2uc~^!f2R*Ykny0L)xBBuCW->9go~gd+)|%nVW7w|1#2h1=Q4au}z)pf5K4? zC^xq7r`V+$jUQ&xUiqcUtyyA6ak*HLrkE}i{ZJ6i!oytU=l>s&uFw@9dHbtUi;}TA z^oQpfr&cCg!>>4*)WKN6C@JCJlVs_{$S{#WIk3z*us+`fig&G2m6gdFB`3ZW^p^^d zOMLMWAj8B(0;MX43lszYj6DcOi4i5k490RBZoaQcoZ;~L`qX?ooS5cx+;j}gcqN}N zqgHoaCKdi+xr*Hw7LU{~SP;nQkzUvFtMuLf^ZNsFEkc31*a%A`t~fKe;!0sme$Gn& zc~StLoM{f^>M|#Pg~Bsj8ZMfuU{(0SBH)~EoaF*@?KhbghA3P&QFUlUY#9O5nvBijbD)hd=g6gJwE+5ZGKnOFBH*stL}Hau{&{QLnHTS|a`F?}>* z7hGaYz%~Rjg-ByY#B9xb<2&+l?H{WlPnCVEl%M!;=2#_Id#on%lJM$77xSz&*h;8_ zaGXVC!g!9$prbZiY(MGEn!EC%YHec0{obc|QQZfS!NdBBUxyKspHW*uN@chp#ir5) z6$F)7C_IdkV8^7VF>Lx-0L_F{FY|Ms9!4@T_wHK;aR+B?-C48&MGd@}U#EMcI+%Vg z(;BPDdU!tsiw7UHauX|#!GZH(?ZL>igRWhjX7#Pe28YT7E$;ri(9S^3WN?vGpFKM(L_C<1u0mS+B?*i+-OVS-k$@ z$k$-0D) zoJj%LPV5@ul%aOe)>tL_ly5Nw-(ljRND)%-3*^3=OK=hiEbA?9u>2z`-|jx{vQV}k zQWxl=HrVuCrWb6L8f-o$43>$sK-=)#>xd7*-blgikXNJFUL;qSFR5Kpn8#iX42-fs zR^%Jr#OfsT1XboNTo$u;zFQC}{5dN0&$9FS%d<|5z?xCq4%h;ydSsuLt}%tRQ< za_Ls+MD~g}1-ZUl+O|Hk8KR#2U{XBE>Bo`jSb_UNIa*t=$E-yQE; z213QAo-uI|m1T{&A5Pa}nw6-w;TRN<5n!H{%lwBXM?ctdn=Al{lbUJW`Ea7*0wqCk zeOsvn-Wrx|hX-f$Awwvt(*XT1wSD@ zT0#ZvoI}PrHtcqHZ8+Nw3Y}0Grr!*KZByPxuPwL1Pl<*rNLnClX}=ya!SFs2t8svo zXgiG$LFQma%x8`Y^pAXmEPg##4e`=XgRq3=Xg`FBFf-lD-lkA|_L)sEdNb3pdtEPJ zMUz&6fw0e#kWCFC@y|27F_wtRPPG{ZYhZTHzo9HFNgdYft3va0nD4gNd?zfrgCvEh zGbOJW@Lu1B0R_uOu6-GOn0Z6@)?vt&kxf2<*~AWK-F)Bqp8FYPfKQn9D`8tV9m~r< zdEpS!(Eaiws%kjqWg%7#1Rbv5Do0lsG9|+-rItcQ)y-H;({EGF30xuxf|k_QDj}_} zP%IuUF70t<@psKNql7?d*sBYwz)S5fO@56;b5IyCM@*rfqTHGXizVTnEBw)nt2>}& z!C6OBw%D8}RZ(={WK0bs@UrMTZ7xw=ws1vjado50cO|z8^Iitm*~pwAqs10j+4>J5 zPkQUY<&TjH9S)HsB7}m!FgTjtmUlX|j<30V`J6EKyJO%e#VA7GBjJ6nGU(yeDF5of z{<3Okm;AT+3D&S$vJ}3uHveUzvTQ+pI5g9Q=44IB-Mm+Czo<81US?zxYO6I`zs)^=(J#OrM2UY}7-LoXN=6NA5qI z_h$(Dfm!0-lwVTVMBM@34Sj%D#oAwqZCPo5#|xT6nSnz6ZlIo>9n9Lb;544KIB2% z1h-NiG`8v1znq1)j6cp1r;6x!; z|G2SZY|rr@b?bSyJC@Tws9=Su$ks{ev>l$(+j;EV*UI4M;Q!OFw7&y3SzJ(EpAuwp zMvs|!N8mm_Lth>sgouSt1=DgUCaIxM)kXrQ$0R3%U8l@i*(0Fwh+u#PR{FqZkitRG zXrYUBN?<|rXmTLFDIW04OTniS_~9dVyW95*>7r-H;V*qRGzOhIk54~7-4Mk_-^%wz znh-WncwY|>%_RQ{!(+7LxKxl=d-gV;?BWi;ej2$Bkk919{qVHe=BNmGvI}AF%oLrc ztICr}Vr9!&C{})vWNTvV) literal 0 HcmV?d00001 From e02db3e5681ebf2c1d0c267bf1c2b74b59a6f923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesu=CC=81s=20Rodri=CC=81guez?= Date: Sun, 28 Aug 2016 21:14:05 +0200 Subject: [PATCH 2/3] Jesus' edits --- .../cb-tree-view/ts/app/add-hero.component.ts | 10 +++---- .../cb-tree-view/ts/app/app.component.ts | 20 ++++++-------- .../cb-tree-view/ts/app/app.module.ts | 27 +++++++++++++++++++ .../ts/app/hero-node.component.ts | 2 +- .../_examples/cb-tree-view/ts/app/hero.ts | 4 +-- .../_examples/cb-tree-view/ts/app/main.ts | 8 +++--- .../cb-tree-view/ts/app/tree-node.service.ts | 24 ++++++++--------- .../cb-tree-view/ts/app/tree-node.ts | 14 +++++----- .../ts/app/tree-view.component.html | 2 +- .../ts/app/tree-view.component.ts | 14 +++------- public/docs/ts/latest/cookbook/tree-view.jade | 12 ++++----- 11 files changed, 72 insertions(+), 65 deletions(-) create mode 100644 public/docs/_examples/cb-tree-view/ts/app/app.module.ts diff --git a/public/docs/_examples/cb-tree-view/ts/app/add-hero.component.ts b/public/docs/_examples/cb-tree-view/ts/app/add-hero.component.ts index 459cff3595..0e89a64360 100644 --- a/public/docs/_examples/cb-tree-view/ts/app/add-hero.component.ts +++ b/public/docs/_examples/cb-tree-view/ts/app/add-hero.component.ts @@ -9,24 +9,22 @@ import { Hero } from './hero'; templateUrl: 'app/add-hero.component.html' }) export class AddHeroComponent implements OnInit { - hero: Hero; - constructor(private treeNodeService: TreeNodeService) { - } + constructor(private treeNodeService: TreeNodeService) { } - addHero() { + addHero(): void { if (this.hero.name) { this.treeNodeService.addHero(this.hero); this.hero = new Hero(); } } - cancel() { + cancel(): void { this.treeNodeService.selectedNode.unselect(); } - ngOnInit() { + ngOnInit(): void { this.hero = new Hero(); } } diff --git a/public/docs/_examples/cb-tree-view/ts/app/app.component.ts b/public/docs/_examples/cb-tree-view/ts/app/app.component.ts index 5371189f6b..997de30d34 100644 --- a/public/docs/_examples/cb-tree-view/ts/app/app.component.ts +++ b/public/docs/_examples/cb-tree-view/ts/app/app.component.ts @@ -1,7 +1,6 @@ // #docregion import { Component, OnInit } from '@angular/core'; -import { TreeViewComponent } from './tree-view.component'; import { TreeNode } from './tree-node'; import { TreeNodeService } from './tree-node.service'; @@ -10,25 +9,22 @@ import { TreeNodeService } from './tree-node.service'; template: `

Hero locations

- - - + + +
- `, - directives: [TreeViewComponent], - providers: [TreeNodeService] + ` }) export class AppComponent implements OnInit { + nodes: TreeNode[] = []; - private _nodes: Array = []; - - constructor(private _treeNodeService: TreeNodeService) { + constructor(private treeNodeService: TreeNodeService) { } ngOnInit() { - this._treeNodeService + this.treeNodeService .getTreeNodes() - .then((nodes: Array) => this._nodes = nodes) + .then((nodes: TreeNode[]) => this.nodes = nodes) .catch((error: any) => console.log(error)); // TODO: Display error } } diff --git a/public/docs/_examples/cb-tree-view/ts/app/app.module.ts b/public/docs/_examples/cb-tree-view/ts/app/app.module.ts new file mode 100644 index 0000000000..cdd7d47c0d --- /dev/null +++ b/public/docs/_examples/cb-tree-view/ts/app/app.module.ts @@ -0,0 +1,27 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { HttpModule } from '@angular/http'; +import { FormsModule } from '@angular/forms'; + +import { AppComponent } from './app.component'; +import { AddHeroComponent } from './add-hero.component'; +import { HeroNodeComponent } from './hero-node.component'; +import { TreeViewComponent } from './tree-view.component'; +import { TreeNodeService } from './tree-node.service'; + +@NgModule({ + imports: [ + BrowserModule, + HttpModule, + FormsModule + ], + declarations: [ + AppComponent, + AddHeroComponent, + HeroNodeComponent, + TreeViewComponent + ], + providers: [ TreeNodeService ], + bootstrap: [ AppComponent ] +}) +export class AppModule {} diff --git a/public/docs/_examples/cb-tree-view/ts/app/hero-node.component.ts b/public/docs/_examples/cb-tree-view/ts/app/hero-node.component.ts index 21dda2ea85..69bca4d147 100644 --- a/public/docs/_examples/cb-tree-view/ts/app/hero-node.component.ts +++ b/public/docs/_examples/cb-tree-view/ts/app/hero-node.component.ts @@ -11,7 +11,7 @@ export class HeroNodeComponent implements OnInit { @Input() hero: Hero; heroClass: string; - ngOnInit() { + ngOnInit(): void { if (this.hero.ranking > 7) { this.heroClass = 'hero-top'; }else if (this.hero.ranking > 4) { diff --git a/public/docs/_examples/cb-tree-view/ts/app/hero.ts b/public/docs/_examples/cb-tree-view/ts/app/hero.ts index 8e3a7f97f9..27f31d9ba2 100644 --- a/public/docs/_examples/cb-tree-view/ts/app/hero.ts +++ b/public/docs/_examples/cb-tree-view/ts/app/hero.ts @@ -1,6 +1,4 @@ // #docregion export class Hero { - - constructor(public name?: string, public ranking?: number) { - } + constructor(public name?: string, public ranking?: number) { } } diff --git a/public/docs/_examples/cb-tree-view/ts/app/main.ts b/public/docs/_examples/cb-tree-view/ts/app/main.ts index cda5d15792..c950c2584d 100644 --- a/public/docs/_examples/cb-tree-view/ts/app/main.ts +++ b/public/docs/_examples/cb-tree-view/ts/app/main.ts @@ -1,10 +1,8 @@ // #docregion -import { bootstrap } from '@angular/platform-browser-dynamic'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { AppComponent } from './app.component'; -import { HTTP_PROVIDERS } from '@angular/http'; +import { AppModule } from './app.module'; import 'rxjs/Rx'; -bootstrap(AppComponent, [HTTP_PROVIDERS]) - .catch((err: any) => console.error(err)); +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/public/docs/_examples/cb-tree-view/ts/app/tree-node.service.ts b/public/docs/_examples/cb-tree-view/ts/app/tree-node.service.ts index 7b94c554ca..a819edad26 100644 --- a/public/docs/_examples/cb-tree-view/ts/app/tree-node.service.ts +++ b/public/docs/_examples/cb-tree-view/ts/app/tree-node.service.ts @@ -7,42 +7,40 @@ import { Hero } from './hero'; @Injectable() export class TreeNodeService { - - private _root = new TreeNode('Hero Regions', [], []); + private root = new TreeNode('Hero Regions', [], []); selectedNode: TreeNode; - constructor(private _http: Http) { - } + constructor(private http: Http) {} // #docregion build-tree - private _buildTreeRecursive(root: TreeNode, nodes: Array): TreeNode { + private buildTreeRecursive(root: TreeNode, nodes: any[]): TreeNode { if (nodes) { nodes.forEach(node => { let heroes = (node.heroes || []).map((hero: any) => new Hero(hero.name, hero.ranking)); let treeNode = new TreeNode(node.title, [], heroes); - root.nodes.push(this._buildTreeRecursive(treeNode, node.nodes)); + root.nodes.push(this.buildTreeRecursive(treeNode, node.nodes)); return treeNode; }); } return root; } - getTreeNodes(): any { - return this._http.get('./app/mock-data.json') + getTreeNodes(): Promise { + return this.http.get('./app/mock-data.json') .toPromise() .then(res => { - let root = this._buildTreeRecursive(this._root, res.json().nodes); + let root = this.buildTreeRecursive(this.root, res.json().nodes); return root.nodes; }); } - // #enddocregion build-tree + // #enddocregion build-tree - addHero(newHero: Hero) { + addHero(newHero: Hero): void { this.selectedNode.heroes.push(newHero); } // #docregion toggle-nodes - toggleNodes(nodes: Array, state: boolean) { + toggleNodes(nodes: TreeNode[], state: boolean): void { nodes.forEach(node => { node.expanded = state; this.toggleNodes(node.nodes, state); @@ -50,7 +48,7 @@ export class TreeNodeService { } // #enddocregion toggle-nodes - selectNode(node: TreeNode) { + selectNode(node: TreeNode): void { if (this.selectedNode) { this.selectedNode.unselect(); } diff --git a/public/docs/_examples/cb-tree-view/ts/app/tree-node.ts b/public/docs/_examples/cb-tree-view/ts/app/tree-node.ts index 1a8e6dc51b..9c415eaab8 100644 --- a/public/docs/_examples/cb-tree-view/ts/app/tree-node.ts +++ b/public/docs/_examples/cb-tree-view/ts/app/tree-node.ts @@ -6,11 +6,11 @@ export class TreeNode { expanded: boolean = false; selected: boolean = false; - constructor(public title: string, public nodes?: Array, public heroes?: Array) { + constructor(public title: string, public nodes?: TreeNode[], public heroes?: Hero[]) { } - getIcon() { - if (this._hasChildren()) { + getIcon(): string { + if (this.hasChildren()) { if (this.expanded) { return '-'; } @@ -19,23 +19,23 @@ export class TreeNode { return ''; } - toggle() { + toggle(): void { this.expanded = !this.expanded; if (this.expanded === false) { this.selected = false; } } - select() { + select(): void { this.selected = true; this.expanded = true; } - unselect() { + unselect(): void { this.selected = false; } - private _hasChildren() { + private hasChildren() { return (this.nodes.length + this.heroes.length) > 0; } } diff --git a/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.html b/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.html index 6780250a3b..9aeee4021a 100644 --- a/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.html +++ b/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.html @@ -1,6 +1,6 @@
    -
  • +
  • {{node.getIcon()}} {{node.title}}
    diff --git a/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.ts b/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.ts index 739124f8f7..d7de1d43ff 100644 --- a/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.ts +++ b/public/docs/_examples/cb-tree-view/ts/app/tree-view.component.ts @@ -1,27 +1,19 @@ // #docregion import { Component, Input } from '@angular/core'; -import { AddHeroComponent } from './add-hero.component'; -import { HeroNodeComponent } from './hero-node.component'; import { TreeNode } from './tree-node'; import { TreeNodeService } from './tree-node.service'; @Component({ selector: 'tree-view', - - directives: [TreeViewComponent, // Notice: TreeViewComponent reference inside TreeViewComponent - AddHeroComponent, - HeroNodeComponent], - templateUrl: './app/tree-view.component.html' }) export class TreeViewComponent { @Input() nodes: Array; - constructor(private _treeNodeService: TreeNodeService) { - } + constructor(private treeNodeService: TreeNodeService) {} - select(node: TreeNode) { - this._treeNodeService.selectNode(node); + select(node: TreeNode): void { + this.treeNodeService.selectNode(node); } } diff --git a/public/docs/ts/latest/cookbook/tree-view.jade b/public/docs/ts/latest/cookbook/tree-view.jade index ada153c416..103ef53854 100644 --- a/public/docs/ts/latest/cookbook/tree-view.jade +++ b/public/docs/ts/latest/cookbook/tree-view.jade @@ -23,7 +23,7 @@ include ../_util-fns .l-main-section :marked - ## Load Heroes and Regions + ## Load Heroes and Regions We want to load the tree view data from an external file, so first we define a json schema to represent heroes and their regions. A sample of our schema can be found in `mock-data.json`. +makeExample('cb-tree-view/ts/app/mock-data.json','','app/mock-data.json') @@ -35,16 +35,16 @@ include ../_util-fns +makeExample('cb-tree-view/ts/app/tree-node.service.ts', 'build-tree', 'app/tree-node.service.ts (building tree)')(format=".") :marked - `_buildTreeRecursive()` in `TreeNodeService` maps the data from the file into `TreeNode` objects that we bind to the tree view. + `buildTreeRecursive()` in `TreeNodeService` maps the data from the file into `TreeNode` objects that we bind to the tree view. `TreeNode` is the view model for the nodes in the tree and adds support for operations like expand, collapse and selecting of nodes. - + +makeExample('cb-tree-view/ts/app/tree-node.ts','','app/tree-node.ts') .l-main-section :marked - ## Recursive Template + ## Recursive Template To render the tree view we have created `TreeViewComponent`. @@ -58,7 +58,7 @@ include ../_util-fns ) :marked - There is something very interesting about `TreeViewComponent`. If we look at the `directives` array we see a reference to `TreeViewComponent` itself. This might seem surprising, but is necessary since `TreeViewComponent` has a reference to itself in the template. + There is something very interesting about `TreeViewComponent`. If we look at the `directives` array we see a reference to `TreeViewComponent` itself. This might seem surprising, but is necessary since `TreeViewComponent` has a reference to itself in the template. We see this self reference if we look at the template. Remember `tree-view` is the selector for our tree view, so using a `tree-view` element in the template means that the component refers to itself. @@ -116,4 +116,4 @@ figure.image-display +makeExample('cb-tree-view/ts/app/tree-node.service.ts', 'toggle-nodes', 'app/tree-node.service.ts (Toggle nodes)')(format=".") :marked - [Back to top](#top) \ No newline at end of file + [Back to top](#top) From 39ce7d4bb330c6631d51f8b2b4ccac220af65ca8 Mon Sep 17 00:00:00 2001 From: Torgeir Helgevold Date: Sun, 28 Aug 2016 16:13:02 -0400 Subject: [PATCH 3/3] tweaks to recursive template section --- public/docs/ts/latest/cookbook/tree-view.jade | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/public/docs/ts/latest/cookbook/tree-view.jade b/public/docs/ts/latest/cookbook/tree-view.jade index 103ef53854..bc9c749b05 100644 --- a/public/docs/ts/latest/cookbook/tree-view.jade +++ b/public/docs/ts/latest/cookbook/tree-view.jade @@ -58,10 +58,9 @@ include ../_util-fns ) :marked - There is something very interesting about `TreeViewComponent`. If we look at the `directives` array we see a reference to `TreeViewComponent` itself. This might seem surprising, but is necessary since `TreeViewComponent` has a reference to itself in the template. - - We see this self reference if we look at the template. Remember `tree-view` is the selector for our tree view, so using a `tree-view` element in the template means that the component refers to itself. + If we examine `TreeViewComponent` a bit closer we notice that the template refers to itself by specifying a `tree-view` element in the markup. This means the template will render recursively with `TreeViewComponents` inside `TreeViewComponents`. + The tree is completely data driven by the `TreeNode` view model, and there are no predetermined assumptions about the depth of the tree. :marked The final tree view looks like this. figure.image-display