boilerpipe

package module
v0.4.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 1, 2019 License: Apache-2.0 Imports: 12 Imported by: 3

README

go-boilerpipe

Golang port of the boilerpipe Java library written by Christian Kohlschütter

Build Status GoDoc

Boilerpipe removes boilerplate and extracts text content from HTML documents.

Currently it only supports article extraction which includes the title, the date, and the content.

Best attempts will be made to follow Semantic Versioning 2.0.0 rules, but no API guarantees will be made until version 1.0.0.

However, existing tags will not change guaranteeing that vendoring will not break.

Getting Started

To install: go get -u github.com/jlubawy/go-boilerpipe/...

Command-Line Tool

$ boilerpipe help

Boilerpipe removes boilerplate and extracts text content from HTML documents.

Usage:

       boilerpipe command [arguments]

The commands are:

       extract    extract text content from an HTML document
       serve      start a HTTP server for extracting text from HTML documents
       version    print boilerpipe version

Use "boilerpipe help [command]" for more information about a command.

Using the library

See examples in filter_test.go.

Documentation

Overview

Package boilerpipe removes boilerplate and extracts text content from HTML documents.

This package is the Golang port of the original Java library written by Christian Kohlschütter that can be found here: https://github.com/kohlschutter/boilerpipe

Index

Examples

Constants

View Source
const Version = "0.4.0"

Version is the version of the boilerpipe package.

Variables

Functions

This section is empty.

Types

type Document added in v0.1.3

type Document struct {
	// Title is the title of the document.
	Title string

	Author string

	// Date is the date the document was created.
	Date time.Time

	TextBlocks []*TextBlock
	// contains filtered or unexported fields
}

func ParseDocument added in v0.2.0

func ParseDocument(r io.Reader) (*Document, error)

ParseDocument parses an HTML document and returns a Document for further processing through filters.

Example
// Order of URLs much match the content in testdata
var rawurls = []string{
	"https://blog.openshift.com/day-18-boilerpipe-article-extraction-for-java-developers",
	"https://lasvegassun.com/news/2017/apr/20/lease-no-rent-for-raiders-at-las-vegas-stadium",
	"https://lasvegassun.com/news/2017/may/22/yucca-mountain-nuclear-waste-donald-trump",
	"https://dealbook.nytimes.com/2006/09/12/big-names-pull-cash-from-venture-capital-fund-over-political-contributions",

	// Chinese HTML examples
	"https://news.sina.com.cn/c/xl/2019-03-28/doc-ihtxyzsm0966222.shtml",
	"https://3w.huanqiu.com/a/a4d1ef/7LpwetJb1HW?agt=8",
	"http://media.people.com.cn/n1/2019/0330/c40606-31004041.html",
}

for i, rawurl := range rawurls {
	var date time.Time

	// Normalize the URL
	u, err := normurl.Parse(rawurl)
	if err != nil {
		log.Fatal(err)
	}

	// Retrieve the content
	f, err := os.Open(filepath.Join("testdata", fmt.Sprintf("%d.html", i)))
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	// Create and process the document
	doc, err := ParseDocument(f)
	if err != nil {
		log.Fatal(err)
	}
	ArticlePipeline.Process(doc)

	// Log the document's title
	fmt.Println(doc.Title)

	// Get the time at which the article was written
	if d, exists := u.Date(); exists {
		// If the URL has a date use it first since it's probably more
		// reliable
		date = d
	} else {
		// Else use the document's date
		date = doc.Date
	}

	// Only log the date if it's not empty
	if !date.Equal(time.Time{}) {
		fmt.Println(date.Format("January 2, 2006"))
	}

	// Log the normalized URL
	fmt.Println(u)

	// Log the base64 encoded content
	fmt.Println(base64.StdEncoding.EncodeToString([]byte(doc.Content())))
	fmt.Println()
}
Output:

Day 18: Boilerpipe--Article Extraction for Java Developers – OpenShift Blog
November 15, 2013
https://blog.openshift.com/day-18-boilerpipe-article-extraction-for-java-developers
RGF5IDE4OiBCb2lsZXJwaXBl4oCTQXJ0aWNsZSBFeHRyYWN0aW9uIGZvciBKYXZhIERldmVsb3BlcnMKTm92ZW1iZXIgMTUsIDIwMTMKQnkgU2hla2hhciBHdWxhdGkKVG9kYXkgZm9yIG15IDMwIGRheSBjaGFsbGVuZ2UgLCBJIHdhbnRlZCB0byBsZWFybiBob3cgdG8gZG8gdGV4dCBhbmQgaW1hZ2UgZXh0cmFjdGlvbiBmcm9tIHdlYiBsaW5rcyB1c2luZyB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZS4gVGhpcyBpcyBhIGNvbW1vbiByZXF1aXJlbWVudCBpbiBtb3N0IG9mIHRoZSBjb250ZW50IGRpc2NvdmVyeSB3ZWJzaXRlcyBsaWtlIFByaXNtYXRpYyAuIEluIHRoaXMgYmxvZywgSSB3aWxsIHNob3cgeW91IGhvdyB0byB1c2UgYSBKYXZhIGxpYnJhcnkgY2FsbGVkIGJvaWxlcnBpcGUgdG8gYWNjb21wbGlzaCB0aGlzIHRhc2suClByZXJlcXVpc2l0ZQpCYXNpYyBKYXZhIGtub3dsZWRnZSBpcyByZXF1aXJlZC4gSW5zdGFsbCB0aGUgbGF0ZXN0IEphdmEgRGV2ZWxvcG1lbnQgS2l0IChKREspIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4gWW91IGNhbiBlaXRoZXIgaW5zdGFsbCBPcGVuSkRLIDcgb3IgT3JhY2xlIEpESyA3IC4gT3BlblNoaWZ0IHN1cHBvcnRzIGJvdGggT3BlbkpESyA2IGFuZCA3LgpTaWduIHVwIGZvciBhbiBPcGVuU2hpZnQgQWNjb3VudCAuVG9kYXkgZm9yIG15IDMwIGRheSBjaGFsbGVuZ2UgLCBJIGRlY2lkZWQgdG8gbGVhcm4gaG93IHRvIGRvIHRleHQgYW5kIGltYWdlIGV4dHJhY3Rpb24gZnJvbSB3ZWIgbGlua3MgdXNpbmcgdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIFRoaXMgaXMgYSB2ZXJ5IGNvbW1vbiByZXF1aXJlbWVudCBpbiBtb3N0IG9mIHRoZSBjb250ZW50IGRpc2NvdmVyeSB3ZWJzaXRlcyBsaWtlIFByaXNtYXRpYyAuIEluIHRoaXMgYmxvZywgd2Ugd2lsbCBsZWFybiBob3cgd2UgY2FuIHVzZSBhIEphdmEgbGlicmFyeSBjYWxsZWQgYm9pbGVycGlwZSB0byBhY2NvbXBsaXNoIHRoaXMgdGFzay4KUHJlcmVxdWlzaXRlCkJhc2ljIEphdmEga25vd2xlZGdlIGlzIHJlcXVpcmVkLiBJbnN0YWxsIHRoZSBsYXRlc3QgSmF2YSBEZXZlbG9wbWVudCBLaXQgKEpESykgb24geW91ciBvcGVyYXRpbmcgc3lzdGVtLiBZb3UgY2FuIGVpdGhlciBpbnN0YWxsIE9wZW5KREsgNyBvciBPcmFjbGUgSkRLIDcgLiBPcGVuU2hpZnQgc3VwcG9ydHMgYm90aCBPcGVuSkRLIDYgYW5kIDcuClNpZ24gdXAgZm9yIGFuIE9wZW5TaGlmdCBBY2NvdW50IC4gSXQgaXMgY29tcGxldGVseSBmcmVlIGFuZCBSZWQgSGF0IGdpdmVzIGV2ZXJ5IHVzZXIgdGhyZWUgZnJlZSBHZWFycyBvbiB3aGljaCB0byBydW4geW91ciBhcHBsaWNhdGlvbnMuIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgdGhlIGNvbWJpbmVkIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGVhY2ggdXNlciBpcyAxLjUgR0Igb2YgbWVtb3J5IGFuZCAzIEdCIG9mIGRpc2sgc3BhY2UuCkluc3RhbGwgdGhlIHJoYyBjbGllbnQgdG9vbCBvbiB5b3VyIG1hY2hpbmUuIFJIQyBpcyBhIHJ1YnkgZ2VtIHNvIHlvdSBuZWVkIHRvIGhhdmUgcnVieSAxLjguNyBvciBhYm92ZSBvbiB5b3VyIG1hY2hpbmUuIFRvIGluc3RhbGwgcmhjLCBqdXN0IHR5cGVzdWRvIGdlbSBpbnN0YWxsIHJoYyBJZiB5b3UgYWxyZWFkeSBoYXZlIG9uZSwgbWFrZSBzdXJlIGl0IGlzIHRoZSBsYXRlc3Qgb25lLiBUbyB1cGRhdGUgeW91ciByaGMsIGV4ZWN1dGUgdGhlIGNvbW1hbmQgc3VkbyBnZW0gdXBkYXRlIHJoYyBGb3IgYWRkaXRpb25hbCBhc3Npc3RhbmNlIHNldHRpbmcgdXAgdGhlIHJoYyBjb21tYW5kLWxpbmUgdG9vbCwgc2VlIHRoZSBmb2xsb3dpbmcgcGFnZTogaHR0cHM6Ly93d3cub3BlbnNoaWZ0LmNvbS9kZXZlbG9wZXJzL3JoYy1jbGllbnQtdG9vbHMtaW5zdGFsbApTZXR1cCB5b3VyIE9wZW5TaGlmdCBhY2NvdW50IHVzaW5nIHRoZSByaGMgc2V0dXAgY29tbWFuZC4gVGhpcyBjb21tYW5kIHdpbGwgaGVscCB5b3UgY3JlYXRlIGEgbmFtZXNwYWNlIGFuZCB1cGxvYWQgeW91ciBzc2gga2V5cyB0byBPcGVuU2hpZnQgc2VydmVyLgpTdGVwMSA6IENyZWF0ZSBhIEpCb3NzIEVBUCBhcHBsaWNhdGlvbgpMZXTigJlzIHN0YXJ0IGNyZWF0aW5nIHRoZSBkZW1vIGFwcGxpY2F0aW9uLiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gaXMgbmV3c2FwcC4KJCByaGMgY3JlYXRlLWFwcCBuZXdzYXBwIGpib3NzZWFwCklmIHlvdSBoYXZlIGFjY2VzcyB0byBtZWRpdW0gZ2VhcnMgdGhlbiB5b3UgY2FuIHVzZSBmb2xsb3dpbmcgY29tbWFuZC4KJCByaGMgY3JlYXRlLWFwcCBuZXdzYXBwIGpib3NzZWFwIC1nIG1lZGl1bQpUaGlzIHdpbGwgY3JlYXRlIGFuIGFwcGxpY2F0aW9uIGNvbnRhaW5lciBmb3IgdXMsIGNhbGxlZCBhIGdlYXIsIGFuZCBzZXR1cCBhbGwgb2YgdGhlIHJlcXVpcmVkIFNFTGludXggcG9saWNpZXMgYW5kIGNncm91cCBjb25maWd1cmF0aW9uLiBPcGVuU2hpZnQgd2lsbCBhbHNvIHNldHVwIGEgcHJpdmF0ZSBnaXQgcmVwb3NpdG9yeSBmb3IgdXMgYW5kIGNsb25lIHRoZSByZXBvc2l0b3J5IHRvIHRoZSBsb2NhbCBzeXN0ZW0uIEZpbmFsbHksIE9wZW5TaGlmdCB3aWxsIHByb3BhZ2F0ZSB0aGUgRE5TIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiBUaGUgYXBwbGljYXRpb24gd2lsbCBiZSBhY2Nlc3NpYmxlIGF0IGh0dHA6Ly9uZXdzYXBwLXtkb21haW4tbmFtZX0ucmhjbG91ZC5jb20vLiBSZXBsYWNlIHtkb21haW4tbmFtZX0gd2l0aCB5b3VyIG93biB1bmlxdWUgT3BlblNoaWZ0IGRvbWFpbiBuYW1lIChhbHNvIHNvbWV0aW1lcyBjYWxsZWQgYSBuYW1lc3BhY2UpLgpTdGVwIDIgOiBBZGQgTWF2ZW4gZGVwZW5kZW5jaWVzCkluIHRoZSBwb20ueG1sIGZpbGUgYWRkIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jeToKJmx0O2RlcGVuZGVuY3kmZ3Q7ICZsdDtncm91cElkJmd0O2RlLmwzcy5ib2lsZXJwaXBlJmx0Oy9ncm91cElkJmd0OyAmbHQ7YXJ0aWZhY3RJZCZndDtib2lsZXJwaXBlJmx0Oy9hcnRpZmFjdElkJmd0OyAmbHQ7dmVyc2lvbiZndDsxLjIuMCZsdDsvdmVyc2lvbiZndDsgJmx0Oy9kZXBlbmRlbmN5Jmd0OyAmbHQ7ZGVwZW5kZW5jeSZndDsgJmx0O2dyb3VwSWQmZ3Q7eGVyY2VzJmx0Oy9ncm91cElkJmd0OyAmbHQ7YXJ0aWZhY3RJZCZndDt4ZXJjZXNJbXBsJmx0Oy9hcnRpZmFjdElkJmd0OyAmbHQ7dmVyc2lvbiZndDsyLjkuMSZsdDsvdmVyc2lvbiZndDsgJmx0Oy9kZXBlbmRlbmN5Jmd0OyAmbHQ7ZGVwZW5kZW5jeSZndDsgJmx0O2dyb3VwSWQmZ3Q7bmV0LnNvdXJjZWZvcmdlLm5la29odG1sJmx0Oy9ncm91cElkJmd0OyAmbHQ7YXJ0aWZhY3RJZCZndDtuZWtvaHRtbCZsdDsvYXJ0aWZhY3RJZCZndDsgJmx0O3ZlcnNpb24mZ3Q7MS45LjEzJmx0Oy92ZXJzaW9uJmd0OyAmbHQ7L2RlcGVuZGVuY3kmZ3Q7CllvdSB3aWxsIGFsc28gbmVlZCB0byBhZGQgYSBuZXcgcmVwb3NpdG9yeQombHQ7cmVwb3NpdG9yeSZndDsgJmx0O2lkJmd0O2JvaWxlcnBpcGUtbTItcmVwbyZsdDsvaWQmZ3Q7ICZsdDt1cmwmZ3Q7aHR0cDovL2JvaWxlcnBpcGUuZ29vZ2xlY29kZS5jb20vc3ZuL3JlcG8vJmx0Oy91cmwmZ3Q7ICZsdDtyZWxlYXNlcyZndDsgJmx0O2VuYWJsZWQmZ3Q7dHJ1ZSZsdDsvZW5hYmxlZCZndDsgJmx0Oy9yZWxlYXNlcyZndDsgJmx0O3NuYXBzaG90cyZndDsgJmx0O2VuYWJsZWQmZ3Q7ZmFsc2UmbHQ7L2VuYWJsZWQmZ3Q7ICZsdDsvc25hcHNob3RzJmd0OyAmbHQ7L3JlcG9zaXRvcnkmZ3Q7CkFsc28gdXBkYXRlIHRoZSBtYXZlbiBwcm9qZWN0IHRvIEphdmEgNyBieSB1cGRhdGluZyBhIGNvdXBsZSBvZiBwcm9wZXJ0aWVzIGluIHRoZSBwb20ueG1sIGZpbGU6CiZsdDttYXZlbi5jb21waWxlci5zb3VyY2UmZ3Q7MS43Jmx0Oy9tYXZlbi5jb21waWxlci5zb3VyY2UmZ3Q7ICZsdDttYXZlbi5jb21waWxlci50YXJnZXQmZ3Q7MS43Jmx0Oy9tYXZlbi5jb21waWxlci50YXJnZXQmZ3Q7Ck5vdyB1cGRhdGUgdGhlIE1hdmVuIHByb2plY3QgUmlnaHQgY2xpY2sgJmd0OyBNYXZlbiAmZ3Q7IFVwZGF0ZSBQcm9qZWN0LgpTdGVwIDMgOiBFbmFibGUgQ0RJCldlIGFyZSB1c2luZyBDREkgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLiBDREkgb3IgQ29udGV4dCBhbmQgRGVwZW5kZW5jeSBpbmplY3Rpb24gaXMgYSBKYXZhIEVFIDYgc3BlY2lmaWNhdGlvbiB3aGljaCBlbmFibGVzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluIGEgSmF2YSBFRSA2IHByb2plY3QuIENESSBkZWZpbmVzIHR5cGUtc2FmZSBkZXBlbmRlbmN5IGluamVjdGlvbiBtZWNoYW5pc20gZm9yIEphdmEgRUUuIEFsbW9zdCBhbnkgUE9KTyBjYW4gYmUgaW5qZWN0ZWQgYXMgYSBDREkgYmVhbi4KQ3JlYXRlIGEgbmV3IHhtbCBmaWxlIG5hbWVkIGJlYW5zLnhtbCBpbiB0aGUgc3JjL21haW4vd2ViYXBwL1dFQi1JTkYgZm9sZGVyLiBSZXBsYWNlIHRoZSBjb250ZW50IG9mIGJlYW5zLnhtbCB3aXRoIHRoZSBmb2xsb3dpbmc6CiZsdDtiZWFucyB4bWxucz0mIzM0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSYjMzQ7IHhtbG5zOnhzaT0mIzM0O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJiMzNDsgeHNpOnNjaGVtYUxvY2F0aW9uPSYjMzQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9iZWFuc18xXzAueHNkJiMzNDsmZ3Q7ICZsdDsvYmVhbnMmZ3Q7ClN0ZXAgNCA6IENyZWF0ZSBCb2lsZXJwaXBlQ29udGVudEV4dHJhY3Rpb25TZXJ2aWNlCk5vdyB3ZSBjYW4gY3JlYXRlIGFuIEJvaWxlcnBpcGVDb250ZW50RXh0cmFjdGlvblNlcnZpY2Ugc2VydmljZSBjbGFzcyB3aGljaCB3aWxsIHRha2UgYSB1cmwgYW5kIGZpbmQgdGhlIHRpdGxlIGFuZCBhcnRpY2xlIHRleHQgZnJvbSBpdC4KaW1wb3J0IGphdmEubmV0LlVSTDsgaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsgaW1wb3J0IGphdmEudXRpbC5MaXN0OyBpbXBvcnQgY29tLm5ld3NhcHAuYm9pbGVycGlwZS5pbWFnZS5JbWFnZTsgaW1wb3J0IGNvbS5uZXdzYXBwLmJvaWxlcnBpcGUuaW1hZ2UuSW1hZ2VFeHRyYWN0b3I7IGltcG9ydCBkZS5sM3MuYm9pbGVycGlwZS5Cb2lsZXJwaXBlRXh0cmFjdG9yOyBpbXBvcnQgZGUubDNzLmJvaWxlcnBpcGUuZG9jdW1lbnQuVGV4dERvY3VtZW50OyBpbXBvcnQgZGUubDNzLmJvaWxlcnBpcGUuZXh0cmFjdG9ycy5BcnRpY2xlRXh0cmFjdG9yOyBpbXBvcnQgZGUubDNzLmJvaWxlcnBpcGUuZXh0cmFjdG9ycy5Db21tb25FeHRyYWN0b3JzOyBpbXBvcnQgZGUubDNzLmJvaWxlcnBpcGUuc2F4LkJvaWxlcnBpcGVTQVhJbnB1dDsgaW1wb3J0IGRlLmwzcy5ib2lsZXJwaXBlLnNheC5IVE1MRG9jdW1lbnQ7IGltcG9ydCBkZS5sM3MuYm9pbGVycGlwZS5zYXguSFRNTEZldGNoZXI7IHB1YmxpYyBjbGFzcyBCb2lsZXJwaXBlQ29udGVudEV4dHJhY3Rpb25TZXJ2aWNlIHsgcHVibGljIENvbnRlbnQgY29udGVudChTdHJpbmcgdXJsKSB7IHRyeSB7IGZpbmFsIEhUTUxEb2N1bWVudCBodG1sRG9jID0gSFRNTEZldGNoZXIuZmV0Y2gobmV3IFVSTCh1cmwpKTsgZmluYWwgVGV4dERvY3VtZW50IGRvYyA9IG5ldyBCb2lsZXJwaXBlU0FYSW5wdXQoaHRtbERvYy50b0lucHV0U291cmNlKCkpLmdldFRleHREb2N1bWVudCgpOyBTdHJpbmcgdGl0bGUgPSBkb2MuZ2V0VGl0bGUoKTsgU3RyaW5nIGNvbnRlbnQgPSBBcnRpY2xlRXh0cmFjdG9yLklOU1RBTkNFLmdldFRleHQoZG9jKTsgZmluYWwgQm9pbGVycGlwZUV4dHJhY3RvciBleHRyYWN0b3IgPSBDb21tb25FeHRyYWN0b3JzLktFRVBfRVZFUllUSElOR19FWFRSQUNUT1I7IGZpbmFsIEltYWdlRXh0cmFjdG9yIGllID0gSW1hZ2VFeHRyYWN0b3IuSU5TVEFOQ0U7IExpc3QmbHQ7SW1hZ2UmZ3Q7IGltYWdlcyA9IGllLnByb2Nlc3MobmV3IFVSTCh1cmwpLCBleHRyYWN0b3IpOyBDb2xsZWN0aW9ucy5zb3J0KGltYWdlcyk7IFN0cmluZyBpbWFnZSA9IG51bGw7IGlmICghaW1hZ2VzLmlzRW1wdHkoKSkgeyBpbWFnZSA9IGltYWdlcy5nZXQoMCkuZ2V0U3JjKCk7IH0gcmV0dXJuIG5ldyBDb250ZW50KHRpdGxlLCBjb250ZW50LnN1YnN0cmluZygwLCAyMDApLCBpbWFnZSk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IHJldHVybiBudWxsOyB9IH0gfQpUaGUgY29kZSBhYm92ZToKRmlyc3QgZmV0Y2hlcyB0aGUgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIHVybC4KUGFyc2VzIHRoZSBIVE1MIGRvY3VtZW50IGFuZCByZXR1cm4gVGV4dERvY3VtZW50LgpHZXRzIHRoZSB0aXRsZSBmcm9tIHRoZSB0ZXh0IGRvY3VtZW50LgpFeHRyYWN0cyBjb250ZW50IGZyb20gdGhlIHRleHQgYW5kIHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHZhbHVlIG9iamVjdC4KU3RlcCA1IDogRW5hYmxlIEpBWC1SUwpUbyBlbmFibGUgSkFYLVJTLCBjcmVhdGUgYSBjbGFzcyB3aGljaCBleHRlbmRzIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb24gYW5kIHNwZWNpZnkgdGhlIGFwcGxpY2F0aW9uIHBhdGggdXNpbmcgdGhlIGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aCBhbm5vdGF0aW9uIGFzIHNob3duIGJlbG93LgppbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOyBpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsgQEFwcGxpY2F0aW9uUGF0aCgmIzM0Oy9hcGkvdjEmIzM0OykgcHVibGljIGNsYXNzIEpheHJzSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBcHBsaWNhdGlvbnsgfQpTdGVwIDYgOiBDcmVhdGUgQ29udGVudEV4dHJhY3Rpb25SZXNvdXJjZQpOb3cgd2Ugd2lsbCBjcmVhdGUgb3VyIENvbnRlbnRFeHRyYWN0aW9uUmVzb3VyY2UgY2xhc3Mgd2hpY2ggd2lsbCByZXR1cm4gYSBjb250ZW50IG9iamVjdCBhcyBKU09OLiBDcmVhdGUgYSBuZXcgY2xhc3MgbmFtZWQgQ29udGVudEV4dHJhY3Rpb25SZXNvdXJjZSBhbmQgcmVwbGFjZSB0aGUgY29kZSB3aXRoIHRoZSBjb250ZW50cyBzaG93biBiZWxvdzoKaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7IGltcG9ydCBqYXZheC53cy5ycy5HRVQ7IGltcG9ydCBqYXZheC53cy5ycy5QYXRoOyBpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7IGltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOyBpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7IGltcG9ydCBjb20ubmV3c2FwcC5zZXJ2aWNlLkJvaWxlcnBpcGVDb250ZW50RXh0cmFjdGlvblNlcnZpY2U7IGltcG9ydCBjb20ubmV3c2FwcC5zZXJ2aWNlLkNvbnRlbnQ7IEBQYXRoKCYjMzQ7L2NvbnRlbnQmIzM0OykgcHVibGljIGNsYXNzIENvbnRlbnRFeHRyYWN0aW9uUmVzb3VyY2UgeyBASW5qZWN0IHByaXZhdGUgQm9pbGVycGlwZUNvbnRlbnRFeHRyYWN0aW9uU2VydmljZSBib2lsZXJwaXBlQ29udGVudEV4dHJhY3Rpb25TZXJ2aWNlOyBAR0VUIEBQcm9kdWNlcyh2YWx1ZSA9IE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKSBwdWJsaWMgQ29udGVudCBleHRyYWN0Q29udGVudChAUXVlcnlQYXJhbSgmIzM0O3VybCYjMzQ7KSBTdHJpbmcgdXJsKSB7IHJldHVybiBib2lsZXJwaXBlQ29udGVudEV4dHJhY3Rpb25TZXJ2aWNlLmNvbnRlbnQodXJsKTsgfSB9CkRlcGxveSB0byBPcGVuU2hpZnQKRmluYWxseSwgZGVwbG95IHRoZSBjaGFuZ2VzIHRvIE9wZW5TaGlmdAokIGdpdCBhZGQgLiAkIGdpdCBjb21taXQgLWFtICYjMzQ7TmV3QXBwJiMzNDsgJCBnaXQgcHVzaApBZnRlciB0aGUgY29kZSBpcyBwdXNoZWQgYW5kIHRoZSB3YXIgaXMgc3VjY2Vzc2Z1bGx5IGRlcGxveWVkLCB3ZSBjYW4gdmlldyB0aGUgYXBwbGljYXRpb24gcnVubmluZyBhdCBodHRwOi8vbmV3c2FwcC17ZG9tYWluLW5hbWV9LnJoY2xvdWQuY29tLiBNeSBzYW1wbGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBhdCBodHRwOi8vbmV3c2FwcC10MjAucmhjbG91ZC5jb20gLgpOb3cgeW91IGNhbiB0ZXN0IGJ5IHN1Ym1pdHRpbmcgYSBsaW5rIGluIHRoZSBhcHBsaWNhdGlvbiB1aS4KVGhhdOKAmXMgaXQgZm9yIHRvZGF5LiBLZWVwIGdpdmluZyBmZWVkYmFjay4KTmV4dCBTdGVwcw==

Lease: No rent for Las Vegas Raiders at new stadium - Las Vegas Sun Newspaper
April 20, 2017
https://lasvegassun.com/news/2017/apr/20/lease-no-rent-for-raiders-at-las-vegas-stadium
TGVhc2U6IE5vIHJlbnQgZm9yIExhcyBWZWdhcyBSYWlkZXJzIGF0IG5ldyBzdGFkaXVtCkEgZmFuIHdlYXJzIGEgUmFpZGVycyBULXNoaXJ0IG91dHNpZGUgYSBtZWV0aW5nIG9mIHRoZSBMYXMgVmVnYXMgU3RhZGl1bSBBdXRob3JpdHkgb24gVGh1cnNkYXksIEFwcmlsIDIwLCAyMDE3LiBUaGUgUmFpZGVycyB3aWxsIG1vdmUgZnJvbSBPYWtsYW5kIHRvIExhcyBWZWdhcyBhZnRlciBjb25zdHJ1Y3Rpb24gb2YgYSBuZXcgc3RhZGl1bSBpcyBjb21wbGV0ZWQuCkZyb20gc3RhZmYgYW5kIHdpcmUgcmVwb3J0cwpQdWJsaXNoZWQgVGh1cnNkYXksIEFwcmlsIDIwLCAyMDE3IHwgMjowMiBwLm0uClVwZGF0ZWQgVGh1cnNkYXksIEFwcmlsIDIwLCAyMDE3IHwgMjoxNyBwLm0uClRoZSBPYWtsYW5kIFJhaWRlcnMgd291bGQgbm90IHBheSByZW50IGF0IHRoZSBwcm9wb3NlZCBzdGFkaXVtIHRoZXkgd2FudCB0byB1c2UgaW4gTGFzIFZlZ2FzLgpBIGRyYWZ0IG9mIGEgbGVhc2UgYWdyZWVtZW50IGNhbGxpbmcgZm9yIG5vIHJlbnQgd2FzIHVudmVpbGVkIGR1cmluZyBhIFRodXJzZGF5IGdhdGhlcmluZyBvZiB0aGUgcHVibGljIGVudGl0eSBvdmVyc2VlaW5nIHRoZSBwcm9wb3NlZCAkMS45IGJpbGxpb24gcHJvamVjdC4KTGFzIFZlZ2FzIFN0YWRpdW0gQXV0aG9yaXR5IGJvYXJkIENoYWlybWFuIFN0ZXZlIEhpbGwgaGFzIHNhaWQgdGhlIGVudGl0eSwgd2hpY2ggd291bGQgb3duIHRoZSBzdGFkaXVtLCBjYW5ub3QgcmVjZWl2ZSBhbnkgcmV2ZW51ZSBiZWNhdXNlIGl0IGNvdWxkIGNhdXNlIGJvbmRzIGZvciB0aGUgcHJvamVjdCB0byBsb3NlIHRoZWlyIHRheC1leGVtcHQgc3RhdHVzLgpBIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGxlYXNlIGFncmVlbWVudCBjYWxsZWQgZm9yIGEgJDEgYW5udWFsIHJlbnQuClRoZSBSYWlkZXJzIHBhaWQgJDMuNSBtaWxsaW9uIGluIHJlbnQgdG8gcGxheSBhdCBPYWtsYW5kLUFsYW1lZGEgQ291bnR5IENvbGlzZXVtIGluIDIwMTYsIHVwIGZyb20gJDkyNSwwMDAgZm9yIHRoZSAyMDE1IHNlYXNvbi4KTkZMIHRlYW0gb3duZXJzIGFwcHJvdmVkIHRoZSBSYWlkZXJzIHJlbG9jYXRpb24gbGFzdCBtb250aC4KQXQgbGVhc3QgNDYsMDAwIHBlcnNvbmFsIHNlYXQgbGljZW5zZSBkZXBvc2l0cyBoYXZlIGJlZW4gY29sbGVjdGVkIGJ5IHRoZSBSYWlkZXJzIGFzIHRoZXkgcHJlcGFyZSB0byBtb3ZlIHRvIExhcyBWZWdhcyBpbiB0aHJlZSB5ZWFycy4KUmFpZGVycyBQcmVzaWRlbnQgTWFyYyBCYWRhaW4gYW5ub3VuY2VkIHRoYXQgZmlndXJlIGZvciB0aGUgZmlyc3QgdGltZSBpbiB1cGRhdGluZyB0aGUgYm9hcmQgYXQgaXRzIG1lZXRpbmcgYXQgdGhlIENsYXJrIENvdW50eSBHb3Zlcm5tZW50IENlbnRlci4gRWFjaCAkMTAwIGxpY2Vuc2UgZGVwb3NpdCBjb3ZlcnMgb25lIGhvdXNlaG9sZCBhbmQgY291bGQgYWNjb3VudCBmb3IgbXVsdGlwbGUgdGlja2V0cywgbWVhbmluZyB0aGUgdGVhbSBhcHBlYXJzIG9uIHRyYWNrIHRvIGJlIGFibGUgdG8gc2VsbCBtb3JlIHRoYW4gZW5vdWdoIFBTTHMgYW5kIHNlYXNvbiB0aWNrZXRzIHRvIGZpbGwgdGhlIDY1LDAwMC1zZWF0IGRvbWVkIHN0YWRpdW0uCkJhZGFpbiBhbHNvIHRvbGQgdGhlIGJvYXJkIHRoZSB0ZWFtIHdpbGwgYW5ub3VuY2UgcGlja3MgaW4gdGhlIE5GTCBkcmFmdCBmcm9tIHRoZSBMYXMgVmVnYXMgd2VsY29tZSBzaWduIGF0IHRoZSBzb3V0aCBlbmQgb2YgdGhlIFN0cmlwIG9uIFNhdHVyZGF5LCBBcHJpbCAyOS4gVGhhdCBpcyB0aGUgdGhpcmQgYW5kIGZpbmFsIGRheSBvZiB0aGUgZHJhZnQuCkxhcyBWZWdhcyBTdW4gcmVwb3J0ZXIgQWRhbSBDYW5kZWUgYW5kIHRoZSBBc3NvY2lhdGVkIFByZXNzIGNvbnRyaWJ1dGVkIHRvIHRoaXMgcmVwb3J0LgowCkpvaW4gdGhlIERpc2N1c3Npb246CkNoZWNrIHRoaXMgb3V0IGZvciBhIGZ1bGwgZXhwbGFuYXRpb24gb2Ygb3VyIGNvbnZlcnNpb24gdG8gdGhlIExpdmVGeXJlIGNvbW1lbnRpbmcgc3lzdGVtIGFuZCBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHNpZ24gdXAgZm9yIGFuIGFjY291bnQu

Nevada's nuclear dilemma: Inside the reignited fight over Yucca Mountain - Las Vegas Sun Newspaper
May 22, 2017
https://lasvegassun.com/news/2017/may/22/yucca-mountain-nuclear-waste-donald-trump
TmV2YWRh4oCZcyBudWNsZWFyIGRpbGVtbWE6IEluc2lkZSB0aGUgcmVpZ25pdGVkIGZpZ2h0IG92ZXIgWXVjY2EgTW91bnRhaW4KSm9obiBMb2NoZXIvQXNzb2NpYXRlZCBQcmVzcyBmaWxlClBhcnRpY2lwYW50cyBpbiBhIDIwMTUgY29uZ3Jlc3Npb25hbCB0b3VyIG9mIFl1Y2NhIE1vdW50YWluIGVudGVyIHRoZSBwcm9qZWN04oCZcyBzb3V0aCBwb3J0YWwuIFRoZSBzaXRlIGlzIG5lYXIgdGhlIE5ldmFkYSB0b3duIG9mIE1lcmN1cnksIGFib3V0IDkwIG1pbGVzIG5vcnRod2VzdCBvZiBMYXMgVmVnYXMuCkJ5CiggY29udGFjdCApCk1vbmRheSwgTWF5IDIyLCAyMDE3IHwgMiBhLm0uCuKAnFRoZXkgdXNlZCB0byBiZSBsb29raW5nIHRvIHNlZSBpZiB0aGlzIHdhcyBhIHN1aXRhYmxlIHNpdGUuIE5vdyB0aGV54oCZcmUgbG9va2luZyB0byBzZWUgaG93IHRoZXkgY2FuIG1ha2UgaXQgc3VpdGFibGUuIFRoYXQmIzM5O3MgdGhlIGJpZyBzaGlmdCzigJ0gc2FpZCBVLlMuIFJlcC4gRGluYSBUaXR1cywgRC1MYXMgVmVnYXMsIHdobyBoYXMgYmVlbiBhY3RpdmUgaW4gb3Bwb3NpbmcgYSBZdWNjYSBNb3VudGFpbiByZXBvc2l0b3J5IGZvciBtb3JlIHRoYW4gMzAgeWVhcnMuIFRoZSBOdWNsZWFyIFdhc3RlIFBvbGljeSBBY3QgcGFzc2VkIGluIDE5ODIsIGFuZCBhIDE5ODcgYW1lbmRtZW50IHNlYWxlZCBOZXZhZGHigJlzIGZhdGUgYXMgdGhlIHNvbGUgZHVtcGluZyBncm91bmQgZm9yIHRoZSBuYXRpb27igJlzIGhpZ2gtbGV2ZWwgcmFkaW9hY3RpdmUgc2NyYXAuIFNvcnQgb2YuClRoZSDigJxTY3JldyBOZXZhZGEgQmlsbOKAnSBoYXMgbmV2ZXIgYmVlbiByZXNvbHZlZC4gVXBvbiB0aGUgZmVkZXJhbCBkZXNpZ25hdGlvbiBvZiBZdWNjYSBNb3VudGFpbiDigJQgYWJvdXQgOTAgbWlsZXMgZnJvbSBMYXMgVmVnYXMg4oCUIGFzIHRoZSBvbmx5IHZpYWJsZSBzaXRlIGZvciBzdG9yaW5nIG1hbnkgdGhvdXNhbmRzIG9mIHRvbnMgb2YgZGFuZ2Vyb3VzIHdhc3RlLCB0aGUgc3RhdGUgTGVnaXNsYXR1cmUgcGFzc2VkIGEgbGF3IG1ha2luZyBzdWNoIHN0b3JhZ2UgaWxsZWdhbC4gTGVkIGJ5IGZvcm1pZGFibGUgZm9ybWVyIFUuUy4gU2VuLiBIYXJyeSBSZWlkLCBELU5ldi4sIGEgZ2VuZXJhdGlvbiBvZiBsYXdtYWtlcnMgYW5kIHJlc2lkZW50cyBoYXZlIGZvdWdodCBhbmQgZmVhcmVkIHRoZSByZWFsaXphdGlvbiBvZiBhIHZpc2lvbiBpbnRvIHdoaWNoIHRoZSBjb3VudHJ5IGhhcyBhbHJlYWR5IHN1bmsgYW4gZXN0aW1hdGVkICQxNSBiaWxsaW9uLiBEZXNwaXRlIHRoYXQgbWFzc2l2ZSBpbnZlc3RtZW50LCBSZWlkIGFuZCBmb3JtZXIgUHJlc2lkZW50IEJhcmFjayBPYmFtYSBzdWNjZXNzZnVsbHkgZGVyYWlsZWQgdGhlIFl1Y2NhIHBsYW4sIHN0YXJ2aW5nIGl0IG9mIGZ1bmRpbmcgYW5kIHdpdGhkcmF3aW5nIGl0cyBsaWNlbnNlIGFwcGxpY2F0aW9uLgpBUCBQaG90by9Kb2UgQ2F2YXJldHRhClRoaXMgSnVuZSAyNSwgMjAwMiwgZmlsZSBwaG90byBzaG93cyB0aGUgdmlldyBmcm9tIHRoZSBzdW1taXQgcmlkZ2Ugb2YgdGhlIHByb3Bvc2VkIFl1Y2NhIE1vdW50YWluIHJlcG9zaXRvcnkgc2l0ZS4KQ3JpdGljcyBzYXkgc2Vpc21pYyBhY3Rpdml0eSBhbmQgaW5maWx0cmF0aW5nIHdhdGVyIG1ha2UgWXVjY2EgTW91bnRhaW4gdW5maXQsIHdpdGhvdXQgZXZlbiBjb25zaWRlcmluZyB0aGUgdGltZXdvcm4gaW5mcmFzdHJ1Y3R1cmUgdGhhdCB3b3VsZCBiZSB1c2VkIHRvIHRyYW5zcG9ydCB3YXN0ZSBhY3Jvc3MgdGhlIGNvdW50cnkuIFNjaWVudGlzdHMgZG9u4oCZdCBhZ3JlZSBvbiB0aGUgcmlza3Mgb3ZlciB0aG91c2FuZHMgb2YgeWVhcnMsIHdoaWNoIGlzIHdoeSBzdXBwb3J0ZXJzIGNhbGwgZm9yIHRoZSBwcm9qZWN0IHRvIG1vdmUgZm9yd2FyZCBpZiBvbmx5IHRvIGludml0ZSBtb3JlIHN0dWR5LgrigJxXZeKAmXZlIGJlZW4gc3R1ZHlpbmcgaXQgZm9yIDM1IHllYXJzOyB5b3UgZG9u4oCZdCBuZWVkIHRvIHByb2JlIGl0IGFueW1vcmUs4oCdIFRpdHVzIHNhaWQuIOKAnFRoZXkga25vdyB0aGF0IHRoZXJl4oCZcyBhIG1vdmluZyB3YXRlciB0YWJsZSwgdGhleSBrbm93IHRoYXQgdGhlcmUgYXJlIGZhdWx0cyBvdXQgdGhlcmUgLi4uIHRoZXJl4oCZcyBubyBtb3JlIHByb2JpbmcgdGhhdCB0aGV5IG5lZWQgdG8gZG8u4oCdClRoZSBwcmVzaWRlbnQgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgYmVncyB0byBkaWZmZXIuIERvbmFsZCBUcnVtcOKAmXMgTWFyY2ggYnVkZ2V0IHJlcXVlc3QgdG8gcmVzdGFydCB0aGUgbGljZW5zaW5nIHByb2Nlc3MgZm9yIFl1Y2NhIE1vdW50YWluIHdhcyAkMTIwIG1pbGxpb24uIFdoaWxlIHRoZSBidWRnZXQgY2FycnlpbmcgaW50byB0aGlzIGZhbGwgbGVhdmVzIG91dCB0aGF0IGZ1bmRpbmcsIFRpdHVzIHRoaW5rcyBZdWNjYSBoYXMgbW9tZW50dW0sIGNpdGluZyBFbmVyZ3kgU2VjcmV0YXJ5IFJpY2sgUGVycnnigJlzIHJlY2VudCB2aXNpdCB0byB0aGUgc2l0ZS4gUGVycnksIHRoZSBFbmVyZ3kgRGVwYXJ0bWVudCBhbmQgc2V2ZXJhbCBmZWRlcmFsIGFnZW5jaWVzIHdlcmUgc3VlZCBieSBUZXhhcyBBdHRvcm5leSBHZW5lcmFsIEtlbiBQYXh0b24gZm9yIGZhaWxpbmcgdG8gZnVsZmlsbCBhIGZlZGVyYWwgbWFuZGF0ZSB0byBlc3RhYmxpc2ggYSBwZXJtYW5lbnQgcmVwb3NpdG9yeSBmb3IgbnVjbGVhciB3YXN0ZSwgYW5kIGhpcyBtZXNzYWdlIHRvIE5ldmFkYSBsZWFkZXJzaGlwIHdhcyB2YWd1ZSB5ZXQgY2xlYXI6IOKAnFRoZSBzdGF0ZSBvZiBOZXZhZGEgaGFzIGhlbHBlZCBrZWVwIEFtZXJpY2Egc3Ryb25nLCBzYWZlIGFuZCBzZWN1cmUgc2luY2UgdGhlIGVhcmxpZXN0IGRheXMgb2YgdGhlIENvbGQgV2FyLiBJIGxvb2sgZm9yd2FyZCB0byB0aGUgc3RhdGUgb2YgTmV2YWRhIG1haW50YWluaW5nIGl0cyBsZWFkZXJzaGlwIHJvbGUgaW4gQW1lcmljYeKAmXMgc2FmZXR5IGFuZCBzZWN1cml0eS7igJ0KRXZlbiBpbiByZXRpcmVtZW50LCBSZWlkIG1pbmNlZCBubyB3b3JkcyBpbiByZWluZm9yY2luZyBoaXMgb2xkIG1hbnRyYSB0aGF0IFl1Y2NhIGlzIGRlYWQuIOKAnFRoZSBSZXB1YmxpY2FucyBoYXZlIHRvIHVuZGVyc3RhbmQgdGhhdCB0aGV54oCZcmUgbm90IGFib3V0IHRvIGRvIHRoaXMuIC4uLiBUaGV5IGNhbiBwbGF5IGdhbWVzLCBidXQgaXTigJlzIHRocm91Z2guIFl1Y2NhIE1vdW50YWluIHdpbGwgYWx3YXlzIGJlIGEgaG9sZSBpbiB0aGUgc2lkZSBvZiBhIG1vdW50YWluLiBUaGF04oCZcyBhbGwgaXQgaXMu4oCdCk5ldmVydGhlbGVzcywgZGViYXRlIGlzIGhlYXRpbmcgdXAgYWdhaW4gaW4gV2FzaGluZ3RvbiwgRC5DLiBEcmFmdCBsZWdpc2xhdGlvbiBzZWVraW5nIHRvIHB1c2ggdGhlIHByb2plY3QgZm9yd2FyZCBjYW1lIHVwIGZvciBkaXNjdXNzaW9uIGluIGEgSG91c2Ugb2YgUmVwcmVzZW50YXRpdmVzIHN1YmNvbW1pdHRlZSBsYXN0IG1vbnRoLiBBbGwgYnV0IG9uZSBvZiB0aGUgbGF3bWFrZXJzIGluIE5ldmFkYeKAmXMgY29uZ3Jlc3Npb25hbCBkZWxlZ2F0aW9uIGFyZSBjb252ZXJzZWx5IHB1c2hpbmcgZm9yIGxvY2FsIGNvbnNlbnQgd2hlbiBpdCBjb21lcyB0byBzdG9yaW5nIG51Y2xlYXIgd2FzdGUuCuKAnE5vdyB0aGF0IChZdWNjYSBpcykgYmFjayBvbiB0aGUgdGFibGUs4oCdIFRpdHVzIHNhaWQsIOKAnHdl4oCZdmUgZ290IHRvIGJlIHN1cmUgdGhhdCBwZW9wbGUgaGF2ZSB0aGUgaW5mb3JtYXRpb24gYW5kIGNhbiBiZSBtb3RpdmF0ZWQgdG8gZmlnaHQgYWdhaW5zdCBpdC7igJ0K4oCTWXZvbm5lIEdvbnphbGV6Ck5FVkFEQU5TIEFSRSBOT1QgVU5BTklNT1VTCldoZW4gRGFuIFNjaGluaG9mZW4gZmlyc3Qgc3RhcnRlZCBsZWFybmluZyBhYm91dCB0aGUgWXVjY2EgTW91bnRhaW4gcHJvamVjdCBpbiAyMDA1IGFzIGEgUGFocnVtcCByZXNpZGVudCwgaGUgbmV2ZXIgZXhwZWN0ZWQgdG8gYmVjb21lIGEgbGVhZGluZyB2b2ljZSBvbiB0aGUgc3ViamVjdC4K4oCcSXQgd2FzbuKAmXQgb24gbXkgYnVja2V0IGxpc3Qs4oCdIHNhaWQgU2NoaW5ob2Zlbiwgd2hvIG5vdyBzaXRzIG9uIHRoZSBOeWUgQ291bnR5IENvbW1pc3Npb24gYW5kIHNwZWFyaGVhZHMgdGhlIGFyZWHigJlzIHB1c2ggZm9yIHJlc3RhcnRpbmcgY29uc2lkZXJhdGlvbiBvZiDigJx0aGUgc29sZSBjYW5kaWRhdGUgc2l0ZSBmb3IgdGhlIG5hdGlvbuKAmXMgZmlyc3QgaGlnaC1sZXZlbCBjaXZpbGlhbiBudWNsZWFyIHdhc3RlIHJlcG9zaXRvcnks4oCdIGFzIHRoZSBjb3VudHkgd2Vic2l0ZSBwdXRzIGl0LiDigJxXZeKAmXJlIG5vdCBhZHZvY2F0aW5nIGZvciBZdWNjYSBNb3VudGFpbi4gV2XigJlyZSBhZHZvY2F0aW5nIGZvciB0aGUgc2NpZW5jZSB0byBiZSBoZWFyZC7igJ0KV2hpbGUgbW9zdCBzdGF0ZSBvZmZpY2lhbHMgc3RhbmQgb3Bwb3NlZCB0byBhbnkgZnVydGhlciBldmFsdWF0aW9uIG9mIFl1Y2NhIE1vdW50YWluLCBOeWUgQ291bnR5IGpvaW5zIGVpZ2h0IG90aGVyIHJ1cmFsIE5ldmFkYSBjb3VudGllcyBhbmQgVS5TLiBSZXAuIE1hcmsgQW1vZGVpLCBSLUNhcnNvbiBDaXR5LCBpbiBzdXBwb3J0aW5nIHRoZSBwcm9qZWN04oCZcyByZW5ld2VkIG1vbWVudHVtIHVuZGVyIHRoZSBhZG1pbmlzdHJhdGlvbiBvZiBEb25hbGQgVHJ1bXAuCk5ldmFkYW5zIG9uIFl1Y2NhIE1vdW50YWluCkluIGEgcG9sbCBvZiA3MDAgcmVzaWRlbnRzIGxhc3QgTWF5LCB0aGUgbWFqb3JpdHkgd2FzIG9wcG9zZWQuIFRoZSBzdXJ2ZXksIGNvbW1pc3Npb25lZCBieSB0aGUgbm9ucHJvZml0IHRoaW5rIHRhbmsgQ2VudGVyIGZvciBXZXN0ZXJuIFByaW9yaXRpZXMsIGZvdW5kIHRoYXQgNTEgcGVyY2VudCB3ZXJlIG1vcmUgbGlrZWx5IHRvIHN1cHBvcnQgYSBjYW5kaWRhdGUgd2hvIHdvdWxkIGJsb2NrIHRoZSBwcm9qZWN0LCAyNiBwZXJjZW50IHNhaWQgYSBjYW5kaWRhdGXigJlzIHN0YW5jZSB3b3VsZG7igJl0IGFmZmVjdCB0aGVpciB2b3RlLCBhbmQgMjMgcGVyY2VudCB3ZXJlIGxlc3MgbGlrZWx5IHRvIHN1cHBvcnQgdGhlIGNhbmRpZGF0ZS4gVm90ZXJzIGZyb20gYWxsIHBhcnRpZXMgZm9sbG93ZWQgdGhpcyB0cmVuZC4KTnllIENvdW50eSBzdGFuZHMgdG8gYmVuZWZpdCBmaW5hbmNpYWxseSBmcm9tIFl1Y2NhIE1vdW50YWluIGlmIGl0IHdlcmUgdG8gYmUgZm91bmQgc2FmZSBhbmQgY29uc3RydWN0ZWQuIEluIHByZXZpb3VzIHllYXJzIHdoZW4gdGhlIHByb2plY3Qgd2FzIHVuZGVyIGFjdGl2ZSBjb25zaWRlcmF0aW9uLCB0aGUgZmVkZXJhbCBnb3Zlcm5tZW50IHByb3ZpZGVkIHRoZSBjb3VudHkgdXAgdG8gJDUgbWlsbGlvbiBwZXIgeWVhci4gQ29uc3RydWN0aW9uIGFuZCBvcGVyYXRpb24gb2YgYSBZdWNjYSBNb3VudGFpbiBmYWNpbGl0eSBjb3VsZCBwcm9kdWNlIGEgd2luZGZhbGwgZm9yIGFuIGFyZWEgd2l0aG91dCBtdWNoIG90aGVyIHNpZ25pZmljYW50IGVjb25vbWljIGRldmVsb3BtZW50LgrigJxJZiBpdOKAmXMgc2FmZSwgd2hvIHdvdWxkIHNheSBubyB0byBhIG11bHRpZ2VuZXJhdGlvbiwgbXVsdGliaWxsaW9uLWRvbGxhciBwcm9qZWN0P+KAnSBTY2hpbmhvZmVuIHNhaWQuCkRyLiBNaWNoYWVsIFZvZWdlbGUgd29ya2VkIGFzIHBhcnQgb2YgYSB0ZWFtIG9mIHNjaWVudGlzdHMgY2hhcmdlZCB3aXRoIGRldGVybWluaW5nIGlmIHRlbnMgb2YgdGhvdXNhbmRzIG9mIHRvbnMgb2Ygc3BlbnQgbnVjbGVhciBmdWVsIHNhZmVseSBjb3VsZCBiZSBzdG9yZWQgZGVlcCBiZW5lYXRoIGdyb3VuZCBhdCB0aGUgWXVjY2EgTW91bnRhaW4gc2l0ZS4gVm9lZ2VsZSwgd2hvIHdvcmtlZCBvbiB0aGUgRGVwYXJ0bWVudCBvZiBFbmVyZ3kgbGljZW5zZSBhcHBsaWNhdGlvbiB0byB0aGUgTnVjbGVhciBSZWd1bGF0b3J5IENvbW1pc3Npb24sIHByZXZpb3VzbHkgd29ya2VkIGFzIGEgY29uc3VsdGFudCBmb3IgTnllIENvdW50eSBhbmQgam9pbnMgU2NoaW5ob2ZlbiBpbiBhZHZvY2F0aW5nIGZvciBhIGNvbnRpbnVlZCBZdWNjYSBwcm9jZXNzLgrigJxUaGUgTlJDIHJldmlld2VkIHRoZSB3b3JrIHRoYXQgd2UgZGlkIGFuZCB0aG91Z2h0IHRoYXQgd2UgZGlkIGEgZ29vZCBqb2Is4oCdIFZvZWdlbGUgc2FpZC4g4oCcVGhlIHByb2dyYW0gd2FzIHN0b3BwZWQgYnkgYW4gYWRtaW5pc3RyYXRpb24gdGhhdCBkaWQgbm90IGZvbGxvdyB0aGUgbGF3LuKAnQpIb3BlIGZvciBhIHJlc3RhcnQgb2YgdGhlIGxvbmctZGViYXRlZCBwcm9ncmFtIGdyZXcgd2l0aCBSZWlk4oCZcyByZXRpcmVtZW50IGFuZCB0aGUgZWxlY3Rpb24gb2YgVHJ1bXAsIHdobyBhbG9uZyB3aXRoIEVuZXJneSBTZWNyZXRhcnkgUmljayBQZXJyeSBhY3RzIGZhdm9yYWJseSB0b3dhcmQgWXVjY2EgTW91bnRhaW4uIFRydW1w4oCZcyBmaXJzdCBidWRnZXQgcmVxdWVzdCBpbmNsdWRlZCAkMTIwIG1pbGxpb24gdG93YXJkIHJlc3RhcnRpbmcgdGhlIHByb2plY3QuCkluIGFuIGlkZWFsIHNpdHVhdGlvbiwgU2NoaW5ob2ZlbiBzYWlkLCBZdWNjYSBNb3VudGFpbiB3b3VsZCByZWNlaXZlIGEgZnVsbCBzY2llbnRpZmljIHZldHRpbmcg4oCUIHNvbWV0aGluZyBwcm9qZWN0IG9wcG9uZW50cyBmZWVsIHN1ZmZpY2llbnRseSBoYXMgaGFwcGVuZWQsIGJ1dCBOeWUgQ291bnR5IHN1cHBvcnRlcnMgZG8gbm90LgrigJxXZeKAmWQgZm9sbG93IHRoZSBsYXcsIHdl4oCZZCBoYXZlIHRoZSBoZWFyaW5ncywgdGhlIHNjaWVuY2UgaXMgdmV0dGVkIHBlciB0aGUgTlJDIGFuZCB0aGVuIHdl4oCZZCBmaW5kIG91dCBpZiBpdOKAmXMgc2FmZSB0byBjb25zdHJ1Y3Qs4oCdIFNjaGluaG9mZW4gc2FpZC4KSW4gcGFzdCB5ZWFycywgc29tZSBwb2xpdGljaWFucyBhbmQgbG9jYWwgb2ZmaWNpYWxzIGhhdmUgYWR2b2NhdGVkIHRoYXQgTmV2YWRhIG5lZ290aWF0ZSBmb3IgdGhlIGJlc3QgZGVhbCBwb3NzaWJsZSBpbiBleGNoYW5nZSBmb3IgYWNjZXB0aW5nIHRoZSBwcm9qZWN0LiBTcGVha2luZyBvbiBiZWhhbGYgb2YgdGhlIGNvdW50eSwgU2NoaW5ob2ZlbiBjb3VsZCBub3QgcGVnIHdoYXQgYSBwb3RlbnRpYWwgY29tcGVuc2F0aW9uIGZpZ3VyZSBtaWdodCBsb29rIGxpa2UuIOKAnFRoZXJl4oCZcyBubyBudW1iZXIgSSBjb3VsZCBsYW5kIG9uIHRvIHNheSBnaXZlIHVzICQ1MCBtaWxsaW9uIHVwIGZyb250IGFuZCBnaXZlIHVzICQxMCBtaWxsaW9uIGEgeWVhci7igJ0K4oCTQWRhbSBDYW5kZWUKSGlsYXJ5IFN3aWZ0IC8gVGhlIE5ldyBZb3JrIFRpbWVzCkRhd24gYXQgdGhlIFUuUy4gQ2FwaXRvbCBpbiBXYXNoaW5ndG9uLCBKYW4uIDE5LCAyMDE3LgpMRUdJU0xBVElWRSBBUFBST0FDSEVTIFRPIFJFU09MVklORyBZVUNDQSBNT1VOVEFJTiBHTyBIRUFELVRPLUhFQUQKTnVjbGVhciBXYXN0ZSBJbmZvcm1lZCBDb25zZW50IEFjdDogUGVybWl0cyB0aGUgTnVjbGVhciBSZWd1bGF0b3J5IENvbW1pc3Npb24gdG8gYXV0aG9yaXplIGEgd2FzdGUgcmVwb3NpdG9yeSBvbmx5IGlmIHRoZSBzZWNyZXRhcnkgb2YgZW5lcmd5IG9idGFpbnMgd3JpdHRlbiBjb25zZW50IGZyb20gdGhlIGdvdmVybm9yIG9mIHRoZSBob3N0IHN0YXRlIGFuZCBhZmZlY3RlZCBsb2NhbCBnb3Zlcm5tZW50cywgYXMgd2VsbCBhcyBJbmRpYW4gdHJpYmVzLiBJZiB0aGUgYWN0IHBhc3NlZCwgWXVjY2EgY291bGQgb25seSBiZSByZXZpdmVkIHdpdGggc3VjaCBhcHByb3ZhbC4gRGVzcGl0ZSB0aGUgZ292ZXJub3IgYW5kIGFsbCBidXQgb25lIG1lbWJlciBvZiBOZXZhZGHigJlzIGNvbmdyZXNzaW9uYWwgZGVsZWdhdGlvbiBvcHBvc2luZyB0aGUgZHVtcCBzaXRlLCB0aGlzIG9wdGlvbiB3b3VsZCBhbGxvdyBmdXJ0aGVyIGRpc2N1c3Npb24gYW5kIHBvdGVudGlhbCBzdHVkeSBvZiBZdWNjYSBNb3VudGFpbiBpZiBzdXBwb3J0aW5nIHJ1cmFsIGNvdW50aWVzIHdlcmUgYWJsZSB0byBnYWluIHRyYWN0aW9uLgpOZXZhZGHigJlzIERlbW9jcmF0aWMgVS5TLiBSZXBzLiBSdWJlbiBLaWh1ZW4sIEphY2t5IFJvc2VuIGFuZCBEaW5hIFRpdHVzIGhhdmUgc2lnbmVkIG9udG8gdGhlIGNvbnNlbnQgYWN0LiBUaXR1cywgdGhlIHByaW1hcnkgc3BvbnNvciwgc2FpZCBpdCByZWZsZWN0ZWQgcmVjb21tZW5kYXRpb25zIGZyb20gdGhlIE9iYW1hIGFkbWluaXN0cmF0aW9u4oCZcyBCbHVlIFJpYmJvbiBDb21taXNzaW9uIG9uIEFtZXJpY2HigJlzIE51Y2xlYXIgRnV0dXJlLgpVLlMuIFNlbnMuIERlYW4gSGVsbGVyLCBSLU5ldi4sIGFuZCBDYXRoZXJpbmUgQ29ydGV6IE1hc3RvLCBELU5ldi4sIGhhdmUgc3BvbnNvcmVkIGEgc2ltaWxhciBTZW5hdGUgbWVhc3VyZSAuIEluIGEgbGV0dGVyIHRvIEVuZXJneSBTZWNyZXRhcnkgUmljayBQZXJyeSAsIEhlbGxlciB3cm90ZTog4oCcVGhpcyBvcGVuIHByb2Nlc3MgZW5zdXJlcyBhbGwgQW1lcmljYW5zIGhhdmUgYSBtZWFuaW5nZnVsIHZvaWNlIGluIHRoZSBwcm9jZXNzIGlmIHRoZWlyIGNvbW11bml0eSBpcyBiZWluZyBjb25zaWRlcmVkIGZvciBhIGZ1dHVyZSBudWNsZWFyIHdhc3RlIHJlcG9zaXRvcnkuIFJhdGhlciB0aGFuIGF0dGVtcHRpbmcgdG8gZm9yY2UgdGhlIGZhaWxlZCBZdWNjYSBNb3VudGFpbiBwcm9wb3NhbCBvbiBOZXZhZGFucywgVS5TLiB0YXhwYXllcnPigJkgZG9sbGFycyB3b3VsZCBiZSBiZXR0ZXIgc3BlbnQgb24gZnVydGhlciBpbXBsZW1lbnRpbmcgeW91ciBhZ2VuY3nigJlzIHBhc3QgZWZmb3J0cyBvbiBjb25zZW50LWJhc2VkIHNpdGluZy4gVGhpcyB3b3J0aHdoaWxlIGluaXRpYXRpdmUgd2lsbCBlbnN1cmUgdGhhdCBubyBzdGF0ZSB3aWxsIGJlIGZvcmNlZCB0byBhY2NlcHQgbnVjbGVhciB3YXN0ZSBhZ2FpbnN0IGl0cyBvd24gd2lsbC7igJ0KVS5TLiBSZXAuIE1hcmsgQW1vZGVpLCBSLUNhcnNvbiBDaXR5LCBoYXMgbm90IHNpZ25lZCBvbnRvIHRoZSBjb25zZW50IGFjdCBhbmQgc2F5cyBDb25ncmVzcyBhbmQgdGhlIERlcGFydG1lbnQgb2YgRW5lcmd5IHNob3VsZCBtYWtlIHRoZSBZdWNjYSBzaXRlIGEgY2VudGVyIGZvciByZXNlYXJjaCBhcyB3ZWxsIGFzIHJlcHJvY2Vzc2luZy4K4oCcV2hpbGUgc29tZSBvZiBteSBjb2xsZWFndWVzIGluIHRoZSBkZWxlZ2F0aW9uIGhhdmUgc3VjY2Vzc2Z1bGx5IG1hbmFnZWQgdG8gc2xvdyB0aGUgcHJvamVjdCB0aHJvdWdoIHRoZSBjb25ncmVzc2lvbmFsIGFwcHJvcHJpYXRpb25zIHByb2Nlc3MsIEkgZG8gbm90IGJlbGlldmUgaXQgaXMgYSDigJhkZWFk4oCZIGlzc3VlIGFuZCB0aGluayBpdCBpcyBtb3JlIGxpa2VseSB0aGUgcmVwb3NpdG9yeSB3aWxsIGV2ZW50dWFsbHkgY29tZSB0byBmcnVpdGlvbiB0aHJvdWdoIGEgc291bmQgc2NpZW50aWZpYyBwcm9jZXNzIG92ZXIgdGltZSzigJ0gQW1vZGVpIGhhcyBzYWlkIGluIHRoZSBwYXN0LgpOdWNsZWFyIFdhc3RlIFBvbGljeSBBbWVuZG1lbnRzIEFjdCBvZiAyMDE3OiBCeXBhc3NlcyBiYXJyaWVycyB0byBhZHZhbmNpbmcgWXVjY2EgYnkgZ2l2aW5nIG1vcmUgY29udHJvbCBvdmVyIGFpciBhbmQgd2F0ZXIgcGVybWl0dGluZyB0byB0aGUgZmVkZXJhbCBnb3Zlcm5tZW50LCBhcyB0aGUgc3RhdGUgaGFzIGJsb2NrZWQgY2VydGFpbiBwZXJtaXRzIGluIHRoZSBwYXN0LiBJbiBhZGRpdGlvbiwgdGhlIGJpbGwgZWxpbWluYXRlcyB0aGUgY3VycmVudCByZXF1aXJlbWVudCB0aGF0IHRoZSBmZWRlcmFsIGdvdmVybm1lbnQgbWFrZSBwcm9ncmVzcyBvbiBzaXRpbmcgYSBzZWNvbmQgcmVwb3NpdG9yeSBhbmQgdGhlIGNhcGFjaXR5IGNhcCBmb3IgWXVjY2Egb2YgNzAsMDAwIG1ldHJpYyB0b25zIG9mIHdhc3RlLiBCaWxsIHN1cHBvcnRlcnMgc2F5IE5ldmFkYeKAmXMg4oCcdGVjaG5pY2FsIG9iamVjdGlvbnPigJ0gd291bGQgYmUgYXNzZXNzZWQgYW5kIGFkZHJlc3NlZCB0aHJvdWdoIHRoZSBsb25nLWF3YWl0ZWQgbW92ZW1lbnQgb24gdGhlIGxpY2Vuc2luZyBwcm9jZXNzLgrigJxPdXIgZ29hbCBoZXJlIGlzIHRvIGlkZW50aWZ5IHRoZSByaWdodCByZWZvcm1zIHRvIGVuc3VyZSB3ZSBjYW4gZnVsZmlsbCB0aGUgZ292ZXJubWVudOKAmXMgb2JsaWdhdGlvbiB0byBkaXNwb3NlIG9mIG91ciBuYXRpb27igJlzIG51Y2xlYXIgbWF0ZXJpYWws4oCdIFUuUy4gUmVwLiBKb2huIFNoaW1rdXMsIFItSWxsLiBhbmQgY2hhaXJtYW4gb2YgdGhlIEVuZXJneSBhbmQgQ29tbWVyY2UgU3ViY29tbWl0dGVlIG9uIEVudmlyb25tZW50IGFuZCB0aGUgRWNvbm9teSwgc2FpZCBkdXJpbmcgYW4gQXByaWwgbWVldGluZy4KU2hpbWt1cyBwb2ludHMgdG8gdGhlIGJpbGxpb25zIHBhaWQgYnkgdXRpbGl0eSByYXRlcGF5ZXJzIGluIHN0YXRlcyB0aGF0IHByb2R1Y2UgbnVjbGVhciBlbmVyZ3kgdG8gZGV2ZWxvcCBZdWNjYSBNb3VudGFpbiwgd2l0aCBsaXR0bGUgcHJvZ3Jlc3MgbWFkZSBvdmVyIHRoZSBkZWNhZGVzLiBPcHBvbmVudHMgY29udGVuZCB0aGUgZHJhZnQgbGVnaXNsYXRpb24gZG9lc27igJl0IHByb3ZpZGUgZW5vdWdoIHRpbWUgZHVyaW5nIHRoZSBsaWNlbnNpbmcgcHJvY2VzcyBmb3IgTmV2YWRh4oCZcyBtb3JlIHRoYW4gMjAwIGNvbnRlbnRpb25zIHRvIGJlIGhlYXJkLgpTdGV2ZSBGcmlzaG1hbiwgY29uc3VsdGFudCBmb3IgdGhlIE5ldmFkYSBBZ2VuY3kgZm9yIE51Y2xlYXIgUHJvamVjdHMgYW5kIEF0dG9ybmV5IEdlbmVyYWzigJlzIE9mZmljZSwgc2F5cyB0aGUgYmlsbCBhbHNvIGF0dGVtcHRzIHRvIGFkZHJlc3MgYSBwcmV0dHkgdW5wcmVjZWRlbnRlZCBwcm9ibGVtOiBjb21taXR0aW5nIHRvIGEgY2VudHVyeSBvZiBhcHByb3ByaWF0aW9ucyBmb3Igb25lIHNwZWNpZmljIHByb2plY3QuIEhlIHNhaWQgaXQgd291bGQgYWxsb3cgWXVjY2EgZnVuZGluZyB0byBza2lwIGN5Y2xpY2FsIGNvbmdyZXNzaW9uYWwgYXBwcm92YWwuIOKAnFRoaXMgaGFzIGFsd2F5cyBiZWVuIHNlZW4gYXMgYSBwcm9ibGVtLOKAnSBGcmlzaG1hbiBzYWlkLiDigJxDb25ncmVzcyBydW5zIGhvdCBhbmQgY29sZCBvbiB0aGlzIHByb2plY3QgYXQgdmFyaW91cyB0aW1lcy7igJ0K4oCTWXZvbm5lIEdvbnphbGV6CkFQIFBob3RvL0pvZSBDYXZhcmV0dGEKUHJvdGVzdGVycyBvZiB0aGUgcHJvcG9zZWQgWXVjY2EgTW91bnRhaW4gbnVjbGVhciB3YXN0ZSByZXBvc2l0b3J5IGFuZCB3ZWFwb25zIHRlc3RpbmcgbGllIG9uIHRoZSBwYXZlbWVudCBhZnRlciBjcm9zc2luZyB0aGUgbGluZSBpbnRvIHRoZSBOZXZhZGEgVGVzdCBTaXRlIGluIE1lcmN1cnkuIER1cmluZyB0aGUgc3ByaW5nIDIwMDMgZGVtb25zdHJhdGlvbiwgMzQgcGVvcGxlIHdlcmUgYXJyZXN0ZWQgZm9yIHRyZXNwYXNzaW5nLgpDT05DRVJOUyBTVVJST1VORElORyBZVUNDQSBNT1VOVEFJTgpJbiAyMDEwLCBqdXN0IGFzIFl1Y2NhIE1vdW50YWluIHdhcyBnb2luZyBkb3JtYW50LCBKb2huIETigJlBZ2F0YeKAmXMg4oCcQWJvdXQgYSBNb3VudGFpbuKAnSB3YXMgcmVsZWFzZWQuIFRoZSBub25maWN0aW9uIGJvb2sgbG9va2VkIGF0IHRoZSBwcm9wb3NlZCByZXBvc2l0b3J5IGluIHRlcm1zIG9mIHBvc3NpYmlsaXR5IGFzIHdlbGwgYXMgcHJvYmFiaWxpdHksIHRoZSBzY2llbnRpc3TigJlzIGdvLXRvIGxlbnMgb24gcmlzay4g4oCcSW4gaXRzIG93biBzdHVkaWVzIGZvciBZdWNjYSBNb3VudGFpbiwgdGhlIERlcGFydG1lbnQgb2YgRW5lcmd5IGNvbnNpZGVyZWQg4oCYcmVhc29uYWJseSBmb3Jlc2VlYWJsZSBpbmNpZGVudHPigJkgZHVyaW5nIHRoZSBzaGlwcGluZyBvZiBpdHMgd2FzdGUgdG8gWXVjY2EsIGJ1dCBub3QgdGhlIOKAmHdvcnN0LWNhc2UgY3JlZGlibGXigJkgb25lcyzigJ0gROKAmUFnYXRhIHdyb3RlLCBzaGFyaW5nIHRoZSBET0XigJlzIHJlc3VsdGluZyBlc3RpbWF0aW9uIG9mIGEgMS1pbi0xMCBtaWxsaW9uIGNoYW5jZSBvZiBhIHNlcmlvdXMgYWNjaWRlbnQgdW5sZWFzaGluZyB0aGUgcmFkaW9hY3RpdmUgd2FzdGUuIOKAnFlldCwgd2hlbiBpdCBjb21lcyB0byBhIHBsYWNlIGxpa2UgdGhlIGNpdHkgb2YgTGFzIFZlZ2FzLCB3aGVyZSBuaW5lIGRlbGl2ZXJpZXMgb2YgbnVjbGVhciB3YXN0ZSBjb3VsZCBiZSBhcnJpdmluZyBldmVyeSBkYXksIHRob3NlIDEtaW4tMTAgbWlsbGlvbiBvZGRzIG92ZXIgYSA0MC15ZWFyIHBlcmlvZCBhcmUgbW9yZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkIGJ5IGEgZmlndXJlIG9mIDEtaW4tMjcsMDAwIG9kZHMsIHRodXMgbWFraW5nIHRoZSBwcm9iYWJpbGl0eSBvZiBhIG51Y2xlYXIgYWNjaWRlbnQgaW4gVmVnYXMgaGlnaGVyIHRoYW4gdGhlIHBvc3NpYmlsaXR5IG9mIHN0cmlraW5nIGl0IHJpY2ggaW4gYSBjYXNpbm8u4oCdIFRoZSBhdXRob3IgZWNob2VkIFJ1dGdlcnMgVW5pdmVyc2l0eSBzb2Npb2xvZ2lzdCBMZWUgQ2xhcmtlIGluIGNvbnRlbmRpbmcgdGhhdCBpdCB3YXMgZGFuZ2Vyb3VzIHRvIGNvbmNlbnRyYXRlIHNvIG11Y2ggb24gcHJvYmFiaWxpdGllcywgYXMg4oCcdGhpbmdzIHRoYXQgaGF2ZSBuZXZlciBoYXBwZW5lZCBiZWZvcmUgaGFwcGVuIGFsbCB0aGUgdGltZS7igJ0KVHJhbnNwb3J0aW5nIG51Y2xlYXIgd2FzdGUgdG8gdGhlIHNpdGUKSG93IG11Y2ggd2FzdGUgY291bGQgdHJhdmVsIG5lYXIgTGFzIFZlZ2FzPwpTcGVudCB1cmFuaXVtIGluIHRoZSBmdWVsIHJvZHMgcmVtYWlucyByYWRpb2FjdGl2ZSBmb3IgdGhvdXNhbmRzIG9mIHllYXJzIGFuZCBtdXN0IGJlIHN0b3JlZCBpbiBjYXNrcyB3aXRoIHNwZWNpYWwgc2hpZWxkaW5nLiBBcyBtYW55IGFzIDExMCB0cmFpbmxvYWRzIGNvdWxkIHRyYXZlbCBuZWFyIExhcyBWZWdhcyBwZXIgeWVhciwgYW5kIHVwIHRvIHR3byB0cnVja3MgY291bGQgdHJhdmVsIG5lYXIgdGhlIGNpdHkgcGVyIHdlZWsuClNlcmlvdXMgcmlza3MgY29tZSB3aXRoIHNoaXBwaW5nIGhpZ2gtbGV2ZWwgbnVjbGVhciB3YXN0ZSB0byBOZXZhZGEsIGVzcGVjaWFsbHkgYmVjYXVzZSBtdWNoIG9mIHRoZSBuYXRpb27igJlzIHN0b2NrcGlsZSB3b3VsZCBjb21lIGZyb20gYWNyb3NzIHRoZSBjb3VudHJ5IGJ5IHJhaWwgYW5kIGhpZ2h3YXksIGluY3JlYXNpbmcgdGhlIGZpZWxkIG9mIHBvdGVudGlhbCBjb250YW1pbmF0aW9uIHN1YnN0YW50aWFsbHkuIEluZHVzdHJ5IHB1YmxpY2F0aW9uIEUmYW1wO0UgTmV3cyB3cm90ZSB0aGF0IHJhaWwgY2FycyBjb3VsZCBydW4gbmVhciB0aGUgVHJ1bXAgSW50ZXJuYXRpb25hbCBIb3RlbCBvbiB0aGUgU3RyaXAsIHRob3VnaCBubyByb3V0ZSBoYXMgYmVlbiBmaW5hbGl6ZWQuIE90aGVyIGNvbmNlcm5zIGluY2x1ZGUgaGFuZGxlcnMgYW5kIGRyaXZlcnMgYmVpbmcgZXhwb3NlZCB0byByYWRpb2FjdGl2ZSBtYXRlcmlhbHMgYW5kIHRoZSBwb3NzaWJpbGl0eSBvZiBhbiBhY2NpZGVudCByZWxlYXNpbmcgcmFkaW9hY3RpdmUgbWF0ZXJpYWxzIGludG8gdGhlIGVudmlyb25tZW50LgpHcm91bmR3YXRlciBwb2xsdXRpb24gYW5kIGVyb3Npb24KVGhlIGZlZGVyYWwgZ292ZXJubWVudCBpbml0aWFsbHkgYXJndWVkIHRoYXQgWXVjY2EgTW91bnRhaW4gc2VydmVkIGFzIGEgc3VpdGFibGUgZ2VvbG9naWMgZm9ybWF0aW9uIGZvciBudWNsZWFyIHdhc3RlIHN0b3JhZ2UgYmVjYXVzZSBhcmlkIGNvbmRpdGlvbnMgd291bGQgcHJldmVudCB3YXRlciBmcm9tIHRyYXZlbGluZyBxdWlja2x5IHRocm91Z2ggaXRzIGluZnJhc3RydWN0dXJlLiBSZWd1bGF0aW9ucyBmb3Igc2l0aW5nIG51Y2xlYXIgcmVwb3NpdG9yaWVzIHJlcXVpcmVkIHRoZSBnb3Zlcm5tZW50IHRvIGRpc3F1YWxpZnkgc2l0ZXMgaWYgZ3JvdW5kd2F0ZXIgZmxvd2VkIHRocm91Z2ggdGhlIGVudmlyb25tZW50IGZvciBhbnkgcGVyaW9kIHVuZGVyIDEsMDAwIHllYXJzLiBUaGUgd29ycnkgYWx3YXlzIHdhcyB0aGF0IHdhdGVyIGNvdWxkIGNvcnJvZGUgdGhlIHN0b3JhZ2UgY29udGFpbmVycywgdGh1cyByZWxlYXNpbmcgcmFkaW9hY3RpdmUgbWF0ZXJpYWxzIGludG8gdGhlIGVudmlyb25tZW50IGFuZCB0aGUgZ3JvdW5kd2F0ZXIuIEhvd2V2ZXIsIGluIDE5OTYsIERlcGFydG1lbnQgb2YgRW5lcmd5IHJlc2VhcmNoZXJzIGRpc2NvdmVyZWQgYW4gaXNvdG9wZSBrbm93biBhcyBDaGxvcmluZS0zNiBhdCBZdWNjYSBNb3VudGFpbi4gSXQgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZSBDaGxvcmluZS0zNiB3YXMgZmlyc3QgaW50cm9kdWNlZCBpbnRvIHRoZSBhdG1vc3BoZXJlIHdpdGggbnVjbGVhciB0ZXN0aW5nIGNvbmR1Y3RlZCBpbiB0aGUgUGFjaWZpYyBPY2Vhbi4gVGhpcyBzdWdnZXN0ZWQsIGFzIHNldmVyYWwgTmV2YWRhIHNjaWVudGlzdHMgaGFkIHdhcm5lZCwgdGhhdCB3YXRlciB0cmF2ZWxlZCB0aHJvdWdoIHRoZSBtb3VudGFpbiBtb3JlIHJhcGlkbHkgdGhhbiBleHBlY3RlZC4gSW4gcmVzcG9uc2UsIHRoZSBET0Ugc2FpZCBpdCB3b3VsZCBpbnN0YWxsIHRpdGFuaXVtIOKAnGRyaXAgc2hpZWxkc+KAnSBhcm91bmQgdGhlIHdhc3RlIGNhbmlzdGVycyB0byBwcmV2ZW50IG1hdGVyaWFscyBmcm9tIGJsZWVkaW5nIGludG8gdGhlIG1vdW50YWluLgpTZWlzbWljIGFjdGl2aXR5IGNhdXNpbmcgbGVha2FnZQpTYW0gTW9ycmlzCkEgcHJvdGVzdG9yIGhvbGRzIGEgc2lnbiBkdXJpbmcgdGhlIERlcGFydG1lbnQgb2YgRW5lcmd5JiMzOTtzIHB1YmxpYyBoZWFyaW5nIG9uIHRoZSBwcm9wb3NlZCBZdWNjYSBNb3VudGFpbiBSZXBvc2l0b3J5IFNlcHQuIDUsIDIwMDEuCk5ldmFkYSBvZmZpY2lhbHMgYW5kIG9wcG9uZW50cyBvZiBZdWNjYSBoYXZlIGxvbmcgYXJndWVkIHRoYXQgdGhlIHNpdGluZyBpcyB1bnN1aXRhYmxlIGJlY2F1c2UgdGhlIG1vdW50YWluIHJlc3RzIG9uIGVhcnRocXVha2UgZmF1bHRzLiBUaGUgc3RhdGUgc2F5cyB0aGlzIGNvdWxkIHBvc2Ugcmlza3MgZHVyaW5nIHRoZSBlbXBsYWNlbWVudCBwaGFzZSBhbmQgYWZ0ZXIgdGhlIHdhc3RlIGhhcyBiZWVuIHN0YXNoZWQgYXdheSBpbiB0aGUgbW91bnRhaW4uIEZhdWx0IG1vdmVtZW50LCBmb3IgaW5zdGFuY2UsIGNvdWxkIGFmZmVjdCB0aGUgd2F0ZXIgdGFibGUgYW5kIGdlb2xvZ2ljIHN0cnVjdHVyZXMsIGxlYWRpbmcgdG8gdGhlIHJlbGVhc2Ugb2YgcmFkaW9hY3RpdmUgbWF0ZXJpYWxzLiBUaGUgRE9FIGFuZCBzb21lIHVuYWZmaWxpYXRlZCBzY2llbnRpc3RzIGRpc2FncmVlLiBUaGV5IGFja25vd2xlZGdlIHRoYXQgWXVjY2EgTW91bnRhaW4gc2l0cyBvbiBzZXZlcmFsIGZhdWx0IGxpbmVzLCBidXQgdGhleSBjb250ZW5kIHRoYXQgdGhlIHRlY3RvbmljcyBhcmUgbm90IHBvd2VyZnVsIGVub3VnaCB0byBjcmVhdGUgYW4gZWFydGhxdWFrZSB0aGF0IHdvdWxkIGFmZmVjdCB0aGUgcmVwb3NpdG9yeS4gSW4gdGhlIHBhc3QsIHRoZSBkZXBhcnRtZW50IGhhcyBhZGp1c3RlZCBpdHMgcGxhbnMgdG8gYXZvaWQgb25lIG9mIHRoZSBtYWpvciBmYXVsdCBsaW5lcy4KT25lIGFsdGVybmF0aXZlIHRvIHN0b3JhZ2UKTnVjbGVhciByZXByb2Nlc3NpbmcgcmVjb3ZlcnMgc29tZSBzcGVudCBudWNsZWFyIGZ1ZWwgZm9yIHJldXNlLiBUaGUgcHJvY2VzcyBpcyB1c2VkIGluIEphcGFuIGFuZCBpbiBFdXJvcGUsIGJ1dCBpdCBoYXMgYmVlbiBzbG93IHRvIGNhdGNoIG9uIGluIHRoZSBVLlMuLCBpbiBwYXJ0IGJlY2F1c2Ugb2YgdGhlIGNvc3QsIHdoaWNoIGNvdWxkIHJhaXNlIGVsZWN0cmljaXR5IHJhdGVzIG9yIGZ1cnRoZXIgYnVyZGVuIHRoZSBjb3VudHJ54oCZcyBhdHJvcGh5aW5nIG51Y2xlYXIgaW5kdXN0cnkuIEluIDIwMTIsIHRoZSBCbHVlIFJpYmJvbiBDb21taXNzaW9uIHNhaWQgdGhlIG1vdmUgd2FzIHByZW1hdHVyZSDigJxnaXZlbiB0aGUgbGFyZ2UgdW5jZXJ0YWludGllcyAuLi4gYWJvdXQgdGhlIG1lcml0cyBhbmQgY29tbWVyY2lhbCB2aWFiaWxpdHkgb2YgZGlmZmVyZW50IGZ1ZWwgY3ljbGVzIGFuZCB0ZWNobm9sb2d5IG9wdGlvbnMu4oCdClRlcnJvcmlzbSBhbmQgc2VjdXJpdHkgcmlza3MKQW4gdW5zZXR0bGluZyBuYXRpb25hbCBzZWN1cml0eSBjb25jZXJuIGlzIHRpZWQgdG8gdGhlIFl1Y2NhIHBsYW4uIERvZXMgYSBrbm93biB3YXN0ZSByZXBvc2l0b3J5IHR1cm4gWXVjY2EgTW91bnRhaW4gaW50byBhIHRlcnJvcmlzdCB0YXJnZXQ/IFByb3BvbmVudHMgc2F5IHN0b3JpbmcgdGhlIGNvdW50cnnigJlzIHNwZW50IG51Y2xlYXIgZnVlbCBpbiBvbmUgcGxhY2UgaXMgYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgc3lzdGVtLCB3aGVyZSBmdWVsIGlzIHdpZGVseSBkaXN0cmlidXRlZC4gT3Bwb25lbnRzIHF1ZXN0aW9uIHRoYXQgbG9naWMsIHdvbmRlcmluZyB3aGV0aGVyIGl04oCZcyBwcnVkZW50IHRvIGNyZWF0ZSB3aGF0IGNvdWxkIGJlIGEgdGVycm9yaXN0IHRhcmdldCA5MCBtaWxlcyBvdXRzaWRlIG9mIGEgY2l0eSB3aG9zZSBlY29ub215IGlzIGhlYXZpbHkgcmVsaWFudCBvbiB0b3VyaXNtLiBPdGhlciBjb25jZXJucyBpbmNsdWRlIGRlc3RydWN0aW9uIG9mIGEgdHJhbnNwb3J0YXRpb24gY2FzayBlbiByb3V0ZSBieSBleHBsb3NpdmVzIG9yIGEgc2hvdWxkZXItZmlyZWQgbWlzc2lsZTsgdGhlZnQgb2YgcmFkaW9hY3RpdmUgbWF0ZXJpYWwgZnJvbSBhIG51Y2xlYXIgcG93ZXIgcGxhbnQsIHdoaWNoIGNvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGEg4oCcZGlydHkgYm9tYiYjMzQ7OyBhIGN5YmVyYXR0YWNrIG9uIGEgbnVjbGVhciByZWFjdG9yLCB3aGljaCBjb3VsZCByZXN1bHQgaW4gdGhlIHJlbGVhc2Ugb2YgcmFkaWF0aW9uIGFuZCBhbHNvIGRpc3J1cHQgdGhlIHBvd2VyIGdyaWQuCkFnZS1yZWxhdGVkIGltcGFjdHMKT25jZSBlbXBsYWNlZCwgbnVjbGVhciB3YXN0ZSBhdCBZdWNjYSBNb3VudGFpbiB3b3VsZCBzbG93bHkgZGVjYXkgb3ZlciBodW5kcmVkcyBvZiB0aG91c2FuZHMgb2YgeWVhcnMsIG1ha2luZyBpdCBkaWZmaWN1bHQgdG8gcHJlZGljdCBsb25nLXRlcm0gaGVhbHRoIHJpc2tzLiBTY2llbnRpc3RzIGRpZmZlciwgZmlyc3Qgbm90aW5nIHRoYXQgYSBsZWFrIHdvdWxkIG5vdCBsb29rIGxpa2UgdGhlIGNsYXNzaWMgY2FydG9vbiBpbnRlcnByZXRhdGlvbiBvZiBuZW9uIGxpcXVpZCBzZWVwaW5nIG91dCBvZiB0aGUgbW91bnRhaW4uIEl0IHdvdWxkIGJlIGluIGEgc29saWQsIHN0YWJsZSBmb3JtIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZWQgdGhlIHJlcG9zaXRvcnkuIE9uZSBzY2llbnRpc3QgdG9sZCB0ZWNoIHB1YmxpY2F0aW9uIFRoZSBWZXJnZSB0aGF0IHRoZSBtYXRlcmlhbCB3b3VsZCBiZSBzbyBzdGFibGUgdGhhdCBoZeKAmWQgYmUgY29tZm9ydGFibGUgc3RvcmluZyBhIHdhc3RlIGNhbmlzdGVyIGluIGhpcyBiYWNreWFyZC4gT3RoZXJzIHdvcnJ5IGFib3V0IGV2ZW4gbG93LWRvc2UgcmFkaWF0aW9uLgrigJNEYW5pZWwgUm90aGJlcmcKQSByZWNlbnQgY2F1dGlvbmFyeSB0YWxlClRlZCBTLiBXYXJyZW4gLyBBUApJbiB0aGlzIEp1bHkgOSwgMjAxNCwgZmlsZSBwaG90bywgYSBzaWduIHdhcm5zIG9mIHJhZGlvYWN0aXZpdHkgb24gdGhlIEhhbmZvcmQgTnVjbGVhciBSZXNlcnZhdGlvbiBuZWFyIFJpY2hsYW5kLCBXYXNoLgpPbiBNYXkgOSwgYWJvdXQgMjAwIG1pbGVzIGZyb20gU2VhdHRsZSwgcGFydCBvZiBhIHN0b3JhZ2UgdHVubmVsIGNvbGxhcHNlZCBhdCB0aGUgSGFuZm9yZCBOdWNsZWFyIFJlc2VydmF0aW9uIC4gUmFpbGNhcnMgZnVsbCBvZiByYWRpb2FjdGl2ZSB3YXN0ZSB3ZXJlIGluc2lkZSwgYnV0IFdhc2hpbmd0b27igJlzIERlcGFydG1lbnQgb2YgRWNvbG9neSBkZXRlY3RlZCBubyBlc2NhcGVkIHJhZGlhdGlvbi4gWXVjY2EgTW91bnRhaW4gb3Bwb25lbnRzIHBvaW50ZWQgdG8gdGhlIGluY2lkZW50IGFzIGEgd2FybmluZyBvZiB3aGF0IGNvdWxkIGhhcHBlbiBpbiBOZXZhZGEgaWYgdGhlIGNlbnRyYWwgcmVwb3NpdG9yeSBwcm9wb3NlZCBkZWNhZGVzIGFnbyB3ZXJlIGJ1aWx0IGhlcmUsIHdoaWxlIHN1cHBvcnRlcnMgc3VnZ2VzdGVkIHN1Y2ggYSBzY2FyZSBjb3VsZCBoYXZlIGJlZW4gYXZvaWRlZCBpZiB0aGUgdmlzaW9uIGZvciBZdWNjYSBoYWQgYmVlbiByZWFsaXplZC4KSGFuZm9yZCByZXBvcnRlZGx5IGlzIHRoZSBsYXJnZXN0IGRlcG9zaXRvcnkgb2YgcmFkaW9hY3RpdmUgZGVmZW5zZSB3YXN0ZSwgYXMgaXQgbWFkZSBwbHV0b25pdW0gZm9yIG51Y2xlYXIgd2VhcG9ucyBmb3IgZGVjYWRlcywgaW5jbHVkaW5nIHRoZSBib21iIHRoYXQgd2FzIGRyb3BwZWQgb24gTmFnYXNha2ksIEphcGFuLCBhdCB0aGUgZW5kIG9mIFdvcmxkIFdhciBJSS4gSW4gYSAyMDEwIHN0b3J5IGFib3V0IHRoZSBPYmFtYSBhZG1pbmlzdHJhdGlvbiB3aXRoZHJhd2luZyBZdWNjYSYjMzk7cyBsaWNlbnNlIGFwcGxpY2F0aW9uLCB0aGUgU2VhdHRsZSBUaW1lcyBzYWlkIHRoZSBtb3ZlIGxlZnQgdGhlIGZhdGUgb2YgdGhlIOKAnE1hbmhhdHRhbiBQcm9qZWN04oCZcyBuYXN0aWVzdCBnb29w4oCdIHVwIGluIHRoZSBhaXIuCkluIEFwcmlsIDIwMTYsIG9uZSBvZiBIYW5mb3Jk4oCZcyBvbGQgd2FzdGUgdGFua3Mgc3BydW5nIGEgbGVhay4gV2lyZWQgbWFnYXppbmUgcmVwb3J0ZWQgdGhhdCB3b3JrZXJzIGhhZCBiZWVuIHNodWZmbGluZyByYWRpb2FjdGl2ZSBtYXRlcmlhbCBmcm9tIHRhbmsgdG8gdGFuayBhcyB0aGV5IHdhaXRlZCBmb3IgdHdvIHRoaW5ncyB0byBoYXBwZW46IDEpIFl1Y2NhIE1vdW50YWluIHRvIGJlZ2luIHN0b3Jpbmcgd2FzdGUsIGFuZCAyKSBhbiBvbnNpdGUgdml0cmlmaWNhdGlvbiBmYWNpbGl0eSB0byB0dXJuIHdhc3RlIGludG8gZ2xhc3MgbG9ncyBmb3Igc2FmZXIgc3RvcmFnZSBhbmQgZXZlbnR1YWwgdHJhbnNwb3J0IHRvIE5ldmFkYeKAmXMgcmVwb3NpdG9yeS4gVGhlIGxhdHRlciBmYWNpbGl0eSBpcyBleHBlY3RlZCB0byBsYXVuY2ggYnkgMjAzMiwgdGhvdWdoIGl0IGFuZCBZdWNjYSBib3RoIHdlcmUgb3JpZ2luYWxseSBzbGF0ZWQgZm9yIGNvbXBsZXRpb24gaW4gMTk5OC4K4oCTRXJpbiBSeWFuCkFQIFBob3RvL0NsaWZmIE93ZW4KTGVlIEhhbWlsdG9uLCByaWdodCwgYW5kIEJyZW50IFNjb3djcm9mdCwgY2VudGVyLCBjby1jaGFpcnMsIEJsdWUgUmliYm9uIENvbW1pc3Npb24gb24gQW1lcmljYSYjMzk7cyBOdWNsZWFyIEZ1dHVyZSBBZ2VuZGEsIHRhbGsgd2l0aCBmb3JtZXIgTmV3IE1leGljbyBTZW4uIFBldGUgRG9tZW5pY2ksIFRodXJzZGF5LCBNYXJjaCAyNSwgMjAxMCwgZHVyaW5nIHRoZSBncm91cCYjMzk7cyBtZWV0aW5nIGluIFdhc2hpbmd0b24uCkJMVUUgUklCQk9OIENPTU1JU1NJT04gUkVDT01NRU5EQVRJT05TCkF0IHRoZSByZXF1ZXN0IG9mIHRoZW4tUHJlc2lkZW50IEJhcmFjayBPYmFtYSwgdGhlIEJsdWUgUmliYm9uIENvbW1pc3Npb24gb24gQW1lcmljYeKAmXMgTnVjbGVhciBGdXR1cmUgd2FzIGZvcm1lZCB0byByZXZpZXcgcG9saWN5IGFuZCByZWNvbW1lbmQgYSBuZXcgc3RyYXRlZ3kgZm9yIG1hbmFnaW5nIOKAnHRoZSBiYWNrIGVuZCBvZiB0aGUgbnVjbGVhciBmdWVsIGN5Y2xlLuKAnSBUaGUgZ3JvdXAgbWV0IG1vcmUgdGhhbiB0d28gZG96ZW4gdGltZXMgYmV0d2VlbiAyMDEwIGFuZCB0aGUgcmVsZWFzZSBvZiBpdHMgZmluYWwgcmVwb3J0IGluIDIwMTIsIGFmdGVyIGhlYXJpbmcgdGVzdGltb255IGZyb20gZXhwZXJ0cyBhbmQgc3Rha2Vob2xkZXJzLCB2aXNpdGluZyB3YXN0ZS1tYW5hZ2VtZW50IHNpdGVzIGhlcmUgYW5kIGFicm9hZCwgYW5kIGNvbmR1Y3RpbmcgZml2ZSBwdWJsaWMgbWVldGluZ3MuCjEuIENvbnNlbnQ6IFRoZSByZXBvcnQgaW5kaWNhdGVkIHRoYXQgZm9yY2luZyBhIGZlZGVyYWxseSBtYW5kYXRlZCBmaXggb3ZlciB0aGUgb2JqZWN0aW9ucyBvZiBhIHN0YXRlIHdvdWxkIOKAnHRha2UgbG9uZ2VyLCBjb3N0IG1vcmUgYW5kIGhhdmUgbG93ZXIgb2RkcyBvZiB1bHRpbWF0ZSBzdWNjZXNzLuKAnSBUaGUgY29tbWlzc2lvbiBzYWlkIGxvY2FsaXRpZXMgc2hvdWxkIHZvbHVudGVlciB0byBiZSBjb25zaWRlcmVkLgoyLiBPdmVyc2lnaHQ6IEdpdmVuIHRoZSBvdmVyYWxsIHJlY29yZCBvZiBwdWJsaWMgbWlzdHJ1c3QgaW4gdGhlIERPRSBhbmQgdGhlIGZlZGVyYWwgZ292ZXJubWVudCwgdGhlIGNvbW1pc3Npb24gcmVjb21tZW5kZWQgdGhhdCBDb25ncmVzcyBjaGFydGVyIGFuIGluZGVwZW5kZW50IGZlZGVyYWwgYm9keSB0byBvdmVyc2VlIHdhc3RlIG1hbmFnZW1lbnQuCjMuIEZ1bmRpbmc6IFNpbmNlIDE5ODIsIG51Y2xlYXIgd2FzdGUgZGlzcG9zYWwgaGFzIGJlZW4gcGFpZCBmb3IgYnkgdXRpbGl0aWVzIGFuZCB0aGVpciByYXRlcGF5ZXJzLiBZZXQgdGhvc2UgZnVuZHMgb2Z0ZW4gYXJlIOKAnGluYWNjZXNzaWJsZSB0byB0aGUgd2FzdGUgcHJvZ3JhbS7igJ0gVGhlIGNvbW1pc3Npb24gc2FpZCBpdCBzaG91bGRu4oCZdCBoYXZlIHRvIGNvbXBldGUgZm9yIGl0cyBvd24gZnVuZHMuCjQuIE9wdGlvbnM6IFRoZSByZXBvcnQgYXNrZWQgdGhlIGZlZGVyYWwgZ292ZXJubWVudCB0byBkZXZlbG9wIGEgZGVlcCBnZW9sb2dpY2FsIHJlcG9zaXRvcnkuIEl0IG5vdGVkIHRoYXQgdGhlIFUuUy4gd291bGQg4oCcbmVlZCB0byBmaW5kIGEgbmV3IGRpc3Bvc2FsIHNpdGUgZXZlbiBpZiBZdWNjYSBNb3VudGFpbiBnb2VzIGZvcndhcmQs4oCdIGJlY2F1c2Ugb2YgdGhlIHF1YW50aXR5IG9mIHdhc3RlLgo1LiBTdG9yYWdlOiBJbnRlcmltIHN0b3JhZ2Ugc2l0ZXMgZm9yIHdhc3RlIGNvdWxkIGFsbG93IHNwZW50IG51Y2xlYXIgZnVlbCB0byBjb29sIGJlZm9yZSBiZWluZyB0cmFuc2ZlcnJlZCB0byBhIHBlcm1hbmVudCByZXBvc2l0b3J5LiBUaGV5IGFsc28gd291bGQgYWxsb3cgbnVjbGVhciBwb3dlciBwbGFudHMgdG8gZnVsbHkgZGVjb21taXNzaW9uLCByYXRoZXIgdGhhbiBzdG9yZSByb2RzIGluZGVmaW5pdGVseS4KNi4gVHJhbnNwb3J0OiBUaGUgcmVwb3J0IGNhbGxlZCB0aGUgY3VycmVudCB0cmFuc2ZlciBzeXN0ZW0g4oCcZXhjZWxsZW50LOKAnSBidXQgc2FpZCByZWd1bGF0aW9ucyBzaG91bGQgYmUgdXBkYXRlZCB3aXRoIGRldmVsb3BtZW50cyBpbiBudWNsZWFyIGZ1ZWwsIGFzIGdyZWF0ZXIgbmVlZCBhbmQgZGVtYW5kIGZvciBtb3Zpbmcgd2FzdGUgd291bGQgcmV2ZWFsIG5ldyBwdWJsaWMgY29uY2VybnMuCjcuIElubm92YXRpb246IE1lbWJlcnMgb2YgdGhlIGNvbW1pc3Npb24gYWdyZWVkIHRoYXQgbW9yZSByZXNlYXJjaCBhbmQgZGV2ZWxvcG1lbnQgd2FzIG5lZWRlZCBpbiB0aGUgY291bnRyeeKAmXMgbnVjbGVhciBlbmVyZ3kgc2VjdG9yLCBlc3BlY2lhbGx5IGluIHRoZSBjcmVhdGlvbiBvZiDigJxhIHJlZ3VsYXRvcnkgZnJhbWV3b3JrIGZvciBhZHZhbmNlZCBudWNsZWFyIGVuZXJneSBzeXN0ZW1zLuKAnQo4LiBQb2xpY3k6IFRoZSByZXBvcnQgc2FpZCB0aGUgVS5TLiBzaG91bGQgbGVhZCB0aGUgd29ybGQgb24gc2FmZXR5LCBub25wcm9saWZlcmF0aW9uIGFuZCBwcmV2ZW50aW5nIHRoZSB3ZWFwb25pemF0aW9uIG9mIG51Y2xlYXIgZW5lcmd5LiDigJxMb25nZXIgdGVybSzigJ0gaXQgc2FpZCwg4oCcdGhlIFUuUy4gc2hvdWxkIHN1cHBvcnQgdGhlIHVzZSBvZiBtdWx0aS1uYXRpb25hbCBmdWVsLWN5Y2xlIGZhY2lsaXRpZXMu4oCdCuKAk0RhbmllbCBSb3RoYmVyZwpKb2huIExvY2hlciAvIEFQCkNvbmdyZXNzbWVuLCBpbmNsdWRpbmcgSmVycnkgTWNOZXJuZXksIEQtQ2FsaWYuLCBsZWZ0LCBhbmQgUmVwLiBKb2huIFNoaW1rdXMsIFItSWxsLiwgc2Vjb25kIGZyb20gbGVmdCwgdG91ciBZdWNjYSBNb3VudGFpbiwgVGh1cnNkYXksIEFwcmlsIDksIDIwMTUsIG5lYXIgTWVyY3VyeS4gU2V2ZXJhbCBtZW1iZXJzIG9mIENvbmdyZXNzIHRvdXJlZCB0aGUgcHJvcG9zZWQgcmFkaW9hY3RpdmUgd2FzdGUgZHVtcCA5MCBtaWxlcyBub3J0aHdlc3Qgb2YgTGFzIFZlZ2FzLgpXSEFUIFdPVUxEIEhBVkUgVE8gSEFQUEVOIFRPIEVOQUJMRSBXQVNURSBTVE9SQUdFIEFUIFlVQ0NBPwpFdmVuIGlmIFl1Y2NhIE1vdW50YWluIHdlcmUgZ3JlZW4tbGlnaHRlZCwgdGhlIGZlZGVyYWwgZ292ZXJubWVudCB3b3VsZCBoYXZlIHRvIGRldmVsb3AgYW5vdGhlciBkZWVwIGdlb2xvZ2ljIHJlcG9zaXRvcnkgZm9yIHN0b3JpbmcgbnVjbGVhciB3YXN0ZSwgdGhlIEJsdWUgUmliYm9uIENvbW1pc3Npb24gb24gQW1lcmljYeKAmXMgTnVjbGVhciBGdXR1cmUgZm91bmQuIFRoZSBwYW5lbCB3cm90ZSBpbiAyMDEyIHRoYXQg4oCcdGhlIFUuUy4gaW52ZW50b3J5IG9mIHNwZW50IG51Y2xlYXIgZnVlbCB3aWxsIHNvb24gZXhjZWVkIHRoZSBhbW91bnQgdGhhdCBjYW4gYmUgbGVnYWxseSBlbXBsYWNlZCBhdCAoWXVjY2EgTW91bnRhaW4pIHVudGlsIGEgc2Vjb25kIHJlcG9zaXRvcnkgaXMgaW4gb3BlcmF0aW9uLuKAnSBJbiAyMDE0LCB0aGUgbW9zdCByZWNlbnQgeWVhciB3aXRoIGF2YWlsYWJsZSBkYXRhLCB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneSBlc3RpbWF0ZWQgdGhhdCB0aGUgbmF0aW9uIGhhZCBhYm91dCA3MCw1MDAgbWV0cmljIHRvbnMgb2YgaGVhdnkgbWV0YWwgaW4gbmVlZCBvZiBkaXNwb3NhbC4gSW5kdXN0cnkgbG9iYnlpbmcgZ3JvdXAgdGhlIE51Y2xlYXIgRW5lcmd5IEluc3RpdHV0ZSBwdXRzIHRoZSBjdXJyZW50IGZpZ3VyZSBhdCA3OCw1OTAgbWV0cmljIHRvbnMsIHdoZXJlYXMgWXVjY2EgTW91bnRhaW4gY2FuIHN0b3JlIG9ubHkgYWJvdXQgNzAsMDAwIHVuZGVyIHRoZSBjdXJyZW50IGNhcC4gT3RoZXIgaHVyZGxlcyB0aGUgcHJvamVjdCB3b3VsZCBoYXZlIHRvIG92ZXJjb21lOgpOZXcgb2ZmaWNlLCBvbGQgcGxhbnMKUmVzdGFydGluZyB0aGUgcHJvamVjdCB3b3VsZCBiZSBhbiBhZG1pbmlzdHJhdGl2ZSBjaGFsbGVuZ2UsIHNhaWQgSnVkeSBUcmVpY2hlbCwgZXhlY3V0aXZlIGRpcmVjdG9yIG9mIHRoZSBOZXZhZGEgTnVjbGVhciBXYXN0ZSBUYXNrIEZvcmNlICwgd2hpY2ggd2FzIGZvcm1lZCBpbiByZXNwb25zZSB0byB0aGUgc3RhdGUgYmVpbmcgY2hvc2VuIGFzIHRoZSBuYXRpb27igJlzIG51Y2xlYXIgd2FzdGUgZHVtcCBhZnRlciB0aGUgMTk4NyBhbWVuZG1lbnQgdG8gdGhlIE51Y2xlYXIgV2FzdGUgUG9saWN5IEFjdC4KRGlkIHlvdSBrbm93PwpUaGVyZSBhcmUgbm93IG1vcmUgdGhhbiAyIG1pbGxpb24gZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgWXVjY2EgTW91bnRhaW4gcHJvY2VlZGluZy4K4oCcQmVmb3JlIHlvdSBldmVyIGdldCB0byBsaWNlbnNpbmcsIHRoZXJl4oCZcyBubyBkZXBhcnRtZW50IGF0IHRoZSBEZXBhcnRtZW50IG9mIEVuZXJneSwgdGhlcmXigJlzIG5vIGRpdmlzaW9uIGZvciBhIFl1Y2NhIE1vdW50YWluIHByb2plY3Qs4oCdIFRyZWljaGVsIHNhaWQuIOKAnFRoZXkgd291bGQgaGF2ZSB0byBiZWdpbiBhZ2FpbiB0byBwdXQgdG9nZXRoZXIgd2hhdCB1c2VkIHRvIGJlIHRoZSBPZmZpY2Ugb2YgQ2l2aWxpYW4gUmFkaW9hY3RpdmUgV2FzdGUgTWFuYWdlbWVudC7igJ0KU3RldmUgRnJpc2htYW4sIGNvbnN1bHRhbnQgZm9yIHRoZSBOZXZhZGEgQWdlbmN5IGZvciBOdWNsZWFyIFByb2plY3RzICwgYWdyZWVkIHdpdGggVHJlaWNoZWwgdGhhdCBhbnkgcGxhbnMgZm9yIFl1Y2NhIE1vdW50YWluIHdvdWxkIG5lZWQgdG8gYmUgcmV2aXNpdGVkIG5vdyB0aGF0IHNvIG1hbnkgeWVhcnMgaGF2ZSBwYXNzZWQuCuKAnFRoYXQgdHVubmVsIGhhcyBqdXN0IGJlZW4gc2l0dGluZyB0aGVyZSzigJ0gVHJlaWNoZWwgc2FpZC4g4oCcVGhlcmXigJlzIHByb2JhYmx5IGEgbG90IG9mIG1vbGQgKGFuZCkgZGVncmFkYXRpb24gLi4uIHRoZXJl4oCZcyBwcm9iYWJseSBjb3Jyb3Npb24u4oCdCkZyaXNobWFuIHNhaWQgcm9ja2ZhbGwgbWF5IGJlIGFuIGlzc3VlLCB0aG91Z2ggbGlrZWx5IG5vdCBhdCB0aGUgbGV2ZWwgb2YgdGhlIHJlY2VudCB0dW5uZWwgY29sbGFwc2UgYXQgdGhlIEhhbmZvcmQgTnVjbGVhciBSZXNlcnZhdGlvbiBpbiB0aGUgc3RhdGUgb2YgV2FzaGluZ3Rvbi4KVHJhbnNwb3J0YXRpb24KQW5vdGhlciBodXJkbGUgd291bGQgYmUgbGF5aW5nIG91dCB0aGUgcm91dGUgdGhlIHdhc3RlIHdvdWxkIHRha2UgdG8gWXVjY2EgTW91bnRhaW4uIFRyZWljaGVsIHNhaWQgdGhlIG9yaWdpbmFsbHkgcHJvcG9zZWQgcmFpbCByb3V0ZSBjdXRzIHRocm91Z2ggbGFuZCB0aGF0IGlzIG5vdyB0aGUgQmFzaW4gYW5kIFJhbmdlIG5hdGlvbmFsIG1vbnVtZW50LCB0aG91Z2ggdGhlIFRydW1wIGFkbWluaXN0cmF0aW9uIGlzc3VlZCBhbiBleGVjdXRpdmUgb3JkZXIgdG8gcmV2aXNpdCB0aGUgdXNlIG9mIHRoZSBBbnRpcXVpdGllcyBBY3QgaW4gcmVjZW50IG1vbnVtZW50IGRlc2lnbmF0aW9ucy4KRGlkIHlvdSBrbm93PwpBY2NvcmRpbmcgdG8gdGhlIFdvcmxkIE51Y2xlYXIgQXNzb2NpYXRpb24sIG5lYXItc3VyZmFjZSBhbmQgZGVlcC1nZW9sb2dpYyByZXBvc2l0b3JpZXMg4oCUIHN1Y2ggYXMgWXVjY2EgTW91bnRhaW4g4oCUIGFyZSBjb21tb25seSBhY2NlcHRlZCBvcHRpb25zIGZvciBwZXJtYW5lbnQgc3RvcmFnZSBvZiBoaWdoLWxldmVsIHdhc3RlLiBCdXQgaGVyZSBhcmUgYSBmZXcgdGhlIFUuUy4gaGFzIGV4cGxvcmVkIGFuZCBhYmFuZG9uZWQgb3ZlciB0aGUgeWVhcnM6IGxhdW5jaGluZyB3YXN0ZSBpbnRvIHNwYWNlOyBlbWJlZGRpbmcgaXQgaW4gaWNlIHNoZWV0czsgc2VhbGluZyBpdCBpbiB1bmRlcmdyb3VuZCBib3JlaG9sZXMgd2hlcmUgaXQgd291bGQgYnVpbGQgdXAgaGVhdCBhbmQgbWVsdCB0aGUgcm9jayBhcm91bmQgaXQgYmVmb3JlIGNvb2xpbmcgYW5kIGNyeXN0YWxsaXppbmcgdGhlIHJhZGlvYWN0aXZlIG1hdGVyaWFsIGludG8gdGhlIHJvY2sgbWF0cml4LgpUcmVpY2hlbCBzYWlkIHRoYXQgYmVjYXVzZSBvZiB0aGVpciBuZWVkIHRvIGJlIGJ1aWx0IG5lYXIgcm9idXN0IHN1cHBsaWVzIG9mIHdhdGVyLCBtb3N0IG51Y2xlYXIgcG93ZXIgcGxhbnRzIGFyZSBmYXIgZnJvbSB0aGUgWXVjY2Egc2l0ZS4K4oCcSXTigJlzIGEgdHJ1ZSB0ZXN0IGZvciBvdXIgZmFpbGluZyBpbmZyYXN0cnVjdHVyZSwgYmVjYXVzZSB5b3Ugc3VkZGVubHkgaGF2ZSB0aG91c2FuZHMgb2YgbWlsZXMgb2YgdHJhbnNwb3J0IHJlcXVpcmVkIHdpdGggdGhlIGhlYXZpZXN0IHBvc3NpYmxlIGxvYWRzIOKAlCB0aGF04oCZcyB3aHkgaXQgaGFzIHRvIGdvIChwcmltYXJpbHkpIGJ5IHRyYWluLOKAnSBzaGUgc2FpZC4KRnJpc2htYW4gc2FpZCB0aGUgb2xkIHJhaWwtbGluZSBwbGFuLCB3aGljaCBsb3N0IGl0cyBCdXJlYXUgb2YgTGFuZCBNYW5hZ2VtZW50IGVhc2VtZW50cywgd291bGQgaGF2ZSByZXF1aXJlZCBidWlsZGluZyAzMDAgbWlsZXMgb2YgbmV3IHRyYWNrcy4gSGUgc2FpZCBvZmZpY2lhbHMgbmVlZGVkIHRvIG1vZGlmeSBib3RoIHRoZSBsaWNlbnNlIGFwcGxpY2F0aW9uIGFuZCB0aGUgZW52aXJvbm1lbnRhbCBpbXBhY3Qgc3RhdGVtZW50IHRvIG1vdmUgZm9yd2FyZC4KTGljZW5zaW5nIGFuZCBsZWdhbCBjaGFsbGVuZ2VzClBsYW4gdXBkYXRlcyB3b3VsZCBjb21lIGJlZm9yZSBhbnkgZm9yYXkgaW50byBsaWNlbnNpbmcsIFRyZWljaGVsIHNhaWQuIElmIG9mZmljaWFscyBnb3QgdGhhdCBmYXIsIHRoZSBwcm9qZWN0IHdvdWxkIHN0aWxsIGZhY2UgbGVnYWwgY2hhbGxlbmdlcyBhbmQgaHVuZHJlZHMgb2YgY29udGVudGlvbnMuCkZyaXNobWFuIHNhaWQgdHdvIGxhd3N1aXRzIGZpbGVkIGJ5IHRoZSBzdGF0ZSBvZiBOZXZhZGEgYXJlIGJlaW5nIGhlbGQgaW4gYWJleWFuY2UsIGJvdGggZ2V0dGluZyBhdCB0aGUgc3RhbmRhcmRzIGJ5IHdoaWNoIGEgbGljZW5zZSBhcHBsaWNhdGlvbiB3b3VsZCBiZSBqdWRnZWQuCuKAnFNvIGlmIHRoZXkgcmVzdGFydCB0aGUgbGljZW5zaW5nIHByb2Nlc3MsIHRoZSBmaXJzdCB0aGluZyB0aGUgc3RhdGUgb2YgTmV2YWRhIGlzIGdvaW5nIHRvIGRvIGlzIHJlb3BlbiBib3RoIG9mIHRob3NlIGxhd3N1aXRzLOKAnSBoZSBzYWlkLgpUaGUgbGljZW5zaW5nIHByb2Nlc3MgYWxvbmUgd291bGQgdGFrZSB5ZWFycywgd2l0aCBhbiBlc3RpbWF0ZWQgNDAwIGRheXMgbmVlZGVkIGp1c3QgdG8gYWRkcmVzcyBodW5kcmVkcyBvZiBvYmplY3Rpb25zIHJhaXNlZCBvdmVyIHRoZSB5ZWFycyBieSBncm91cHMsIGluY2x1ZGluZyB0aGUgc3RhdGUuCkZyaXNobWFuIHNhaWQgY29udGVudGlvbnMgd2VyZSBhZGRyZXNzZWQgbXVjaCBsaWtlIGluIGNpdmlsIGNvdXJ0LCB3aGVyZSBhIHBhbmVsIHdvdWxkIGNvbnNpZGVyIHRlc3RpbW9ueSBmcm9tIGJvdGggc2lkZXMgZm9yIGVhY2ggb25lIGJlZm9yZSBtYWtpbmcgYSBkZWNpc2lvbi4KQ29uc3RydWN0aW9uCklmIGxpY2Vuc2luZyBhcHByb3ZhbCB3ZXJlIHNlY3VyZWQsIEZyaXNobWFuIHNhaWQgdGhlIGNvbW1pc3Npb24gd291bGQgdGhlbiBuZWVkIHRvIGlzc3VlIGEgY29uc3RydWN0aW9uIGF1dGhvcml6YXRpb24sIHdoaWNoIGlzIGVzc2VudGlhbGx5IHRoZSBkaXNwb3NhbCBkZWNpc2lvbi4KSGUgc2FpZCB0aGUgbGljZW5zaW5nIGFwcGxpY2F0aW9uIGluZGljYXRlZCB0aGF0IGNvbnN0cnVjdGlvbiBhbmQgaW5pdGlhbCB3YXN0ZSBkaXNwb3NhbCB3b3VsZCB0YWtlIG1vcmUgdGhhbiB0d28gZGVjYWRlcy4gVGhlIHJlcG9zaXRvcnkgaXMgZGVzaWduZWQgdG8gaGFuZGxlIDMsMDAwIG1ldHJpYyB0b25zIG9mIHdhc3RlIHBlciB5ZWFyLCBGcmlzaG1hbiBzYWlkIOKAlCAxLDAwMCBtZXRyaWMgdG9ucyBtb3JlIHRoYW4gd2hhdCBpcyBjdXJyZW50bHkgcHJvZHVjZWQgYnkgcmVhY3RvcnMgZWFjaCB5ZWFyLgpUaGUgcmVwb3NpdG9yeSBjb3VsZCBiZSBvcGVuIGZvciAxMDAgeWVhcnMgYWZ0ZXIgdGhlIGZpcnN0IHBsYWNlbWVudCBvZiB3YXN0ZSwgRnJpc2htYW4gc2FpZC4gQWZ0ZXIgdGhhdCwgYW4gYW1lbmRtZW50IHdvdWxkIG5lZWQgdG8gYmUgc3VibWl0dGVkIHRvIHRoZSBOdWNsZWFyIFJlZ3VsYXRvcnkgQ29tbWlzc2lvbiB0byBjbG9zZSBpdC4g4oCcV2XigJlyZSBqdXN0IGF0IHRoZSB2ZXJ5LCB2ZXJ5LCB2ZXJ5IGZpcnN0IHN0ZXAgb2YgYSAxMDAteWVhciBwcm9jZXNzLuKAnQrigJNZdm9ubmUgR29uemFsZXoKSm9obiBMb2NoZXIgLyBBUApSZXAuIEpvaG4gU2hpbWt1cywgUi1JbGwuLCBzdGFuZHMgbmVhciB0aGUgbm9ydGggcG9ydGFsIG9mIFl1Y2NhIE1vdW50YWluIGR1cmluZyBhIGNvbmdyZXNzaW9uYWwgdG91ciBUaHVyc2RheSwgQXByaWwgOSwgMjAxNSwgYWJvdXQgOTAgbWlsZXMgbm9ydGh3ZXN0IG9mIExhcyBWZWdhcy4KT3RoZXIgc3RhdGVzIHdpdGggYSBsb3QgYXQgc3Rha2UKV2hpbGUgdGhlIGZpZ2h0IG92ZXIgWXVjY2EgTW91bnRhaW4gY29udGludWVzLCBoaWdoLWxldmVsIHdhc3RlIGlzIGJlaW5nIHN0b3JlZCBhY3Jvc3MgdGhlIGNvdW50cnkgYXQgcmVhY3RvciBzaXRlcyBhbmQgb3RoZXJzIGxpY2Vuc2VkIGJ5IHRoZSBmZWRlcmFsIGdvdmVybm1lbnQgdG8gd2F0Y2ggb3ZlciB0aGUgc2Vuc2l0aXZlIG1hdGVyaWFsLgpOdWNsZWFyIGZ1ZWwgcm9kcyBsYXN0IHR3byB0byB0aHJlZSB5ZWFycyBpbiBhIHJlYWN0b3IgYmVmb3JlIHRoZSBmaXNzaW9uIHByb2Nlc3MgdXNlcyB1cCBlbm91Z2ggb2YgdGhlIGVuZXJneSBpbiB0aGUgdXJhbml1bSB0aGF0IHRoZXkgYXJlIG5vIGxvbmdlciBlZmZpY2llbnQuIER1cmluZyB0aGF0IHByb2Nlc3MsIHRoZXkgYmVjb21lIHJhZGlvYWN0aXZlIGFuZCBpbnRlbnNlbHkgaG90LiBTcGVudCByb2RzIGZpcnN0IGdvIHRvIOKAnHdldCBzdG9yYWdl4oCdIGluIGluZG9vciBjb29saW5nIHBvb2xzLiBPbmNlIHRoZXnigJlyZSBoZWF0LXN0YWJpbGl6ZWQgYWZ0ZXIgYSBwZXJpb2Qgb2Ygb25lIHRvIGZpdmUgeWVhcnMgKG9yIGxvbmdlciksIHRoZXnigJlyZSB0cmFuc2ZlcnJlZCBpbnRvICYjMzQ7ZHJ5IHN0b3JhZ2UmIzM0OyBpbiBoZWF2eS1kdXR5IGNhc2tzIHRoYXQgc2hpZWxkIHJhZGlvYWN0aXZlIG1hdGVyaWFsIGZvciB1cCB0byBhIGNlbnR1cnkgKGEgZnVsbCBzZXR1cCBjYW4gd2VpZ2ggMjgwLDAwMCBwb3VuZHMsIG1vc3Qgb2YgdGhlIHdlaWdodCBjb21pbmcgZnJvbSB0aGUgbWV0YWwgYW5kIGNvbmNyZXRlIGNhc2spLiBBcyBwbGFudHMgaGF2ZSBhY2N1bXVsYXRlZCBtb3JlIGFuZCBtb3JlIHJvZHMsIHRoZXnigJl2ZSBtb2RpZmllZCBzdG9yYWdlIHJhY2tzIHRvIHBhY2sgdGhlbSBpbiBtdWNoIHRpZ2h0ZXIsIGJ1dCB0aGlzIGlzIG5vdCBhIHBlcm1hbmVudCBzb2x1dGlvbi4KSW50ZXJpbSBzdG9yYWdlIHNpdGVzIGFyZSBiZWluZyBleHBsb3JlZC4gQWNjb3JkaW5nIHRvIHRoZSBOUkMsIHR3byBlbnRpdGllcyBoYXZlIGV4cHJlc3NlZCBpbnRlcmVzdCBpbiBhcHBseWluZyB0byBidWlsZCBpbnRlcmltIHNpdGVzICwgb25lIGluIFRleGFzIGFuZCB0aGUgb3RoZXIgaW4gTmV3IE1leGljby4gSWYgdGhlc2UgYXBwbGljYXRpb25zIGFyZSBhcHByb3ZlZCwgdGhlIE5SQyB3aWxsIGlzc3VlIGxpY2Vuc2VzIHZhbGlkIGZvciB1cCB0byA0MCB5ZWFycy4KRXNwZWNpYWxseSBnaXZlbiBob3cgbXVjaCBoYXMgYmVlbiBpbnZlc3RlZCBpbiB3YXN0ZSBkaXNwb3NhbCBieSB1dGlsaXR5IHJhdGVwYXllcnMgaW4gYXJlYXMgcHJvZHVjaW5nIG51Y2xlYXIgZW5lcmd5LCB0aGVzZSBzdGF0ZXMgaGF2ZSBhIGxvdCBhdCBzdGFrZSBhcyB0aGUgbmF0aW9uIHRyaWVzIHRvIHNldHRsZSBvbiBhIHdheSBmb3J3YXJkOgpJbGxpbm9pczogMTAsMTgwIG1ldHJpYyB0b25zIG9mIHNwZW50IG51Y2xlYXIgZnVlbApQZW5uc3lsdmFuaWE6IDcsMzMwIG1ldHJpYyB0b25zClNvdXRoIENhcm9saW5hOiA0LDY4MCBtZXRyaWMgdG9ucwpOZXcgWW9yazogNCwxODAgbWV0cmljIHRvbnMKQWxhYmFtYTogMyw4NDAgbWV0cmljIHRvbnMKTm9ydGggQ2Fyb2xpbmE6IDMsNzYwIG1ldHJpYyB0b25zCkNhbGlmb3JuaWEsIEZsb3JpZGEsIEdlb3JnaWEsIE1pY2hpZ2FuIGFuZCBOZXcgSmVyc2V5IGFsbCBob2xkIG1vcmUgdGhhbiAzLDAwMCBtZXRyaWMgdG9ucy4KQXJpem9uYSwgQ29ubmVjdGljdXQsIFRleGFzIGFuZCBWaXJnaW5pYSBhbGwgaG9sZCBtb3JlIHRoYW4gMiwwMDAgbWV0cmljIHRvbnMuCkFya2Fuc2FzLCBMb3Vpc2lhbmEsIE1hcnlsYW5kLCBNaW5uZXNvdGEsIE1pc3Npc3NpcHBpLCBOZWJyYXNrYSwgT2hpbywgVGVubmVzc2VlIGFuZCBXaXNjb25zaW4gYWxsIGhvbGQgbW9yZSB0aGFuIDEsMDAwIG1ldHJpYyB0b25zLgpFbGV2ZW4gb3RoZXIgc3RhdGVzIHJhbmdlIGZyb20gdGhlIGxvdyBlbmQgb2YgMzAgbWV0cmljIHRvbnMgKENvbG9yYWRvKSB0byA3OTAgbWV0cmljIHRvbnMgKE1pc3NvdXJpKS4K4oCTUmljIEFuZGVyc29uIGFuZCBDaHJpcyBLdWRpYWxpcwpTaHV0dGVyc3RvY2sKUmFkaWF0aW9uIHNpZ24gbmV4dCB0byBSZWQgRm9yZXN0IGluIHRoZSBDaGVybm9ieWwgTnVjbGVhciBQb3dlciBQbGFudCBab25lIG9mIEFsaWVuYXRpb24sIFVrcmFpbmUuCldBUk5JTkcgU0lHTlMgRk9SIFRIRSBGVVRVUkUKT25lIGxpbmdlcmluZyBpc3N1ZSB3aXRoIFl1Y2NhIE1vdW50YWluIG9yIGFueSBvdGhlciBwZXJtYW5lbnQgcmVwb3NpdG9yeSBmb3IgbnVjbGVhciB3YXN0ZSBpcyBob3cgdG8gY29tbXVuaWNhdGUgd2hhdCBpdCBpcyB0byBmdXR1cmUgZ2VuZXJhdGlvbnMsIG1heWJlIDEwMCB5ZWFycyBmcm9tIG5vdywgbWF5YmUgMTAsMDAwLiBMaW5ndWlzdHMgaGF2ZSBhcmd1ZWQgb3ZlciBob3cgYmVzdCB0byBwcmVzZW50IHRoaXMgaW5mb3JtYXRpb24uIFdoYXQgbWVzc2FnZSBjYW4gdHJhbnNjZW5kIEVuZ2xpc2ggYW5kIGxhc3QgZm9yIDEwLDAwMCB5ZWFycz8gSG93IGRvIHlvdSBjb252ZXkgdGhlIHVuc2VlbiB0aHJlYXQgb2YgcmFkaWF0aW9uPwpBYm91dCA0MCB5ZWFycyBhZ28sIHRoZSBEZXBhcnRtZW50IG9mIEVuZXJneSBiZWdhbiB0YWNrbGluZyB0aGlzIHByb2JsZW0gd2l0aCBhIHBhbmVsIG9mIGV4cGVydHMga25vd24gYXMgdGhlIEh1bWFuIEludGVyZmVyZW5jZSBUYXNrIEZvcmNlLiBUaGV5IHByb3Bvc2VkIHVzaW5nIG1hcmtlcnMg4oCUIHRyaWFuZ3VsYXIgcHlyYW1pZHMgb2YgZ3Jhbml0ZSDigJQgd2l0aCB0aHJlZSBjZW50cmFsIG1hcmtlcnMgdGhhdCBjb250YWluZWQgc3ltYm9scyBhbmQgd3JpdGluZyBpbiBtdWx0aXBsZSBsYW5ndWFnZXMgdG8gY29udmV5IHRoZSBtZXNzYWdlIHRoYXQgbnVjbGVhciB3YXN0ZSBsYXkgdGhlcmUuIFRoZSBwYW5lbCBob3BlZCB0aGF0IHRoZSBzeW1ib2xzIGFuZCBtZXNzYWdlcyB3b3VsZCByZXNvbmF0ZSBiZWNhdXNlIHRoZXkgd291bGQgYmUgcGFzc2VkIGRvd24gdGhyb3VnaCBvcmFsIHRyYW5zbWlzc2lvbi4KV2hpbGUgdGhlIFl1Y2NhIE1vdW50YWluIHByb2plY3QgbGFuZ3Vpc2hlZCwgdGhlIGdvdmVybm1lbnQgZnVuZGVkIGEgc2Vjb25kIHN0dWR5IG9mIG51Y2xlYXIgc2VtaW90aWNzIGluIDE5OTIuIEluIGEgcmVwb3J0IHByZXBhcmVkIGJ5IHRoZSBTYW5kaWEgTmF0aW9uYWwgTGFib3JhdG9yeSwgYW5vdGhlciBwYW5lbCBvZiBleHBlcnRzIGNvbnZlbmVkIHRvIHN1Z2dlc3QgaG93IHRvIG1hcmsgdGhlIFdhc3RlIElzb2xhdGlvbiBQaWxvdCBQcm9qZWN0IGluIE5ldyBNZXhpY28uIFRoZSBtZXNzYWdlIHNob3VsZCBjb25ub3RlIHZpc3VhbCBhbmQgdmVyYmFsIG1lc3NhZ2VzLCB0aGV5IGNvbmNsdWRlZC4KRmlyc3QsIG9taW5vdXMgZWFydGh3b3JrcyB3b3VsZCBiZSBsYWlkIG91dCBpbiBhcmVhcyB0byBkZW1hcmNhdGUgdGhlIHNpdGUuIE9uZSBkZXNpZ24gdGhleSBzdWdnZXN0ZWQgd2FzIGEgZmllbGQgb2YgbWV0YWwgc3Bpa2VzLiBBbm90aGVyIHN1Z2dlc3RlZCBkZXNpZ24gaW5jbHVkZWQgZGFnZ2VyLXNoYXBlZCBlYXJ0aHdvcmtzLiBUaGVzZSBiZXJtcyB3aWxsIGd1aWRlIHZpc2l0b3JzIHRvIGEgbWVzc2FnZSBhcmVhIHRoYXQgY29tbXVuaWNhdGVzIG1lc3NhZ2VzIGJvdGggbGluZ3Vpc3RpY2FsbHkgYW5kIG5vbi1saW5ndWlzdGljYWxseS4gUnVkaW1lbnRhcnkgaW5mb3JtYXRpb24gd291bGQgYmUgc2hvd24gdGhyb3VnaCBmYWNlcyBpbmRpY2F0aW5nIGhvcnJvciwgc3VjaCBhcyB0aGUgaGF1bnRpbmcgZmlndXJlIGluIEVkdmFyZCBNdW5jaOKAmXMg4oCcVGhlIFNjcmVhbS7igJ0gVGhhdCB3b3VsZCBiZSBhY2NvbXBhbmllZCBieSB3cml0dGVuIHdvcmRzIHRoYXQgdGhlIHBhbmVsIGhvcGVkIHdvdWxkIGNvbnZleSB0aGlzOiDigJxUaGlzIHBsYWNlIGlzIGEgbWVzc2FnZSDigKYgYW5kIHBhcnQgb2YgYSBzeXN0ZW0gb2YgbWVzc2FnZXMg4oCmIHBheSBhdHRlbnRpb24gdG8gaXQhIFNlbmRpbmcgdGhpcyBtZXNzYWdlIHdhcyBpbXBvcnRhbnQgdG8gdXMuIFdlIGNvbnNpZGVyZWQgb3Vyc2VsdmVzIHRvIGJlIGEgcG93ZXJmdWwgY3VsdHVyZS4gVGhpcyBwbGFjZSBpcyBub3QgYSBwbGFjZSBvZiBob25vciAuLi4gbm8gaGlnaGx5IGVzdGVlbWVkIGRlZWQgaXMgY29tbWVtb3JhdGVkIGhlcmUgLi4uIG5vdGhpbmcgdmFsdWVkIGlzIGhlcmUu4oCdCuKAk0RhbmllbCBSb3RoYmVyZw==

Big Names Pull Cash from V.C. Fund Over Political Contributions - The New York Times
September 12, 2006
https://dealbook.nytimes.com/2006/09/12/big-names-pull-cash-from-venture-capital-fund-over-political-contributions
VGhlIE5ldyBZb3JrIFRpbWVzCkRlYWxCb29rIHwgQmlnIE5hbWVzIFB1bGwgQ2FzaCBmcm9tIFYuQy4gRnVuZCBPdmVyIFBvbGl0aWNhbCBDb250cmlidXRpb25zClNlYXJjaApCaWcgTmFtZXMgUHVsbCBDYXNoIGZyb20gVi5DLiBGdW5kIE92ZXIgUG9saXRpY2FsIENvbnRyaWJ1dGlvbnMKQnkgd3JpdGVyClNlcHRlbWJlciAxMiwgMjAwNiA3OjQyIGFtClNlcHRlbWJlciAxMiwgMjAwNiA3OjQyIGFtCkEgdmVudHVyZSBjYXBpdGFsIGZ1bmQgYmFzZWQgaW4gQ2VudHVyeSBDaXR5LCBDYWxpZi4sIGJhY2tlZCBieSB0aGUgbGlrZXMgb2YgSGFydmFyZCwgQm9laW5nIGFuZCBvdGhlciBiaWctbGVhZ3VlIGludmVzdG9ycywgYW5kIGNvbnN1bHRpbmcgd2l0aCBzdWNoIGRpc3BhcmF0ZSBhZHZpc2VycyBhcyB0aGUgQ29sdW1iaWEgVW5pdmVyc2l0eSBidXNpbmVzcyBzY2hvb2wgZGVhbiBhbmQgS0lTUyBzaW5nZXIgR2VuZSBTaW1tb25zLCBoYXMgcnVuIGludG8gdHJvdWJsZSBvdmVyIGFsbGVnYXRpb25zIHRoYXQgaXRzIGZvdW5kZXJzIHNvbGljaXRlZCBwb2xpdGljYWwgY29udHJpYnV0aW9ucyBmb3JtIHRoZWlyIHN0YXJ0LXVwcy4KQ2FsbGluZyB0aGVtc2VsdmVzIEludGVybmF0aW9uYWwgVGVjaG5vbG9neSBVbml2ZXJzaXR5LCB0aGUgc25lYWtlci1jbGFkIHBhcnRuZXJzIHNjb3VyZWQgdG9wIGVuZ2luZWVyaW5nIHNjaG9vbHMsIHNlZWtpbmcgbmV3IHRlY2hub2xvZ2llcyB0byB0dXJuIGludG8gcHJvZml0YWJsZSBidXNpbmVzc2VzLiBBbmQgb3ZlciB0aGUgbGFzdCBzaXggeWVhcnMsIHRoZSBkdW8gcGVyc3VhZGVkIGludmVzdG9ycyB0byBlbnRydXN0IHRoZW0gd2l0aCAkMjUwIG1pbGxpb24gdG8gdXNlIGFzIHNlZWQgbW9uZXkuClRoZSB0d28gZnVuZGVkIDM2IHN0YXJ0LXVwcywgc2V2ZXJhbCBvZiB3aGljaCB0dXJuZWQgaGVhbHRoeSBwcm9maXRzLiBCdXQgbGFzdCBtb250aCwgdGhlaXIgZm9ydHVuZXMgdHVybmVkLiBUaGVpciBtb3N0IHByZXN0aWdpb3VzIGludmVzdG9ycywgSGFydmFyZCBVbml2ZXJzaXR5IGFuZCBwdWJsaWMgcGVuc2lvbiBmdW5kcyBpbiBDYWxpZm9ybmlhLCBDb2xvcmFkbyBhbmQgTmV3IE1leGljbywgcHVsbGVkICQxMjAgbWlsbGlvbiBvdXQgb2YgdGhlIGZpcm0sIGN1dHRpbmcgb2ZmIG11Y2ggb2YgdGhlIGNvbXBhbnnigJlzIGNhc2ggc3VwcGx5LgpUaGUgaW52ZXN0b3JzIHNhaWQgdGhleSB3ZXJlIHRyb3VibGVkIHRoYXQgdGhlIHR3byBwYXJ0bmVycywgQ2hhZCBCcm93bnN0ZWluIGFuZCBKb25haCBTY2huZWwsIHNvbGljaXRlZCBwb2xpdGljYWwgY29udHJpYnV0aW9ucyBmcm9tIHRoZSBmbGVkZ2xpbmcgZmlybXMgdGhleSBmaW5hbmNlZCwgYW5kIHNldmVyYWwgb2JsaWdlZC4=

共绘美美与共的人类文明画卷|人类|世界_新浪新闻
March 28, 2019
https://news.sina.com.cn/c/xl/2019-03-28/doc-ihtxyzsm0966222.shtml
5YWx57uY576O576O5LiO5YWx55qE5Lq657G75paH5piO55S75Y23CjXlubTliY3vvIzkuZ/mmK/lnKjov5nmoLfnmoTkuIDkuKrmmKXlpKnvvIzkuaDov5HlubPkuLvluK3lnKjlt7Tpu47ogZTlkIjlm73mlZnnp5Hmlofnu4Tnu4fmgLvpg6jlj5HooajmvJTorrLvvIznsr7ovp/mjIflh7rmlofmmI7mmK/lpJrlvanjgIHlubPnrYnjgIHljIXlrrnnmoTvvIzlkJHkuJbnlYzmt7HliLvpmJDph4rkuobkuK3lm73nmoTmlofmmI7op4LigJTigJQK4oCc5oiR5Lus5bqU6K+l5o6o5Yqo5LiN5ZCM5paH5piO55u45LqS5bCK6YeN44CB5ZKM6LCQ5YWx5aSE77yM6K6p5paH5piO5Lqk5rWB5LqS6Ym05oiQ5Li65aKe6L+b5ZCE5Zu95Lq65rCR5Y+L6LCK55qE5qGl5qKB44CB5o6o5Yqo5Lq657G756S+5Lya6L+b5q2l55qE5Yqo5Yqb44CB57u05oqk5LiW55WM5ZKM5bmz55qE57q95bim44CC4oCdCjXlubTmnaXvvIzot6jlhaXmlrDml7bku6PnmoTkuK3lm73vvIzkuI3mlq3ku47kuK3ljY7msJHml481MDAw5aSa5bm05paH5piO5Y+y5Lit5rGy5Y+W5pm65oWn5ZKM5Yqb6YeP77yM5Zyo5a6e546w5rCR5peP5Lyf5aSn5aSN5YW055qE5b6B56iL5Lit77yM5ZCM5Luj6KGo5LiN5ZCM5paH5piO55qE5LiW55WM5ZCE5Zu95ZCE5Zyw5Yy65pC65omL5bm26L+b77yM5YWx5ZCM57uY5bCx5LiA5bmF5paR5paT5aOu5Li955qE5Lq657G75paH5piO55S75Y2344CCCuWSjOiAjOS4jeWQjO+8jOWQiOS9nOWFsei1ouKAlOKAlOenieaMgeKAnOWSjOWQiOKAneeQhuW/te+8jOWdmuaMgei1sOWSjOW5s+WPkeWxlemBk+i3r++8jOWQjOS4lueVjOWQhOWbveS6kuWIqeWFsei1ogrigJzlkozlpoLnvrnnhInvvIzmsLTjgIHngavjgIHphq/jgIHphqLjgIHnm5DjgIHmooXvvIzku6Xng7npsbzogonjgILigJ3igJzlo7DkuqblpoLlkbPvvIzkuIDmsJTvvIzkuozkvZPvvIzkuInnsbvvvIzlm5vnianvvIzkupTlo7DvvIzlha3lvovvvIzkuIPpn7PvvIzlhavpo47vvIzkuZ3mrYzvvIzku6Xnm7jmiJDkuZ/jgILigJ3igJzoi6Xku6XmsLTmtY7msLTvvIzosIHog73po5/kuYvvvJ/oi6XnkLTnkZ/kuYvkuJPlo7nvvIzosIHog73lkKzkuYvvvJ/igJ3igKbigKYK56uZ5Zyo6IGU5ZCI5Zu95pWZ56eR5paH57uE57uH5oC76YOo55qE6K6y5Y+w5LiK77yM5Lmg6L+R5bmz5Li75bit6L+Z5qC35ZCR5LiW55WM6K6y6L+w5Lit5Zu95Lq64oCc5ZKM6ICM5LiN5ZCM4oCd55qE5ZOy5a2m55CG5b+177yM6K6y6L+w5Lit5Y2O5rCR5peP5pyA5rex5bGC55qE57K+56We6L+95rGC44CB5Lit5Y2O5rCR5peP54us54m555qE57K+56We5qCH6K+G44CCCuKAnOWSjOiAjOS4jeWQjOKAneKAnOS7peWSjOS4uui0teKAneKAnOWSjOWQiOWFseeUn+KAneKApuKApuKAnOWSjOWQiOKAneeQhuW/tea3sea3seakjeagueS6juS4reWNjuawkeaXj+eahOeyvuelnuS4lueVjOS5i+S4re+8jOa3sea3sea6tuWMluWcqOS4reWbveS6uuawkeeahOihgOiEieS5i+S4re+8jOS5n+mynOaYjuaYoOeFp+WcqOS4reWbveWQjOS4lueVjOWQhOWbveS6pOW+gOeahOWFt+S9k+Wunui3teS5i+S4reOAggrnp4nmjIHigJzlkozlkIjigJ3nkIblv7XvvIzlnZrmjIHotbDlkozlubPlj5HlsZXpgZPot6/vvIzku6Xoh6rouqvlj5HlsZXkuLrkuJbnlYzkvZzlh7rmm7TlpKfotKHnjK7igJTigJQK4oCc5Lit5Zu95pep5bCx5ZCR5LiW55WM6YOR6YeN5a6j56S677ya5Lit5Zu95Z2a5a6a5LiN56e76LWw5ZKM5bmz5Y+R5bGV6YGT6Lev77yM5pei6YCa6L+H57u05oqk5LiW55WM5ZKM5bmz5Y+R5bGV6Ieq5bex77yM5Y+I6YCa6L+H6Ieq6Lqr5Y+R5bGV57u05oqk5LiW55WM5ZKM5bmz44CC4oCdCjXlubTmnaXvvIzku47lvrflm73np5HlsJTkvK/ln7rph5HkvJrliLDljbDluqbkuJbnlYzkuovliqHlp5TlkZjkvJrvvIzku47mr5TliKnml7bluIPpsoHml6XmrKfmtLLlrabpmaLliLDpn6nlm73lm73nq4vpppblsJTlpKflrabvvIzku47okpnlj6Tlm73lm73lrrblpKflkbzmi4nlsJTliLDmvrPlpKfliKnkuprogZTpgqborq7kvJrjgIHnp5jpsoHlm73kvJrvvIzlho3liLDogZTlkIjlm73mgLvpg6jjgIHpmL/mi4nkvK/lm73lrrbogZTnm5/mgLvpg6jigKbigKbkuaDov5HlubPkuLvluK3liKnnlKjlkITnp43lm73pmYXlnLrlkIjorrLov7DkuK3lm73lr7nlkozlubPnmoTmiafnnYDov73msYLvvIzov5nmmK/lr7nkuK3ljY7msJHml4/niLHlpb3lkozlubPnmoTnlJ/liqjlrqPku4vvvIzmm7TmmK/kuIDkuKrkuJzmlrnlpKflm73lr7nkuJbnlYzkurrmsJHkvZzlh7rnmoTlnZrlrprmib/or7rvvIEK5by66LCD5ZKM5bmz5Y+R5bGV5a+55Lit5Zu955qE5oSP5LmJ77yM5Lmg6L+R5bmz5Li75bit55So4oCc5bCx5YOP5Lq66ZyA6KaB56m65rCU5LiA5qC377yM5bCx5YOP5LiH54mp55Sf6ZW/6ZyA6KaB6Ziz5YWJ5LiA5qC34oCd5L2c5Za777yb6ZiQ6YeK5Lit5Zu95Z2a5a6a6LWw5ZKM5bmz5Y+R5bGV6YGT6Lev55qE5Yaz5b+D77yM5Lmg6L+R5bmz5Li75bit5by66LCD4oCc5Lit5Zu95Lq655qE6KGA6ISJ5Lit5rKh5pyJ56ew546L56ew6Zy444CB56m35YW16bup5q2m55qE5Z+65Zug4oCd44CCCuKAnOS4lueVjOWlve+8jOS4reWbveaJjeiDveWlve+8m+S4reWbveWlve+8jOS4lueVjOaJjeabtOWlveOAguKAneW5s+WunueahOivneivre+8jOamguaLrOWHuuaWsOaXtuS7o+S4reWbveS4juS4lueVjOWFs+ezu+eahOWkp+mAu+i+keOAguS9nOS4uuW9k+S7iuS4lueVjOacgOWkp+eahOWPkeWxleS4reWbveWutu+8jOS4reWbvea3seefpe+8jOWPquacieWdmuaMgei1sOWSjOW5s+WPkeWxlemBk+i3r++8jOS4reWbveaJjeiDveWunueOsOiHqui6q+WPkeWxleebruagh++8jOaJjeiDveS4uuS4lueVjOS9nOWHuuabtOWkp+i0oeeMruOAggrkuJbnlYznrKzkuozlpKfnu4/mtY7kvZPjgIHnrKzkuIDlpKflt6XkuJrlm73jgIHnrKzkuIDlpKfotKfnianotLjmmJPlm73jgIHnrKzkuIDlpKflpJbmsYflgqjlpIflm73vvIzlr7nlhajnkIPnu4/mtY7lop7plb/otKHnjK7njofotoXov4czMCXvvIznjrDooYzogZTlkIjlm73moIflh4bkuIvnmoQ35Lq/5aSa6LSr5Zuw5Lq65Y+j5oiQ5Yqf6ISx6LSr4oCm4oCmCueKueWmguS4gOW6p+eBr+WhlO+8jOS4reWbveeahOWPkeWxlemBk+i3r+WSjOe7j+mqjOaYreWRiuS4luS6uu+8jOmAmuWQkeeOsOS7o+WMlueahOmBk+i3r+S4jeatouS4gOadoe+8jOS7u+S9leS4gOS4quWbveWutuOAgeS4gOenjeaWh+aYju+8jOWPquimgeaJvuWIsOS4gOadoeespuWQiOiHqui6q+WbveaDheeahOWPkeWxlemBk+i3r++8jOe7iOeptuWPr+S7peWcqOS/neaMgeiHqui6q+eLrOeri+aAp+eahOWQjOaXtu+8jOi/juadpeawkeaXj+WPkeWxleeahOW5v+mYlOWJjeaZr+OAggrnp4nmjIHigJzlkozlkIjigJ3nkIblv7XvvIzmjqjliqjmnoTlu7rku6XlkIjkvZzlhbHotaLkuLrmoLjlv4PnmoTmlrDlnovlm73pmYXlhbPns7vvvIzmiZPpgKDpgY3luIPlhajnkIPnmoTkvJnkvLTlhbPns7vnvZHnu5zigJTigJQK6L+R5LiA5Liq5LiW57qq5YmN77yM6Iux5Zu95ZOy5a2m5a62572X57Sg5pu+6K+077ya4oCc5Lit5Zu96Iez6auY5peg5LiK55qE5Lym55CG5ZOB6LSo5Lit55qE5LiA5Lqb5Lic6KW/77yM546w5Luj5LiW55WM5p6B5Li66ZyA6KaB44CC4oCdCuaUvuecvOW9k+S7iuS4lueVjO+8jOWFqOeQg+e7j+a1juWkjeiLj+S5j+WKm+OAgeWcsOWMuueDreeCueatpOi1t+W9vOS8j+OAgeaBkOaAluS4u+S5ieaXpeebiueqgeWHuuKApuKApui2iuadpei2iuWkmueahOacieivhuS5i+Wjq+WwhuebruWFiei9rOWQkeS4lueVjOeahOS4nOaWue+8jOacn+W+hee7teW7tuaVsOWNg+W5tOeahOS4reWNjuaWh+aYjuiDveS4uuino+WGs+W9k+S7o+S6uuexu+mavumimOaPkOS+m+abtOWkmuWQr+ekuuOAgeabtOa3seWIu+a0nuingeOAggrkuI3lkIzkuo7kuJbnlYzkuIrkuIDkupvmjpLku5bnmoTjgIHpm7blkozljZrlvIjnmoTmgJ3nu7TlkozmkJ7lm73pmYXlhbPns7vigJzlsI/lnIjlrZDigJ3nmoTlgZrms5XvvIzkuK3ljY7mlofljJbkuK3igJzlkozogIzkuI3lkIzigJ3nmoTnpL7kvJrop4LvvIzigJzlkajogIzkuI3mr5TigJ3nmoTnsr7npZ7mgIHluqbvvIzlkozoobflhbHmtY7jgIHlkIjkvZzlhbHotaLnmoTnkIblv7Xmm7TmnInliKnkuo7kuJbnlYznmoTlkozlubPjgIHnqLPlrprjgIHnuYHojaPjgIIK5o6o5Yqo5p6E5bu655u45LqS5bCK6YeN44CB5YWs5bmz5q2j5LmJ44CB5ZCI5L2c5YWx6LWi55qE5paw5Z6L5Zu96ZmF5YWz57O777yb5aWJ6KGM5Lqy6K+a5oOg5a6555qE5ZGo6L655aSW5Lqk55CG5b+15ZKM55yf5a6e5Lqy6K+a55qE5a+56Z2e5pS/562W55CG5b+177yb56eJ5oyB5q2j56Gu5LmJ5Yip6KeC77yM5LiN5pat5ouT5bGV5YWo55CD5LyZ5Ly05YWz57O777yM5omp5aSn5ZCM5ZCE5Zu955qE5Yip55uK5rGH5ZCI54K577yb5Li75byg5Zyo5YWo55CD5rK755CG5Lit5a6e546w5YWx5ZWG5YWx5bu65YWx5Lqr4oCm4oCmCuWQjOS4u+imgeWkp+WbveWFs+ezu+aAu+S9k+eos+Wumu+8jOWQjOWRqOi+ueWbveWutuWFs+ezu+WFqOmdouWPkeWxle+8jOWQjOWPkeWxleS4reWbveWutuWboue7k+WQiOS9nOe6veW4puabtOWKoOeJouWbuuKApuKApgrlkozlubPjgIHlkozosJDjgIHlkoznnabjgILpnaLlr7nnmb7lubTmnKrmnInkuYvlpKflj5jlsYDvvIzku6XkuaDov5HlubPlkIzlv5fkuLrmoLjlv4PnmoTlhZrkuK3lpK7pooblr7zkuK3lm73kurrmsJHvvIzku6Xlrr3lub/nmoTljoblj7Lop4bph47jgIHmt7HljprnmoTkurrmlofmg4XmgIDjgIHpq5jluqbnmoTmlofljJboh6rkv6HvvIzlnKjlu7bnu63msJHml4/mlofljJbooYDohInkuK3lvIDmi5PliY3ooYzvvIzkuLrkuI3noa7lrprnmoTkuJbnlYzms6jlhaXmm7TlpKfnmoTnoa7lrprmgKfvvIznu5nlj5for7jlpJrmjJHmiJjlm7DmibDnmoTkuJbnlYzluKbmnaXmlrDlkK/ov6rjgIHmlrDmtLvlipvjgIHmlrDluIzmnJvjgIIK5Zyo6Iux5Zu95YmR5qGl5aSn5a2m5pWZ5o6I6ams5LiBwrfpm4XlhYvnnIvmnaXvvIzkuK3lm73igJzmj5DkvpvkuobkuIDnp43igJjmlrDnmoTlj6/og73igJnigKbigKblvIDovp/kuIDmnaHlkIjkvZzlhbHotaLjgIHlhbHlu7rlhbHkuqvnmoTmlofmmI7lj5HlsZXmlrDpgZPot6/igJ3vvIzogIznvo7lm73lrabogIXnuqbnkZ/lpKvCt+WliOS5n+iupOS4uu+8jOS4reWbveWQkeS4lueVjOWxleekuuS6huKAnOS7pOS6uui1nui1j+eahOato+iDvemHj+eahOaUv+ayu+WxgOmdou+8jO+8iOS4jumbtuWSjOaAnee7tOi/peeEtuacieWIq+eahO+8ieKAmOato+WSjOaUv+ayu+KAmeKAneOAggrmtbfnurPnmb7lt53vvIzljIXlrrnkupLpibTigJTigJTmjqLntKLmlofmmI7kuqTmtYHkuYvpgZPvvIzmnrborr7lv4PngbXmsp/pgJrkuYvmoaUK4oCc5oiR6K6/6Zeu6L+H5LiW55WM5LiK6K645aSa5Zyw5pa577yM5pyA5Zac5qyi5YGa55qE5LiA5Lu25LqL5oOF5bCx5piv5LqG6Kej5LqU5aSn5rSy55qE5LiN5ZCM5paH5piO77yM5LqG6Kej6L+Z5Lqb5paH5piO5LiO5YW25LuW5paH5piO55qE5LiN5ZCM5LmL5aSE44CB54us5Yiw5LmL5aSE77yM5LqG6Kej5Zyo6L+Z5Lqb5paH5piO5Lit55Sf5rS755qE5Lq65Lus55qE5LiW55WM6KeC44CB5Lq655Sf6KeC44CB5Lu35YC86KeC44CC4oCdCuaWh+aYjuWboOS6pOa1geiAjOWkmuW9qe+8jOaWh+aYjuWboOS6kumJtOiAjOS4sOWvjOOAgui/h+WOuzXlubTpl7TvvIzkuaDov5HlubPkuLvluK3lh7rorr81MOWkmuS4quWbveWutu+8jOWcqOS4lueVjOS6lOWkp+a0sueVmeS4i+S6huaOoue0ouaWh+aYjuS6pOa1geS6kumJtOeahOaAneiAg+WSjOi6q+W9seOAggrlnKjljbDluqbvvIzku5blr7nms7DmiIjlsJTnmoTor5fpm4blpoLmlbDlrrbnj43vvJvlnKjms5Xlm73vvIzlqpLkvZPnu5/orqHku5bmm77mj5Dlj4rms5XlhbDopb/lkI3kurrlpJrovr4zNOS9je+8jOWMheaLrOaWh+WtpuWutuOAgeiJuuacr+WutuOAgeaAneaDs+Wutu+8m+WcqOiLseWbve+8jOS7luWKqOaDheWcsOWbnuW/hui1t+iHquW3seW5tOi9u+aXtuWcqOmZleWMl+i0q+eYoOeahOm7hOWcn+WcsOS4iuaDs+aWueiuvuazleWvu+aJvuiOjuWjq+avlOS6muS9nOWTgeeahOe7j+WOhu+8m+WcqOe+juWbve+8jOS7luWvueairee9l+OAgeaDoOeJueabvOOAgemprOWFi8K35ZCQ5rip44CB5p2w5YWLwrfkvKbmlabnmoTkvZzlk4HlqJPlqJPpgZPmnaXigKbigKYK5ZOB5aSa5YWD5paH5YyW5LmL576O77yM6LCL5Lqk5rWB5LqS6Ym05LmL6YGT44CCCuS7juKAnOS4nee7uOS5i+i3r+a0u+WMluefs+KAneS5jOWFueWIq+WFi+aWr+WdpuW4g+WTiOaLieWPpOWfju+8jOWIsOenmOmygeWbveWutuiAg+WPpOS6uuexu+WtpuWOhuWPsuWNmueJqemmhu+8jOWGjeWIsOaNt+WFi+aWr+eJueaLiemcjeWkq+WbvuS5pummhuKApuKApuWwveeuoee5geW/meeahOS8muaZpOWGmea7oeS6huWvhumbhueahOaXpeeoi+WuieaOkuihqO+8jOS5oOi/keW5s+S4u+W4reS7jeWcqOeZvuW/meS5i+S4rei6q+S9k+WKm+ihjO+8jOS7peaWh+WMluS/g+S6pOa1ge+8jOS7peS6pOa1geS/g+eQhuino+OAggrmlofmmI7lpoLmsLTvvIzmtqbnianml6Dlo7DjgIIK5peg6K665piv6K6/6Zeu5YmN5aSV5Zyo5b2T5Zyw5aqS5L2T5Y+R6KGo572y5ZCN5paH56ug77yM6L+Y5piv6K6/6Zeu5pyf6Ze05Y+R6KGo5ryU6K6y44CB5a+56K+d5pS/6KaB44CB5ZCM5b2T5Zyw5rCR5LyX5Lqy5YiH5LqS5Yqo77yM5Lmg6L+R5bmz5Li75bit5a+55b2T5Zyw57uP5YW45paH5YyW5L2c5ZOB55qE54af56iU77yM5Luk5Lq66LWe5Y+544CCCuWcqOavlOWIqeaXtuW4g+mygeaXpeasp+a0suWtpumZou+8jOS5oOi/keW5s+S4u+W4reS7peiMtuWSjOmFkuS9nOWWu++8jOiusui/sOS4nOilv+aWueWTgeWRs+eUn+WRveOAgeino+ivu+S4lueVjOeahOS4pOenjeS4jeWQjOaWueW8j++8jOW8uuiwg+KAnOiMtuWSjOmFkuW5tuS4jeaYr+S4jeWPr+WFvOWuueeahO+8jOaXouWPr+S7pemFkumAouefpeW3seWNg+adr+Wwke+8jOS5n+WPr+S7peWTgeiMtuWTgeWRs+WTgeS6uueUn+KAne+8m+WSjOe+juWbveaAu+e7n+eJueacl+aZrua8q+atpeaVheWuq++8jOS+neasoeWPguinguWkquWSjOauv+OAgeS4reWSjOauv+OAgeS/neWSjOauv++8jOS9k+S8muKAnOWSjOKAnei/meS4gOS4reWNjuaWh+aYjuaguOW/g+eQhuW/te+8m+WNsOW6puaAu+eQhuiOq+i/quWIsOiuv+atpuaxie+8jOS5oOi/keW5s+S4u+W4reWQjOS7luS4gOmBk+WPguingua5luWMl+ecgeWNmueJqemmhueyvuWTgeaWh+eJqeWxle+8jOWcqOi2iueOi+WLvui3teWJkeOAgeS6keaipuenpueugOOAgeabvuS+r+S5mee8lumSn+mXtOepv+ihjO+8jOWFseWQjOWTgeWRs+WPpOiAgeaWh+aYjueahOeBv+eDguWOmumHjeOAggrkuK3ljY7mlofmmI7kuYvljZrlpKfnsr7mt7HjgIHmuKnmtqbkurrlv4PvvIzlsLHlnKjov5nkuIDkuKrkuKrnu4boioLkuK3nlJ/liqjlsZXnjrDvvIzlkJHkuJbnlYzlsZXnpLrlh7rkuK3ljY7msJHml4/ku6XlkozkuLrotLXjgIHku6XmlofljJbkurrnmoTkuqTlvoDnkIblv7Xlkozku7flgLzov73msYLjgIIK576O5Zu95pe25Luj5Ye654mI5YWs5Y+45Ye654mI55qE44CK5Lmg6L+R5bmz5pe25Luj44CL5LiA5Lmm6YeM5YaZ6YGT77ya5Lmg6L+R5bmz55qE5paH5YyW6KeG6YeO55Sa5Li65a696ZiU77yM5ZOy5a2m44CB5Y6G5Y+y44CB5paH5a2m44CB6Im65pyv44CB6Z+z5LmQ44CB5Y+k5biM6IWK44CB5paH6Im65aSN5YW044CB546w5b2T5Luj77yM6YO95ra155uW5YW25Lit44CCCua3seWOmueahOaWh+WMluW6leiVtO+8jOWfueiCsuW5v+mYlOeahOiDuOaAgOOAguaWh+WMluiHquS/oe+8jOaYr+WFvOWuueW5tuiThOOAgea1t+e6s+eZvuW3neS5i+WQjueahOiHquS/oe+8jOS5n+aYr+WwiumHjeaWh+aYjuWkmuagt+aAp+WfuuehgOS4iueahOiHquS/oeOAggoyMDE35bm05Yid56eL77yM5Y6m6Zeo44CCCjIwMTTlubTkuprlpKrnu4/lkIjnu4Tnu4fljJfkuqzkvJrorq7jgIEyMDE25bm05LqM5Y2B5Zu96ZuG5Zui5p2t5bee5bOw5Lya44CBMjAxN+W5tOmHkeegluWbveWutumihuWvvOS6uuWOpumXqOS8muaZpOOAgTIwMTjlubTkuIrmtbflkIjkvZznu4Tnu4fpnZLlspvls7DkvJrigKbigKbkuaDov5HlubPkuLvluK3kuLvmjIHnmoTlpJrovrnkuLvlnLrlpJbkuqTmtLvliqjmiJDmnpzmu6Hmu6HjgILni6zlhbfljKDlv4PnmoTmlofljJbmtLvliqjono3lkIjkuJzopb/mlrnlhYPntKDvvIzlkIzmoLforqnlhavmlrnmnaXlrqLkuqvlj5fkuIDluK3luK3mlofljJbnm5vlrrTvvIzop4Hor4HkuIDlnLrlnLrkuJzopb/mlrnmlofmmI7nmoTlr7nor53jgIIK6L+ZNeW5tO+8jOS4gOS4quS4quaVheS6i+aLiei/keW/g+eahOi3neemu+KAlOKAlArmjbflhYvljaHpgJrlvaLosaHlsI/pvLnpvKDjgIHlj6Tlt7TphY3oloTojbflj7bliqDlhrDlnZfnmoTmnJflp4bphZLjgIHokaHokITniZnom4vmjJ7jgIHlt7Tmi7/pqaznkbDlpI/lkpbllaHjgIHpmL/moLnlu7fmjqLmiIjigKbigKbpnaLlr7nkuI3lkIzlm73lrrbnmoTmsJHkvJfvvIzkuaDov5HlubPkuLvluK3lr7nlvZPlnLDmnoHlr4znibnoibLnmoTmlofljJbnrKblj7fmgLvmmK/kv6HmiYvmi4jmnaXjgIIK6Ziz5YWJ5pyJ5LiD56eN6aKc6Imy77yM5LiW55WM5Lmf5piv5aSa5b2p55qE44CCCuWcqOexu+avlOS4reWIhuS6q+aVheS6i++8jOWcqOaVheS6i+S4reWvu+aJvuWFsem4o+OAguS5oOi/keW5s+S4u+W4reWcqOS4nOilv+aWueivneivreaooeW8j+S5i+mXtOiHqueUseWIh+aNou+8jOWxleekuuS6huS4gOS4quWPpOiAgeWPiOeOsOS7o+eahOS4reWbveW8gOaUvuWMheWuueeahOWbvemZheW9ouixoe+8jOWkluS6pOaWsOiMg+W8j+WFqOeQg+eeqeebruOAggropb/mlrnop4Llr5/kurrlo6vnlLHoobfmhJ/lj7nvvJrigJzkuaDov5HlubPmmK/kuIDkuKrorrLmlYXkuovnmoTpq5jmiYvjgILnibnliKvmmK/lpJbkuqTlnLrlkIjvvIzku5borrLov7DnmoTmlYXkuovmlrDpspzmnInotqPjgIHmuKnppqjogIzlhoXmtrXmt7Hov5zigKbigKbigJ0K4oCc5o6o5Yqo5paH5piO5Lqk5rWB5LqS6Ym077yM5Y+v5Lul5Liw5a+M5Lq657G75paH5piO55qE6Imy5b2p77yM6K6p5ZCE5Zu95Lq65rCR5Lqr5Y+X5pu05a+M5YaF5ra155qE57K+56We55Sf5rS744CB5byA5Yib5pu05pyJ6YCJ5oup55qE5pyq5p2l44CC4oCd5Lmg6L+R5bmz5Li75bit6K+044CCCui/mTXlubTvvIzkuIDmnaHmnaHkurrmlofnur3luKbmkK3lu7rlj4vosIrkuYvmoaXigJTigJQK5Zyo5Lit6Z2e5ZCI5L2c6K665Z2b5YyX5Lqs5bOw5Lya44CB5Lit5Zu9LeaLiee+juWSjOWKoOWLkuavlOWbveWutumihuWvvOS6uuS8muaZpOOAgeS4reWbvS3pmL/mi4nkvK/lm73lrrblkIjkvZzorrrlnZvpg6jplb/nuqfkvJrorq7kuIrvvIzkuaDov5HlubPkuLvluK3pg73lrqPluIPkuobmjqjliqjlj4zmlrnkurrmlofkuqTmtYHnmoTlpJrpobnkuL7mjqrjgILpq5jlsYLlvJXpoobkuIvvvIzkuK3ms5XjgIHkuK3lvrflu7rnq4vpq5jnuqfliKvkurrmlofkuqTmtYHmnLrliLbvvIzkuK3mlrnlnKjojbflhbDorr7nq4vpppbkuKrkuK3lm73mlofljJbkuK3lv4PvvIzkuK3mr5TkupLmtL7nlZnlrabnlJ/nmoTop4TmqKHkuZ/lnKjkuI3mlq3mianlpKfjgIIK57q16KeC5Lq657G75Y6G5Y+y77yM5oqK5Lq65Lus6ZqU56a75byA5p2l55qE5b6A5b6A5LiN5piv5Y2D5bGx5LiH5rC077yM5LiN5piv5aSn5rW35rex5aOR77yM6ICM5piv5Lq65Lus55u45LqS6K6k55+l5LiK55qE6ZqU6Iac44CC5q2j5aaC5b635Zu95ZOy5a2m5a626I6x5biD5bC86Iyo5omA6K+077yM5ZSv5pyJ55u45LqS5Lqk5rWB5oiR5Lus5ZCE6Ieq55qE5omN6IO977yM5omN6IO95YWx5ZCM54K554eD5oiR5Lus55qE5pm65oWn5LmL54Gv44CCCuKAnOaIkeS7rOacn+W+heaetuiuvuWQhOWbveawkemXtOS6pOW+gOeahOahpeaige+8jOS4uuS6uuawkeWIm+mAoOabtOe+juWlveeahOeUn+a0u+OAguKAneS5oOi/keW5s+S4u+W4reivtOOAggrmnJ/orrjvvIzmgLvmmK/lnKjlsZXmnJvmlrDoiKrnqIvml7booqvotYvkuojnibnmrormhI/kuYnjgII15bm05YmN77yM5Lmg6L+R5bmz5Li75bit5Lul5paH5piO5LmL56yU5o+P57uY4oCc5ZG96L+Q5YWx5ZCM5L2T4oCd55qE5bqV6Imy77ya4oCc5oiR5Lus5bqU6K+l5LuO5LiN5ZCM5paH5piO5Lit5a+75rGC5pm65oWn44CB5rGy5Y+W6JCl5YW777yM5Li65Lq65Lus5o+Q5L6b57K+56We5pSv5pKR5ZKM5b+D54G15oWw6JeJ77yM5pC65omL6Kej5Yaz5Lq657G75YWx5ZCM6Z2i5Li055qE5ZCE56eN5oyR5oiY44CC4oCdCuS7jueRnuWjq+aXpeWGheeTpuS4h+WbveWuq+WIsOaksOW9seWphuWokeeahOa1t+WNl+WNmumzjO+8jOS7jumHkeegluWbveWutumihuWvvOS6uuS8muaZpOWIsOS4remdnuWQiOS9nOiuuuWdm+WMl+S6rOWzsOS8mu+8jOS5oOi/keW5s+S4u+W4reWcqOWkmuS4qumHjeimgeWcuuWQiOWxleekuuS4reWbveaEv+WQjOS4lueVjOWQhOWbvemjjumbqOWQjOiIn+OAgeWRvei/kOS4juWFseeahOa7oea7oeivmuaEj+OAggrlpKfpgZPkuYvooYzvvIzlpKnkuIvkuLrlhazjgILplYzliLvlnKg1MDAw5aSa5bm05Y2O5aSP5paH5piO5Z+65Zug6YeM55qE4oCc5aSp5LiL4oCd55CG5b+177yM5Zyo5paw5pe25Luj5bGV546w5Ye65Y2P5ZKM5LiH6YKm44CB5YuH5LqO5ouF5b2T55qE5LiW55WM5oOF5oCA44CCCumdouWvueS6uuexu+ekvuS8muWPkeWxleKAnOS9leWOu+S9leS7juKAneeahOaXtuS7o+S5i+mXru+8jOS4reWbvemihuWvvOS6uueZu+mrmOacm+i/nO+8jOerr+i1t+WOhuWPsueahOacm+i/nOmVnO+8jOWPkeaOmOS4reWNjuaWh+WMluS4reenr+aegeeahOWkhOS4luS5i+mBk+WSjOayu+eQhueQhuW/teWQjOW9k+S7iuaXtuS7o+eahOWFsem4o+eCue+8jOS4uuS6uuexu+ekvuS8mui/m+atpeeCueS6ruaAneaDs+eBr+WhlOKAlOKAlArigJzmiJHku6zlkbzlkIHvvIzlkITlm73kurrmsJHlkIzlv4PljY/lipvvvIzmnoTlu7rkurrnsbvlkb3ov5DlhbHlkIzkvZPvvIzlu7rorr7mjIHkuYXlkozlubPjgIHmma7pgY3lronlhajjgIHlhbHlkIznuYHojaPjgIHlvIDmlL7ljIXlrrnjgIHmuIXmtIHnvo7kuL3nmoTkuJbnlYzjgILigJ0K55m+5bed5pyd5rW377yM5rWB6KGM5LiN5q2i77yb6YGT6Jm96L696L+c77yM5peg5LiN5Yiw6ICF44CC5YaZ5YWl6IGU5ZCI5Zu95Yaz6K6u44CB5YaZ5YWl44CK5LiK5rW35ZCI5L2c57uE57uH5oiQ5ZGY5Zu95YWD6aaW55CG5LqL5Lya6Z2S5bKb5a6j6KiA44CL44CB5YaZ5YWl44CK5Lit6Z2e5ZCI5L2c6K665Z2bLeWMl+S6rOihjOWKqOiuoeWIku+8iDIwMTktMjAyMeW5tO+8ieOAi+KApuKApuaehOW7uuS6uuexu+WRvei/kOWFseWQjOS9k+eahOeQhuW/tea/gOiNoeWFqOeQg+WbnuWTjeOAggrigJzkurrnsbvlkb3ov5DlhbHlkIzkvZPnkIblv7XkuI7kuK3lm73lj6TlhbjkurrmlofkuLvkuYnnkIbop6PmnoTmiJDopoHntKDnmoTmma7pgY3kuLvkuYnnm7jlkbzlupTjgILigJ3ms5Xlm73lm73pmYXpl67popjkuJPlrrbpq5jlpKfkvJ/or7TvvIzov5nmmK8yMeS4lue6quWvueS4reWbveKAnOWkp+WQjOKAnee7j+WFuOamguW/teeahOmHjeaWsOivoOmHiu+8jOWMheWQq+S6huabtOmrmOWxguasoeeahOWboue7k+S4juWSjOiwkOOAggrnqbfliJnni6zlloTlhbbouqvvvIzovr7liJnlhbzmtY7lpKnkuIvjgILkuK3lm73lnKjkuIDlv4PkuIDmhI/lip7lpb3oh6rlt7Hkuovmg4XnmoTlkIzml7bvvIzmm7Tku6XlpKnkuIvkuLrmgIDvvIzlsL3lt7HmiYDog73kuLrkuJbnlYzmjIHnu63lj5HlsZXmj5DkvpvmlrDnmoTop6PlhrPmlrnmoYjjgIIK5L2c5Li65p6E5bu65Lq657G75ZG96L+Q5YWx5ZCM5L2T55qE5a6e6Le15bmz5Y+w77yM4oCc5LiA5bim5LiA6Lev4oCd5YCh6K6u5LuO5Y6G5Y+y5Lit6LWw5p2l77yM5ZCR552A5pyq5p2l5bu25bGV77yM5o6o5Yqo5rK/57q/5Zu95a625a6e546w5Y+R5bGV5oiY55Wl55u45LqS5a+55o6l44CB5LyY5Yq/5LqS6KGl77yM5Lul5YWx5ZWG5YWx5bu65YWx5Lqr6LCL5rGC5Y+R5bGV5paw5Yqo5Yqb44CB5ouT5bGV5Y+R5bGV5paw56m66Ze044CCCuKAnOWFseW7uuKAmOS4gOW4puS4gOi3r+KAmeaYr+e7j+a1juWQiOS9nOWAoeiuru+8jOS4jeaYr+aQnuWcsOe8mOaUv+ayu+iBlOebn+aIluWGm+S6i+WQjOebn++8m+aYr+W8gOaUvuWMheWuuei/m+eoi++8jOS4jeaYr+imgeWFs+i1t+mXqOadpeaQnuWwj+WciOWtkOaIluiAheKAmOS4reWbveS/seS5kOmDqOKAme+8m+aYr+S4jeS7peaEj+ivhuW9ouaAgeWIkueVjO+8jOS4jeaQnumbtuWSjOa4uOaIj++8jOWPquimgeWQhOWbveacieaEj+aEv++8jOaIkeS7rOmDveasoui/juOAguKAnQrlh6DkuKrigJzmmK/igJ3kuI7igJzkuI3mmK/igJ3vvIzmuIXmmbDli77li5Llh7rkuK3lm73lkIzkuJbnlYzlkITlm73lkb3ov5Dnm7jov57jgIHkvJHmiJrkuI7lhbHnmoTmoLzlsYDlkozog7jmgIDvvIzlkozogIzkuI3lkIznmoTkvKDnu5/mmbrmhafpl6rogIDljIXlrrnlkozlvIDmlL7kuYvlhYnjgIIK54us6KGM5b+r77yM5LyX6KGM6L+c44CC5YCh6K6u5o+Q5Ye6NeW5tOWkmuadpe+8jOS4reWbveW3suWQjDE1MOWkmuS4quWbveWutuWSjOWbvemZhee7hOe7h+etvue9suKAnOS4gOW4puS4gOi3r+KAneWQiOS9nOaWh+S7tu+8jOS8l+WkmuWQiOS9nOmhueebruiQveWcsOingeaViO+8jOS/g+i/m+WQhOWbveiejemAmuWPkeWxle+8jOWIh+WunuaUueWWhOS6huayv+e6v+WQhOWbveawkeeUn++8mgrkuJzpnZ7mnInkuobnrKzkuIDmnaHpq5jpgJ/lhazot6/vvIzpqazlsJTku6PlpKvmnInkuobnrKzkuIDluqfot6jmtbflpKfmoaXvvIznmb3kv4TnvZfmlq/nrKzkuIDmrKHmnInkuoboh6rlt7HnmoTovb/ovabliLbpgKDkuJrvvIzkuK3mrKfnj63liJfmiJDkuLrkuprmrKflpKfpmYbkuIrot53nprvmnIDplb/nmoTlkIjkvZznur3luKbigKbigKYK5pyJ5a2m6ICF6K+E6L+w77yM4oCc5LiA5bim5LiA6Lev4oCd5YCh6K6u5Lul5paH5piO5Lqk5rWB6LaF6LaK5paH5piO6ZqU6ZiC44CB5paH5piO5LqS6Ym06LaF6LaK5paH5piO5Yay56qB44CB5paH5piO5YWx5a2Y6LaF6LaK5paH5piO5LyY6LaK77yM5o6o5Yqo5ZCE5Zu955u45LqS5bCK6YeN44CB5rCR5Li75Y2P5ZWG5ZKM5YWx5ZCM5Yaz562W77yM5byA5Yib5LqG5aSa5YWD5paH5piO5Lqk6J6N55qE5paw6Lev5b6E77yM55So5a6e6ZmF6KGM5Yqo5L2T546w5LqG5Lq657G75ZG96L+Q5YWx5ZCM5L2T55qE57K+56We5a6e6LSo44CCCuKAnOKAmOS4nee7uOS5i+i3r+KAmeato+WcqOWkjeWFtOOAguKAneiLseWbveWtpuiAheW9vOW+l8K35byX5YWw56eR5r2Y6K6k5Li677yM6L+Z5LiA5Lq657G75paH5piO55qE5LiW55WM5Y2B5a2X6Lev5Y+j77yM5LiN5LuF5aGR6YCg5LqG5Lq657G755qE6L+H5Y6777yM5pu05bCG5aGR6YCg5LiW55WM55qE5pyq5p2l44CCCuagueS5i+iMguiAheWFtuWunumBgu+8jOiGj+S5i+ayg+iAheWFtuWFieaZlOOAgui1sOWQkeS8n+Wkp+WkjeWFtOeahOS4reWNjuawkeaXj++8jOWboOWFtuiHquW8uuS4jeaBr+eahOeyvuelnuWTgeagvOiAjOWOmuenr+iWhOWPke+8m+WNj+WSjOS4h+mCpueahOS4lueVjOaDheaAgO+8jOWboOWFtuaWh+aYjuS5i+mtguWSjOaXtuS7o+a3rOeCvOiAjOeUn+eUn+S4jeaBr+OAggrnvo7nvo7kuI7lhbHjgIHkuJbnlYzlpKflkIzvvIzkuK3lm73lkIzkuJbnlYzmkLrmiYvliY3ooYzvvIzmraXlsaXmhIjlj5Hpk7/plLXjgILkuI3kuYXvvIzlnKjkuK3lm73ov5jlsIbkuL7ooYznrKzkuozlsYrigJzkuIDluKbkuIDot6/igJ3lm73pmYXlkIjkvZzpq5jls7DorrrlnZvjgIHljJfkuqzkuJbnlYzlm63oibrljZrop4jkvJrjgIHkuprmtLLmlofmmI7lr7nor53lpKfkvJrigKbigKbkurrnsbvlkb3ov5DlhbHlkIzkvZPlsIbku6XmlofmmI7kuqTmtYHkupLpibTnrZHniaLmg4XmhJ/nur3luKbvvIzlhbHlu7rnu7/oibLlkoznnablrrblm63jgILmm7Tlr4zlhoXmtrXnmoTnsr7npZ7nlJ/mtLvjgIHmm7TlhbfmtLvlipvnmoTlnLDljLrkuI7lhajnkIPlkIjkvZzov5zmma/lj6/mnJ/jgIIK6K6p5ZKM5bmz55qE6Jaq54Gr5Luj5Luj55u45Lyg77yM6K6p5Y+R5bGV55qE5Yqo5Yqb5rqQ5rqQ5LiN5pat77yM6K6p5paH5piO55qE5YWJ6IqS54ag54ag55Sf6L6J44CC5oiR5Lus55u45L+h77yM5ZCE5Zu95Lq65rCR5ZCM5b+D5Yug5Yqb44CB5b+D5omL55u46L+e77yM5b+F5bCG5byA5Yib5Lq657G75paH5piO5pu05Yqg576O5aW955qE5pyq5p2l77yBCui0o+S7u+e8lui+ke+8muW8oOW7uuWIqQ==

交通运输部:两年内力争提前基本取消高速省界收费站
https://3w.huanqiu.com/a/a4d1ef/7lpwetjb1hw
5Lqk6YCa6L+Q6L6T6YOo77ya5Lik5bm05YaF5Yqb5LqJ5o+Q5YmN5Z+65pys5Y+W5raI6auY6YCf55yB55WM5pS26LS556uZCuS4reaWsOe9kTPmnIgyOOaXpeeUtSDku4rlubTmlL/lupzlt6XkvZzmiqXlkYrmj5Dlh7rvvIzkuKTlubTlhoXlj5bmtojlhajlm73pq5jpgJ/lhazot6/nnIHnlYzmlLbotLnnq5njgILkuqTpgJrov5DovpPpg6jmlrDpl7vlj5HoqIDkurrlkLTmmKXogJXku4rml6XlnKjosIjlj4rmraTlt6XkvZzmnIDmlrDov5vlsZXml7booajnpLrvvIzkuqTpgJrov5DovpPpg6jlt7LmiJDnq4vkuJPpobnlt6XkvZzmjIfmjKXpg6jvvIznoa7kv53kuKTlubTlhoXlipvkuonmj5DliY3ln7rmnKzlj5bmtojlhajlm73pq5jpgJ/lhazot6/nnIHnlYzmlLbotLnnq5njgIIK6LWE5paZ5Zu+77ya6auY6YCf5YWs6Lev5pS26LS556uZ44CC6YeR5rGJ5piVIOaRhCDlm77niYfmnaXmupDvvJrop4bop4nkuK3lm70KM+aciDI45pel77yM5Zu95paw5Yqe5Li+6KGM5paw6Ze75Y+R5biD5Lya77yM5Lqk6YCa6L+Q6L6T6YOo5pS/562W56CU56m25a6k5Li75Lu744CB5paw6Ze75Y+R6KiA5Lq65ZC05pil6ICV77yM5paw6Ze75Y+R6KiA5Lq65q+b5YGl5Zu057uV4oCc5o+Q6auY57u85ZCI5Lqk6YCa6L+Q6L6T572R57uc5pWI546H77yM6ZmN5L2O5Lqk6YCa6L+Q6L6T54mp5rWB5oiQ5pys4oCd5LuL57uN5pyJ5YWz5oOF5Ya144CCCuS7iuW5tOaUv+W6nOW3peS9nOaKpeWRiuS4reaPkOWHuuS4pOW5tOWGheWPlua2iOWFqOWbvemrmOmAn+WFrOi3r+ecgeeVjOaUtui0ueerme+8jOWcqOWbnuW6lOatpOW3peS9nOacgOaWsOi/m+WxleaXtu+8jOWQtOaYpeiAleS7i+e7je+8jOS4pOS8mue7k+adn+WQjueahOi/meauteaXtumXtO+8jOS6pOmAmui/kOi+k+mDqOe7j+WkmuasoeeglOeptumDqOe9su+8jOaYjuehruaKiuWPlua2iOWFqOWbvemrmOmAn+WFrOi3r+ecgeeVjOaUtui0ueermeW3peS9nOS9nOS4uuS7iuW5tOS6pOmAmui/kOi+k+eahOmHjeWkp+aUv+ayu+S7u+WKoeWSjOWktOetieaUu+WdmuW3peeoi+adpeaKk+OAguebruWJje+8jOS6pOmAmui/kOi+k+mDqOW3sue7j+WcqOmDqOWGheaIkOeri+S6hueUseS4u+imgemihuWvvOaMguW4heeahOS4k+mhueW3peS9nOaMh+aMpemDqO+8jOS4i+mdouiuvuS6hjnkuKrlt6XkvZzlsI/nu4TvvIznoJTnqbbliLblrprlhbfkvZPnmoTlt6XkvZzmlrnmoYjvvIznu4bljJblt6XkvZznm67moIfvvIzmmI7noa7lrp7mlr3nmoTot6/nur/lkoznm7jlhbPnmoTmioDmnK/mlrnmoYjjgIIK5ZC05pil6ICV6L+b5LiA5q2l5oyH5Ye677yM5pKk6ZSA6auY6YCf5YWs6Lev55yB55WM5pS26LS556uZ5piv5LiA5Liq5aSN5p2C55qE5bel56iL77yM5raJ5Y+K5Yiw5pS26LS55qih5byP55qE5pS56Z2p5Yib5paw77yM5Lmf5raJ5Y+K5Yiw5aSn6YeP55qE56Gs5Lu25bel56iL5bu66K6+5ZKM6L2v5Lu25Y2H57qn5pS56YCg77yM55u45YWz5pS/562W55qE57uf5LiA44CB5Lq65ZGY55qE5a6J572u562J77yM6Zq+5bqm5q+U6L6D5aSn77yM5Zuw6Zq+5Lmf5q+U6L6D5aSa44CCCuS7luW8uuiwg++8jOWwhuiwg+WKqOS4gOWIh+WKm+mHj++8jOaDs+WwveS4gOWIh+WKnuazle+8jOehruS/neS4pOW5tOWGheWKm+S6ieaPkOWJjeWfuuacrOWPlua2iOWFqOWbvemrmOmAn+WFrOi3r+ecgeeVjOaUtui0ueermeOAguWQjOaXtu+8jOaSpOmUgOaUtui0ueermeW3peS9nOeahOi/m+WxleS5n+S8muWPiuaXtuWQkeWkp+WutuWFrOWRiuOAguaXqeaXpeiuqeW5v+Wkp+S6uuawkee+pOS8l+S6q+WPl+WIsOaUuemdqeeahOe6ouWIqeOAggrotKPnvJbvvJrliJjoibPlkJs=

香港TVB拟与内地合拍综艺节目 头炮或是"港姐"选美--传媒--人民网
http://media.people.com.cn/n1/2019/0330/c40606-31004041.html
6aaZ5rivVFZC5ouf5LiO5YaF5Zyw5ZCI5ouN57u86Im66IqC55uuIOWktOeCruaIluaYryYjMzQ75riv5aeQJiMzNDvpgInnvo4K5o2u6aaZ5riv44CK5pif5bKb5pel5oql44CL5oql6YGT77yM6aaZ5rivVFZC6KGM5pS/5oC76KOB5p2O5a6d5a6J6L+R5pel6YCP6Zyy77yM5ouf5LiO5YaF5Zyw5ZCI5L2c5ouN5pGE57u86Im66IqC55uu77yM5aS054Ku5oiW5piv6ICB5pys6KGM55qE6YCJ576O6IqC55uu44CK6aaZ5riv5bCP5aeQ44CL562J77yM5YWs5Y+45Lmf6ICD6JmR5Zyo5YaF5Zyw6K6+56uL55S16KeG5Z+O44CCCjIwMTjlubTvvIxUVkLmlLblhaXlkIzmr5Tlop7plb8zOCXvvIzovr7liLAyNC405Lq/5riv5YWD77yM5aKe6ZW/5Yqo5Yqb5p2l6Ieq6IGU5ZCI5Yi25L2c55qE6L+e57ut5Ymn5Y+K572R5LiK6KeG6aKR77yM5YaF5Zyw5pS25YWl5Zug5q2k5aKe6ZW/MjYl44CC5p2O5a6d5a6J6K+077yM6L+R5bm05q+P6ZuG5ZCI5ouN5Ymn55qE5Y+r5Lu36LaK5p2l6LaK6auY77yM6aKE5pyf5LuK5bm05o6o5Ye6M+Wll+WQiOaLjeS9nOWTge+8jOacquadpeS8muWKoOW8uuWcqOWGheWcsOeahOWPkeWxleOAggrmnY7lrp3lronpgI/pnLLvvIzku4rlubTmi5/kuI7lhoXlnLDnvZHnu5zlubPlj7DlkIjkvZzmi43mkYTnu7zoibroioLnm67vvIznm67liY3miZPnrpfliLbkvZzku6XlvoDovoPmiJDlip/nmoTkvZzlk4HjgILkvovlpoLjgIrpppnmuK/lsI/lp5DjgIvjgIHjgIrlm73pmYXkuK3ljY7lsI/lp5DjgIvvvIzlh63mpI3lhaXlvI/lub/lkYrluKbliqjnlLXllYbkuJrliqHvvIzkuZ/kuI3mjpLpmaTlho3mt7vpgInnvo7oioLnm67vvIzkvYbnm67liY3mnKrmnInlrprmoYjjgIIK5p2O5a6d5a6J6K+077yM5Lul5b6A6aaZ5riv55qE55uu5qCH6KeC5LyX6L6D5bCR77yM5pel5ZCO6Z2i5a+55YaF5Zyw6KeC5LyX77yM5Y+v5aSn5aSn5aKe5Yqg6aKE566X44CC5a+55LqO5YaF5Zyw5Y+R5bGV55qE6ZW/6L+c5aSn6K6h77yM5LuW6K+077yMVFZC6K6h5YiS5Zyo57Kk5riv5r6z5aSn5rm+5Yy65YW05bu65Y6C5oi/77yM6Zmk5LqG5L2c5ouN5pGE5Zy65Zyw5aSW77yM5Lmf6ICD6JmR55So5p2l5oub6IGY6Im65ZGY5L2c5Li66K6t57uD5Zy65omA562J77yM5YW26YGT5YW35Y+K5Zy65pmv6YOo5YiG5Lia5Yqh5oiW5Y+v5oiQ56uL5pyJ6KeE5qih55qE5YWs5Y+444CC77yI6ZKfIOaso++8iQoo6LSj57yW77ya5a6L5b+D6JWK44CB6LW15YWJ6ZyeKQ==

func (*Document) Content added in v0.1.3

func (doc *Document) Content() string

func (*Document) HasTitle added in v0.3.0

func (doc *Document) HasTitle() bool

HasTitle returns true if the document date is not the zero time.Time value.

func (*Document) Text added in v0.1.3

func (doc *Document) Text(includeContent, includeNonContent bool) string

type Filter added in v0.2.0

type Filter interface {
	// Name returns the name of the filter.
	Name() string

	// Process processes the document and notifies if it has been changed.
	Process(doc *Document) (hasChanged bool)
}

Filter is the interface that processes documents and notifies if it has changed.

func BlockProximityFusionMaxDistanceOne added in v0.2.0

func BlockProximityFusionMaxDistanceOne() Filter

func BlockProximityFusionMaxDistanceOneContentOnly added in v0.2.0

func BlockProximityFusionMaxDistanceOneContentOnly() Filter

func BlockProximityFusionMaxDistanceOneContentOnlySameTagLevel added in v0.2.0

func BlockProximityFusionMaxDistanceOneContentOnlySameTagLevel() Filter

func BlockProximityFusionMaxDistanceOneSameTagLevel added in v0.2.0

func BlockProximityFusionMaxDistanceOneSameTagLevel() Filter

func BoilerplateBlock added in v0.2.0

func BoilerplateBlock() Filter

func DocumentTitleMatchClassifier added in v0.2.0

func DocumentTitleMatchClassifier() Filter

func ExpandTitleToContent added in v0.2.0

func ExpandTitleToContent() Filter

func IgnoreBlocksAfterContent added in v0.2.0

func IgnoreBlocksAfterContent() Filter

func KeepLargestBlocks added in v0.2.0

func KeepLargestBlocks() Filter

func KeepLargestFulltextBlock added in v0.2.0

func KeepLargestFulltextBlock() Filter

func LargeBlockSameTagLevelToContent added in v0.2.0

func LargeBlockSameTagLevelToContent() Filter

func ListAtEnd added in v0.2.0

func ListAtEnd() Filter

func NumWordsRulesClassifier added in v0.2.0

func NumWordsRulesClassifier() Filter

func TerminatingBlocks added in v0.2.0

func TerminatingBlocks() Filter

func TrailingHeadlineToBoilerplate added in v0.2.0

func TrailingHeadlineToBoilerplate() Filter

type Label

type Label int
const (
	LabelIndicatesEndOfText Label = iota
	LabelMightBeContent
	LabelVeryLikelyContent
	LabelTitle
	LabelList
	LabelHeading
	LabelHeading1
	LabelHeading2
	LabelHeading3
)

func (Label) String added in v0.3.0

func (i Label) String() string

type LabelStack added in v0.3.0

type LabelStack struct {
	// contains filtered or unexported fields
}

func NewLabelStack added in v0.3.0

func NewLabelStack() *LabelStack

func (*LabelStack) Len added in v0.3.0

func (x *LabelStack) Len() int

func (*LabelStack) Pop added in v0.3.0

func (x *LabelStack) Pop() (label Label, ok bool)

func (*LabelStack) PopAll added in v0.3.0

func (x *LabelStack) PopAll() (labels []Label)

func (*LabelStack) Push added in v0.3.0

func (x *LabelStack) Push(labels ...Label)

type Pipeline added in v0.2.0

type Pipeline struct {
	PipelineName string
	Filters      []Filter
}

A Pipeline is a collection of filters that itself satisfies the Filter interface.

func (*Pipeline) Name added in v0.2.0

func (pipeline *Pipeline) Name() string

Name returns the pipeline name.

func (*Pipeline) Process added in v0.2.0

func (pipeline *Pipeline) Process(doc *Document) (hasChanged bool)

Process runs a document through the collection of filters in the pipeline.

type TextBlock

type TextBlock struct {
	Text string

	OffsetBlocksStart int
	OffsetBlocksEnd   int

	NumWords               int
	NumLinkedWords         int
	NumWordsInWrappedLines int
	NumWrappedLines        int

	TagLevel int

	IsContent bool
	// contains filtered or unexported fields
}

func NewTextBlock

func NewTextBlock() (tb *TextBlock)

func (*TextBlock) AddLabels

func (tb *TextBlock) AddLabels(labels ...Label) *TextBlock

func (*TextBlock) HasLabel

func (tb *TextBlock) HasLabel(label Label) bool

func (*TextBlock) Labels

func (tb *TextBlock) Labels() (labels []Label)

func (*TextBlock) LinkDensity

func (tb *TextBlock) LinkDensity() float64

func (*TextBlock) MergeNext

func (tb *TextBlock) MergeNext(next *TextBlock)

func (*TextBlock) TextDensity

func (tb *TextBlock) TextDensity() float64

Directories

Path Synopsis
cmd

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL