From afitzsim at redhat.com Wed Aug 19 15:23:28 2015 Content-Type: multipart/mixed; boundary="===============3545434074540003071==" MIME-Version: 1.0 From: Andrew Fitzsimon To: aeolus-devel at lists.fedorahosted.org Subject: Conductor UI - some ideas for a better conductor Date: Mon, 30 Jan 2012 15:51:07 +1000 Message-ID: <2B4CAECF-6B24-4F5D-8CD0-4B164EE44B01@redhat.com> --===============3545434074540003071== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi all, I've spent quite some time thinking about global UI improvements we can mak= e to conductor for a future release. Now it's time for me to share a small summary of those ideas and hopefully = get some feedback. I'll be updating http://ndftz.com/playground/ with much the stuff mentioned= below but as of right now it is not a representation of the functionality = described; so if you have seen it before, please disregard everything aside= from the responsiveness and the vector icons aspects. I'll now switch gea= rs to get the mock interface up to speed with all the client side features = described. (attached is a formatted copy in-case you don't like reading markdown) .. so here we go.. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D #Goals for a better UI > This is a plan to evolve the conductor UI into a lean, adaptive, beautifu= l and considered experience. ### Specifically, we hope to address: * Navigating and issuing tasks quickly = * Without unnecessary http-roundtrips just to check on a view. * Without having to learn new components in every view * Without having to refer to documentation to be assisted in core tasks. * Keeping the =E2=80=98big 6=E2=80=99 consistent: = * Consistent aesthetic * Consistent behaviour * Consistent notification = * Consistent messaging = * Consistent help * Consistent referencing * Address as many media types as we can get *for free* * __Mobile__ - 480px and up via minor accommodations in our UI * __Workstation__ 640px-1280px - our default view * __Section 508__ compliance including screen readers * __Printable__ - As a read-only inventory manifest of a users entire acc= ess. * Feel like a 2012 client app = * Cutting edge UI conventions * Swiss style visual metaphors & elements of typographic style * Baseline grid aligned typography consisting of 2 weights with single le= ading. * Use only vector graphics * Blazingly fast client side render times # Glossary of terms / explanation of features. ## Views One distinct category of content. ### explained =E2=80=9Cthe users view=E2=80=9D or =E2=80=9Cthe providers view=E2=80=9D. A views name can even be as specific as =E2=80=9CuserXX-provider-permission= s view=E2=80=9D or =E2=80=9Cadmin-provider-permissions-userXX view=E2=80= =9D For more information on how we implement views, see 'View anchors' below ****** ## Classes Think HTML/CSS/JS classes Classes track status or content type but not display. = online`
Ec2=E2=80=A6 ### Classing convention #### Reserved classes .active = is reserved for navigating views .enabling .disabling .verifying .deleting .requesting are action classes reserved for client side action confirmation .enabled .disabled .verified .complete .building are action classes reserved for server events .warning .note .info .tip .caution are reserved for assistive content .static-reference .assist-reference reserved for anchored clones of content via static and assistive referencin= g (see section) .progress .loading .building .compiling .altering are progress classed to be used in conjunction with a numerical class .50 .10 .20 .25 .75 .100 .30 etc=E2=80=A6 are percentage classes to be used in conjunction with a value e.g.: `75% of 300gb 225gb of 300gb ` ****** ## Graceful degradation Support for all core functionality in as many scenarios as possible * New browser features (subtle animation, gradients etc) * Older browsers lacking features = * Browsers with javascript turned off * Screen readers (section 508, we=E2=80=99re going there) ****** ## Responsive design Support for viewing from various media eg cellphones, touchscreen devices,= kiosks, tv=E2=80=99s, even print. ### Explained 1. We collapse tables into record views for narrow screens. 2. We Grow fonts and icons for tremendously high resolutions or touchable = large screens. 3. We use only vector graphics (css /webfonts) for adaptive scaling and th= emeing. Anchor referencing with js inlining means repeated content is printed only = once. a print version would read like an infrastructure status report from= the users perspective. ****** ## Visual Metaphors & Vector Graphics Visual metaphors are graphics symbolic of the function they perform. Vector graphics are a resolution independent implementation. ### Explained = All icons, visual indicators and ornamental graphics are implemented like = this: * Vector glyphs are encoded into a woff webfont = * The woff font is base64 encoded in the stylesheet to minimise http reque= sts (the current set of 30 icons is ~5k) so this is very acceptable. * We fallback to url linked images supplies for legacy browsers (no .WOFF = support) by using [modernizr](http://www.modernizr.com/) classes `.no-webfo= nts` and `.webfonts` to discriminate our implementation through css ****** ## View anchors - or 'single page app' View anchors are portions of our design implemented within the one DOM usin= g basic anchoring functionality. ### Explained In the proposed change, the entire conductor is one page for all default vi= ews, = 1. Link anchors will activate the specific view or sub-view. = 2. Anchors that do not resolve will initiate a "cannot find" message which = will most commonly occur when a user does not have access to an object and = has manually entered a custom # URL. the two exceptions to this will be ~/= # and ~/#top which will initiate the default app view. ### In action For example: = > The URL below should open the admin > providers > ec2eastcoast > connecti= vity view. https://conductor/#ec2eastcoast-connectivity ^ ^ ^ Server ObjectID ChildView #### What the html does e.g. the `
` representing admin > providers > ec2eastcoast would look l= ike =
.. ec2 east coast information goes here and the connectivity tab which exists inside the ec2eastcoast provider woul= d look like =
^ ^ objectID ChildViewname Why? Because the provider _ec2eastcoast_ lives natively within the _admin > prov= ider_ section, it does not need to be referenced in the ID.. it simply has = to be unique. But because the connectivity tab is only unique because of t= he provider it is associated with, it needs to be prefixed with the objectI= D = All direct links to the provider view would look like `EC2 East Coast which would activate the provider tab. #### what JS does 1. JS hides all non active views except for the default view (classed as ac= tive by the js) 2. = 3. when an ID is requested the object and all parent views get classed `.ac= tive` = 4. [hashchange for old browsers](http://benalman.com/projects/jquery-hashch= ange-plugin/) to preserve browsing history #### what the CSS does The body class `.nojs` is removed once Javascript is loaded so the CSS spec= ifies that only views be visible when they are classed as `.active` = = .js div{display:none} // Hiding all views .js div.active{display:block} // Showing active views .nojs div{display:block} // All views are shown when tabs don't wo= rk. ****** ## Referenced content > Referenced content is a live-copy of any existing part of the application= . It can be implemented with static references or assistive references = > See [this JS Fiddle demo](http://jsfiddle.net/andyfitz/hRqGa/191/) = #### example 1. Global help content can be referenced from many places at once so as to = avoid redundancy and annoying ajax requests.. if the section the help comes= from is loaded, so is the help. 2. Inspecting an object via a link can call the objects entire content into= view. ****** ### Static-references Where an anchor link to another section has been replaced with a live copy = of the section it links to. .static-reference > An example would be any monitoring view that requires various metrics alr= eady rendered elsewhere be included. ****** ### Assist-references like a static reference but with the link-text preserved and the section on= ly visible when the link-text has focus (has been clicked). .assist-reference > An example would be a permissions editor referencing the objects that a u= ser has permissions to by name and allowing the user to inspect that objec= t in-place with a single click, without having to visit the object in quest= ions default view. ****** ## Help & content Written content to help describe a feature or scenario. = Combined with admonition classes = .warning .note .info .tip .caution Often implemented via one of the following methods = * Included in the view relevant to its description * As static-references where the help content can be dismissed (via an X i= n the top right corner) * As assist-references where the help content can be revealed upon clickin= g a referring link Practically speaking this is text that can be placed inline with a view tha= t it represents or hidden in a non displayed useful content area to be stat= ic or assist-referenced by many places. ### Explained For example: _=E2=80=9Cdon=E2=80=99t be silly=E2=80=9C_ is a generic tip t= hat may apply to an enormous variety of contexts. This is useful to be pla= ced in the "generic tips" area and linked to via `now please rem= ember..` which means it wil be rendered inline of where it is reference= d. ****** ##Client-side status polling All objects relevant to a view are classed with the viewname On any action inside the view, a status classname is added to the view as w= ell as any objects that reference it regardless of where they are displayed= = link =
UserXX View
. We watch the referenced views classes and mimic them on all referencing lin= ks always as they can contain or be updated with new event styles (for exam= ple: failed, warning, upgraded, admin-only etc) ****** ## Server status events *investigating* Right now we can use ajax calls to update each view but in future it would = make sense to use eventSource for more advanced monitoring: [eventSource: s= erver sent events](http://html5doctor.com/server-sent-events/) = ****** ## Client verification / fast feedback Interactive assurance that an action has been requested without the verific= ation that the server has performed the action. For example a user clicks the enable button.. we immediately apply =E2=80= =9Cenabling=E2=80=9D status to the button but wait for the server to return= with the =E2=80=9Cenabled=E2=80=9D confirmation... ### How it works > **Assumption** intermittent states like verifying, enabling and disabling= states are safe for client side validation. > They confirm an action has been requested but not applied. As a rule, all elements are given the status of the objects they represent = as well as classed with the object ID.. e.g.: all buttons with `class=3D"p= roviderid12451-*"` get the additional class of their intermittent state ``"= enabling/disabling/verifying/whatever"`` When a functional object related = to them has been actioned. 1. On the client javascript side, we set the actioning classname to all el= ements with the same object objectid class. 2. Once the action has been done an ajax call confirm the change and refre= shes the class to "enabled/disabled/done/whatever" and removes the intermed= iary state ****** ## Important action certification [JS Fiddle demo](http://jsfiddle.net/andyfitz/mvdST/) Requiring the user to certify that they understand the action before allowi= ng it to take place. for example: = > =E2=80=9CDo you understand what you are doing?[yes] okay, here=E2=80=99s = the button [click]=E2=80=9D ###explained > Enabling and disabling providers, deleting users etc = We will use three methods to verify that a user has accepted the severity o= f the task they are about to perform: 1. CSS physical obfuscation. = Where the confirmation toggle sits physically on top of the action toggle s= o that an action can not be clicked without clicking the confirmation toggl= e first. this helps simplify the component to one physical space part of t= he same consideration set. 2. javascript validation. = The action button beneath is disabled until the confirmation toggle has bee= n clicked 3. final server verification. = the submitted action is not accepted by the system unless the post contains= both the verification enabled and the action. the server then pushes the u= pdate ****** ##Global status and system notification stack. = Important information about the entire system or a current process, display= ed prominently. ###explained Using the referenced content heavily, we throw system, warning and notifica= tion content to the top of the page in a collapsing, growl-style notificati= on system=E2=80=9D

System Messages

=

you should to install aeolus-al= l to properly use conductor

=

building provider123 50% Complete

****** ## Printable manifest Because our content is not replicated, and all enabled views are included i= n the DOM; = our app can actually print as if it were a manifest for the authenticated u= ser. We get this feature for free by proxy of our method for referencing views a= nd content. Having the ability to produce a hard copy infrastructure report may be a gi= mmick, but it's an easy way to show how conductor can help respond an IT au= dit situation. ### example print stylesheet changes @media print { a:after { content: " ("attr(href)") ";} div:before{ content: " ("attr(id)") ";}} } This will preserve all references and links throughout the UI. Also, we can manually define sections to be printed. @media print { div{display:none} #providers, #instances, #users, #global-tips {display:block !important} = } Which means only sections we desire to be included in the manifest get prin= ted also = @media print { .tabs:before{ page-break-before: always; content:"This section contains the following:"; .tabs li a:after{content:""} .tabs { font-size: 2em;page-break-after: always;} .tabs li{display:list} } Which will convert our tabs into whole page section summaries. > remember, this feature is free because we are designing conductor to grac= efully degrade. Very little effort goes into preserving this feature so lon= g as our standards are maintained. # Existing conductor paradigms These changes don't create any changes to terminology, or have much impact = for pre-existing views for components already built into conductor. It is = likely that the majority of what has already been done will be preserved an= d only undergo minor changes to the HAML/SASS so that features may be integ= rated into the global view. This has been written purely to start discussion on how we evolve Conductor= going forward and I'd love to hear your thoughts: [andy.fitzsimon(a)redhat= .com ](mailto:andy.fitzsimon(a)redhat.com) --===============3545434074540003071== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="ui-readme.html" PCFkb2N0eXBlIGh0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgY2hhcnNldD0idXRmLTgiPgo8c3R5 bGU+CmgxLApoMiwKaDMsCmg0LApoNSwKaDYsCnAsCmJsb2NrcXVvdGUgewogICAgbWFyZ2luOiAw OwogICAgcGFkZGluZzogMDsKfQpib2R5IHsKICAgIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5l dWUiLCBIZWx2ZXRpY2EsICJIaXJhZ2lubyBTYW5zIEdCIiwgQXJpYWwsIHNhbnMtc2VyaWY7CiAg ICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMThweDsKICAgIGNvbG9yOiAjNzM3 MzczOwogICAgbWFyZ2luOiAxMHB4IDEzcHggMTBweCAxM3B4Owp9CmEgewogICAgY29sb3I6ICMw MDY5ZDY7Cn0KYTpob3ZlciB7CiAgICBjb2xvcjogIzAwNTBhMzsKICAgIHRleHQtZGVjb3JhdGlv bjogbm9uZTsKfQphIGltZyB7CiAgICBib3JkZXI6IG5vbmU7Cn0KcCB7CiAgICBtYXJnaW4tYm90 dG9tOiA5cHg7Cn0KaDEsCmgyLApoMywKaDQsCmg1LApoNiB7CiAgICBjb2xvcjogIzQwNDA0MDsK ICAgIGxpbmUtaGVpZ2h0OiAzNnB4Owp9CmgxIHsKICAgIG1hcmdpbi1ib3R0b206IDE4cHg7CiAg ICBmb250LXNpemU6IDMwcHg7Cn0KaDIgewogICAgZm9udC1zaXplOiAyNHB4Owp9CmgzIHsKICAg IGZvbnQtc2l6ZTogMThweDsKfQpoNCB7CiAgICBmb250LXNpemU6IDE2cHg7Cn0KaDUgewogICAg Zm9udC1zaXplOiAxNHB4Owp9Cmg2IHsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQpociB7CiAgICBt YXJnaW46IDAgMCAxOXB4OwogICAgYm9yZGVyOiAwOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNv bGlkICNjY2M7Cn0KYmxvY2txdW90ZSB7CiAgICBwYWRkaW5nOiAxM3B4IDEzcHggMjFweCAxNXB4 OwogICAgbWFyZ2luLWJvdHRvbTogMThweDsKICAgIGZvbnQtZmFtaWx5Omdlb3JnaWEsc2VyaWY7 CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KYmxvY2txdW90ZTpiZWZvcmUgewogICAgY29udGVu dDoiXDIwMUMiOwogICAgZm9udC1zaXplOjQwcHg7CiAgICBtYXJnaW4tbGVmdDotMTBweDsKICAg IGZvbnQtZmFtaWx5Omdlb3JnaWEsc2VyaWY7CiAgICBjb2xvcjojZWVlOwp9CmJsb2NrcXVvdGUg cCB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LXdlaWdodDogMzAwOwogICAgbGluZS1o ZWlnaHQ6IDE4cHg7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgZm9udC1zdHlsZTogaXRhbGlj Owp9CmNvZGUsIHByZSB7CiAgICBmb250LWZhbWlseTogTW9uYWNvLCBBbmRhbGUgTW9ubywgQ291 cmllciBOZXcsIG1vbm9zcGFjZTsKfQpjb2RlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWU5 Y2M7CiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjc1KTsKICAgIHBhZGRpbmc6IDFweCAzcHg7 CiAgICBmb250LXNpemU6IDEycHg7CiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsKICAg IC1tb3otYm9yZGVyLXJhZGl1czogM3B4OwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CnByZSB7 CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHBhZGRpbmc6IDE0cHg7CiAgICBtYXJnaW46IDAgMCAx OHB4OwogICAgbGluZS1oZWlnaHQ6IDE2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBib3Jk ZXI6IDFweCBzb2xpZCAjZDlkOWQ5OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd29y ZC13cmFwOiBicmVhay13b3JkOwp9CnByZSBjb2RlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNm ZmY7CiAgICBjb2xvcjojNzM3MzczOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgcGFkZGluZzog MDsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogICAgYm9keSB7CiAg ICAgICAgd2lkdGg6IDc0OHB4OwogICAgICAgIG1hcmdpbjoxMHB4IGF1dG87CiAgICB9Cn0KPC9z dHlsZT4KPHRpdGxlPnVpLXJlYWRtZS5odG1sPC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KPGgxPkdv YWxzIGZvciBhIGJldHRlciBVSTwvaDE+Cgo8YmxvY2txdW90ZT48cD5UaGlzIGlzIGEgcGxhbiB0 byBldm9sdmUgdGhlIGNvbmR1Y3RvciBVSSBpbnRvIGEgbGVhbiwgYWRhcHRpdmUsIGJlYXV0aWZ1 bCBhbmQgY29uc2lkZXJlZCBleHBlcmllbmNlLjwvcD48L2Jsb2NrcXVvdGU+Cgo8aDM+U3BlY2lm aWNhbGx5LCB3ZSBob3BlIHRvIGFkZHJlc3M6PC9oMz4KCjx1bD4KPGxpPjxwPk5hdmlnYXRpbmcg YW5kIGlzc3VpbmcgdGFza3MgcXVpY2tseTwvcD4KCjx1bD4KPGxpPldpdGhvdXQgdW5uZWNlc3Nh cnkgaHR0cC1yb3VuZHRyaXBzIGp1c3QgdG8gY2hlY2sgb24gYSB2aWV3LjwvbGk+CjxsaT5XaXRo b3V0IGhhdmluZyB0byBsZWFybiBuZXcgY29tcG9uZW50cyBpbiBldmVyeSB2aWV3PC9saT4KPGxp PldpdGhvdXQgaGF2aW5nIHRvIHJlZmVyIHRvIGRvY3VtZW50YXRpb24gdG8gYmUgYXNzaXN0ZWQg aW4gY29yZSB0YXNrcy48L2xpPgo8L3VsPgo8L2xpPgo8bGk+PHA+S2VlcGluZyB0aGUg4oCYYmln IDbigJkgY29uc2lzdGVudDo8L3A+Cgo8dWw+CjxsaT5Db25zaXN0ZW50IGFlc3RoZXRpYzwvbGk+ CjxsaT5Db25zaXN0ZW50IGJlaGF2aW91cjwvbGk+CjxsaT5Db25zaXN0ZW50IG5vdGlmaWNhdGlv bjwvbGk+CjxsaT5Db25zaXN0ZW50IG1lc3NhZ2luZzwvbGk+CjxsaT5Db25zaXN0ZW50IGhlbHA8 L2xpPgo8bGk+Q29uc2lzdGVudCByZWZlcmVuY2luZzwvbGk+CjwvdWw+CjwvbGk+CjxsaT48cD5B ZGRyZXNzIGFzIG1hbnkgbWVkaWEgdHlwZXMgYXMgd2UgY2FuIGdldCA8ZW0+Zm9yIGZyZWU8L2Vt PjwvcD4KCjx1bD4KPGxpPjxzdHJvbmc+TW9iaWxlPC9zdHJvbmc+ICZuZGFzaDsgNDgwcHggYW5k IHVwIHZpYSBtaW5vciBhY2NvbW1vZGF0aW9ucyBpbiBvdXIgVUk8L2xpPgo8bGk+PHN0cm9uZz5X b3Jrc3RhdGlvbjwvc3Ryb25nPiA2NDBweC0xMjgwcHggJm5kYXNoOyBvdXIgZGVmYXVsdCB2aWV3 PC9saT4KPGxpPjxzdHJvbmc+U2VjdGlvbiA1MDg8L3N0cm9uZz4gY29tcGxpYW5jZSBpbmNsdWRp bmcgc2NyZWVuIHJlYWRlcnM8L2xpPgo8bGk+PHN0cm9uZz5QcmludGFibGU8L3N0cm9uZz4gJm5k YXNoOyBBcyBhIHJlYWQtb25seSBpbnZlbnRvcnkgbWFuaWZlc3Qgb2YgYSB1c2VycyBlbnRpcmUg YWNjZXNzLjwvbGk+CjwvdWw+CjwvbGk+CjxsaT48cD5GZWVsIGxpa2UgYSAyMDEyIGNsaWVudCBh cHA8L3A+Cgo8dWw+CjxsaT5DdXR0aW5nIGVkZ2UgVUkgY29udmVudGlvbnM8L2xpPgo8bGk+U3dp c3Mgc3R5bGUgdmlzdWFsIG1ldGFwaG9ycyAmYW1wOyBlbGVtZW50cyBvZiB0eXBvZ3JhcGhpYyBz dHlsZTwvbGk+CjxsaT5CYXNlbGluZSBncmlkIGFsaWduZWQgdHlwb2dyYXBoeSBjb25zaXN0aW5n IG9mIDIgd2VpZ2h0cyB3aXRoIHNpbmdsZSBsZWFkaW5nLjwvbGk+CjxsaT5Vc2Ugb25seSB2ZWN0 b3IgZ3JhcGhpY3M8L2xpPgo8bGk+QmxhemluZ2x5IGZhc3QgY2xpZW50IHNpZGUgcmVuZGVyIHRp bWVzPC9saT4KPC91bD4KPC9saT4KPC91bD4KCgo8aDE+R2xvc3Nhcnkgb2YgdGVybXMgLyBleHBs YW5hdGlvbiBvZiBmZWF0dXJlcy48L2gxPgoKPGgyPlZpZXdzPC9oMj4KCjxwPk9uZSBkaXN0aW5j dCBjYXRlZ29yeSBvZiBjb250ZW50LjwvcD4KCjxoMz5leHBsYWluZWQ8L2gzPgoKPHA+4oCcdGhl IHVzZXJzIHZpZXfigJ0gb3Ig4oCcdGhlIHByb3ZpZGVycyB2aWV34oCdLgpBIHZpZXdzIG5hbWUg Y2FuIGV2ZW4gYmUgYXMgc3BlY2lmaWMgYXMg4oCcdXNlclhYLXByb3ZpZGVyLXBlcm1pc3Npb25z IHZpZXfigJ0gIG9yIOKAnGFkbWluLXByb3ZpZGVyLXBlcm1pc3Npb25zLXVzZXJYWCB2aWV34oCd PC9wPgoKPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHdlIGltcGxlbWVudCB2aWV3cywg c2VlICZsc3F1bztWaWV3IGFuY2hvcnMmcnNxdW87IGJlbG93PC9wPgoKPGhyIC8+Cgo8aDI+Q2xh c3NlczwvaDI+Cgo8cD5UaGluayBIVE1ML0NTUy9KUyBjbGFzc2VzPC9wPgoKPHA+Q2xhc3NlcyB0 cmFjayBzdGF0dXMgb3IgY29udGVudCB0eXBlIGJ1dCBub3QgZGlzcGxheS48L3A+Cgo8cHJlPjxj b2RlPiZsdDthIGhyZWY9IiNwcm92aWRlcjIzIiBjbGFzcz0icHJvdmlkZXIyMyBlbmFibGluZyBl YzIiICZndDtvbmxpbmUmbHQ7L2EmZ3Q7YAombHQ7ZGl2IGlkPSJwcm92aWRlcjIzIiBjbGFzcz0i cHJvdmlkZXIyMyBlbmFibGluZyBlYzIiJmd0O0VjMuKApiZsdDsvZGl2Jmd0Owo8L2NvZGU+PC9w cmU+Cgo8aDM+Q2xhc3NpbmcgY29udmVudGlvbjwvaDM+Cgo8aDQ+UmVzZXJ2ZWQgY2xhc3Nlczwv aDQ+Cgo8cHJlPjxjb2RlPi5hY3RpdmUgCjwvY29kZT48L3ByZT4KCjxwPmlzIHJlc2VydmVkIGZv ciBuYXZpZ2F0aW5nIHZpZXdzPC9wPgoKPHByZT48Y29kZT4uZW5hYmxpbmcgLmRpc2FibGluZyAu dmVyaWZ5aW5nIC5kZWxldGluZyAucmVxdWVzdGluZwo8L2NvZGU+PC9wcmU+Cgo8cD5hcmUgYWN0 aW9uIGNsYXNzZXMgcmVzZXJ2ZWQgZm9yIGNsaWVudCBzaWRlIGFjdGlvbiBjb25maXJtYXRpb248 L3A+Cgo8cHJlPjxjb2RlPi5lbmFibGVkIC5kaXNhYmxlZCAudmVyaWZpZWQgLmNvbXBsZXRlIC5i dWlsZGluZwo8L2NvZGU+PC9wcmU+Cgo8cD5hcmUgYWN0aW9uIGNsYXNzZXMgcmVzZXJ2ZWQgZm9y IHNlcnZlciBldmVudHM8L3A+Cgo8cHJlPjxjb2RlPi53YXJuaW5nIC5ub3RlIC5pbmZvIC50aXAg LmNhdXRpb24KPC9jb2RlPjwvcHJlPgoKPHA+YXJlIHJlc2VydmVkIGZvciBhc3Npc3RpdmUgY29u dGVudDwvcD4KCjxwcmU+PGNvZGU+LnN0YXRpYy1yZWZlcmVuY2UgLmFzc2lzdC1yZWZlcmVuY2UK PC9jb2RlPjwvcHJlPgoKPHA+cmVzZXJ2ZWQgZm9yIGFuY2hvcmVkIGNsb25lcyBvZiBjb250ZW50 IHZpYSBzdGF0aWMgYW5kIGFzc2lzdGl2ZSByZWZlcmVuY2luZyAoc2VlIHNlY3Rpb24pPC9wPgoK PHByZT48Y29kZT4ucHJvZ3Jlc3MgLmxvYWRpbmcgLmJ1aWxkaW5nIC5jb21waWxpbmcgLmFsdGVy aW5nCjwvY29kZT48L3ByZT4KCjxwPmFyZSBwcm9ncmVzcyBjbGFzc2VkIHRvIGJlIHVzZWQgaW4g Y29uanVuY3Rpb24gd2l0aCBhIG51bWVyaWNhbCBjbGFzczwvcD4KCjxwcmU+PGNvZGU+LjUwIC4x MCAuMjAgLjI1IC43NSAuMTAwIC4zMCBldGPigKYKPC9jb2RlPjwvcHJlPgoKPHA+YXJlIHBlcmNl bnRhZ2UgY2xhc3NlcyB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSB2YWx1ZTwvcD4K CjxwPmUuZy46IDxjb2RlPiZsdDtzcGFuIGNsYXNzPSI3NSB1c2FnZSImZ3Q7NzUlIG9mIDMwMGdi ICZsdDsvLi4uPC9jb2RlPgpvciBiZXR0ZXI6IDxjb2RlPiZsdDtzcGFuIGNsYXNzPSI3NSB1c2Fn ZSImZ3Q7MjI1Z2Igb2YgMzAwZ2IgJmx0Oy8uLi48L2NvZGU+PC9wPgoKPHByZT48Y29kZT4udXNh Z2UgLnByb2dyZXNzIC5sb2FkIC5jYXBhY2l0eQo8L2NvZGU+PC9wcmU+Cgo8cD5hcmUgPHN0cm9u Zz5zdGF0dXM8L3N0cm9uZz4gY2xhc3NlcyByZXNlcnZlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIDxz dHJvbmc+dHlwZTwvc3Ryb25nPiBvZiBtZWFzdXJlbWVudDwvcD4KCjxwcmU+PGNvZGU+Lmluc3Rh bmNlIC5wcm92aWRlciAudXNlciAucG9vbCAuZ3JvdXAKPC9jb2RlPjwvcHJlPgoKPHA+YXJlIG9i amVjdCBjbGFzc2VzIHRvIGJlIHVzZWQgb24gYW55IG9iamVjdDwvcD4KCjxoMz5MYWNrIG9mIGNs YXNzZXMgZm9yIGxheW91dDwvaDM+Cgo8cD5XZSB3aWxsIDxzdHJvbmc+Tk9UPC9zdHJvbmc+IHVz ZSBjbGFzc2VzIGZvciBkZWZpbmluZyBncmlkIGxheW91dCBlLmcuIDxjb2RlPi5zcGFuLTEyPC9j b2RlPiBvciA8Y29kZT4ubGVmdC0xMjAvPC9jb2RlPjwvcD4KCjxwPkFsbCBsYXlvdXRzIHdpbGwg YmUgZGVmaW5lZCBpbiBDU1MgdmlhIGEgY29tYmluYXRpb24gb2YgdGhlaXIgcGFyZW50IHZpZXcg YW5kIHRoZSByZWxldmFudCBtZWRpYSBxdWVyeS48L3A+Cgo8cD5mb3IgZXhhbXBsZSB3ZSB3aWxs IHVzZSB0aGUgQ1NTPC9wPgoKPHByZT48Y29kZT4jYWRtaW4gI3Byb3ZpZGVycyAuYWNjb3VudCAu c3VtbWFyeXt3aWR0aDozMy4zMzMlfQo8L2NvZGU+PC9wcmU+Cgo8cD5yYXRoZXIgdGhhbiByZWx5 aW5nIG9uIGluamVjdGluZyBzdHlsZSBsb2dpYyBpbnRvIHRoZSBodG1sIGxpa2UgdGhpcyA8Y29k ZT4mbHQ7Y2xhc3M9InN1bW1hcnkgc3Bhbi00IiZndDs8L2NvZGU+PC9wPgoKPGhyIC8+Cgo8aDI+ R3JhY2VmdWwgZGVncmFkYXRpb248L2gyPgoKPHA+U3VwcG9ydCBmb3IgYWxsIGNvcmUgZnVuY3Rp b25hbGl0eSBpbiBhcyBtYW55IHNjZW5hcmlvcyBhcyBwb3NzaWJsZTwvcD4KCjx1bD4KPGxpPk5l dyBicm93c2VyIGZlYXR1cmVzIChzdWJ0bGUgYW5pbWF0aW9uLCBncmFkaWVudHMgZXRjKTwvbGk+ CjxsaT5PbGRlciBicm93c2VycyBsYWNraW5nIGZlYXR1cmVzPC9saT4KPGxpPkJyb3dzZXJzIHdp dGggamF2YXNjcmlwdCB0dXJuZWQgb2ZmPC9saT4KPGxpPlNjcmVlbiByZWFkZXJzIChzZWN0aW9u IDUwOCwgd2XigJlyZSBnb2luZyB0aGVyZSk8L2xpPgo8L3VsPgoKCjxociAvPgoKPGgyPlJlc3Bv bnNpdmUgZGVzaWduPC9oMj4KCjxwPlN1cHBvcnQgZm9yIHZpZXdpbmcgZnJvbSB2YXJpb3VzIG1l ZGlhIGVnICBjZWxscGhvbmVzLCB0b3VjaHNjcmVlbiBkZXZpY2VzLCBraW9za3MsIHR24oCZcywg ZXZlbiBwcmludC48L3A+Cgo8aDM+RXhwbGFpbmVkPC9oMz4KCjxvbD4KPGxpPldlIGNvbGxhcHNl IHRhYmxlcyBpbnRvIHJlY29yZCB2aWV3cyBmb3IgbmFycm93IHNjcmVlbnMuPC9saT4KPGxpPldl IEdyb3cgZm9udHMgYW5kIGljb25zIGZvciB0cmVtZW5kb3VzbHkgaGlnaCByZXNvbHV0aW9ucyBv ciB0b3VjaGFibGUgbGFyZ2Ugc2NyZWVucy48L2xpPgo8bGk+V2UgdXNlIG9ubHkgdmVjdG9yIGdy YXBoaWNzIChjc3MgL3dlYmZvbnRzKSBmb3IgYWRhcHRpdmUgc2NhbGluZyBhbmQgdGhlbWVpbmcu CkFuY2hvciByZWZlcmVuY2luZyB3aXRoIGpzIGlubGluaW5nIG1lYW5zIHJlcGVhdGVkIGNvbnRl bnQgaXMgcHJpbnRlZCBvbmx5IG9uY2UuICBhIHByaW50IHZlcnNpb24gd291bGQgcmVhZCBsaWtl IGFuIGluZnJhc3RydWN0dXJlIHN0YXR1cyByZXBvcnQgZnJvbSB0aGUgdXNlcnMgcGVyc3BlY3Rp dmUuPC9saT4KPC9vbD4KCgo8aHIgLz4KCjxoMj5WaXN1YWwgTWV0YXBob3JzICZhbXA7IFZlY3Rv ciBHcmFwaGljczwvaDI+Cgo8cD5WaXN1YWwgbWV0YXBob3JzIGFyZSBncmFwaGljcyBzeW1ib2xp YyBvZiB0aGUgZnVuY3Rpb24gdGhleSBwZXJmb3JtLgpWZWN0b3IgZ3JhcGhpY3MgYXJlIGEgcmVz b2x1dGlvbiBpbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbi48L3A+Cgo8aDM+RXhwbGFpbmVkPC9o Mz4KCjxwPkFsbCBpY29ucywgdmlzdWFsIGluZGljYXRvcnMgYW5kIG9ybmFtZW50YWwgZ3JhcGhp Y3MgIGFyZSBpbXBsZW1lbnRlZCBsaWtlIHRoaXM6PC9wPgoKPHVsPgo8bGk+VmVjdG9yIGdseXBo cyBhcmUgZW5jb2RlZCBpbnRvIGEgd29mZiB3ZWJmb250PC9saT4KPGxpPlRoZSB3b2ZmIGZvbnQg aXMgYmFzZTY0IGVuY29kZWQgaW4gdGhlIHN0eWxlc2hlZXQgdG8gbWluaW1pc2UgaHR0cCByZXF1 ZXN0cyAodGhlIGN1cnJlbnQgc2V0IG9mIDMwIGljb25zIGlzIH41aykgc28gdGhpcyBpcyB2ZXJ5 IGFjY2VwdGFibGUuPC9saT4KPGxpPldlIGZhbGxiYWNrIHRvIHVybCBsaW5rZWQgaW1hZ2VzIHN1 cHBsaWVzIGZvciBsZWdhY3kgYnJvd3NlcnMgKG5vIC5XT0ZGIHN1cHBvcnQpIGJ5IHVzaW5nIDxh IGhyZWY9Imh0dHA6Ly93d3cubW9kZXJuaXpyLmNvbS8iPm1vZGVybml6cjwvYT4gY2xhc3NlcyA8 Y29kZT4ubm8td2ViZm9udHM8L2NvZGU+IGFuZCA8Y29kZT4ud2ViZm9udHM8L2NvZGU+IHRvIGRp c2NyaW1pbmF0ZSBvdXIgaW1wbGVtZW50YXRpb24gdGhyb3VnaCBjc3M8L2xpPgo8L3VsPgoKCjxo ciAvPgoKPGgyPlZpZXcgYW5jaG9ycyAmbmRhc2g7IG9yICZsc3F1bztzaW5nbGUgcGFnZSBhcHAm cnNxdW87PC9oMj4KCjxwPlZpZXcgYW5jaG9ycyBhcmUgcG9ydGlvbnMgb2Ygb3VyIGRlc2lnbiBp bXBsZW1lbnRlZCB3aXRoaW4gdGhlIG9uZSBET00gdXNpbmcgYmFzaWMgYW5jaG9yaW5nIGZ1bmN0 aW9uYWxpdHkuPC9wPgoKPGgzPkV4cGxhaW5lZDwvaDM+Cgo8cD5JbiB0aGUgcHJvcG9zZWQgY2hh bmdlLCB0aGUgZW50aXJlIGNvbmR1Y3RvciBpcyBvbmUgcGFnZSBmb3IgYWxsIGRlZmF1bHQgdmll d3MsPC9wPgoKPG9sPgo8bGk+PHA+TGluayBhbmNob3JzIHdpbGwgYWN0aXZhdGUgdGhlIHNwZWNp ZmljIHZpZXcgb3Igc3ViLXZpZXcuPC9wPjwvbGk+CjxsaT48cD5BbmNob3JzIHRoYXQgZG8gbm90 IHJlc29sdmUgd2lsbCBpbml0aWF0ZSBhICZsZHF1bztjYW5ub3QgZmluZCZyZHF1bzsgbWVzc2Fn ZSB3aGljaCB3aWxsIG1vc3QgY29tbW9ubHkgb2NjdXIgd2hlbiBhIHVzZXIgZG9lcyBub3QgaGF2 ZSBhY2Nlc3MgdG8gYW4gb2JqZWN0IGFuZCBoYXMgbWFudWFsbHkgZW50ZXJlZCBhIGN1c3RvbSAj IFVSTC4gIHRoZSB0d28gZXhjZXB0aW9ucyB0byB0aGlzIHdpbGwgYmUgfi8jIGFuZCB+LyN0b3Ag d2hpY2ggd2lsbCBpbml0aWF0ZSB0aGUgZGVmYXVsdCBhcHAgdmlldy48L3A+PC9saT4KPC9vbD4K Cgo8aDM+SW4gYWN0aW9uPC9oMz4KCjxwPkZvciBleGFtcGxlOjwvcD4KCjxibG9ja3F1b3RlPjxw PlRoZSBVUkwgYmVsb3cgc2hvdWxkIG9wZW4gdGhlIGFkbWluID4gcHJvdmlkZXJzID4gZWMyZWFz dGNvYXN0ID4gY29ubmVjdGl2aXR5IHZpZXcuPC9wPjwvYmxvY2txdW90ZT4KCjxwcmU+PGNvZGU+ aHR0cHM6Ly9jb25kdWN0b3IvI2VjMmVhc3Rjb2FzdC1jb25uZWN0aXZpdHkKICAgICAgICAgICBe ICAgICAgICAgICAgXiAgICAgICAgICAgICAgXgogICAgICAgIFNlcnZlciAgICAgT2JqZWN0SUQg ICAgICAgQ2hpbGRWaWV3CjwvY29kZT48L3ByZT4KCjxoND5XaGF0IHRoZSBodG1sIGRvZXM8L2g0 PgoKPHA+ZS5nLiB0aGUgPGNvZGU+Jmx0O2RpdiZndDs8L2NvZGU+IHJlcHJlc2VudGluZyBhZG1p biA+IHByb3ZpZGVycyA+IGVjMmVhc3Rjb2FzdCB3b3VsZCBsb29rIGxpa2U8L3A+Cgo8cHJlPjxj b2RlPiZsdDtkaXYgaWQ9ImVjMmVhc3Rjb2FzdCImZ3Q7Li4gZWMyIGVhc3QgY29hc3QgaW5mb3Jt YXRpb24gZ29lcyBoZXJlCjwvY29kZT48L3ByZT4KCjxwPmFuZCB0aGUgY29ubmVjdGl2aXR5IHRh YiB3aGljaCBleGlzdHMgaW5zaWRlIHRoZSBlYzJlYXN0Y29hc3QgcHJvdmlkZXIgd291bGQgbG9v ayBsaWtlPC9wPgoKPHByZT48Y29kZT4mbHQ7ZGl2IGlkPSJlYzJlYXN0Y29hc3QtY29ubmVjdGl2 aXR5IiZndDsKICAgICAgICAgICAgIF4gICAgICAgICAgICAgXgogICAgICAgICBvYmplY3RJRCAg ICAgICBDaGlsZFZpZXduYW1lCjwvY29kZT48L3ByZT4KCjxwPldoeT8KQmVjYXVzZSB0aGUgcHJv dmlkZXIgPGVtPmVjMmVhc3Rjb2FzdDwvZW0+IGxpdmVzIG5hdGl2ZWx5IHdpdGhpbiB0aGUgPGVt PmFkbWluID4gcHJvdmlkZXI8L2VtPiBzZWN0aW9uLCBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHJl ZmVyZW5jZWQgaW4gdGhlIElELi4gaXQgc2ltcGx5IGhhcyB0byBiZSB1bmlxdWUuICBCdXQgYmVj YXVzZSB0aGUgY29ubmVjdGl2aXR5IHRhYiBpcyBvbmx5IHVuaXF1ZSBiZWNhdXNlIG9mIHRoZSBw cm92aWRlciBpdCBpcyBhc3NvY2lhdGVkIHdpdGgsIGl0IG5lZWRzIHRvIGJlIHByZWZpeGVkIHdp dGggdGhlIG9iamVjdElEPC9wPgoKPHA+QWxsIGRpcmVjdCBsaW5rcyB0byB0aGUgcHJvdmlkZXIg dmlldyB3b3VsZCBsb29rIGxpa2UgYDxhIGhyZWY9I2VjMmVhc3Rjb2FzdD5FQzIgRWFzdCBDb2Fz dDwvYT4gd2hpY2ggd291bGQgYWN0aXZhdGUgdGhlIHByb3ZpZGVyIHRhYi48L3A+Cgo8aDQ+d2hh dCBKUyBkb2VzPC9oND4KCjxvbD4KPGxpPkpTIGhpZGVzIGFsbCBub24gYWN0aXZlIHZpZXdzIGV4 Y2VwdCBmb3IgdGhlIGRlZmF1bHQgdmlldyAoY2xhc3NlZCBhcyBhY3RpdmUgYnkgdGhlIGpzKTwv bGk+CjxsaT48L2xpPgo8bGk+d2hlbiBhbiBJRCBpcyByZXF1ZXN0ZWQgdGhlIG9iamVjdCBhbmQg YWxsIHBhcmVudCB2aWV3cyBnZXQgY2xhc3NlZCA8Y29kZT4uYWN0aXZlPC9jb2RlPjwvbGk+Cjxs aT48YSBocmVmPSJodHRwOi8vYmVuYWxtYW4uY29tL3Byb2plY3RzL2pxdWVyeS1oYXNoY2hhbmdl LXBsdWdpbi8iPmhhc2hjaGFuZ2UgZm9yIG9sZCBicm93c2VyczwvYT4gIHRvIHByZXNlcnZlIGJy b3dzaW5nIGhpc3Rvcnk8L2xpPgo8L29sPgoKCjxoND53aGF0IHRoZSBDU1MgZG9lczwvaDQ+Cgo8 cD5UaGUgYm9keSBjbGFzcyA8Y29kZT4ubm9qczwvY29kZT4gaXMgcmVtb3ZlZCBvbmNlIEphdmFz Y3JpcHQgaXMgbG9hZGVkIHNvIHRoZSBDU1Mgc3BlY2lmaWVzIHRoYXQgb25seSB2aWV3cyBiZSB2 aXNpYmxlIHdoZW4gdGhleSBhcmUgY2xhc3NlZCBhcyA8Y29kZT4uYWN0aXZlPC9jb2RlPjwvcD4K CjxwcmU+PGNvZGU+LmpzIGRpdntkaXNwbGF5Om5vbmV9ICAgICAgICAgLy8gSGlkaW5nIGFsbCB2 aWV3cwouanMgZGl2LmFjdGl2ZXtkaXNwbGF5OmJsb2NrfSAvLyBTaG93aW5nIGFjdGl2ZSB2aWV3 cwoubm9qcyBkaXZ7ZGlzcGxheTpibG9ja30gICAgICAvLyBBbGwgdmlld3MgYXJlIHNob3duIHdo ZW4gdGFicyBkb24ndCB3b3JrLgo8L2NvZGU+PC9wcmU+Cgo8aHIgLz4KCjxoMj5SZWZlcmVuY2Vk IGNvbnRlbnQ8L2gyPgoKPGJsb2NrcXVvdGU+PHA+UmVmZXJlbmNlZCBjb250ZW50IGlzIGEgbGl2 ZS1jb3B5IG9mIGFueSBleGlzdGluZyBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbi4gSXQgY2FuIGJl IGltcGxlbWVudGVkIHdpdGggc3RhdGljIHJlZmVyZW5jZXMgb3IgYXNzaXN0aXZlIHJlZmVyZW5j ZXM8L3A+Cgo8cD5TZWUgPGEgaHJlZj0iaHR0cDovL2pzZmlkZGxlLm5ldC9hbmR5Zml0ei9oUnFH YS8xOTEvIj50aGlzIEpTIEZpZGRsZSBkZW1vPC9hPjwvcD48L2Jsb2NrcXVvdGU+Cgo8aDQ+ZXhh bXBsZTwvaDQ+Cgo8b2w+CjxsaT5HbG9iYWwgaGVscCBjb250ZW50IGNhbiBiZSByZWZlcmVuY2Vk IGZyb20gbWFueSBwbGFjZXMgYXQgb25jZSBzbyBhcyB0byBhdm9pZCByZWR1bmRhbmN5IGFuZCBh bm5veWluZyBhamF4IHJlcXVlc3RzLi4gaWYgdGhlIHNlY3Rpb24gdGhlIGhlbHAgY29tZXMgZnJv bSBpcyBsb2FkZWQsIHNvIGlzIHRoZSBoZWxwLjwvbGk+CjxsaT5JbnNwZWN0aW5nIGFuIG9iamVj dCB2aWEgYSBsaW5rIGNhbiBjYWxsIHRoZSBvYmplY3RzIGVudGlyZSBjb250ZW50IGludG8gdmll dy48L2xpPgo8L29sPgoKCjxociAvPgoKPGgzPlN0YXRpYy1yZWZlcmVuY2VzPC9oMz4KCjxwPldo ZXJlIGFuIGFuY2hvciBsaW5rIHRvIGFub3RoZXIgc2VjdGlvbiBoYXMgYmVlbiByZXBsYWNlZCB3 aXRoIGEgbGl2ZSBjb3B5IG9mIHRoZSBzZWN0aW9uIGl0IGxpbmtzIHRvLjwvcD4KCjxwcmU+PGNv ZGU+LnN0YXRpYy1yZWZlcmVuY2UKPC9jb2RlPjwvcHJlPgoKPGJsb2NrcXVvdGU+PHA+QW4gZXhh bXBsZSB3b3VsZCBiZSBhbnkgbW9uaXRvcmluZyB2aWV3IHRoYXQgcmVxdWlyZXMgdmFyaW91cyBt ZXRyaWNzIGFscmVhZHkgcmVuZGVyZWQgZWxzZXdoZXJlIGJlIGluY2x1ZGVkLjwvcD48L2Jsb2Nr cXVvdGU+Cgo8aHIgLz4KCjxoMz5Bc3Npc3QtcmVmZXJlbmNlczwvaDM+Cgo8cD5saWtlIGEgc3Rh dGljIHJlZmVyZW5jZSBidXQgd2l0aCB0aGUgbGluay10ZXh0IHByZXNlcnZlZCBhbmQgdGhlIHNl Y3Rpb24gb25seSB2aXNpYmxlIHdoZW4gdGhlIGxpbmstdGV4dCBoYXMgZm9jdXMgKGhhcyBiZWVu IGNsaWNrZWQpLjwvcD4KCjxwcmU+PGNvZGU+LmFzc2lzdC1yZWZlcmVuY2UKPC9jb2RlPjwvcHJl PgoKPGJsb2NrcXVvdGU+PHA+QW4gZXhhbXBsZSB3b3VsZCBiZSBhIHBlcm1pc3Npb25zIGVkaXRv ciByZWZlcmVuY2luZyB0aGUgb2JqZWN0cyB0aGF0IGEgdXNlciBoYXMgcGVybWlzc2lvbnMgdG8g YnkgbmFtZSAgYW5kIGFsbG93aW5nIHRoZSB1c2VyIHRvIGluc3BlY3QgdGhhdCBvYmplY3QgaW4t cGxhY2Ugd2l0aCBhIHNpbmdsZSBjbGljaywgd2l0aG91dCBoYXZpbmcgdG8gdmlzaXQgdGhlIG9i amVjdCBpbiBxdWVzdGlvbnMgZGVmYXVsdCB2aWV3LjwvcD48L2Jsb2NrcXVvdGU+Cgo8aHIgLz4K CjxoMj5IZWxwICZhbXA7IGNvbnRlbnQ8L2gyPgoKPHA+V3JpdHRlbiBjb250ZW50IHRvIGhlbHAg ZGVzY3JpYmUgYSBmZWF0dXJlIG9yIHNjZW5hcmlvLgpDb21iaW5lZCB3aXRoIGFkbW9uaXRpb24g Y2xhc3NlczwvcD4KCjxwcmU+PGNvZGU+Lndhcm5pbmcgLm5vdGUgLmluZm8gLnRpcCAuY2F1dGlv bgo8L2NvZGU+PC9wcmU+Cgo8cD5PZnRlbiBpbXBsZW1lbnRlZCB2aWEgb25lIG9mIHRoZSBmb2xs b3dpbmcgbWV0aG9kczwvcD4KCjx1bD4KPGxpPkluY2x1ZGVkIGluIHRoZSB2aWV3IHJlbGV2YW50 IHRvIGl0cyBkZXNjcmlwdGlvbjwvbGk+CjxsaT5BcyBzdGF0aWMtcmVmZXJlbmNlcyB3aGVyZSB0 aGUgaGVscCBjb250ZW50IGNhbiBiZSBkaXNtaXNzZWQgKHZpYSBhbiBYIGluIHRoZSB0b3Agcmln aHQgY29ybmVyKTwvbGk+CjxsaT5BcyBhc3Npc3QtcmVmZXJlbmNlcyB3aGVyZSB0aGUgaGVscCBj b250ZW50IGNhbiBiZSByZXZlYWxlZCB1cG9uIGNsaWNraW5nIGEgcmVmZXJyaW5nIGxpbms8L2xp Pgo8L3VsPgoKCjxwPlByYWN0aWNhbGx5IHNwZWFraW5nIHRoaXMgaXMgdGV4dCB0aGF0IGNhbiBi ZSBwbGFjZWQgaW5saW5lIHdpdGggYSB2aWV3IHRoYXQgaXQgcmVwcmVzZW50cyBvciBoaWRkZW4g aW4gYSBub24gZGlzcGxheWVkIHVzZWZ1bCBjb250ZW50IGFyZWEgdG8gYmUgc3RhdGljIG9yIGFz c2lzdC1yZWZlcmVuY2VkIGJ5IG1hbnkgcGxhY2VzLjwvcD4KCjxoMz5FeHBsYWluZWQ8L2gzPgoK PHA+Rm9yIGV4YW1wbGU6ICA8ZW0+4oCcZG9u4oCZdCBiZSBzaWxseeKAnDwvZW0+IGlzIGEgZ2Vu ZXJpYyB0aXAgdGhhdCBtYXkgYXBwbHkgdG8gYW4gZW5vcm1vdXMgdmFyaWV0eSBvZiBjb250ZXh0 cy4gIFRoaXMgaXMgdXNlZnVsIHRvIGJlIHBsYWNlZCBpbiB0aGUgJmxkcXVvO2dlbmVyaWMgdGlw cyZyZHF1bzsgYXJlYSBhbmQgbGlua2VkIHRvIHZpYSA8Y29kZT4mbHQ7YSBocmVmPeKAnSNkb250 IGJlLXNpbGx54oCdIGNsYXNzPeKAnWFzc2lzdC1yZWZlcmVuY2XigJ0mZ3Q7bm93IHBsZWFzZSBy ZW1lbWJlci4uJmx0Oy9hJmd0OzwvY29kZT4gd2hpY2ggbWVhbnMgaXQgd2lsIGJlIHJlbmRlcmVk IGlubGluZSBvZiB3aGVyZSBpdCBpcyByZWZlcmVuY2VkLjwvcD4KCjxociAvPgoKPGgyPkNsaWVu dC1zaWRlIHN0YXR1cyBwb2xsaW5nPC9oMj4KCjxwPkFsbCBvYmplY3RzIHJlbGV2YW50IHRvIGEg dmlldyBhcmUgY2xhc3NlZCB3aXRoIHRoZSB2aWV3bmFtZQpPbiBhbnkgYWN0aW9uIGluc2lkZSB0 aGUgdmlldywgYSBzdGF0dXMgY2xhc3NuYW1lIGlzIGFkZGVkIHRvIHRoZSB2aWV3IGFzIHdlbGwg YXMgYW55IG9iamVjdHMgdGhhdCByZWZlcmVuY2UgaXQgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGV5 IGFyZSBkaXNwbGF5ZWQ8L3A+Cgo8cHJlPjxjb2RlPiZsdDthIGhyZWY9I3VzZXIgY2xhc3M94oCd dXNlclhYIGVuYWJsaW5n4oCdJmd0O2xpbmsmbHQ7L2EmZ3Q7IAombHQ7ZGl2IGlkPSPigJ11c2Vy WFjigJ0gY2xhc3M94oCddXNlclhYIGVuYWJsaW5n4oCdICZndDtVc2VyWFggVmlldyZsdDsvZGl2 Jmd0Oy4KPC9jb2RlPjwvcHJlPgoKPHA+V2Ugd2F0Y2ggdGhlIHJlZmVyZW5jZWQgdmlld3MgY2xh c3NlcyBhbmQgbWltaWMgdGhlbSBvbiBhbGwgcmVmZXJlbmNpbmcgbGlua3MgYWx3YXlzIGFzIHRo ZXkgY2FuIGNvbnRhaW4gb3IgYmUgdXBkYXRlZCB3aXRoIG5ldyBldmVudCBzdHlsZXMgKGZvciBl eGFtcGxlOiBmYWlsZWQsIHdhcm5pbmcsIHVwZ3JhZGVkLCBhZG1pbi1vbmx5IGV0Yyk8L3A+Cgo8 aHIgLz4KCjxoMj5TZXJ2ZXIgc3RhdHVzIGV2ZW50cyA8ZW0+aW52ZXN0aWdhdGluZzwvZW0+PC9o Mj4KCjxwPlJpZ2h0IG5vdyB3ZSBjYW4gdXNlIGFqYXggY2FsbHMgdG8gdXBkYXRlIGVhY2ggdmll dyBidXQgaW4gZnV0dXJlIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8gdXNlIGV2ZW50U291cmNlIGZv ciBtb3JlIGFkdmFuY2VkIG1vbml0b3Jpbmc6IDxhIGhyZWY9Imh0dHA6Ly9odG1sNWRvY3Rvci5j b20vc2VydmVyLXNlbnQtZXZlbnRzLyI+ZXZlbnRTb3VyY2U6IHNlcnZlciBzZW50IGV2ZW50czwv YT48L3A+Cgo8aHIgLz4KCjxoMj5DbGllbnQgdmVyaWZpY2F0aW9uIC8gZmFzdCBmZWVkYmFjazwv aDI+Cgo8cD5JbnRlcmFjdGl2ZSBhc3N1cmFuY2UgdGhhdCBhbiBhY3Rpb24gaGFzIGJlZW4gcmVx dWVzdGVkIHdpdGhvdXQgdGhlIHZlcmlmaWNhdGlvbiB0aGF0IHRoZSBzZXJ2ZXIgaGFzIHBlcmZv cm1lZCB0aGUgYWN0aW9uLjwvcD4KCjxwPkZvciBleGFtcGxlIGEgdXNlciBjbGlja3MgdGhlIGVu YWJsZSBidXR0b24uLiB3ZSBpbW1lZGlhdGVseSBhcHBseSDigJxlbmFibGluZ+KAnSBzdGF0dXMg dG8gdGhlIGJ1dHRvbiBidXQgd2FpdCBmb3IgdGhlIHNlcnZlciB0byByZXR1cm4gd2l0aCB0aGUg 4oCcZW5hYmxlZOKAnSBjb25maXJtYXRpb24maGVsbGlwOzwvcD4KCjxoMz5Ib3cgaXQgd29ya3M8 L2gzPgoKPGJsb2NrcXVvdGU+PHA+PHN0cm9uZz5Bc3N1bXB0aW9uPC9zdHJvbmc+IGludGVybWl0 dGVudCBzdGF0ZXMgbGlrZSB2ZXJpZnlpbmcsIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgc3RhdGVz IGFyZSBzYWZlIGZvciBjbGllbnQgc2lkZSB2YWxpZGF0aW9uLjwvcD4KCjxwPlRoZXkgY29uZmly bSBhbiBhY3Rpb24gaGFzIGJlZW4gcmVxdWVzdGVkIGJ1dCBub3QgYXBwbGllZC48L3A+PC9ibG9j a3F1b3RlPgoKPHA+QXMgYSBydWxlLCBhbGwgZWxlbWVudHMgYXJlIGdpdmVuIHRoZSBzdGF0dXMg b2YgdGhlIG9iamVjdHMgdGhleSByZXByZXNlbnQgYXMgd2VsbCBhcyBjbGFzc2VkIHdpdGggdGhl IG9iamVjdCBJRC4uICBlLmcuOiBhbGwgYnV0dG9ucyB3aXRoIDxjb2RlPmNsYXNzPSJwcm92aWRl cmlkMTI0NTEtKiI8L2NvZGU+IGdldCB0aGUgYWRkaXRpb25hbCBjbGFzcyBvZiB0aGVpciBpbnRl cm1pdHRlbnQgc3RhdGUgPGNvZGU+ImVuYWJsaW5nL2Rpc2FibGluZy92ZXJpZnlpbmcvd2hhdGV2 ZXIiPC9jb2RlPiAgV2hlbiBhIGZ1bmN0aW9uYWwgb2JqZWN0IHJlbGF0ZWQgdG8gdGhlbSBoYXMg YmVlbiBhY3Rpb25lZC48L3A+Cgo8b2w+CjxsaT48cD5PbiB0aGUgY2xpZW50IGphdmFzY3JpcHQg c2lkZSwgd2Ugc2V0IHRoZSBhY3Rpb25pbmcgY2xhc3NuYW1lIHRvIGFsbCBlbGVtZW50cyB3aXRo IHRoZSBzYW1lIG9iamVjdCBvYmplY3RpZCBjbGFzcy48L3A+PC9saT4KPGxpPjxwPk9uY2UgdGhl IGFjdGlvbiBoYXMgYmVlbiBkb25lIGFuIGFqYXggY2FsbCBjb25maXJtIHRoZSBjaGFuZ2UgYW5k IHJlZnJlc2hlcyB0aGUgY2xhc3MgdG8gJmxkcXVvO2VuYWJsZWQvZGlzYWJsZWQvZG9uZS93aGF0 ZXZlciZyZHF1bzsgYW5kIHJlbW92ZXMgdGhlIGludGVybWVkaWFyeSBzdGF0ZTwvcD48L2xpPgo8 L29sPgoKCjxociAvPgoKPGgyPkltcG9ydGFudCBhY3Rpb24gY2VydGlmaWNhdGlvbjwvaDI+Cgo8 cD48YSBocmVmPSJodHRwOi8vanNmaWRkbGUubmV0L2FuZHlmaXR6L212ZFNULyI+SlMgRmlkZGxl IGRlbW88L2E+PC9wPgoKPHA+UmVxdWlyaW5nIHRoZSB1c2VyIHRvIGNlcnRpZnkgdGhhdCB0aGV5 IHVuZGVyc3RhbmQgdGhlIGFjdGlvbiBiZWZvcmUgYWxsb3dpbmcgaXQgdG8gdGFrZSBwbGFjZS4K Zm9yIGV4YW1wbGU6PC9wPgoKPGJsb2NrcXVvdGU+PHA+4oCcRG8geW91IHVuZGVyc3RhbmQgd2hh dCB5b3UgYXJlIGRvaW5nP1t5ZXNdIG9rYXksIGhlcmXigJlzIHRoZSBidXR0b24gW2NsaWNrXeKA nTwvcD48L2Jsb2NrcXVvdGU+Cgo8aDM+ZXhwbGFpbmVkPC9oMz4KCjxibG9ja3F1b3RlPjxwPkVu YWJsaW5nIGFuZCBkaXNhYmxpbmcgcHJvdmlkZXJzLCAgZGVsZXRpbmcgdXNlcnMgZXRjPC9wPjwv YmxvY2txdW90ZT4KCjxwPldlIHdpbGwgdXNlIHRocmVlIG1ldGhvZHMgdG8gdmVyaWZ5IHRoYXQg YSB1c2VyIGhhcyBhY2NlcHRlZCB0aGUgc2V2ZXJpdHkgb2YgdGhlIHRhc2sgdGhleSBhcmUgYWJv dXQgdG8gcGVyZm9ybTo8L3A+Cgo8b2w+CjxsaT48cD5DU1MgcGh5c2ljYWwgb2JmdXNjYXRpb24u CldoZXJlIHRoZSBjb25maXJtYXRpb24gdG9nZ2xlIHNpdHMgcGh5c2ljYWxseSBvbiB0b3Agb2Yg dGhlIGFjdGlvbiB0b2dnbGUgc28gdGhhdCBhbiBhY3Rpb24gY2FuIG5vdCBiZSBjbGlja2VkIHdp dGhvdXQgY2xpY2tpbmcgdGhlIGNvbmZpcm1hdGlvbiB0b2dnbGUgZmlyc3QuICB0aGlzIGhlbHBz IHNpbXBsaWZ5IHRoZSBjb21wb25lbnQgdG8gb25lIHBoeXNpY2FsIHNwYWNlIHBhcnQgb2YgdGhl IHNhbWUgY29uc2lkZXJhdGlvbiBzZXQuPC9wPjwvbGk+CjxsaT48cD5qYXZhc2NyaXB0IHZhbGlk YXRpb24uPGJyLz4KVGhlIGFjdGlvbiBidXR0b24gYmVuZWF0aCBpcyBkaXNhYmxlZCB1bnRpbCB0 aGUgY29uZmlybWF0aW9uIHRvZ2dsZSBoYXMgYmVlbiBjbGlja2VkPC9wPjwvbGk+CjxsaT5maW5h bCBzZXJ2ZXIgdmVyaWZpY2F0aW9uLjxici8+CnRoZSBzdWJtaXR0ZWQgYWN0aW9uIGlzIG5vdCBh Y2NlcHRlZCBieSB0aGUgc3lzdGVtIHVubGVzcyB0aGUgcG9zdCBjb250YWlucyBib3RoIHRoZSB2 ZXJpZmljYXRpb24gZW5hYmxlZCBhbmQgdGhlIGFjdGlvbi4gdGhlIHNlcnZlciB0aGVuIHB1c2hl cyB0aGUgdXBkYXRlPC9saT4KPC9vbD4KCgo8aHIgLz4KCjxoMj5HbG9iYWwgc3RhdHVzIGFuZCBz eXN0ZW0gbm90aWZpY2F0aW9uIHN0YWNrLjwvaDI+Cgo8cD5JbXBvcnRhbnQgaW5mb3JtYXRpb24g YWJvdXQgdGhlIGVudGlyZSBzeXN0ZW0gb3IgYSBjdXJyZW50IHByb2Nlc3MsIGRpc3BsYXllZCBw cm9taW5lbnRseS48L3A+Cgo8aDM+ZXhwbGFpbmVkPC9oMz4KCjxwPlVzaW5nIHRoZSByZWZlcmVu Y2VkIGNvbnRlbnQgaGVhdmlseSwgd2UgdGhyb3cgc3lzdGVtLCB3YXJuaW5nIGFuZCBub3RpZmlj YXRpb24gY29udGVudCB0byB0aGUgdG9wIG9mIHRoZSBwYWdlIGluIGEgY29sbGFwc2luZywgZ3Jv d2wtc3R5bGUgbm90aWZpY2F0aW9uIHN5c3RlbeKAnTwvcD4KCjxwcmU+PGNvZGU+Jmx0O2RpdiBp ZD0ibm90aWZpY2F0aW9ucyImZ3Q7CiAgICAmbHQ7aDEmZ3Q7U3lzdGVtIE1lc3NhZ2VzJmx0Oy9o MSZndDsKCiAgICAmbHQ7cCBjbGFzcz3igJ1zeXN0ZW3igJ0mZ3Q7eW91IHNob3VsZCB0byBpbnN0 YWxsIGFlb2x1cy1hbGwgdG8gcHJvcGVybHkgdXNlIGNvbmR1Y3RvciZsdDsvcCZndDsKCiAgICAm bHQ7cCBjbGFzcz3igJ1zdGF0dXMgcHJvdmlkZXIxMjMgYnVpbGTigJ0mZ3Q7CiAgICAgICZsdDth IAogICAgICAgICBocmVmPeKAnXByb3ZpZGVyMTIzLWJ1aWxkLXN0YXR1c+KAnSAKICAgICAgICAg Y2xhc3M94oCdcmVmbGluayA1MOKAnSZndDsKICAgICAgICBidWlsZGluZyBwcm92aWRlcjEyMyAm bHQ7c3BhbiZndDs1MCUgQ29tcGxldGUmbHQ7L3NwYW4mZ3Q7CiAgICAgICZsdDsvYSZndDsKICAg ICZsdDsvcCZndDsKCiZsdDsvZGl2Jmd0Owo8L2NvZGU+PC9wcmU+Cgo8aHIgLz4KCjxoMj5Qcmlu dGFibGUgbWFuaWZlc3Q8L2gyPgoKPHA+QmVjYXVzZSBvdXIgY29udGVudCBpcyBub3QgcmVwbGlj YXRlZCwgYW5kIGFsbCBlbmFibGVkIHZpZXdzIGFyZSBpbmNsdWRlZCBpbiB0aGUgRE9NOwpvdXIg YXBwIGNhbiBhY3R1YWxseSBwcmludCBhcyBpZiBpdCB3ZXJlIGEgbWFuaWZlc3QgZm9yIHRoZSBh dXRoZW50aWNhdGVkIHVzZXIuPC9wPgoKPHA+V2UgZ2V0IHRoaXMgZmVhdHVyZSBmb3IgZnJlZSBi eSBwcm94eSBvZiBvdXIgbWV0aG9kIGZvciByZWZlcmVuY2luZyB2aWV3cyBhbmQgY29udGVudC48 L3A+Cgo8cD5IYXZpbmcgdGhlIGFiaWxpdHkgdG8gcHJvZHVjZSBhIGhhcmQgY29weSBpbmZyYXN0 cnVjdHVyZSByZXBvcnQgbWF5IGJlIGEgZ2ltbWljaywgYnV0IGl0JnJzcXVvO3MgYW4gZWFzeSB3 YXkgdG8gc2hvdyBob3cgY29uZHVjdG9yIGNhbiBoZWxwIHJlc3BvbmQgYW4gSVQgYXVkaXQgc2l0 dWF0aW9uLjwvcD4KCjxoMz5leGFtcGxlIHByaW50IHN0eWxlc2hlZXQgY2hhbmdlczwvaDM+Cgo8 cHJlPjxjb2RlPkBtZWRpYSBwcmludCB7CgphOmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIgKCJhdHRy KGhyZWYpIikgIjt9CgpkaXY6YmVmb3JlewogICAgY29udGVudDogIiAoImF0dHIoaWQpIikgIjt9 fQoKfQo8L2NvZGU+PC9wcmU+Cgo8cD5UaGlzIHdpbGwgcHJlc2VydmUgYWxsIHJlZmVyZW5jZXMg YW5kIGxpbmtzIHRocm91Z2hvdXQgdGhlIFVJLjwvcD4KCjxwPkFsc28sIHdlIGNhbiBtYW51YWxs eSBkZWZpbmUgc2VjdGlvbnMgdG8gYmUgcHJpbnRlZC48L3A+Cgo8cHJlPjxjb2RlPkBtZWRpYSBw cmludCB7CgpkaXZ7ZGlzcGxheTpub25lfQoKI3Byb3ZpZGVycywgI2luc3RhbmNlcywgI3VzZXJz LCAjZ2xvYmFsLXRpcHMge2Rpc3BsYXk6YmxvY2sgIWltcG9ydGFudH0KPC9jb2RlPjwvcHJlPgoK PHA+ICAgfTwvcD4KCjxwPldoaWNoIG1lYW5zIG9ubHkgc2VjdGlvbnMgd2UgZGVzaXJlIHRvIGJl IGluY2x1ZGVkIGluIHRoZSBtYW5pZmVzdCBnZXQgcHJpbnRlZDwvcD4KCjxwPmFsc288L3A+Cgo8 cHJlPjxjb2RlPkBtZWRpYSBwcmludCB7CgoudGFiczpiZWZvcmV7CiAgIHBhZ2UtYnJlYWstYmVm b3JlOiBhbHdheXM7CiAgIGNvbnRlbnQ6IlRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZm9sbG93 aW5nOiI7CiAudGFicyBsaSBhOmFmdGVye2NvbnRlbnQ6IiJ9CiAudGFicyB7IGZvbnQtc2l6ZTog MmVtO3BhZ2UtYnJlYWstYWZ0ZXI6IGFsd2F5czt9CiAudGFicyBsaXtkaXNwbGF5Omxpc3R9Cn0K PC9jb2RlPjwvcHJlPgoKPHA+V2hpY2ggd2lsbCBjb252ZXJ0IG91ciB0YWJzIGludG8gd2hvbGUg cGFnZSBzZWN0aW9uIHN1bW1hcmllcy48L3A+Cgo8YmxvY2txdW90ZT48cD5yZW1lbWJlciwgdGhp cyBmZWF0dXJlIGlzIGZyZWUgYmVjYXVzZSB3ZSBhcmUgZGVzaWduaW5nIGNvbmR1Y3RvciB0byBn cmFjZWZ1bGx5IGRlZ3JhZGUuIFZlcnkgbGl0dGxlIGVmZm9ydCBnb2VzIGludG8gcHJlc2Vydmlu ZyB0aGlzIGZlYXR1cmUgc28gbG9uZyBhcyBvdXIgc3RhbmRhcmRzIGFyZSBtYWludGFpbmVkLjwv cD48L2Jsb2NrcXVvdGU+Cgo8aDE+RXhpc3RpbmcgY29uZHVjdG9yIHBhcmFkaWdtczwvaDE+Cgo8 cD5UaGVzZSBjaGFuZ2VzIGRvbiZyc3F1bzt0IGNyZWF0ZSBhbnkgY2hhbmdlcyB0byB0ZXJtaW5v bG9neSwgb3IgaGF2ZSBtdWNoIGltcGFjdCBmb3IgcHJlLWV4aXN0aW5nIHZpZXdzIGZvciBjb21w b25lbnRzIGFscmVhZHkgYnVpbHQgaW50byBjb25kdWN0b3IuICBJdCBpcyBsaWtlbHkgdGhhdCB0 aGUgbWFqb3JpdHkgb2Ygd2hhdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgd2lsbCBiZSBwcmVzZXJ2 ZWQgYW5kIG9ubHkgdW5kZXJnbyBtaW5vciBjaGFuZ2VzIHRvIHRoZSBIQU1ML1NBU1Mgc28gdGhh dCBmZWF0dXJlcyBtYXkgYmUgaW50ZWdyYXRlZCBpbnRvIHRoZSBnbG9iYWwgdmlldy48L3A+Cgo8 cD5UaGlzIGhhcyBiZWVuIHdyaXR0ZW4gcHVyZWx5IHRvIHN0YXJ0IGRpc2N1c3Npb24gb24gaG93 IHdlIGV2b2x2ZSBDb25kdWN0b3IgZ29pbmcgZm9yd2FyZCBhbmQgSSZyc3F1bztkIGxvdmUgdG8g aGVhciB5b3VyIHRob3VnaHRzOiA8YSBocmVmPSJtYWlsdG86YW5keS5maXR6c2ltb25AcmVkaGF0 LmNvbSI+YW5keS5maXR6c2ltb25AcmVkaGF0LmNvbSA8L2E+PC9wPgo8L2JvZHk+CjwvaHRtbD4= --===============3545434074540003071==--