Full Code of integrativesoft/lara for AI

master 454d0d0583ca cached
272 files
781.3 KB
174.3k tokens
1838 symbols
1 requests
Download .txt
Showing preview only (852K chars total). Download the full file or copy to clipboard to get everything.
Repository: integrativesoft/lara
Branch: master
Commit: 454d0d0583ca
Files: 272
Total size: 781.3 KB

Directory structure:
gitextract_6r9zre1z/

├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
└── src/
    ├── Boilerplate/
    │   ├── Program.cs
    │   ├── Wiki/
    │   │   ├── ComponentPropertyExample.cs
    │   │   ├── ComposingComponent.cs
    │   │   ├── ConditionalRenderComponent.cs
    │   │   ├── DocumentContextExample.cs
    │   │   ├── HttpContextExample.cs
    │   │   ├── LoopComponent.cs
    │   │   ├── RedBoxExample.cs
    │   │   ├── SimpleComponent.cs
    │   │   ├── UserInputComponent.cs
    │   │   └── UserTextComponent.cs
    │   └── WikiExamples.csproj
    ├── LaraClient/
    │   ├── .eslintignore
    │   ├── .eslintrc
    │   ├── .prettierrc
    │   ├── LaraClient.njsproj
    │   ├── README.md
    │   ├── dist/
    │   │   └── lara-client.js.LICENSE.txt
    │   ├── package.json
    │   ├── src/
    │   │   ├── Autocomplete.ts
    │   │   ├── Blocker.ts
    │   │   ├── ContentInterfaces.ts
    │   │   ├── DeltaInterfaces.ts
    │   │   ├── Initializer.ts
    │   │   ├── InputCollector.ts
    │   │   ├── RegisteredEvents.ts
    │   │   ├── Sequencer.ts
    │   │   ├── SocketEvents.ts
    │   │   ├── Worker.ts
    │   │   ├── custom.d.ts
    │   │   └── index.ts
    │   └── tsconfig.json
    ├── LaraClient.sln
    ├── LaraDocumentation/
    │   ├── Content/
    │   │   └── Welcome.aml
    │   ├── ContentLayout.content
    │   └── LaraDocumentation.shfbproj
    ├── LaraUI/
    │   ├── .gitignore
    │   ├── Autocomplete/
    │   │   ├── AutocompleteElement.cs
    │   │   ├── AutocompleteEntry.cs
    │   │   ├── AutocompleteOptions.cs
    │   │   ├── AutocompletePayload.cs
    │   │   ├── AutocompleteRegistry.cs
    │   │   ├── AutocompleteResponse.cs
    │   │   ├── AutocompleteService.cs
    │   │   └── IAutocompleteProvider.cs
    │   ├── Components/
    │   │   ├── ComponentRegistry.cs
    │   │   ├── Fragment.cs
    │   │   ├── LaraWebComponent.cs
    │   │   ├── RenderIf.cs
    │   │   ├── Shadow.cs
    │   │   ├── Slot.cs
    │   │   ├── SlottedCalculator.cs
    │   │   ├── WebComponent.cs
    │   │   └── WebComponentOptions.cs
    │   ├── DOM/
    │   │   ├── Attributes.cs
    │   │   ├── BlockOptions.cs
    │   │   ├── ChildrenBindingSubscription.cs
    │   │   ├── Document.cs
    │   │   ├── DocumentIdMap.cs
    │   │   ├── DocumentWriter.cs
    │   │   ├── DomSurgeon.cs
    │   │   ├── DuplicateElementIdException.cs
    │   │   ├── Element.cs
    │   │   ├── ElementFactory.cs
    │   │   ├── EventSettings.cs
    │   │   ├── GlobalSerializer.cs
    │   │   ├── HtmlReference.cs
    │   │   ├── MessageRegistry.cs
    │   │   ├── Node.cs
    │   │   ├── NodeExtensions.cs
    │   │   └── TextNode.cs
    │   ├── Delta/
    │   │   ├── AttributeEditedDelta.cs
    │   │   ├── AttributeRemovedDelta.cs
    │   │   ├── BaseDelta.cs
    │   │   ├── ClearChildrenDelta.cs
    │   │   ├── ContentArrayNode.cs
    │   │   ├── ContentAttribute.cs
    │   │   ├── ContentElementNode.cs
    │   │   ├── ContentNode.cs
    │   │   ├── ContentPlaceholder.cs
    │   │   ├── ContentTextNode.cs
    │   │   ├── ElementValue.cs
    │   │   ├── EventResult.cs
    │   │   ├── FocusDelta.cs
    │   │   ├── NodeAddedDelta.cs
    │   │   ├── NodeInsertedDelta.cs
    │   │   ├── NodeLocator.cs
    │   │   ├── NodeRemovedDelta.cs
    │   │   ├── PlugOptions.cs
    │   │   ├── RemoveElementDelta.cs
    │   │   ├── RenderDelta.cs
    │   │   ├── ReplaceDelta.cs
    │   │   ├── ServerEventsDelta.cs
    │   │   ├── SetCheckedDelta.cs
    │   │   ├── SetIdDelta.cs
    │   │   ├── SetValueDelta.cs
    │   │   ├── SubmitJsDelta.cs
    │   │   ├── SubscribeDelta.cs
    │   │   ├── SwapChildrenDelta.cs
    │   │   ├── TextModifiedDelta.cs
    │   │   ├── UnRenderDelta.cs
    │   │   └── UnsubscribeDelta.cs
    │   ├── Elements/
    │   │   ├── GenericElement.cs
    │   │   ├── HtmlAnchorElement.cs
    │   │   ├── HtmlBodyElement.cs
    │   │   ├── HtmlButtonElement.cs
    │   │   ├── HtmlColGroupElement.cs
    │   │   ├── HtmlDivElement.cs
    │   │   ├── HtmlHeadElement.cs
    │   │   ├── HtmlHeadingElement.cs
    │   │   ├── HtmlImageElement.cs
    │   │   ├── HtmlInputElement.cs
    │   │   ├── HtmlLabelElement.cs
    │   │   ├── HtmlLiElement.cs
    │   │   ├── HtmlLinkElement.cs
    │   │   ├── HtmlMetaElement.cs
    │   │   ├── HtmlMeterElement.cs
    │   │   ├── HtmlOlElement.cs
    │   │   ├── HtmlOptionElement.cs
    │   │   ├── HtmlOptionGroupElement.cs
    │   │   ├── HtmlParagraphElement.cs
    │   │   ├── HtmlScriptElement.cs
    │   │   ├── HtmlSelectElement.cs
    │   │   ├── HtmlSpanElement.cs
    │   │   ├── HtmlTableCellElement.cs
    │   │   ├── HtmlTableElement.cs
    │   │   ├── HtmlTableHeaderElement.cs
    │   │   ├── HtmlTableRowElement.cs
    │   │   ├── HtmlTableSectionElement.cs
    │   │   ├── HtmlTextAreaElement.cs
    │   │   └── HtmlTitleElement.cs
    │   ├── GlobalSuppressions.cs
    │   ├── LaraUI.csproj
    │   ├── LaraUI.csproj.DotSettings
    │   ├── Main/
    │   │   ├── Application.cs
    │   │   ├── BaseContext.cs
    │   │   ├── BinaryServiceContent.cs
    │   │   ├── BinaryServicePublished.cs
    │   │   ├── Connection.cs
    │   │   ├── Connections.cs
    │   │   ├── GlobalConstants.cs
    │   │   ├── IBinaryService.cs
    │   │   ├── INavigation.cs
    │   │   ├── IPage.cs
    │   │   ├── IPageContext.cs
    │   │   ├── IPublishedItem.cs
    │   │   ├── IWebService.cs
    │   │   ├── IWebServiceContext.cs
    │   │   ├── JSBridge.cs
    │   │   ├── LaraBinaryServiceAttribute.cs
    │   │   ├── LaraPageAttribute.cs
    │   │   ├── LaraUI.cs
    │   │   ├── LaraWebServiceAttribute.cs
    │   │   ├── Navigation.cs
    │   │   ├── PageContext.cs
    │   │   ├── PagePublished.cs
    │   │   ├── Published.cs
    │   │   ├── Session.cs
    │   │   ├── SessionStorage.cs
    │   │   ├── SingleElementPage.cs
    │   │   ├── StaleConnectionsCollector.cs
    │   │   ├── StaticContent.cs
    │   │   ├── TemplateBuilder.cs
    │   │   ├── WebServiceContent.cs
    │   │   ├── WebServiceContext.cs
    │   │   └── WebServicePublished.cs
    │   ├── Middleware/
    │   │   ├── BaseHandler.cs
    │   │   ├── BrowserAppController.cs
    │   │   ├── ClientEventMessage.cs
    │   │   ├── ClientLibraryHandler.cs
    │   │   ├── ContentTypes.cs
    │   │   ├── DefaultErrorPage.cs
    │   │   ├── DiscardHandler.cs
    │   │   ├── DiscardParameters.cs
    │   │   ├── ErrorPages.cs
    │   │   ├── EventParameters.cs
    │   │   ├── FormFile.cs
    │   │   ├── FormFileCollection.cs
    │   │   ├── IModeController.cs
    │   │   ├── KeepAliveHandler.cs
    │   │   ├── LaraMiddleware.cs
    │   │   ├── LocalhostFilter.cs
    │   │   ├── MiddlewareCommon.cs
    │   │   ├── NotFoundMiddleware.cs
    │   │   ├── PostEventContext.cs
    │   │   ├── PostEventHandler.cs
    │   │   ├── PublishedItemHandler.cs
    │   │   ├── Sequencer.cs
    │   │   ├── ServerEvent.cs
    │   │   ├── ServerEventsController.cs
    │   │   ├── StatusCodeException.cs
    │   │   └── StatusForbiddenException.cs
    │   ├── NewVersionChecklist.txt
    │   ├── Reactive/
    │   │   ├── BindableBase.cs
    │   │   ├── BindingExtensions.cs
    │   │   ├── BindingOptions.cs
    │   │   ├── BindingSubscription.cs
    │   │   ├── CollectionUpdater.cs
    │   │   └── ObsoleteElement.cs
    │   ├── Resources.Designer.cs
    │   ├── Resources.resx
    │   ├── Tools/
    │   │   ├── ApplicationBuilderLaraExtensions.cs
    │   │   ├── AssembliesReader.cs
    │   │   ├── AsyncEvent.cs
    │   │   ├── ClassEditor.cs
    │   │   ├── DocumentLocal.cs
    │   │   ├── LaraBuilder.cs
    │   │   ├── LaraJson.cs
    │   │   ├── LaraOptions.cs
    │   │   ├── LaraTools.cs
    │   │   ├── NoCurrentSessionException.cs
    │   │   ├── SemaphoreSlimExtensions.cs
    │   │   ├── ServerLauncher.cs
    │   │   └── SessionLocal.cs
    │   ├── docfx.json
    │   └── pack.bat
    ├── LaraUI.sln
    ├── LaraUI.sln.licenseheader
    ├── SampleProject/
    │   ├── Common/
    │   │   ├── CountryList.cs
    │   │   ├── CountrySelector.cs
    │   │   ├── SampleAppBootstrap.cs
    │   │   └── Tools.cs
    │   ├── Components/
    │   │   ├── CheckboxSample.cs
    │   │   ├── CounterSample.cs
    │   │   ├── KitchenSinkComponent.cs
    │   │   ├── LockingSample.cs
    │   │   ├── LongRunningSample.cs
    │   │   ├── MultiselectSample.cs
    │   │   ├── SelectSample.cs
    │   │   ├── UploadSample.cs
    │   │   └── WeekdayCombo.cs
    │   ├── LaraSample.csproj
    │   ├── Main/
    │   │   └── Program.cs
    │   ├── Pages/
    │   │   ├── KitchenSinkPage.cs
    │   │   ├── ServerEventsPage.cs
    │   │   └── UploadFilePage.cs
    │   ├── Properties/
    │   │   └── launchSettings.json
    │   └── SampleProject.csproj
    └── Tests/
        ├── Components/
        │   ├── AutocompleteTesting.cs
        │   └── ComponentTesting.cs
        ├── DOM/
        │   ├── AttributesTesting.cs
        │   ├── BindingsTesting.cs
        │   ├── BuilderTesting.cs
        │   ├── ClassEditorTesting.cs
        │   ├── DomOperationsTesting.cs
        │   ├── ElementAttributes.cs
        │   ├── EventsTesting.cs
        │   ├── GlobalAttributesTesting.cs
        │   └── LaraBuilderTesting.cs
        ├── Delta/
        │   ├── AttributeEditTesting.cs
        │   ├── DeltaTesting.cs
        │   └── LocatorTesting.cs
        ├── Main/
        │   ├── ButtonCounterPage.cs
        │   ├── ConnectionTesting.cs
        │   ├── ConnectionsTesting.cs
        │   ├── MyPage.cs
        │   ├── PublishedTesting.cs
        │   ├── StaleTesting.cs
        │   └── StaticContentTesting.cs
        ├── Middleware/
        │   ├── DummyContext.cs
        │   ├── DummyContextTesting.cs
        │   ├── ErrorPagesTesting.cs
        │   ├── EventParametersTesting.cs
        │   ├── MiddlewareTesting.cs
        │   ├── ServerEventsTesting.cs
        │   ├── ToolsTesting.cs
        │   └── WebServicesTesting.cs
        └── Tests.csproj

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# The following command works for downloading when using Git for Windows:
# curl -LOf http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore
#
# Download this file using PowerShell v3 under Windows with the following comand:
# Invoke-WebRequest https://gist.githubusercontent.com/kmorcinek/2710267/raw/ -OutFile .gitignore
#
# or wget:
# wget --no-check-certificate http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore

# User-specific files
*.suo
*.user
*.sln.docstates

# Build results
[Dd]ebug/
[Rr]elease/
x64/
[Bb]in/
[Oo]bj/
# build folder is nowadays used for build scripts and should not be ignored
#build/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.scc

# OS generated files #
.DS_Store*
Icon?

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile

# Visual Studio profiler
*.psess
*.vsp
*.vspx

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# NCrunch
*.ncrunch*
.*crunch*.local.xml

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.Publish.xml

# Windows Azure Build Output
csx
*.build.csdef

# Windows Store app package directory
AppPackages/

# Others
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.[Pp]ublish.xml
*.pfx
*.publishsettings
modulesbin/
tempbin/

# EPiServer Site file (VPP)
AppData/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# vim
*.txt~
*.swp
*.swo

# Temp files when opening LibreOffice on ubuntu
.~lock.*
 
# svn
.svn

# CVS - Source Control
**/CVS/

# Remainings from resolving conflicts in Source Control
*.orig

# SQL Server files
**/App_Data/*.mdf
**/App_Data/*.ldf
**/App_Data/*.sdf


#LightSwitch generated files
GeneratedArtifacts/
_Pvt_Extensions/
ModelManifest.xml

# =========================
# Windows detritus
# =========================

# Windows image file caches
Thumbs.db
ehthumbs.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Mac desktop service store files
.DS_Store

# SASS Compiler cache
.sass-cache

# Visual Studio 2014 CTP
**/*.sln.ide

# Visual Studio temp something
.vs/

# dotnet stuff
project.lock.json

# VS 2015+
*.vc.vc.opendb
*.vc.db

# Rider
.idea/

# Visual Studio Code
.vscode/

# Output folder used by Webpack or other FE stuff
**/node_modules/*
**/wwwroot/*

# SpecFlow specific
*.feature.cs
*.feature.xlsx.*
*.Specs_*.html

#####
# End of core ignore list, below put you custom 'per project' settings (patterns or path)
#####
/src/LaraUI/LaraUI.js
/src/.axoCover/runs/run_2019-05-14_19-16-46/coverageReport.xml
/src/LaraDocumentation/Help
/src/LaraClient/build
*.map
*.js
/src/environment.txt
/src/Tests/results.xml
/codecov
/src/LaraClient/dist/assets/images
Integrative.Lara.xml


================================================
FILE: .travis.yml
================================================
language: csharp
solution: src/LaraUI.sln
mono: none
dotnet: 5.0.100
 
before_install:
 - sudo apt-get update
 - sudo apt-get install nuget dotnet-sdk-2.1=2.1.300-1
 - curl -s -o $HOME/.nvm/nvm.sh https://raw.githubusercontent.com/creationix/nvm/v0.31.0/nvm.sh
 - source $HOME/.nvm/nvm.sh
 - nvm install stable
 - npm -v
 - node -v
 - dotnet tool install coveralls.net --tool-path tools

install:
  - nuget restore src/LaraUI.sln

script:
 - cd src
 - echo "Debug" > environment.txt
 - cd LaraClient
 - npm install .
 - npm run-script build
 - cd ..
 - cd ..
 - dotnet build --configuration Debug src/LaraUI/LaraUI.csproj
 - dotnet build --configuration Debug --framework net5.0 src/Tests/Tests.csproj
 - dotnet test --configuration Debug --framework net5.0 src/Tests/Tests.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput=results.xml
 
after_script:
  - REPO_COMMIT_AUTHOR=$(git show -s --pretty=format:"%cn")
  - REPO_COMMIT_AUTHOR_EMAIL=$(git show -s --pretty=format:"%ce")
  - REPO_COMMIT_MESSAGE=$(git show -s --pretty=format:"%s")
  - echo $TRAVIS_COMMIT
  - echo $TRAVIS_BRANCH
  - echo $REPO_COMMIT_AUTHOR
  - echo $REPO_COMMIT_AUTHOR_EMAIL
  - echo $REPO_COMMIT_MESSAGE
  - echo $TRAVIS_JOB_ID
  - ./tools/csmacnz.Coveralls --opencover -i src/Tests/results.xml --repoToken $COVERALLS_TOKEN --commitId $TRAVIS_COMMIT --commitBranch $TRAVIS_BRANCH --commitAuthor "$REPO_COMMIT_AUTHOR" --commitEmail "$REPO_COMMIT_AUTHOR_EMAIL" --commitMessage "$REPO_COMMIT_MESSAGE" --jobId $TRAVIS_JOB_ID  --serviceName travis-ci  --useRelativePaths 


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2019-2020 Integrative Software LLC

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
## Lara Web Engine

[![License: Apache 2.0](https://img.shields.io/badge/License-Apache--2.0-blue)](https://github.com/integrativesoft/lara/blob/master/LICENSE) [![NuGet version](http://img.shields.io/nuget/v/Integrative.Lara.svg?nocache=1)](https://www.nuget.org/packages/Integrative.Lara/)  [![Download count](https://img.shields.io/nuget/dt/Integrative.Lara.svg)](https://www.nuget.org/packages/Integrative.Lara/)  [![Build Status](https://api.travis-ci.com/integrativesoft/lara.svg?branch=master)](https://travis-ci.org/integrativesoft/lara)  [![Coverage Status](https://coveralls.io/repos/github/integrativesoft/lara/badge.svg?branch=master&lala=3)](https://coveralls.io/github/integrativesoft/lara?branch=master)
==================


**Lara** is a server-side rendering framework for developing **web user interfaces** using C#.

>*"It is similar to server-side Blazor, but is much more lightweight and easier to install. For example, while any type of Blazor requires a whole SDK, Lara is just a NuGet package."* [ScientificProgrammer.net](https://scientificprogrammer.net/2019/08/18/pros-and-cons-of-blazor-for-web-development/?pagename=pros-and-cons-of-blazor)

## Sample application

```csharp
using Integrative.Lara;
using System;
using System.Threading.Tasks;

namespace SampleApp
{
    public static class Program
    {
        public static async Task Main()
        {
            // create and start application
            const int port = 8182;
            using var app = new Application();
            app.PublishPage("/", () => new MyCounterComponent { Value = 5 });
            await app.Start(new StartServerOptions { Port = port });

            // print address on console
            var address = $"http://localhost:{port}";
            Console.WriteLine($"Listening on {address}/");

            // helper function to launch browser (comment out as needed)
            LaraUI.LaunchBrowser(address);

            // wait for ASP.NET Core shutdown
            await app.WaitForShutdown();
        }
    }

    internal class MyCounterComponent : WebComponent
    {
        private int _value; // triggers PropertyChanged event
        public int Value { get => _value; set => SetProperty(ref _value, value); }

        public MyCounterComponent()
        {
            ShadowRoot.Children = new Node[]
            {
                new HtmlDivElement() // on PropertyChanged, assigns InnerText
                    .Bind(this, x => x.InnerText = Value.ToString()),
                new HtmlButtonElement
                    { InnerText = "Increase" }
                    .Event("click", () => Value++)
            };
        }
    }
}
```

## Adding Lara to an existing web server application

To add Lara to an existing ASP.NET Core server, add to the Startup class or equivalent:

```csharp
private readonly Application _laraApp = new Application();

public void Configure(IApplicationBuilder app)  
{  
    app.UseLara(_laraApp, new LaraOptions
    {
        // configuration options
    });
} 
```

## Creating Desktop applications

To create a desktop container for your web app, here's a few options:

- [electron.js](https://www.electronjs.org/) combined with [electron-cgi](https://github.com/ruidfigueiredo/electron-cgi#readme) library
- [Chromely](https://github.com/chromelyapps/Chromely)
- [neutralinojs](https://github.com/neutralinojs/neutralinojs)

## Getting started

There's no need to download this repository to use Lara, instead, there's a [NuGet package](https://www.nuget.org/packages/Integrative.Lara/).

**Check out the [wiki documentation](https://github.com/integrativesoft/lara/wiki)**

## How does Lara work?

Whenever the browser triggers a registered event (e.g. click on a button), it sends to the server a message saying that the button was clicked. The server executes the code associated with the event, manipulating the server's copy of the page, and replies a JSON message with the delta between server and client.

## How to contribute

**Please send feedback!** Issues, questions, suggestions, requests for features, and success stories. Please let me know by either opening an issue. Thank you!

**If you like Lara, please give it a star - it helps!**

## Credits

Thanks to [JetBrains](https://www.jetbrains.com/?from=LaraWebEngine) for the licenses of Rider and DotCover.

[![JetBrains](support/jetbrains.svg)](https://www.jetbrains.com/?from=LaraWebEngine)


================================================
FILE: src/Boilerplate/Program.cs
================================================
using Integrative.Lara;
using System;
using System.Threading.Tasks;

namespace SampleApp
{
    public static class Program
    {
        public static async Task Main()
        {
            // create and start application
            const int port = 8182;
            using var app = new Application();
            app.PublishPage("/", () => new HttpContextExample());
            await app.Start(new StartServerOptions { Port = port });

            // print address on console (set project's output type to WinExe to avoid console)
            var address = $"http://localhost:{port}";                   
            Console.WriteLine($"Listening on {address}/");

            // helper function to launch browser (comment out as needed)
            LaraUI.LaunchBrowser(address);

            // wait for ASP.NET Core shutdown
            await app.WaitForShutdown();
        }
    }

    internal class MyCounterComponent : WebComponent
    {
        private int _value; // triggers PropertyChanged event
        public int Value { get => _value; set => SetProperty(ref _value, value); }

        public MyCounterComponent()
        {
            ShadowRoot.Children = new Node[]
            {
                new HtmlDivElement() // on PropertyChanged, assigns InnerText
                    .Bind(this, x => x.InnerText = Value.ToString()),
                new HtmlButtonElement
                    { InnerText = "Increase" }
                    .Event("click", () => Value++)
            };
        }
    }
}


================================================
FILE: src/Boilerplate/Wiki/ComponentPropertyExample.cs
================================================
using Integrative.Lara;

internal class ComponentPropertyExample : WebComponent
{
    public ComponentPropertyExample()
    {
        var myLabel = new HtmlSpanElement
        {
            InnerText = "Hello!"
        };
        ShadowRoot.Children = new Element[]
        {
            new MyLabelComponent
            {
                Label = myLabel
            },
        };
    }
}

internal class MyLabelComponent : WebComponent
{
    private Element _label;
    public Element Label { get => _label; set => SetProperty(ref _label, value); }

    public MyLabelComponent()
    {
        ShadowRoot.Children = new Element[]
        {
            new RenderIf(this, () => _label != null, () => _label)
        };
    }
}


================================================
FILE: src/Boilerplate/Wiki/ComposingComponent.cs
================================================
using Integrative.Lara;

internal class ComposingComponent : WebComponent
{
    public ComposingComponent()  // parent component
    {
        ShadowRoot.Children = new Element[]
        {
            new ItemComponent { Name = "Sara" },
            new ItemComponent { Name = "Mike" },
            new ItemComponent { Name = "Tom" },
        };
    }
}

internal class ItemComponent : WebComponent  // child component
{
    private string _name;
    public string Name { get => _name; set => SetProperty(ref _name, value); }

    public ItemComponent()
    {
        ShadowRoot.Children = new Element[]
        {
            new HtmlDivElement
            {
                Children = new Element[]
                {
                    new HtmlTableCellElement()
                        .Bind(this, x => x.InnerText = Name),
                }
            }
        };
    }
}

================================================
FILE: src/Boilerplate/Wiki/ConditionalRenderComponent.cs
================================================
using Integrative.Lara;

internal class ConditionalRenderComponent : WebComponent
{
    private bool _showText;
    public bool ShowText { get => _showText; set => SetProperty(ref _showText, value); }

    public ConditionalRenderComponent()
    {
        ShadowRoot.Children = new Node[]
        {
            new HtmlDivElement
            {
                InnerText = "Hello!",
            }
            .Bind(this, x => x.Render = ShowText) // Render property here
        };
    }
}


================================================
FILE: src/Boilerplate/Wiki/DocumentContextExample.cs
================================================
using Integrative.Lara;

internal class DocumentContextExample : WebComponent
{
    const string IconId = "MyIconElement";

    public DocumentContextExample()
    {
        ShadowRoot.Children = new Element[]
        {
            new HtmlDivElement
            {
                InnerText = "Check the title and icon of this webpage"
            }
        };
    }

    protected override void OnConnect() // our component is placed on Document
    {
        base.OnConnect();
        var icon = Document.GetElementById(IconId);
        if (icon != null) return;
        Document.Head.AppendChild(new HtmlLinkElement
        {
            Id = IconId,
            Rel = "icon",
            HRef = "https://stackoverflow.com/favicon.ico",
        });
        Document.Head.AppendChild(new HtmlTitleElement
        {
            InnerText = "Hello title",
        });
    }
}


================================================
FILE: src/Boilerplate/Wiki/HttpContextExample.cs
================================================
using Integrative.Lara;

internal class HttpContextExample : WebComponent
{
    private string _message;
    public string Message { get => _message; set => SetProperty(ref _message, value); }

    public HttpContextExample()
    {
        ShadowRoot.Children = new Element[]
        {
            new HtmlDivElement()
                .Bind(this, x => x.InnerText = Message)            
        };
    }

    protected override void OnConnect()
    {
        base.OnConnect();
        Message = $"Your IP is {LaraUI.Context.Http.Connection.RemoteIpAddress}";
    }
}


================================================
FILE: src/Boilerplate/Wiki/LoopComponent.cs
================================================
using Integrative.Lara;
using System.Collections.ObjectModel;

internal class MyList : WebComponent
{
    private readonly ObservableCollection<string> _names = new ObservableCollection<string>();

    public MyList()
    {
        ShadowRoot.Children = new Node[]
        {
            Fragment.ForEach(_names, (string name) => new HtmlDivElement { InnerText = name }),
        };
        _names.Add("Sarah");
        _names.Add("John");
    }
}


================================================
FILE: src/Boilerplate/Wiki/RedBoxExample.cs
================================================
using Integrative.Lara;

internal class RedBoxExample : WebComponent
{
    public RedBoxExample()
    {
        ShadowRoot.Children = new Element[]
        {
            new RedBoxComponent
            {
                Children = new Element[]
                {
                    new HtmlDivElement
                    {
                        InnerText = "Hello!",
                    }
                }
            }
        };
    }
}

internal class RedBoxComponent : WebComponent
{
    public RedBoxComponent()
    {
        ShadowRoot.Children = new Element[]
        {
            new HtmlDivElement
            {
                Style = "border: solid 3px red",
                Children = new Element[]
                {
                    new Slot(),
                }
            }
        };
    }
}


================================================
FILE: src/Boilerplate/Wiki/SimpleComponent.cs
================================================
using Integrative.Lara;

internal class SimpleComponent : WebComponent
{
    private string _message;
    private string Message { get => _message; set => SetProperty(ref _message, value); }

    public SimpleComponent()
    {
        Message = "My Lara app";
        ShadowRoot.Children = new Node[]
        {
                new HtmlDivElement
                {
                    Children = new Node[]
                    {
                        new HtmlSpanElement()
                            .Bind(this, x => x.InnerText = Message)
                    }
                }
        };
    }
}

================================================
FILE: src/Boilerplate/Wiki/UserInputComponent.cs
================================================
using Integrative.Lara;

internal class UserInputComponent : WebComponent
{
    int _counter;
    public int Counter { get => _counter; set => SetProperty(ref _counter, value); }

    public UserInputComponent()
    {
        ShadowRoot.Children = new Element[]
        {
            new HtmlDivElement()
                .Bind(this, x => x.InnerText = Counter.ToString()),
            new HtmlButtonElement
                { InnerText = "Increase" }
                .Event("click", () => Counter++)
        };
    }
}


================================================
FILE: src/Boilerplate/Wiki/UserTextComponent.cs
================================================
using Integrative.Lara;

internal class UserTextComponent : WebComponent
{
    private string _name;
    public string Name { get => _name; set => SetProperty(ref _name, value); }

    public UserTextComponent()
    {
        Name = "Taylor";
        ShadowRoot.Children = new Element[]
        {
            new HtmlDivElement
                { InnerText = "Please enter your name: " },
            new HtmlInputElement()
                .Bind(this, x => x.Value = Name)  // if property changes, update element
                .BindBack(x => Name = x.Value),   // if element changes, update property
            new HtmlButtonElement
                { InnerText = "Read" }
                .Event("click", () => { }),
            new HtmlDivElement()
                .Bind(this, x => x.InnerText = $"Your name is {Name}"),
        };
    }
}


================================================
FILE: src/Boilerplate/WikiExamples.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <AssemblyName>WikiExamples</AssemblyName>
    <RootNamespace>SampleApp</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\LaraUI\LaraUI.csproj" />
  </ItemGroup>

</Project>


================================================
FILE: src/LaraClient/.eslintignore
================================================
node_modules
dist
.js


================================================
FILE: src/LaraClient/.eslintrc
================================================
{
    "root": true,
    "parser": "@typescript-eslint/parser",
    "plugins": [
      "@typescript-eslint",
      "prettier"
    ],
    "extends": [
      "eslint:recommended",
      "plugin:@typescript-eslint/eslint-recommended",
      "plugin:@typescript-eslint/recommended",
      "prettier"
    ],
    "rules": {
      "no-console": 1,
      "prettier/prettier": 2,
      "no-unused-vars": [2, {"args": "all", "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }]
    }
  }
  

================================================
FILE: src/LaraClient/.prettierrc
================================================
{
  "semi": false,
  "trailingComma": "none",
  "singleQuote": false,
  "printWidth": 80
}


================================================
FILE: src/LaraClient/LaraClient.njsproj
================================================
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
    <Name>LaraClient</Name>
    <RootNamespace>LaraClient</RootNamespace>
  </PropertyGroup>
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>6f0bee5a-5c72-4dcb-9173-bd17ba95a76f</ProjectGuid>
    <ProjectHome>.</ProjectHome>
    <StartupFile>
    </StartupFile>
    <StartWebBrowser>False</StartWebBrowser>
    <SearchPath>
    </SearchPath>
    <WorkingDirectory>.</WorkingDirectory>
    <OutputPath>.</OutputPath>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <ProjectTypeGuids>{3AF33F2E-1136-4D97-BBB7-1795711AC8B8};{9092AA53-FB77-4645-B42D-1CCCA6BD08BD}</ProjectTypeGuids>
    <EnableTypeScript>true</EnableTypeScript>
    <StartWebBrowser>false</StartWebBrowser>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>
  <ItemGroup>
    <Content Include="package.json" />
    <Content Include="README.md" />
    <Content Include="src\blockUI.js" />
    <Content Include="tsconfig.json" />
    <Content Include="webpack.config.js" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="src\" />
  </ItemGroup>
  <ItemGroup>
    <TypeScriptCompile Include="src\Autocomplete.ts">
      <SubType>Code</SubType>
    </TypeScriptCompile>
    <TypeScriptCompile Include="src\Blocker.ts" />
    <TypeScriptCompile Include="src\ContentInterfaces.ts" />
    <TypeScriptCompile Include="src\custom.d.ts" />
    <TypeScriptCompile Include="src\DeltaInterfaces.ts" />
    <TypeScriptCompile Include="src\Initializer.ts" />
    <TypeScriptCompile Include="src\InputCollector.ts" />
    <TypeScriptCompile Include="src\index.ts" />
    <TypeScriptCompile Include="src\RegisteredEvents.ts">
      <SubType>Code</SubType>
    </TypeScriptCompile>
    <TypeScriptCompile Include="src\Sequencer.ts">
      <SubType>Code</SubType>
    </TypeScriptCompile>
    <TypeScriptCompile Include="src\SocketEvents.ts">
      <SubType>Code</SubType>
    </TypeScriptCompile>
    <TypeScriptCompile Include="src\Worker.ts" />
  </ItemGroup>
  <Import Project="$(VSToolsPath)\Node.js Tools\Microsoft.NodejsToolsV2.targets" />
  <ProjectExtensions>
    <VisualStudio>
      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
        <WebProjectProperties>
          <UseIIS>False</UseIIS>
          <AutoAssignPort>True</AutoAssignPort>
          <DevelopmentServerPort>0</DevelopmentServerPort>
          <DevelopmentServerVPath>/</DevelopmentServerVPath>
          <IISUrl>http://localhost:48022/</IISUrl>
          <NTLMAuthentication>False</NTLMAuthentication>
          <UseCustomServer>True</UseCustomServer>
          <CustomServerUrl>http://localhost:1337</CustomServerUrl>
          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
        </WebProjectProperties>
      </FlavorProperties>
      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}" User="">
        <WebProjectProperties>
          <StartPageUrl>
          </StartPageUrl>
          <StartAction>CurrentPage</StartAction>
          <AspNetDebugging>True</AspNetDebugging>
          <SilverlightDebugging>False</SilverlightDebugging>
          <NativeDebugging>False</NativeDebugging>
          <SQLDebugging>False</SQLDebugging>
          <ExternalProgram>
          </ExternalProgram>
          <StartExternalURL>
          </StartExternalURL>
          <StartCmdLineArguments>
          </StartCmdLineArguments>
          <StartWorkingDirectory>
          </StartWorkingDirectory>
          <EnableENC>False</EnableENC>
          <AlwaysStartWebServerOnDebug>False</AlwaysStartWebServerOnDebug>
        </WebProjectProperties>
      </FlavorProperties>
    </VisualStudio>
  </ProjectExtensions>
</Project>

================================================
FILE: src/LaraClient/README.md
================================================
# LaraClient




================================================
FILE: src/LaraClient/dist/lara-client.js.LICENSE.txt
================================================
/*!
 * Lara Web Engine
 * Copyright (c) 2019-2020 Integrative Software LLC.
 * License: Apache-2.0
 */

/*!
 * Sizzle CSS Selector Engine v2.3.5
 * https://sizzlejs.com/
 *
 * Copyright JS Foundation and other contributors
 * Released under the MIT license
 * https://js.foundation/
 *
 * Date: 2020-03-14
 */

/*!
 * jQuery UI Autocomplete 1.12.1
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */

/*!
 * jQuery UI Keycode 1.12.1
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */

/*!
 * jQuery UI Menu 1.12.1
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */

/*!
 * jQuery UI Position 1.12.1
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 *
 * http://api.jqueryui.com/position/
 */

/*!
 * jQuery UI Unique ID 1.12.1
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */

/*!
 * jQuery UI Widget 1.12.1
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */


================================================
FILE: src/LaraClient/package.json
================================================
{
  "name": "lara-client",
  "version": "0.5.8",
  "description": "LaraClient",
  "module": "src/index.ts",
  "private": true,
  "author": {
    "name": "Integrative Software LLC"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --env debug=1",
    "release": "webpack --env release=1",
    "clean": "echo \"Webpack clean not needed\" && exit 0",
    "lint": "eslint . --ext .ts",
    "prettier-format": "prettier --config .prettierrc 'src/*.ts' --write"
  },
  "devDependencies": {
    "@types/node": "^16.11.8",
    "@typescript-eslint/eslint-plugin": "^5.4.0",
    "@typescript-eslint/parser": "^5.4.0",
    "clean-webpack-plugin": "^4.0.0",
    "eslint": "^8.2.0",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-prettier": "^4.0.0",
    "npm-check-updates": "^16.0.5",
    "prettier": "^2.4.1",
    "terser-webpack-plugin": "5.2.5",
    "ts-loader": "^9.2.6",
    "typescript": "^4.5.2",
    "webpack": "^5.76.0",
    "webpack-cli": "^4.9.1"
  },
  "dependencies": {
    "@types/debounce": "^1.2.1",
    "@types/jquery": "^3.5.8",
    "@types/jquery.blockui": "0.0.29",
    "@types/jqueryui": "^1.12.16",
    "debounce": "^1.2.1",
    "webpack-jquery-ui": "^2.0.1"
  }
}


================================================
FILE: src/LaraClient/src/Autocomplete.ts
================================================
/*
Copyright (c) 2019-2020 Integrative Software LLC
Created: 11/2019
Author: Pablo Carbonell
*/

require("webpack-jquery-ui/autocomplete")
require("webpack-jquery-ui/css")

import { getDocumentId } from "./index"

export interface AutocompleteCommand {
  ElementId: string
  AutoFocus: boolean
  MinLength: number
  Strict: boolean
}

interface AutocompleteEntry {
  html?: string
  label: string
  subtitle?: string
  code: string
}

interface SourceRequest {
  term: string
}

interface AutocompleteRequest {
  Key: string
  Term: string
}

type AutocompleteCallback = (_list: AutocompleteEntry[]) => void

interface SuccessData {
  Suggestions: AutocompleteEntry[]
}

export function autocompleteStart(json: string): void {
  const step = JSON.parse(json) as AutocompleteCommand
  const input = document.getElementById(step.ElementId) as HTMLInputElement
  $(input).autocomplete({
    autoFocus: step.AutoFocus,
    minLength: step.MinLength,
    source: function (
      request: SourceRequest,
      updater: AutocompleteCallback
    ): void {
      $.ajax({
        url: "/lara_autocomplete",
        dataType: "json",
        data: buildData(input, request.term),
        success: function (data: SuccessData) {
          updater(data.Suggestions)
        },
        method: "POST"
      })
    },
    select: function (_event, ui: JQueryUI.AutocompleteUIParams): void {
      const entry = ui.item as AutocompleteEntry
      setValue(input, entry.code, entry.label)
    },
    change: function (_event, ui: JQueryUI.AutocompleteUIParams): void {
      if (step.Strict && !ui.item) {
        setValue(input, "", "")
      }
    }
  })
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  const instance = $(input).autocomplete("instance") as any
  instance._renderItem = render
}

export function autocompleteStop(id: string): void {
  const input = document.getElementById(id)
  $(input).autocomplete("destroy")
}

function setValue(input: HTMLInputElement, value: string, text: string): void {
  if (!value) {
    input.removeAttribute("data-lara-value")
  } else {
    input.setAttribute("data-lara-value", value)
  }
  input.value = text
}

function render(ul: Element, entry: AutocompleteEntry): JQuery<HTMLElement> {
  let html: string
  if (entry.html) {
    html = entry.html
  } else {
    html = buildLabel(entry)
  }
  return $("<li>").append(html).appendTo(ul)
}

function buildLabel(entry: AutocompleteEntry): string {
  const div = $("<div>", { class: "autocompleteEntry" })
  const title = $("<span>", { class: "autocompleteTitle" })
  title.text(entry.label)
  div.append(title)
  if (entry.subtitle) {
    const subtitle = $('<span style="font-size:small;">', {
      class: "autocompleteSubtitle"
    })
    subtitle.text(entry.subtitle)
    div.append("<br>")
    div.append(subtitle)
  }
  return div.clone().wrap("<p>").parent().html()
}

function buildData(input: HTMLInputElement, term: string): string {
  return JSON.stringify(buildRequest(input, term))
}

function buildRequest(
  input: HTMLInputElement,
  term: string
): AutocompleteRequest {
  const documentId = getDocumentId()
  const key = input.id + " " + documentId
  return {
    Key: key,
    Term: term
  }
}


================================================
FILE: src/LaraClient/src/Blocker.ts
================================================
/*
Copyright (c) 2019-2020 Integrative Software LLC
Created: 6/2019
Author: Pablo Carbonell
*/

import { PlugOptions } from "./index"
import "./blockUI.js"

export function block(plug: PlugOptions): void {
  if (plug.Block) {
    const target = resolveTarget(plug)
    const params = buildParameters(plug)
    if (target) {
      $(target).block(params)
    } else {
      $.blockUI(params)
    }
  }
}

export function unblock(plug: PlugOptions): void {
  if (plug.Block) {
    const target = resolveTarget(plug)
    if (target) {
      $(target).unblock()
    } else {
      $.unblockUI()
    }
  }
}

function buildParameters(plug: PlugOptions): JQBlockUIOptions {
  const result: JQBlockUIOptions = {}
  const shownId = plug.BlockShownId
  if (shownId) {
    setElementCSS(result)
  } else {
    setDefaultCSS(result)
  }
  if (shownId) {
    result.message = $("#" + shownId)
  } else if (plug.BlockHTML) {
    result.message = plug.BlockHTML
  } else {
    result.message = null
  }
  result.baseZ = 2000
  return result
}

function resolveTarget(plug: PlugOptions): Element {
  if (plug.BlockElementId) {
    const el = document.getElementById(plug.BlockElementId)
    if (el) {
      return el
    }
  }
  return null
}

function setElementCSS(options: JQBlockUIOptions): void {
  options.css = {
    position: "absolute",
    top: "50%",
    left: "50%",
    transform: "translate(-50%, -50%)",
    padding: "unset",
    margin: "unset",
    border: "unset",
    width: "unset",
    "text-align": "unset",
    color: "unset",
    "background-color": "unset"
  }
}

function setDefaultCSS(options: JQBlockUIOptions): void {
  options.css = {
    border: "none",
    padding: "15px",
    backgroundColor: "#000",
    "-webkit-border-radius": "10px",
    "-moz-border-radius": "10px",
    "border-radius": "10px",
    opacity: ".5",
    color: "#fff",
    fontSize: "18px",
    fontFamily: "Verdana,Arial",
    fontWeight: 200
  }
}


================================================
FILE: src/LaraClient/src/ContentInterfaces.ts
================================================
/*
Copyright (c) 2019-2020 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

export enum ContentNodeType {
  // eslint-disable-next-line no-unused-vars
  Element = 1,
  // eslint-disable-next-line no-unused-vars
  Text = 2,
  // eslint-disable-next-line no-unused-vars
  Array = 3,
  // eslint-disable-next-line no-unused-vars
  Placeholder = 4
}

export interface ContentNode {
  Type: ContentNodeType
}

export interface ContentTextNode extends ContentNode {
  Data: string
}

export interface ContentAttribute {
  Attribute: string
  Value: string
}

export interface ContentElementNode extends ContentNode {
  TagName: string
  NS: string
  Attributes: ContentAttribute[]
  Children: ContentNode[]
}

export interface ContentArrayNode extends ContentNode {
  Nodes: ContentNode[]
}

export interface ContentPlaceholder extends ContentNode {
  ElementId: string
}


================================================
FILE: src/LaraClient/src/DeltaInterfaces.ts
================================================
/* eslint-disable no-unused-vars */
/*
Copyright (c) 2019-2020 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

import { ContentNode } from "./ContentInterfaces"
import { PlugOptions } from "./index"

export enum EventResultType {
  Success = 0,
  NoSession = 1,
  NoElement = 2,
  OutOfSequence = 3
}

export enum DeltaType {
  Append = 1,
  Insert = 2,
  TextModified = 3,
  Remove = 4,
  EditAttribute = 5,
  RemoveAttribute = 6,
  Focus = 7,
  SetId = 8,
  SetValue = 9,
  SubmitJS = 10,
  SetChecked = 11,
  ClearChildren = 12,
  Replace = 13,
  ServerEvents = 14,
  SwapChildren = 15,
  Subscribe = 16,
  Unsubscribe = 17,
  RemoveElementId = 18,
  Render = 19,
  UnRender = 20
}

export interface BaseDelta {
  Type: DeltaType
}

export interface EventResult {
  ResultType: EventResultType
  List: BaseDelta[]
}

export interface NodeAddedDelta extends BaseDelta {
  ParentId: string
  Node: ContentNode
}

export interface NodeInsertedDelta extends BaseDelta {
  ParentElementId: string
  Index: number
  ContentNode: ContentNode
}

export interface TextModifiedDelta extends BaseDelta {
  ParentElementId: string
  ChildNodeIndex: number
  Text: string
}

export interface NodeRemovedDelta extends BaseDelta {
  ParentId: string
  ChildIndex: number
}

export interface AttributeEditedDelta extends BaseDelta {
  ElementId: string
  Attribute: string
  Value: string
}

export interface AttributeRemovedDelta extends BaseDelta {
  ElementId: string
  Attribute: string
}

export interface NodeLocator {
  StartingId: string
  ChildIndex?: number
}

export interface FocusDelta extends BaseDelta {
  ElementId: string
}

export interface SetIdDelta extends BaseDelta {
  OldId: string
  NewId: string
}

export interface SetValueDelta extends BaseDelta {
  ElementId: string
  Value: string
}

export interface SubmitJsDelta extends BaseDelta {
  Code: string
  Payload?: string
}

export interface SetCheckedDelta extends BaseDelta {
  ElementId: string
  Checked: boolean
}

export interface ClearChildrenDelta extends BaseDelta {
  ElementId: string
}

export interface ReplaceDelta extends BaseDelta {
  Location: string
}

export interface SwapChildrenDelta extends BaseDelta {
  ParentId: string
  Index1: number
  Index2: number
}

export interface SubscribeDelta extends BaseDelta {
  ElementId: string
  Settings: PlugOptions
  DebounceInterval?: number
  EvalFilter?: string
}

export interface UnsubscribeDelta extends BaseDelta {
  ElementId: string
  EventName: string
}

export interface RemoveElement extends BaseDelta {
  ElementId: string
}

export interface RenderDelta extends BaseDelta {
  Locator: NodeLocator
  Node: ContentNode
}

export interface UnRenderDelta extends BaseDelta {
  Locator: NodeLocator
}


================================================
FILE: src/LaraClient/src/Initializer.ts
================================================
/*
Copyright (c) 2019-2020 Integrative Software LLC
Created: 6/2019
Author: Pablo Carbonell
*/

export function clean(node: Node): void {
  for (let n = 0; n < node.childNodes.length; n++) {
    const child = node.childNodes[n]
    if (
      child.nodeType === 8 ||
      (child.nodeType === 3 && !/\S/.test(child.nodeValue))
    ) {
      node.removeChild(child)
      n--
    } else if (child.nodeType === 1) {
      clean(child)
    }
  }
}


================================================
FILE: src/LaraClient/src/InputCollector.ts
================================================
/*
Copyright (c) 2019-2020 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

import { PlugOptions } from "./index"

export class ElementEventValue {
  ElementId: string
  Value: string
  Checked: boolean
}

export class ClientEventMessage {
  Values: ElementEventValue[]
  ExtraData: string
  isEmpty(): boolean {
    return this.Values.length == 0 && !this.ExtraData
  }
}

export function collectValues(plug: PlugOptions): FormData {
  const data = new FormData()
  const message = collectMessage(plug)
  const fileCount = collectFiles(plug, data)
  if (message.isEmpty() && fileCount == 0) {
    return undefined
  } else {
    data.append("_message", JSON.stringify(message))
    return data
  }
}

export function collectMessage(plug: PlugOptions): ClientEventMessage {
  const message = new ClientEventMessage()
  message.Values = []
  message.ExtraData = plug.ExtraData
  collectType("input", message, collectInput)
  collectType("textarea", message, collectSimpleValue)
  collectType("button", message, collectSimpleValue)
  collectType("select", message, collectSimpleValue)
  collectType("option", message, collectOption)
  return message
}

function collectType(
  tagName: string,
  message: ClientEventMessage,
  processor: (_el: Element, _m: ElementEventValue) => void
) {
  const list = document.getElementsByTagName(tagName)
  for (let index = 0; index < list.length; index++) {
    const el = list[index]
    if (el.id) {
      const entry = new ElementEventValue()
      entry.ElementId = el.id
      processor(el, entry)
      message.Values.push(entry)
    }
  }
}

function collectInput(el: Element, entry: ElementEventValue): void {
  const input = el as HTMLInputElement
  entry.Value = getValue(input)
  entry.Checked = input.checked
}

function collectSimpleValue(el: Element, entry: ElementEventValue): void {
  entry.Value = getValue(el)
}

function collectOption(el: Element, entry: ElementEventValue): void {
  const option = el as HTMLOptionElement
  entry.Checked = option.selected
}

function getValue(el: Element): string {
  if (el.hasAttribute("data-lara-value")) {
    return el.getAttribute("data-lara-value")
  } else if ("value" in el) {
    // @ts-ignore
    return el["value"]
  } else {
    return ""
  }
}

function collectFiles(plug: PlugOptions, data: FormData): number {
  if (!plug.UploadFiles) {
    return 0
  }
  let count = 0
  const list = document.getElementsByTagName("input")
  for (let index = 0; index < list.length; index++) {
    const input = list[index] as HTMLInputElement
    count += collectFilesInput(input, data)
  }
  return count
}

function collectFilesInput(input: HTMLInputElement, data: FormData): number {
  if (!input.id || input.type != "file") {
    return 0
  }
  const files = input.files
  const key = "file/" + input.id
  for (let index = 0; index < files.length; index++) {
    const file = files[index]
    data.append(key, file, file.name)
  }
  return files.length
}


================================================
FILE: src/LaraClient/src/RegisteredEvents.ts
================================================
/*
Copyright (c) 2019-2020 Integrative Software LLC
Created: 10/2019
Author: Pablo Carbonell
*/

import { SubscribeDelta, UnsubscribeDelta } from "./DeltaInterfaces"
import { plug, plugEvent, getTargetId } from "./index"
import { debounce } from "debounce"
const registered = new Map<string, EventListener>()

function addElementEvent(
  element: EventTarget,
  eventName: string,
  handler: EventListener
): void {
  const id = getTargetId(element)
  const key = getKey(id, eventName)
  registered.set(key, handler)
  element.addEventListener(eventName, handler)
}

function removeElementEvent(element: EventTarget, eventName: string): void {
  const id = getTargetId(element)
  const key = getKey(id, eventName)
  const handler = registered.get(key)
  registered.delete(key)
  element.removeEventListener(eventName, handler)
}

function getKey(id: string, eventName: string) {
  return id + " " + eventName
}

export function subscribe(step: SubscribeDelta): void {
  const element = getEventTarget(step.ElementId)
  let handler = buildHandler(element, step)
  if (step.EvalFilter) {
    handler = addEvalFilter(handler, step.EvalFilter)
  }
  addElementEvent(element, step.Settings.EventName, handler)
}

function getEventTarget(id: string): EventTarget {
  if (id) {
    return document.getElementById(id)
  } else {
    return document
  }
}

function buildHandler(
  element: EventTarget,
  step: SubscribeDelta
): EventListener {
  if (step.DebounceInterval) {
    return buildDebouncedHandler(element, step)
  } else {
    return buildRegularHandler(element, step)
  }
}

function buildDebouncedHandler(
  element: EventTarget,
  step: SubscribeDelta
): EventListener {
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  const handler = function (_ev: Event): void {
    plug(element, step.Settings)
  }
  return debounce(handler, step.DebounceInterval)
}

function buildRegularHandler(
  element: EventTarget,
  step: SubscribeDelta
): EventListener {
  return function (ev: Event): void {
    plugEvent(element, ev, step.Settings)
  }
}

function addEvalFilter(handler: EventListener, filter: string): EventListener {
  return function (event: Event): void {
    let run = false
    try {
      const result = eval(filter)
      if (result) {
        run = true
      }
      // eslint-disable-next-line no-empty
    } catch {}
    if (run) {
      handler(event)
    }
  }
}

export function unsubscribe(step: UnsubscribeDelta): void {
  const element = getEventTarget(step.ElementId)
  removeElementEvent(element, step.EventName)
}


================================================
FILE: src/LaraClient/src/Sequencer.ts
================================================
/*
Copyright (c) 2019-2020 Integrative Software LLC
Created: 10/2019
Author: Pablo Carbonell
*/

type resolver = (_value?: boolean | PromiseLike<boolean>) => void

export class Sequencer {
  private next: number
  private pending: Map<number, resolver>

  constructor() {
    this.next = 1
    this.pending = new Map<number, resolver>()
  }

  async waitForTurn(turn: number): Promise<boolean> {
    if (turn == 0) {
      return true
    } else if (turn == this.next) {
      this.next++
      this.flushPending()
      return true
    } else if (turn > this.next) {
      let resolver: resolver
      // eslint-disable-next-line @typescript-eslint/no-unused-vars
      const task = new Promise<boolean>((resolve, _reject) => {
        resolver = resolve
      })
      this.pending.set(turn, resolver)
      return task
    } else {
      return false
    }
  }

  private flushPending(): void {
    while (this.pending.has(this.next)) {
      const resolver = this.pending.get(this.next)
      this.pending.delete(this.next)
      resolver()
      this.next++
    }
  }
}


================================================
FILE: src/LaraClient/src/SocketEvents.ts
================================================
/*
Copyright (c) 2019-2020 Integrative Software LLC
Created: 12/2019
Author: Pablo Carbonell
*/

import { PlugOptions } from "./index"
import { ClientEventMessage } from "./InputCollector"

export class EventParameters {
  DocumentId: string
  ElementId: string
  EventName: string
  EventNumber: number
  Message: ClientEventMessage
}

export class SocketEventParameters extends EventParameters {
  SocketFiles: FormFileCollection
}

class FormFileCollection {
  InnerList: FormFile[]

  constructor() {
    this.InnerList = []
  }
}

class FormFile {
  ContentType: string
  ContentDisposition: string
  Name: string
  FileName: string
  Content: string
  Length: number
}

export async function loadFiles(
  plug: PlugOptions
): Promise<FormFileCollection> {
  const result = new FormFileCollection()
  if (!plug.UploadFiles) {
    return result
  }
  const list = document.getElementsByTagName("input")
  for (let index = 0; index < list.length; index++) {
    const input = list[index] as HTMLInputElement
    await collectFilesInput(input, result)
  }
  return result
}

async function collectFilesInput(
  input: HTMLInputElement,
  data: FormFileCollection
): Promise<void> {
  if (!input.id || input.type != "file") {
    return
  }
  const files = input.files
  const key = "file/" + input.id
  for (let index = 0; index < files.length; index++) {
    const file = files[index]
    const copy = await copyFile(file, key)
    copy.Name = key
    data.InnerList.push(copy)
  }
}

async function copyFile(file: File, name: string): Promise<FormFile> {
  const bytes = await readFile(file)
  const copy = new FormFile()
  copy.ContentType = file.type
  copy.Content = bufferToBase64(bytes)
  copy.Name = name
  copy.FileName = file.name
  copy.Length = bytes.byteLength
  return copy
}

function bufferToBase64(buffer: ArrayBuffer): string {
  let binary = ""
  const bytes = new Uint8Array(buffer)
  const len = bytes.byteLength
  for (let index = 0; index < len; index++) {
    binary += String.fromCharCode(bytes[index])
  }
  return window.btoa(binary)
}

async function readFile(file: File): Promise<ArrayBuffer> {
  const reader = new FileReader()
  reader.readAsArrayBuffer(file)
  return new Promise<ArrayBuffer>((resolve, reject) => {
    reader.onerror = () => {
      reject("Error reading input file.")
    }
    reader.onload = function () {
      resolve(reader.result as ArrayBuffer)
    }
  })
}


================================================
FILE: src/LaraClient/src/Worker.ts
================================================
/*
Copyright (c) 2019-2020 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

import {
  ContentArrayNode,
  ContentElementNode,
  ContentNode,
  ContentNodeType,
  ContentPlaceholder,
  ContentTextNode
} from "./ContentInterfaces"
import * as Delta from "./DeltaInterfaces"
import { listenServerEvents } from "./index"
import { subscribe, unsubscribe } from "./RegisteredEvents"

export function processResult(steps: Delta.BaseDelta[]): void {
  for (const step of steps) {
    if (!processStepCatch(step)) {
      return
    }
  }
}

function processStepCatch(step: Delta.BaseDelta): boolean {
  try {
    processStep(step)
    return true
  } catch (Error) {
    // eslint-disable-next-line no-console
    console.log("Error processing step:")
    // eslint-disable-next-line no-console
    console.log(Error)
    // eslint-disable-next-line no-console
    console.log(step)
    return false
  }
}

function processStep(step: Delta.BaseDelta): void {
  switch (step.Type) {
    case Delta.DeltaType.Append:
      append(step as Delta.NodeAddedDelta)
      break
    case Delta.DeltaType.Insert:
      insert(step as Delta.NodeInsertedDelta)
      break
    case Delta.DeltaType.TextModified:
      textModified(step as Delta.TextModifiedDelta)
      break
    case Delta.DeltaType.Remove:
      remove(step as Delta.NodeRemovedDelta)
      break
    case Delta.DeltaType.EditAttribute:
      editAttribute(step as Delta.AttributeEditedDelta)
      break
    case Delta.DeltaType.RemoveAttribute:
      removeAttribute(step as Delta.AttributeRemovedDelta)
      break
    case Delta.DeltaType.Focus:
      focus(step as Delta.FocusDelta)
      break
    case Delta.DeltaType.SetId:
      setId(step as Delta.SetIdDelta)
      break
    case Delta.DeltaType.SetValue:
      setValue(step as Delta.SetValueDelta)
      break
    case Delta.DeltaType.SubmitJS:
      submitJS(step as Delta.SubmitJsDelta)
      break
    case Delta.DeltaType.SetChecked:
      setChecked(step as Delta.SetCheckedDelta)
      break
    case Delta.DeltaType.ClearChildren:
      clearChildren(step as Delta.ClearChildrenDelta)
      break
    case Delta.DeltaType.Replace:
      replaceLocation(step as Delta.ReplaceDelta)
      break
    case Delta.DeltaType.ServerEvents:
      listenServerEvents()
      break
    case Delta.DeltaType.SwapChildren:
      swapChildren(step as Delta.SwapChildrenDelta)
      break
    case Delta.DeltaType.Subscribe:
      subscribe(step as Delta.SubscribeDelta)
      break
    case Delta.DeltaType.Unsubscribe:
      unsubscribe(step as Delta.UnsubscribeDelta)
      break
    case Delta.DeltaType.RemoveElementId:
      removeElementId(step as Delta.RemoveElement)
      break
    case Delta.DeltaType.Render:
      render(step as Delta.RenderDelta)
      break
    case Delta.DeltaType.UnRender:
      unRender(step as Delta.UnRenderDelta)
      break
    default:
      // eslint-disable-next-line no-console
      console.log(
        "Error processing event response. Unknown step type: " + step.Type
      )
  }
}

function append(delta: Delta.NodeAddedDelta): void {
  const el = document.getElementById(delta.ParentId)
  const children = createNodes(delta.Node)
  appendChildren(el, children)
}

function appendChildren(el: Element, children: Node[]): void {
  for (const child of children) {
    el.appendChild(child)
  }
}

function insert(delta: Delta.NodeInsertedDelta): void {
  const el = document.getElementById(delta.ParentElementId)
  const children = createNodes(delta.ContentNode)
  if (delta.Index < el.childNodes.length) {
    const before = el.childNodes[delta.Index]
    insertBeforeChildren(el, before, children)
  } else {
    appendChildren(el, children)
  }
}

function render(delta: Delta.RenderDelta): void {
  const stub = locateNode(delta.Locator)
  const elements = createNodes(delta.Node)
  if (elements.length == 0) {
    stub.remove()
    return
  }
  let last = elements.pop()
  const parent = stub.parentElement
  parent.replaceChild(last, stub)
  while (elements.length) {
    const pop = elements.pop()
    parent.insertBefore(pop, last)
    last = pop
  }
}

function insertBeforeChildren(
  el: Element,
  before: ChildNode,
  children: Node[]
): void {
  for (const child of children) {
    el.insertBefore(child, before)
    before = child.nextSibling
  }
}

function createNodes(node: ContentNode): Node[] {
  const list: Node[] = []
  pushNodes(node, list)
  return list
}

function pushNodes(node: ContentNode, list: Node[]): void {
  if (node.Type == ContentNodeType.Text) {
    list.push(createTextNode(node as ContentTextNode))
  } else if (node.Type == ContentNodeType.Element) {
    list.push(createElementNode(node as ContentElementNode))
  } else if (node.Type == ContentNodeType.Array) {
    pushArrayNodes(node as ContentArrayNode, list)
  } else if (node.Type == ContentNodeType.Placeholder) {
    list.push(createPlaceholder(node as ContentPlaceholder))
  } else {
    // eslint-disable-next-line no-console
    console.log(
      "Error processing event response. Unknown content type: " + node.Type
    )
    document.createTextNode("")
  }
}

function pushArrayNodes(node: ContentArrayNode, list: Node[]): void {
  for (let index = 0; index < node.Nodes.length; index++) {
    const item = node.Nodes[index]
    pushNodes(item, list)
  }
}

function createTextNode(node: ContentTextNode): Node {
  const div = document.createElement("div")
  div.innerHTML = node.Data
  return document.createTextNode(div.innerText)
}

function createElementNode(node: ContentElementNode): Element {
  const child = createRootNode(node)
  for (const attribute of node.Attributes) {
    setAttribute(child, attribute.Attribute, attribute.Value)
  }
  for (const branch of node.Children) {
    const nodes = createNodes(branch)
    for (const node of nodes) {
      child.appendChild(node)
    }
  }
  return child
}

function createPlaceholder(node: ContentPlaceholder): Element {
  const stub = document.createElement("script")
  stub.id = node.ElementId
  stub.type = "placeholder/lara"
  return stub
}

function setAttribute(child: Element, attribute: string, value: string): void {
  if (!value) {
    value = ""
  }
  if (
    attribute == "value" &&
    (child instanceof HTMLInputElement ||
      child instanceof HTMLSelectElement ||
      child instanceof HTMLTextAreaElement)
  ) {
    child.value = value
    return
  }
  if (attribute == "checked" && child instanceof HTMLInputElement) {
    child.checked = true
    return
  }
  child.setAttribute(attribute, value)
}

function createRootNode(node: ContentElementNode): Element {
  if (node.NS) {
    return document.createElementNS(node.NS, node.TagName)
  } else {
    return document.createElement(node.TagName)
  }
}

function textModified(delta: Delta.TextModifiedDelta): void {
  const el = document.getElementById(delta.ParentElementId)
  const child = el.childNodes[delta.ChildNodeIndex]
  child.textContent = delta.Text
}

function remove(delta: Delta.NodeRemovedDelta): void {
  const parent = document.getElementById(delta.ParentId)
  const child = parent.childNodes[delta.ChildIndex]
  child.remove()
}

function editAttribute(delta: Delta.AttributeEditedDelta): void {
  const el = document.getElementById(delta.ElementId)
  if (el.tagName == "OPTION" && delta.Attribute == "selected") {
    const option = el as HTMLOptionElement
    option.selected = true
  } else {
    el.setAttribute(delta.Attribute, delta.Value)
  }
}

function removeAttribute(delta: Delta.AttributeRemovedDelta): void {
  const el = document.getElementById(delta.ElementId)
  if (el.tagName == "OPTION" && delta.Attribute == "selected") {
    const option = el as HTMLOptionElement
    option.selected = false
  } else {
    el.removeAttribute(delta.Attribute)
  }
}

function focus(delta: Delta.FocusDelta): void {
  const el = document.getElementById(delta.ElementId)
  el.focus()
}

function setId(delta: Delta.SetIdDelta): void {
  const el = document.getElementById(delta.OldId)
  el.id = delta.NewId
}

function setValue(delta: Delta.SetValueDelta): void {
  const input = document.getElementById(delta.ElementId) as HTMLInputElement
  input.value = delta.Value
}

function submitJS(context: Delta.SubmitJsDelta): void {
  try {
    eval(context.Code)
  } catch (e) {
    // eslint-disable-next-line no-console
    console.log((<Error>e).message)
  }
}

function setChecked(delta: Delta.SetCheckedDelta): void {
  const input = document.getElementById(delta.ElementId) as HTMLInputElement
  input.checked = delta.Checked
}

function clearChildren(delta: Delta.ClearChildrenDelta): void {
  const parent = document.getElementById(delta.ElementId)
  while (parent.lastChild) {
    parent.removeChild(parent.lastChild)
  }
}

function replaceLocation(delta: Delta.ReplaceDelta): void {
  location.replace(delta.Location)
}

function swapChildren(step: Delta.SwapChildrenDelta): void {
  const el = document.getElementById(step.ParentId)
  const node1 = el.childNodes[step.Index1]
  const node2 = el.childNodes[step.Index2]
  swapDom(node1, node2)
}

function swapDom(obj1: Node, obj2: Node): void {
  const temp = document.createElement("div")
  obj1.parentNode.insertBefore(temp, obj1)
  obj2.parentNode.insertBefore(obj1, obj2)
  temp.parentNode.insertBefore(obj2, temp)
  temp.parentNode.removeChild(temp)
}

function removeElementId(delta: Delta.RemoveElement): void {
  const element = document.getElementById(delta.ElementId)
  element.remove()
}

function unRender(delta: Delta.UnRenderDelta): void {
  const node = locateNode(delta.Locator)
  const stub = document.createElement("script")
  if (node instanceof Element) {
    stub.id = node.id
  }
  stub.type = "placeholder/lara"
  node.parentElement.replaceChild(stub, node)
}

function locateNode(locator: Delta.NodeLocator): ChildNode {
  const element = document.getElementById(locator.StartingId)
  const index = locator.ChildIndex
  if (index == 0 || index > 0) {
    return element.childNodes[index]
  }
  return element
}


================================================
FILE: src/LaraClient/src/custom.d.ts
================================================
declare module "*.svg" {
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  const content: any
  export default content
}


================================================
FILE: src/LaraClient/src/index.ts
================================================
/*
Copyright (c) 2019-2020 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

/*
Lara is a server-side DOM rendering library for C#.
This file is the client runtime for Lara.
https://laraui.com
*/

//#region Framework

import { autocompleteStart, autocompleteStop } from "./Autocomplete"
import { block, unblock } from "./Blocker"
import { EventResult, EventResultType } from "./DeltaInterfaces"
import { clean } from "./Initializer"
import { collectValues, collectMessage } from "./InputCollector"
import { Sequencer } from "./Sequencer"
import { processResult } from "./Worker"
import { SocketEventParameters, loadFiles } from "./SocketEvents"

let documentId: string
let lastEventNumber: number
let sequencer: Sequencer

export function initialize(id: string, keepAliveInterval: number): void {
  sequencer = new Sequencer()
  documentId = id
  lastEventNumber = 0
  window.addEventListener("unload", terminate, false)
  clean(document)
  const json = document.head.getAttribute("data-lara-initialdelta")
  if (json) {
    const result = JSON.parse(json)
    processEventResult(result)
  }
  if (keepAliveInterval) {
    window.setInterval(sendKeepAlive, keepAliveInterval)
  }
}

export function getDocumentId(): string {
  return documentId
}

function terminate(): void {
  const url = "/_discard?doc=" + documentId
  navigator.sendBeacon(url)
}

function sendKeepAlive() {
  const id = getDocumentId()
  const url = "/_keepAlive?doc=" + id
  navigator.sendBeacon(url)
}

export enum PropagationType {
  // eslint-disable-next-line no-unused-vars
  Default = 0,
  // eslint-disable-next-line no-unused-vars
  StopPropagation = 1,
  // eslint-disable-next-line no-unused-vars
  StopImmediatePropagation = 2
}

export interface PlugOptions {
  EventName: string
  Block?: boolean
  BlockElementId?: string
  BlockHTML?: string
  BlockShownId?: string
  ExtraData?: string
  LongRunning?: boolean
  IgnoreSequence?: boolean
  Propagation?: PropagationType
  PreventDefault?: boolean
  UploadFiles?: boolean
}

export function plugEvent(
  el: EventTarget,
  ev: Event,
  options: PlugOptions
): void {
  stopPropagation(ev, options)
  plug(el, options)
}

function stopPropagation(ev: Event, options: PlugOptions): void {
  if (options.PreventDefault) {
    ev.preventDefault()
  }
  if (options.Propagation == PropagationType.StopImmediatePropagation) {
    ev.stopImmediatePropagation()
  } else if (options.Propagation == PropagationType.StopPropagation) {
    ev.stopPropagation()
  }
}

export function plug(el: EventTarget, options: PlugOptions): void {
  if (options.LongRunning) {
    plugWebSocket(el, options)
  } else {
    plugAjax(el, options)
  }
}

function plugWebSocket(el: EventTarget, plug: PlugOptions): void {
  block(plug)
  const promise = buildSocketParameters(el, plug)
  promise.then(
    (params) => {
      plugWebSocketStart(plug, params)
    },
    (reason) => {
      // eslint-disable-next-line no-console
      console.log(reason)
      location.reload()
    }
  )
}

function plugWebSocketStart(
  plug: PlugOptions,
  params: SocketEventParameters
): void {
  const url = getSocketUrl("/_event")
  const socket = new WebSocket(url)
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  socket.onopen = function (_event) {
    socket.onmessage = async function (e1) {
      await onSocketMessage(e1.data, params.EventNumber)
    }
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    socket.onclose = function (_e2) {
      unblock(plug)
    }
    const json = JSON.stringify(params)
    socket.send(json)
  }
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  socket.onerror = function (_event) {
    // eslint-disable-next-line no-console
    console.log("Error on websocket communication. Reloading.")
    location.reload()
  }
}

function getSocketUrl(name: string): string {
  let url: string
  if (location.protocol == "https:") {
    url = "wss://"
  } else {
    url = "ws://"
  }
  return url + window.location.host + name
}

async function buildSocketParameters(
  el: EventTarget,
  plug: PlugOptions
): Promise<SocketEventParameters> {
  const params = createSocketParameters(el, plug)
  params.SocketFiles = await loadFiles(plug)
  return params
}

function createSocketParameters(
  el: EventTarget,
  plug: PlugOptions
): SocketEventParameters {
  const params = new SocketEventParameters()
  if (plug.IgnoreSequence) {
    params.EventNumber = 0
  } else {
    params.EventNumber = getEventNumber()
  }
  params.DocumentId = documentId
  params.ElementId = getTargetId(el)
  params.EventName = plug.EventName
  params.Message = collectMessage(plug)
  return params
}

function getEventNumber(): number {
  lastEventNumber++
  return lastEventNumber
}

async function onSocketMessage(
  json: string,
  eventNumber: number
): Promise<void> {
  await sequencer.waitForTurn(eventNumber)
  const result = JSON.parse(json) as EventResult
  processEventResult(result)
}

export function getTargetId(target: EventTarget): string {
  if (target instanceof Element) {
    return target.id
  } else {
    return ""
  }
}

function plugAjax(el: EventTarget, plug: PlugOptions): void {
  block(plug)
  const eventNumber = getEventNumber()
  const url = getEventUrl(el, plug.EventName, eventNumber)
  const ajax = new XMLHttpRequest()
  ajax.onreadystatechange = async function () {
    if (this.readyState == 4) {
      await processAjax(this, eventNumber)
      unblock(plug)
    }
  }
  const data = collectValues(plug)
  ajax.open("POST", url, true)
  if (data) {
    ajax.send(data)
  } else {
    ajax.send()
  }
}

export interface MessageOptions {
  key: string
  data?: string
  block?: boolean
  blockElementId?: string
  blockHtml?: string
  blockShowElementId?: string
  longRunning?: boolean
}

export function sendMessage(options: MessageOptions): void {
  const params: PlugOptions = {
    EventName: "_" + options.key,
    Block: options.block,
    BlockElementId: options.blockHtml,
    BlockHTML: options.blockHtml,
    BlockShownId: options.blockShowElementId,
    ExtraData: options.data,
    LongRunning: options.longRunning
  }
  plug(document.head, params)
}

async function processAjax(
  ajax: XMLHttpRequest,
  eventNumber: number
): Promise<void> {
  if (ajax.status == 200) {
    await processAjaxResult(ajax, eventNumber)
  } else {
    processAjaxError(ajax)
  }
}

function getEventUrl(
  el: EventTarget,
  eventName: string,
  eventNumber: number
): string {
  return (
    "/_event?doc=" +
    documentId +
    "&el=" +
    getTargetId(el) +
    "&ev=" +
    eventName +
    "&seq=" +
    eventNumber.toString()
  )
}

async function processAjaxResult(
  ajax: XMLHttpRequest,
  eventNumber: number
): Promise<void> {
  await sequencer.waitForTurn(eventNumber)
  const result = JSON.parse(ajax.responseText) as EventResult
  processEventResult(result)
}

function processEventResult(result: EventResult): void {
  if (result.ResultType == EventResultType.Success) {
    if (result.List) {
      processResult(result.List)
    }
  } else if (result.ResultType == EventResultType.NoSession) {
    location.reload()
  }
}

function processAjaxError(ajax: XMLHttpRequest): void {
  if (ajax.responseText) {
    document.write(ajax.responseText)
  } else {
    // eslint-disable-next-line no-console
    console.log(
      "Internal Server Error on AJAX call. Detailed exception information on the client is turned off."
    )
  }
}

export function listenServerEvents(): void {
  plugWebSocket(document.head, {
    EventName: "_server_event",
    Block: false,
    ExtraData: "",
    LongRunning: true,
    IgnoreSequence: true
  })
}

//#endregion

//#region Built-in web components

export function autocompleteApply(payload: string): void {
  autocompleteStart(payload)
}

export function autocompleteDestroy(id: string): void {
  autocompleteStop(id)
}

//#endregion


================================================
FILE: src/LaraClient/tsconfig.json
================================================
{
  "compilerOptions": {
    "outDir": "./dist/",
    "noImplicitAny": true,
    "module": "es6",
    "target": "es5",
    "lib": [ "es6", "dom" ],
    "sourceMap": true,
    "allowJs": true
  }
}


================================================
FILE: src/LaraClient.sln
================================================

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29519.181
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9092AA53-FB77-4645-B42D-1CCCA6BD08BD}") = "LaraClient", "LaraClient\LaraClient.njsproj", "{6F0BEE5A-5C72-4DCB-9173-BD17BA95A76F}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{6F0BEE5A-5C72-4DCB-9173-BD17BA95A76F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{6F0BEE5A-5C72-4DCB-9173-BD17BA95A76F}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{6F0BEE5A-5C72-4DCB-9173-BD17BA95A76F}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{6F0BEE5A-5C72-4DCB-9173-BD17BA95A76F}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {3770CCA5-4282-46C3-9C5D-65FC0534FF93}
	EndGlobalSection
EndGlobal


================================================
FILE: src/LaraDocumentation/Content/Welcome.aml
================================================
<?xml version="1.0" encoding="utf-8"?>
<topic id="306fbdba-5d74-46ab-a362-aabe1e0a4051" revisionNumber="1">
	<developerConceptualDocument xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5" xmlns:xlink="http://www.w3.org/1999/xlink">
		<introduction>
			<para>Use the menu on the left to navigate.</para>
		</introduction>

		<relatedTopics>
		</relatedTopics>
	</developerConceptualDocument>
</topic>


================================================
FILE: src/LaraDocumentation/ContentLayout.content
================================================
<?xml version="1.0" encoding="utf-8"?>
<Topics>
  <Topic id="306fbdba-5d74-46ab-a362-aabe1e0a4051" visible="True" isDefault="true" isSelected="true" title="Welcome to Lara Web Engine">
    <HelpKeywords>
      <HelpKeyword index="K" term="Welcome" />
    </HelpKeywords>
  </Topic>
</Topics>

================================================
FILE: src/LaraDocumentation/LaraDocumentation.shfbproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!-- The configuration and platform will be used to determine which assemblies to include from solution and
				 project documentation sources -->
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>0019560b-ed95-4921-9050-8ad37bf9d7ef</ProjectGuid>
    <SHFBSchemaVersion>2017.9.26.0</SHFBSchemaVersion>
    <!-- AssemblyName, Name, and RootNamespace are not used by SHFB but Visual Studio adds them anyway -->
    <AssemblyName>LaraDocumentation</AssemblyName>
    <RootNamespace>LaraDocumentation</RootNamespace>
    <Name>LaraDocumentation</Name>
    <!-- SHFB properties -->
    <FrameworkVersion>.NET Framework 4.5</FrameworkVersion>
    <OutputPath>.\Help\</OutputPath>
    <HtmlHelpName>LaraDocumentation</HtmlHelpName>
    <Language>en-US</Language>
    <TransformComponentArguments>
      <Argument Key="logoFile" Value="Help.png" xmlns="" />
      <Argument Key="logoHeight" Value="" xmlns="" />
      <Argument Key="logoWidth" Value="" xmlns="" />
      <Argument Key="logoAltText" Value="" xmlns="" />
      <Argument Key="logoPlacement" Value="left" xmlns="" />
      <Argument Key="logoAlignment" Value="left" xmlns="" />
      <Argument Key="maxVersionParts" Value="" xmlns="" />
    </TransformComponentArguments>
    <HelpFileFormat>Website</HelpFileFormat>
    <SyntaxFilters>C#, F#</SyntaxFilters>
    <PresentationStyle>VS2013</PresentationStyle>
    <CleanIntermediates>True</CleanIntermediates>
    <KeepLogFile>True</KeepLogFile>
    <DisableCodeBlockComponent>False</DisableCodeBlockComponent>
    <IndentHtml>False</IndentHtml>
    <BuildAssemblerVerbosity>OnlyWarningsAndErrors</BuildAssemblerVerbosity>
    <SaveComponentCacheCapacity>100</SaveComponentCacheCapacity>
    <HelpTitle>Lara Documentation</HelpTitle>
    <HelpFileVersion>1.0.0.0</HelpFileVersion>
    <RootNamespaceContainer>False</RootNamespaceContainer>
    <NamespaceGrouping>False</NamespaceGrouping>
    <MaximumGroupParts>2</MaximumGroupParts>
    <Preliminary>False</Preliminary>
    <SdkLinkTarget>Blank</SdkLinkTarget>
    <VisibleItems>ProtectedInternalAsProtected, NonBrowsable</VisibleItems>
    <DocumentationSources>
      <DocumentationSource sourceFile="..\LaraUI\bin\Release\netstandard2.1\Integrative.Lara.xml" />
      <DocumentationSource sourceFile="..\LaraUI\bin\Release\netstandard2.1\Integrative.Lara.dll" />
    </DocumentationSources>
    <CopyrightText>Copyright %28c%29 2020 Integrative Software LLC</CopyrightText>
    <NamespaceSummaries>
      <NamespaceSummaryItem name="(global)" isDocumented="True">Lara's namespace</NamespaceSummaryItem>
      <NamespaceSummaryItem name="Integrative.Lara" isDocumented="True">Integrative.Lara namespace</NamespaceSummaryItem>
    </NamespaceSummaries>
    <PlugInConfigurations>
      <PlugInConfig id="Assembly Binding Redirection" enabled="True" xmlns="">
        <configuration useGAC="false">
          <assemblyBinding />
          <ignoreIfUnresolved>
            <assemblyIdentity name="BusinessObjects.Licensing.KeycodeDecoder" />
            <assemblyIdentity name="Microsoft.VisualStudio.TestTools.UITest.Playback" />
            <assemblyIdentity name="netstandard" />
          </ignoreIfUnresolved>
        </configuration>
      </PlugInConfig>
    </PlugInConfigurations>
  </PropertyGroup>
  <!-- There are no properties for these groups.  AnyCPU needs to appear in order for Visual Studio to perform
			 the build.  The others are optional common platform types that may appear. -->
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|Win32' ">
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|Win32' ">
  </PropertyGroup>
  <ItemGroup>
    <Folder Include="Content" />
    <Folder Include="icons" />
    <Folder Include="media" />
  </ItemGroup>
  <ItemGroup>
    <None Include="Content\Welcome.aml" />
  </ItemGroup>
  <ItemGroup>
    <ContentLayout Include="ContentLayout.content" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="icons\Help.png" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\LaraUI\LaraUI.csproj">
      <Name>LaraUI</Name>
      <Project>{1cf006b1-8b28-45bc-b9c8-1e548acd115d}</Project>
      <Private>True</Private>
    </ProjectReference>
  </ItemGroup>
  <!-- Import the SHFB build targets -->
  <Import Project="$(SHFBROOT)\SandcastleHelpFileBuilder.targets" />
  <!-- The pre-build and post-build event properties must appear *after* the targets file import in order to be
			 evaluated correctly. -->
  <PropertyGroup>
    <PreBuildEvent>
    </PreBuildEvent>
    <PostBuildEvent>
    </PostBuildEvent>
    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
  </PropertyGroup>
</Project>

================================================
FILE: src/LaraUI/.gitignore
================================================
###############
#    folder   #
###############
/**/DROP/
/**/TEMP/
/**/packages/
/**/bin/
/**/obj/
_site


================================================
FILE: src/LaraUI/Autocomplete/AutocompleteElement.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 11/2019
Author: Pablo Carbonell
*/

using System;

namespace Integrative.Lara
{
    /// <summary>
    /// Autocomplete web component
    /// </summary>
    public class AutocompleteElement : WebComponent
    {
        /// <summary>
        /// Autocomplete's custom HTML tag
        /// </summary>
        public const string CustomTag = "lara-autocomplete";

        /// <summary>
        /// Returns the inner input element
        /// </summary>
        public HtmlInputElement InnerInput { get; } = new HtmlInputElement();

        /// <summary>
        /// Constructor
        /// </summary>
        public AutocompleteElement() : base(CustomTag)
        {
            InnerInput.Autocomplete = "off";
            ShadowRoot.AppendChild(InnerInput);
        }

        /// <summary>
        /// Input element's class
        /// </summary>
        public override string? Class
        {
            get => InnerInput.Class;
            set => InnerInput.Class = value;
        }

        private bool _pending, _applied;

        private AutocompleteOptions? _options;

        internal AutocompleteOptions? GetOptions() => _options;

        /// <summary>
        /// Enables the autocomplete functionality
        /// </summary>
        /// <param name="options">Autocomplete options</param>
        public void Start(AutocompleteOptions options)
        {
            _options = options ?? throw new ArgumentNullException(nameof(options));
            if (Document == null)
            {
                _pending = true;
            }
            else
            {
                DestroyAutocomplete();
                SubmitAutocomplete(Document, options);
            }
        }

        /// <summary>
        /// Stops the autocomplete functionality
        /// </summary>
        public void Stop()
        {
            DestroyAutocomplete();
        }

        /// <summary>
        /// Establishes autocomplete if pending
        /// </summary>
        protected override void OnConnect()
        {
            if (!_pending) return;
            _pending = false;
            DestroyAutocomplete();
            if (Document != null && _options != null)
            {
                SubmitAutocomplete(Document, _options);
            }
        }

        /// <summary>
        /// Disposes autocomplete references on browser
        /// </summary>
        protected override void OnDisconnect()
        {
            DestroyAutocomplete();
        }

        internal string AutocompleteId { get; private set; } = string.Empty;

        private void SubmitAutocomplete(Document document, AutocompleteOptions options)
        {
            AutocompleteId = GetAutocompleteKey(document);
            AutocompleteService.Register(AutocompleteId, this);
            _applied = true;
            _pending = false;
            var payload = new AutocompletePayload
            {
                AutoFocus = options.AutoFocus,
                ElementId = InnerInput.Id,
                MinLength = options.MinLength,
                Strict = options.Strict
            };
            var json = LaraUI.JSON.Stringify(payload);
            var code = $"LaraUI.autocompleteApply(context.Payload);";
            LaraUI.Page.JSBridge.Submit(code, json);
        }

        private string GetAutocompleteKey(Document document)
        {
            return InnerInput.Id + " " + document.VirtualIdString;
        }

        private void DestroyAutocomplete()
        {
            if (!_applied) return;
            _applied = false;
            AutocompleteService.Unregister(AutocompleteId);
            var code = $"LaraUI.autocompleteDestroy('{InnerInput.Id}');";
            LaraUI.Page.JSBridge.Submit(code);
        }

        /// <summary>
        /// Value property
        /// </summary>
        public string? Value
        {
            get => InnerInput.Value;
            set => InnerInput.Value = value;
        }
    }
}


================================================
FILE: src/LaraUI/Autocomplete/AutocompleteEntry.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 11/2019
Author: Pablo Carbonell
*/

using System.Runtime.Serialization;

namespace Integrative.Lara
{
    /// <summary>
    /// Default implementation for IAutocompleteEntry
    /// </summary>
    [DataContract]
    public class AutocompleteEntry
    {
        /// <summary>
        /// Optional custom HTML for the autocomplete row shown
        /// </summary>
        /// <returns></returns>
        [DataMember(Name = "html")]
        public string? Html { get; set; }

        /// <summary>
        /// Text to fill the input control when selected
        /// </summary>
        [DataMember(Name = "label")]
        public string? Label { get; set; }

        /// <summary>
        /// Value property associated with the entry
        /// </summary>
        [DataMember(Name = "code")]
        public string? Code { get; set; }

        /// <summary>
        /// Subtitle to show when using default HTML
        /// </summary>
        [DataMember(Name = "subtitle")]
        public string? Subtitle { get; set; }
    }
}


================================================
FILE: src/LaraUI/Autocomplete/AutocompleteOptions.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 11/2019
Author: Pablo Carbonell
*/

namespace Integrative.Lara
{
    /// <summary>
    /// Autocomplete options
    /// </summary>
    public class AutocompleteOptions
    {
        /// <summary>
        /// Minimum number of characters required to trigger autocomplete suggestions
        /// </summary>
        public int MinLength { get; set; }

        /// <summary>
        /// Automatically focus on selection list
        /// </summary>
        public bool AutoFocus { get; set; } = true;

        /// <summary>
        /// When true, only the suggested values can be selected
        /// </summary>
        public bool Strict { get; set; }

        /// <summary>
        /// Autocomplete suggestions provider
        /// </summary>
        public IAutocompleteProvider? Provider { get; set; }
    }
}


================================================
FILE: src/LaraUI/Autocomplete/AutocompletePayload.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 11/2019
Author: Pablo Carbonell
*/

using System.Runtime.Serialization;

namespace Integrative.Lara
{
    [DataContract]
    internal class AutocompletePayload
    {
        [DataMember]
        public string ElementId { get; set; } = string.Empty;

        [DataMember]
        public bool AutoFocus { get; set; }

        [DataMember]
        public int MinLength { get; set; }

        [DataMember]
        public bool Strict { get; set; }
    }
}


================================================
FILE: src/LaraUI/Autocomplete/AutocompleteRegistry.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 11/2019
Author: Pablo Carbonell
*/

using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;

namespace Integrative.Lara
{
    internal class AutocompleteRegistry
    {
        private readonly SessionLocal<Dictionary<string, AutocompleteElement>> _map;
        private readonly object _mapLock = new object();

        public AutocompleteRegistry()
        {
            _map = new SessionLocal<Dictionary<string, AutocompleteElement>>();
        }

        public bool TryGet(string key, [NotNullWhen(true)] out AutocompleteElement? element)
        {
            element = default;
            lock (_mapLock)
            {
                var map = _map.Value;
                return map != null
                    && map.TryGetValue(key, out element);
            }
        }

        public void Set(string key, AutocompleteElement element)
        {
            lock (_mapLock)
            {
                var map = _map.Value;
                if (map == null)
                {
                    map = new Dictionary<string, AutocompleteElement>();
                    _map.Value = map;
                    map.Add(key, element);
                }
                else
                {
                    map.Remove(key);
                    map.Add(key, element);
                }
            }
        }

        public void Remove(string key)
        {
            lock (_mapLock)
            {
                _map.Value?.Remove(key);
            }
        }

        public int Count => GetCount();

        private int GetCount()
        {
            var value = GetValue();
            return value?.Count ?? 0;
        }

        private Dictionary<string, AutocompleteElement>? GetValue()
        {
            lock (_mapLock)
            {
                return _map.Value;
            }
        }
    }
}


================================================
FILE: src/LaraUI/Autocomplete/AutocompleteResponse.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 11/2019
Author: Pablo Carbonell
*/

using System.Collections.Generic;
using System.Runtime.Serialization;

namespace Integrative.Lara
{
    /// <summary>
    /// Autocomplete results
    /// </summary>
    [DataContract]
    public class AutocompleteResponse
    {
        /// <summary>
        /// List of autocomplete entries
        /// </summary>
        [DataMember]
        public List<AutocompleteEntry>? Suggestions { get; set; }
    }
}


================================================
FILE: src/LaraUI/Autocomplete/AutocompleteService.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 11/2019
Author: Pablo Carbonell
*/

using System.Runtime.Serialization;
using System.Threading.Tasks;

namespace Integrative.Lara
{
    [DataContract]
    internal class AutocompleteRequest
    {
        [DataMember]
        public string Key { get; set; } = string.Empty;

        [DataMember]
        public string Term { get; set; } = string.Empty;
    }

    internal class AutocompleteService : IWebService
    {
        public const string Address = "/lara_autocomplete";

        private static readonly AutocompleteRegistry _Map = new AutocompleteRegistry();

        public Task<string> Execute()
        {
            return Execute(LaraUI.Service.RequestBody);
        }

        internal static async Task<string> Execute(string json)
        {
            var request = LaraUI.JSON.Parse<AutocompleteRequest>(json);
            if (!_Map.TryGet(request.Key, out var element))
            {
                return string.Empty;
            }
            var options = element.GetOptions();
            if (options?.Provider == null)
            {
                return string.Empty;
            }

            var response = await options.Provider.GetAutocompleteList(request.Term);
            return LaraUI.JSON.Stringify(response);
        }

        public static void Register(string key, AutocompleteElement element)
        {
            _Map.Set(key, element);
        }

        public static void Unregister(string key)
        {
            _Map.Remove(key);
        }

        public static int RegisteredCount => _Map.Count;
    }
}


================================================
FILE: src/LaraUI/Autocomplete/IAutocompleteProvider.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 11/2019
Author: Pablo Carbonell
*/

using System.Threading.Tasks;

namespace Integrative.Lara
{
    /// <summary>
    /// Interface for a class that provides autocomplete suggestions
    /// </summary>
    public interface IAutocompleteProvider
    {
        /// <summary>
        /// Method that provides autocomplete suggestions
        /// </summary>
        /// <param name="term">Search term typed</param>
        /// <returns>Autocomplete response</returns>
        Task<AutocompleteResponse> GetAutocompleteList(string term);
    }
}


================================================
FILE: src/LaraUI/Components/ComponentRegistry.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 8/2019
Author: Pablo Carbonell
*/

using System;
using System.Collections.Generic;

namespace Integrative.Lara
{
    internal sealed class ComponentRegistry
    {
        private readonly Dictionary<string, Type> _components;

        public ComponentRegistry()
        {
            _components = new Dictionary<string, Type>();
        }

        public void Register(string name, Type type)
        {
            name = name ?? throw new ArgumentNullException(nameof(name));
            type = type ?? throw new ArgumentNullException(nameof(type));
            if (!IsValidTagName(name))
            {
                throw new ArgumentException(Resources.DashRequired);
            }

            if (!type.IsSubclassOf(typeof(WebComponent)))
            {
                throw new InvalidOperationException(Resources.MustInherit);
            }
            if (_components.TryGetValue(name, out var previous))
            {
                var message = $"Duplicate entries for tag '{name}'. The class '{previous.FullName}' already registers the tag name.";
                throw new InvalidOperationException(message);
            }
            _components.Add(name, type);
        }

        public void Unregister(string tagName)
        {
            _components.Remove(tagName);
        }

        private static bool IsValidTagName(string tagName)
        {
            return !string.IsNullOrEmpty(tagName)
                && !tagName.Contains(" ", StringComparison.InvariantCulture)
                && tagName.Contains("-", StringComparison.InvariantCulture);
        }

        public bool TryGetComponent(string name, out Type type)
        {
            return _components.TryGetValue(name, out type);
        }

        public void Clear()
        {
            _components.Clear();
        }
    }
}


================================================
FILE: src/LaraUI/Components/Fragment.cs
================================================
/*
Copyright (c) 2021 Integrative Software LLC
Created: 1/2021
Author: Pablo Carbonell
*/

using System;
using System.Collections.ObjectModel;

namespace Integrative.Lara
{
    /// <summary>
    /// Fragment component to group element in a single parent
    /// </summary>
    public class Fragment : WebComponent
    {
        /// <summary>
        /// Constructor
        /// </summary>
        public Fragment()
        {
            ShadowRoot.AppendChild(new Slot());
        }

        /// <summary>
        /// Creates a Fragment with a list of children that follows an observable collection
        /// </summary>
        /// <typeparam name="TValue"></typeparam>
        /// <param name="source"></param>
        /// <param name="factory"></param>
        /// <returns></returns>
        public static Fragment ForEach<TValue>(ObservableCollection<TValue> source, Func<TValue, Element> factory)
        {
            var fragment = new Fragment();
            fragment.BindChildren(source, factory);
            return fragment;
        }
    }
}


================================================
FILE: src/LaraUI/Components/LaraWebComponent.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 8/2019
Author: Pablo Carbonell
*/

using System;

namespace Integrative.Lara
{
    /// <summary>
    /// Classes marked as LaraWebComponent will registered when executing LaraUI.PublishAssemblies()
    /// </summary>
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
    public sealed class LaraWebComponentAttribute : Attribute
    {
        /// <summary>
        /// Custom tag name for the component. Must contain the '-' character.
        /// </summary>
        public string ComponentTagName { get; }

        /// <summary>
        /// Constructor with custom tag name
        /// </summary>
        /// <param name="customTagName">Tag name of the web component</param>
        public LaraWebComponentAttribute(string customTagName)
        {
            ComponentTagName = customTagName;
        }

        /// <summary>
        /// Constructor
        /// </summary>
        public LaraWebComponentAttribute() : this("")
        {
        }
    }
}


================================================
FILE: src/LaraUI/Components/RenderIf.cs
================================================
using System;
using System.ComponentModel;

namespace Integrative.Lara
{
    /// <summary>
    /// Conditional render placeholder
    /// </summary>
    public class RenderIf : WebComponent
    {
        private readonly Func<bool> _criteria;
        private readonly Func<Element> _factory;
        private bool _rendered;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="source"></param>
        /// <param name="criteria"></param>
        /// <param name="factory"></param>
        public RenderIf(INotifyPropertyChanged source, Func<bool> criteria, Func<Element> factory)
        {
            _criteria = criteria;
            _factory = factory;
            source.PropertyChanged += (_, _) => Update();
        }

        private void Update()
        {
            var rendered = _criteria();
            if (rendered == _rendered) return;
            _rendered = rendered;
            if (rendered)
            {
                ShadowRoot.AppendChild(_factory());
            }
            else
            {
                ShadowRoot.ClearChildren();
            }
        }
    }
}


================================================
FILE: src/LaraUI/Components/Shadow.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 8/2019
Author: Pablo Carbonell
*/

using System.Collections.Generic;
using System.Linq;

namespace Integrative.Lara
{
    internal sealed class Shadow : Element
    {
        private const string ShadowTagName = "__shadow";

        public Shadow(WebComponent parent) : base(ShadowTagName)
        {
            ParentComponent = parent;
        }

        public WebComponent ParentComponent { get; }

        internal override IEnumerable<Node> GetLightSlotted()
        {
            return Enumerable.Empty<Node>();
        }

        internal override bool IsPrintable => false;
    }
}


================================================
FILE: src/LaraUI/Components/Slot.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 8/2019
Author: Pablo Carbonell
*/

using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;

namespace Integrative.Lara
{
    /// <summary>
    /// A slot element is a placeholder inside a web component that you can fill with your own element
    /// </summary>
    public sealed class Slot : Element
    {
        /// <summary>
        /// The slot's name
        /// </summary>
        public string? Name
        {
            get => GetAttribute("name");
            set => SetAttributeLower("name", value);
        }

        /// <summary>
        /// Constructor
        /// </summary>
        public Slot() : base("slot")
        {
        }

        internal bool MatchesName(string? slotName)
        {
            var name = Name;
            if (string.IsNullOrEmpty(name))
            {
                return string.IsNullOrEmpty(slotName);
            }

            return name == slotName;
        }

        internal override IEnumerable<Node> GetLightSlotted()
        {
            return TryFindParentComponent(this, out var component) ? component.GetSlottedElements(Name) : Enumerable.Repeat(this, 1);
        }

        private static bool TryFindParentComponent(Node element, [NotNullWhen(true)] out WebComponent? component)
        {
            var parent = element.ParentElement;
            if (parent is null)
            {
                component = default;
                return false;
            }

            if (parent is not Shadow shadow) return TryFindParentComponent(parent, out component);
            component = shadow.ParentComponent;
            return true;
            // ReSharper disable once TailRecursiveCall
        }

        internal override bool IsPrintable => false;
    }
}


================================================
FILE: src/LaraUI/Components/SlottedCalculator.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 8/2019
Author: Pablo Carbonell
*/

namespace Integrative.Lara
{
    internal static class SlottedCalculator
    {
        public static void UpdateSlotted(Node node)
        {
            node.IsSlotted = IsParentSlotting(node);
            if (node is WebComponent component)
            {
                var shadow = component.GetShadow();
                UpdateSlotted(shadow);
            }
            if (node is Element element)
            {
                UpdateChildren(element);
            }
        }

        internal static bool IsParentSlotting(Node node)
        {
            var parent = node.ParentElement;
            if (parent == null || parent is Slot)
            {
                return false;
            }
            if (parent is Shadow shadow)
            {
                return shadow.ParentComponent.IsSlotted;
            }
            if (parent is WebComponent component)
            {
                return node is Element element
                       && component.IsSlotActive(element.GetAttributeLower("slot"));
            }
            return parent.IsSlotted;
        }

        private static void UpdateChildren(Element element)
        {
            foreach (var node in element.Children)
            {
                UpdateSlotted(node);
            }
        }
    }
}


================================================
FILE: src/LaraUI/Components/WebComponent.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 8/2019
Author: Pablo Carbonell
*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;

namespace Integrative.Lara
{
    /// <summary>
    /// Base class for web components
    /// </summary>
    public abstract class WebComponent : Element
    {
        /// <summary>
        /// The 'shadow root' is the element that contains the shadow DOM tree
        /// </summary>
        protected Element ShadowRoot => _shadow;

        private readonly Shadow _shadow;

        internal Shadow GetShadow() => _shadow;

        private HashSet<string>? _observedAttributes;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="tagName">Component's custom tag name</param>
        protected WebComponent(string tagName) : base(tagName ?? throw new ArgumentNullException(nameof(tagName)))
        {
            VerifyTypeThrow(tagName, GetType());
            _shadow = new Shadow(this);
        }

        /// <summary>
        /// Constructor
        /// </summary>
        protected WebComponent()
        {
            VerifyTypeThrow(TagName, GetType());
            _shadow = new Shadow(this);
        }

        private void InitializeObservedAttributes()
        {
            if (_observedAttributes == null)
            {
                _observedAttributes = new HashSet<string>(GetObservedAttributes());
            }
        }

        private static void VerifyTypeThrow(string tagName, Type componentType)
        {
            if (!VerifyType(tagName, componentType, out var error))
            {
                throw new InvalidOperationException(error);
            }
        }

        internal static bool VerifyType(string tagName, Type componentType, out string error)
        {
            // register component if not previous;y registered
            var app = LaraUI.Context.Application;
            if (!app.TryGetComponent(tagName, out var type))
            {
                app.PublishComponent(new WebComponentOptions
                {
                    ComponentTagName = tagName,
                    ComponentType = componentType
                });
                error = "";
                return true;
            }

            // error if already registered for different type
            if (type != componentType)
            {
                error = $"The tag '{tagName}' is registered with the type '{type.FullName}' and not '{componentType.FullName}'.";
                return false;
            }

            // already registered with matching type
            error = string.Empty;
            return true;
        }

        /// <summary>
        /// Obsolete
        /// </summary>
        [Obsolete("Not needed anymore, Shadow root is automatically created")]
        [EditorBrowsable(EditorBrowsableState.Never)]
        protected void AttachShadow()
        {
        }

        /// <summary>
        /// Override to declare a list of attributes that will trigger the OnAttributeChanged event
        /// </summary>
        /// <returns></returns>
        protected virtual IEnumerable<string> GetObservedAttributes()
        {
            return Enumerable.Empty<string>();
        }

        internal override IEnumerable<Node> GetLightSlotted()
        {
            foreach (var child in ShadowRoot.Children)
            {
                if (child is Element childElement)
                {
                    foreach (var light in childElement.GetLightSlotted())
                    {
                        yield return light;
                    }
                }
                else
                {
                    yield return child;
                }
            }
        }

        internal override IEnumerable<Node> GetAllDescendants()
        {
            yield return ShadowRoot;
            foreach (var child in Children)
            {
                yield return child;
            }
        }

        /// <summary>
        /// Returns the elements that are slotted with the given slot name
        /// </summary>
        /// <param name="slotName">Slot name</param>
        /// <returns>IEnumerable of nodes</returns>
        public IEnumerable<Node> GetSlottedElements(string? slotName)
        {
            foreach (var node in Children)
            {
                if (NodeMatchesSlot(node, slotName))
                {
                    yield return node;
                }
            }
        }

        private static bool NodeMatchesSlot(Node node, string? slotName)
        {
            return node is Element element
                && ElementMatchesSlot(element, slotName);
        }

        private static bool ElementMatchesSlot(Element element, string? slotName)
        {
            var slot = element.GetAttributeLower("slot");
            if (string.IsNullOrEmpty(slotName))
            {
                return string.IsNullOrEmpty(slot);
            }

            return slot == slotName;
        }

        internal override void AttributeChanged(string attribute, string? value)
        {
            BeginUpdate();
            base.AttributeChanged(attribute, value);
            InitializeObservedAttributes();
            if (_observedAttributes != null && _observedAttributes.Contains(attribute))
            {
                OnAttributeChanged(attribute);
            }
            EndUpdate();
        }

        /// <summary>
        /// Invoked each time an attribute defined in GetObservedAttributes is modified.
        /// </summary>
        /// <param name="attribute"></param>
        protected virtual void OnAttributeChanged(string attribute)
        {
        }

        internal override IEnumerable<Element> GetNotifyList()
        {
            foreach (var child in base.GetNotifyList())
            {
                yield return child;
            }
            yield return ShadowRoot;
        }

        internal override bool IsPrintable => false;

        internal bool IsSlotActive(string? slotName)
        {
            return IsSlotActive(ShadowRoot, slotName);
        }

        private static bool IsSlotActive(Element parent, string? slotName)
        {
            foreach (var child in parent.Children)
            {
                if (IsSlotChildActive(child, slotName))
                {
                    return true;
                }
            }
            return false;
        }

        private static bool IsSlotChildActive(Node child, string? slotName)
        {
            return (child is Slot slot && slot.MatchesName(slotName))
                || (child is Element element && IsSlotActive(element, slotName));
        }

        /// <summary>
        /// Triggers a custom event
        /// </summary>
        /// <param name="eventName">Event's name</param>
        public void TriggerEvent(string eventName) => NotifyEvent(eventName);
    }
}


================================================
FILE: src/LaraUI/Components/WebComponentOptions.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 8/2019
Author: Pablo Carbonell
*/

using System;

namespace Integrative.Lara
{
    /// <summary>
    /// Options for publishing web components
    /// </summary>
    public sealed class WebComponentOptions
    {
        /// <summary>
        /// Custom tag name for the component. Needs to include the '-' character.
        /// </summary>
        public string ComponentTagName { get; set; } = string.Empty;

        /// <summary>
        /// Type of the component. Needs to inherit from WebComponent. Example: 'typeof(MyComponent)'
        /// </summary>
        public Type? ComponentType { get; set; }

        internal Type GetComponentType()
        {
            return ComponentType ?? throw new MissingMemberException(nameof(WebComponentOptions), nameof(ComponentType));
        }
    }
}


================================================
FILE: src/LaraUI/DOM/Attributes.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

using System;
using System.Collections;
using System.Collections.Generic;

namespace Integrative.Lara
{
    internal sealed class Attributes : IEnumerable<KeyValuePair<string, string>>
    {
        private readonly Element _element;
        private readonly Dictionary<string, string?> _values;

        public Attributes(Element element)
        {
            _element = element;
            _values = new Dictionary<string, string?>();
            SetAttributeLower("id", element.Id);
        }

        public bool HasAttribute(string name) => HasAttributeLower(name.ToLowerInvariant());

        public string? GetAttribute(string name) => GetAttributeLower(name.ToLowerInvariant());

        internal bool HasAttributeLower(string nameLower)
            => _values.ContainsKey(nameLower);

        internal void SetAttributeLower(string nameLower, string? value)
        {
            if (nameLower == "slot" && _element.ParentElement != null)
            {
                throw new InvalidOperationException(Resources.SlotOnlyParent);
            }
            if (_values.TryGetValue(nameLower, out var previous))
            {
                if (previous == value)
                {
                    return;
                }
                _values.Remove(nameLower);
            }
            _values.Add(nameLower, value);
            if (nameLower == "value")
            {
                SetValueDelta.Enqueue(_element, value);
            }
            else if (nameLower == "checked")
            {
                SetCheckedDelta.Enqueue(_element, true);
            }
            else if (nameLower == "id")
            {
                SetIdDelta.Enqueue(_element, value ?? "");
            }
            else
            {
                AttributeEditedDelta.Enqueue(_element, nameLower, value);
            }
            _element.AttributeChanged(nameLower, value);
            if (nameLower == "slot")
            {
                _element.UpdateSlotted();
            }
        }

        internal void RemoveAttributeLower(string nameLower)
        {
            if (!_values.ContainsKey(nameLower))
            {
                return;
            }
            _values.Remove(nameLower);
            if (nameLower == "checked")
            {
                SetCheckedDelta.Enqueue(_element, false);
            }
            else
            {
                AttributeRemovedDelta.Enqueue(_element, nameLower);
            }
            _element.AttributeChanged(nameLower, null);
        }

        internal void SetFlagAttributeLower(string nameLower, bool value)
        {
            var current = _values.ContainsKey(nameLower);
            if (value == current) return;
            if (value)
            {
                SetAttributeLower(nameLower, "");
            }
            else
            {
                RemoveAttributeLower(nameLower);
            }
        }

        internal void NotifyValue(string value)
        {
            const string valueAttribute = "value";
            if (_values.TryGetValue(valueAttribute, out var previous))
            {
                if (previous == value)
                {
                    return;
                }
                _values.Remove(valueAttribute);
            }
            _values.Add(valueAttribute, value);
            _element.AttributeChanged(valueAttribute, value);
        }

        internal void NotifyChecked(bool isChecked)
        {
            NotifyFlag("checked", isChecked);
        }

        internal void NotifySelected(bool selected)
        {
            NotifyFlag("selected", selected);
        }

        private void NotifyFlag(string nameLower, bool value)
        {
            var current = _values.ContainsKey(nameLower);
            if (current == value)
            {
                return;
            }
            if (value)
            {
                _values.Add(nameLower, null);
            }
            else
            {
                _values.Remove(nameLower);
            }
            _element.AttributeChanged(nameLower, string.Empty);
        }

        internal string? GetAttributeLower(string nameLower)
        {
            return _values.TryGetValue(nameLower, out var result) ? result : string.Empty;
        }

        public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
        {
            return _values.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return _values.GetEnumerator();
        }
    }
}


================================================
FILE: src/LaraUI/DOM/BlockOptions.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 6/2019
Author: Pablo Carbonell
*/

namespace Integrative.Lara
{
    /// <summary>
    /// Defines options for blocking the UI while executing an event
    /// </summary>
    public class BlockOptions
    {
        /// <summary>
        /// Gets or sets the ID of element to block. Leave empty to block the whole page.
        /// </summary>
        /// <value>
        /// The ID of the element to block. If left blank, block the entire page.
        /// </value>
        public string? BlockedElementId { get; set; }

        /// <summary>
        /// Gets or sets the ID of the element to show. If set, the element specified will be shown instead of the default block dialog.
        /// </summary>
        /// <value>
        /// The ID of the element to show instead of the default block dialog.
        /// </value>
        public string? ShowElementId { get; set; }

        /// <summary>
        /// Gets or sets an HTML message to show while blocking the user interface. If set, the specified HTML will be shown instead of the default block dialog.
        /// </summary>
        /// <value>
        /// The HTML message to show instead of the default block dialog.
        /// </value>
        public string? ShowHtmlMessage { get; set; }
    }
}


================================================
FILE: src/LaraUI/DOM/ChildrenBindingSubscription.cs
================================================
/*
Copyright (c) 2020-2021 Integrative Software LLC
Created: 12/2020
Author: Pablo Carbonell
*/

using System.Collections.Specialized;

namespace Integrative.Lara
{
    internal class ChildrenBindingSubscription
    {
        public NotifyCollectionChangedEventHandler Handler { get; }
        public INotifyCollectionChanged Source { get; }

        public ChildrenBindingSubscription(
            NotifyCollectionChangedEventHandler handler,
            INotifyCollectionChanged source)
        {
            Handler = handler;
            Source = source;
            source.CollectionChanged += handler;
        }

        public void Unsubscribe()
        {
            Source.CollectionChanged -= Handler;
        }
    }
}


================================================
FILE: src/LaraUI/DOM/Document.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;

namespace Integrative.Lara
{
    /// <summary>
    /// Status options for server-side events
    /// </summary>
    public enum ServerEventsStatus
    {
        /// <summary>
        /// Server-side events have not been enabled
        /// </summary>
        Disabled,

        /// <summary>
        /// The server is waiting for the client to listen to server-side events
        /// </summary>
        Connecting,

        /// <summary>
        /// Server-side events are enabled
        /// </summary>
        Enabled
    }

    /// <summary>
    /// An HTML5 document.
    /// </summary>
    public class Document
    {
        internal IPage Page { get; }

        /// <summary>
        /// Global unique identifier for the document
        /// </summary>
        public Guid VirtualId { get; }

        private readonly DocumentIdMap _map;
        private readonly Queue<BaseDelta> _queue;
        internal SemaphoreSlim Semaphore { get; }

        private readonly ServerEventsController _serverEvents;
        private readonly MessageRegistry _messageRegistry;
        private readonly Sequencer _sequencer = new();

        private Dictionary<string, EventSettings> Events { get; } = new();

        /// <summary>
        /// Occurs when the document is unloaded
        /// </summary>
        public event EventHandler? OnUnload;

        /// <summary>
        /// Asynchronous unload event
        /// </summary>
        public AsyncEvent OnUnloadAsync { get; } = new();

        internal event EventHandler? UnloadComplete;

        /// <summary>
        /// Gets or sets the language. See 'lang' property for HTML5 documents.
        /// </summary>
        /// <value>
        /// The language.
        /// </value>
        public string? Lang { get; set; }

        /// <summary>
        /// The document's Head element.
        /// </summary>
        /// <value>
        /// The head.
        /// </value>
        public HtmlHeadElement Head { get; }

        /// <summary>
        /// The document's Body element.
        /// </summary>
        /// <value>
        /// The body.
        /// </value>
        public HtmlBodyElement Body { get; }

        internal DateTime LastUtc { get; private set; }

        internal Queue<BaseDelta> GetQueue() => _queue;

        internal Document(IPage page, double keepAliveInterval)
            : this(page, Connections.CreateCryptographicallySecureGuid(), keepAliveInterval)
        {
        }

        internal Document(IPage page, Guid virtualId, double keepAliveInterval)
        {
            VirtualId = virtualId;
            Page = page;
            _map = new DocumentIdMap();
            _queue = new Queue<BaseDelta>();
            Semaphore = new SemaphoreSlim(1);
            Head = new HtmlHeadElement
            {
                Document = this,
                IsSlotted = true
            };
            OnElementAdded(Head);
            Body = new HtmlBodyElement
            {
                Document = this,
                IsSlotted = true
            };
            UpdateTimestamp();
            OnElementAdded(Body);
            TemplateBuilder.Build(this, keepAliveInterval);
            _serverEvents = new ServerEventsController(this);
            _messageRegistry = new MessageRegistry(this);
        }

        internal string VirtualIdString =>
            VirtualId.ToString(GlobalConstants.GuidFormat, CultureInfo.InvariantCulture);

        /// <summary>
        /// Creates an HTML element.
        /// </summary>
        /// <param name="tagName">Name of the tag.</param>
        /// <returns>Element created</returns>
        public static Element CreateElement(string tagName) => Element.Create(tagName);

        /// <summary>
        /// Creates a text node.
        /// </summary>
        /// <param name="data">The node's data.</param>
        /// <returns>Text node created</returns>
        public static TextNode CreateTextNode(string data) => new TextNode(data);

        internal void UpdateTimestamp()
        {
            LastUtc = DateTime.UtcNow;
        }

        internal void ModifyLastUtcForTesting(DateTime value)
        {
            LastUtc = value;
        }

        internal void OnElementAdded(Element element)
            => _map.NotifyAdded(element);

        internal void OnElementRemoved(Element element)
            => _map.NotifyRemoved(element);

        internal void NotifyChangeId(Element element, string before, string after)
            => _map.NotifyChangeId(element, before, after);

        internal bool QueueingEvents { get; private set; }

        internal void OpenEventQueue()
        {
            if (_queue.Count > 0)
            {
                var json = FlushQueue();
                Head.SetAttribute("data-lara-initialdelta", json);
            }
            QueueingEvents = true;
        }

        internal string FlushQueue()
        {
            var list = new List<BaseDelta>();
            while (_queue.Count > 0)
            {
                var step = _queue.Dequeue();
                list.Add(step);
            }
            var result = new EventResult(list);
            return result.ToJSON();
        }

        internal void Enqueue(BaseDelta delta)
        {
            _queue.Enqueue(delta);
        }

        /// <summary>
        /// Retrieves the element with the given ID.
        /// </summary>
        /// <param name="id">Element ID</param>
        /// <param name="element">The element.</param>
        /// <returns>True when the element was found.</returns>
        public bool TryGetElementById(string id, out Element element)
            => _map.TryGetElementById(id, out element);

        /// <summary>
        /// Retrieves the element with the given ID.
        /// </summary>
        /// <param name="id">Element ID</param>
        /// <returns>The element</returns>
        public Element GetElementById(string id)
        {
            _map.TryGetElementById(id, out var element);
            return element;
        }

        /// <summary>
        /// Returns true when there are UI changes pending to be flushed to the client
        /// </summary>
        public bool HasPendingChanges => _queue.Count > 0;

        [Obsolete("Support old methods")]
        internal void OnMessage(string key, Func<Task> handler)
        {
            Head.On("_" + key, handler);
        }

        internal void AddMessageListener(string messageId, Func<MessageEventArgs, Task> handler)
        {
            _messageRegistry.Add(messageId, handler);
        }

        internal void RemoveMessageListener(string messageId, Func<MessageEventArgs, Task> handler)
        {
            _messageRegistry.Remove(messageId, handler);
        }

        internal async Task NotifyUnload()
        {
            await _serverEvents.NotifyUnload();
            var args = new EventArgs();
            OnUnload?.Invoke(this, args);
            await OnUnloadAsync.InvokeAsync(this, args);
            UnloadComplete?.Invoke(this, new EventArgs());
            _sequencer.AbortAll();
        }

        /// <summary>
        /// Returns the current status of server-side events
        /// </summary>
        public ServerEventsStatus ServerEventsStatus
            => _serverEvents.ServerEventsStatus;

        /// <summary>
        /// Starts a server event. Call with 'using' and dispose the class returned.
        /// </summary>
        /// <returns>Disposable token</returns>
        public ServerEvent StartServerEvent()
            => _serverEvents.StartServerEvent();

        internal void ServerEventsOn()
        {
            NotifyHasEvent();
            _serverEvents.ServerEventsOn();
        }

        internal Task ServerEventsOff()
            => _serverEvents.ServerEventsOff();

        internal bool SocketRemainsOpen(string eventName)
            => _serverEvents.SocketRemainsOpen(eventName);

        internal virtual Task<TaskCompletionSource<bool>> GetSocketCompletion(WebSocket socket)
            => _serverEvents.GetSocketCompletion(socket);

        internal Task ServerEventFlush()
            => _serverEvents.ServerEventFlush();

        internal ServerEventsController GetServerEventsController()
            => _serverEvents;

        internal Task<bool> WaitForTurn(long turn) => _sequencer.WaitForTurn(turn);

        internal bool CanDiscard { get; private set; } = true;

        internal void NotifyHasEvent()
        {
            CanDiscard = false;
        }

        internal Task NotifyEvent(string eventName)
        {
            if (Events.TryGetValue(eventName, out var settings)
                && settings.Handler != null)
            {
                return settings.Handler();
            }
            return Task.CompletedTask;
        }

        /// <summary>
        /// Registers an event and associates code to execute.
        /// </summary>
        /// <param name="settings">The event's settings.</param>
        public void On(EventSettings settings)
        {
            settings = settings ?? throw new ArgumentNullException(nameof(settings));
            settings.Verify();
            RemoveEvent(settings.EventName);
            Events.Add(settings.EventName, settings);
            SubscribeDelta.Enqueue(this, settings);
        }

        /// <summary>
        /// Registers an event and associates code to execute.
        /// </summary>
        /// <param name="eventName">Name of the event.</param>
        /// <param name="handler">The handler to execute.</param>
        public void On(string eventName, Func<Task>? handler)
        {
            eventName = eventName ?? throw new ArgumentNullException(nameof(eventName));
            if (handler == null)
            {
                RemoveEvent(eventName);
            }
            else
            {
                On(new EventSettings
                {
                    EventName = eventName,
                    Handler = handler
                });
            }
        }

        private void RemoveEvent(string eventName)
        {
            if (!Events.ContainsKey(eventName)) return;
            Events.Remove(eventName);
            Enqueue(new UnsubscribeDelta
            {
                ElementId = string.Empty,
                EventName = eventName
            });
        }

    }
}


================================================
FILE: src/LaraUI/DOM/DocumentIdMap.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

using System.Collections.Generic;

namespace Integrative.Lara
{
    internal sealed class DocumentIdMap
    {
        private readonly Dictionary<string, Element> _map;

        public DocumentIdMap()
        {
            _map = new Dictionary<string, Element>();
        }

        public bool TryGetElementById(string id, out Element element)
        {
            return _map.TryGetValue(id, out element);
        }

        public void NotifyChangeId(Element element, string before, string after)
        {
            if (before == after) return;
            RemovePrevious(before);
            AddAfter(element, after);
        }

        private void RemovePrevious(string before)
        {
            _map.Remove(before);
        }

        private void AddAfter(Element element, string after)
        {
            if (_map.ContainsKey(after))
            {
                throw DuplicateElementIdException.Create(after);
            }
            _map.Add(after, element);
        }

        public void NotifyRemoved(Element element)
        {
            RemovePrevious(element.Id);
        }

        public void NotifyAdded(Element element)
        {
            AddAfter(element, element.Id);
        }
    }
}


================================================
FILE: src/LaraUI/DOM/DocumentWriter.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

using System;
using System.Globalization;
using System.Text;
using System.Web;

namespace Integrative.Lara
{
    internal sealed class DocumentWriter
    {
        public const int MaxLevelDeep = 500;

        private readonly Document? _document;
        private readonly StringBuilder _builder;

        public DocumentWriter(Document document)
            : this()
        {
            _document = document;
        }

        public DocumentWriter()
        {
            _builder = new StringBuilder();
        }

        public void Print()
        {
            if (_document == null)
            {
                return;
            }
            _builder.AppendLine("<!doctype html>");
            _builder.AppendLine("<!-- Rendered with Lara Web Engine. https://laraui.com -->");
            _builder.Append("<html");
            if (!string.IsNullOrEmpty(_document.Lang))
            {
                var lang = HttpUtility.HtmlAttributeEncode(_document.Lang);
                _builder.Append($" lang=\"{lang}\"");
            }
            _builder.AppendLine(">");
            PrintElement(_document.Head, 1);
            PrintElement(_document.Body, 1);
            _builder.AppendLine("</html>");
        }

        public void PrintElement(Element element, int indent)
        {
            VerifyNestedLevel(indent);
            if (!element.Render)
            {
                PrintStubElement(element);
            }
            else if (IsInlineElement(element))
            {
                Indent(indent);
                PrintInlineElement(element);
                _builder.AppendLine();
            }
            else
            {
                PrintRegularElement(element, indent);
            }
        }

        internal static void VerifyNestedLevel(int indent)
        {
            if (indent > MaxLevelDeep)
            {
                throw new InvalidOperationException($"Document exceeded maximum nesting level of {MaxLevelDeep.ToString(CultureInfo.CurrentCulture)}.");
            }
        }

        private static bool IsInlineElement(Element element)
        {
            var hasChildren = false;
            foreach (var child in element.GetLightChildren())
            {
                hasChildren = true;
                if (child is TextNode)
                {
                    return true;
                }
            }
            return !hasChildren;
        }

        private void PrintInlineElement(Element element)
        {
            PrintOpeningTag(element);
            if (HtmlReference.IsSelfClosingTag(element.TagName)) return;
            PrintInlineChildNodes(element);
            PrintClosingTag(element, 0);
        }

        private void PrintStubElement(Element element)
        {
            _builder.Append("<script id=\"");
            _builder.Append(HttpUtility.HtmlAttributeEncode(element.Id));
            _builder.Append("\" type=\"placeholder/lara\"></script>");
        }

        private void Indent(int indent)
        {
            for (var index = 0; index < indent; index++)
            {
                _builder.Append('\t');
            }
        }

        private void PrintOpeningTag(Element element)
        {
            _builder.Append('<');
            _builder.Append(element.TagName);
            PrintAttributes(element);
            _builder.Append('>');
        }

        private void PrintAttributes(Element element)
        {
            foreach (var pair in element.Attributes)
            {
                _builder.Append(' ');
                _builder.Append(pair.Key);
                var value = pair.Value;
                if (value == null) continue;
                _builder.Append('=');
                _builder.Append('"');
                _builder.Append(HttpUtility.HtmlAttributeEncode(value));
                _builder.Append('"');
            }
        }

        private void PrintInlineChildNodes(Element element)
        {
            foreach (var child in element.GetLightChildren())
            {
                PrintInlineNode(child);
            }
        }

        private void PrintInlineNode(Node node)
        {
            if (node is TextNode text)
            {
                _builder.Append(text.Data);
            }
            else if (node is Element element)
            {
                PrintInlineElement(element);
            }
        }

        private void PrintRegularElement(Element element, int indent)
        {
            Indent(indent);
            PrintOpeningTag(element);
            _builder.AppendLine();
            if (!HtmlReference.IsSelfClosingTag(element.TagName))
            {
                PrintChildNodes(element, indent + 1);
                PrintClosingTag(element, indent);
            }
            _builder.AppendLine();
        }

        private void PrintChildNodes(Element element, int indent)
        {
            foreach (var child in element.GetLightChildren())
            {
                PrintElement((Element)child, indent);
            }
        }

        private void PrintClosingTag(Element element, int indent)
        {
            Indent(indent);
            _builder.Append('<');
            _builder.Append('/');
            _builder.Append(element.TagName);
            _builder.Append('>');
        }

        public override string ToString()
        {
            return _builder.ToString();
        }
    }
}


================================================
FILE: src/LaraUI/DOM/DomSurgeon.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;

namespace Integrative.Lara
{
    internal sealed class DomSurgeon
    {
        private readonly Element _parent;

        public DomSurgeon(Element parent)
        {
            _parent = parent;
        }

        #region Public methods

        public void Append(Node child)
        {
            var previous = BeforeOperation(child);
            AppendInternal(child);
            AfterOperation(child, previous);
        }

        public void InsertChildBefore(Node reference, Node child)
        {
            var previous = BeforeOperation(child);
            InsertChild(reference, 0, child);
            AfterOperation(child, previous);
        }

        public void InsertChildAfter(Node reference, Node child)
        {
            var previous = BeforeOperation(child);
            InsertChild(reference, 1, child);
            AfterOperation(child, previous);
        }

        public void InsertChildAt(int index, Node child)
        {
            var previous = BeforeOperation(child);
            InsertChild(index, child);
            AfterOperation(child, previous);
        }

        public void Remove(Node child)
        {
            RemoveInternal(child);
            AfterOperation(child, _parent);
        }

        public void RemoveAt(int index)
        {
            var child = _parent.GetChildAt(index);
            RemoveInternal(index);
            AfterOperation(child, _parent);
        }

        public void ClearChildren()
        {
            var list = new List<Node>(_parent.Children);
            ClearChildrenInternal();
            foreach (var node in list)
            {
                AfterOperation(node, _parent);
            }
        }

        #endregion

        #region Connect and disconnect

        private static Element? BeforeOperation(Node child)
        {
            return child.ParentElement;
        }

        private static void AfterOperation(Node node, Node? previousParent)
        {
            if (node is Element child)
            {
                AfterOperationInternal(child, previousParent);
            }
        }

        private static void AfterOperationInternal(Element child, Node? previousParent)
        {
            var previousDocument = GetPreviousDocument(previousParent);
            if (previousDocument == child.Document)
            {
                if (previousDocument != null)
                {
                    child.NotifyMove();
                }
            }
            else if (child.Document == null)
            {
                child.NotifyDisconnect();
            }
            else if (previousDocument == null)
            {
                child.NotifyConnect();
            }
            else
            {
                child.NotifyAdopted();
            }            
        }

        private static Document? GetPreviousDocument(Node? previousParent)
        {
            return previousParent?.Document;
        }

        #endregion

        #region Operations

        private void AppendInternal(Node child)
        {
            PreventCycles(child);
            UpdateDocumentMappings(child);
            UpdateChildParentLinks(child);
        }

        private void InsertChild(Node reference, int offset, Node child)
        {
            VerifyParentContainsChild(reference);
            PreventCycles(child);
            UpdateDocumentMappings(child);
            UpdateChildParentLinks(reference, offset, child);
        }

        private void InsertChild(int index, Node child)
        {
            PreventCycles(child);
            UpdateDocumentMappings(child);
            UpdateChildParentLinks(index, child);
        }

        private void VerifyParentContainsChild(Node reference)
        {
            if (!_parent.ContainsChild(reference))
            {
                throw new InvalidOperationException(Resources.ReferenceNodeNotFound);
            }
        }

        private void RemoveInternal(Node child)
        {
            if (child.ParentElement != _parent)
            {
                throw new InvalidOperationException(Resources.NodeNotFoundInsideParent);
            }
            if (child is Element childElement)
            {
                RemoveElementDelta.Enqueue(childElement);
                RemoveInternalCommon(child);
            }
            else
            {
                var index = _parent.GetChildNodePosition(child);
                RemoveInternalCommon(child);
                NodeRemovedDelta.Enqueue(_parent, index);
            }
        }

        private void RemoveInternal(int index)
        {
            var child = _parent.GetChildAt(index);
            RemoveInternalCommon(child);
            NodeRemovedDelta.Enqueue(_parent, index);
        }

        private void ClearChildrenInternal()
        {
            while (_parent.ChildCount > 0)
            {
                var child = _parent.GetChildAt(_parent.ChildCount - 1);
                RemoveInternalCommon(child);
            }
            ClearChildrenDelta.Enqueue(_parent);
        }

        private void RemoveInternalCommon(Node child)
        {
            if (child is Element && _parent.Document != null)
            {
                var list = CollectNodes(child);
                RemoveFromPreviousDocument(list, _parent.Document);
            }
            _parent.OnChildRemoved(child);
            child.ParentElement = null;
            child.UpdateSlotted();
        }

        #endregion

        #region Prevent cycles in DOM tree

        private void PreventCycles(Node child)
        {
            if (child is Element element && _parent.DescendsFrom(element))
            {
                throw new InvalidOperationException(Resources.CannotAddInsideItself);
            }
        }

        #endregion

        #region Update parent document and ID maps

        private void UpdateDocumentMappings(Node child)
        {
            var newToDocument = NewToDocument(child, out var newDocument);
            var leavingPrevious = LeavingPrevious(child, out var previous);
            if (!newToDocument && !leavingPrevious) return;
            var list = CollectNodes(child);
            if (leavingPrevious)
            {
                RemoveFromPreviousDocument(list, previous!);
            }

            if (!newToDocument) return;
            PreventDuplicateIds(list);
            AddToDocument(list, newDocument!);
        }

        private bool NewToDocument(Node child, [NotNullWhen(true)] out Document? newDocument)
        {
            newDocument = _parent.Document;
            return newDocument != null
                   && child.Document != newDocument;
        }

        private bool LeavingPrevious(Node child, [NotNullWhen(true)] out Document? previousDocument)
        {
            previousDocument = child.Document;
            return previousDocument != null
                   && previousDocument != _parent.Document;
        }

        private static List<Node> CollectNodes(Node child)
        {
            var list = new List<Node>();
            CollectElements(list, child);
            return list;
        }

        private static void CollectElements(ICollection<Node> list, Node node)
        {
            list.Add(node);
            if (node is not Element element) return;
            foreach (var child in element.GetAllDescendants())
            {
                CollectElements(list, child);
            }
        }

        private void PreventDuplicateIds(IEnumerable<Node> list)
        {
            var document = _parent.Document;
            var hash = new HashSet<string>();
            foreach (var node in list)
            {
                if (node is not Element element || string.IsNullOrEmpty(element.Id)) continue;
                var id = element.Id;
                if (hash.Contains(id) || DuplicateIdInDocument(document, id))
                {
                    throw DuplicateElementIdException.Create(id);
                }
                hash.Add(id);
            }
        }

        private static bool DuplicateIdInDocument(Document? document, string id)
        {
            return document != null
                && document.TryGetElementById(id, out _);
        }

        private static void AddToDocument(IEnumerable<Node> list, Document document)
        {
            foreach (var node in list)
            {
                node.Document = document;
                if (node is Element element)
                {
                    document.OnElementAdded(element);
                }
            }
        }

        private static void RemoveFromPreviousDocument(IEnumerable<Node> list, Document document)
        {
            foreach (var node in list)
            {
                if (node is Element element)
                {
                    document.OnElementRemoved(element);
                }
                node.Document = null;
            }
        }

        #endregion

        #region Update Children collections and ParentElement reference

        private void UpdateChildParentLinks(Node child)
        {
            child.ParentElement?.OnChildRemoved(child);
            _parent.OnChildAppend(child);
            child.ParentElement = _parent;
            child.UpdateSlotted();
            NodeAddedDelta.Enqueue(child);
        }

        private void UpdateChildParentLinks(Node reference, int offset, Node child)
        {
            var index = _parent.GetChildNodePosition(reference) + offset;
            UpdateChildParentLinks(index, child);
        }

        private void UpdateChildParentLinks(int index, Node child)
        {
            child.ParentElement?.OnChildRemoved(child);
            _parent.OnChildInsert(index, child);
            child.ParentElement = _parent;
            child.UpdateSlotted();
            NodeInsertedDelta.Enqueue(child, index);
        }

        #endregion
    }
}


================================================
FILE: src/LaraUI/DOM/DuplicateElementIdException.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

using System;

namespace Integrative.Lara
{
    /// <summary>
    /// Exception thrown when adding a duplicate element ID into a document
    /// </summary>
    /// <seealso cref="System.InvalidOperationException" />
    public class DuplicateElementIdException : InvalidOperationException
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="DuplicateElementIdException"/> class.
        /// </summary>
        // ReSharper disable once UnusedMember.Global
        public DuplicateElementIdException()
        {
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="DuplicateElementIdException"/> class.
        /// </summary>
        /// <param name="message">The message that describes the error.</param>
        // ReSharper disable once MemberCanBePrivate.Global
        public DuplicateElementIdException(string message)
            : base(message)
        {
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="DuplicateElementIdException"/> class.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="inner">The inner.</param>
        public DuplicateElementIdException(string message, Exception inner)
            : base(message, inner)
        {
        }

        /// <summary>
        /// Creates a DuplicateElementId exception
        /// </summary>
        /// <param name="id">The identifier that is duplicate.</param>
        /// <returns>Exception created</returns>
        public static DuplicateElementIdException Create(string id)
        {
            var message = $"Duplicate element Id: {id}";
            return new DuplicateElementIdException(message);
        }
    }
}


================================================
FILE: src/LaraUI/DOM/Element.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Integrative.Lara
{
    /// <summary>
    /// An Element node inside an HTML5 document
    /// </summary>
    /// <seealso cref="Node" />
    public abstract class Element : Node
    {
        private readonly Attributes _attributes;
        private readonly List<Node> _children;

        internal Dictionary<string, EventSettings> Events { get; }

        private string _id;

        /// <summary>
        /// Element's tag name
        /// </summary>
        /// <value>
        /// The element's tag name
        /// </value>
        public string TagName { get; }

        /// <summary>
        /// Creates an element
        /// </summary>
        /// <param name="tagName">Element's tag name.</param>
        /// <returns>Element created</returns>
        public static Element Create(string tagName) => ElementFactory.CreateElement(tagName);

        /// <summary>
        /// Creates an element
        /// </summary>
        /// <param name="tagName">Element's tag name.</param>
        /// <param name="id">The identifier.</param>
        /// <returns>Element created</returns>
        public static Element Create(string tagName, string id) => ElementFactory.CreateElement(tagName, id);

        /// <summary>
        /// Creates a namespace-specific HTML5 element (e.g. SVG elements)
        /// </summary>
        /// <param name="ns">The namespace of the element</param>
        /// <param name="tagName">Element's tag name.</param>
        /// <returns>Element created</returns>
        // ReSharper disable once InconsistentNaming
        public static Element CreateNS(string ns, string tagName) => ElementFactory.CreateElementNs(ns, tagName);

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="tagName">element tag</param>
        protected Element(string tagName)
        {
            if (string.IsNullOrWhiteSpace(tagName))
            {
                tagName = GetDefaultTagName(GetType());
            }
            TagName = tagName.ToLowerInvariant();
            _id = GlobalSerializer.GenerateElementId();
            _attributes = new Attributes(this);
            _children = new List<Node>();
            Events = new Dictionary<string, EventSettings>();
        }

        /// <summary>
        /// Constructor
        /// </summary>
        protected Element() : this("")
        {
        }

        /// <summary>
        /// Returns a default/suggested tag name for a type
        /// </summary>
        /// <param name="type">object type</param>
        /// <returns>default/suggested tag name</returns>
        public static string GetDefaultTagName(Type type)
        {
            var name = type.FullName ?? throw new ArgumentException("Invalid type name");
            var tail = name.Replace('.', '-').ToLowerInvariant();
            return $"x-{tail}";
        }

        /// <summary>
        /// Gets the type of the node.
        /// </summary>
        /// <value>
        /// The type of the node.
        /// </value>
        public sealed override NodeType NodeType => NodeType.Element;

        /// <summary>
        /// Converts to string.
        /// </summary>
        /// <returns>
        /// A <see cref="string" /> that represents this instance.
        /// </returns>
        public override string ToString()
        {
            var suffix = Class;
            if (string.IsNullOrEmpty(suffix))
            {
                suffix = string.Empty;
            }
            else
            {
                suffix = " " + suffix;
            }
            return string.IsNullOrEmpty(_id) ? TagName : $"{TagName} #{_id}{suffix}";
        }

        /// <summary>
        /// Returns the ID by assigning one if needed
        /// </summary>
        /// <returns></returns>
        [Obsolete("Not needed anymore")]
        [EditorBrowsable(EditorBrowsableState.Never)]
        public string EnsureElementId() => Id;

        #region Attributes

        /// <summary>
        /// Gets or sets the identifier.
        /// </summary>
        /// <value>
        /// The identifier.
        /// </value>
        public string Id
        {
            get => _id;
            set
            {
                if (value == _id)
                {
                    return;
                }
                if (string.IsNullOrWhiteSpace(value))
                {
                    throw new InvalidOperationException("Element IDs cannot be empty");
                }
                Document?.NotifyChangeId(this, _id, value);
                _attributes.SetAttributeLower("id", value);
                _id = value;
            }
        }

        /// <summary>
        /// Sets an attribute and its value.
        /// </summary>
        /// <param name="attributeName">The name of the attribute.</param>
        /// <param name="attributeValue">The value of the attribute.</param>
        public void SetAttribute(string attributeName, string? attributeValue)
        {
            attributeName = attributeName ?? throw new ArgumentNullException(nameof(attributeName));
            SetAttributeLower(attributeName.ToLowerInvariant(), attributeValue);
        }

        internal void SetAttributeLower(string nameLower, string? value)
        {
            if (nameLower == "id")
            {
                if (string.IsNullOrWhiteSpace(value))
                {
                    throw new ArgumentException("Element IDs cannot be empty");
                }
                Id = value;
            }
            else
            {
                _attributes.SetAttributeLower(nameLower, value);
            }
        }

        internal void ToggleAttributeLower(string nameLower, bool value)
        {
            if (value)
            {
                SetAttributeLower(nameLower, "");
            }
            else
            {
                RemoveAttribute(nameLower);
            }
        }

        /// <summary>
        /// Determines whether the element has the given attribute
        /// </summary>
        /// <param name="attributeName">The name of the attribute.</param>
        /// <returns>
        ///   <c>true</c> if the element has the specified attribute; otherwise, <c>false</c>.
        /// </returns>
        public bool HasAttribute(string attributeName)
        {
            attributeName = attributeName ?? throw new ArgumentNullException(nameof(attributeName));
            return _attributes.HasAttribute(attributeName);
        }

        internal bool HasAttributeLower(string nameLower)
            => _attributes.HasAttributeLower(nameLower);

        /// <summary>
        /// Gets the value of an attribute.
        /// </summary>
        /// <param name="attributeName">The name of the attribute</param>
        /// <returns>Value of the attribute</returns>
        public string? GetAttribute(string attributeName)
        {
            attributeName = attributeName ?? throw new ArgumentNullException(nameof(attributeName));
            return _attributes.GetAttribute(attributeName);
        }

        internal string? GetAttributeLower(string nameLower)
            => _attributes.GetAttributeLower(nameLower);

        /// <summary>
        /// Adds or removes a flag attribute
        /// </summary>
        /// <param name="attributeName">Attribute's name</param>
        /// <param name="value">true to add, false to remove</param>
        public void SetFlagAttribute(string attributeName, bool value)
        {
            attributeName = attributeName ?? throw new ArgumentNullException(nameof(attributeName));
            _attributes.SetFlagAttributeLower(attributeName.ToLowerInvariant(), value);
        }

        internal void SetFlagAttributeLower(string nameLower, bool value)
            => _attributes.SetFlagAttributeLower(nameLower, value);

        /// <summary>
        /// Removes an attribute.
        /// </summary>
        /// <param name="attributeName">The name of the attribute.</param>
        public void RemoveAttribute(string attributeName)
        {
            attributeName = attributeName ?? throw new ArgumentNullException(nameof(attributeName));
            attributeName = attributeName.ToLowerInvariant();
            if (attributeName == "id")
            {
                throw new InvalidOperationException("Cannot remove element ID attribute");
            }

            _attributes.RemoveAttributeLower(attributeName);
        }

        internal int? GetIntAttribute(string nameLower)
        {
            if (int.TryParse(GetAttributeLower(nameLower), out var value))
            {
                return value;
            }

            return null;
        }

        internal void SetIntAttribute(string nameLower, int? value)
        {
            if (value == null)
            {
                _attributes.RemoveAttributeLower(nameLower);
            }
            else
            {
                var text = ((int)value).ToString(CultureInfo.InvariantCulture);
                SetAttributeLower(nameLower, text);
            }
        }

        /// <summary>
        /// Gets the attributes.
        /// </summary>
        /// <value>
        /// The attributes.
        /// </value>
        public IEnumerable<KeyValuePair<string, string>> Attributes => _attributes;

        /// <summary>
        /// Determines whether the 'class' attribute contains the specified class.
        /// </summary>
        /// <param name="className">Name of the class.</param>
        /// <returns>
        ///   <c>true</c> if the specified class is found; otherwise, <c>false</c>.
        /// </returns>
        public bool HasClass(string className) => ClassEditor.HasClass(Class, className);

        /// <summary>
        /// Adds the given class name to the 'class' attribute.
        /// </summary>
        /// <param name="className">Name of the class.</param>
        public void AddClass(string className) => Class = ClassEditor.AddClass(Class, className);

        /// <summary>
        /// Removes the given class name from the 'class' attribute.
        /// </summary>
        /// <param name="className">Name of the class.</param>
        public void RemoveClass(string className) => Class = ClassEditor.RemoveClass(Class, className);

        /// <summary>
        /// Adds or removes the given class name from the 'class' attribute.
        /// </summary>
        /// <param name="className">Name of the class.</param>
        /// <param name="value">true to add the class, false to remove.</param>
        public void ToggleClass(string className, bool value)
            => Class = ClassEditor.ToggleClass(Class, className, value);

        /// <summary>
        /// Toggles (adds or removes) the class passed in parameters
        /// </summary>
        /// <param name="className">Class name to toggle</param>
        public void ToggleClass(string className) => Class = ClassEditor.ToggleClass(Class, className);

        internal void NotifyValue(string value) => _attributes.NotifyValue(value);

        internal void NotifyChecked(bool value) => _attributes.NotifyChecked(value);

        internal void NotifySelected(bool value) => _attributes.NotifySelected(value);

        #endregion

        #region Global attributes

        /// <summary>
        /// The 'accesskey' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The access key.
        /// </value>
        public virtual string? AccessKey
        {
            get => GetAttributeLower("accesskey");
            set => SetAttributeLower("accesskey", value);
        }

        /// <summary>
        /// The 'autocapitalize' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The automatic capitalize.
        /// </value>
        // ReSharper disable once UnusedMember.Global
        public virtual string? AutoCapitalize
        {
            get => GetAttributeLower("autocapitalize");
            set => SetAttributeLower("autocapitalize", value);
        }

        /// <summary>
        /// The 'class' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The class.
        /// </value>
        public virtual string? Class
        {
            get => GetAttributeLower("class");
            set => SetAttributeLower("class", value);
        }

        /// <summary>
        /// The 'contenteditable' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The content editable.
        /// </value>
        public virtual string? ContentEditable
        {
            get => GetAttributeLower("contenteditable");
            set => SetAttributeLower("contenteditable", value);
        }

        /// <summary>
        /// The 'contextmenu' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The context menu.
        /// </value>
        // ReSharper disable once UnusedMember.Global
        public virtual string? ContextMenu
        {
            get => GetAttributeLower("contextmenu");
            set => SetAttributeLower("contextmenu", value);
        }

        /// <summary>
        /// The 'dir' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The dir.
        /// </value>
        public virtual string? Dir
        {
            get => GetAttributeLower("dir");
            set => SetAttributeLower("dir", value);
        }

        /// <summary>
        /// The 'draggable' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The draggable.
        /// </value>
        public virtual string? Draggable
        {
            get => GetAttributeLower("draggable");
            set => SetAttributeLower("draggable", value);
        }

        /// <summary>
        /// The 'dropzone' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The drop zone.
        /// </value>
        public virtual string? DropZone
        {
            get => GetAttributeLower("dropzone");
            set => SetAttributeLower("dropzone", value);
        }

        /// <summary>
        /// The 'hidden' HTML5 attribute.
        /// </summary>
        /// <value>
        ///   <c>true</c> if hidden; otherwise, <c>false</c>.
        /// </value>
        public virtual bool Hidden
        {
            get => HasAttributeLower("hidden");
            set => SetFlagAttributeLower("hidden", value);
        }

        /// <summary>
        /// The 'inputmode' HTML5 attribute.
        /// </summary>
        /// <value>
        ///   <c>true</c> if [input mode]; otherwise, <c>false</c>.
        /// </value>
        // ReSharper disable once UnusedMember.Global
        public virtual bool InputMode
        {
            get => HasAttributeLower("inputmode");
            set => SetFlagAttributeLower("inputmode", value);
        }

        /// <summary>
        /// The 'lang' HTML5 attribute
        /// </summary>
        /// <value>
        /// The language.
        /// </value>
        public virtual string? Lang
        {
            get => GetAttributeLower("lang");
            set => SetAttributeLower("lang", value);
        }

        /// <summary>
        /// The 'spellcheck' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The spellcheck.
        /// </value>
        public virtual string? Spellcheck
        {
            get => GetAttributeLower("spellcheck");
            set => SetAttributeLower("spellcheck", value);
        }

        /// <summary>
        /// The 'style' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The style.
        /// </value>
        public virtual string? Style
        {
            get => GetAttributeLower("style");
            set => SetAttributeLower("style", value);
        }

        /// <summary>
        /// The 'tabindex' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The index of the tab.
        /// </value>
        public virtual string? TabIndex
        {
            get => GetAttributeLower("tabindex");
            set => SetAttributeLower("tabindex", value);
        }

        /// <summary>
        /// The 'title' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The title.
        /// </value>
        public virtual string? Title
        {
            get => GetAttributeLower("title");
            set => SetAttributeLower("title", value);
        }

        /// <summary>
        /// The 'translate' HTML5 attribute.
        /// </summary>
        /// <value>
        /// The translate.
        /// </value>
        public virtual string? Translate
        {
            get => GetAttributeLower("translate");
            set => SetAttributeLower("translate", value);
        }

        #endregion

        #region DOM tree queries

        /// <summary>
        /// Element's child nodes
        /// </summary>
        /// <value>
        /// The children.
        /// </value>
        public IEnumerable<Node> Children
        {
            get => _children;
            set
            {
                if (_children.Equals(value)) return;
                var list = value.ToArray();
                BeginUpdate();
                ClearChildren();
                AppendChild(list);
                EndUpdate();
            }
        }

        /// <summary>
        /// Returns the number of child nodes.
        /// </summary>
        /// <value>
        /// The child count.
        /// </value>
        public int ChildCount => _children.Count;

        /// <summary>
        /// Gets the child at the given index.
        /// </summary>
        /// <param name="index">The index of the child.</param>
        /// <returns>Child node at the given index</returns>
        public Node GetChildAt(int index) => _children[index];

        /// <summary>
        /// Searches for a direct child node and returns its index in the list of child nodes.
        /// </summary>
        /// <param name="node">The node to search for.</param>
        /// <returns>The 0-based child index, or -1 if not found.</returns>
        public int GetChildNodePosition(Node node)
        {
            var index = 0;
            foreach (var child in _children)
            {
                if (child == node)
                {
                    return index;
                }
                index++;
            }
            return -1;
        }

        /// <summary>
        /// Searches for a direct child element and returns its index in the list of child elements.
        /// </summary>
        /// <param name="element">The element to search for.</param>
        /// <returns>The 0-based child index, or -1 if not found.</returns>
        public int GetChildElementPosition(Element element)
        {
            var index = 0;
            foreach (var child in _children)
            {
                if (child == element)
                {
                    return index;
                }

                if (child is Element)
                {
                    index++;
                }
            }
            return -1;
        }

        /// <summary>
        /// Verifies whether an element descends from another.
        /// </summary>
        /// <param name="element">The element that may be a parent.</param>
        /// <returns>True if the current element descends from the given element.</returns>
        public bool DescendsFrom(Element? element)
        {
            if (this == element)
            {
                return true;
            }

            if (element == null || ParentElement == null)
            {
                return false;
            }
            return ParentElement == element || ParentElement.DescendsFrom(element);
        }

        /// <summary>
        /// Determines whether the node is a direct child.
        /// </summary>
        /// <param name="node">The node.</param>
        /// <returns>
        ///   <c>true</c> if the specified node is a child; otherwise, <c>false</c>.
        /// </returns>
        public bool ContainsChild(Node node)
        {
            return _children.Contains(node);
        }

        #endregion

        #region DOM operations

        internal void OnChildRemoved(Node child)
        {
            _children.Remove(child);
        }

        internal void OnChildAppend(Node child)
        {
            _children.Add(child);
        }

        internal void OnChildInsert(int index, Node child)
        {
            _children.Insert(index, child);
        }

        /// <summary>
        /// Appends a child node.
        /// </summary>
        /// <param name="nodes">The node to append.</param>
        public void AppendChild(params Node[] nodes)
        {
            BeginUpdate();
            var append = new DomSurgeon(this);
            foreach (var node in nodes)
            {
                append.Append(node);
                OnChildAdded(node);
            }
            EndUpdate();
        }

        /// <summary>
        /// Appends text inside an element.
        /// When the element's last child is a text node, the text is appended to that node.
        /// Otherwise, a new child text node is added to the element.
        /// </summary>
        /// <param name="text">Text of the node</param>
        public void AppendText(string text)
        {
            AppendEncode(text, true);
        }

        /// <summary>
        /// Appends raw HTML inside an element. The HTML won't be verified or parsed by Lara.
        /// </summary>
        /// <param name="data">raw HTML</param>
        public void AppendData(string data)
        {
            AppendEncode(data, false);
        }

        internal void AppendEncode(string? data, bool encode)
        {
            var count = _children.Count;
            if (count > 0 && _children[count - 1] is TextNode node)
            {
                node.AppendEncode(data, encode);
            }
            else
            {
                AppendChild(new TextNode(data, encode));
            }
        }

        /// <summary>
        /// Inserts a child node, right before the specified node.
        /// </summary>
        /// <param name="before">The node that is before.</param>
        /// <param name="node">The node to insert.</param>
        public void InsertChildBefore(Node before, Node node)
        {
            var append = new DomSurgeon(this);
            append.InsertChildBefore(before, node);
            OnChildAdded(node);
        }

        /// <summary>
        /// Inserts a child node, right after the specified node.
        /// </summary>
        /// <param name="after">The node that is after.</param>
        /// <param name="node">The node to insert.</param>
        public void InsertChildAfter(Node after, Node node)
        {
            var append = new DomSurgeon(this);
            append.InsertChildAfter(after, node);
            OnChildAdded(node);
        }

        /// <summary>
        /// Inserts a node at a given index position
        /// </summary>
        /// <param name="index">0-based index position</param>
        /// <param name="node">Node to insert</param>
        public void InsertChildAt(int index, Node node)
        {
            var append = new DomSurgeon(this);
            append.InsertChildAt(index, node);
            OnChildAdded(node);
        }

        /// <summary>
        /// Removes a child.
        /// </summary>
        /// <param name="child">The child.</param>
        public void RemoveChild(Node child)
        {
            var remover = new DomSurgeon(this);
            remover.Remove(child);
        }

        /// <summary>
        /// Removes the child at the given index position
        /// </summary>
        /// <param name="index">Index position</param>
        public void RemoveAt(int index)
        {
            var remover = new DomSurgeon(this);
            remover.RemoveAt(index);
        }

        /// <summary>
        /// Removes all child nodes.
        /// </summary>
        public void ClearChildren()
        {
            var remover = new DomSurgeon(this);
            remover.ClearChildren();
            OnPropertyChanged(nameof(Children));
        }

        /// <summary>
        /// Removes this node from its parent.
        /// </summary>
        /// <exception cref="InvalidOperationException">Cannot remove from parent, the node has no parent element already</exception>
        public void Remove()
        {
            if (ParentElement == null)
            {
                throw new InvalidOperationException(Resources.CannotRemoveNoParent);
            }
            ParentElement.RemoveChild(this);
        }

        /// <summary>
        /// Swaps two child nodes within the element
        /// </summary>
        /// <param name="index1">Index of 1st node</param>
        /// <param name="index2">Index of 2nd node</param>
        public void SwapChildren(int index1, int index2)
        {
            if (index1 == index2)
            {
                return;
            }
            var temp = _children[index1];
            _children[index1] = _children[index2];
            _children[index2] = temp;
            SwapChildrenDelta.Enqueue(this, index1, index2);
        }

        internal virtual void NotifyValue(ElementEventValue entry)
        {
        }

        private protected virtual void OnChildAdded(Node child)
        {
            OnPropertyChanged(nameof(Children));
        }

        /// <summary>
        /// Occurs when the element is connected to the document's DOM.
        /// </summary>
        protected virtual void OnConnect()
        {
        }

        /// <summary>
        /// Occurs when the element is disconnected from the document's DOM.
        /// </summary>
        protected virtual void OnDisconnect()
        {
        }

        /// <summary>
        /// Occurs when the element is moved from one document to another.
        /// </summary>
        protected virtual void OnAdopted()
        {
        }

        /// <summary>
        /// Occurs when the element or one of its containing elements is moved within the same document's DOM.
        /// </summary>
        protected virtual void OnMove()
        {
        }

        internal void NotifyConnect()
        {
            FlushEvents();
            OnConnect();
            foreach (var child in GetNotifyList())
            {
                child.NotifyConnect();
            }
        }

        internal void NotifyDisconnect()
        {
            OnDisconnect();
            foreach (var child in GetNotifyList())
            {
                child.NotifyDisconnect();
            }
        }

        internal void NotifyAdopted()
        {
            OnAdopted();
            foreach (var child in GetNotifyList())
            {
                child.NotifyAdopted();
            }
        }

        internal void NotifyMove()
        {
            OnMove();
            foreach (var child in GetNotifyList())
            {
                child.NotifyMove();
            }
        }

        internal virtual IEnumerable<Element> GetNotifyList()
        {
            foreach (var node in _children)
            {
                if (node is Element child)
                {
                    yield return child;
                }
            }
        }

        #endregion

        #region Generate Delta content

        internal override ContentNode GetContentNode()
        {
            if (!Render)
            {
                return GetUnrenderedContent();
            }
            return GetRenderedContent();
        }

        private ContentNode GetUnrenderedContent()
        {
            if (IsPrintable && IsSlotted)
            {
                return new ContentPlaceholder(Id);
            }
            else
            {
                return new ContentArrayNode { Nodes = new List<ContentNode>() };
            }
        }

        private ContentNode GetRenderedContent()
        {
            var list = new List<Node>(GetLightSlotted());
            if (list.Count == 1 && list[0] == this)
            {
                return GetElementContent();
            }
            return GetArrayContent(list);
        }

        private ContentNode GetArrayContent(List<Node> list)
        {
            var array = new ContentArrayNode
            {
                Nodes = new List<ContentNode>()
            };
            foreach (var node in list)
            {
                array.Nodes.Add(node.GetContentNode());
            }
            return array;
        }

        private ContentElementNode GetElementContent()
        {
            return new ContentElementNode
            {
                TagName = TagName,
                NS = GetAttributeLower("xlmns"),
                Attributes = CopyAttributes(),
                Children = CopyLightChildren()
            };
        }

        private List<ContentAttribute> CopyAttributes()
        {
            var list = new List<ContentAttribute>();
            foreach (var pair in _attributes)
            {
                list.Add(new ContentAttribute
                {
                    Attribute = pair.Key,
                    Value = pair.Value
                });
            }
            return list;
        }

        private List<ContentNode> CopyLightChildren()
        {
            var list = new List<ContentNode>();
            foreach (var child in GetLightChildren())
            {
                list.Add(child.GetContentNode());
            }
            return list;
        }

        #endregion

        #region Subscribe to events

        internal Task NotifyEvent(string eventName)
        {
            if (Events.TryGetValue(eventName, out var settings)
                && settings.Handler != null)
            {
                return settings.Handler();
            }
            return Task.CompletedTask;
        }

        /// <summary>
        /// Registers an event and associates code to execute.
        /// </summary>
        /// <param name="settings">The event's settings.</param>
        public void On(EventSettings settings)
        {
            settings = settings ?? throw new ArgumentNullException(nameof(settings));
            settings.Verify();
            RemoveEvent(settings.EventName);
            Events.Add(settings.EventName, settings);
            if (Document != null)
            {
                SubscribeDelta.Enqueue(this, settings);
            }
        }

        /// <summary>
        /// Registers an event and associates code to execute.
        /// </summary>
        /// <param name="eventName">Name of the event.</param>
        /// <param name="handler">The handler to execute.</param>
        public void On(string eventName, Func<Task>? handler)
        {
            eventName = eventName ?? throw new ArgumentNullException(nameof(eventName));
            if (handler == null)
            {
                RemoveEvent(eventName);
            }
            else
            {
                On(new EventSettings
                {
                    EventName = eventName,
                    Handler = handler
                });
            }
        }

        /// <summary>
        /// Registers an event and associates code to execute.
        /// </summary>
        /// <param name="eventName">Name of the event.</param>
        /// <param name="handler">The handler to execute.</param>
        public void On(string eventName, Action? handler)
        {
            eventName = eventName ?? throw new ArgumentNullException(nameof(eventName));
            if (handler == null)
            {
                RemoveEvent(eventName);
            }
            else
            {
                On(new EventSettings
                {
                    EventName = eventName,
                    Handler = () =>
                    {
                        handler();
                        return Task.CompletedTask;
                    }
                });
            }
        }

        private void RemoveEvent(string eventName)
        {
            if (!Events.ContainsKey(eventName)) return;
            Events.Remove(eventName);
            Document?.Enqueue(new UnsubscribeDelta
            {
                ElementId = Id,
                EventName = eventName
            });
        }

        private void FlushEvents()
        {
            foreach (var settings in Events.Values)
            {
                SubscribeDelta.Enqueue(this, settings);
            }
        }

        #endregion

        #region Binding

        private HashSet<BindingSubscription>? _subscriptions;

        private ChildrenBindingSubscription? _childrenBinding;

        private int _applyingBinding;
        private const int MaxApplyLevel = 5;

        internal void AddSubscription(INotifyPropertyChanged source, Action action)
        {
            _subscriptions ??= new HashSet<BindingSubscription>();
            action();
            _subscriptions.Add(new BindingSubscription(source, (_, _) =>
            {
                if (_applyingBinding > MaxApplyLevel)
                {
                    throw new InvalidOperationException("Cycle detected when applying updates on bindings");
                }
                _applyingBinding++;
                action();
                _applyingBinding--;
            }));
        }

        internal void SubscribeChildren(
            INotifyCollectionChanged source,
            NotifyCollectionChangedEventHandler handler)
        {
            _childrenBinding?.Unsubscribe();
            _childrenBinding = new ChildrenBindingSubscription(handler, source);
        }

        private void ClearSubscriptions()
        {
            _childrenBinding?.Unsubscribe();
            if (_subscriptions == null) return;
            foreach (var item in _subscriptions)
            {
                item.Unsubscribe();
            }
            _subscriptions.Clear();
        }

        /// <summary>
        /// Removes all bindings for the element
        /// </summary>
        public void UnbindAll()
        {
            ClearSubscriptions();
        }

        /// <summary>
        /// Clears all child nodes and replaces them with raw HTML code. The HTML won't be parsed by Lara.
        /// </summary>
        /// <param name="data">raw HTML</param>
        public void SetInnerData(string data)
        {
            SetInnerEncode(data, false);
        }

        internal void SetInnerEncode(string? value, bool encode)
        {
            if (_children.Count == 1 && _children[0] is TextNode node)
            {
                if (encode)
                {
                    node.SetEncodedText(value);
                }
                else
                {
                    node.Data = value;
                }
            }
            else
            {
                ClearChildren();
                AppendEncode(value, encode);
            }
        }

        internal override string? GetNodeInnerText()
        {
            if (ChildCount == 0)
            {
                return string.Empty;
            }

            if (ChildCount == 1)
            {
                return GetChildAt(0).InnerText;
            }
            var builder = new StringBuilder();
            AppendNodeInnerText(builder);
            return builder.ToString();
        }

        internal override void AppendNodeInnerText(StringBuilder builder)
        {
            foreach (var child in Children)
            {
                child.AppendNodeInnerText(builder);
            }
        }

        internal override void SetNodeInnerText(string? value)
        {
            SetInnerEncode(value, true);
        }

        #endregion

        #region Component-related

        private bool _render = true;

        /// <summary>
        /// Set to false to prevent the element from rendering on the client's document
        /// </summary>
        public bool Render
        {
            get => _render;
            set
            {
                if (value == _render) return;
                SetProperty(ref _render, value);
                if (Document == null || !IsSlotted) return;
                var light = GetLightSlotted();
                if (_render)
                {
                    RenderDelta.Enqueue(Document, light);
                }
                else
                {
                    UnRenderDelta.Enqueue(Document, light);
                }
            }
        }

        internal virtual IEnumerable<Node> GetLightSlotted()
        {
            yield return this;
        }

        internal IEnumerable<Node> GetLightChildren()
        {
            foreach (var node in Children)
            {
                if (node is Element childElement)
                {
                    foreach (var light in childElement.GetLightSlotted())
                    {
                        yield return light;
                    }
                }
                else
                {
                    yield return node;
                }
            }
        }

        internal virtual IEnumerable<Node> GetAllDescendants()
        {
            return Children;
        }

        internal virtual void AttributeChanged(string attribute, string? value)
        {
            OnPropertyChanged(attribute);
        }

        internal bool TryGetQueue([NotNullWhen(true)] out Document? document)
        {
            return TryGetEvents(out document)
                && document != null
                && document.QueueingEvents;
        }

        internal bool TryGetEvents([NotNullWhen(true)] out Document? document)
        {
            document = Document;
            return document != null
                   && IsSlotted
                   && IsPrintable
                   && Render;
        }

        #endregion

        #region Other methods

        /// <summary>
        /// Focuses this element.
        /// </summary>
        // ReSharper disable once VirtualMemberNeverOverridden.Global
        public virtual void Focus()
        {
            if (Document == null)
            {
                throw new InvalidOperationException(Resources.FocusDisconnected);
            }
            FocusDelta.Enqueue(this);
        }

        /// <summary>
        /// Calculates and returns the HTML code of the element
        /// </summary>
        /// <returns>HTML code</returns>
        public string GetHtml()
        {
            var writer = new DocumentWriter();
            writer.PrintElement(this, 0);
            return writer.ToString();
        }

        #endregion
    }
}


================================================
FILE: src/LaraUI/DOM/ElementFactory.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 5/2019
Author: Pablo Carbonell
*/

using System;
using System.Collections.Generic;

namespace Integrative.Lara
{
    internal static class ElementFactory
    {
        private readonly static Dictionary<string, Func<Element>> _Creators
            = new Dictionary<string, Func<Element>>
            {
                { "a", () => new HtmlAnchorElement() },
                { "body", () => new HtmlBodyElement() },
                { "button", () => new HtmlButtonElement() },
                { "colgroup", () => new HtmlColGroupElement() },
                { "div", () => new HtmlDivElement() },
                { "h1", () => new HtmlHeadingElement(1) },
                { "h2", () => new HtmlHeadingElement(2) },
                { "h3", () => new HtmlHeadingElement(3) },
                { "h4", () => new HtmlHeadingElement(4) },
                { "h5", () => new HtmlHeadingElement(5) },
                { "h6", () => new HtmlHeadingElement(6) },
                { "head", () => new HtmlHeadElement() },
                { "img", () => new HtmlImageElement() },
                { "input", () => new HtmlInputElement() },
                { "label", () => new HtmlLabelElement() },
                { "link", () => new HtmlLinkElement() },
                { "li", () => new HtmlLiElement() },
                { "meta", () => new HtmlMetaElement() },
                { "meter", () => new HtmlMeterElement() },
                { "option", () => new HtmlOptionElement() },
                { "optgroup", () => new HtmlOptionGroupElement() },
                { "ol", () => new HtmlOlElement() },
                { "p", () => new HtmlParagraphElement() },
                { "script", () => new HtmlScriptElement() },
                { "select", () => new HtmlSelectElement() },
                { "slot", () => new Slot() },
                { "span", () => new HtmlSpanElement() },
                { "table", () => new HtmlTableElement() },
                { "tbody", () => new HtmlTableSectionElement(HtmlTableSectionType.Body) },
                { "thead", () => new HtmlTableSectionElement(HtmlTableSectionType.Head) },
                { "tfoot", () => new HtmlTableSectionElement(HtmlTableSectionType.Foot) },
                { "td", () => new HtmlTableCellElement() },
                { "th", () => new HtmlTableHeaderElement() },
            };

        public static Element CreateElement(string tagName)
        {
            tagName = VerifyTagName(tagName);

            if (_Creators.TryGetValue(tagName, out var creator))
            {
                return creator();
            }
            if (LaraUI.Context.Application.TryGetComponent(tagName, out var type))
            {
                return (Element)Activator.CreateInstance(type);
            }

            return new GenericElement(tagName);
        }

        private static string VerifyTagName(string tagName)
        {
            if (string.IsNullOrEmpty(tagName))
            {
                throw new ArgumentException(Resources.InvalidTagName);
            }

            if (tagName.Contains(' ', StringComparison.InvariantCulture))
            {
                throw new ArgumentException(Resources.TagNameSpaces);
            }

            return tagName.ToLowerInvariant();
        }

        public static Element CreateElement(string tagName, string id)
        {
            var element = CreateElement(tagName);
            element.Id = id;
            return element;
        }

        public static Element CreateElementNs(string ns, string tagName)
        {
            var element = CreateElement(tagName);
            element.SetAttribute("xlmns", ns);
            return element;
        }
    }
}


================================================
FILE: src/LaraUI/DOM/EventSettings.cs
================================================
/*
Copyright (c) 2019-2021 Integrative Software LLC
Created: 6/2019
Author: Pablo Carbonell
*/

using System;
using System.Threading.Tasks;

namespace Integrative.Lara
{
    /// <summary>
    /// Propagation options for client events
    /// </summary>
    public enum PropagationType
    {
        /// <summary>
        /// Uses the 'StopPropagation' option
        /// </summary>
        Default = 0,

        /// <summary>
        /// Prevents the event to bubble up to parent elements
        /// </summary>
        StopPropagation = 1,

        /// <summary>
        /// Prevents the event to bubble up to parent elements or any other handler
        /// </summary>
        StopImmediatePropagation = 2,

        /// <summary>
        /// Allows event propagation
        /// </summary>
        AllowAll = 3
    }

    /// <summary>
    /// Specifies settings to declare an event and associate execution code to it.
    /// </summary>
    public sealed class EventSettings
    {
        /// <summary>
        /// Name of the HTML5 event (e.g. 'click')
        /// </summary>
        /// <value>
        /// The name of the event.
        /// </value>
        public string EventName { get; set; } = string.Empty;

        /// <summary>
        /// Specifies an interval in millisenconds to postpone and hold an event while it gets triggered repeatedly.
        /// The resulting 'debounced' event will execute only after it has not been triggered for the interval specified.
        /// </summary>
        public int DebounceInterval { get; set; }

        /// <summary>
        /// Block UI input while the event is executing? Default is true
        /// </summary>
        /// <value>
        ///   <c>true</c> if block; otherwise, <c>false</c>.
        /// </value>
        public bool Block { get; set; } = true;

        /// <summary>
        /// Gets or sets 
Download .txt
gitextract_6r9zre1z/

├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
└── src/
    ├── Boilerplate/
    │   ├── Program.cs
    │   ├── Wiki/
    │   │   ├── ComponentPropertyExample.cs
    │   │   ├── ComposingComponent.cs
    │   │   ├── ConditionalRenderComponent.cs
    │   │   ├── DocumentContextExample.cs
    │   │   ├── HttpContextExample.cs
    │   │   ├── LoopComponent.cs
    │   │   ├── RedBoxExample.cs
    │   │   ├── SimpleComponent.cs
    │   │   ├── UserInputComponent.cs
    │   │   └── UserTextComponent.cs
    │   └── WikiExamples.csproj
    ├── LaraClient/
    │   ├── .eslintignore
    │   ├── .eslintrc
    │   ├── .prettierrc
    │   ├── LaraClient.njsproj
    │   ├── README.md
    │   ├── dist/
    │   │   └── lara-client.js.LICENSE.txt
    │   ├── package.json
    │   ├── src/
    │   │   ├── Autocomplete.ts
    │   │   ├── Blocker.ts
    │   │   ├── ContentInterfaces.ts
    │   │   ├── DeltaInterfaces.ts
    │   │   ├── Initializer.ts
    │   │   ├── InputCollector.ts
    │   │   ├── RegisteredEvents.ts
    │   │   ├── Sequencer.ts
    │   │   ├── SocketEvents.ts
    │   │   ├── Worker.ts
    │   │   ├── custom.d.ts
    │   │   └── index.ts
    │   └── tsconfig.json
    ├── LaraClient.sln
    ├── LaraDocumentation/
    │   ├── Content/
    │   │   └── Welcome.aml
    │   ├── ContentLayout.content
    │   └── LaraDocumentation.shfbproj
    ├── LaraUI/
    │   ├── .gitignore
    │   ├── Autocomplete/
    │   │   ├── AutocompleteElement.cs
    │   │   ├── AutocompleteEntry.cs
    │   │   ├── AutocompleteOptions.cs
    │   │   ├── AutocompletePayload.cs
    │   │   ├── AutocompleteRegistry.cs
    │   │   ├── AutocompleteResponse.cs
    │   │   ├── AutocompleteService.cs
    │   │   └── IAutocompleteProvider.cs
    │   ├── Components/
    │   │   ├── ComponentRegistry.cs
    │   │   ├── Fragment.cs
    │   │   ├── LaraWebComponent.cs
    │   │   ├── RenderIf.cs
    │   │   ├── Shadow.cs
    │   │   ├── Slot.cs
    │   │   ├── SlottedCalculator.cs
    │   │   ├── WebComponent.cs
    │   │   └── WebComponentOptions.cs
    │   ├── DOM/
    │   │   ├── Attributes.cs
    │   │   ├── BlockOptions.cs
    │   │   ├── ChildrenBindingSubscription.cs
    │   │   ├── Document.cs
    │   │   ├── DocumentIdMap.cs
    │   │   ├── DocumentWriter.cs
    │   │   ├── DomSurgeon.cs
    │   │   ├── DuplicateElementIdException.cs
    │   │   ├── Element.cs
    │   │   ├── ElementFactory.cs
    │   │   ├── EventSettings.cs
    │   │   ├── GlobalSerializer.cs
    │   │   ├── HtmlReference.cs
    │   │   ├── MessageRegistry.cs
    │   │   ├── Node.cs
    │   │   ├── NodeExtensions.cs
    │   │   └── TextNode.cs
    │   ├── Delta/
    │   │   ├── AttributeEditedDelta.cs
    │   │   ├── AttributeRemovedDelta.cs
    │   │   ├── BaseDelta.cs
    │   │   ├── ClearChildrenDelta.cs
    │   │   ├── ContentArrayNode.cs
    │   │   ├── ContentAttribute.cs
    │   │   ├── ContentElementNode.cs
    │   │   ├── ContentNode.cs
    │   │   ├── ContentPlaceholder.cs
    │   │   ├── ContentTextNode.cs
    │   │   ├── ElementValue.cs
    │   │   ├── EventResult.cs
    │   │   ├── FocusDelta.cs
    │   │   ├── NodeAddedDelta.cs
    │   │   ├── NodeInsertedDelta.cs
    │   │   ├── NodeLocator.cs
    │   │   ├── NodeRemovedDelta.cs
    │   │   ├── PlugOptions.cs
    │   │   ├── RemoveElementDelta.cs
    │   │   ├── RenderDelta.cs
    │   │   ├── ReplaceDelta.cs
    │   │   ├── ServerEventsDelta.cs
    │   │   ├── SetCheckedDelta.cs
    │   │   ├── SetIdDelta.cs
    │   │   ├── SetValueDelta.cs
    │   │   ├── SubmitJsDelta.cs
    │   │   ├── SubscribeDelta.cs
    │   │   ├── SwapChildrenDelta.cs
    │   │   ├── TextModifiedDelta.cs
    │   │   ├── UnRenderDelta.cs
    │   │   └── UnsubscribeDelta.cs
    │   ├── Elements/
    │   │   ├── GenericElement.cs
    │   │   ├── HtmlAnchorElement.cs
    │   │   ├── HtmlBodyElement.cs
    │   │   ├── HtmlButtonElement.cs
    │   │   ├── HtmlColGroupElement.cs
    │   │   ├── HtmlDivElement.cs
    │   │   ├── HtmlHeadElement.cs
    │   │   ├── HtmlHeadingElement.cs
    │   │   ├── HtmlImageElement.cs
    │   │   ├── HtmlInputElement.cs
    │   │   ├── HtmlLabelElement.cs
    │   │   ├── HtmlLiElement.cs
    │   │   ├── HtmlLinkElement.cs
    │   │   ├── HtmlMetaElement.cs
    │   │   ├── HtmlMeterElement.cs
    │   │   ├── HtmlOlElement.cs
    │   │   ├── HtmlOptionElement.cs
    │   │   ├── HtmlOptionGroupElement.cs
    │   │   ├── HtmlParagraphElement.cs
    │   │   ├── HtmlScriptElement.cs
    │   │   ├── HtmlSelectElement.cs
    │   │   ├── HtmlSpanElement.cs
    │   │   ├── HtmlTableCellElement.cs
    │   │   ├── HtmlTableElement.cs
    │   │   ├── HtmlTableHeaderElement.cs
    │   │   ├── HtmlTableRowElement.cs
    │   │   ├── HtmlTableSectionElement.cs
    │   │   ├── HtmlTextAreaElement.cs
    │   │   └── HtmlTitleElement.cs
    │   ├── GlobalSuppressions.cs
    │   ├── LaraUI.csproj
    │   ├── LaraUI.csproj.DotSettings
    │   ├── Main/
    │   │   ├── Application.cs
    │   │   ├── BaseContext.cs
    │   │   ├── BinaryServiceContent.cs
    │   │   ├── BinaryServicePublished.cs
    │   │   ├── Connection.cs
    │   │   ├── Connections.cs
    │   │   ├── GlobalConstants.cs
    │   │   ├── IBinaryService.cs
    │   │   ├── INavigation.cs
    │   │   ├── IPage.cs
    │   │   ├── IPageContext.cs
    │   │   ├── IPublishedItem.cs
    │   │   ├── IWebService.cs
    │   │   ├── IWebServiceContext.cs
    │   │   ├── JSBridge.cs
    │   │   ├── LaraBinaryServiceAttribute.cs
    │   │   ├── LaraPageAttribute.cs
    │   │   ├── LaraUI.cs
    │   │   ├── LaraWebServiceAttribute.cs
    │   │   ├── Navigation.cs
    │   │   ├── PageContext.cs
    │   │   ├── PagePublished.cs
    │   │   ├── Published.cs
    │   │   ├── Session.cs
    │   │   ├── SessionStorage.cs
    │   │   ├── SingleElementPage.cs
    │   │   ├── StaleConnectionsCollector.cs
    │   │   ├── StaticContent.cs
    │   │   ├── TemplateBuilder.cs
    │   │   ├── WebServiceContent.cs
    │   │   ├── WebServiceContext.cs
    │   │   └── WebServicePublished.cs
    │   ├── Middleware/
    │   │   ├── BaseHandler.cs
    │   │   ├── BrowserAppController.cs
    │   │   ├── ClientEventMessage.cs
    │   │   ├── ClientLibraryHandler.cs
    │   │   ├── ContentTypes.cs
    │   │   ├── DefaultErrorPage.cs
    │   │   ├── DiscardHandler.cs
    │   │   ├── DiscardParameters.cs
    │   │   ├── ErrorPages.cs
    │   │   ├── EventParameters.cs
    │   │   ├── FormFile.cs
    │   │   ├── FormFileCollection.cs
    │   │   ├── IModeController.cs
    │   │   ├── KeepAliveHandler.cs
    │   │   ├── LaraMiddleware.cs
    │   │   ├── LocalhostFilter.cs
    │   │   ├── MiddlewareCommon.cs
    │   │   ├── NotFoundMiddleware.cs
    │   │   ├── PostEventContext.cs
    │   │   ├── PostEventHandler.cs
    │   │   ├── PublishedItemHandler.cs
    │   │   ├── Sequencer.cs
    │   │   ├── ServerEvent.cs
    │   │   ├── ServerEventsController.cs
    │   │   ├── StatusCodeException.cs
    │   │   └── StatusForbiddenException.cs
    │   ├── NewVersionChecklist.txt
    │   ├── Reactive/
    │   │   ├── BindableBase.cs
    │   │   ├── BindingExtensions.cs
    │   │   ├── BindingOptions.cs
    │   │   ├── BindingSubscription.cs
    │   │   ├── CollectionUpdater.cs
    │   │   └── ObsoleteElement.cs
    │   ├── Resources.Designer.cs
    │   ├── Resources.resx
    │   ├── Tools/
    │   │   ├── ApplicationBuilderLaraExtensions.cs
    │   │   ├── AssembliesReader.cs
    │   │   ├── AsyncEvent.cs
    │   │   ├── ClassEditor.cs
    │   │   ├── DocumentLocal.cs
    │   │   ├── LaraBuilder.cs
    │   │   ├── LaraJson.cs
    │   │   ├── LaraOptions.cs
    │   │   ├── LaraTools.cs
    │   │   ├── NoCurrentSessionException.cs
    │   │   ├── SemaphoreSlimExtensions.cs
    │   │   ├── ServerLauncher.cs
    │   │   └── SessionLocal.cs
    │   ├── docfx.json
    │   └── pack.bat
    ├── LaraUI.sln
    ├── LaraUI.sln.licenseheader
    ├── SampleProject/
    │   ├── Common/
    │   │   ├── CountryList.cs
    │   │   ├── CountrySelector.cs
    │   │   ├── SampleAppBootstrap.cs
    │   │   └── Tools.cs
    │   ├── Components/
    │   │   ├── CheckboxSample.cs
    │   │   ├── CounterSample.cs
    │   │   ├── KitchenSinkComponent.cs
    │   │   ├── LockingSample.cs
    │   │   ├── LongRunningSample.cs
    │   │   ├── MultiselectSample.cs
    │   │   ├── SelectSample.cs
    │   │   ├── UploadSample.cs
    │   │   └── WeekdayCombo.cs
    │   ├── LaraSample.csproj
    │   ├── Main/
    │   │   └── Program.cs
    │   ├── Pages/
    │   │   ├── KitchenSinkPage.cs
    │   │   ├── ServerEventsPage.cs
    │   │   └── UploadFilePage.cs
    │   ├── Properties/
    │   │   └── launchSettings.json
    │   └── SampleProject.csproj
    └── Tests/
        ├── Components/
        │   ├── AutocompleteTesting.cs
        │   └── ComponentTesting.cs
        ├── DOM/
        │   ├── AttributesTesting.cs
        │   ├── BindingsTesting.cs
        │   ├── BuilderTesting.cs
        │   ├── ClassEditorTesting.cs
        │   ├── DomOperationsTesting.cs
        │   ├── ElementAttributes.cs
        │   ├── EventsTesting.cs
        │   ├── GlobalAttributesTesting.cs
        │   └── LaraBuilderTesting.cs
        ├── Delta/
        │   ├── AttributeEditTesting.cs
        │   ├── DeltaTesting.cs
        │   └── LocatorTesting.cs
        ├── Main/
        │   ├── ButtonCounterPage.cs
        │   ├── ConnectionTesting.cs
        │   ├── ConnectionsTesting.cs
        │   ├── MyPage.cs
        │   ├── PublishedTesting.cs
        │   ├── StaleTesting.cs
        │   └── StaticContentTesting.cs
        ├── Middleware/
        │   ├── DummyContext.cs
        │   ├── DummyContextTesting.cs
        │   ├── ErrorPagesTesting.cs
        │   ├── EventParametersTesting.cs
        │   ├── MiddlewareTesting.cs
        │   ├── ServerEventsTesting.cs
        │   ├── ToolsTesting.cs
        │   └── WebServicesTesting.cs
        └── Tests.csproj
Download .txt
SYMBOL INDEX (1838 symbols across 240 files)

FILE: src/Boilerplate/Program.cs
  class Program (line 7) | public static class Program
    method Main (line 9) | public static async Task Main()
  class MyCounterComponent (line 29) | internal class MyCounterComponent : WebComponent
    method MyCounterComponent (line 34) | public MyCounterComponent()

FILE: src/Boilerplate/Wiki/ComponentPropertyExample.cs
  class ComponentPropertyExample (line 3) | internal class ComponentPropertyExample : WebComponent
    method ComponentPropertyExample (line 5) | public ComponentPropertyExample()
  class MyLabelComponent (line 21) | internal class MyLabelComponent : WebComponent
    method MyLabelComponent (line 26) | public MyLabelComponent()

FILE: src/Boilerplate/Wiki/ComposingComponent.cs
  class ComposingComponent (line 3) | internal class ComposingComponent : WebComponent
    method ComposingComponent (line 5) | public ComposingComponent()  // parent component
  class ItemComponent (line 16) | internal class ItemComponent : WebComponent  // child component
    method ItemComponent (line 21) | public ItemComponent()

FILE: src/Boilerplate/Wiki/ConditionalRenderComponent.cs
  class ConditionalRenderComponent (line 3) | internal class ConditionalRenderComponent : WebComponent
    method ConditionalRenderComponent (line 8) | public ConditionalRenderComponent()

FILE: src/Boilerplate/Wiki/DocumentContextExample.cs
  class DocumentContextExample (line 3) | internal class DocumentContextExample : WebComponent
    method DocumentContextExample (line 7) | public DocumentContextExample()
    method OnConnect (line 18) | protected override void OnConnect() // our component is placed on Docu...

FILE: src/Boilerplate/Wiki/HttpContextExample.cs
  class HttpContextExample (line 3) | internal class HttpContextExample : WebComponent
    method HttpContextExample (line 8) | public HttpContextExample()
    method OnConnect (line 17) | protected override void OnConnect()

FILE: src/Boilerplate/Wiki/LoopComponent.cs
  class MyList (line 4) | internal class MyList : WebComponent
    method MyList (line 8) | public MyList()

FILE: src/Boilerplate/Wiki/RedBoxExample.cs
  class RedBoxExample (line 3) | internal class RedBoxExample : WebComponent
    method RedBoxExample (line 5) | public RedBoxExample()
  class RedBoxComponent (line 23) | internal class RedBoxComponent : WebComponent
    method RedBoxComponent (line 25) | public RedBoxComponent()

FILE: src/Boilerplate/Wiki/SimpleComponent.cs
  class SimpleComponent (line 3) | internal class SimpleComponent : WebComponent
    method SimpleComponent (line 8) | public SimpleComponent()

FILE: src/Boilerplate/Wiki/UserInputComponent.cs
  class UserInputComponent (line 3) | internal class UserInputComponent : WebComponent
    method UserInputComponent (line 8) | public UserInputComponent()

FILE: src/Boilerplate/Wiki/UserTextComponent.cs
  class UserTextComponent (line 3) | internal class UserTextComponent : WebComponent
    method UserTextComponent (line 8) | public UserTextComponent()

FILE: src/LaraClient/src/Autocomplete.ts
  type AutocompleteCommand (line 12) | interface AutocompleteCommand {
  type AutocompleteEntry (line 19) | interface AutocompleteEntry {
  type SourceRequest (line 26) | interface SourceRequest {
  type AutocompleteRequest (line 30) | interface AutocompleteRequest {
  type AutocompleteCallback (line 35) | type AutocompleteCallback = (_list: AutocompleteEntry[]) => void
  type SuccessData (line 37) | interface SuccessData {
  function autocompleteStart (line 41) | function autocompleteStart(json: string): void {
  function autocompleteStop (line 76) | function autocompleteStop(id: string): void {
  function setValue (line 81) | function setValue(input: HTMLInputElement, value: string, text: string):...
  function render (line 90) | function render(ul: Element, entry: AutocompleteEntry): JQuery<HTMLEleme...
  function buildLabel (line 100) | function buildLabel(entry: AutocompleteEntry): string {
  function buildData (line 116) | function buildData(input: HTMLInputElement, term: string): string {
  function buildRequest (line 120) | function buildRequest(

FILE: src/LaraClient/src/Blocker.ts
  function block (line 10) | function block(plug: PlugOptions): void {
  function unblock (line 22) | function unblock(plug: PlugOptions): void {
  function buildParameters (line 33) | function buildParameters(plug: PlugOptions): JQBlockUIOptions {
  function resolveTarget (line 52) | function resolveTarget(plug: PlugOptions): Element {
  function setElementCSS (line 62) | function setElementCSS(options: JQBlockUIOptions): void {
  function setDefaultCSS (line 78) | function setDefaultCSS(options: JQBlockUIOptions): void {

FILE: src/LaraClient/src/ContentInterfaces.ts
  type ContentNodeType (line 7) | enum ContentNodeType {
  type ContentNode (line 18) | interface ContentNode {
  type ContentTextNode (line 22) | interface ContentTextNode extends ContentNode {
  type ContentAttribute (line 26) | interface ContentAttribute {
  type ContentElementNode (line 31) | interface ContentElementNode extends ContentNode {
  type ContentArrayNode (line 38) | interface ContentArrayNode extends ContentNode {
  type ContentPlaceholder (line 42) | interface ContentPlaceholder extends ContentNode {

FILE: src/LaraClient/src/DeltaInterfaces.ts
  type EventResultType (line 11) | enum EventResultType {
  type DeltaType (line 18) | enum DeltaType {
  type BaseDelta (line 41) | interface BaseDelta {
  type EventResult (line 45) | interface EventResult {
  type NodeAddedDelta (line 50) | interface NodeAddedDelta extends BaseDelta {
  type NodeInsertedDelta (line 55) | interface NodeInsertedDelta extends BaseDelta {
  type TextModifiedDelta (line 61) | interface TextModifiedDelta extends BaseDelta {
  type NodeRemovedDelta (line 67) | interface NodeRemovedDelta extends BaseDelta {
  type AttributeEditedDelta (line 72) | interface AttributeEditedDelta extends BaseDelta {
  type AttributeRemovedDelta (line 78) | interface AttributeRemovedDelta extends BaseDelta {
  type NodeLocator (line 83) | interface NodeLocator {
  type FocusDelta (line 88) | interface FocusDelta extends BaseDelta {
  type SetIdDelta (line 92) | interface SetIdDelta extends BaseDelta {
  type SetValueDelta (line 97) | interface SetValueDelta extends BaseDelta {
  type SubmitJsDelta (line 102) | interface SubmitJsDelta extends BaseDelta {
  type SetCheckedDelta (line 107) | interface SetCheckedDelta extends BaseDelta {
  type ClearChildrenDelta (line 112) | interface ClearChildrenDelta extends BaseDelta {
  type ReplaceDelta (line 116) | interface ReplaceDelta extends BaseDelta {
  type SwapChildrenDelta (line 120) | interface SwapChildrenDelta extends BaseDelta {
  type SubscribeDelta (line 126) | interface SubscribeDelta extends BaseDelta {
  type UnsubscribeDelta (line 133) | interface UnsubscribeDelta extends BaseDelta {
  type RemoveElement (line 138) | interface RemoveElement extends BaseDelta {
  type RenderDelta (line 142) | interface RenderDelta extends BaseDelta {
  type UnRenderDelta (line 147) | interface UnRenderDelta extends BaseDelta {

FILE: src/LaraClient/src/Initializer.ts
  function clean (line 7) | function clean(node: Node): void {

FILE: src/LaraClient/src/InputCollector.ts
  class ElementEventValue (line 9) | class ElementEventValue {
  class ClientEventMessage (line 15) | class ClientEventMessage {
    method isEmpty (line 18) | isEmpty(): boolean {
  function collectValues (line 23) | function collectValues(plug: PlugOptions): FormData {
  function collectMessage (line 35) | function collectMessage(plug: PlugOptions): ClientEventMessage {
  function collectType (line 47) | function collectType(
  function collectInput (line 64) | function collectInput(el: Element, entry: ElementEventValue): void {
  function collectSimpleValue (line 70) | function collectSimpleValue(el: Element, entry: ElementEventValue): void {
  function collectOption (line 74) | function collectOption(el: Element, entry: ElementEventValue): void {
  function getValue (line 79) | function getValue(el: Element): string {
  function collectFiles (line 90) | function collectFiles(plug: PlugOptions, data: FormData): number {
  function collectFilesInput (line 103) | function collectFilesInput(input: HTMLInputElement, data: FormData): num...

FILE: src/LaraClient/src/RegisteredEvents.ts
  function addElementEvent (line 12) | function addElementEvent(
  function removeElementEvent (line 23) | function removeElementEvent(element: EventTarget, eventName: string): vo...
  function getKey (line 31) | function getKey(id: string, eventName: string) {
  function subscribe (line 35) | function subscribe(step: SubscribeDelta): void {
  function getEventTarget (line 44) | function getEventTarget(id: string): EventTarget {
  function buildHandler (line 52) | function buildHandler(
  function buildDebouncedHandler (line 63) | function buildDebouncedHandler(
  function buildRegularHandler (line 74) | function buildRegularHandler(
  function addEvalFilter (line 83) | function addEvalFilter(handler: EventListener, filter: string): EventLis...
  function unsubscribe (line 99) | function unsubscribe(step: UnsubscribeDelta): void {

FILE: src/LaraClient/src/Sequencer.ts
  type resolver (line 7) | type resolver = (_value?: boolean | PromiseLike<boolean>) => void
  class Sequencer (line 9) | class Sequencer {
    method constructor (line 13) | constructor() {
    method waitForTurn (line 18) | async waitForTurn(turn: number): Promise<boolean> {
    method flushPending (line 38) | private flushPending(): void {

FILE: src/LaraClient/src/SocketEvents.ts
  class EventParameters (line 10) | class EventParameters {
  class SocketEventParameters (line 18) | class SocketEventParameters extends EventParameters {
  class FormFileCollection (line 22) | class FormFileCollection {
    method constructor (line 25) | constructor() {
  class FormFile (line 30) | class FormFile {
  function loadFiles (line 39) | async function loadFiles(
  function collectFilesInput (line 54) | async function collectFilesInput(
  function copyFile (line 71) | async function copyFile(file: File, name: string): Promise<FormFile> {
  function bufferToBase64 (line 82) | function bufferToBase64(buffer: ArrayBuffer): string {
  function readFile (line 92) | async function readFile(file: File): Promise<ArrayBuffer> {

FILE: src/LaraClient/src/Worker.ts
  function processResult (line 19) | function processResult(steps: Delta.BaseDelta[]): void {
  function processStepCatch (line 27) | function processStepCatch(step: Delta.BaseDelta): boolean {
  function processStep (line 42) | function processStep(step: Delta.BaseDelta): void {
  function append (line 112) | function append(delta: Delta.NodeAddedDelta): void {
  function appendChildren (line 118) | function appendChildren(el: Element, children: Node[]): void {
  function insert (line 124) | function insert(delta: Delta.NodeInsertedDelta): void {
  function render (line 135) | function render(delta: Delta.RenderDelta): void {
  function insertBeforeChildren (line 152) | function insertBeforeChildren(
  function createNodes (line 163) | function createNodes(node: ContentNode): Node[] {
  function pushNodes (line 169) | function pushNodes(node: ContentNode, list: Node[]): void {
  function pushArrayNodes (line 187) | function pushArrayNodes(node: ContentArrayNode, list: Node[]): void {
  function createTextNode (line 194) | function createTextNode(node: ContentTextNode): Node {
  function createElementNode (line 200) | function createElementNode(node: ContentElementNode): Element {
  function createPlaceholder (line 214) | function createPlaceholder(node: ContentPlaceholder): Element {
  function setAttribute (line 221) | function setAttribute(child: Element, attribute: string, value: string):...
  function createRootNode (line 241) | function createRootNode(node: ContentElementNode): Element {
  function textModified (line 249) | function textModified(delta: Delta.TextModifiedDelta): void {
  function remove (line 255) | function remove(delta: Delta.NodeRemovedDelta): void {
  function editAttribute (line 261) | function editAttribute(delta: Delta.AttributeEditedDelta): void {
  function removeAttribute (line 271) | function removeAttribute(delta: Delta.AttributeRemovedDelta): void {
  function focus (line 281) | function focus(delta: Delta.FocusDelta): void {
  function setId (line 286) | function setId(delta: Delta.SetIdDelta): void {
  function setValue (line 291) | function setValue(delta: Delta.SetValueDelta): void {
  function submitJS (line 296) | function submitJS(context: Delta.SubmitJsDelta): void {
  function setChecked (line 305) | function setChecked(delta: Delta.SetCheckedDelta): void {
  function clearChildren (line 310) | function clearChildren(delta: Delta.ClearChildrenDelta): void {
  function replaceLocation (line 317) | function replaceLocation(delta: Delta.ReplaceDelta): void {
  function swapChildren (line 321) | function swapChildren(step: Delta.SwapChildrenDelta): void {
  function swapDom (line 328) | function swapDom(obj1: Node, obj2: Node): void {
  function removeElementId (line 336) | function removeElementId(delta: Delta.RemoveElement): void {
  function unRender (line 341) | function unRender(delta: Delta.UnRenderDelta): void {
  function locateNode (line 351) | function locateNode(locator: Delta.NodeLocator): ChildNode {

FILE: src/LaraClient/src/index.ts
  function initialize (line 28) | function initialize(id: string, keepAliveInterval: number): void {
  function getDocumentId (line 44) | function getDocumentId(): string {
  function terminate (line 48) | function terminate(): void {
  function sendKeepAlive (line 53) | function sendKeepAlive() {
  type PropagationType (line 59) | enum PropagationType {
  type PlugOptions (line 68) | interface PlugOptions {
  function plugEvent (line 82) | function plugEvent(
  function stopPropagation (line 91) | function stopPropagation(ev: Event, options: PlugOptions): void {
  function plug (line 102) | function plug(el: EventTarget, options: PlugOptions): void {
  function plugWebSocket (line 110) | function plugWebSocket(el: EventTarget, plug: PlugOptions): void {
  function plugWebSocketStart (line 125) | function plugWebSocketStart(
  function getSocketUrl (line 151) | function getSocketUrl(name: string): string {
  function buildSocketParameters (line 161) | async function buildSocketParameters(
  function createSocketParameters (line 170) | function createSocketParameters(
  function getEventNumber (line 187) | function getEventNumber(): number {
  function onSocketMessage (line 192) | async function onSocketMessage(
  function getTargetId (line 201) | function getTargetId(target: EventTarget): string {
  function plugAjax (line 209) | function plugAjax(el: EventTarget, plug: PlugOptions): void {
  type MessageOptions (line 229) | interface MessageOptions {
  function sendMessage (line 239) | function sendMessage(options: MessageOptions): void {
  function processAjax (line 252) | async function processAjax(
  function getEventUrl (line 263) | function getEventUrl(
  function processAjaxResult (line 280) | async function processAjaxResult(
  function processEventResult (line 289) | function processEventResult(result: EventResult): void {
  function processAjaxError (line 299) | function processAjaxError(ajax: XMLHttpRequest): void {
  function listenServerEvents (line 310) | function listenServerEvents(): void {
  function autocompleteApply (line 324) | function autocompleteApply(payload: string): void {
  function autocompleteDestroy (line 328) | function autocompleteDestroy(id: string): void {

FILE: src/LaraUI/Autocomplete/AutocompleteElement.cs
  class AutocompleteElement (line 14) | public class AutocompleteElement : WebComponent
    method AutocompleteElement (line 29) | public AutocompleteElement() : base(CustomTag)
    method GetOptions (line 48) | internal AutocompleteOptions? GetOptions() => _options;
    method Start (line 54) | public void Start(AutocompleteOptions options)
    method Stop (line 71) | public void Stop()
    method OnConnect (line 79) | protected override void OnConnect()
    method OnDisconnect (line 93) | protected override void OnDisconnect()
    method SubmitAutocomplete (line 100) | private void SubmitAutocomplete(Document document, AutocompleteOptions...
    method GetAutocompleteKey (line 118) | private string GetAutocompleteKey(Document document)
    method DestroyAutocomplete (line 123) | private void DestroyAutocomplete()

FILE: src/LaraUI/Autocomplete/AutocompleteEntry.cs
  class AutocompleteEntry (line 14) | [DataContract]

FILE: src/LaraUI/Autocomplete/AutocompleteOptions.cs
  class AutocompleteOptions (line 12) | public class AutocompleteOptions

FILE: src/LaraUI/Autocomplete/AutocompletePayload.cs
  class AutocompletePayload (line 11) | [DataContract]

FILE: src/LaraUI/Autocomplete/AutocompleteRegistry.cs
  class AutocompleteRegistry (line 12) | internal class AutocompleteRegistry
    method AutocompleteRegistry (line 17) | public AutocompleteRegistry()
    method TryGet (line 22) | public bool TryGet(string key, [NotNullWhen(true)] out AutocompleteEle...
    method Set (line 33) | public void Set(string key, AutocompleteElement element)
    method Remove (line 52) | public void Remove(string key)
    method GetCount (line 62) | private int GetCount()
    method GetValue (line 68) | private Dictionary<string, AutocompleteElement>? GetValue()

FILE: src/LaraUI/Autocomplete/AutocompleteResponse.cs
  class AutocompleteResponse (line 15) | [DataContract]

FILE: src/LaraUI/Autocomplete/AutocompleteService.cs
  class AutocompleteRequest (line 12) | [DataContract]
  class AutocompleteService (line 22) | internal class AutocompleteService : IWebService
    method Execute (line 28) | public Task<string> Execute()
    method Execute (line 33) | internal static async Task<string> Execute(string json)
    method Register (line 50) | public static void Register(string key, AutocompleteElement element)
    method Unregister (line 55) | public static void Unregister(string key)

FILE: src/LaraUI/Autocomplete/IAutocompleteProvider.cs
  type IAutocompleteProvider (line 14) | public interface IAutocompleteProvider
    method GetAutocompleteList (line 21) | Task<AutocompleteResponse> GetAutocompleteList(string term);

FILE: src/LaraUI/Components/ComponentRegistry.cs
  class ComponentRegistry (line 12) | internal sealed class ComponentRegistry
    method ComponentRegistry (line 16) | public ComponentRegistry()
    method Register (line 21) | public void Register(string name, Type type)
    method Unregister (line 42) | public void Unregister(string tagName)
    method IsValidTagName (line 47) | private static bool IsValidTagName(string tagName)
    method TryGetComponent (line 54) | public bool TryGetComponent(string name, out Type type)
    method Clear (line 59) | public void Clear()

FILE: src/LaraUI/Components/Fragment.cs
  class Fragment (line 15) | public class Fragment : WebComponent
    method Fragment (line 20) | public Fragment()
    method ForEach (line 32) | public static Fragment ForEach<TValue>(ObservableCollection<TValue> so...

FILE: src/LaraUI/Components/LaraWebComponent.cs
  class LaraWebComponentAttribute (line 14) | [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
    method LaraWebComponentAttribute (line 26) | public LaraWebComponentAttribute(string customTagName)
    method LaraWebComponentAttribute (line 34) | public LaraWebComponentAttribute() : this("")

FILE: src/LaraUI/Components/RenderIf.cs
  class RenderIf (line 9) | public class RenderIf : WebComponent
    method RenderIf (line 21) | public RenderIf(INotifyPropertyChanged source, Func<bool> criteria, Fu...
    method Update (line 28) | private void Update()

FILE: src/LaraUI/Components/Shadow.cs
  class Shadow (line 12) | internal sealed class Shadow : Element
    method Shadow (line 16) | public Shadow(WebComponent parent) : base(ShadowTagName)
    method GetLightSlotted (line 23) | internal override IEnumerable<Node> GetLightSlotted()

FILE: src/LaraUI/Components/Slot.cs
  class Slot (line 16) | public sealed class Slot : Element
    method Slot (line 30) | public Slot() : base("slot")
    method MatchesName (line 34) | internal bool MatchesName(string? slotName)
    method GetLightSlotted (line 45) | internal override IEnumerable<Node> GetLightSlotted()
    method TryFindParentComponent (line 50) | private static bool TryFindParentComponent(Node element, [NotNullWhen(...

FILE: src/LaraUI/Components/SlottedCalculator.cs
  class SlottedCalculator (line 9) | internal static class SlottedCalculator
    method UpdateSlotted (line 11) | public static void UpdateSlotted(Node node)
    method IsParentSlotting (line 25) | internal static bool IsParentSlotting(Node node)
    method UpdateChildren (line 44) | private static void UpdateChildren(Element element)

FILE: src/LaraUI/Components/WebComponent.cs
  class WebComponent (line 17) | public abstract class WebComponent : Element
    method GetShadow (line 26) | internal Shadow GetShadow() => _shadow;
    method WebComponent (line 34) | protected WebComponent(string tagName) : base(tagName ?? throw new Arg...
    method WebComponent (line 43) | protected WebComponent()
    method InitializeObservedAttributes (line 49) | private void InitializeObservedAttributes()
    method VerifyTypeThrow (line 57) | private static void VerifyTypeThrow(string tagName, Type componentType)
    method VerifyType (line 65) | internal static bool VerifyType(string tagName, Type componentType, ou...
    method AttachShadow (line 95) | [Obsolete("Not needed anymore, Shadow root is automatically created")]
    method GetObservedAttributes (line 105) | protected virtual IEnumerable<string> GetObservedAttributes()
    method GetLightSlotted (line 110) | internal override IEnumerable<Node> GetLightSlotted()
    method GetAllDescendants (line 128) | internal override IEnumerable<Node> GetAllDescendants()
    method GetSlottedElements (line 142) | public IEnumerable<Node> GetSlottedElements(string? slotName)
    method NodeMatchesSlot (line 153) | private static bool NodeMatchesSlot(Node node, string? slotName)
    method ElementMatchesSlot (line 159) | private static bool ElementMatchesSlot(Element element, string? slotName)
    method AttributeChanged (line 170) | internal override void AttributeChanged(string attribute, string? value)
    method OnAttributeChanged (line 186) | protected virtual void OnAttributeChanged(string attribute)
    method GetNotifyList (line 190) | internal override IEnumerable<Element> GetNotifyList()
    method IsSlotActive (line 201) | internal bool IsSlotActive(string? slotName)
    method IsSlotActive (line 206) | private static bool IsSlotActive(Element parent, string? slotName)
    method IsSlotChildActive (line 218) | private static bool IsSlotChildActive(Node child, string? slotName)
    method TriggerEvent (line 228) | public void TriggerEvent(string eventName) => NotifyEvent(eventName);

FILE: src/LaraUI/Components/WebComponentOptions.cs
  class WebComponentOptions (line 14) | public sealed class WebComponentOptions
    method GetComponentType (line 26) | internal Type GetComponentType()

FILE: src/LaraUI/DOM/Attributes.cs
  class Attributes (line 13) | internal sealed class Attributes : IEnumerable<KeyValuePair<string, stri...
    method Attributes (line 18) | public Attributes(Element element)
    method HasAttribute (line 25) | public bool HasAttribute(string name) => HasAttributeLower(name.ToLowe...
    method GetAttribute (line 27) | public string? GetAttribute(string name) => GetAttributeLower(name.ToL...
    method HasAttributeLower (line 29) | internal bool HasAttributeLower(string nameLower)
    method SetAttributeLower (line 32) | internal void SetAttributeLower(string nameLower, string? value)
    method RemoveAttributeLower (line 70) | internal void RemoveAttributeLower(string nameLower)
    method SetFlagAttributeLower (line 88) | internal void SetFlagAttributeLower(string nameLower, bool value)
    method NotifyValue (line 102) | internal void NotifyValue(string value)
    method NotifyChecked (line 117) | internal void NotifyChecked(bool isChecked)
    method NotifySelected (line 122) | internal void NotifySelected(bool selected)
    method NotifyFlag (line 127) | private void NotifyFlag(string nameLower, bool value)
    method GetAttributeLower (line 145) | internal string? GetAttributeLower(string nameLower)
    method GetEnumerator (line 150) | public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
    method GetEnumerator (line 155) | IEnumerator IEnumerable.GetEnumerator()

FILE: src/LaraUI/DOM/BlockOptions.cs
  class BlockOptions (line 12) | public class BlockOptions

FILE: src/LaraUI/DOM/ChildrenBindingSubscription.cs
  class ChildrenBindingSubscription (line 11) | internal class ChildrenBindingSubscription
    method ChildrenBindingSubscription (line 16) | public ChildrenBindingSubscription(
    method Unsubscribe (line 25) | public void Unsubscribe()

FILE: src/LaraUI/DOM/Document.cs
  type ServerEventsStatus (line 19) | public enum ServerEventsStatus
  class Document (line 40) | public class Document
    method GetQueue (line 97) | internal Queue<BaseDelta> GetQueue() => _queue;
    method Document (line 99) | internal Document(IPage page, double keepAliveInterval)
    method Document (line 104) | internal Document(IPage page, Guid virtualId, double keepAliveInterval)
    method CreateElement (line 137) | public static Element CreateElement(string tagName) => Element.Create(...
    method CreateTextNode (line 144) | public static TextNode CreateTextNode(string data) => new TextNode(data);
    method UpdateTimestamp (line 146) | internal void UpdateTimestamp()
    method ModifyLastUtcForTesting (line 151) | internal void ModifyLastUtcForTesting(DateTime value)
    method OnElementAdded (line 156) | internal void OnElementAdded(Element element)
    method OnElementRemoved (line 159) | internal void OnElementRemoved(Element element)
    method NotifyChangeId (line 162) | internal void NotifyChangeId(Element element, string before, string af...
    method OpenEventQueue (line 167) | internal void OpenEventQueue()
    method FlushQueue (line 177) | internal string FlushQueue()
    method Enqueue (line 189) | internal void Enqueue(BaseDelta delta)
    method TryGetElementById (line 200) | public bool TryGetElementById(string id, out Element element)
    method GetElementById (line 208) | public Element GetElementById(string id)
    method OnMessage (line 219) | [Obsolete("Support old methods")]
    method AddMessageListener (line 225) | internal void AddMessageListener(string messageId, Func<MessageEventAr...
    method RemoveMessageListener (line 230) | internal void RemoveMessageListener(string messageId, Func<MessageEven...
    method NotifyUnload (line 235) | internal async Task NotifyUnload()
    method StartServerEvent (line 255) | public ServerEvent StartServerEvent()
    method ServerEventsOn (line 258) | internal void ServerEventsOn()
    method ServerEventsOff (line 264) | internal Task ServerEventsOff()
    method SocketRemainsOpen (line 267) | internal bool SocketRemainsOpen(string eventName)
    method GetSocketCompletion (line 270) | internal virtual Task<TaskCompletionSource<bool>> GetSocketCompletion(...
    method ServerEventFlush (line 273) | internal Task ServerEventFlush()
    method GetServerEventsController (line 276) | internal ServerEventsController GetServerEventsController()
    method WaitForTurn (line 279) | internal Task<bool> WaitForTurn(long turn) => _sequencer.WaitForTurn(t...
    method NotifyHasEvent (line 283) | internal void NotifyHasEvent()
    method NotifyEvent (line 288) | internal Task NotifyEvent(string eventName)
    method On (line 302) | public void On(EventSettings settings)
    method On (line 316) | public void On(string eventName, Func<Task>? handler)
    method RemoveEvent (line 333) | private void RemoveEvent(string eventName)

FILE: src/LaraUI/DOM/DocumentIdMap.cs
  class DocumentIdMap (line 11) | internal sealed class DocumentIdMap
    method DocumentIdMap (line 15) | public DocumentIdMap()
    method TryGetElementById (line 20) | public bool TryGetElementById(string id, out Element element)
    method NotifyChangeId (line 25) | public void NotifyChangeId(Element element, string before, string after)
    method RemovePrevious (line 32) | private void RemovePrevious(string before)
    method AddAfter (line 37) | private void AddAfter(Element element, string after)
    method NotifyRemoved (line 46) | public void NotifyRemoved(Element element)
    method NotifyAdded (line 51) | public void NotifyAdded(Element element)

FILE: src/LaraUI/DOM/DocumentWriter.cs
  class DocumentWriter (line 14) | internal sealed class DocumentWriter
    method DocumentWriter (line 21) | public DocumentWriter(Document document)
    method DocumentWriter (line 27) | public DocumentWriter()
    method Print (line 32) | public void Print()
    method PrintElement (line 52) | public void PrintElement(Element element, int indent)
    method VerifyNestedLevel (line 71) | internal static void VerifyNestedLevel(int indent)
    method IsInlineElement (line 79) | private static bool IsInlineElement(Element element)
    method PrintInlineElement (line 93) | private void PrintInlineElement(Element element)
    method PrintStubElement (line 101) | private void PrintStubElement(Element element)
    method Indent (line 108) | private void Indent(int indent)
    method PrintOpeningTag (line 116) | private void PrintOpeningTag(Element element)
    method PrintAttributes (line 124) | private void PrintAttributes(Element element)
    method PrintInlineChildNodes (line 139) | private void PrintInlineChildNodes(Element element)
    method PrintInlineNode (line 147) | private void PrintInlineNode(Node node)
    method PrintRegularElement (line 159) | private void PrintRegularElement(Element element, int indent)
    method PrintChildNodes (line 172) | private void PrintChildNodes(Element element, int indent)
    method PrintClosingTag (line 180) | private void PrintClosingTag(Element element, int indent)
    method ToString (line 189) | public override string ToString()

FILE: src/LaraUI/DOM/DomSurgeon.cs
  class DomSurgeon (line 13) | internal sealed class DomSurgeon
    method DomSurgeon (line 17) | public DomSurgeon(Element parent)
    method Append (line 24) | public void Append(Node child)
    method InsertChildBefore (line 31) | public void InsertChildBefore(Node reference, Node child)
    method InsertChildAfter (line 38) | public void InsertChildAfter(Node reference, Node child)
    method InsertChildAt (line 45) | public void InsertChildAt(int index, Node child)
    method Remove (line 52) | public void Remove(Node child)
    method RemoveAt (line 58) | public void RemoveAt(int index)
    method ClearChildren (line 65) | public void ClearChildren()
    method BeforeOperation (line 79) | private static Element? BeforeOperation(Node child)
    method AfterOperation (line 84) | private static void AfterOperation(Node node, Node? previousParent)
    method AfterOperationInternal (line 92) | private static void AfterOperationInternal(Element child, Node? previo...
    method GetPreviousDocument (line 116) | private static Document? GetPreviousDocument(Node? previousParent)
    method AppendInternal (line 125) | private void AppendInternal(Node child)
    method InsertChild (line 132) | private void InsertChild(Node reference, int offset, Node child)
    method InsertChild (line 140) | private void InsertChild(int index, Node child)
    method VerifyParentContainsChild (line 147) | private void VerifyParentContainsChild(Node reference)
    method RemoveInternal (line 155) | private void RemoveInternal(Node child)
    method RemoveInternal (line 174) | private void RemoveInternal(int index)
    method ClearChildrenInternal (line 181) | private void ClearChildrenInternal()
    method RemoveInternalCommon (line 191) | private void RemoveInternalCommon(Node child)
    method PreventCycles (line 207) | private void PreventCycles(Node child)
    method UpdateDocumentMappings (line 219) | private void UpdateDocumentMappings(Node child)
    method NewToDocument (line 235) | private bool NewToDocument(Node child, [NotNullWhen(true)] out Documen...
    method LeavingPrevious (line 242) | private bool LeavingPrevious(Node child, [NotNullWhen(true)] out Docum...
    method CollectNodes (line 249) | private static List<Node> CollectNodes(Node child)
    method CollectElements (line 256) | private static void CollectElements(ICollection<Node> list, Node node)
    method PreventDuplicateIds (line 266) | private void PreventDuplicateIds(IEnumerable<Node> list)
    method DuplicateIdInDocument (line 282) | private static bool DuplicateIdInDocument(Document? document, string id)
    method AddToDocument (line 288) | private static void AddToDocument(IEnumerable<Node> list, Document doc...
    method RemoveFromPreviousDocument (line 300) | private static void RemoveFromPreviousDocument(IEnumerable<Node> list,...
    method UpdateChildParentLinks (line 316) | private void UpdateChildParentLinks(Node child)
    method UpdateChildParentLinks (line 325) | private void UpdateChildParentLinks(Node reference, int offset, Node c...
    method UpdateChildParentLinks (line 331) | private void UpdateChildParentLinks(int index, Node child)

FILE: src/LaraUI/DOM/DuplicateElementIdException.cs
  class DuplicateElementIdException (line 15) | public class DuplicateElementIdException : InvalidOperationException
    method DuplicateElementIdException (line 21) | public DuplicateElementIdException()
    method DuplicateElementIdException (line 30) | public DuplicateElementIdException(string message)
    method DuplicateElementIdException (line 40) | public DuplicateElementIdException(string message, Exception inner)
    method Create (line 50) | public static DuplicateElementIdException Create(string id)

FILE: src/LaraUI/DOM/Element.cs
  class Element (line 23) | public abstract class Element : Node
    method Create (line 45) | public static Element Create(string tagName) => ElementFactory.CreateE...
    method Create (line 53) | public static Element Create(string tagName, string id) => ElementFact...
    method CreateNS (line 62) | public static Element CreateNS(string ns, string tagName) => ElementFa...
    method Element (line 68) | protected Element(string tagName)
    method Element (line 84) | protected Element() : this("")
    method GetDefaultTagName (line 93) | public static string GetDefaultTagName(Type type)
    method ToString (line 114) | public override string ToString()
    method EnsureElementId (line 132) | [Obsolete("Not needed anymore")]
    method SetAttribute (line 168) | public void SetAttribute(string attributeName, string? attributeValue)
    method SetAttributeLower (line 174) | internal void SetAttributeLower(string nameLower, string? value)
    method ToggleAttributeLower (line 190) | internal void ToggleAttributeLower(string nameLower, bool value)
    method HasAttribute (line 209) | public bool HasAttribute(string attributeName)
    method HasAttributeLower (line 215) | internal bool HasAttributeLower(string nameLower)
    method GetAttribute (line 223) | public string? GetAttribute(string attributeName)
    method GetAttributeLower (line 229) | internal string? GetAttributeLower(string nameLower)
    method SetFlagAttribute (line 237) | public void SetFlagAttribute(string attributeName, bool value)
    method SetFlagAttributeLower (line 243) | internal void SetFlagAttributeLower(string nameLower, bool value)
    method RemoveAttribute (line 250) | public void RemoveAttribute(string attributeName)
    method GetIntAttribute (line 262) | internal int? GetIntAttribute(string nameLower)
    method SetIntAttribute (line 272) | internal void SetIntAttribute(string nameLower, int? value)
    method HasClass (line 300) | public bool HasClass(string className) => ClassEditor.HasClass(Class, ...
    method AddClass (line 306) | public void AddClass(string className) => Class = ClassEditor.AddClass...
    method RemoveClass (line 312) | public void RemoveClass(string className) => Class = ClassEditor.Remov...
    method ToggleClass (line 319) | public void ToggleClass(string className, bool value)
    method ToggleClass (line 326) | public void ToggleClass(string className) => Class = ClassEditor.Toggl...
    method NotifyValue (line 328) | internal void NotifyValue(string value) => _attributes.NotifyValue(val...
    method NotifyChecked (line 330) | internal void NotifyChecked(bool value) => _attributes.NotifyChecked(v...
    method NotifySelected (line 332) | internal void NotifySelected(bool value) => _attributes.NotifySelected...
    method GetChildAt (line 570) | public Node GetChildAt(int index) => _children[index];
    method GetChildNodePosition (line 577) | public int GetChildNodePosition(Node node)
    method GetChildElementPosition (line 596) | public int GetChildElementPosition(Element element)
    method DescendsFrom (line 619) | public bool DescendsFrom(Element? element)
    method ContainsChild (line 640) | public bool ContainsChild(Node node)
    method OnChildRemoved (line 649) | internal void OnChildRemoved(Node child)
    method OnChildAppend (line 654) | internal void OnChildAppend(Node child)
    method OnChildInsert (line 659) | internal void OnChildInsert(int index, Node child)
    method AppendChild (line 668) | public void AppendChild(params Node[] nodes)
    method AppendText (line 686) | public void AppendText(string text)
    method AppendData (line 695) | public void AppendData(string data)
    method AppendEncode (line 700) | internal void AppendEncode(string? data, bool encode)
    method InsertChildBefore (line 718) | public void InsertChildBefore(Node before, Node node)
    method InsertChildAfter (line 730) | public void InsertChildAfter(Node after, Node node)
    method InsertChildAt (line 742) | public void InsertChildAt(int index, Node node)
    method RemoveChild (line 753) | public void RemoveChild(Node child)
    method RemoveAt (line 763) | public void RemoveAt(int index)
    method ClearChildren (line 772) | public void ClearChildren()
    method Remove (line 783) | public void Remove()
    method SwapChildren (line 797) | public void SwapChildren(int index1, int index2)
    method NotifyValue (line 809) | internal virtual void NotifyValue(ElementEventValue entry)
    method OnChildAdded (line 813) | private protected virtual void OnChildAdded(Node child)
    method OnConnect (line 821) | protected virtual void OnConnect()
    method OnDisconnect (line 828) | protected virtual void OnDisconnect()
    method OnAdopted (line 835) | protected virtual void OnAdopted()
    method OnMove (line 842) | protected virtual void OnMove()
    method NotifyConnect (line 846) | internal void NotifyConnect()
    method NotifyDisconnect (line 856) | internal void NotifyDisconnect()
    method NotifyAdopted (line 865) | internal void NotifyAdopted()
    method NotifyMove (line 874) | internal void NotifyMove()
    method GetNotifyList (line 883) | internal virtual IEnumerable<Element> GetNotifyList()
    method GetContentNode (line 898) | internal override ContentNode GetContentNode()
    method GetUnrenderedContent (line 907) | private ContentNode GetUnrenderedContent()
    method GetRenderedContent (line 919) | private ContentNode GetRenderedContent()
    method GetArrayContent (line 929) | private ContentNode GetArrayContent(List<Node> list)
    method GetElementContent (line 942) | private ContentElementNode GetElementContent()
    method CopyAttributes (line 953) | private List<ContentAttribute> CopyAttributes()
    method CopyLightChildren (line 967) | private List<ContentNode> CopyLightChildren()
    method NotifyEvent (line 981) | internal Task NotifyEvent(string eventName)
    method On (line 995) | public void On(EventSettings settings)
    method On (line 1012) | public void On(string eventName, Func<Task>? handler)
    method On (line 1034) | public void On(string eventName, Action? handler)
    method RemoveEvent (line 1055) | private void RemoveEvent(string eventName)
    method FlushEvents (line 1066) | private void FlushEvents()
    method AddSubscription (line 1085) | internal void AddSubscription(INotifyPropertyChanged source, Action ac...
    method SubscribeChildren (line 1101) | internal void SubscribeChildren(
    method ClearSubscriptions (line 1109) | private void ClearSubscriptions()
    method UnbindAll (line 1123) | public void UnbindAll()
    method SetInnerData (line 1132) | public void SetInnerData(string data)
    method SetInnerEncode (line 1137) | internal void SetInnerEncode(string? value, bool encode)
    method GetNodeInnerText (line 1157) | internal override string? GetNodeInnerText()
    method AppendNodeInnerText (line 1173) | internal override void AppendNodeInnerText(StringBuilder builder)
    method SetNodeInnerText (line 1181) | internal override void SetNodeInnerText(string? value)
    method GetLightSlotted (line 1215) | internal virtual IEnumerable<Node> GetLightSlotted()
    method GetLightChildren (line 1220) | internal IEnumerable<Node> GetLightChildren()
    method GetAllDescendants (line 1238) | internal virtual IEnumerable<Node> GetAllDescendants()
    method AttributeChanged (line 1243) | internal virtual void AttributeChanged(string attribute, string? value)
    method TryGetQueue (line 1248) | internal bool TryGetQueue([NotNullWhen(true)] out Document? document)
    method TryGetEvents (line 1255) | internal bool TryGetEvents([NotNullWhen(true)] out Document? document)
    method Focus (line 1272) | public virtual void Focus()
    method GetHtml (line 1285) | public string GetHtml()

FILE: src/LaraUI/DOM/ElementFactory.cs
  class ElementFactory (line 12) | internal static class ElementFactory
    method CreateElement (line 52) | public static Element CreateElement(string tagName)
    method VerifyTagName (line 68) | private static string VerifyTagName(string tagName)
    method CreateElement (line 83) | public static Element CreateElement(string tagName, string id)
    method CreateElementNs (line 90) | public static Element CreateElementNs(string ns, string tagName)

FILE: src/LaraUI/DOM/EventSettings.cs
  type PropagationType (line 15) | public enum PropagationType
  class EventSettings (line 41) | public sealed class EventSettings
    method Verify (line 111) | internal void Verify()

FILE: src/LaraUI/DOM/GlobalSerializer.cs
  class GlobalSerializer (line 12) | internal static class GlobalSerializer
    method GenerateElementId (line 16) | public static string GenerateElementId()

FILE: src/LaraUI/DOM/HtmlReference.cs
  class HtmlReference (line 11) | internal static class HtmlReference
    method HtmlReference (line 16) | static HtmlReference()
    method IsSelfClosingTag (line 43) | public static bool IsSelfClosingTag(string tagNameLower)
    method RequiresId (line 46) | public static bool RequiresId(string tagNameLower)

FILE: src/LaraUI/DOM/MessageRegistry.cs
  class MessageEventArgs (line 16) | public class MessageEventArgs : EventArgs
    method MessageEventArgs (line 23) | internal MessageEventArgs(string? body)
  class MessageTypeRegistry (line 29) | internal class MessageTypeRegistry
    method Add (line 33) | public void Add(Func<MessageEventArgs, Task> handler)
    method Remove (line 38) | public void Remove(Func<MessageEventArgs, Task> handler)
    method RunAll (line 43) | public async Task RunAll(MessageEventArgs args)
  class MessageRegistry (line 53) | internal class MessageRegistry
    method MessageRegistry (line 58) | public MessageRegistry(Document parent)
    method Add (line 64) | public void Add(string messageId, Func<MessageEventArgs, Task> handler)
    method GetRegistry (line 70) | private MessageTypeRegistry GetRegistry(string messageId)
    method Remove (line 85) | public void Remove(string messageId, Func<MessageEventArgs, Task> hand...
    method RunAll (line 93) | public async Task RunAll(string messageId, MessageEventArgs args)

FILE: src/LaraUI/DOM/Node.cs
  type NodeType (line 14) | public enum NodeType
  class Node (line 30) | public abstract class Node : BindableBase
    method Node (line 35) | protected internal Node()
    method GetContentNode (line 63) | internal abstract ContentNode GetContentNode();
    method UpdateSlotted (line 70) | internal void UpdateSlotted()
    method GetNodeInnerText (line 88) | internal abstract string? GetNodeInnerText();
    method SetNodeInnerText (line 90) | internal abstract void SetNodeInnerText(string? value);
    method AppendNodeInnerText (line 92) | internal abstract void AppendNodeInnerText(StringBuilder builder);

FILE: src/LaraUI/DOM/NodeExtensions.cs
  class NodeExtensions (line 16) | public static class NodeExtensions
    method Wrap (line 27) | public static TNode Wrap<TNode>(this TNode node, params Action<TNode>[...
    method Extract (line 43) | public static TNode Extract<TNode>(this TNode node, [NotNull] out TNod...
    method Child (line 61) | public static T Child<T>(this T element, params Node[] elements)
    method Event (line 80) | public static T Event<T>(this T element, string eventName, Action hand...
    method Event (line 95) | public static T Event<T>(this T element, string eventName, Func<Task> ...
    method Event (line 109) | public static T Event<T>(this T element, EventSettings options)

FILE: src/LaraUI/DOM/TextNode.cs
  class TextNode (line 16) | public sealed class TextNode : Node
    method TextNode (line 48) | public TextNode()
    method TextNode (line 57) | public TextNode(string? data, bool encode = true)
    method AppendText (line 73) | public void AppendText(string text)
    method AppendData (line 82) | public void AppendData(string data)
    method AppendEncode (line 87) | internal void AppendEncode(string? text, bool encode)
    method GetContentNode (line 103) | internal override ContentNode GetContentNode()
    method SetEncodedText (line 115) | public void SetEncodedText(string? unencoded)
    method GetNodeInnerText (line 120) | internal override string GetNodeInnerText()
    method SetNodeInnerText (line 125) | internal override void SetNodeInnerText(string? value)
    method AppendNodeInnerText (line 130) | internal override void AppendNodeInnerText(StringBuilder builder)

FILE: src/LaraUI/Delta/AttributeEditedDelta.cs
  class AttributeEditedDelta (line 11) | [DataContract]
    method AttributeEditedDelta (line 23) | public AttributeEditedDelta() : base(DeltaType.EditAttribute)
    method Enqueue (line 27) | public static void Enqueue(Element element, string attribute, string? ...

FILE: src/LaraUI/Delta/AttributeRemovedDelta.cs
  class AttributeRemovedDelta (line 11) | [DataContract]
    method AttributeRemovedDelta (line 20) | public AttributeRemovedDelta() : base(DeltaType.RemoveAttribute)
    method Enqueue (line 24) | public static void Enqueue(Element element, string attribute)

FILE: src/LaraUI/Delta/BaseDelta.cs
  type DeltaType (line 11) | internal enum DeltaType
  class BaseDelta (line 35) | [DataContract]
    method BaseDelta (line 61) | protected BaseDelta(DeltaType type)

FILE: src/LaraUI/Delta/ClearChildrenDelta.cs
  class ClearChildrenDelta (line 11) | [DataContract]
    method ClearChildrenDelta (line 17) | public ClearChildrenDelta() : base(DeltaType.ClearChildren)
    method Enqueue (line 21) | public static void Enqueue(Element element)

FILE: src/LaraUI/Delta/ContentArrayNode.cs
  class ContentArrayNode (line 12) | [DataContract]
    method ContentArrayNode (line 18) | public ContentArrayNode() : base(ContentNodeType.Array)

FILE: src/LaraUI/Delta/ContentAttribute.cs
  class ContentAttribute (line 11) | [DataContract]

FILE: src/LaraUI/Delta/ContentElementNode.cs
  class ContentElementNode (line 12) | [DataContract]
    method ContentElementNode (line 28) | public ContentElementNode() : base(ContentNodeType.Element)

FILE: src/LaraUI/Delta/ContentNode.cs
  type ContentNodeType (line 11) | internal enum ContentNodeType
  class ContentNode (line 19) | [DataContract]
    method ContentNode (line 29) | protected ContentNode(ContentNodeType type)

FILE: src/LaraUI/Delta/ContentPlaceholder.cs
  class ContentPlaceholder (line 11) | [DataContract]
    method ContentPlaceholder (line 17) | public ContentPlaceholder() : base(ContentNodeType.Placeholder)
    method ContentPlaceholder (line 21) | public ContentPlaceholder(string id) : this()

FILE: src/LaraUI/Delta/ContentTextNode.cs
  class ContentTextNode (line 11) | [DataContract]
    method ContentTextNode (line 17) | public ContentTextNode() : base(ContentNodeType.Text)

FILE: src/LaraUI/Delta/ElementValue.cs
  class ElementEventValue (line 11) | [DataContract]
    method ToString (line 23) | public override string ToString()
    method GetCheckedSuffix (line 28) | private string GetCheckedSuffix()

FILE: src/LaraUI/Delta/EventResult.cs
  type EventResultType (line 12) | internal enum EventResultType
  class EventResult (line 20) | [DataContract]
    method EventResult (line 29) | public EventResult()
    method EventResult (line 33) | public EventResult(List<BaseDelta> list) : this()
    method ToJSON (line 39) | public string ToJSON()

FILE: src/LaraUI/Delta/FocusDelta.cs
  class FocusDelta (line 11) | [DataContract]
    method FocusDelta (line 17) | public FocusDelta() : base(DeltaType.Focus)
    method Enqueue (line 21) | public static void Enqueue(Element element)

FILE: src/LaraUI/Delta/NodeAddedDelta.cs
  class NodeAddedDelta (line 11) | [DataContract]
    method NodeAddedDelta (line 20) | public NodeAddedDelta() : base(DeltaType.Append)
    method Enqueue (line 24) | public static void Enqueue(Node node)

FILE: src/LaraUI/Delta/NodeInsertedDelta.cs
  class NodeInsertedDelta (line 11) | [DataContract]
    method NodeInsertedDelta (line 23) | public NodeInsertedDelta() : base(DeltaType.Insert)
    method Enqueue (line 27) | public static void Enqueue(Node node, int index)

FILE: src/LaraUI/Delta/NodeLocator.cs
  class NodeLocator (line 12) | [DataContract]
    method FromNode (line 21) | public static NodeLocator FromNode(Node node)

FILE: src/LaraUI/Delta/NodeRemovedDelta.cs
  class NodeRemovedDelta (line 11) | [DataContract]
    method NodeRemovedDelta (line 20) | public NodeRemovedDelta() : base(DeltaType.Remove)
    method Enqueue (line 24) | public static void Enqueue(Element parent, int index)

FILE: src/LaraUI/Delta/PlugOptions.cs
  class PlugOptions (line 11) | [DataContract]
    method PlugOptions (line 33) | public PlugOptions()
    method PlugOptions (line 37) | public PlugOptions(EventSettings settings)
    method ToJSON (line 51) | public string ToJSON() => LaraTools.Serialize(this);

FILE: src/LaraUI/Delta/RemoveElementDelta.cs
  class RemoveElementDelta (line 11) | [DataContract]
    method RemoveElementDelta (line 17) | public RemoveElementDelta() : base(DeltaType.RemoveElement)
    method Enqueue (line 21) | public static void Enqueue(Element element)

FILE: src/LaraUI/Delta/RenderDelta.cs
  class RenderDelta (line 12) | [DataContract]
    method RenderDelta (line 21) | public RenderDelta() : base(DeltaType.Render)
    method Enqueue (line 25) | public static void Enqueue(Document document, IEnumerable<Node> nodes)

FILE: src/LaraUI/Delta/ReplaceDelta.cs
  class ReplaceDelta (line 11) | [DataContract]
    method ReplaceDelta (line 17) | public ReplaceDelta() : base(DeltaType.Replace)
    method Enqueue (line 21) | public static void Enqueue(Document document, string location)

FILE: src/LaraUI/Delta/ServerEventsDelta.cs
  class ServerEventsDelta (line 11) | [DataContract]
    method ServerEventsDelta (line 14) | public ServerEventsDelta() : base(DeltaType.ServerEvents)

FILE: src/LaraUI/Delta/SetCheckedDelta.cs
  class SetCheckedDelta (line 11) | [DataContract]
    method SetCheckedDelta (line 20) | public SetCheckedDelta() : base(DeltaType.SetChecked)
    method Enqueue (line 24) | public static void Enqueue(Element element, bool value)

FILE: src/LaraUI/Delta/SetIdDelta.cs
  class SetIdDelta (line 11) | [DataContract]
    method SetIdDelta (line 20) | public SetIdDelta() : base(DeltaType.SetId)
    method Enqueue (line 24) | public static void Enqueue(Element element, string newValue)

FILE: src/LaraUI/Delta/SetValueDelta.cs
  class SetValueDelta (line 11) | [DataContract]
    method SetValueDelta (line 20) | public SetValueDelta() : base(DeltaType.SetValue)
    method Enqueue (line 24) | public static void Enqueue(Element element, string? value)

FILE: src/LaraUI/Delta/SubmitJsDelta.cs
  class SubmitJsDelta (line 11) | [DataContract]
    method SubmitJsDelta (line 20) | public SubmitJsDelta() : base(DeltaType.SubmitJs)

FILE: src/LaraUI/Delta/SubscribeDelta.cs
  class SubscribeDelta (line 11) | [DataContract]
    method SubscribeDelta (line 26) | public SubscribeDelta() : base(DeltaType.Subscribe)
    method Enqueue (line 30) | public static void Enqueue(Element element, EventSettings settings)
    method Enqueue (line 37) | public static void Enqueue(Document document, EventSettings settings)
    method CreateDelta (line 43) | private static SubscribeDelta CreateDelta(string id, EventSettings set...
  class ClientEventSettings (line 55) | [DataContract]
    method CreateFrom (line 89) | public static ClientEventSettings CreateFrom(EventSettings settings)

FILE: src/LaraUI/Delta/SwapChildrenDelta.cs
  class SwapChildrenDelta (line 11) | [DataContract]
    method SwapChildrenDelta (line 14) | public SwapChildrenDelta() : base(DeltaType.SwapChildren)
    method Enqueue (line 27) | public static void Enqueue(Element parent, int index1, int index2)

FILE: src/LaraUI/Delta/TextModifiedDelta.cs
  class TextModifiedDelta (line 11) | [DataContract]
    method TextModifiedDelta (line 23) | public TextModifiedDelta() : base(DeltaType.TextModified)
    method Enqueue (line 27) | public static void Enqueue(TextNode node)

FILE: src/LaraUI/Delta/UnRenderDelta.cs
  class UnRenderDelta (line 12) | [DataContract]
    method UnRenderDelta (line 18) | public UnRenderDelta() : base(DeltaType.UnRender)
    method Enqueue (line 22) | public static void Enqueue(Document document, IEnumerable<Node> nodes)

FILE: src/LaraUI/Delta/UnsubscribeDelta.cs
  class UnsubscribeDelta (line 11) | [DataContract]
    method UnsubscribeDelta (line 20) | public UnsubscribeDelta() : base(DeltaType.Unsubscribe)

FILE: src/LaraUI/Elements/GenericElement.cs
  class GenericElement (line 13) | public sealed class GenericElement : Element
    method GenericElement (line 15) | internal GenericElement(string tagName) : base(tagName)

FILE: src/LaraUI/Elements/HtmlAnchorElement.cs
  class Anchor (line 15) | [Obsolete("Use HtmlAnchorElement instead")]
  class HtmlAnchorElement (line 25) | public class HtmlAnchorElement : Element
    method HtmlAnchorElement (line 30) | public HtmlAnchorElement() : base("a")

FILE: src/LaraUI/Elements/HtmlBodyElement.cs
  class BodyElement (line 15) | [Obsolete("Use HtmlBodyElement")]
  class HtmlBodyElement (line 24) | public class HtmlBodyElement : Element
    method HtmlBodyElement (line 29) | public HtmlBodyElement() : base("body")

FILE: src/LaraUI/Elements/HtmlButtonElement.cs
  class Button (line 15) | [Obsolete("Use HtmlButtonElement instead")]
  class HtmlButtonElement (line 25) | public class HtmlButtonElement : Element
    method HtmlButtonElement (line 30) | public HtmlButtonElement() : base("button")
    method NotifyValue (line 35) | internal override void NotifyValue(ElementEventValue entry)

FILE: src/LaraUI/Elements/HtmlColGroupElement.cs
  class ColGroup (line 15) | [Obsolete("Use HtmlColGroupElement instead")]
  class HtmlColGroupElement (line 25) | public class HtmlColGroupElement : Element
    method HtmlColGroupElement (line 30) | public HtmlColGroupElement() : base("colgroup")

FILE: src/LaraUI/Elements/HtmlDivElement.cs
  class HtmlDivElement (line 12) | public class HtmlDivElement : Element
    method HtmlDivElement (line 17) | public HtmlDivElement() : base("div")

FILE: src/LaraUI/Elements/HtmlHeadElement.cs
  class HeadElement (line 15) | [Obsolete("Use HtmlHeadElement instead")]
  class HtmlHeadElement (line 25) | public class HtmlHeadElement : Element
    method HtmlHeadElement (line 30) | public HtmlHeadElement() : base("head")

FILE: src/LaraUI/Elements/HtmlHeadingElement.cs
  class HtmlHeadingElement (line 14) | public class HtmlHeadingElement : Element
    method HtmlHeadingElement (line 20) | public HtmlHeadingElement(int level) : base(GetLevelTag(level))
    method GetLevelTag (line 29) | public static string GetLevelTag(int level)

FILE: src/LaraUI/Elements/HtmlImageElement.cs
  class Image (line 15) | [Obsolete("Use HtmlImageElement instead")]
  class HtmlImageElement (line 25) | public class HtmlImageElement : Element
    method HtmlImageElement (line 30) | public HtmlImageElement() : base("img")

FILE: src/LaraUI/Elements/HtmlInputElement.cs
  class InputElement (line 17) | [Obsolete("Use HtmlInputElement instead")]
  class HtmlInputElement (line 27) | public class HtmlInputElement : Element
    method HtmlInputElement (line 32) | public HtmlInputElement() : base("input")
    method NotifyValue (line 36) | internal override void NotifyValue(ElementEventValue entry)
    method ClearFiles (line 263) | private void ClearFiles() => _files.Clear();
    method AddFile (line 264) | internal void AddFile(IFormFile file) => _files.Add(file);

FILE: src/LaraUI/Elements/HtmlLabelElement.cs
  class Label (line 15) | [Obsolete("Use HtmlLabelElement instead")]
  class HtmlLabelElement (line 25) | public class HtmlLabelElement : Element
    method HtmlLabelElement (line 30) | public HtmlLabelElement() : base("label")

FILE: src/LaraUI/Elements/HtmlLiElement.cs
  class ListItem (line 15) | [Obsolete("Use HtmlLiElement instead")]
  class HtmlLiElement (line 25) | public class HtmlLiElement : Element
    method HtmlLiElement (line 30) | public HtmlLiElement() : base("li")

FILE: src/LaraUI/Elements/HtmlLinkElement.cs
  class Link (line 15) | [Obsolete("Use HtmlLinkElement instead")]
  class HtmlLinkElement (line 25) | public class HtmlLinkElement : Element
    method HtmlLinkElement (line 30) | public HtmlLinkElement() : base("link")

FILE: src/LaraUI/Elements/HtmlMetaElement.cs
  class Meta (line 15) | [Obsolete("Use HtmlMetaElement instead")]
  class HtmlMetaElement (line 25) | public class HtmlMetaElement : Element
    method HtmlMetaElement (line 30) | public HtmlMetaElement() : base("meta")

FILE: src/LaraUI/Elements/HtmlMeterElement.cs
  class Meter (line 15) | [Obsolete("Use HtmlMeterElement")]
  class HtmlMeterElement (line 25) | public class HtmlMeterElement : Element
    method HtmlMeterElement (line 30) | public HtmlMeterElement() : base("meter")

FILE: src/LaraUI/Elements/HtmlOlElement.cs
  class OrderedList (line 15) | [Obsolete("Use HtmlOlElement instead")]
  class HtmlOlElement (line 25) | public class HtmlOlElement : Element
    method HtmlOlElement (line 30) | public HtmlOlElement() : base("ol")

FILE: src/LaraUI/Elements/HtmlOptionElement.cs
  class OptionElement (line 15) | [Obsolete("Use HtmlOptionElement instead")]
  class HtmlOptionElement (line 25) | public class HtmlOptionElement : Element
    method HtmlOptionElement (line 30) | public HtmlOptionElement() : base("option")
    method NotifyValue (line 34) | internal override void NotifyValue(ElementEventValue entry)
    method NotifyAdded (line 78) | internal void NotifyAdded(string parentValue)

FILE: src/LaraUI/Elements/HtmlOptionGroupElement.cs
  class OptionGroup (line 16) | [Obsolete("Use HtmlOptionGroupElement instead")]
  class HtmlOptionGroupElement (line 26) | public class HtmlOptionGroupElement : Element
    method HtmlOptionGroupElement (line 31) | public HtmlOptionGroupElement() : base("optgroup")
    method GetOptions (line 58) | private IEnumerable<HtmlOptionElement> GetOptions()
    method OnChildAdded (line 69) | private protected override void OnChildAdded(Node child)
    method NotifyAdded (line 82) | internal void NotifyAdded(string parentValue)

FILE: src/LaraUI/Elements/HtmlParagraphElement.cs
  class HtmlParagraphElement (line 12) | public class HtmlParagraphElement : Element
    method HtmlParagraphElement (line 17) | public HtmlParagraphElement() : base("p")

FILE: src/LaraUI/Elements/HtmlScriptElement.cs
  class Script (line 15) | [Obsolete("Use HtmlScriptElement instead")]
  class HtmlScriptElement (line 25) | public class HtmlScriptElement : Element
    method HtmlScriptElement (line 30) | public HtmlScriptElement() : base("script")

FILE: src/LaraUI/Elements/HtmlSelectElement.cs
  class SelectElement (line 16) | [Obsolete("Use HtmlSelectElement instead")]
  class HtmlSelectElement (line 26) | public class HtmlSelectElement : Element
    method HtmlSelectElement (line 31) | public HtmlSelectElement() : base("select")
    method NotifyValue (line 35) | internal override void NotifyValue(ElementEventValue entry)
    method AddOption (line 46) | public HtmlOptionElement AddOption(string value, string text)
    method AttributeChanged (line 120) | internal override void AttributeChanged(string attribute, string? value)
    method UpdateChildOptions (line 131) | private void UpdateChildOptions(string? value)
    method SelectNonExclusiveOption (line 143) | private void SelectNonExclusiveOption(string? value)
    method SelectOnlyOption (line 154) | private void SelectOnlyOption(string? value)
    method OnChildAdded (line 162) | private protected override void OnChildAdded(Node child)
    method GetOptions (line 186) | private IEnumerable<HtmlOptionElement> GetOptions()

FILE: src/LaraUI/Elements/HtmlSpanElement.cs
  class HtmlSpanElement (line 12) | public class HtmlSpanElement : Element
    method HtmlSpanElement (line 17) | public HtmlSpanElement() : base("span")

FILE: src/LaraUI/Elements/HtmlTableCellElement.cs
  class TableCell (line 15) | [Obsolete("Use HtmlTableCellElement instead")]
  class HtmlTableCellElement (line 25) | public class HtmlTableCellElement : Element
    method HtmlTableCellElement (line 30) | public HtmlTableCellElement() : base("td")

FILE: src/LaraUI/Elements/HtmlTableElement.cs
  class Table (line 15) | [Obsolete("Use HtmlTableElement instead")]
  class HtmlTableElement (line 25) | public class HtmlTableElement : Element
    method HtmlTableElement (line 30) | public HtmlTableElement() : base("table")

FILE: src/LaraUI/Elements/HtmlTableHeaderElement.cs
  class TableHeader (line 15) | [Obsolete("Use HtmlTableHeaderElement instead")]
  class HtmlTableHeaderElement (line 25) | public class HtmlTableHeaderElement : Element
    method HtmlTableHeaderElement (line 30) | public HtmlTableHeaderElement() : base("th")

FILE: src/LaraUI/Elements/HtmlTableRowElement.cs
  class HtmlTableRowElement (line 12) | public class HtmlTableRowElement : Element
    method HtmlTableRowElement (line 17) | public HtmlTableRowElement() : base("tr")

FILE: src/LaraUI/Elements/HtmlTableSectionElement.cs
  type HtmlTableSectionType (line 14) | public enum HtmlTableSectionType
  class HtmlTableSectionElement (line 35) | public class HtmlTableSectionElement : Element
    method HtmlTableSectionElement (line 51) | public HtmlTableSectionElement(HtmlTableSectionType type)

FILE: src/LaraUI/Elements/HtmlTextAreaElement.cs
  class TextArea (line 15) | [Obsolete("Use HtmlTextArea instead")]
  class HtmlTextAreaElement (line 25) | public class HtmlTextAreaElement : Element
    method HtmlTextAreaElement (line 30) | public HtmlTextAreaElement() : base("textarea")
    method NotifyValue (line 34) | internal override void NotifyValue(ElementEventValue entry)

FILE: src/LaraUI/Elements/HtmlTitleElement.cs
  class HtmlTitleElement (line 12) | public class HtmlTitleElement : Element
    method HtmlTitleElement (line 17) | public HtmlTitleElement() : base("title")

FILE: src/LaraUI/Main/Application.cs
  class Application (line 18) | public sealed class Application : IDisposable
    method Application (line 38) | public Application()
    method GetPublished (line 52) | internal Published GetPublished() => _published;
    method ClearAllPublished (line 57) | public void ClearAllPublished()
    method Dispose (line 65) | public void Dispose()
    method PublishPage (line 79) | public void PublishPage(string address, Func<Node> nodeFactory)
    method PublishPage (line 87) | public void PublishPage(string address, Func<IPage> pageFactory)
    method PublishFile (line 95) | public void PublishFile(string address, StaticContent content)
    method PublishService (line 102) | public void PublishService(WebServiceContent content)
    method PublishService (line 112) | public void PublishService(BinaryServiceContent content)
    method UnPublish (line 122) | public void UnPublish(string path)
    method PublishAssemblies (line 130) | public void PublishAssemblies()
    method UnPublish (line 138) | public void UnPublish(string address, string method)
    method TryGetNode (line 145) | internal bool TryGetNode(string path, out IPublishedItem item)
    method TryGetConnection (line 148) | internal bool TryGetConnection(Guid guid, out Connection connection)
    method CreateConnection (line 151) | internal Connection CreateConnection(IPAddress remoteIp)
    method ClearEmptyConnection (line 154) | internal Task ClearEmptyConnection(Connection connection)
    method GetController (line 157) | private IModeController GetController()
    method PublishComponent (line 170) | public void PublishComponent(WebComponentOptions options)
    method UnPublishWebComponent (line 180) | public void UnPublishWebComponent(string tagName)
    method TryGetComponent (line 183) | internal bool TryGetComponent(string tagName, out Type type)
    method Start (line 195) | public Task Start()
    method Start (line 203) | public async Task Start(StartServerOptions options)
    method CreateModeController (line 211) | internal void CreateModeController(ApplicationMode mode)
    method Stop (line 224) | public Task Stop(CancellationToken token = default) => GetHost().StopA...
    method WaitForShutdown (line 232) | public Task WaitForShutdown(CancellationToken token = default) => Host...
    method GetHost (line 234) | internal IWebHost GetHost()
    method SetHost (line 253) | internal void SetHost(IWebHost host)

FILE: src/LaraUI/Main/BaseContext.cs
  class BaseContext (line 11) | internal abstract class BaseContext : ILaraContext
    method BaseContext (line 16) | internal BaseContext(Application app, HttpContext http)

FILE: src/LaraUI/Main/BinaryServiceContent.cs
  class BinaryServiceContent (line 14) | public sealed class BinaryServiceContent
    method GetFactory (line 36) | internal Func<IBinaryService> GetFactory()

FILE: src/LaraUI/Main/BinaryServicePublished.cs
  class BinaryServicePublished (line 13) | internal sealed class BinaryServicePublished : IPublishedItem
    method BinaryServicePublished (line 18) | public BinaryServicePublished(BinaryServiceContent content)
    method Run (line 24) | public async Task Run(Application app, HttpContext http, LaraOptions o...
    method SendReply (line 41) | private async Task SendReply(WebServiceContext context, byte[] data)

FILE: src/LaraUI/Main/Connection.cs
  class Connection (line 14) | internal sealed class Connection
    method Connection (line 25) | public Connection(Guid id, IPAddress remoteId)
    method TryGetDocument (line 34) | public bool TryGetDocument(Guid virtualId, out Document document)
    method CreateDocument (line 42) | public Document CreateDocument(IPage page, double keepAliveInterval)
    method Discard (line 50) | public async Task Discard(Guid documentId)
    method GetDocuments (line 64) | public IEnumerable<KeyValuePair<Guid, Document>> GetDocuments() => _do...
    method Close (line 70) | public async Task Close()

FILE: src/LaraUI/Main/Connections.cs
  class Connections (line 16) | internal sealed class Connections : IDisposable
    method Connections (line 21) | public Connections()
    method Connections (line 26) | public Connections(double cleanupInterval, double expireInterval)
    method CreateConnection (line 44) | public Connection CreateConnection(IPAddress remoteIp)
    method TryGetConnection (line 52) | public bool TryGetConnection(Guid id, out Connection connection)
    method Discard (line 57) | public async Task Discard(Guid key)
    method Clear (line 66) | public void Clear()
    method CreateCryptographicallySecureGuid (line 71) | public static Guid CreateCryptographicallySecureGuid()
    method ClearEmptyConnection (line 79) | public async Task ClearEmptyConnection(Connection connection)
    method GetConnections (line 87) | public IEnumerable<KeyValuePair<Guid, Connection>> GetConnections() =>...
    method Dispose (line 91) | public void Dispose()

FILE: src/LaraUI/Main/GlobalConstants.cs
  class GlobalConstants (line 9) | internal static class GlobalConstants

FILE: src/LaraUI/Main/IBinaryService.cs
  type IBinaryService (line 14) | public interface IBinaryService
    method Execute (line 20) | Task<byte[]> Execute();

FILE: src/LaraUI/Main/INavigation.cs
  type INavigation (line 14) | public interface INavigation
    method Replace (line 20) | void Replace(string location);
    method FlushPartialChanges (line 26) | Task FlushPartialChanges();

FILE: src/LaraUI/Main/IPage.cs
  type IPage (line 14) | public interface IPage
    method OnGet (line 20) | Task OnGet();

FILE: src/LaraUI/Main/IPageContext.cs
  type ILaraContext (line 17) | public interface ILaraContext
  type IPageContext (line 33) | public interface IPageContext : ILaraContext
  type IJsBridge (line 61) | public interface IJsBridge
    method Submit (line 68) | void Submit(string javaScriptCode, string? payload = null);
    method OnMessage (line 75) | [Obsolete("Use instead AddMessageListener() and RemoveMessageListener(...
    method AddMessageListener (line 84) | void AddMessageListener(string messageId, Func<MessageEventArgs, Task>...
    method RemoveMessageListener (line 91) | void RemoveMessageListener(string messageId, Func<MessageEventArgs, Ta...
    method ServerEventsOn (line 104) | void ServerEventsOn();
    method ServerEventsOff (line 110) | Task ServerEventsOff();

FILE: src/LaraUI/Main/IPublishedItem.cs
  type IPublishedItem (line 12) | internal interface IPublishedItem
    method Run (line 14) | Task Run(Application app, HttpContext http, LaraOptions options);

FILE: src/LaraUI/Main/IWebService.cs
  type IWebService (line 14) | public interface IWebService
    method Execute (line 20) | Task<string> Execute();

FILE: src/LaraUI/Main/IWebServiceContext.cs
  type IWebServiceContext (line 15) | public interface IWebServiceContext : ILaraContext
    method TryGetSession (line 32) | bool TryGetSession([NotNullWhen(true)] out Session? session);

FILE: src/LaraUI/Main/JSBridge.cs
  class JsBridge (line 13) | internal sealed class JsBridge : IJsBridge
    method JsBridge (line 19) | public JsBridge(PageContext parent)
    method Submit (line 24) | public void Submit(string javaScriptCode, string? payload = null)
    method OnMessage (line 33) | [Obsolete("Use instead AddMessageListener() and RemoveMessageListener(...
    method AddMessageListener (line 40) | public void AddMessageListener(string messageId, Func<MessageEventArgs...
    method RemoveMessageListener (line 45) | public void RemoveMessageListener(string messageId, Func<MessageEventA...
    method ServerEventsOn (line 50) | public void ServerEventsOn() => _parent.Document.ServerEventsOn();
    method ServerEventsOff (line 52) | public Task ServerEventsOff() => _parent.Document.ServerEventsOff();

FILE: src/LaraUI/Main/LaraBinaryServiceAttribute.cs
  class LaraBinaryServiceAttribute (line 14) | [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]

FILE: src/LaraUI/Main/LaraPageAttribute.cs
  class LaraPageAttribute (line 14) | [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
    method LaraPageAttribute (line 25) | public LaraPageAttribute()
    method LaraPageAttribute (line 33) | public LaraPageAttribute(string address)

FILE: src/LaraUI/Main/LaraUI.cs
  class LaraUI (line 21) | public static class LaraUI
    method ClearAll (line 39) | [Obsolete(PublishObsolete)]
    method Publish (line 48) | [Obsolete(PublishObsolete)]
    method Publish (line 58) | [Obsolete(PublishObsolete)]
    method Publish (line 67) | [Obsolete(PublishObsolete)]
    method UnPublish (line 76) | [Obsolete(PublishObsolete)]
    method PublishAssemblies (line 84) | [Obsolete(PublishObsolete)]
    method UnPublish (line 94) | [Obsolete(PublishObsolete)]
    method Publish (line 104) | [Obsolete(PublishObsolete)]
    method UnPublishWebComponent (line 113) | [Obsolete(PublishObsolete)]
    method GetContextDocument (line 148) | internal static Document? GetContextDocument(IPageContext? context)
    method StartServer (line 161) | [Obsolete(PublishObsolete)]
    method StartServer (line 172) | [Obsolete(PublishObsolete)]
    method LaunchBrowser (line 184) | public static void LaunchBrowser(string address)
    method LaunchBrowser (line 191) | public static void LaunchBrowser(IWebHost host)
    method GetFirstURL (line 200) | public static string GetFirstURL(IWebHost host)
    method FlushPartialChanges (line 215) | public static Task FlushPartialChanges()
    method ParseRequest (line 229) | public static T ParseRequest<T>()

FILE: src/LaraUI/Main/LaraWebServiceAttribute.cs
  class LaraWebServiceAttribute (line 14) | [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]

FILE: src/LaraUI/Main/Navigation.cs
  class Navigation (line 12) | internal sealed class Navigation : INavigation
    method Navigation (line 18) | public Navigation(PageContext context)
    method Replace (line 23) | public void Replace(string location)
    method ReplaceGet (line 35) | private void ReplaceGet(string location)
    method ReplacePost (line 40) | private void ReplacePost(string location)
    method FlushPartialChanges (line 45) | public async Task FlushPartialChanges()

FILE: src/LaraUI/Main/PageContext.cs
  class PageContext (line 13) | internal sealed class PageContext : BaseContext, IPageContext
    method PageContext (line 24) | public PageContext(Application app, HttpContext http, Connection conne...
    method SetExtraData (line 41) | internal void SetExtraData(string? data) => _bridge.EventData = data;

FILE: src/LaraUI/Main/PagePublished.cs
  class PagePublished (line 15) | internal sealed class PagePublished : IPublishedItem
    method PagePublished (line 21) | public PagePublished(Func<IPage> factory)
    method PagePublished (line 26) | public PagePublished(Func<IPage> factory, HttpStatusCode status)
    method Run (line 32) | public async Task Run(Application app, HttpContext http, LaraOptions o...
    method RunPage (line 49) | internal static async Task<bool> RunPage(Application app, HttpContext ...
    method ReplyStatusCodeError (line 63) | private static async Task ReplyStatusCodeError(Application app, HttpCo...
    method CreateInstance (line 75) | internal IPage CreateInstance() => _factory();
    method ProcessGetResult (line 77) | internal static async Task ProcessGetResult(HttpContext http, Document...
    method GetConnection (line 91) | internal static Connection GetConnection(Application app, HttpContext ...
    method CreateConnection (line 96) | private static Connection CreateConnection(Application app, HttpContex...
    method WriteDocument (line 104) | private static string WriteDocument(Document document)
    method ReplyDocument (line 111) | private static async Task ReplyDocument(HttpContext http, string html,...

FILE: src/LaraUI/Main/Published.cs
  class Published (line 12) | internal sealed class Published : IDisposable
    method Published (line 19) | public Published()
    method ClearAll (line 26) | public void ClearAll()
    method Dispose (line 35) | public void Dispose()
    method Publish (line 43) | public void Publish(string path, IPublishedItem item)
    method Publish (line 49) | public void Publish(WebServiceContent content)
    method Publish (line 56) | public void Publish(BinaryServiceContent content)
    method CombineAddress (line 63) | private static string CombineAddress(string address, string method)
    method CombinePathMethod (line 70) | public static string CombinePathMethod(string path, string method)
    method ValidateMethod (line 80) | internal static void ValidateMethod(string? method)
    method ValidateAddress (line 88) | internal static void ValidateAddress(string? path)
    method UnPublish (line 96) | public void UnPublish(string path)
    method UnPublish (line 101) | public void UnPublish(string path, string method)
    method TryGetNode (line 107) | public bool TryGetNode(string path, out IPublishedItem item)
    method Publish (line 112) | public void Publish(WebComponentOptions options)
    method UnPublishWebComponent (line 117) | public void UnPublishWebComponent(string componentTagName)
    method TryGetComponent (line 122) | public bool TryGetComponent(string tagName, out Type type)

FILE: src/LaraUI/Main/Session.cs
  class Session (line 14) | public sealed class Session
    method Session (line 25) | internal Session(Connection parent)
    method Close (line 30) | internal void Close()
    method SaveValue (line 54) | public void SaveValue(string key, string value)
    method RemoveValue (line 61) | public void RemoveValue(string key)
    method TryGetValue (line 70) | public bool TryGetValue(string key, out string value)

FILE: src/LaraUI/Main/SessionStorage.cs
  class SessionStorage (line 11) | internal sealed class SessionStorage
    method SessionStorage (line 16) | public SessionStorage()
    method Save (line 22) | public void Save(string key, string value)
    method Remove (line 31) | public void Remove(string key)
    method TryGetValue (line 39) | public bool TryGetValue(string key, out string value)

FILE: src/LaraUI/Main/SingleElementPage.cs
  class SingleElementPage (line 12) | internal class SingleElementPage : IPage
    method SingleElementPage (line 16) | public SingleElementPage(Func<Node> contentFactory)
    method OnGet (line 21) | public Task OnGet()

FILE: src/LaraUI/Main/StaleConnectionsCollector.cs
  class StaleConnectionsCollector (line 14) | internal sealed class StaleConnectionsCollector : IDisposable
    method StaleConnectionsCollector (line 30) | public StaleConnectionsCollector(Connections connections,
    method Dispose (line 45) | public void Dispose()
    method TimerElapsedHandler (line 53) | private async void TimerElapsedHandler(object sender, ElapsedEventArgs e)
    method CleanupExpiredHandler (line 63) | internal async Task CleanupExpiredHandler()
    method CleanupNonDisposed (line 72) | private async Task CleanupNonDisposed()
    method CleanupExpired (line 93) | internal static async Task CleanupExpired(Connection connection, DateT...

FILE: src/LaraUI/Main/StaticContent.cs
  class StaticContent (line 18) | public class StaticContent : IPublishedItem
    method GetBytes (line 28) | public byte[] GetBytes() => _bytes;
    method StaticContent (line 60) | public StaticContent(byte[] bytes, string contentType)
    method StaticContent (line 70) | public StaticContent(byte[] bytes)
    method ComputeETag (line 93) | public static string ComputeETag(byte[] bytes)
    method FormatETag (line 104) | public static string FormatETag(int hash)
    method ComputeHash (line 115) | public static int ComputeHash(params byte[] data)
    method Run (line 143) | public async Task Run(Application app, HttpContext http, LaraOptions o...
    method IsMatchETag (line 156) | private bool IsMatchETag(IHeaderDictionary headers)
    method SendMatchStatus (line 164) | private static void SendMatchStatus(HttpContext http)
    method SendContent (line 169) | private async Task SendContent(HttpContext http)

FILE: src/LaraUI/Main/TemplateBuilder.cs
  class TemplateBuilder (line 11) | internal static class TemplateBuilder
    method TemplateBuilder (line 15) | static TemplateBuilder()
    method Build (line 20) | public static void Build(Document document, double keepAliveInterval)

FILE: src/LaraUI/Main/WebServiceContent.cs
  class WebServiceContent (line 14) | public sealed class WebServiceContent
    method GetFactory (line 36) | internal Func<IWebService> GetFactory()

FILE: src/LaraUI/Main/WebServiceContext.cs
  class WebServiceContext (line 13) | internal sealed class WebServiceContext : BaseContext, IWebServiceContext
    method WebServiceContext (line 18) | public WebServiceContext(Application app, HttpContext http)
    method TryGetSession (line 23) | public bool TryGetSession([NotNullWhen(true)] out Session? session)

FILE: src/LaraUI/Main/WebServicePublished.cs
  class WebServicePublished (line 13) | internal sealed class WebServicePublished : IPublishedItem
    method WebServicePublished (line 18) | public WebServicePublished(WebServiceContent content)
    method Run (line 24) | public async Task Run(Application app, HttpContext http, LaraOptions o...
    method SendReply (line 41) | private async Task SendReply(WebServiceContext context, string data)
    method SendHeader (line 47) | internal static void SendHeader(WebServiceContext context, string cont...

FILE: src/LaraUI/Middleware/BaseHandler.cs
  class BaseHandler (line 12) | internal abstract class BaseHandler
    method BaseHandler (line 16) | protected BaseHandler(RequestDelegate next)
    method Invoke (line 21) | public async Task Invoke(HttpContext http)
    method TryInvoke (line 34) | private async Task TryInvoke(HttpContext http)
    method ProcessRequest (line 42) | internal abstract Task<bool> ProcessRequest(HttpContext http);

FILE: src/LaraUI/Middleware/BrowserAppController.cs
  class BrowserAppController (line 14) | internal class BrowserAppController : BaseModeController
    method BrowserAppController (line 25) | public BrowserAppController(Application app)
    method Start (line 30) | public override async Task<IWebHost> Start(Application app, StartServe...
    method CreateConnection (line 42) | public override Connection CreateConnection(IPAddress remoteIp)
    method Stop (line 53) | private Task Stop()
    method SignalStop (line 65) | private static Task SignalStop(CancellationTokenSource source)
    method AcceptConnection (line 71) | private bool AcceptConnection(IPAddress remoteIp)

FILE: src/LaraUI/Middleware/ClientEventMessage.cs
  class ClientEventMessage (line 12) | [DataContract]

FILE: src/LaraUI/Middleware/ClientLibraryHandler.cs
  class ClientLibraryHandler (line 17) | internal sealed class ClientLibraryHandler : BaseHandler
    method ClientLibraryHandler (line 24) | public ClientLibraryHandler(RequestDelegate next) : base(next)
    method GetCurrentAssembly (line 33) | private static Assembly GetCurrentAssembly()
    method GetLibraryVersion (line 38) | private static string GetLibraryVersion(Assembly assembly)
    method BuildLibraryAddress (line 45) | private static string BuildLibraryAddress(string version)
    method GetLibraryPath (line 51) | public static string GetLibraryPath()
    method LoadLibrary (line 58) | private static string LoadLibrary(Assembly assembly)
    method LoadFile (line 66) | public static byte[] LoadFile(Assembly assembly, string name)
    method ProcessRequest (line 75) | internal override async Task<bool> ProcessRequest(HttpContext http)
    method SendLibrary (line 83) | private async Task SendLibrary(HttpContext http)

FILE: src/LaraUI/Middleware/ContentTypes.cs
  class ContentTypes (line 12) | public static class ContentTypes

FILE: src/LaraUI/Middleware/DefaultErrorPage.cs
  class DefaultErrorPage (line 11) | internal class DefaultErrorPage : IPage
    method OnGet (line 16) | public Task OnGet()
    method LoadBootstrap (line 23) | private static void LoadBootstrap()
    method ShowContent (line 43) | private void ShowContent()

FILE: src/LaraUI/Middleware/DiscardHandler.cs
  class DiscardHandler (line 12) | internal sealed class DiscardHandler : BaseHandler
    method DiscardHandler (line 16) | public DiscardHandler(Application app, RequestDelegate next) : base(next)
    method ProcessRequest (line 21) | internal override async Task<bool> ProcessRequest(HttpContext http)

FILE: src/LaraUI/Middleware/DiscardParameters.cs
  class DiscardParameters (line 13) | internal sealed class DiscardParameters
    method TryParse (line 17) | public static bool TryParse(HttpContext context, [NotNullWhen(true)] o...
    method TryParse (line 23) | public static bool TryParse(IQueryCollection query, [NotNullWhen(true)...

FILE: src/LaraUI/Middleware/ErrorPages.cs
  class ErrorPages (line 16) | public sealed class ErrorPages
    method ErrorPages (line 22) | internal ErrorPages(Published published)
    method SetDefaultPage (line 38) | public void SetDefaultPage(HttpStatusCode code, Func<IPage> factory)
    method Remove (line 49) | public void Remove(HttpStatusCode code)
    method GetPage (line 54) | internal PagePublished GetPage(HttpStatusCode code)
    method TryGetPage (line 60) | internal bool TryGetPage(HttpStatusCode code, out PagePublished page)
    method DefaultNotFound (line 66) | internal IPage DefaultNotFound()
    method DefaultServerError (line 76) | internal IPage DefaultServerError()
    method PublishErrorPage (line 85) | internal void PublishErrorPage()
    method PublishErrorImage (line 94) | internal void PublishErrorImage()

FILE: src/LaraUI/Middleware/EventParameters.cs
  class EventParameters (line 18) | [DataContract]
    method TryParse (line 38) | public static bool TryParse(IQueryCollection query, [NotNullWhen(true)...
    method ReadAjaxMessage (line 61) | public async Task ReadAjaxMessage(HttpContext http)
  class SocketEventParameters (line 76) | [DataContract]

FILE: src/LaraUI/Middleware/FormFile.cs
  class FormFile (line 16) | [DataContract]
    method CopyTo (line 40) | public void CopyTo(Stream target)
    method CopyToAsync (line 46) | public Task CopyToAsync(Stream target, CancellationToken cancellationT...
    method OpenReadStream (line 52) | public Stream OpenReadStream()
    method GetBytes (line 58) | private byte[] GetBytes()

FILE: src/LaraUI/Middleware/FormFileCollection.cs
  class FormFileCollection (line 15) | [DataContract]
    method GetCount (line 23) | private int GetCount()
    method GetInnerList (line 32) | private List<FormFile> GetInnerList()
    method GetFile (line 37) | public IFormFile GetFile(string name)
    method GetFiles (line 42) | public IReadOnlyList<IFormFile> GetFiles(string name)
    method GetEnumerator (line 47) | IEnumerator<IFormFile> IEnumerable<IFormFile>.GetEnumerator()
    method GetEnumerator (line 52) | public IEnumerator GetEnumerator()
    method GetEnumeratorInternal (line 57) | private IEnumerator<IFormFile> GetEnumeratorInternal()
    method GetEmptyEnumerator (line 62) | private static IEnumerator<IFormFile> GetEmptyEnumerator()

FILE: src/LaraUI/Middleware/IModeController.cs
  type IModeController (line 13) | internal interface IModeController
    method Start (line 15) | Task<IWebHost> Start(Application app, StartServerOptions options);
    method CreateConnection (line 16) | Connection CreateConnection(IPAddress remoteIp);
  class ModeControllerFactory (line 23) | internal static class ModeControllerFactory
    method Create (line 25) | public static IModeController Create(Application app, ApplicationMode ...
  class BaseModeController (line 33) | internal class BaseModeController : IModeController
    method BaseModeController (line 42) | public BaseModeController(Application app, ApplicationMode mode)
    method CreateConnection (line 54) | public virtual Connection CreateConnection(IPAddress remoteIp)
    method Start (line 60) | public virtual Task<IWebHost> Start(Application app, StartServerOption...

FILE: src/LaraUI/Middleware/KeepAliveHandler.cs
  class KeepAliveHandler (line 14) | internal class KeepAliveHandler : BaseHandler
    method KeepAliveHandler (line 24) | public KeepAliveHandler(Application app, RequestDelegate next) : base(...
    method ProcessRequest (line 29) | internal override Task<bool> ProcessRequest(HttpContext http)
    method IsMatch (line 39) | private static bool IsMatch(HttpContext http)
    method TryGetDocument (line 47) | private bool TryGetDocument(HttpContext http, [NotNullWhen(true)] out ...

FILE: src/LaraUI/Middleware/LaraMiddleware.cs
  class LaraMiddleware (line 16) | public sealed class LaraMiddleware
    method LaraMiddleware (line 26) | public LaraMiddleware(RequestDelegate next, Application app, LaraOptio...
    method Invoke (line 41) | public async Task Invoke(HttpContext http)

FILE: src/LaraUI/Middleware/LocalhostFilter.cs
  class LocalhostFilter (line 18) | public sealed class LocalhostFilter
    method LocalhostFilter (line 28) | public LocalhostFilter(RequestDelegate next, ILogger<LocalhostFilter> ...
    method Invoke (line 39) | public Task Invoke(HttpContext context)

FILE: src/LaraUI/Middleware/MiddlewareCommon.cs
  class MiddlewareCommon (line 19) | internal static class MiddlewareCommon
    method SendStatusReply (line 21) | public static async Task SendStatusReply(HttpContext context, HttpStat...
    method WriteUtf8Buffer (line 28) | public static async Task WriteUtf8Buffer(HttpContext http, string text)
    method WriteBuffer (line 34) | public static async Task WriteBuffer(HttpContext http, byte[] buffer)
    method SetStatusCode (line 39) | public static void SetStatusCode(HttpContext http, HttpStatusCode code)
    method AddHeaderPreventCaching (line 44) | public static void AddHeaderPreventCaching(HttpContext context)
    method AddHeaderNeverExpires (line 49) | public static void AddHeaderNeverExpires(HttpContext context)
    method AddHeaderTextHtml (line 54) | public static void AddHeaderTextHtml(HttpContext http)
    method AddHeaderJSON (line 60) | public static void AddHeaderJSON(HttpContext http)
    method TryFindConnection (line 65) | public static bool TryFindConnection(Application app, HttpContext http...
    method TryGetParameter (line 74) | public static bool TryGetParameter(IQueryCollection query, string name...
    method ReadWebSocketMessage (line 87) | public static async Task<(bool, T?)>
    method ProcessWebSocketMessage (line 102) | internal static (bool, T?) ProcessWebSocketMessage<T>(int maxSize,
    method ReadBody (line 126) | public static async Task<string> ReadBody(HttpContext http)
    method RunHandler (line 136) | public static async Task<bool> RunHandler(HttpContext http, Func<Task>...

FILE: src/LaraUI/Middleware/NotFoundMiddleware.cs
  class NotFoundMiddleware (line 16) | public class NotFoundMiddleware
    method NotFoundMiddleware (line 28) | public NotFoundMiddleware(RequestDelegate next, Application app, LaraO...
    method Invoke (line 39) | public Task Invoke(HttpContext context)

FILE: src/LaraUI/Middleware/PostEventContext.cs
  class PostEventContext (line 14) | internal class PostEventContext
    method PostEventContext (line 25) | public PostEventContext(Application app, HttpContext http)
    method SocketRemainsOpen (line 31) | public bool SocketRemainsOpen()
    method GetSocketCompletion (line 39) | public virtual Task<TaskCompletionSource<bool>> GetSocketCompletion()
    method GetDocument (line 45) | public Document GetDocument()
    method GetConnection (line 50) | public Connection GetConnection()
    method GetSocket (line 55) | public WebSocket GetSocket()
    method GetParameters (line 60) | public EventParameters GetParameters()

FILE: src/LaraUI/Middleware/PostEventHandler.cs
  class PostEventHandler (line 18) | internal sealed class PostEventHandler : BaseHandler
    method PostEventHandler (line 29) | public PostEventHandler(Application app, RequestDelegate next) : base(...
    method ProcessRequest (line 34) | internal override async Task<bool> ProcessRequest(HttpContext http)
    method ProcessWebSocketEvent (line 52) | private static async Task ProcessWebSocketEvent(Application app, HttpC...
    method ProcessAjaxRequest (line 73) | internal static async Task ProcessAjaxRequest(Application app, HttpCon...
    method ProcessRequest (line 90) | private static async Task ProcessRequest(PostEventContext context)
    method ProcessRequestDocument (line 106) | internal static async Task ProcessRequestDocument(PostEventContext con...
    method ProcessRequestDocument (line 130) | private static async Task ProcessRequestDocument(PostEventContext cont...
    method RunEvent (line 140) | private static async Task<Task> RunEvent(PostEventContext post)
    method RunEventHandler (line 153) | internal static async Task<Task> RunEventHandler(PostEventContext post)
    method NotifyEventHandler (line 163) | private static Task NotifyEventHandler(PostEventContext post)
    method ProcessMessageIfNeeded (line 172) | internal static void ProcessMessageIfNeeded(PageContext context, Event...
    method ProcessMessage (line 194) | private static void ProcessMessage(Document document, ClientEventMessa...
    method ProcessFiles (line 208) | private static void ProcessFiles(Document document, IFormFileCollectio...
    method ProcessFile (line 216) | private static void ProcessFile(Document document, IFormFile file)
    method TryParsePrefix (line 227) | private static bool TryParsePrefix(string name, string prefix, [NotNul...
    method SendReply (line 239) | internal static async Task<Task> SendReply(PostEventContext post, stri...
    method SendSocketReply (line 260) | private static async Task SendSocketReply(PostEventContext post, strin...
    method CloseSocket (line 267) | public static Task CloseSocket(WebSocket socket)
    method FlushMessage (line 272) | public static async Task FlushMessage(WebSocket socket, string json)
    method FlushPartialChanges (line 278) | public static async Task FlushPartialChanges(WebSocket socket, Documen...
    method BuildArraySegment (line 284) | internal static ArraySegment<byte> BuildArraySegment(string json)
    method SendAjaxReply (line 295) | private static async Task SendAjaxReply(HttpContext http, string json)
    method SendEvent (line 301) | private static async Task SendEvent(PostEventContext post, EventResult...

FILE: src/LaraUI/Middleware/PublishedItemHandler.cs
  class PublishedItemHandler (line 12) | internal sealed class PublishedItemHandler : BaseHandler
    method PublishedItemHandler (line 17) | public PublishedItemHandler(RequestDelegate next, Application app, Lar...
    method ProcessRequest (line 23) | internal override async Task<bool> ProcessRequest(HttpContext http)

FILE: src/LaraUI/Middleware/Sequencer.cs
  class Sequencer (line 12) | internal class Sequencer
    method Sequencer (line 21) | public Sequencer()
    method WaitForTurn (line 28) | public Task<bool> WaitForTurn(long turnNumber)
    method AbortAll (line 57) | public void AbortAll()
    method FlushPending (line 69) | private void FlushPending()

FILE: src/LaraUI/Middleware/ServerEvent.cs
  class ServerEvent (line 15) | public sealed class ServerEvent : IDisposable
    method ServerEvent (line 22) | internal ServerEvent(Document document)
    method FlushPartialChanges (line 32) | public Task FlushPartialChanges()
    method VerifyNotDisposed (line 38) | internal void VerifyNotDisposed()
    method Dispose (line 49) | public void Dispose()

FILE: src/LaraUI/Middleware/ServerEventsController.cs
  class ServerEventsController (line 13) | internal class ServerEventsController
    method ServerEventsController (line 17) | public ServerEventsController(Document document)
    method CalculateServerEventsStatus (line 30) | internal static ServerEventsStatus CalculateServerEventsStatus(bool en...
    method ServerEventsOn (line 40) | public void ServerEventsOn()
    method ServerEventsOff (line 47) | public Task ServerEventsOff()
    method NotifyUnload (line 53) | public Task NotifyUnload() => DiscardSocket();
    method DiscardSocket (line 55) | private async Task DiscardSocket()
    method SocketRemainsOpen (line 65) | public bool SocketRemainsOpen(string eventName)
    method ServerEventFlush (line 71) | public async Task ServerEventFlush()
    method PrepareFlush (line 83) | private bool PrepareFlush()
    method GetSocketCompletion (line 100) | public async Task<TaskCompletionSource<bool>> GetSocketCompletion(WebS...
    method FlushIfPending (line 109) | private async Task FlushIfPending()
    method StartServerEvent (line 118) | public ServerEvent StartServerEvent()

FILE: src/LaraUI/Middleware/StatusCodeException.cs
  class StatusCodeException (line 15) | public class StatusCodeException : Exception
    method StatusCodeException (line 25) | public StatusCodeException()
    method StatusCodeException (line 33) | public StatusCodeException(string message)
    method StatusCodeException (line 43) | public StatusCodeException(string message, Exception inner)
    method StatusCodeException (line 52) | public StatusCodeException(HttpStatusCode status)
    method StatusCodeException (line 62) | public StatusCodeException(HttpStatusCode status, string message)

FILE: src/LaraUI/Middleware/StatusForbiddenException.cs
  class StatusForbiddenException (line 15) | public class StatusForbiddenException : StatusCodeException
    method StatusForbiddenException (line 20) | public StatusForbiddenException()
    method StatusForbiddenException (line 29) | public StatusForbiddenException(string message)
    method StatusForbiddenException (line 39) | public StatusForbiddenException(string message, Exception inner)

FILE: src/LaraUI/Reactive/BindableBase.cs
  class BindableBase (line 15) | public abstract class BindableBase : INotifyPropertyChanged
    method SetProperty (line 38) | protected bool SetProperty<T>(ref T storage, T value, [CallerMemberNam...
    method OnPropertyChanged (line 57) | protected void OnPropertyChanged([CallerMemberName] string? propertyNa...
    method BeginUpdate (line 75) | public void BeginUpdate()
    method EndUpdate (line 84) | public void EndUpdate()

FILE: src/LaraUI/Reactive/BindingExtensions.cs
  class BindingExtensions (line 16) | public static class BindingExtensions
    method Bind (line 28) | public static TNode Bind<TNode>(
    method BindBack (line 47) | public static TNode BindBack<TNode>(
    method BindChildren (line 70) | public static TParent BindChildren<TParent, TValue>(
    method ForEach (line 100) | public static TParent ForEach<TParent, TValue>(

FILE: src/LaraUI/Reactive/BindingOptions.cs
  class BindOptions (line 17) | public abstract class BindOptions
  class BindPropertyOptions (line 24) | public abstract class BindPropertyOptions : BindOptions
  class BindPropertyOptions (line 32) | public abstract class BindPropertyOptions<T> : BindPropertyOptions
  class BindHandlerOptions (line 45) | public sealed class BindHandlerOptions<T> : BindPropertyOptions<T>
  class BindPropertyOptions (line 59) | public abstract class BindPropertyOptions<TData, TValue> : BindPropertyO...
  class BindInnerTextOptions (line 72) | public sealed class BindInnerTextOptions<T> : BindPropertyOptions<T, str...
  class BindAttributeOptions (line 81) | public sealed class BindAttributeOptions<T> : BindPropertyOptions<T, str...
  class BindFlagAttributeOptions (line 94) | public sealed class BindFlagAttributeOptions<T> : BindPropertyOptions<T,...
  class BindToggleClassOptions (line 107) | public sealed class BindToggleClassOptions<T> : BindPropertyOptions<T, b...
  class BindInputOptions (line 121) | public abstract class BindInputOptions<TData, TValue> : BindPropertyOpti...
  class BindInputOptions (line 139) | public sealed class BindInputOptions<T> : BindInputOptions<T, string?>
  class BindFlagInputOptions (line 148) | public sealed class BindFlagInputOptions<T> : BindInputOptions<T, bool>
  class BindChildrenOptions (line 156) | public abstract class BindChildrenOptions : BindOptions
    method BindChildrenOptions (line 181) | public BindChildrenOptions(ObservableCollection<T> collection, Func<T,...
  class BindChildrenOptions (line 164) | public sealed class BindChildrenOptions<T> : BindChildrenOptions
    method BindChildrenOptions (line 181) | public BindChildrenOptions(ObservableCollection<T> collection, Func<T,...

FILE: src/LaraUI/Reactive/BindingSubscription.cs
  class BindingSubscription (line 11) | internal class BindingSubscription
    method BindingSubscription (line 16) | public BindingSubscription(
    method Unsubscribe (line 25) | public void Unsubscribe() => Source.PropertyChanged -= Handler;

FILE: src/LaraUI/Reactive/CollectionUpdater.cs
  class CollectionUpdater (line 12) | internal class CollectionUpdater<T>
    method CollectionUpdater (line 18) | public CollectionUpdater(Func<T, Element> createCallback,
    method Run (line 27) | public void Run()
    method CollectionAdd (line 49) | private void CollectionAdd()
    method CollectionMove (line 56) | private void CollectionMove()
    method CollectionRemove (line 63) | private void CollectionRemove()
    method CollectionReplace (line 69) | private void CollectionReplace()
    method RemoveAt (line 78) | private void RemoveAt(int index)
    method InsertAt (line 88) | private void InsertAt(int index, Node child)
    method CollectionReset (line 93) | private static void CollectionReset(Element element)
    method UnbindChildren (line 99) | private static void UnbindChildren(Element element)
    method CollectionLoad (line 110) | public static void CollectionLoad(BindChildrenOptions<T> options, Elem...

FILE: src/LaraUI/Reactive/ObsoleteElement.cs
  class ObsoleteElement (line 16) | public static class ObsoleteElement
    method Bind (line 26) | [Obsolete(BindObsolete)]
    method BindAttribute (line 44) | [Obsolete(BindObsolete)]
    method BindFlagAttribute (line 61) | [Obsolete(BindObsolete)]
    method BindToggleAttribute (line 75) | [Obsolete(BindObsolete)]
    method BindToggleClass (line 92) | [Obsolete(BindObsolete)]
    method BindInput (line 110) | [Obsolete(BindObsolete)]
    method BindFlagInput (line 150) | [Obsolete(BindObsolete)]
    method CompileSetter (line 184) | internal static Action<TNode, TValue> CompileSetter<TNode, TValue>(
    method UnbindAttribute (line 202) | [Obsolete("Has no effect anymore. Use UnbindAll instead.")]
    method BindInnerText (line 214) | [Obsolete(BindObsolete)]
    method UnbindInnerText (line 227) | [Obsolete("Has no effect anymore. Use UnbindAll instead.")]
    method UnbindHandler (line 236) | [Obsolete("Has no effect anymore. Use UnbindAll instead.")]
    method UnbindAttributes (line 245) | [Obsolete("Has no effect anymore. Use UnbindAll instead.")]
    method BindChildren (line 257) | [Obsolete("Use BindChildren(source, factory) instead")]
    method UnbindChildren (line 267) | [Obsolete("Has no effect anymore, use UnbindAll when needed")]
    method SetInnerText (line 278) | [Obsolete("Use InnerText property instead.")]

FILE: src/LaraUI/Resources.Designer.cs
  class Resources (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
    method Resources (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...

FILE: src/LaraUI/Tools/ApplicationBuilderLaraExtensions.cs
  class ApplicationBuilderLaraExtensions (line 16) | public static class ApplicationBuilderLaraExtensions
    method UseLara (line 25) | public static IApplicationBuilder UseLara(this IApplicationBuilder app...
    method UseLara (line 57) | [Obsolete("Specify which Lara Application to use in the parameters of ...
    method UseLara (line 67) | [Obsolete("Specify which Lara Application to use in the parameters of ...
    method UseLara (line 80) | public static IApplicationBuilder UseLara(this IApplicationBuilder app...

FILE: src/LaraUI/Tools/AssembliesReader.cs
  class AssembliesReader (line 14) | internal static class AssembliesReader
    method LoadAssemblies (line 16) | public static void LoadAssemblies(Application app)
    method GetAssembliesReferencingLara (line 24) | private static IEnumerable<Assembly> GetAssembliesReferencingLara()
    method IncludeAssembly (line 36) | private static bool IncludeAssembly(Assembly assembly, string definedIn)
    method LoadAssembly (line 43) | private static void LoadAssembly(Application app, Assembly assembly)
    method LoadWebServices (line 61) | private static void LoadWebServices(Application app, Type type)
    method VerifyType (line 77) | internal static void VerifyType(Type assemblyType, string attribute, T...
    method LoadBinaryServices (line 84) | private static void LoadBinaryServices(Application app, Type type)
    method LoadPages (line 100) | private static void LoadPages(Application app, Type type)
    method LoadComponents (line 110) | private static void LoadComponents(Application app, Type type)

FILE: src/LaraUI/Tools/AsyncEvent.cs
  class AsyncEvent (line 25) | public class AsyncEvent : AsyncEvent<EventArgs>
    method AsyncEvent (line 43) | public AsyncEvent()
    method Subscribe (line 55) | public void Subscribe(Func<Task> action)
    method Subscribe (line 65) | public void Subscribe(AsyncEventHandler<T> handler)
    method Subscribe (line 75) | public void Subscribe(AsyncEvent<T> other)
    method Subscribe (line 85) | public void Subscribe(Action handler)
    method Unsubscribe (line 95) | public void Unsubscribe(AsyncEventHandler<T> handler)
    method Unsubscribe (line 105) | public void Unsubscribe(AsyncEvent<T> handler)
    method Unsubscribe (line 115) | public void Unsubscribe(Func<Task> action)
    method Unsubscribe (line 125) | public void Unsubscribe(Action action)
    method InvokeAsync (line 137) | public async Task InvokeAsync(object sender, T args)
  class AsyncEvent (line 33) | public class AsyncEvent<T> where T : EventArgs
    method AsyncEvent (line 43) | public AsyncEvent()
    method Subscribe (line 55) | public void Subscribe(Func<Task> action)
    method Subscribe (line 65) | public void Subscribe(AsyncEventHandler<T> handler)
    method Subscribe (line 75) | public void Subscribe(AsyncEvent<T> other)
    method Subscribe (line 85) | public void Subscribe(Action handler)
    method Unsubscribe (line 95) | public void Unsubscribe(AsyncEventHandler<T> handler)
    method Unsubscribe (line 105) | public void Unsubscribe(AsyncEvent<T> handler)
    method Unsubscribe (line 115) | public void Unsubscribe(Func<Task> action)
    method Unsubscribe (line 125) | public void Unsubscribe(Action action)
    method InvokeAsync (line 137) | public async Task InvokeAsync(object sender, T args)

FILE: src/LaraUI/Tools/ClassEditor.cs
  class ClassEditor (line 9) | internal static class ClassEditor
    method AddClass (line 11) | public static string? AddClass(string? previous, string name)
    method RemoveClass (line 25) | public static string? RemoveClass(string? previous, string name)
    method ToggleClass (line 58) | public static string? ToggleClass(string? previous, string name, bool ...
    method ToggleClass (line 63) | public static string? ToggleClass(string? previous, string name)
    method HasClass (line 69) | public static bool HasClass(string? elementClass, string className)

FILE: src/LaraUI/Tools/DocumentLocal.cs
  class DocumentLocal (line 16) | public class DocumentLocal<T>
    method DocumentLocal (line 23) | public DocumentLocal()
    method GetValue (line 37) | private T GetValue()
    method SetValue (line 44) | private void SetValue(T value)
    method GetDocument (line 63) | private static Document GetDocument()

FILE: src/LaraUI/Tools/LaraBuilder.cs
  class LaraBuilder (line 19) | public sealed class LaraBuilder
    method LaraBuilder (line 29) | public LaraBuilder(Element startingElement)
    method Push (line 47) | public LaraBuilder Push(string tagName, string? className = null, stri...
    method Push (line 60) | public LaraBuilder Push(string tagName, string? className, string? id,...
    method PushNS (line 81) | public LaraBuilder PushNS(string ns, string tagName)
    method Push (line 92) | public LaraBuilder Push(Element element)
    method Push (line 105) | public LaraBuilder Push(Element element, string? className)
    method Pop (line 118) | public LaraBuilder Pop()
    method GetCurrent (line 136) | public LaraBuilder GetCurrent(out Element element)
    method AddTextNode (line 152) | [Obsolete("Use AppendText() or AppendData() instead of AddTextNode")]
    method AddTextNode (line 164) | [Obsolete("Use AppendText() or AppendData() instead of AddTextNode")]
    method AppendText (line 177) | public LaraBuilder AppendText(string text)
    method AppendData (line 187) | public LaraBuilder AppendData(string data)
    method AppendEncode (line 192) | private LaraBuilder AppendEncode(string value, bool encode)
    method InnerText (line 206) | public LaraBuilder InnerText(string text)
    method InnerData (line 216) | public LaraBuilder InnerData(string data)
    method InnerEncode (line 221) | private LaraBuilder InnerEncode(string data, bool encode)
    method AddNode (line 235) | public LaraBuilder AddNode(Node node)
    method AddNodes (line 248) | public LaraBuilder AddNodes(IEnumerable<Node> nodes)
    method AddNodes (line 264) | public LaraBuilder AddNodes(IEnumerable<Element> nodes)
    method Add (line 280) | public LaraBuilder Add(Action<LaraBuilder> action)
    method Attribute (line 297) | public LaraBuilder Attribute(string attribute, string value)
    method EnsureElementId (line 308) | [Obsolete("Not needed anymore")]
    method FlagAttribute (line 321) | public LaraBuilder FlagAttribute(string attribute, bool value)
    method AddClass (line 333) | public LaraBuilder AddClass(string className)
    method RemoveClass (line 344) | public LaraBuilder RemoveClass(string className)
    method ToggleClass (line 355) | public LaraBuilder ToggleClass(string className)
    method ToggleClass (line 367) | public LaraBuilder ToggleClass(string className, bool value)
    method On (line 382) | public LaraBuilder On(EventSettings settings)
    method On (line 394) | public LaraBuilder On(string eventName, Func<Task> handler)
    method On (line 406) | public LaraBuilder On(string eventName, Action handler)
    method FlushEvent (line 422) | public LaraBuilder FlushEvent(string eventName)
    method Bind (line 437) | public LaraBuilder Bind(INotifyPropertyChanged source, Action<Element>...
    method BindBack (line 448) | public LaraBuilder BindBack(Action<Element> onChange)
    method BindChildren (line 461) | public LaraBuilder BindChildren<TValue>(ObservableCollection<TValue> s...
    method BindAttribute (line 479) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindFlagAttribute (line 500) | [Obsolete("Use BindToggleAttribute() instead.")]
    method BindToggleAttribute (line 516) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindToggleClass (line 537) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindAttribute (line 556) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindFlagAttribute (line 571) | [Obsolete("Use BindToggleAttribute() instead.")]
    method BindToggleAttribute (line 585) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindToggleClass (line 600) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindAttribute (line 617) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindFlagAttribute (line 638) | [Obsolete("Use instad the BindToggleAttribute() method.")]
    method BindToggleAttribute (line 654) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindToggleClass (line 675) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindInnerText (line 695) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindInnerText (line 714) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindInnerText (line 732) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindChildren (line 748) | public LaraBuilder BindChildren<T>(ObservableCollection<T> collection,...
    method BindChildren (line 760) | [Obsolete("Use BindChildren(source, factory) instead")]
    method BindInput (line 774) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindInput (line 791) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindFlagInput (line 810) | [Obsolete(ObsoleteElement.BindObsolete)]
    method BindFlagInput (line 827) | [Obsolete(ObsoleteElement.BindObsolete)]
    method Bind (line 847) | [Obsolete(ObsoleteElement.BindObsolete)]
    method Bind (line 866) | [Obsolete(ObsoleteElement.BindObsolete)]
    method Bind (line 884) | [Obsolete(ObsoleteElement.BindObsolete)]

FILE: src/LaraUI/Tools/LaraJson.cs
  class LaraJson (line 17) | public sealed class LaraJson
    method TryParse (line 27) | public bool TryParse<T>(string json, [NotNullWhen(true)] out T? result...
    method Parse (line 48) | public T Parse<T>(string json) where T : class
    method Stringify (line 76) | public string Stringify<T>(T instance) => LaraTools.Serialize(instance);
    method Stringify (line 84) | public string Stringify(object instance, Type type) => LaraTools.Seria...
    method LaraJson (line 86) | internal LaraJson()

FILE: src/LaraUI/Tools/LaraOptions.cs
  type ApplicationMode (line 17) | public enum ApplicationMode
  class LaraOptions (line 34) | public class LaraOptions
  class StartServerOptions (line 75) | public class StartServerOptions : LaraOptions
    method StartServerOptions (line 109) | public StartServerOptions()

FILE: src/LaraUI/Tools/LaraTools.cs
  class LaraTools (line 23) | internal static class LaraTools
    method LaunchBrowser (line 25) | public static void LaunchBrowser(IWebHost host)
    method GetFirstUrl (line 31) | public static string GetFirstUrl(IWebHost webHost)
    method LaunchBrowser (line 39) | public static void LaunchBrowser(string url)
    method Serialize (line 55) | public static string Serialize<T>(T instance)
    method Serialize (line 60) | public static string Serialize(object? instance, Type type)
    method Deserialize (line 74) | public static T? Deserialize<T>(string json) where T : class
    method Deserialize (line 80) | public static T? Deserialize<T>(Stream stream) where T : class
    method Compress (line 86) | public static byte[] Compress(byte[] data)
    method SameValue (line 96) | public static bool SameValue<T>([AllowNull] T previous, [AllowNull] T ...

FILE: src/LaraUI/Tools/NoCurrentSessionException.cs
  class NoCurrentSessionException (line 14) | public class NoCurrentSessionException : InvalidOperationException
    method NoCurrentSessionException (line 20) | public NoCurrentSessionException(string message) : base(message)
    method NoCurrentSessionException (line 29) | public NoCurrentSessionException(string message, Exception innerExcept...
    method NoCurrentSessionException (line 36) | public NoCurrentSessionException()

FILE: src/LaraUI/Tools/SemaphoreSlimExtensions.cs
  class SemaphoreSlimExtensions (line 13) | internal static class SemaphoreSlimExtensions
    method UseWaitAsync (line 15) | public static async Task<IDisposable> UseWaitAsync(
    method UseWait (line 23) | public static IDisposable UseWait(this SemaphoreSlim semaphore,
    class ReleaseWrapper (line 30) | private class ReleaseWrapper : IDisposable
      method ReleaseWrapper (line 36) | public ReleaseWrapper(SemaphoreSlim semaphore)
      method Dispose (line 41) | public void Dispose()

FILE: src/LaraUI/Tools/ServerLauncher.cs
  class ServerLauncher (line 14) | internal static class ServerLauncher
    method StartServer (line 18) | public static async Task<IWebHost> StartServer(Application app, StartS...
    method CreateBrowserHost (line 25) | private static IWebHost CreateBrowserHost(Application laraApp, StartSe...
    method ConfigureApp (line 39) | private static void ConfigureApp(IApplicationBuilder app, Application ...
    method ConfigureExceptions (line 45) | internal static void ConfigureExceptions(IApplicationBuilder app, Appl...

FILE: src/LaraUI/Tools/SessionLocal.cs
  class SessionLocal (line 16) | public class SessionLocal<T>
    method SessionLocal (line 23) | public SessionLocal()
    method GetValue (line 38) | private T GetValue()
    method SetValue (line 45) | private void SetValue([AllowNull] T value)
    method Store (line 64) | private void Store([AllowNull] T value, Session session)
    method GetSession (line 72) | private static Session GetSession()

FILE: src/SampleProject/Common/CountryList.cs
  class Country (line 11) | internal class Country
    method Country (line 13) | public Country(string code, string name)
  class CountryList (line 23) | internal static class CountryList
    method SearchCountries (line 271) | public static IEnumerable<Country> SearchCountries(string term)

FILE: src/SampleProject/Common/CountrySelector.cs
  class CountrySelector (line 13) | internal class CountrySelector : WebComponent, IAutocompleteProvider
    method CountrySelector (line 15) | public CountrySelector()
    method GetAutocompleteList (line 71) | public Task<AutocompleteResponse> GetAutocompleteList(string term)

FILE: src/SampleProject/Common/SampleAppBootstrap.cs
  class SampleAppBootstrap (line 11) | internal static class SampleAppBootstrap
    method AppendTo (line 13) | public static void AppendTo(Element head)

FILE: src/SampleProject/Common/Tools.cs
  class Tools (line 13) | internal class Tools
    method LoadEmbeddedResource (line 15) | public static byte[] LoadEmbeddedResource(Assembly assembly, string re...
    method GetSpinnerHtml (line 24) | public static string GetSpinnerHtml(string message)

FILE: src/SampleProject/Components/CheckboxSample.cs
  class CheckboxSample (line 12) | internal class CheckboxSample : WebComponent
    method CheckboxSample (line 14) | public CheckboxSample()

FILE: src/SampleProject/Components/CounterSample.cs
  class CounterSample (line 11) | internal class CounterSample : WebComponent
    method TextToInt (line 16) | private static int TextToInt(string? value)
    method CounterSample (line 21) | public CounterSample()

FILE: src/SampleProject/Components/KitchenSinkComponent.cs
  class KitchenSinkComponent (line 12) | internal class KitchenSinkComponent : WebComponent
    method KitchenSinkComponent (line 14) | public KitchenSinkComponent()

FILE: src/SampleProject/Components/LockingSample.cs
  class LockingSample (line 13) | internal class LockingSample : WebComponent
    method LockingSample (line 15) | public LockingSample()

FILE: src/SampleProject/Components/LongRunningSample.cs
  class LongRunningSample (line 12) | internal class LongRunningSample : WebComponent
    method LongRunningSample (line 21) | public LongRunningSample()

FILE: src/SampleProject/Components/MultiselectSample.cs
  class MultiselectSample (line 11) | internal class MultiselectSample : WebComponent
    method MultiselectSample (line 13) | public MultiselectSample()

FILE: src/SampleProject/Components/SelectSample.cs
  class SelectSample (line 11) | internal class SelectSample : WebComponent
    method SelectSample (line 15) | public SelectSample()

FILE: src/SampleProject/Components/UploadSample.cs
  class UploadSample (line 13) | internal class UploadSample : WebComponent
    method UploadSample (line 15) | public UploadSample()
    method GetUploadText (line 76) | private static string GetUploadText(HtmlInputElement input)
    method GetFileNames (line 86) | private static IEnumerable<string> GetFileNames(HtmlInputElement input)

FILE: src/SampleProject/Components/WeekdayCombo.cs
  class WeekdayCombo (line 11) | public class WeekdayCombo : WebComponent
    method WeekdayCombo (line 20) | public WeekdayCombo()
    method NextDay (line 32) | public void NextDay()

FILE: src/SampleProject/Main/Program.cs
  class Program (line 14) | internal static class Program
    method Main (line 16) | private static async Task Main()

FILE: src/SampleProject/Pages/KitchenSinkPage.cs
  class KitchenSinkPage (line 14) | internal class KitchenSinkPage : IPage
    method OnGet (line 16) | public Task OnGet()
    method PublishMugImage (line 28) | public static void PublishMugImage(Application app)

FILE: src/SampleProject/Pages/ServerEventsPage.cs
  class ServerEventsPage (line 12) | internal class ServerEventsPage : IPage
    method ServerEventsPage (line 16) | public ServerEventsPage()
    method OnGet (line 22) | public Task OnGet()
    method DelayedTask (line 30) | private async void DelayedTask()

FILE: src/SampleProject/Pages/UploadFilePage.cs
  class UploadFilePage (line 13) | internal class UploadFilePage : IPage
    method OnGet (line 15) | public Task OnGet()

FILE: src/Tests/Components/AutocompleteTesting.cs
  class MyProvider (line 16) | internal class MyProvider : IAutocompleteProvider
    method GetAutocompleteList (line 18) | public Task<AutocompleteResponse> GetAutocompleteList(string term)
  class AutocompleteTesting (line 44) | public class AutocompleteTesting : DummyContextTesting
    method AutocompleteTesting (line 46) | public AutocompleteTesting()
    method InnerInputValue (line 55) | [Fact]
    method AutocompleteOptionsStore (line 66) | [Fact]
    method AutocompleteStarts (line 83) | [Fact]
    method AutocompleteStartStop (line 116) | [Fact]
    method OnDisconnectStops (line 142) | [Fact]
    method AutocompleteEntry (line 169) | [Fact]
    method AutocompleteResponse (line 185) | [Fact]
    method AutocompleteServiceRun (line 196) | [Fact]
    method RegistryReplacesEntries (line 230) | [Fact]
    method ExecuteNotFoundReturnsEmpty (line 243) | [Fact]

FILE: src/Tests/Components/ComponentTesting.cs
  class MyDummyComponent (line 17) | [LaraWebComponent("x-dummy")]
    method MyDummyComponent (line 22) | public MyDummyComponent() : base("x-dummy")
    method GetObservedAttributes (line 26) | protected override IEnumerable<string> GetObservedAttributes()
    method OnMove (line 31) | protected override void OnMove()
  class Xcom (line 38) | [LaraWebComponent("x-com")]
    method Xcom (line 42) | public Xcom() : base("x-com")
  class LightCom (line 55) | [LaraWebComponent("x-light")]
    method LightCom (line 58) | public LightCom() : base("x-light")
  class MySlotter (line 63) | [LaraWebComponent("x-slotter")]
    method MySlotter (line 66) | public MySlotter() : base("x-slotter")
  class MyTwoDivComponent (line 75) | [LaraWebComponent("x-twodiv")]
    method MyTwoDivComponent (line 78) | public MyTwoDivComponent(bool useShadow) : base("x-twodiv")
  class ObsoleteComponent (line 86) | [LaraWebComponent("x-obsolete")]
    method ObsoleteComponent (line 89) | public ObsoleteComponent() : base("x-obsolete")
    method Test (line 95) | [Obsolete]
  class ComponentTesting (line 103) | public class ComponentTesting : IDisposable
    method ComponentTesting (line 107) | public ComponentTesting()
    method Dispose (line 117) | public void Dispose()
    method RegisterComponentSucceeds (line 123) | [Fact]
    class MyComponent (line 137) | private class MyComponent : WebComponent
      method MyComponent (line 139) | public MyComponent() : base("x-caca")
    class MyPage (line 144) | private class MyPage : IPage
      method OnGet (line 146) | public Task OnGet()
    method ServerEventsOnSucceeds (line 152) | [Fact]
    method CreateMockPage (line 163) | private PageContext CreateMockPage()
    method WebComponentListsAllDescendents (line 175) | [Fact]
    method FlattenedChildrenIncludesPrintedOnes (line 197) | [Fact]
    method GetAllDescendents (line 221) | private static IEnumerable<Node> GetAllDescendents(Element element)
    method GetFlattened (line 226) | private static IEnumerable<Node> GetFlattened(Element element)
    method RecursiveExtension (line 231) | private static IEnumerable<Node> RecursiveExtension(Element root, Func...
    method GetSlotElementFinds (line 244) | [Fact]
    method ComponentNotifiedAttributeChanged (line 278) | [Fact]
    class MyAttributeSubscriptor (line 291) | private class MyAttributeSubscriptor : WebComponent
      method MyAttributeSubscriptor (line 293) | public MyAttributeSubscriptor() : base("x-att")
      method GetObservedAttributes (line 299) | protected override IEnumerable<string> GetObservedAttributes()
      method OnAttributeChanged (line 304) | protected override void OnAttributeChanged(string attribute)
    method ObservedOnlyAttributeDoesNothing (line 313) | [Fact]
    method PublishAssembliesComponent (line 323) | [Fact]
    method SlotsPrintHostElements (line 331) | [Fact]
    method OrphanSlotPrintsItself (line 350) | [Fact]
    method SlotNameSetsAttribute (line 363) | [Fact]
    method WebComponentsRequireDash (line 374) | [Fact]
    method WebComponentsMustInherit (line 390) | [Fact]
    method CannotRegisterSameTagTwice (line 406) | [Fact]
    method VerifyComponentSameType (line 423) | [Fact]
    method NotifyMovedCalledDirectly (line 429) | [Fact]
    method GetContentNodeReturnsShadowChildren (line 444) | [Fact]
    method AttachShadowExecutes (line 458) | [Fact]
    method ParentSlotNotSlotting (line 467) | [Fact]
    method ShadowLightSlottedEmpty (line 479) | [Fact]
    method ShadowNotPrintable (line 489) | [Fact]
    method SlotNameMatches (line 500) | [Fact]
    method TriggerEventRuns (line 510) | [Fact]
    method ContentPlaceholderClass (line 525) | [Fact]

FILE: src/Tests/DOM/AttributesTesting.cs
  class AttributesTesting (line 17) | public class AttributesTesting : DummyContextTesting
    method HasAttributeFindsAttribute (line 19) | [Fact]
    method ValueAttributeEnqueued (line 29) | [Fact]
    method CreateDocument (line 43) | private static Document CreateDocument()
    method SetFlagAttributeAddsNullValue (line 50) | [Fact]
    method GetNonExistingReturnsEmpty (line 70) | [Fact]
    method RemovingAttributeRemovesValue (line 77) | [Fact]
    method ReplacingSameValueNoQueue (line 86) | [Fact]
    method NotifySelectedSetsSelected (line 98) | [Fact]
    method CreateNsSetsXlmns (line 109) | [Fact]
    method RemoveAttributeMissingSucceeds (line 116) | [Fact]
    method AttributesNotifyValueRemovesPrevious (line 127) | [Fact]
    method MaxLevelDeep (line 136) | [Fact]
    method ToggleClassFlipsClass (line 151) | [Fact]
    method ElementToggleClass (line 158) | [Fact]
    method TagNameCannotHaveSpaces (line 167) | [Fact]
    method NotifyFlagSkipsSameValue (line 182) | [Fact]
    method NotifyValueSkipsSameValue (line 193) | [Fact]
    method ModifySlotElementWithParent (line 204) | [Fact]
    method SetInnerText (line 213) | [Fact]
    method AppendNodeInnerText (line 222) | [Fact]
    method GetNodeInnerText (line 232) | [Fact]
    method NodeInnerText (line 246) | [Fact]
    method InputFilesAdd (line 255) | [Fact]

FILE: src/Tests/DOM/BindingsTesting.cs
  class MyInputData (line 15) | internal class MyInputData : BindableBase
  class BindingsTesting (line 32) | public class BindingsTesting : DummyContextTesting
    method SetInnerTextSetsText (line 34) | [Fact]
    method VerifyInnerData (line 43) | private static void VerifyInnerData(Element element, string data)
    method InnerTextReplacesPrevious (line 50) | [Fact]
    method BindInnerTextUpdates (line 61) | [Fact]
    method BindGenericExecutes (line 76) | [Fact]
    method BindActionExecutes (line 91) | [Fact]
    method BindAttributeExecutes (line 102) | [Fact]
    method BindChildrenUpdates (line 118) | [Fact]
    method UnbindAllUnbinds (line 132) | [Fact]
    method UnbindAtributeRuns (line 166) | [Fact]
    method UnbindAttributeRemovesAllAttributes (line 184) | [Fact]
    method UnbindInnerTextWorks (line 209) | [Fact]
    method UnbindHandlerWorks (line 229) | [Fact]
    method UnbindChildrenWorks (line 242) | [Fact]
    method GenericBindingDetectsCycles (line 255) | [Fact]
    method MyCreateCallback (line 284) | [Obsolete("old methods")]
    class MyData (line 297) | private class MyData : BindableBase
      method MyData (line 301) | public MyData()
      method MyData (line 305) | public MyData(int counter)
      method ToString (line 318) | public override string ToString() => Counter.ToString();
    method BindableBaseSkipsUnncesaryEvents (line 321) | [Fact]
    method CollectionUpdaterMove (line 331) | [Fact]
    method VerifyPositions (line 354) | private static void VerifyPositions(IReadOnlyList<MyData> collection, ...
    method VerifyPosition (line 364) | private static void VerifyPosition(Element div, int position, string v...
    method BindFlagAttributeBinds (line 371) | [Fact]
    method BindToggleClassBinds (line 388) | [Fact]
    method LaraFlagBinding (line 405) | [Fact]
    method BindableBaseHoldsEvents (line 418) | [Fact]
    method InputBindingGetter (line 431) | [Fact]
    method InputBindingGetterLara (line 451) | [Fact]
    method InputBindingGetterLaraFlag (line 467) | [Fact]
    method InvalidSetterThrows (line 483) | [Fact]
    method InputBindingCollects (line 500) | [Fact]
    method InputBindingCollectsFlag (line 516) | [Fact]
    method LaraBindFlagAttribute (line 532) | [Fact]

FILE: src/Tests/DOM/BuilderTesting.cs
  class BuilderTesting (line 17) | public class BuilderTesting : DummyContextTesting
    method PushAdds (line 19) | [Fact]
    method TooManyPops (line 33) | [Fact]
    method AddSiblings (line 43) | [Fact]
    method AddTextNodeEncodes (line 54) | [Fact]
    method AddElements (line 66) | [Fact]
    method AddNodes (line 81) | [Fact]
    method AddAction (line 96) | [Fact]
    method MyAddAction (line 106) | [Obsolete("Old methods")]
    method SetAttribute (line 112) | [Fact]
    method SetFlag (line 122) | [Fact]
    method OnEvent (line 132) | [Fact]
    method OnEventSimple (line 152) | [Fact]
    method PushClassName (line 168) | [Fact]
    method PushNS (line 181) | [Fact]
    method PushElementClass (line 195) | [Fact]
    method SessionIdAvailable (line 206) | [Fact]

FILE: src/Tests/DOM/ClassEditorTesting.cs
  class ClassEditorTesting (line 11) | public class ClassEditorTesting
    method HasEmptyClassTrue (line 13) | [Fact]
    method EmptyClassFalse (line 19) | [Fact]
    method HasClassTrue (line 25) | [Fact]
    method RemoveClass (line 35) | [Fact]
    method AddClass (line 48) | [Fact]

FILE: src/Tests/DOM/DomOperationsTesting.cs
  class DomOperationsTesting (line 17) | public class DomOperationsTesting : DummyContextTesting
    method DomOperationsTesting (line 21) | public DomOperationsTesting()
    method AddElementWithId (line 26) | [Fact]
    method CreateDocument (line 36) | internal static Document CreateDocument()
    method AddBranchWithId (line 43) | [Fact]
    method RemoveElementWithId (line 55) | [Fact]
    method RemoveBranchWithIdInside (line 65) | [Fact]
    method CannotRemoveDocumentHead (line 77) | [Fact]
    method CannotRemoveDocumentBody (line 84) | [Fact]
    method CannotAddDuplicateId (line 91) | [Fact]
    method CannotInsertDuplicateId (line 103) | [Fact]
    method CannotAddNodeInsideItself (line 117) | [Fact]
    method Throws (line 126) | internal static void Throws<T>(Action action) where T : Exception
    method ThrowsAsync (line 140) | internal static async Task ThrowsAsync<T>(Func<Task> action) where T :...
    method TextNodeContent (line 154) | [Fact]
    method InsertBeforeInserts (line 165) | [Fact]
    method GenerateIdsForEvents (line 181) | [Fact]
    method GenerateIdsForEventsInsert (line 196) | [Fact]
    method TransferElementBetweenDocuments (line 212) | [Fact]
    method RemoveTextNode (line 225) | [Fact]
    method RemoveElement (line 243) | [Fact]
    method NodeAdded (line 260) | [Fact]
    method NodeInsertedDelta (line 281) | [Fact]
    method FocusFailsOnGet (line 305) | [Fact]
    method RemoveOrphanThrows (line 312) | [Fact]
    method InsertBeforeUnknownThrows (line 319) | [Fact]
    method RemoveUnknownChildThrows (line 328) | [Fact]
    method ClearChildrenRemovesThem (line 336) | [Fact]
    method InsertAtSucceeds (line 349) | [Fact]
    method RemoveAtSucceeds (line 363) | [Fact]
    method MissingEventNameThrows (line 376) | [Fact]
    method DocumentGetElementById (line 392) | [Fact]
    method DocumentOnUnloadExecutes (line 403) | [Fact]
    method SwapChildrenSwaps (line 413) | [Fact]
    method InputNotifyValueUpdates (line 441) | [Fact]
    method ElementGetChildPosition2nd (line 455) | [Fact]
    method RemoveEventRemovesIt (line 468) | [Fact]
    method ElementAppendDataWorks (line 477) | [Fact]
    class DummyAdoptable (line 488) | private class DummyAdoptable : WebComponent
      method DummyAdoptable (line 492) | public DummyAdoptable() : base("x-adoptable")
      method OnAdopted (line 496) | protected override void OnAdopted()
    method NotifyAdoptedPassedToChildren (line 502) | [Fact]
    method SetInnerDataSetsData (line 521) | [Fact]
    method SetInnerTextReplacesText (line 532) | [Fact]
    method SetInnerDataReplacesData (line 544) | [Fact]
    method RemoveEventYieldsDelta (line 556) | [Fact]
    method ElementGetHtml (line 582) | [Fact]
    method FocusEnqueues (line 590) | [Fact]
    method ButtonNotifyValue (line 604) | [Fact]
    method TextNodeAppendData (line 616) | [Fact]
    method TextNodeAppendText (line 624) | [Fact]

FILE: src/Tests/DOM/ElementAttributes.cs
  class ElementAttributes (line 19) | public class ElementAttributes : DummyContextTesting
    method ElementProperties (line 23) | [Fact]
    method ElementNeedsTag (line 50) | [Fact]
    method TestElement (line 56) | private void TestElement<T>(string tagName) where T : Element
    method TestProperties (line 64) | private void TestProperties(Element instance)
    method TestProperty (line 76) | private void TestProperty(Element instance, PropertyInfo property)
    method GetTestValue (line 88) | private bool GetTestValue(Type type, [NotNullWhen(true)] out object? v...
    method GetChildPositionNotFound (line 111) | [Fact]
    method ElementDescendsFromItself (line 120) | [Fact]
    method SetIntAttribute (line 127) | [Fact]
    method ElementOnOptions (line 139) | [Fact]
    method RemoveClassRemovesClass (line 159) | [Fact]
    method AddClassAddsClass (line 170) | [Fact]
    method SetFlagAttributes (line 178) | [Fact]
    method InputAttributes (line 186) | [Fact]
    method EncodeTextNode (line 200) | [Fact]
    method ImageProperties (line 209) | [Fact]
    method OrderedListAttributes (line 221) | [Fact]
    method TextAreaProperties (line 231) | [Fact]
    method NotifyValueTextArea (line 245) | [Fact]
    method TableHeaderProperties (line 256) | [Fact]
    method EventSettingsAttributes (line 268) | [Fact]
    method LaraOptionsProperties (line 288) | [Fact]
    method DuplicateElementEmptyConstructor (line 306) | [Fact]
    method DuplicateElementInner (line 313) | [Fact]
    method TableCellProperties (line 322) | [Fact]
    method ColGroupProperties (line 334) | [Fact]
    method LoopSelectOptions (line 344) | [Fact]
    method SelectProperties (line 357) | [Fact]
    method SelectNotifyValue (line 367) | [Fact]
    method SelectAddOption (line 378) | [Fact]
    method OptionWithValueGetsSelected (line 391) | [Fact]
    method AddGroupWithSelectedOption (line 406) | [Fact]
    method AddSelectedOptionInGroup (line 423) | [Fact]
    method SelectValueChangeOnChildOptions (line 440) | [Fact]
    method MeterProperties (line 465) | [Fact]
    method ElementToStringSuffix (line 485) | [Fact]
    method IgnoreNotificationsNotFound (line 494) | [Fact]
    method AppendTextMergesNodes (line 502) | [Fact]

FILE: src/Tests/DOM/EventsTesting.cs
  class EventsTesting (line 17) | public class EventsTesting : DummyContextTesting
    method AddRemoveHandler (line 19) | [Fact]
    method AddRemoveHandlerRegistry (line 39) | [Fact]
    method CreateMessageContext (line 65) | private void CreateMessageContext()
    method DebounceStored (line 75) | [Fact]
    method DocumentProcessesMessageListeners (line 85) | [Fact]
    method DocumentOnMessageRuns (line 104) | [Fact]
    method AsyncEventDispatches (line 121) | [Fact]
    method AsyncEventPassesAlong (line 140) | [Fact]
    method AsyncEventSubscribeHandler (line 160) | [Fact]
    method AsyncEventSyncHandler (line 180) | [Fact]
    method DocumentEvent (line 195) | [Fact]
    method DocumentGuidToString (line 214) | [Fact]

FILE: src/Tests/DOM/GlobalAttributesTesting.cs
  class GlobalAttributesTesting (line 15) | public class GlobalAttributesTesting : DummyContextTesting
    method AccessKey (line 17) | [Fact]
    method ElementToString (line 66) | [Fact]
    method SetAttributeId (line 75) | [Fact]
    method GetChildPositionNotFound (line 83) | [Fact]
    method GrandchildDescendsFromElement (line 92) | [Fact]
    method InsertChildAfter (line 103) | [Fact]
    method GetContentNodeElement (line 118) | [Fact]
    method InlineChildElementsPrintedInline (line 137) | [Fact]
    method AddDuplicateIdThrows (line 150) | [Fact]
    method CheckedFalseFlushed (line 160) | [Fact]
    method CheckedTrueFlushed (line 180) | [Fact]
    method NotifyCheckedTrueAdds (line 199) | [Fact]

FILE: src/Tests/DOM/LaraBuilderTesting.cs
  class LaraBuilderTesting (line 14) | [Obsolete("old methods")]
    method LaraBuilderTesting (line 20) | public LaraBuilderTesting()
    method OnStringAction (line 26) | [Fact]
    method ToggleClassStringBool (line 35) | [Fact]
    method ToggleClassString (line 42) | [Fact]
    method RemoveClass (line 49) | [Fact]
    method AddClass (line 57) | [Fact]
    method GetCurrent (line 64) | [Fact]
    method BindOptions (line 71) | [Fact]
    method BindValueActions (line 85) | [Fact]
    method BindChildrenOptions (line 95) | [Fact]
    method BindChildrenCollectionElement (line 104) | [Fact]
    method BindChildenCollectionElement (line 113) | [Fact]
    method BindInnerTextOptions (line 122) | [Fact]
    method VerifyInnerText (line 135) | private static void VerifyInnerText(Element element, string data)
    method BindInnerTextExpanded (line 143) | [Fact]
    method BindInnerTextValueFuncString (line 152) | [Fact]
    method BindAttributeOptions (line 161) | [Fact]
    method BindAttributeExpanded (line 175) | [Fact]
    method BindAttributeStringFuncString (line 184) | [Fact]
    method BindActionElement (line 193) | [Fact]
    class MyData (line 202) | private class MyData : BindableBase
    method AddTextNode1 (line 213) | [Fact]
    method AddTextNode2 (line 225) | [Fact]
    method InnerText (line 237) | [Fact]
    method InnerData (line 248) | [Fact]
    method AppendData (line 259) | [Fact]
    method EnsureElementId (line 270) | [Fact]
    method ToggleClass1 (line 279) | [Fact]
    method ToggleClass2 (line 296) | [Fact]
    method ToggleClass3 (line 308) | [Fact]

FILE: src/Tests/Delta/AttributeEditTesting.cs
  class AttributeEditTesting (line 14) | public class AttributeEditTesting : DummyContextTesting
    method AttributeEdited (line 16) | [Fact]
    method UnchangedIdNoSteps (line 32) | [Fact]
    method SetValueDeltaProperties (line 44) | [Fact]
    method CreateDocument (line 60) | private static Document CreateDocument()
    method PlugOptionsHasEmptyConstructor (line 69) | [Fact]
    method ClearChildrenOnEvent (line 76) | [Fact]
    method ToggleClassToggles (line 90) | [Fact]
    method DocumentCreatesElements (line 100) | [Fact]
    method DocumentCreatesText (line 107) | [Fact]
    method ClearChildrenElement (line 115) | [Fact]
    method PlugOptionsBlocking (line 125) | [Fact]
    method ServerEventsDeltaCorrectType (line 143) | [Fact]

FILE: src/Tests/Delta/DeltaTesting.cs
  class DeltaTesting (line 14) | public class DeltaTesting : DummyContextTesting
    method SubmitJsStores (line 16) | [Fact]
    method ReplaceDeltaEnqueues (line 26) | [Fact]
    method TextModifiedGenerated (line 39) | [Fact]
    method ElementEventValueData (line 57) | [Fact]
    method PlugOptionsLongRunning (line 71) | [Fact]
    method PlugOptionsSerialize (line 83) | [Fact]
    method ClientEventFromSettings (line 95) | [Fact]
    method SubscribeDocumentEventEnqueues (line 127) | [Fact]
    method DeltaPayload (line 139) | [Fact]
    method DeltaRenderClass (line 149) | [Fact]

FILE: src/Tests/Delta/LocatorTesting.cs
  class LocatorTesting (line 12) | public class LocatorTesting : DummyContextTesting
    method LocateElementWithId (line 14) | [Fact]

FILE: src/Tests/Main/ButtonCounterPage.cs
  class ButtonCounterPage (line 11) | internal class ButtonCounterPage : IPage
    method ButtonCounterPage (line 17) | public ButtonCounterPage(bool useSockets)
    method OnGet (line 24) | public Task OnGet()

FILE: src/Tests/Main/ConnectionTesting.cs
  class ConnectionTesting (line 14) | public class ConnectionTesting : DummyContextTesting
    method NonExistingDocument (line 16) | [Fact]
    method CreateDocumentPresent (line 26) | [Fact]
    method DiscardRemovesDocument (line 44) | [Fact]
    method CanDiscardStartsFalse (line 56) | [Fact]
    method CannotDiscardAfterServerEventsOn (line 63) | [Fact]
    method CannotDiscardAfterEvent (line 71) | [Fact]
    method CreateDocument (line 81) | private static Document CreateDocument()

FILE: src/Tests/Main/ConnectionsTesting.cs
  class ConnectionsTesting (line 15) | public class ConnectionsTesting : DummyContextTesting
    method ConnectionFound (line 17) | [Fact]
    method DiscardRemovesConnection (line 32) | [Fact]
    method DisposeRemovesConnection (line 41) | [Fact]
    method TimerCleansUpDocuments (line 50) | [Fact]
    method TimerCleansUp (line 62) | [Fact]

FILE: src/Tests/Main/MyPage.cs
  class MyPage (line 12) | internal class MyPage : IPage, IDisposable
    method Dispose (line 16) | public void Dispose()
    method OnGet (line 21) | public Task OnGet()

FILE: src/Tests/Main/PublishedTesting.cs
  class PublishedTesting (line 18) | public class PublishedTesting : DummyContextTesting
    method UnpublishRemoves (line 20) | [Fact]
    method RedirectExecutes (line 32) | [Fact]
    class MyRedirectPage (line 50) | private class MyRedirectPage : IPage
      method OnGet (line 52) | public Task OnGet()
    method WebServiceContentType (line 59) | [Fact]
    method LaraStringify (line 71) | [Fact]
    class MyClass (line 84) | [DataContract]
    method SessionRemoveValue (line 91) | [Fact]

FILE: src/Tests/Main/StaleTesting.cs
  class StaleTesting (line 15) | public class StaleTesting : DummyContextTesting
    method CleanupLeavesUnexpiredDocument (line 17) | [Fact]
    method EmptyConnectionGetsCollected (line 34) | [Fact]
    method TimerInterval (line 46) | [Fact]

FILE: src/Tests/Main/StaticContentTesting.cs
  class StaticContentTesting (line 18) | public class StaticContentTesting : DummyContextTesting
    method StaticContentTesting (line 22) | static StaticContentTesting()
    method AreadyCompressedFileDoesNotGetCompressed (line 31) | [Fact]
    method LoadSampleJpeg (line 42) | private static byte[] LoadSampleJpeg()
    method LoadCompressibleBmp (line 47) | private static byte[] LoadCompressibleBmp()
    method LoadAsset (line 52) | private static byte[] LoadAsset(string filename)
    method LoadResource (line 57) | private static byte[] LoadResource(string filename)
    method RequestWithoutETagReceivesFile (line 67) | [Fact]
    method RequestWrongETagReceivesFile (line 84) | [Fact]
    method RequestCorrectETagReceivesNotModified (line 112) | [Fact]
    method CompressibleFileIsSentCompressed (line 136) | [Fact]
    method ContentNotFound (line 153) | [Fact]

FILE: src/Tests/Middleware/DummyContext.cs
  class DummyContext (line 15) | internal class DummyContext : BaseContext, IPageContext, IWebServiceContext
    method DummyContext (line 17) | private DummyContext(Application app, Mock<HttpContext> http)
    method Create (line 43) | public static DummyContext Create()
    method Dispose (line 50) | public void Dispose()
    method TryGetSession (line 55) | public bool TryGetSession([NotNullWhen(true)] out Session? session)

FILE: src/Tests/Middleware/DummyContextTesting.cs
  class DummyContextTesting (line 11) | public class DummyContextTesting : IDisposable
    method Dispose (line 15) | public void Dispose()

FILE: src/Tests/Middleware/ErrorPagesTesting.cs
  class ErrorPagesTesting (line 11) | public class ErrorPagesTesting : DummyContextTesting
    method DefaultNotFoundRuns (line 13) | [Fact]
    method DefaultServerErrorRuns (line 21) | [Fact]

FILE: src/Tests/Middleware/EventParametersTesting.cs
  class EventParametersTesting (line 14) | public class EventParametersTesting
    method RoundTripMinimum (line 18) | [Fact]
    method RoundTripEmptyFiles (line 36) | [Fact]
    method RoundTripFile (line 50) | [Fact]
    method SerializeBytes (line 71) | [Fact]
    method BuildBytes (line 89) | private static byte[] BuildBytes()
    method FileCollectionIterates (line 99) | [Fact]
    method NullCollectionEmpty (line 121) | [Fact]
    method FindFileByName (line 132) | [Fact]
    method GetFileReadonlyList (line 152) | [Fact]
    method GetFilesByName (line 168) | [Fact]
    method EnumrableInterface (line 196) | [Fact]

FILE: src/Tests/Middleware/MiddlewareTesting.cs
  class MyStatusPage (line 29) | internal class MyStatusPage : IPage
    method OnGet (line 31) | public Task OnGet()
  class MiddlewareTesting (line 38) | public class MiddlewareTesting : DummyContextTesting
    method TryParseMissingDocFails (line 40) | [Fact]
    method LocalhostFilterTesting (line 50) | [Fact]
    method NullBodyReturnsEmptyString (line 75) | [Fact]
    method AddHeaderNeverExpires (line 85) | [Fact]
    method ProcessMessageSkipsEmptyMessage (line 97) | [Fact]
    method ConnectionNotFoundSendsReload (line 107) | [Fact]
    class MyQueryCollection (line 137) | private class MyQueryCollection : IQueryCollection
      method ContainsKey (line 147) | public bool ContainsKey(string key) => _map.ContainsKey(key);
      method GetEnumerator (line 149) | public IEnumerator<KeyValuePair<string, StringValues>> GetEnumerator()
      method TryGetValue (line 154) | public bool TryGetValue(string key, out StringValues value)
      method GetEnumerator (line 159) | IEnumerator IEnumerable.GetEnumerator()
      method Add (line 164) | public void Add(string key, string value)
    method ClientEventMessageExtraData (line 170) | [Fact]
    method UseLaraEmpty (line 180) | [Fact]
    method PageContextSocket (line 188) | [Fact]
    method CannotFlushAjax (line 199) | [Fact]
    method FlushSendsMessage (line 209) | [Fact]
    method EmptyArraySegment (line 229) | [Fact]
    method ValidateAddress (line 237) | [Fact]
    method ValidateMethod (line 245) | [Fact]
    method UnpublishMethod (line 253) | [Fact]
    method WebServiceSessionNotFound (line 270) | [Fact]
    method WebServiceCustomCode (line 284) | [Fact]
    method PostEventHandlerSkipsRequests (line 295) | [Fact]
    method PostEventHandlerNoElement (line 310) | [Fact]
    method SendReplyLeavesSocketOpen (line 338) | [Fact]
    method CompletionResult (line 361) | private static Task<TaskCompletionSource<bool>> CompletionResult()
    method StatusCodeExceptionProcessed (line 367) | [Fact]
    method ProcessSocketMessageWrongType (line 393) | [Fact]
    method ProcessSocketMessageWrongCount (line 402) | [Fact]
    method ProcessSocketMessageFailDeserialize (line 411) | [Fact]
    method ProcessAjaxBadParameters (line 421) | [Fact]
    method PostGetCompletionRuns (line 441) | [Fact]
    method ServerEventCases (line 457) | [Fact]
    method SessionCloseIgnoresErrors (line 469) | [Fact]
    method Session_Closing (line 479) | private static void Session_Closing(object? sender, EventArgs e)
    method LaraPageDefaultConstructor (line 484) | [Fact]
    method ServerLauncherUseDeveloperPage (line 491) | [Fact]
    method LaraCreateConnection (line 503) | [Fact]
    method SetDefaultErrorPage (line 516) | [Fact]
    method DefaultErrorPageReturned (line 532) | [Fact]
    method DefaultNotFoundReturned (line 541) | [Fact]
    method SequencerReorders (line 549) | [Fact]
    method SequencerAborts (line 574) | [Fact]
    method AddChars (line 591) | private static void AddChars(StringBuilder builder, string text)
    method ApplicationModeControllerProperties (line 596) | [Fact]
    method LocalhostFilterPass (line 605) | [Fact]
    method StartServerOptionsSettings (line 619) | [Fact]
    method LaraUiDefaultStatic (line 633) | [Fact]
    method LaraUiDefaultPage (line 644) | [Fact]
    method LaraUiDefaultService (line 657) | [Fact]
    method NoCurrentSessionParameters (line 674) | [Fact]
    method NoCurrentSessionBase (line 683) | [Fact]
    method LaraUiDocument (line 690) | [Fact]
    method SingleComponentPageTest (line 701) | [Fact]
    method SetExtraData (line 715) | [Fact]
    method StopStops (line 728) | [Fact]
    method ReuseConnection (line 742) | [Fact]
    method PageStatusCodeReturned (line 764) | [Fact]
    method ETagFormatCorrect (line 781) | [Fact]

FILE: src/Tests/Middleware/ServerEventsTesting.cs
  class ServerEventsTesting (line 17) | public class ServerEventsTesting : DummyContextTesting
    method ServerEventsTesting (line 23) | public ServerEventsTesting()
    method Initialize (line 32) | private async Task Initialize()
    method DiscardSocketDiscards (line 37) | [Fact]
    method ServerEventRemainsOpen (line 45) | [Fact]
    method ServerEventFlushFlushes (line 52) | [Fact]
    method FlushWhenDisabledRejected (line 63) | [Fact]
    method NoFlushWhenQueueEmpty (line 83) | [Fact]
    method NoFlushWhenWaitingConnection (line 93) | [Fact]
    method AcceptingSocketFlushesPending (line 107) | [Fact]
    method ServerEventFlushes (line 119) | [Fact]
    method ServerEventsFlushesPartialChanges (line 133) | [Fact]
    method ServerEventFailDisposed (line 146) | [Fact]

FILE: src/Tests/Middleware/ToolsTesting.cs
  class ToolsTesting (line 15) | public class ToolsTesting : DummyContextTesting
    method DocumentLocalException (line 17) | [Fact]
    method SessionLocalException (line 41) | [Fact]
    method DocumentLocalDefaultValue (line 65) | [Fact]
    method DocumentLocalWrites (line 72) | [Fact]
    method DocumentLocalSkipsReplacement (line 80) | [Fact]
    method DocumentLocalReplaces (line 89) | [Fact]
    method DocumentLocalUnloads (line 98) | [Fact]
    method BuildLocal (line 107) | private static DocumentLocal<int> BuildLocal()
    method BuildLocal (line 112) | private static DocumentLocal<int> BuildLocal(out Document document)
    method GetSessionLocal (line 121) | private static SessionLocal<int> GetSessionLocal(out Session session)
    method GetSessionLocal (line 131) | private static SessionLocal<int> GetSessionLocal()
    method SessionLocalDefaultValue (line 136) | [Fact]
    method SessionLocalWrites (line 143) | [Fact]
    method SessionLocalSkipsReplacement (line 151) | [Fact]
    method SessionLocalReplaces (line 160) | [Fact]
    method SessionLocalUnloads (line 169) | [Fact]
    method SessionLocalService (line 178) | [Fact]
    method SmaValueNullTrue (line 192) | [Fact]
    method LaraFlushEvent (line 198) | [Fact]

FILE: src/Tests/Middleware/WebServicesTesting.cs
  class RemovablePage (line 16) | internal class RemovablePage : IPage
    method OnGet (line 18) | public Task OnGet() => Task.CompletedTask;
  class RemovableComponent (line 21) | internal class RemovableComponent : WebComponent
    method RemovableComponent (line 23) | public RemovableComponent() : base("x-removable")
  class RemovableService (line 28) | internal class RemovableService : IWebService
    method Execute (line 30) | public Task<string> Execute() => Task.FromResult(string.Empty);
  class MyBinary (line 33) | internal class MyBinary : IBinaryService
    method Execute (line 35) | public Task<byte[]> Execute()
  class WebServicesTesting (line 41) | public class WebServicesTesting : DummyContextTesting
    method LaraJsonSerializeType (line 43) | [Fact]
    class MyData (line 57) | [DataContract]
    method TryParseCatchesSerializationErrors (line 64) | [Fact]
    method ParseThrowsBadRequestException (line 72) | [Fact]
    method StatusCodeExceptionDefaultCode (line 89) | [Fact]
    method StatusCodeExceptionMessageConstructor (line 96) | [Fact]
    method StatusCodeExceptionCodeAndMessage (line 103) | [Fact]
    method StatusForbiddenExceptionDefault (line 111) | [Fact]
    method StatusForbiddenMessage (line 118) | [Fact]
    method StatusForbiddenMessageInner (line 126) | [Fact]
    method LaraWebServiceAttributeDefaults (line 136) | [Fact]
    method LaraWebServiceAttributeProperties (line 144) | [Fact]
    class MyWebService (line 158) | [LaraWebServiceAttribute(Address = "/myWS")]
      method Execute (line 161) | public Task<string> Execute()
    class MyPage (line 167) | [LaraPageAttribute("/myPage")]
      method OnGet (line 170) | public Task OnGet()
    method PublishAssembliesService (line 176) | [Fact]
    class DummyWs (line 195) | private class DummyWs : IWebService
      method Execute (line 197) | public Task<string> Execute() => Task.FromResult(string.Empty);
    method PublishAssembliesBinaryService (line 200) | [Fact]
    class DummyBinaryWs (line 219) | private class DummyBinaryWs : IBinaryService
      method Execute (line 221) | public Task<byte[]> Execute() => Task.FromResult(Array.Empty<byte>());
    method PublishAssembliesPage (line 224) | [Fact]
    method UnpublishWebservice (line 237) | [Fact]
    method VerifyTypeException (line 253) | [Fact]
    method ClearAllRemovesPublished (line 268) | [Fact]
    method GetRandom (line 297) | private static string GetRandom()
    method VerifyFound (line 304) | private void VerifyFound(Application app, bool found)
    method BinaryServiceContentProperties (line 312) | [Fact]
    method BinaryServiceAttribute (line 329) | [Fact]
Condensed preview — 272 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (852K chars).
[
  {
    "path": ".gitignore",
    "chars": 3732,
    "preview": "# The following command works for downloading when using Git for Windows:\n# curl -LOf http://gist.githubusercontent.com/"
  },
  {
    "path": ".travis.yml",
    "chars": 1576,
    "preview": "language: csharp\nsolution: src/LaraUI.sln\nmono: none\ndotnet: 5.0.100\n \nbefore_install:\n - sudo apt-get update\n - sudo ap"
  },
  {
    "path": "LICENSE",
    "chars": 11359,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 4423,
    "preview": "## Lara Web Engine\n\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache--2.0-blue)](https://github.com/i"
  },
  {
    "path": "src/Boilerplate/Program.cs",
    "chars": 1518,
    "preview": "using Integrative.Lara;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace SampleApp\n{\n    public static class Prog"
  },
  {
    "path": "src/Boilerplate/Wiki/ComponentPropertyExample.cs",
    "chars": 728,
    "preview": "using Integrative.Lara;\n\ninternal class ComponentPropertyExample : WebComponent\n{\n    public ComponentPropertyExample()"
  },
  {
    "path": "src/Boilerplate/Wiki/ComposingComponent.cs",
    "chars": 878,
    "preview": "using Integrative.Lara;\n\ninternal class ComposingComponent : WebComponent\n{\n    public ComposingComponent()  // parent "
  },
  {
    "path": "src/Boilerplate/Wiki/ConditionalRenderComponent.cs",
    "chars": 490,
    "preview": "using Integrative.Lara;\n\ninternal class ConditionalRenderComponent : WebComponent\n{\n    private bool _showText;\n    pub"
  },
  {
    "path": "src/Boilerplate/Wiki/DocumentContextExample.cs",
    "chars": 877,
    "preview": "using Integrative.Lara;\n\ninternal class DocumentContextExample : WebComponent\n{\n    const string IconId = \"MyIconElemen"
  },
  {
    "path": "src/Boilerplate/Wiki/HttpContextExample.cs",
    "chars": 568,
    "preview": "using Integrative.Lara;\n\ninternal class HttpContextExample : WebComponent\n{\n    private string _message;\n    public str"
  },
  {
    "path": "src/Boilerplate/Wiki/LoopComponent.cs",
    "chars": 448,
    "preview": "using Integrative.Lara;\nusing System.Collections.ObjectModel;\n\ninternal class MyList : WebComponent\n{\n    private reado"
  },
  {
    "path": "src/Boilerplate/Wiki/RedBoxExample.cs",
    "chars": 818,
    "preview": "using Integrative.Lara;\n\ninternal class RedBoxExample : WebComponent\n{\n    public RedBoxExample()\n    {\n        ShadowR"
  },
  {
    "path": "src/Boilerplate/Wiki/SimpleComponent.cs",
    "chars": 601,
    "preview": "using Integrative.Lara;\n\ninternal class SimpleComponent : WebComponent\n{\n    private string _message;\n    private strin"
  },
  {
    "path": "src/Boilerplate/Wiki/UserInputComponent.cs",
    "chars": 519,
    "preview": "using Integrative.Lara;\n\ninternal class UserInputComponent : WebComponent\n{\n    int _counter;\n    public int Counter { "
  },
  {
    "path": "src/Boilerplate/Wiki/UserTextComponent.cs",
    "chars": 843,
    "preview": "using Integrative.Lara;\n\ninternal class UserTextComponent : WebComponent\n{\n    private string _name;\n    public string "
  },
  {
    "path": "src/Boilerplate/WikiExamples.csproj",
    "chars": 343,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net5.0</Targe"
  },
  {
    "path": "src/LaraClient/.eslintignore",
    "chars": 22,
    "preview": "node_modules\ndist\n.js\n"
  },
  {
    "path": "src/LaraClient/.eslintrc",
    "chars": 482,
    "preview": "{\n    \"root\": true,\n    \"parser\": \"@typescript-eslint/parser\",\n    \"plugins\": [\n      \"@typescript-eslint\",\n      \"prett"
  },
  {
    "path": "src/LaraClient/.prettierrc",
    "chars": 91,
    "preview": "{\n  \"semi\": false,\n  \"trailingComma\": \"none\",\n  \"singleQuote\": false,\n  \"printWidth\": 80\n}\n"
  },
  {
    "path": "src/LaraClient/LaraClient.njsproj",
    "chars": 4475,
    "preview": "<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" ToolsVersion=\"4.0\">\n  <Prop"
  },
  {
    "path": "src/LaraClient/README.md",
    "chars": 16,
    "preview": "# LaraClient\n\n\n"
  },
  {
    "path": "src/LaraClient/dist/lara-client.js.LICENSE.txt",
    "chars": 1440,
    "preview": "/*!\n * Lara Web Engine\n * Copyright (c) 2019-2020 Integrative Software LLC.\n * License: Apache-2.0\n */\n\n/*!\n * Sizzle CS"
  },
  {
    "path": "src/LaraClient/package.json",
    "chars": 1239,
    "preview": "{\n  \"name\": \"lara-client\",\n  \"version\": \"0.5.8\",\n  \"description\": \"LaraClient\",\n  \"module\": \"src/index.ts\",\n  \"private\":"
  },
  {
    "path": "src/LaraClient/src/Autocomplete.ts",
    "chars": 3218,
    "preview": "/*\nCopyright (c) 2019-2020 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nrequire(\"webpack-jquery"
  },
  {
    "path": "src/LaraClient/src/Blocker.ts",
    "chars": 1940,
    "preview": "/*\nCopyright (c) 2019-2020 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nimport { PlugOptions } "
  },
  {
    "path": "src/LaraClient/src/ContentInterfaces.ts",
    "chars": 887,
    "preview": "/*\nCopyright (c) 2019-2020 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nexport enum ContentNode"
  },
  {
    "path": "src/LaraClient/src/DeltaInterfaces.ts",
    "chars": 2760,
    "preview": "/* eslint-disable no-unused-vars */\n/*\nCopyright (c) 2019-2020 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo C"
  },
  {
    "path": "src/LaraClient/src/Initializer.ts",
    "chars": 446,
    "preview": "/*\nCopyright (c) 2019-2020 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nexport function clean(n"
  },
  {
    "path": "src/LaraClient/src/InputCollector.ts",
    "chars": 2971,
    "preview": "/*\nCopyright (c) 2019-2020 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nimport { PlugOptions } "
  },
  {
    "path": "src/LaraClient/src/RegisteredEvents.ts",
    "chars": 2559,
    "preview": "/*\nCopyright (c) 2019-2020 Integrative Software LLC\nCreated: 10/2019\nAuthor: Pablo Carbonell\n*/\n\nimport { SubscribeDelta"
  },
  {
    "path": "src/LaraClient/src/Sequencer.ts",
    "chars": 1075,
    "preview": "/*\nCopyright (c) 2019-2020 Integrative Software LLC\nCreated: 10/2019\nAuthor: Pablo Carbonell\n*/\n\ntype resolver = (_value"
  },
  {
    "path": "src/LaraClient/src/SocketEvents.ts",
    "chars": 2418,
    "preview": "/*\nCopyright (c) 2019-2020 Integrative Software LLC\nCreated: 12/2019\nAuthor: Pablo Carbonell\n*/\n\nimport { PlugOptions } "
  },
  {
    "path": "src/LaraClient/src/Worker.ts",
    "chars": 10021,
    "preview": "/*\nCopyright (c) 2019-2020 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nimport {\n  ContentArray"
  },
  {
    "path": "src/LaraClient/src/custom.d.ts",
    "chars": 138,
    "preview": "declare module \"*.svg\" {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const content: any\n  export "
  },
  {
    "path": "src/LaraClient/src/index.ts",
    "chars": 7904,
    "preview": "/*\nCopyright (c) 2019-2020 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\n/*\nLara is a server-sid"
  },
  {
    "path": "src/LaraClient/tsconfig.json",
    "chars": 197,
    "preview": "{\n  \"compilerOptions\": {\n    \"outDir\": \"./dist/\",\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"target\": \"es5\",\n "
  },
  {
    "path": "src/LaraClient.sln",
    "chars": 1110,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.2951"
  },
  {
    "path": "src/LaraDocumentation/Content/Welcome.aml",
    "chars": 409,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<topic id=\"306fbdba-5d74-46ab-a362-aabe1e0a4051\" revisionNumber=\"1\">\n\t<developerC"
  },
  {
    "path": "src/LaraDocumentation/ContentLayout.content",
    "chars": 292,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Topics>\n  <Topic id=\"306fbdba-5d74-46ab-a362-aabe1e0a4051\" visible=\"True\" isDef"
  },
  {
    "path": "src/LaraDocumentation/LaraDocumentation.shfbproj",
    "chars": 5599,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "src/LaraUI/.gitignore",
    "chars": 106,
    "preview": "###############\n#    folder   #\n###############\n/**/DROP/\n/**/TEMP/\n/**/packages/\n/**/bin/\n/**/obj/\n_site\n"
  },
  {
    "path": "src/LaraUI/Autocomplete/AutocompleteElement.cs",
    "chars": 4006,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\n\nnamespa"
  },
  {
    "path": "src/LaraUI/Autocomplete/AutocompleteEntry.cs",
    "chars": 1087,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.S"
  },
  {
    "path": "src/LaraUI/Autocomplete/AutocompleteOptions.cs",
    "chars": 871,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nnamespace Integrative."
  },
  {
    "path": "src/LaraUI/Autocomplete/AutocompletePayload.cs",
    "chars": 513,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.S"
  },
  {
    "path": "src/LaraUI/Autocomplete/AutocompleteRegistry.cs",
    "chars": 1912,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collectio"
  },
  {
    "path": "src/LaraUI/Autocomplete/AutocompleteResponse.cs",
    "chars": 508,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collectio"
  },
  {
    "path": "src/LaraUI/Autocomplete/AutocompleteService.cs",
    "chars": 1621,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.S"
  },
  {
    "path": "src/LaraUI/Autocomplete/IAutocompleteProvider.cs",
    "chars": 603,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Threading"
  },
  {
    "path": "src/LaraUI/Components/ComponentRegistry.cs",
    "chars": 1881,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Components/Fragment.cs",
    "chars": 1057,
    "preview": "/*\nCopyright (c) 2021 Integrative Software LLC\nCreated: 1/2021\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing System.C"
  },
  {
    "path": "src/LaraUI/Components/LaraWebComponent.cs",
    "chars": 1036,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\n\nnamespac"
  },
  {
    "path": "src/LaraUI/Components/RenderIf.cs",
    "chars": 1142,
    "preview": "using System;\nusing System.ComponentModel;\n\nnamespace Integrative.Lara\n{\n    /// <summary>\n    /// Conditional render p"
  },
  {
    "path": "src/LaraUI/Components/Shadow.cs",
    "chars": 654,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collection"
  },
  {
    "path": "src/LaraUI/Components/Slot.cs",
    "chars": 1831,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collection"
  },
  {
    "path": "src/LaraUI/Components/SlottedCalculator.cs",
    "chars": 1387,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nnamespace Integrative.L"
  },
  {
    "path": "src/LaraUI/Components/WebComponent.cs",
    "chars": 6966,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Components/WebComponentOptions.cs",
    "chars": 860,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\n\nnamespac"
  },
  {
    "path": "src/LaraUI/DOM/Attributes.cs",
    "chars": 4642,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/DOM/BlockOptions.cs",
    "chars": 1318,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nnamespace Integrative.L"
  },
  {
    "path": "src/LaraUI/DOM/ChildrenBindingSubscription.cs",
    "chars": 731,
    "preview": "/*\nCopyright (c) 2020-2021 Integrative Software LLC\nCreated: 12/2020\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collectio"
  },
  {
    "path": "src/LaraUI/DOM/Document.cs",
    "chars": 10577,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/DOM/DocumentIdMap.cs",
    "chars": 1326,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collection"
  },
  {
    "path": "src/LaraUI/DOM/DocumentWriter.cs",
    "chars": 5526,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/DOM/DomSurgeon.cs",
    "chars": 10118,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/DOM/DuplicateElementIdException.cs",
    "chars": 1849,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\n\nnamespac"
  },
  {
    "path": "src/LaraUI/DOM/Element.cs",
    "chars": 39052,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/DOM/ElementFactory.cs",
    "chars": 3758,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/DOM/EventSettings.cs",
    "chars": 3645,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/DOM/GlobalSerializer.cs",
    "chars": 473,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Globalizat"
  },
  {
    "path": "src/LaraUI/DOM/HtmlReference.cs",
    "chars": 1244,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collection"
  },
  {
    "path": "src/LaraUI/DOM/MessageRegistry.cs",
    "chars": 2755,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/DOM/Node.cs",
    "chars": 2497,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Text;\n\nnam"
  },
  {
    "path": "src/LaraUI/DOM/NodeExtensions.cs",
    "chars": 3765,
    "preview": "/*\nCopyright (c) 2020-2021 Integrative Software LLC\nCreated: 12/2020\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sy"
  },
  {
    "path": "src/LaraUI/DOM/TextNode.cs",
    "chars": 3398,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Text;\nusin"
  },
  {
    "path": "src/LaraUI/Delta/AttributeEditedDelta.cs",
    "chars": 1005,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/AttributeRemovedDelta.cs",
    "chars": 874,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/BaseDelta.cs",
    "chars": 1727,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/ClearChildrenDelta.cs",
    "chars": 719,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/ContentArrayNode.cs",
    "chars": 447,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collection"
  },
  {
    "path": "src/LaraUI/Delta/ContentAttribute.cs",
    "chars": 402,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/ContentElementNode.cs",
    "chars": 751,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collection"
  },
  {
    "path": "src/LaraUI/Delta/ContentNode.cs",
    "chars": 705,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/ContentPlaceholder.cs",
    "chars": 522,
    "preview": "/*\nCopyright (c) 2021 Integrative Software LLC\nCreated: 1/2021\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Seriali"
  },
  {
    "path": "src/LaraUI/Delta/ContentTextNode.cs",
    "chars": 410,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/ElementValue.cs",
    "chars": 715,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/EventResult.cs",
    "chars": 863,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collection"
  },
  {
    "path": "src/LaraUI/Delta/FocusDelta.cs",
    "chars": 596,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/NodeAddedDelta.cs",
    "chars": 905,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/NodeInsertedDelta.cs",
    "chars": 1001,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/NodeLocator.cs",
    "chars": 1024,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Delta/NodeRemovedDelta.cs",
    "chars": 818,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/PlugOptions.cs",
    "chars": 1627,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/RemoveElementDelta.cs",
    "chars": 713,
    "preview": "/*\nCopyright (c) 2021 Integrative Software LLC\nCreated: 1/2021\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Seriali"
  },
  {
    "path": "src/LaraUI/Delta/RenderDelta.cs",
    "chars": 845,
    "preview": "/*\nCopyright (c) 2021 Integrative Software LLC\nCreated: 1/2021\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collections.Gen"
  },
  {
    "path": "src/LaraUI/Delta/ReplaceDelta.cs",
    "chars": 595,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/ServerEventsDelta.cs",
    "chars": 331,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/SetCheckedDelta.cs",
    "chars": 819,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/SetIdDelta.cs",
    "chars": 813,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/SetValueDelta.cs",
    "chars": 813,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/SubmitJsDelta.cs",
    "chars": 498,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/SubscribeDelta.cs",
    "chars": 3394,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 10/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.S"
  },
  {
    "path": "src/LaraUI/Delta/SwapChildrenDelta.cs",
    "chars": 951,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/TextModifiedDelta.cs",
    "chars": 1017,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.Se"
  },
  {
    "path": "src/LaraUI/Delta/UnRenderDelta.cs",
    "chars": 734,
    "preview": "/*\nCopyright (c) 2021 Integrative Software LLC\nCreated: 1/2021\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collections.Gen"
  },
  {
    "path": "src/LaraUI/Delta/UnsubscribeDelta.cs",
    "chars": 497,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 10/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Runtime.S"
  },
  {
    "path": "src/LaraUI/Elements/GenericElement.cs",
    "chars": 439,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nnamespace Integrative.L"
  },
  {
    "path": "src/LaraUI/Elements/HtmlAnchorElement.cs",
    "chars": 2886,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlBodyElement.cs",
    "chars": 636,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 12/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sy"
  },
  {
    "path": "src/LaraUI/Elements/HtmlButtonElement.cs",
    "chars": 2206,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlColGroupElement.cs",
    "chars": 1010,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlDivElement.cs",
    "chars": 380,
    "preview": "/*\nCopyright (c) 2020-2021 Integrative Software LLC\nCreated: 12/2020\nAuthor: Pablo Carbonell\n*/\n\nnamespace Integrative."
  },
  {
    "path": "src/LaraUI/Elements/HtmlHeadElement.cs",
    "chars": 679,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 12/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sy"
  },
  {
    "path": "src/LaraUI/Elements/HtmlHeadingElement.cs",
    "chars": 880,
    "preview": "/*\nCopyright (c) 2020-2021 Integrative Software LLC\nCreated: 12/2020\nAuthor: Pablo Carbonell\n*/\n\nusing System;\n\nnamespa"
  },
  {
    "path": "src/LaraUI/Elements/HtmlImageElement.cs",
    "chars": 2999,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlInputElement.cs",
    "chars": 7566,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing Microsoft.AspNetC"
  },
  {
    "path": "src/LaraUI/Elements/HtmlLabelElement.cs",
    "chars": 987,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlLiElement.cs",
    "chars": 966,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlLinkElement.cs",
    "chars": 2506,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlMetaElement.cs",
    "chars": 1508,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlMeterElement.cs",
    "chars": 2175,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlOlElement.cs",
    "chars": 1481,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlOptionElement.cs",
    "chars": 2182,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlOptionGroupElement.cs",
    "chars": 2468,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlParagraphElement.cs",
    "chars": 388,
    "preview": "/*\nCopyright (c) 2020-2021 Integrative Software LLC\nCreated: 12/2020\nAuthor: Pablo Carbonell\n*/\n\nnamespace Integrative."
  },
  {
    "path": "src/LaraUI/Elements/HtmlScriptElement.cs",
    "chars": 2002,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlSelectElement.cs",
    "chars": 5581,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlSpanElement.cs",
    "chars": 384,
    "preview": "/*\nCopyright (c) 2020-2021 Integrative Software LLC\nCreated: 12/2020\nAuthor: Pablo Carbonell\n*/\n\nnamespace Integrative."
  },
  {
    "path": "src/LaraUI/Elements/HtmlTableCellElement.cs",
    "chars": 1528,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlTableElement.cs",
    "chars": 745,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlTableHeaderElement.cs",
    "chars": 2292,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlTableRowElement.cs",
    "chars": 390,
    "preview": "/*\nCopyright (c) 2021 Integrative Software LLC\nCreated: 2/2021\nAuthor: Pablo Carbonell\n*/\n\nnamespace Integrative.Lara\n{"
  },
  {
    "path": "src/LaraUI/Elements/HtmlTableSectionElement.cs",
    "chars": 1273,
    "preview": "/*\nCopyright (c) 2020-2021 Integrative Software LLC\nCreated: 12/2020\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collectio"
  },
  {
    "path": "src/LaraUI/Elements/HtmlTextAreaElement.cs",
    "chars": 3989,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Elements/HtmlTitleElement.cs",
    "chars": 385,
    "preview": "/*\nCopyright (c) 2021 Integrative Software LLC\nCreated: 2/2021\nAuthor: Pablo Carbonell\n*/\n\nnamespace Integrative.Lara\n{"
  },
  {
    "path": "src/LaraUI/GlobalSuppressions.cs",
    "chars": 512,
    "preview": "// This file is used by Code Analysis to maintain SuppressMessage\n// attributes that are applied to this project.\n// Pr"
  },
  {
    "path": "src/LaraUI/LaraUI.csproj",
    "chars": 2994,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n \n  <PropertyGroup>\n    <TargetFramework>netstandard2.1</TargetFramework>\n    <RootNa"
  },
  {
    "path": "src/LaraUI/LaraUI.csproj.DotSettings",
    "chars": 1475,
    "preview": "<wpf:ResourceDictionary xml:space=\"preserve\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:s=\"clr-namesp"
  },
  {
    "path": "src/LaraUI/Main/Application.cs",
    "chars": 8727,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 10/2019\nAuthor: Pablo Carbonell\n*/\n\nusing Microsoft.AspNet"
  },
  {
    "path": "src/LaraUI/Main/BaseContext.cs",
    "chars": 509,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 10/2019\nAuthor: Pablo Carbonell\n*/\n\nusing Microsoft.AspNet"
  },
  {
    "path": "src/LaraUI/Main/BinaryServiceContent.cs",
    "chars": 1129,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\n\nnamespa"
  },
  {
    "path": "src/LaraUI/Main/BinaryServicePublished.cs",
    "chars": 1404,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sy"
  },
  {
    "path": "src/LaraUI/Main/Connection.cs",
    "chars": 2301,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Main/Connections.cs",
    "chars": 2822,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Main/GlobalConstants.cs",
    "chars": 678,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nnamespace Integrative.L"
  },
  {
    "path": "src/LaraUI/Main/IBinaryService.cs",
    "chars": 443,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Threading"
  },
  {
    "path": "src/LaraUI/Main/INavigation.cs",
    "chars": 716,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Threading."
  },
  {
    "path": "src/LaraUI/Main/IPage.cs",
    "chars": 436,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Threading."
  },
  {
    "path": "src/LaraUI/Main/IPageContext.cs",
    "chars": 3714,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing Microsoft.AspNetC"
  },
  {
    "path": "src/LaraUI/Main/IPublishedItem.cs",
    "chars": 316,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Threading."
  },
  {
    "path": "src/LaraUI/Main/IWebService.cs",
    "chars": 436,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Threading."
  },
  {
    "path": "src/LaraUI/Main/IWebServiceContext.cs",
    "chars": 855,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Diagnostic"
  },
  {
    "path": "src/LaraUI/Main/JSBridge.cs",
    "chars": 1534,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Main/LaraBinaryServiceAttribute.cs",
    "chars": 875,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\n\nnamespa"
  },
  {
    "path": "src/LaraUI/Main/LaraPageAttribute.cs",
    "chars": 946,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 7/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\n\nnamespac"
  },
  {
    "path": "src/LaraUI/Main/LaraUI.cs",
    "chars": 8862,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing Microsoft.AspNetC"
  },
  {
    "path": "src/LaraUI/Main/LaraWebServiceAttribute.cs",
    "chars": 915,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 7/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\n\nnamespac"
  },
  {
    "path": "src/LaraUI/Main/Navigation.cs",
    "chars": 1359,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Main/PageContext.cs",
    "chars": 1256,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Main/PagePublished.cs",
    "chars": 4066,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Main/Published.cs",
    "chars": 3543,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Main/Session.cs",
    "chars": 2024,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\n\nnamespac"
  },
  {
    "path": "src/LaraUI/Main/SessionStorage.cs",
    "chars": 1018,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collection"
  },
  {
    "path": "src/LaraUI/Main/SingleElementPage.cs",
    "chars": 589,
    "preview": "/*\nCopyright (c) 2020-2021 Integrative Software LLC\nCreated: 12/2020\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sy"
  },
  {
    "path": "src/LaraUI/Main/StaleConnectionsCollector.cs",
    "chars": 3245,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Main/StaticContent.cs",
    "chars": 5967,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing Microsoft.AspNetC"
  },
  {
    "path": "src/LaraUI/Main/TemplateBuilder.cs",
    "chars": 1442,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Globalizat"
  },
  {
    "path": "src/LaraUI/Main/WebServiceContent.cs",
    "chars": 1121,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\n\nnamespac"
  },
  {
    "path": "src/LaraUI/Main/WebServiceContext.cs",
    "chars": 917,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Diagnostic"
  },
  {
    "path": "src/LaraUI/Main/WebServicePublished.cs",
    "chars": 1700,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Middleware/BaseHandler.cs",
    "chars": 1075,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Threading."
  },
  {
    "path": "src/LaraUI/Middleware/BrowserAppController.cs",
    "chars": 2426,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing Microsoft.AspNet"
  },
  {
    "path": "src/LaraUI/Middleware/ClientEventMessage.cs",
    "chars": 426,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collection"
  },
  {
    "path": "src/LaraUI/Middleware/ClientLibraryHandler.cs",
    "chars": 3046,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Middleware/ContentTypes.cs",
    "chars": 14075,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nnamespace Integrative.L"
  },
  {
    "path": "src/LaraUI/Middleware/DefaultErrorPage.cs",
    "chars": 2050,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 9/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Threading."
  },
  {
    "path": "src/LaraUI/Middleware/DiscardHandler.cs",
    "chars": 975,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Threading."
  },
  {
    "path": "src/LaraUI/Middleware/DiscardParameters.cs",
    "chars": 1129,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Middleware/ErrorPages.cs",
    "chars": 3443,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 9/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Middleware/EventParameters.cs",
    "chars": 2763,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Middleware/FormFile.cs",
    "chars": 1602,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 12/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sy"
  },
  {
    "path": "src/LaraUI/Middleware/FormFileCollection.cs",
    "chars": 1686,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 12/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sy"
  },
  {
    "path": "src/LaraUI/Middleware/IModeController.cs",
    "chars": 1931,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing Microsoft.AspNet"
  },
  {
    "path": "src/LaraUI/Middleware/KeepAliveHandler.cs",
    "chars": 1799,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 11/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sy"
  },
  {
    "path": "src/LaraUI/Middleware/LaraMiddleware.cs",
    "chars": 1492,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing Microsoft.AspNetC"
  },
  {
    "path": "src/LaraUI/Middleware/LocalhostFilter.cs",
    "chars": 1537,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 4/2019\nAuthor: Pablo Carbonell\n*/\n\nusing Microsoft.AspNetC"
  },
  {
    "path": "src/LaraUI/Middleware/MiddlewareCommon.cs",
    "chars": 4878,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Middleware/NotFoundMiddleware.cs",
    "chars": 1312,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing Microsoft.AspNetC"
  },
  {
    "path": "src/LaraUI/Middleware/PostEventContext.cs",
    "chars": 2006,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Middleware/PostEventHandler.cs",
    "chars": 10469,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 5/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Middleware/PublishedItemHandler.cs",
    "chars": 882,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Threading."
  },
  {
    "path": "src/LaraUI/Middleware/Sequencer.cs",
    "chars": 2046,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 10/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.Collectio"
  },
  {
    "path": "src/LaraUI/Middleware/ServerEvent.cs",
    "chars": 1418,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Middleware/ServerEventsController.cs",
    "chars": 3361,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Middleware/StatusCodeException.cs",
    "chars": 1733,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/Middleware/StatusForbiddenException.cs",
    "chars": 1139,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 6/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  },
  {
    "path": "src/LaraUI/NewVersionChecklist.txt",
    "chars": 285,
    "preview": "new version checklist:\n- edit NuGet documentation with what's new in version\n- in the LaraClient folder run: npm run re"
  },
  {
    "path": "src/LaraUI/Reactive/BindableBase.cs",
    "chars": 3217,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System.ComponentM"
  },
  {
    "path": "src/LaraUI/Reactive/BindingExtensions.cs",
    "chars": 3971,
    "preview": "/*\nCopyright (c) 2020-2021 Integrative Software LLC\nCreated: 12/2020\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sy"
  },
  {
    "path": "src/LaraUI/Reactive/BindingOptions.cs",
    "chars": 5903,
    "preview": "/*\nCopyright (c) 2019-2021 Integrative Software LLC\nCreated: 8/2019\nAuthor: Pablo Carbonell\n*/\n\nusing System;\nusing Sys"
  }
]

// ... and 72 more files (download for full content)

About this extraction

This page contains the full source code of the integrativesoft/lara GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 272 files (781.3 KB), approximately 174.3k tokens, and a symbol index with 1838 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!