texlive[61532] Build/source/utils: asy 2.75 sources

commits+karl at tug.org commits+karl at tug.org
Sat Jan 8 19:39:02 CET 2022


Revision: 61532
          http://tug.org/svn/texlive?view=revision&revision=61532
Author:   karl
Date:     2022-01-08 19:39:01 +0100 (Sat, 08 Jan 2022)
Log Message:
-----------
asy 2.75 sources

Modified Paths:
--------------
    trunk/Build/source/utils/README
    trunk/Build/source/utils/asymptote/ChangeLog
    trunk/Build/source/utils/asymptote/GUI/CustMatTransform.py
    trunk/Build/source/utils/asymptote/GUI/DebugFlags.py
    trunk/Build/source/utils/asymptote/GUI/GuidesManager.py
    trunk/Build/source/utils/asymptote/GUI/InplaceAddObj.py
    trunk/Build/source/utils/asymptote/GUI/PrimitiveShape.py
    trunk/Build/source/utils/asymptote/GUI/SetCustomAnchor.py
    trunk/Build/source/utils/asymptote/GUI/Widg_addLabel.py
    trunk/Build/source/utils/asymptote/GUI/Widg_addPolyOpt.py
    trunk/Build/source/utils/asymptote/GUI/Widg_editBezier.py
    trunk/Build/source/utils/asymptote/GUI/Window1.py
    trunk/Build/source/utils/asymptote/GUI/configs/xasyconfig.cson
    trunk/Build/source/utils/asymptote/GUI/configs/xasykeymap.cson
    trunk/Build/source/utils/asymptote/GUI/labelEditor.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py
    trunk/Build/source/utils/asymptote/GUI/pyUIClass/window1.py
    trunk/Build/source/utils/asymptote/GUI/res/icons/bucket.asy
    trunk/Build/source/utils/asymptote/GUI/res/icons/bucket.svg
    trunk/Build/source/utils/asymptote/GUI/res/icons/center.svg
    trunk/Build/source/utils/asymptote/GUI/res/icons/centerorigin.svg
    trunk/Build/source/utils/asymptote/GUI/res/icons/closedcurve.asy
    trunk/Build/source/utils/asymptote/GUI/res/icons/closedcurve.svg
    trunk/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.asy
    trunk/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.svg
    trunk/Build/source/utils/asymptote/GUI/res/icons/filledbucket.svg
    trunk/Build/source/utils/asymptote/GUI/res/icons/opencurve.asy
    trunk/Build/source/utils/asymptote/GUI/res/icons/opencurve.svg
    trunk/Build/source/utils/asymptote/GUI/res/icons/openpolygon.asy
    trunk/Build/source/utils/asymptote/GUI/res/icons/openpolygon.svg
    trunk/Build/source/utils/asymptote/GUI/res/icons.qrc
    trunk/Build/source/utils/asymptote/GUI/setup.py
    trunk/Build/source/utils/asymptote/GUI/windows/widg_addPolyOpt.ui
    trunk/Build/source/utils/asymptote/GUI/windows/window1.ui
    trunk/Build/source/utils/asymptote/GUI/xasy.py
    trunk/Build/source/utils/asymptote/GUI/xasy2asy.py
    trunk/Build/source/utils/asymptote/GUI/xasyArgs.py
    trunk/Build/source/utils/asymptote/GUI/xasyBezierInterface.py
    trunk/Build/source/utils/asymptote/GUI/xasyFile.py
    trunk/Build/source/utils/asymptote/GUI/xasyOptions.py
    trunk/Build/source/utils/asymptote/GUI/xasyStrings.py
    trunk/Build/source/utils/asymptote/GUI/xasySvg.py
    trunk/Build/source/utils/asymptote/GUI/xasyTransform.py
    trunk/Build/source/utils/asymptote/GUI/xasyUtils.py
    trunk/Build/source/utils/asymptote/Makefile.in
    trunk/Build/source/utils/asymptote/README
    trunk/Build/source/utils/asymptote/ReleaseNotes
    trunk/Build/source/utils/asymptote/absyn.cc
    trunk/Build/source/utils/asymptote/absyn.h
    trunk/Build/source/utils/asymptote/asy-keywords.el
    trunk/Build/source/utils/asymptote/asy.list
    trunk/Build/source/utils/asymptote/asymptote.spec
    trunk/Build/source/utils/asymptote/base/asy-mode.el
    trunk/Build/source/utils/asymptote/base/asy.vim
    trunk/Build/source/utils/asymptote/base/geometry.asy
    trunk/Build/source/utils/asymptote/base/graph.asy
    trunk/Build/source/utils/asymptote/base/math.asy
    trunk/Build/source/utils/asymptote/base/palette.asy
    trunk/Build/source/utils/asymptote/base/patterns.asy
    trunk/Build/source/utils/asymptote/base/plain.asy
    trunk/Build/source/utils/asymptote/base/plain_boxes.asy
    trunk/Build/source/utils/asymptote/base/plain_constants.asy
    trunk/Build/source/utils/asymptote/base/plain_filldraw.asy
    trunk/Build/source/utils/asymptote/base/plain_margins.asy
    trunk/Build/source/utils/asymptote/base/plain_markers.asy
    trunk/Build/source/utils/asymptote/base/plain_paths.asy
    trunk/Build/source/utils/asymptote/base/plain_pens.asy
    trunk/Build/source/utils/asymptote/base/plain_picture.asy
    trunk/Build/source/utils/asymptote/base/plain_prethree.asy
    trunk/Build/source/utils/asymptote/base/plain_scaling.asy
    trunk/Build/source/utils/asymptote/base/plain_shipout.asy
    trunk/Build/source/utils/asymptote/base/plain_strings.asy
    trunk/Build/source/utils/asymptote/base/pstoedit.asy
    trunk/Build/source/utils/asymptote/base/rational.asy
    trunk/Build/source/utils/asymptote/base/roundedpath.asy
    trunk/Build/source/utils/asymptote/base/shaders/fragment.glsl
    trunk/Build/source/utils/asymptote/base/shaders/vertex.glsl
    trunk/Build/source/utils/asymptote/base/simplex.asy
    trunk/Build/source/utils/asymptote/base/slide.asy
    trunk/Build/source/utils/asymptote/base/slopefield.asy
    trunk/Build/source/utils/asymptote/base/smoothcontour3.asy
    trunk/Build/source/utils/asymptote/base/solids.asy
    trunk/Build/source/utils/asymptote/base/stats.asy
    trunk/Build/source/utils/asymptote/base/syzygy.asy
    trunk/Build/source/utils/asymptote/base/three.asy
    trunk/Build/source/utils/asymptote/base/three_arrows.asy
    trunk/Build/source/utils/asymptote/base/three_light.asy
    trunk/Build/source/utils/asymptote/base/three_margins.asy
    trunk/Build/source/utils/asymptote/base/three_surface.asy
    trunk/Build/source/utils/asymptote/base/three_tube.asy
    trunk/Build/source/utils/asymptote/base/trembling.asy
    trunk/Build/source/utils/asymptote/base/webgl/asygl.js
    trunk/Build/source/utils/asymptote/base/x11colors.asy
    trunk/Build/source/utils/asymptote/bbox.h
    trunk/Build/source/utils/asymptote/beziercurve.h
    trunk/Build/source/utils/asymptote/bezierpatch.cc
    trunk/Build/source/utils/asymptote/bezierpatch.h
    trunk/Build/source/utils/asymptote/build-scripts/HOWTO-MSWindows
    trunk/Build/source/utils/asymptote/build-scripts/build-asymptote
    trunk/Build/source/utils/asymptote/build-scripts/build-asymptote.dos
    trunk/Build/source/utils/asymptote/camp.tab.cc
    trunk/Build/source/utils/asymptote/camp.tab.h
    trunk/Build/source/utils/asymptote/camperror.cc
    trunk/Build/source/utils/asymptote/common.h
    trunk/Build/source/utils/asymptote/config.guess
    trunk/Build/source/utils/asymptote/config.h.in
    trunk/Build/source/utils/asymptote/config.sub
    trunk/Build/source/utils/asymptote/configure
    trunk/Build/source/utils/asymptote/configure.ac
    trunk/Build/source/utils/asymptote/constructor.cc
    trunk/Build/source/utils/asymptote/dec.cc
    trunk/Build/source/utils/asymptote/dec.h
    trunk/Build/source/utils/asymptote/doc/CAD.pdf
    trunk/Build/source/utils/asymptote/doc/FAQ/asy-faq.info
    trunk/Build/source/utils/asymptote/doc/Makefile.in
    trunk/Build/source/utils/asymptote/doc/TeXShopAndAsymptote.pdf
    trunk/Build/source/utils/asymptote/doc/asy-latex.dtx
    trunk/Build/source/utils/asymptote/doc/asy-latex.pdf
    trunk/Build/source/utils/asymptote/doc/asy.1
    trunk/Build/source/utils/asymptote/doc/asyRefCard.pdf
    trunk/Build/source/utils/asymptote/doc/asymptote.pdf
    trunk/Build/source/utils/asymptote/doc/asymptote.sty
    trunk/Build/source/utils/asymptote/doc/asymptote.texi
    trunk/Build/source/utils/asymptote/doc/imagecontour.asy
    trunk/Build/source/utils/asymptote/doc/latexusage.tex
    trunk/Build/source/utils/asymptote/doc/legend.asy
    trunk/Build/source/utils/asymptote/doc/png/asymptote.info
    trunk/Build/source/utils/asymptote/doc/secondaryaxis.asy
    trunk/Build/source/utils/asymptote/drawelement.h
    trunk/Build/source/utils/asymptote/drawlabel.cc
    trunk/Build/source/utils/asymptote/drawlayer.h
    trunk/Build/source/utils/asymptote/drawpath.cc
    trunk/Build/source/utils/asymptote/drawpath3.cc
    trunk/Build/source/utils/asymptote/drawpath3.h
    trunk/Build/source/utils/asymptote/drawsurface.cc
    trunk/Build/source/utils/asymptote/drawsurface.h
    trunk/Build/source/utils/asymptote/errormsg.cc
    trunk/Build/source/utils/asymptote/errormsg.h
    trunk/Build/source/utils/asymptote/examples/1overx.asy
    trunk/Build/source/utils/asymptote/examples/NURBScurve.asy
    trunk/Build/source/utils/asymptote/examples/NURBSsphere.asy
    trunk/Build/source/utils/asymptote/examples/NURBSsurface.asy
    trunk/Build/source/utils/asymptote/examples/alignedaxis.asy
    trunk/Build/source/utils/asymptote/examples/interpolate1.asy
    trunk/Build/source/utils/asymptote/examples/layers.asy
    trunk/Build/source/utils/asymptote/examples/markregular.asy
    trunk/Build/source/utils/asymptote/examples/orthocenter.asy
    trunk/Build/source/utils/asymptote/examples/spectrum.asy
    trunk/Build/source/utils/asymptote/examples/strokepath.asy
    trunk/Build/source/utils/asymptote/examples/teapot.asy
    trunk/Build/source/utils/asymptote/examples/transparency.asy
    trunk/Build/source/utils/asymptote/examples/workcone.asy
    trunk/Build/source/utils/asymptote/exp.cc
    trunk/Build/source/utils/asymptote/exp.h
    trunk/Build/source/utils/asymptote/fftw++.cc
    trunk/Build/source/utils/asymptote/fftw++.h
    trunk/Build/source/utils/asymptote/fftw++asy.cc
    trunk/Build/source/utils/asymptote/fileio.cc
    trunk/Build/source/utils/asymptote/fileio.h
    trunk/Build/source/utils/asymptote/fundec.cc
    trunk/Build/source/utils/asymptote/fundec.h
    trunk/Build/source/utils/asymptote/glrender.cc
    trunk/Build/source/utils/asymptote/glrender.h
    trunk/Build/source/utils/asymptote/impdatum.cc
    trunk/Build/source/utils/asymptote/interact.cc
    trunk/Build/source/utils/asymptote/jsfile.cc
    trunk/Build/source/utils/asymptote/jsfile.h
    trunk/Build/source/utils/asymptote/main.cc
    trunk/Build/source/utils/asymptote/material.h
    trunk/Build/source/utils/asymptote/memory.h
    trunk/Build/source/utils/asymptote/name.cc
    trunk/Build/source/utils/asymptote/name.h
    trunk/Build/source/utils/asymptote/newexp.cc
    trunk/Build/source/utils/asymptote/pair.h
    trunk/Build/source/utils/asymptote/parser.cc
    trunk/Build/source/utils/asymptote/path.cc
    trunk/Build/source/utils/asymptote/pen.h
    trunk/Build/source/utils/asymptote/picture.cc
    trunk/Build/source/utils/asymptote/picture.h
    trunk/Build/source/utils/asymptote/prc/oPRCFile.h
    trunk/Build/source/utils/asymptote/predicates.cc
    trunk/Build/source/utils/asymptote/process.cc
    trunk/Build/source/utils/asymptote/process.h
    trunk/Build/source/utils/asymptote/psfile.cc
    trunk/Build/source/utils/asymptote/psfile.h
    trunk/Build/source/utils/asymptote/revision.cc
    trunk/Build/source/utils/asymptote/runfile.cc
    trunk/Build/source/utils/asymptote/runfile.in
    trunk/Build/source/utils/asymptote/runlabel.cc
    trunk/Build/source/utils/asymptote/runlabel.in
    trunk/Build/source/utils/asymptote/runpicture.cc
    trunk/Build/source/utils/asymptote/runpicture.in
    trunk/Build/source/utils/asymptote/runtime.cc
    trunk/Build/source/utils/asymptote/runtime.in
    trunk/Build/source/utils/asymptote/runtime.pl
    trunk/Build/source/utils/asymptote/settings.cc
    trunk/Build/source/utils/asymptote/settings.h
    trunk/Build/source/utils/asymptote/shaders.cc
    trunk/Build/source/utils/asymptote/shaders.h
    trunk/Build/source/utils/asymptote/stack.cc
    trunk/Build/source/utils/asymptote/statistics.h
    trunk/Build/source/utils/asymptote/stm.cc
    trunk/Build/source/utils/asymptote/stm.h
    trunk/Build/source/utils/asymptote/symbol.cc
    trunk/Build/source/utils/asymptote/symbol.h
    trunk/Build/source/utils/asymptote/texfile.cc
    trunk/Build/source/utils/asymptote/texfile.h
    trunk/Build/source/utils/asymptote/triple.h
    trunk/Build/source/utils/asymptote/varinit.cc
    trunk/Build/source/utils/asymptote/webgl/fragment.glsl
    trunk/Build/source/utils/asymptote/webgl/gl.js
    trunk/Build/source/utils/asymptote/webgl/license
    trunk/Build/source/utils/asymptote/webgl/vertex.glsl
    trunk/Build/source/utils/asymptote/xstream.h

Added Paths:
-----------
    trunk/Build/source/utils/asymptote/EXRFiles.cc
    trunk/Build/source/utils/asymptote/EXRFiles.h
    trunk/Build/source/utils/asymptote/GLTextures.cc
    trunk/Build/source/utils/asymptote/GLTextures.h
    trunk/Build/source/utils/asymptote/GUI/res/icons/brush.svg
    trunk/Build/source/utils/asymptote/GUI/res/icons/redo.svg
    trunk/Build/source/utils/asymptote/GUI/res/icons/undo.svg
    trunk/Build/source/utils/asymptote/LspCpp/
    trunk/Build/source/utils/asymptote/LspCpp/LICENSE
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Cancellation.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Condition.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Context.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Context.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Endpoint.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Endpoint.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/GCThreadContext.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/GCThreadContext.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageIssue.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageJsonHandler.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageJsonHandler.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageProducer.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/NotificationInMessage.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RemoteEndPoint.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RemoteEndPoint.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RequestInMessage.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/ScopeExit.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/StreamMessageProducer.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/StreamMessageProducer.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/TcpServer.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/TcpServer.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/WebSocketServer.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/WebSocketServer.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/json.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/lsRequestId.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/lsResponseMessage.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/message.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/message.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/optional.hpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/serializer.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/serializer.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/stream.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/threaded_queue.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/threaded_queue.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/traits.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/AbsolutePath.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ClientPreferences.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/CodeActionParams.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Directory.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ExecuteCommandParams.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/IProgressMonitor.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/Markup.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/Markup.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/string_ref.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ParentProcessWatcher.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ParentProcessWatcher.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProcessIoService.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProtocolJsonHandler.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProtocolJsonHandler.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ResourceOperation.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/SimpleTimer.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/client/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/client/registerCapability.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/client/unregisterCapability.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/Move.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/OverridableMethod.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/addOverridableMethods.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/buildWorkspace.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkConstructorsStatus.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkDelegateMethodsStatus.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkHashCodeEqualsStatus.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkToStringStatus.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/classFileContents.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/codeActionResult.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/executeCommand.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/findLinks.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateAccessors.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateConstructors.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateDelegateMethods.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateHashCodeEquals.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateToString.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/getMoveDestinations.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/getRefactorEdit.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/listOverridableMethods.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/organizeImports.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/projectConfigurationUpdate.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/resolveUnimplementedAccessors.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/searchSymbols.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/SCTConfig.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/protocol.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/sct.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/sct.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sonarlint/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sonarlint/protocol.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/InitializeParams.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/exit.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialize.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialize.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialized.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsClientCapabilities.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsServerCapabilities.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsTextDocumentClientCapabilities.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsWorkspaceClientCapabilites.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/progress.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/shutdown.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/language/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/language/language.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/location_type.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lru_cache.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsAny.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsCodeAction.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsCommand.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsDocumentUri.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsFormattingOptions.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsMarkedString.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsPosition.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsRange.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsResponseError.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentEdit.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentIdentifier.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentItem.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentPositionParams.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextEdit.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsVersionedTextDocumentIdentifier.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsWorkspaceEdit.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_code_action.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_completion.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_diagnostic.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_diagnostic.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/method_type.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/out_list.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/symbol.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/SemanticTokens.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/callHierarchy.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/code_action.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/code_lens.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/colorPresentation.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/completion.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/declaration_definition.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/didRenameFiles.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_change.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_close.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_open.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_save.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/documentColor.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/document_link.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/document_symbol.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/foldingRange.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/formatting.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/highlight.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/hover.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/implementation.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/linkedEditingRange.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/onTypeFormatting.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/prepareRename.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/publishDiagnostics.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/range_formatting.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/references.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/rename.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveCodeLens.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveCompletionItem.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveTypeHierarchy.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/selectionRange.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/semanticHighlighting.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/signature_help.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/textDocument.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/typeHierarchy.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/type_definition.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/willSave.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/utils.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/utils.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/windows/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/windows/MessageNotify.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/working_files.cpp
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/working_files.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/workspace/
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/workspace/applyEdit.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/workspace/configuration.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/workspace/didChangeWorkspaceFolders.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/workspace/did_change_configuration.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/workspace/did_change_watched_files.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/workspace/execute_command.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/workspace/symbol.h
    trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/workspace/workspaceFolders.h
    trunk/Build/source/utils/asymptote/LspCpp/LspCpp.filters
    trunk/Build/source/utils/asymptote/LspCpp/LspCpp.user
    trunk/Build/source/utils/asymptote/LspCpp/LspCpp.vcxproj
    trunk/Build/source/utils/asymptote/LspCpp/LspCpp.vcxproj.filters
    trunk/Build/source/utils/asymptote/LspCpp/LspCpp.vcxproj.user
    trunk/Build/source/utils/asymptote/LspCpp/Makefile
    trunk/Build/source/utils/asymptote/LspCpp/README.md
    trunk/Build/source/utils/asymptote/LspCpp/example/
    trunk/Build/source/utils/asymptote/LspCpp/example/StdIOClientExample.cpp
    trunk/Build/source/utils/asymptote/LspCpp/example/StdIOServerExample.cpp
    trunk/Build/source/utils/asymptote/LspCpp/example/TcpServerExample.cpp
    trunk/Build/source/utils/asymptote/LspCpp/example/WebsocketExample.cpp
    trunk/Build/source/utils/asymptote/LspCpp/macro_map.h
    trunk/Build/source/utils/asymptote/LspCpp/network/
    trunk/Build/source/utils/asymptote/LspCpp/network/optional.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/string_view.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/config.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/algorithm.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/decode.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/encode.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/grammar.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/translate.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_advance_parts.cpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_advance_parts.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_normalize.cpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_normalize.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_parse.cpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_parse.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_parse_authority.cpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_parse_authority.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_parts.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_percent_encode.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_resolve.cpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/detail/uri_resolve.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/uri.cpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/uri.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/uri_builder.cpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/uri_builder.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/uri_errors.cpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/uri_errors.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri/uri_io.hpp
    trunk/Build/source/utils/asymptote/LspCpp/network/uri.hpp
    trunk/Build/source/utils/asymptote/LspCpp/packages.config
    trunk/Build/source/utils/asymptote/LspCpp/third_party/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/CHANGE_LOG
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/COPYING
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/Jamfile.v2
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/Jamrules
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/LICENSE_1_0.txt
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/Makefile
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/README
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/TODO
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/detail/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/detail/future.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/detail/locking_ptr.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/detail/pool_core.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/detail/scope_guard.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/detail/worker_thread.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/future.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/pool.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/pool_adaptors.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/scheduling_policies.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/shutdown_policies.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/size_policies.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool/task_adaptors.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/boost/threadpool.hpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/Makefile
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/design.dox
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/design.txt
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/design_header.htm
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/examples.dox
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/examples.txt
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/examples_header.htm
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/footer/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/footer/common_footer.htm
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/footer/overview_footer.htm
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/footer_sf/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/footer_sf/common_footer.htm
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/footer_sf/overview_footer.htm
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/index.html
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/overview.dox
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/overview.txt
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/overview_header.htm
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/reference.dox
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/reference_header.htm
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/threadpool.css
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/tutorial.dox
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/tutorial.txt
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/doc/tutorial_header.htm
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/example/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/example/mergesort/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/example/mergesort/Jamfile.v2
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/example/mergesort/mergesort.cpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/quickstart/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/quickstart/Jamfile.v2
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/quickstart/README
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/quickstart/quickstart.cpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/test/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/test/compile_all/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/test/compile_all/Jamfile.v2
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/test/compile_all/compile_all.cpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/tutorial/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/tutorial/Jamfile.v2
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/libs/threadpool/tutorial/tutorial.cpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/threadpool/project-root.jam
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/CMakeLists.txt
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/LICENSE
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/README.md
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/samples/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/samples/docsample.cpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/source/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/source/utf8/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/source/utf8/checked.h
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/source/utf8/core.h
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/source/utf8/cpp11.h
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/source/utf8/cpp17.h
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/source/utf8/unchecked.h
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/source/utf8.h
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/CMakeLists.txt
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/docker/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/docker/Dockerfile
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/negative.cpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/test_checked_api.cpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/test_checked_iterator.cpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/test_cpp11.cpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/test_cpp17.cpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/test_data/
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/test_data/utf8_invalid.txt
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/test_unchecked_api.cpp
    trunk/Build/source/utils/asymptote/LspCpp/third_party/utfcpp/tests/test_unchecked_iterator.cpp
    trunk/Build/source/utils/asymptote/_config.yml
    trunk/Build/source/utils/asymptote/abs3doutfile.h
    trunk/Build/source/utils/asymptote/base/shaders/blend.glsl
    trunk/Build/source/utils/asymptote/base/shaders/count.glsl
    trunk/Build/source/utils/asymptote/base/shaders/count0.glsl
    trunk/Build/source/utils/asymptote/base/shaders/offset.glsl
    trunk/Build/source/utils/asymptote/base/shaders/partialsum.glsl
    trunk/Build/source/utils/asymptote/base/shaders/postsum.glsl
    trunk/Build/source/utils/asymptote/base/shaders/presum.glsl
    trunk/Build/source/utils/asymptote/base/shaders/screen.glsl
    trunk/Build/source/utils/asymptote/base/v3d.asy
    trunk/Build/source/utils/asymptote/base/v3dheadertypes.asy
    trunk/Build/source/utils/asymptote/base/v3dtypes.asy
    trunk/Build/source/utils/asymptote/cudareflect/
    trunk/Build/source/utils/asymptote/cudareflect/EXRFiles.cc
    trunk/Build/source/utils/asymptote/cudareflect/EXRFiles.h
    trunk/Build/source/utils/asymptote/cudareflect/IrradianceGenerator.sln
    trunk/Build/source/utils/asymptote/cudareflect/IrradianceGenerator.vcxproj
    trunk/Build/source/utils/asymptote/cudareflect/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/ReflectanceMapper.cu
    trunk/Build/source/utils/asymptote/cudareflect/ReflectanceMapper.cuh
    trunk/Build/source/utils/asymptote/cudareflect/common.h
    trunk/Build/source/utils/asymptote/cudareflect/helper.cuh
    trunk/Build/source/utils/asymptote/cudareflect/kernel.cu
    trunk/Build/source/utils/asymptote/cudareflect/kernel.h
    trunk/Build/source/utils/asymptote/cudareflect/main.cc
    trunk/Build/source/utils/asymptote/cudareflect/simpson.cuh
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/CMakeLists.txt
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/Makefile.gcc-mingw
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/Makefile.gcc-mingw-msys
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/Makefile.llvm-mingw
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/appveyor.yml
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/asakusa.exr
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/asakusa.png
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/cmake/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/cmake/sanitizers/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindASan.cmake
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindMSan.cmake
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindSanitizers.cmake
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindTSan.cmake
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindUBSan.cmake
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/cmake/sanitizers/asan-wrapper
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/cmake/sanitizers/sanitize-helpers.cmake
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/config-msvc.py
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/ChangeLog.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/LICENSE
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/examples/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/examples/example1.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/examples/example2.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/examples/example3.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/examples/example4.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/examples/example5.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/examples/example6.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/miniz.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/miniz.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/deps/miniz/readme.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/common/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/common/cxxopts.hpp
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/common/stb_image.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/common/stb_image_resize.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/common/stb_image_write.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/cube2longlat/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/cube2longlat/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/cube2longlat/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/cube2longlat/cube2longlat.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/deepview/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/deepview/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/deepview/deepview_screencast.gif
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/deepview/main.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/deepview/trackball.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/deepview/trackball.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exr2fptiff/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exr2fptiff/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exr2fptiff/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exr2fptiff/exr2fptiff.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exr2fptiff/tiny_dng_writer.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exr2ldr/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exr2ldr/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exr2ldr/exr2ldr.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exr2rgbe/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exr2rgbe/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exr2rgbe/exr2rgbe.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrfilter/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrfilter/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrfilter/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrfilter/exrfilter.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/DroidSans.ttf
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/CommonWindowInterface.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/MacOpenGLWindow.mm
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/OpenGL2Include.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/OpenGLInclude.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32InternalWindowData.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.cpp
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32OpenGLWindow.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32Window.cpp
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32Window.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.cpp
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glew.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glxew.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/wglew.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/glew.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/LICENSE
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_cocoa.png
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_gtk3.png
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/screens/open_win8.png
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/SConstruct
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/common.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/include/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/include/nfd.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_cocoa.m
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_common.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_gtk.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/nfd_win.cpp
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/SConstruct
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialog.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_opendialogmultiple.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_savedialog.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/exr-io.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/exr-io.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/findOpenGLGlewGlut.lua
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/main.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/nuklear.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/nuklear_btgui_gl2.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/premake4.lua
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/screenshots/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/screenshots/exrview.png
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/shader.frag
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/exrview/shader.vert
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/ldr2exr/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/ldr2exr/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/ldr2exr/ldr2exr.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/nornalmap/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/nornalmap/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/nornalmap/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/nornalmap/main.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/resize/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/resize/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/resize/resize.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/rgbe2exr/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/rgbe2exr/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/rgbe2exr/rgbe2exr.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/testmapgen/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/testmapgen/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/testmapgen/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/examples/testmapgen/testmapgen.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/experimental/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/experimental/js/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/experimental/js/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/experimental/js/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/experimental/js/binding.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/experimental/js/compile_to_js.sh
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/experimental/js/index.html
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/experimental/js/test.js
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/jni/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/jni/Android.mk
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/jni/Application.mk
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/jni/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/jni/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/kuroga.py
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/premake4.lua
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/CMakeLists.txt
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/c-binding/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/c-binding/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/c-binding/test.c
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/exrcat/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/exrcat/exrcat.cpp
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/exrwrite/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/exrwrite/exrwritetest.cpp
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/fuzzer/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/fuzzer/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/fuzzer/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/fuzzer/fuzz.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/fuzzer/issue-62-tinyexr_memcpy_heap-buffer-overflow
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/fuzzer/issue-63-tinyexr_signed-integer-overflow
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/fuzzer/issue-77-heap-buffer-overflow
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/issues/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/issues/160/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/issues/160/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/issues/160/main.py
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/issues/160/requirements.txt
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/Makefile
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/README.md
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/catch.hpp
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/config-msvc.py
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/config-posix.py
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/kuroga.py
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/2by2.exr
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/flaga.exr
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/issue-160-piz-decode.exr
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/piz-bug-issue-100.exr
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-1383755b301e5f505b2198dc0508918b537fdf48bbfc6deeffe268822e6f6cd6
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-24322747c47e87a10e4407528b779a1a763a48135384909b3d1010bbba1d4c28_min
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-255456016cca60ddb5c5ed6898182e13739bf687b17d1411e97bb60ad95e7a84_min
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-360c3b0555cb979ca108f2d178cf8a80959cfeabaa4ec1d310d062fa653a8c6b_min
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-3f1f642c3356fd8e8d2a0787613ec09a56572b3a1e38c9629b6db9e8dead1117_min
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-5ace655ef080932dcc7e4abc9eab1d4f82c845453464993dfa3eb6c5822a1621
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-5b66774a7498c635334ad386be0c3b359951738ac47f14878a3346d1c6ea0fe5_min
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-d5c9c893e559277a3320c196523095b94db93985620ac338d037487e0e613047_min
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-df76d1f27adb8927a1446a603028272140905c168a336128465a1162ec7af270.mini
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-e7fa6404daa861369d2172fe68e08f9d38c0989f57da7bcfb510bab67e19ca9f
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-eedff3a9e99eb1c0fd3a3b0989e7c44c0a69f04f10b23e5264f362a4773f4397_min
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/poc-efe9007bfdcbbe8a1569bf01fa9acadb8261ead49cb83f6e91fcdc4dae2e99a3_min
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/regression/tiled_half_1x1_alpha.exr
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/tester.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/vcbuild.bat
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/win32-filelist-utf16le.inc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test/unit/win32-filelist-utf8.inc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/test_tinyexr.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/tinyexr.cc
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/tinyexr.h
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/vcbuild.bat
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr/vcsetup2019.bat
    trunk/Build/source/utils/asymptote/cudareflect/tinyexr.cc
    trunk/Build/source/utils/asymptote/cudareflect/utils.cuh
    trunk/Build/source/utils/asymptote/doc/fillcontour.asy
    trunk/Build/source/utils/asymptote/doc/graphwithderiv.asy
    trunk/Build/source/utils/asymptote/examples/teapotIBL.asy
    trunk/Build/source/utils/asymptote/gc-8.2.0.tar.gz
    trunk/Build/source/utils/asymptote/generate_enums.py
    trunk/Build/source/utils/asymptote/index.html
    trunk/Build/source/utils/asymptote/lspserv.cc
    trunk/Build/source/utils/asymptote/lspserv.h
    trunk/Build/source/utils/asymptote/makeUnique.h
    trunk/Build/source/utils/asymptote/symbolmaps.cc
    trunk/Build/source/utils/asymptote/symbolmaps.h
    trunk/Build/source/utils/asymptote/testv3d.asy
    trunk/Build/source/utils/asymptote/tinyexr.cc
    trunk/Build/source/utils/asymptote/v3dfile.cc
    trunk/Build/source/utils/asymptote/v3dfile.h
    trunk/Build/source/utils/asymptote/v3dheadertypes.csv
    trunk/Build/source/utils/asymptote/v3dheadertypes.h
    trunk/Build/source/utils/asymptote/v3dheadertypes.py
    trunk/Build/source/utils/asymptote/v3dtypes.csv
    trunk/Build/source/utils/asymptote/v3dtypes.h
    trunk/Build/source/utils/asymptote/v3dtypes.py

Removed Paths:
-------------
    trunk/Build/source/utils/asymptote/GUI/icons_rc.py
    trunk/Build/source/utils/asymptote/doc/ocg.sty
    trunk/Build/source/utils/asymptote/examples/fillcontour.asy
    trunk/Build/source/utils/asymptote/gc-8.0.4.tar.gz
    trunk/Build/source/utils/asymptote/libatomic_ops-7.6.10.tar.gz

Modified: trunk/Build/source/utils/README
===================================================================
--- trunk/Build/source/utils/README	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/README	2022-01-08 18:39:01 UTC (rev 61532)
@@ -4,7 +4,7 @@
 Extra utilities we (optionally) compile for TeX Live.
 See comments in ../texk/README.
 
-asymptote 2.70 - checked 15mar21
+asymptote 2.75 - checked 8jan22
   update to TL from CTAN, to include prebuilt doc.
   see https://tug.org/texlive/build.html#asymptote
   and tlpkg/bin/tl-update-asy

Modified: trunk/Build/source/utils/asymptote/ChangeLog
===================================================================
--- trunk/Build/source/utils/asymptote/ChangeLog	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/ChangeLog	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,3 +1,4707 @@
+commit 587b26dca79cad5a31100a30bee9cc4a9dcd93e8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jan 6 14:15:06 2022 -0700
+
+    Use png16m driver by default (override with -pngdriver) and force pdflatex
+    mode to work around issues with pngalpha driver.
+
+commit eab735a13a12be5e9b1af44c1764b8e6d8721795
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jan 6 13:12:58 2022 -0700
+
+    Implement better fix to bug #241.
+    This reverts commit f10c7fd9f54e5e84a7b5287579dbb29ce45aabd3.
+
+commit 2defc18699b61f9247d3042f6a504e0ae6871596
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jan 6 12:55:08 2022 -0700
+
+    Revert "Fix commit 1ce26e54a3fb7e35389b3e9ecf7399cd1c535b66."
+    
+    This reverts commit 166efc83f399a795d2fa221477034e63e8ebb235.
+
+commit af52c7800ecef8fda895f604fd9c42d9fbb3ae18
+Merge: d7f097c1 123a7300
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jan 6 11:08:00 2022 -0700
+
+    Merge pull request #293 from tifv/patch-1
+    
+    Fix documentation typo in geometry.asy
+
+commit 123a7300e7c8c36c7e0718f4c8ef50b404e8e2bb
+Author: July Tikhonov <july.tikh at gmail.com>
+Date:   Thu Jan 6 20:13:48 2022 +0300
+
+    Fix documentation typo in geometry.asy
+
+commit d7f097c15e6431bd42dc9670215e6916be31f8f1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 5 23:50:34 2022 -0700
+
+    Disable primitives for colored surfaces.
+
+commit 74a26c9d627a1b9632fb033e086ed5e76e88b79e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 5 23:49:43 2022 -0700
+
+    Add missing currentlight.
+
+commit 509b3e8952a44b043ff58e5355113dee6efbe05a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 5 23:44:57 2022 -0700
+
+    V3D: Fix explicitNI and explicitCI flags.
+
+commit c802fe27c172c323280607b6b600ed616711d06f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 5 23:43:18 2022 -0700
+
+    Support specifying v3d files on the Asymptote command line.
+
+commit b30b6a88d8c1cd93838bc4c15c0611ab595ebccb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 5 23:42:36 2022 -0700
+
+    Disable png transparency until ghostscript pngalpha supports it again.
+
+commit 166efc83f399a795d2fa221477034e63e8ebb235
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 5 23:42:06 2022 -0700
+
+    Fix commit 1ce26e54a3fb7e35389b3e9ecf7399cd1c535b66.
+
+commit f2cce72ee4ca799512904137ddf79ba5a585b261
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 5 14:51:08 2022 -0700
+
+    Revert "Merge pull request #157 from ivankokan: Inversion fixes and improvements."
+    
+    This reverts commit 7f8a9987174d1136826541389148caa7a074e242.
+
+commit 7f8a9987174d1136826541389148caa7a074e242
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 5 14:36:49 2022 -0700
+
+    Merge pull request #157 from ivankokan: Inversion fixes and improvements.
+
+commit c808070eeb7bc1737b1e314c698e92d6c2889145
+Merge: 1ce26e54 9c770c62
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 5 13:46:17 2022 -0700
+
+    Merge pull request #291 from cagprado/improve_vim_syntax
+    
+    Improve vim syntax.
+
+commit 1ce26e54a3fb7e35389b3e9ecf7399cd1c535b66
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jan 5 13:17:10 2022 -0700
+
+    Fix transparency issue in commit f10c7fd9f54e5e84a7b5287579dbb29ce45aabd3.
+
+commit 9c770c628c3d8138e1038d172fe3736a59d66a30
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Wed Jan 5 17:04:16 2022 +0800
+
+    Limit column width of source file
+
+commit 571b6aaf5607360f309ea66def8743be8eb6687c
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Wed Jan 5 16:36:04 2022 +0800
+
+    Review delimiter matching rules
+    
+    Unmatched ), ], and } will highlight themselves as errors.
+    Unmatched (, and [ causes highlighted errors later on the next ;,
+    which should be close enough to the source of the error.
+    Unmatched { nested within other delimiters will end up highlighting the
+    extra ) or ].  However, top level unmatched { will not be marked.
+
+commit 3cc5ae13cd9325daa14eeccfbfc9e02de215c9fb
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Wed Jan 5 16:34:04 2022 +0800
+
+    Simplify comments highlighting
+    
+     - We don't need asyCommentGroup since it contains only one member
+     - asyCommentStart's only purpose is to avoide further matching on the
+       delimiters, we don't need it as we can use asyComment for that.
+     - asyComment*String don't start with L
+
+commit 0b03cdab123063b00955f80713df745be660100d
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Wed Jan 5 10:35:07 2022 +0800
+
+    Review asyNumber highlight
+    
+    Asymptote is simpler than C/C++, we should be able to use a single
+    regexp.  However, implicit multiplication may lead to some problems:
+    Constants like
+        0.1.1
+    are considered as
+        0.1 * .1
+    and compile with a warning about implicit scaling.  Since this is
+    potentially dangerous, we add a highlight error when this happens.
+
+commit 6b0f27155ae97326483029140c61021bc451856c
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Wed Jan 5 10:33:55 2022 +0800
+
+    Make two flavors of comment strings
+    
+    Since asymptote allows for "string" and 'string', make both of them also
+    allowed inside comments.
+
+commit 57ca7624641fa0691bda95a90c1df19d0969310c
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Wed Jan 5 10:30:25 2022 +0800
+
+    Fix regexp of special characters for asyString
+    
+    asyString (double quoted string) will only highlight line breaks and the
+    special \".  This fix matching \" without requiring a character before
+    it.
+
+commit 456d1815b3d43a6ad80dcdaf945ea3e56d18a8f9
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Tue Jan 4 17:22:57 2022 +0800
+
+    Cleanup unused highlights (inherited from C syntax file)
+
+commit 3e5f7c063bb19fb272b59ce285bcb52d1da3d0b2
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Tue Jan 4 16:49:27 2022 +0800
+
+    Reorder file sections
+    
+    Order from simple to complex:
+     - keywords
+     - string constants
+     - number constants
+     - comments and comment strings
+     - delimiter errors
+
+commit 9ee06a701ba8dc87df56b5bcb859b4dbde0beeff
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Tue Jan 4 16:38:11 2022 +0800
+
+    Rename a few variables
+    
+    Try to be consistent with some naming:
+      asyString  for normal strings
+      asyCString for strings that maps C-like escapes (single quoted)
+      asyComment2Strings renamed to asyCommentLStrings following asyCommentL
+
+commit d5f765315b44970835874f7305822e1d0afad4bf
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Tue Jan 4 16:31:25 2022 +0800
+
+    Add more keywords for plain, three and color modules
+
+commit db3e1c343d8a5dfd69021968e443693982e24097
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jan 3 17:33:44 2022 -0700
+
+    Enable billboard labels, even when compiled with LIBOSMESA, to support WebGL.
+    Remove subdivision crack work around for obsolete PRC format.
+
+commit 827f4188c785a80199c9499122b04256667880bb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 2 11:15:20 2022 -0700
+
+    Support compilation again without tirpc library (not recommended,
+    as this will disable both XDR and V3D support).
+
+commit 6e6bf4a083c94d475fa2111967d260c8b623ea2d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 2 09:15:31 2022 +1100
+
+    Increment version to 2.75.
+
+commit b2ae0111b8184e26ca0ff990d9d55a13753e6a1b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Jan 2 07:44:55 2022 +1100
+
+    Add linecap and linejoin enums to source code for clarity.
+
+commit 1589f4e8733bcd2f3696d6471ebe7bdd08e9f16c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 1 13:08:01 2022 -0700
+
+    Fix lsp crash on save.
+
+commit 9fe2167d3fa875d2ac08f60850bab183a25cf58b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 1 10:41:29 2022 -0700
+
+    Update examples.
+
+commit 7b76b04637598965f166e77f3948aaa9ae80c803
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jan 1 17:28:24 2022 +1100
+
+    Fix bug #231.
+
+commit 6e359f24dff133f66478179bd2b51ca400cf7937
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 31 15:24:13 2021 -0700
+
+    Fix bug #263.
+
+commit 2ee4ca9267d5c2b7415080bd7b074f76e99cc70a
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Fri Dec 31 16:30:04 2021 +0800
+
+    Remove trailing spaces highlighting
+    
+    There are several plugins and alternatives to highlight trailing spaces
+
+commit d29fbefaab57f095f41f6851dc5ffe4ce5b4bbcb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 30 15:27:12 2021 -0700
+
+    Fix issue #287.
+
+commit e13e777a81379c846a83f3daa7ba5c117b1af797
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 29 22:58:45 2021 -0700
+
+    Workaround issue #206 by abandoning color.sty package for all TeX engines,
+    in favour of low-level specials.
+
+commit f10c7fd9f54e5e84a7b5287579dbb29ce45aabd3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 29 17:55:09 2021 -0700
+
+    Fix bug #241.
+
+commit c5edc7fba45c5a1c9cc46aee1c3078b84e1096c7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 29 17:36:35 2021 -0700
+
+    Use byteinv in writefromRGB.
+
+commit 445ba2486c29b69724ad24dba4699631f39903dd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 29 14:22:23 2021 -0700
+
+    Fix bug #286 by implementing better fix to bug #68.
+
+commit 10abb84a02abb2aad19704b56a797b46ac41f96d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 29 10:20:51 2021 -0700
+
+    Update links to gallery.
+
+commit fd26b0d813c06c92cdab5b2573d33bc4530f722a
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Wed Dec 29 15:40:45 2021 +0800
+
+    Add Dotted to list of constants
+
+commit 2c90bff859f9948d20065ae7fd7b048f57e93e89
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Wed Dec 29 15:33:16 2021 +0800
+
+    Realign code
+
+commit 176572fc125d726f2ec9f61ff4a059a5dd9d01d7
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Wed Dec 29 15:32:07 2021 +0800
+
+    Fix string highlighting
+    
+    Asymptote has two flavors of strings, single and double quoted, each
+    with different escape mapping.
+
+commit b02a07991a9c01eba86775fd4680f667dffd4b79
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Wed Dec 29 11:02:13 2021 +0800
+
+    Add a few missing keywords
+
+commit 435700d9ae05e4ec36ab5423401c2d0ea04448ec
+Author: Caio Prado <cagprado at yandex.com>
+Date:   Wed Dec 29 10:14:38 2021 +0800
+
+    Remove tabs and realign the source
+
+commit 3154b07e46fc0eb637acf65f17d4d08a991580a2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 28 15:26:08 2021 -0700
+
+    Disable erase for svg and html output.
+
+commit 19d0bce77ac7772d341577ccb26519708caff7e1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 23:16:05 2021 -0700
+
+    Disable order-independent transparency if SSBO support is unavailable.
+
+commit f5f62621c96f76f684dcda7ce8949a5285fa5bec
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 21:00:48 2021 -0700
+
+    Fix issue #285.
+
+commit 190ccf2773a599625c45ec3fc3a4fd709d63a555
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 18:23:47 2021 -0700
+
+    Increment version to 2.74.
+
+commit f28852ba9da596dd61f3755e67bc2a52d76c1fef
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 17:40:27 2021 -0700
+
+    Update asygl.
+
+commit 9217e347a01f1a8f2b095a1aac1d319e12a21306
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 17:37:28 2021 -0700
+
+    Look for an existing webgl context if webgl2 is unavailable.
+
+commit 72154e5aadd39f9c58586bd0fdc0ac51d68373b7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 16:43:08 2021 -0700
+
+    Update asygl.
+
+commit e6359241240166ee8ec48d022ee858313892dfac
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 16:40:35 2021 -0700
+
+    Support embedding of webgl and webgl2 scenes on the same page.
+
+commit 0539672ff6043da10a0afce946be9f1bc1809e65
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 15:20:03 2021 -0700
+
+    Revert "Revert webgl2 default in asygl library."
+    
+    This reverts commit 045d59d63b429d28bd133c1a550a36fa1726be60.
+
+commit 3f78b81efd7129f0617eff4fcf60d6ab8f670ded
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 14:39:24 2021 -0700
+
+    Update asygl.
+
+commit 045d59d63b429d28bd133c1a550a36fa1726be60
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 14:37:06 2021 -0700
+
+    Revert webgl2 default in asygl library.
+
+commit 4d04f9d75313e24d8987806b6ecae6f2c3660ac5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 13:12:53 2021 -0700
+
+    Increment version to 2.73.
+
+commit d1641723495c25a4cf84da33a477078903c2ef4c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 12:42:11 2021 -0700
+
+    Fix MSDOS build script.
+
+commit 4700d4983ff030293279af1a87edaa76aaf24169
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 12:20:27 2021 -0700
+
+    Fix offscreen rendering.
+
+commit 292c58c4a3522a176dc173a41785e6b1027dbb05
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 12:19:21 2021 -0700
+
+    Standardize function name.
+
+commit f41d05416a79d7ed1d94b4e8e91d814107fe5821
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 12:10:50 2021 -0700
+
+    Support compilation without OpenGL again.
+
+commit 6fbfb9af1200e3c11d8a1addc31208b13e7e7d2d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 09:18:23 2021 -0700
+
+    Fix last revision.
+
+commit 02a7e2ef41b6a07387bcd0a2240db7ada758334f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 08:20:37 2021 -0700
+
+    Port to clang.
+
+commit 61dc2f16e833f8ce42a982ba41650521bcfc0997
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 00:31:54 2021 -0700
+
+    Revert "Revert "Disable link-time optimization when rpmbuild compiles Boehm GC.""
+    
+    This reverts commit 5784093ef9a119ec07baf652247c1ddc5864b598.
+
+commit 95bb2394d155aa6387a62ec88cf9f32f0e42aedd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 00:28:36 2021 -0700
+
+    Update asymptote.spec.
+
+commit 5784093ef9a119ec07baf652247c1ddc5864b598
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 00:27:52 2021 -0700
+
+    Revert "Disable link-time optimization when rpmbuild compiles Boehm GC."
+    
+    This reverts commit e5f413d9b889175e328ece23d0f17b7a7459deb8.
+
+commit 15c101fbb22d40899442779ea5dd9e1d40dc66f1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 27 00:23:27 2021 -0700
+
+    Update MSDOS build script.
+
+commit d670d1fc6684ab72898a9fa290587bdc560745d5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 26 23:25:13 2021 -0700
+
+    Update asymptote.spec.
+
+commit 3aae0c65b207b91f0e3d2b5ed6822a1fa965dea2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 26 22:32:34 2021 -0700
+
+    Fix multiple output formats in threaded interactive mode; simplify code.
+
+commit 4af116e9191211a45adbe69f9ea998a95a4c11e3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 26 14:52:16 2021 -0700
+
+    Simplify webgl output.
+
+commit 187b2bb4bc29b294da4ab30f1eae3be72a7d9730
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 26 14:50:38 2021 -0700
+
+    Restore example.
+
+commit d887164de252ab1afb64b07181143b2700235dfd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 26 14:46:58 2021 -0700
+
+    Update asygl.
+
+commit 829efda683a36c22b5057336c2523584e2995670
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 26 14:44:59 2021 -0700
+
+    Enable webgl2 by default only for image-based lighting.
+
+commit 65408d84d6269f29d9c5d5fb56ebc2d5dc52c3c4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 26 13:07:47 2021 -0700
+
+    Remove invisible files from CTAN archive.
+
+commit 69b4e78c4f94c710dcc45d56aaba0d34896ca54a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 26 11:56:43 2021 -0700
+
+    Fix issue #284: revert to CPU indexing if compute shader compilation fails.
+
+commit 23716cdcd6c925662351a74368ddbc1c906793ec
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 25 18:31:50 2021 -0700
+
+    Set ibl=false when webgl2=false in HTML file.
+
+commit 5d28a10561b2c7a70367fed2df1180ab42d93f10
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 25 18:21:13 2021 -0700
+
+    Add missing newline.
+
+commit a2a608868151ac6c1bfa3d957f1db56af4c66cfd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 25 18:17:05 2021 -0700
+
+    Update asygl.
+
+commit 8712b3c391f55fd69710f7402470ba20090cbb4b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 25 18:12:05 2021 -0700
+
+    Implement setting for disabling webgl2 in resource-intensive examples.
+
+commit c7fa16084909b857d15aca90b137737c629a48db
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 25 09:27:58 2021 -0700
+
+    Remove unwanted files. Fix warning. Update README.
+
+commit bc331c961715af38f7d1d058273df1c90aa2a4b2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 25 01:31:25 2021 -0700
+
+    Increment version to 2.72.
+
+commit b320257106f4e71db722bb86f9f6f6512ec4251d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 25 00:47:02 2021 -0700
+
+    Revert last commit.
+
+commit 21ac0d5289f25ebca72878f01cf334dc8cef492b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 25 00:34:16 2021 -0700
+
+    Update latexusage example.
+
+commit 10ffc44e992354ec0fa8fb0b0eb2b8f4f3db0c55
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 25 00:31:30 2021 -0700
+
+    Update example.
+
+commit a97127a82c4fb2410f8676ba674d1d665c0cf000
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 25 00:16:39 2021 -0700
+
+    Fix MSDOS Xasy installation.
+
+commit 71d25abd29c3108d323acd625d56a320a2fb9e14
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 24 23:37:58 2021 -0700
+
+    Update documentation.
+
+commit 55b405472c0cb603829b2216d1901ae3df5bde8a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 24 23:32:48 2021 -0700
+
+    Update diagnostic.
+
+commit e1943baa46f882e1556b576b6d793a20525cc41f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 24 23:14:41 2021 -0700
+
+    Reformat.
+
+commit cd318ded572ee29051d2b8cd24f69911f44bd58c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 24 23:13:00 2021 -0700
+
+    Port to MSDOS.
+
+commit 5263140b82b5306f4485ed822142893fdd878d0e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 24 22:43:14 2021 -0700
+
+    V3D: Add initial material list.
+
+commit 59321f61e940937155f0c89d9203d3038e99e2f4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 24 21:41:44 2021 -0700
+
+    Remove obsolete reference to ocg.sty.
+
+commit d21af153506234b038fe944a2de2312b479b8fa0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 24 19:56:55 2021 -0700
+
+    Update to Boehm gc-8.2.0.
+
+commit e5f413d9b889175e328ece23d0f17b7a7459deb8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 24 19:02:06 2021 -0700
+
+    Disable link-time optimization when rpmbuild compiles Boehm GC.
+
+commit e2f5c5d6794fa401f07d3448a7727a260c8a4a03
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 24 11:46:38 2021 -0700
+
+    Fix Makefile.in.
+
+commit a19237cf81f905a19a2d10abc912824b7a72afec
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 23 21:59:53 2021 -0700
+
+    Document support for the Language Server Protocol.
+
+commit 769dd2e257f5161d64f7d4b83a3ecc667fc07836
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 23 20:46:18 2021 -0700
+
+    Disable Language Server Protocol under MSDOS until boost 1.69.0 or later is available for CYGWIN.
+
+commit 6b58bf411ee8d4f36989b389cb247a4d6f18aa28
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 23 20:44:17 2021 -0700
+
+    Port to MSDOS.
+
+commit 58e42f9ccbf4dc89594f1cc7a649bba811f929df
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 23 05:50:51 2021 -0700
+
+    Downgrade to Boehm GC 8.0.4.
+
+commit 17ed662797381269f0794da09a86a929f68e797a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 23 05:36:12 2021 -0700
+
+    Work around missing __log_finite function.
+
+commit 701f6679a0ed012ee9414ae7be056cee921198e1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 23 05:35:22 2021 -0700
+
+    git subrepo pull (merge) LspCpp
+    
+    subrepo:
+      subdir:   "LspCpp"
+      merged:   "b1c5308e"
+    upstream:
+      origin:   "git at github.com:vectorgraphics/LspCpp"
+      branch:   "master"
+      commit:   "9d772e36"
+    git-subrepo:
+      version:  "0.4.1"
+      origin:   "https://github.com/ingydotnet/git-subrepo"
+      commit:   "a04d8c2"
+
+commit c1c34559a17c49a15c0f9eb7908b8e322b09962e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 23 04:44:34 2021 -0700
+
+    Downgrade to Boehm GC 8.0.6.
+
+commit ac47d91ec2bef01cfa58beb861eb4b6bcc58c4b1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 23 00:01:41 2021 -0700
+
+    Document command-line interface to http://asymptote.ualberta.ca.
+
+commit 863347f183c82f4b64c1e67c34207227c828d179
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 22 14:02:00 2021 -0700
+
+    Document V3D output format specification; fix Makefile dependencies.
+
+commit 1210cc36ca7a6d018887e59cc56478a309856804
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 22 12:50:10 2021 -0700
+
+    Support compilation again without XDR.
+
+commit c46a45481f3db464115cb091f6c696ccc674ae7c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 21 11:08:43 2021 -0700
+
+    Port to MSDOS.
+
+commit 0151a7887fd90a977ca2e8f6c8f1e072d7d6f408
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 21 00:07:39 2021 -0700
+
+    Update configure.ac.
+
+commit dfb0dad25d6846802e47b49026de547d558ecc96
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 23:29:56 2021 -0700
+
+    Fix typo.
+
+commit 20b3bd3020f6547478eea70f307fb3f8c13d5034
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 22:44:10 2021 -0700
+
+    Fix Makefile dependency on Boehm GC includes.
+
+commit a031db668c7b382979b032fba087a79c493264b4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 20:34:25 2021 -0700
+
+    Fix Makefile dependency.
+
+commit d2bdbbda821a807f8ef9622b52263a50a832470d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 18:48:40 2021 -0700
+
+    Update to Boehm gc-8.2.0.
+
+commit 734cc1b4cd8a464b9780bdf48ca01754eb5d99e7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 15:11:42 2021 -0700
+
+    Replace RETSIGTYPE with void.
+
+commit 032127e7c97232468b3bb92e95aad1ae80e99fc5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 14:59:01 2021 -0700
+
+    Update configure.ac.
+
+commit 0ab436e4ed8dd9e7cda392bf88216aba551b2525
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 14:30:10 2021 -0700
+
+    Fix virtual function signature.
+
+commit 2542600b2fb805a7c1ed79604bbccee762ac6709
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 13:50:22 2021 -0700
+
+    Fix clang++ warnings.
+
+commit acb1f93544b977131caa684205e1492990d1d87e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 13:20:19 2021 -0700
+
+    git subrepo pull (merge) LspCpp
+    
+    subrepo:
+      subdir:   "LspCpp"
+      merged:   "fc6491ae"
+    upstream:
+      origin:   "git at github.com:vectorgraphics/LspCpp"
+      branch:   "master"
+      commit:   "c3ee4473"
+    git-subrepo:
+      version:  "0.4.1"
+      origin:   "https://github.com/ingydotnet/git-subrepo"
+      commit:   "a04d8c2"
+
+commit 353c1124aacece2e29240fe7b9b223a2eb5da8e6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 12:48:59 2021 -0700
+
+    git subrepo pull (merge) LspCpp
+    
+    subrepo:
+      subdir:   "LspCpp"
+      merged:   "bae08636"
+    upstream:
+      origin:   "git at github.com:vectorgraphics/LspCpp"
+      branch:   "master"
+      commit:   "89de4a84"
+    git-subrepo:
+      version:  "0.4.1"
+      origin:   "https://github.com/ingydotnet/git-subrepo"
+      commit:   "a04d8c2"
+
+commit 7ec627d96e114196c5abe3f1b73adfafb98048c5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 12:47:43 2021 -0700
+
+    Remove -Llib from OPTS.
+
+commit 48eb765869f1a1fb63a6873cdf592137995ff4f3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 10:29:58 2021 -0700
+
+    Port to MacOS X.
+
+commit 804c3527ef71140b0de45ef62582d1d7b2a4f742
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 20 09:14:44 2021 -0700
+
+    Enable offscreen viewing.
+
+commit 8223db3db7e15670f627f2fe07f19b9419f940ba
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 19 22:11:58 2021 -0700
+
+    Revert "Fix hang on display."
+    
+    This reverts commit 9aee221cb61a00c2ef275c4eb0415e7b913b234e.
+
+commit 16ba97539f36338fa065c0679631185021be42f1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 19 17:54:09 2021 -0700
+
+    Fix last revision.
+
+commit e4d18621486bc4d5452cfdd3558844fa894eadd7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 19 15:04:25 2021 -0700
+
+    Fix boost header file dependencies.
+
+commit 588d4d204cb0874c1e4a4229c5b8108e9785e049
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 19 12:04:02 2021 -0700
+
+    Undo commit 3f58c24ceb5ef71066fbd6a5b9746bc9638558bd.
+
+commit 70e1cfcdb33779813fe4ebd76aabcb14b082b1f4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 19 13:57:02 2021 -0700
+
+    Remove boost header file dependencies.
+
+commit 96e143cd4af5541dac04a4f1220f6aa613af413c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 19 09:51:18 2021 -0700
+
+    Fix git submodule status errors due to empty git subrepo directories.
+
+commit ebbdaa960a8824c209d30b0059516469df563a10
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 19 09:34:10 2021 -0700
+
+    Revert "Disable jekyll on GitHub Pages."
+    
+    This reverts commit 044d7837773f2845b1f8257927040d5df986d81d.
+
+commit 56fad9d2ad0d0bf6ee626f1952ef5744ab43a6bd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 18 22:29:55 2021 -0700
+
+    Disable orthographic adjustment in commit ab6c72c152ec8ad0e052706ac16023bf044ab550 for PRC output.
+
+commit 1a9bd32158e27bb11c134b8dc2521ccb5500872c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 18 21:16:15 2021 -0700
+
+    V3D: Apply lossy setting also to headers; fix xstream xbyte reads.
+
+commit d81d2287f3438ef936de2ca72632ac8540cf908b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 18 20:40:38 2021 -0700
+
+    Fix render parameters.
+    Add PRC compression=Single value to approximate single precision,
+    for benchmarking against V3D with settings.lossy.
+
+commit 0057b91fd6e47da2f09c8e00cd56c3621b6b510f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 18 12:33:07 2021 -0700
+
+    Simplify code.
+
+commit 044d7837773f2845b1f8257927040d5df986d81d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 18 08:56:42 2021 -0700
+
+    Disable jekyll on GitHub Pages.
+
+commit d385f531c03e6b2548d4f38bf3b0b07d94e3066d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 18 08:47:10 2021 -0700
+
+    Remove unused binary image.
+
+commit a410a2940d93b2ef8ff97458e1bf506e6f5a5fdb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 18 08:01:14 2021 -0700
+
+    Add minimal index.html for GitHub Pages.
+
+commit 21519f9d97d15cdc83f27bd869a294b2bc302ca0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 18 07:47:20 2021 -0700
+
+    Set theme jekyll-theme-cayman
+
+commit fd20ee1eb8fbf69e2d7bddfb98728b3d487abda0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 18 00:08:57 2021 -0700
+
+    PRC: Fix last commit.
+
+commit 6f4f179e121eb7002f75cd8ad9fa49244fb9b1ae
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 17 22:39:48 2021 -0700
+
+    PRC: Suppress viewing of prc output.
+
+commit aee35e71a1ea3cf086dc1fcf104e973f9d4071f0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 16 00:07:18 2021 -0700
+
+    V3D: Use global explicitNI and explictCI flags for better triangle group compression.
+
+commit b2811f9072e39e1172b86a58079bb187f24dd53e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 15 15:00:32 2021 -0700
+
+    V3D: Remove unused parameter.
+
+commit 6d686ea349ca7b3a08b4972c88b7c1d2472838b3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 14 17:43:29 2021 -0700
+
+    V3D: Add on v3d extension if needed.
+
+commit e68834bb93296e670eafc3bb084a1831e6cfaaff
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 14 13:47:48 2021 -0700
+
+    Check for existence of v3d input file.
+
+commit ef941786820e1d10cb06c29dcc4d311550a1057c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 14 11:44:30 2021 -0700
+
+    Fix rendering of triangle groups.
+
+commit d3a6d07ed3d63a1bcc9d799ff1d378c6b850e3aa
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 13 22:55:32 2021 -0700
+
+    V3D: Fix LightHeader size.
+
+commit 10fbb46a8b1f889bab093578439c2af5d380c69e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 13 17:54:31 2021 -0700
+
+    Fix issue #280.
+
+commit 7eb3221ee32816207d8f99af26eaf9c2c2fc5654
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 13 17:51:50 2021 -0700
+
+    Fix commit b979946b3e9c7bef55f53421a711c823c5585a8e.
+
+commit 297dcd00a1333349bd5e8fe7a49341fe757ab721
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 13 11:36:04 2021 -0700
+
+    git subrepo pull (merge) LspCpp
+    
+    subrepo:
+      subdir:   "LspCpp"
+      merged:   "0ecc0ecd"
+    upstream:
+      origin:   "git at github.com:vectorgraphics/LspCpp"
+      branch:   "master"
+      commit:   "200001e9"
+    git-subrepo:
+      version:  "0.4.1"
+      origin:   "https://github.com/ingydotnet/git-subrepo"
+      commit:   "a04d8c2"
+
+commit 0c78f5d505c86e0483fa86564c95cdccd1936142
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 13 00:20:42 2021 -0700
+
+    Fix last revision.
+
+commit fbea3a770be6e95fdcc5040724bbd26b731740b3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Dec 13 00:15:30 2021 -0700
+
+    Fix compilation for configure --disable-lsp.
+
+commit b60ef92ffde1edd6b0a8a589c1a937317dc3a3c2
+Merge: 117f64ba bc239956
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 12 23:30:34 2021 -0700
+
+    Merge branch 'lsp'.
+
+commit bc2399563cc1325e92cb35eab1ac19c0cd7b593e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 12 23:22:05 2021 -0700
+
+    LSP: Check for boost library and adjust C++ version if needed.
+
+commit 725532eada03a5eba8f0364ae32761c6637b6a27
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 12 20:56:11 2021 -0700
+
+    git subrepo clone (merge) git at github.com:vectorgraphics/LspCpp
+    
+    subrepo:
+      subdir:   "LspCpp"
+      merged:   "47760384"
+    upstream:
+      origin:   "git at github.com:vectorgraphics/LspCpp"
+      branch:   "master"
+      commit:   "47760384"
+    git-subrepo:
+      version:  "0.4.1"
+      origin:   "https://github.com/ingydotnet/git-subrepo"
+      commit:   "a04d8c2"
+
+commit 117f64ba06c983e67daacce64391d0521ad9a3ff
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 12 11:18:46 2021 -0700
+
+    V3D: Add placeholder 2D types.
+
+commit 95c04ac3dea4fd20a7a13a33f767062950796d1e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 11 22:08:02 2021 -0700
+
+    Remove blank comments from v3dheadertypes.csv.
+
+commit b979946b3e9c7bef55f53421a711c823c5585a8e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 11 21:37:18 2021 -0700
+
+    Move byteinv to C++ code.
+
+commit 82d1eacc0115a3b44a8d2e51e6885228a226b810
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 11 21:25:24 2021 -0700
+
+    Improve make_unique support.
+
+commit b0617bb6a1c830498aaaebb37cbbb13fd6b5704a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 11 18:02:31 2021 -0700
+
+    LSP: Port to C++14.
+
+commit 6f238b01ae31f81b7a20730b1413077e0837e08c
+Merge: 895c90e8 5f2f5ba5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 11 12:18:57 2021 -0700
+
+    Merge branch 'master' into lsp.
+
+commit 5f2f5ba5515b6585e49f1c3983be15f71f59411c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 11 11:47:55 2021 -0700
+
+    Port to C++-11.
+
+commit f73647c9b9bac0fbdc2a63915968a68b28fa8792
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 10 23:14:10 2021 -0700
+
+    Update documentation and example.
+
+commit 0a99516528f94ba5ef447ab075f448080dae7697
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 10 20:05:22 2021 -0700
+
+    Port to C++-14.
+
+commit 1b51a78ca2730484282c3f76db40c2781059a106
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 10 19:01:42 2021 -0700
+
+    XASY: Avoid unwanted line offset.
+
+commit fac7a3db5e93b6401c63e8faaab479a53e1f337e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 10 18:07:49 2021 -0700
+
+    XASY: Implement -render option.
+
+commit 39b596f9253727d2a3c64a18696fe9c80f138f27
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 10 17:57:56 2021 -0700
+
+    XASY: Fix 3D picture sizing.
+
+commit 11f0eb133aff09d23428ae53ebc5aa6f001bf317
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 9 12:16:26 2021 -0700
+
+    Fix last revision.
+
+commit 3f58c24ceb5ef71066fbd6a5b9746bc9638558bd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 9 10:46:00 2021 -0700
+
+    XASY: Combine 2D and 3D pictures.
+
+commit 4d07369721fe15cbf92411c7b6d013f7b76aad9a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 9 10:42:13 2021 -0700
+
+    XASY: Assign initial key to all nodes of a 3D picture.
+
+commit c451cf62bcae8234d9074886ebeb6264cdab34b7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 9 10:39:17 2021 -0700
+
+    Fix infinite loop.
+
+commit eb1968c76b3b46cddc03fc5f6e7fd994cb206619
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 9 10:15:14 2021 -0700
+
+    Fix uninitialized variables.
+
+commit 303906eff9f4d147d3fcece633928692ac9d6395
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 19:26:47 2021 -0700
+
+    Update example.
+
+commit 8db6799673c2a1df4bbcdbbb12f8f13283f33b6d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 16:36:37 2021 -0700
+
+    Update asygl.
+
+commit 611c636b4b2f1e163f65ae93a3973a4df664ae8f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 16:34:46 2021 -0700
+
+    Allow embedded webgl and weblg2 contexts to coexist.
+
+commit 61262aede26d4b3b940f00cbe7db52a92948f222
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 15:09:24 2021 -0700
+
+    Revert "Require EXT_color_buffer_float for webgl2."
+    
+    This reverts commit 12618432904d0ef9ab52a9b6390bf20c015ca7b3.
+
+commit b4d6f5f936ea5d09b82d816131aadebeb7543d7f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 12:42:09 2021 -0700
+
+    Update asygl.
+
+commit 12618432904d0ef9ab52a9b6390bf20c015ca7b3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 12:38:54 2021 -0700
+
+    Require EXT_color_buffer_float for webgl2.
+
+commit 0820480eeca20ba83dd0c6dfa12e7f1678dc07da
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 12:05:00 2021 -0700
+
+    Update asygl.
+
+commit 1cfa9d36ce6a0bf1a51265f1f25463ec77a46561
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 12:04:01 2021 -0700
+
+    Remove obsolete alerts.
+
+commit 23bfe9b348c5e3f186acbf4d8579adac8b4b0bd2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 11:19:27 2021 -0700
+
+    Fix offscreen rendering.
+
+commit 5f156092e8fa7924ded2299080fff4260c966686
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 11:05:52 2021 -0700
+
+    Delete trailing whitespace.
+
+commit 8edad4e3e6c4f2c31b291dbb81cda576d84c7195
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 10:05:50 2021 -0700
+
+    XASY: Only edit asy code: wait for editor and then reload.
+
+commit be2b3a80c4734f444d6a571159d9b9946dd8c6b1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 8 07:57:41 2021 -0700
+
+    XASY: Calculate maxKey explicitly.
+
+commit 1fd9331d4dc8e3a6d49645a52b42cac0f2942894
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 7 23:18:43 2021 -0700
+
+    XASY: Remove duplicate objects.
+
+commit d1d8d9710c641dfd84c5aa4dce3ebde66d41bafe
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 7 21:06:30 2021 -0700
+
+    XASY: Update maxKey and globalObjectCounter on loading xasy file.
+
+commit 4b123f011329554e602aa945e0c91fbcda802290
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 7 16:00:12 2021 -0700
+
+    Reformat.
+
+commit 61798c5a195cafc22eb64fc02675e227ebd83cd8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 7 13:01:59 2021 -0700
+
+    Restore example.
+
+commit f7a84bdad76882658a1248417f418fcb9de47845
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Dec 7 10:41:00 2021 -0700
+
+    XASY: Correctly account for xmap line offset.
+
+commit 49371c4f04ebf906904c3242aeb6bbe5985e272e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 5 22:51:20 2021 -0700
+
+    Check array index.
+
+commit e8447947f359ce1d832ba42c7c03779de7fd62de
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 5 22:34:42 2021 -0700
+
+    Add plus and diamond markers to Mark and MarkFill arrays.
+
+commit d66b7c757a87f7a747730ab31fa59e93a4716d8d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 5 21:15:37 2021 -0700
+
+    XASY: Assign correct KEY to 3D images.
+
+commit 01c144622b1c880929bb8eadcabd20373aa37093
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 5 10:52:55 2021 -0700
+
+    Simplify code.
+
+commit 9d99a2af7f6c690cbe3dde266cf6d3fba20eac24
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Dec 5 05:53:55 2021 -0700
+
+    Delete pictures at end of scope.
+
+commit 23b76b2cdd39c57e29dbbd0ac7787fa587ecdcfe
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 4 22:28:57 2021 -0700
+
+    Ensure rendering width and height are positive.
+
+commit 86245eca5e591b823696a5d8e551a42fcbdbc8aa
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 4 21:34:32 2021 -0700
+
+    Embed png images within svg output again.
+
+commit efafcec14de4fbf94023705face48e3c5eeb41fe
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 4 15:16:21 2021 -0700
+
+    Restore example.
+
+commit 1aee785b3fd7d7648644f9727a2605744fe0578d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 4 14:23:21 2021 -0700
+
+    XASY: Support context TeX engine.
+
+commit 1f86d94950fb6a9e00fa9e0160b64f7f1c0ffa42
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Dec 4 08:42:54 2021 -0700
+
+    Support luatex TeX engine again.
+
+commit ad1365d78a6d41dcabf3ad363b85a4d7b90d68ae
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Dec 3 10:02:32 2021 -0700
+
+    XASY: Simplify support for multiple PostScript files on dvisvgm command line.
+
+commit 1a32da79a8c674a1b0d5a7060f62a11cdd9facda
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 2 22:02:38 2021 -0700
+
+    XASY: Support multiple PostScript files on dvisvgm command line.
+
+commit e1d9c115b923dabb42f69c5034d20b9924fb2c9e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 2 05:28:31 2021 -0700
+
+    Delete texput files.
+
+commit 92d2ceafbf87a50d70711e4bef0e102f64acd126
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 2 04:27:43 2021 -0700
+
+    XASY: Rename debug flag.
+
+commit 35736fbd98a3f9aed49bfca1f195a27e9483a00f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 2 04:01:33 2021 -0700
+
+    XASY: Don't overwrite extension in loadFile.
+
+commit 571d1eadab6c5edd743320c7a12f60d971cf58f8
+Merge: b47ab404 20fe8cd8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 2 03:41:32 2021 -0700
+
+    Merge branch 'Qt'.
+
+commit 20fe8cd80ad7bba8745a0515a3f1722d445f463b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Dec 2 03:38:26 2021 -0700
+
+    Revert "XASY: Set up work for adding 3d objects in the interface."
+    
+    This reverts commit 98ba7ecd29378505c57c6579ab9ed06680a4584b.
+
+commit b47ab4045cde9113111415a810cf75cc95f3eacf
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 1 22:14:58 2021 -0700
+
+    Add example of image-based lighting.
+
+commit c01e1750697868bb0f5136c6ebde021a82034834
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 1 22:12:03 2021 -0700
+
+    XASY: Support xelatex and lualatex tex engines again.
+
+commit fd584e400cbc982792494e5e0b05b34dcc7ac335
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 1 21:45:08 2021 -0700
+
+    Make bshift return a new bbox.
+
+commit 45ddd44e7c39666c62f1058e0472e5fdc1f113f4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 1 20:51:02 2021 -0700
+
+    Check for cson module; remove obsolete option formats.
+
+commit 50c67e8ea73e1053037bf0dfaa67c2a0f6f28bec
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 1 20:29:49 2021 -0700
+
+    XASY: Make .asy the default extension again.
+
+commit 6504f81c83507a4754701e26668c006a10a13fbe
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 1 19:40:36 2021 -0700
+
+    Remove obsolete code.
+
+commit d61699ad72f7ee95262cf6831b1618e382eb530a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 1 19:22:34 2021 -0700
+
+    Batch deconstruction.
+
+commit bf8956b682d61eaddfeb68e7950769c269cd6e51
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Dec 1 18:37:23 2021 -0700
+
+    XASY: Re-enable rendering of 3D images.
+
+commit 2cb129d85a32ae80b0652da1a50f5e6fb717db35
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 21 22:09:21 2021 -0700
+
+    XASY: Fix segmentation fault.
+
+commit e5f45896916caf91fd6e304413dd8dcb8477b230
+Merge: 2fac9e58 86954d86
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 21 17:40:50 2021 -0700
+
+    Merge branch 'master' into Qt.
+
+commit 2fac9e58b131a3879fa461ca16d25d6f21d63e05
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 21 17:37:31 2021 -0700
+
+    Fix deletion of asy objects.
+
+commit 294de4a41db9f2240d2651cb5271cf18cefb2f4e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 21 16:17:47 2021 -0700
+
+    XASY: Remove spurious xmap comments.
+
+commit fc0ae4f8a6566fd2b17c4d7de8a4ff8ef4ebcf1e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 21 15:39:51 2021 -0700
+
+    GUI: Retain deleted objects and their keys.
+
+commit 86954d8680ae6a6d3e416fa3a7dea56c97e39662
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 21 00:03:27 2021 -0700
+
+    Remove redundant patch from teapot example.
+
+commit 1d9322c22f2c3bae7ff87a083ec174f74f7047f7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Nov 20 23:52:20 2021 -0700
+
+    Update asygl.
+
+commit 8fd0a9426a2efd1036f0b38a05059689973d2753
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Nov 20 23:49:55 2021 -0700
+
+    Implement WebGL2 optimizations.
+
+commit cf00aca4c825cc37d14938fa0210b948bffd2e67
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Nov 20 23:48:33 2021 -0700
+
+    IBL: Enable image-based-lighting for transparent WebGL objects.
+
+commit aa5be72ec60608e1940df034e63602440ace0bf2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Nov 20 21:22:15 2021 -0700
+
+    Update asygl.
+
+commit b21d65aafe245d8ac57e6778dfc1c6132b16089e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Nov 20 21:21:21 2021 -0700
+
+    Fix WebGL errors.
+
+commit 242785789a0bd458ca0c798669f41d5cf106d7f4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Nov 20 09:59:35 2021 -0700
+
+    Improve missing EXR image diagnostic.
+
+commit bdd70abb16f23e1e76d3768455805fc3a0ddda15
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Nov 19 17:59:07 2021 -0700
+
+    Fix buffer overflow.
+
+commit 194fcc875bdc43b88eb030818b424ac1bff11274
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Nov 19 16:39:35 2021 -0700
+
+    Improve clamping.
+
+commit a6c5dfef30582c2ce80c0f8c5b4e0738d927b371
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Nov 19 15:38:16 2021 -0700
+
+    Update diagnostic.
+
+commit e91b0f87d347fa1ea7ed98717cb40ab29cb59515
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Nov 19 14:13:12 2021 -0700
+
+    IBL: Move precomputed image files to gitlab.
+
+commit 10a602f4de8754a3ea6a9e55d3f87ced11aa40b0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Nov 18 23:36:57 2021 -0700
+
+    Remove snowyField images.
+
+commit 45285c1da090797f8bb28733339ee76de643419e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Nov 18 23:17:25 2021 -0700
+
+    IBL: clamp oversaturated values.
+
+commit b182a0d4b72c5511e7aa83629f0f3c7dbac8cf65
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Nov 18 20:24:23 2021 -0700
+
+    IBL: Improve EXR diagnostic.
+
+commit 541038fedb724214b2c22858b78df2e7dcd6134a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Nov 18 14:32:16 2021 -0700
+
+    Fix directory permissions.
+
+commit c59a4039317b66b3e6091113ee6a408184c65f2a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Nov 18 14:30:51 2021 -0700
+
+    Change default imageURL to https://asymptote.sourceforge.io/ibl.
+
+commit c47263d97a92f28bb6ce1554f2c2673d8402f17d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 23:24:11 2021 -0700
+
+    Implement int[] sequence(int n, int m, int skip).
+
+commit cdfda4400beb12521ddb143a43df3d8aac793e13
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 23:18:47 2021 -0700
+
+    CUDA: Add usage information.
+
+commit dede658f8fecbec2f62d12255eac534d07dffe32
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 22:56:47 2021 -0700
+
+    Fix buffer overflow on small images.
+
+commit 166e21507e2191e499c8b4acedddc4eb4fae82bb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 17:32:50 2021 -0700
+
+    Update asygl.
+
+commit 0a85d36a173fefbfdb2c9a0f42a707990878b307
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 17:32:11 2021 -0700
+
+    IBL: Rename default image.
+
+commit 2931c7c098ac8d11955a52cf9ac7d83dbf45b7ef
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 17:28:24 2021 -0700
+
+    IBL: Fix texture alignment.
+
+commit 36b88dcfe3934bd505263047ab2d76d86eed0d10
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 13:20:46 2021 -0700
+
+    Update asygl.
+
+commit e429470b41ef1385869f4e80538520e99327b68d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 13:20:17 2021 -0700
+
+    IBL: Port to Safari browser.
+
+commit 4904634cce7a015bb5b38f0e3da8ef25cda8d98f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 12:12:09 2021 -0700
+
+    Update asygl.
+
+commit 971afe2dbd98295a09518d97144b7aa9a00b0594
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 12:10:45 2021 -0700
+
+    IBL: Wait for Module.ok.
+
+commit de52f109ce7524d8135b689174ea01a07178c67c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 10:24:20 2021 -0700
+
+    Update asygl.
+
+commit 78ce79108e5ba301b263ab630b11cfcdf500a7d7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 10:21:43 2021 -0700
+
+    IBL: Wait for EXRLoader to become available.
+
+commit 1e62b2adc3a9c576cd809354c8b28c88aed9d552
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Nov 17 09:58:42 2021 -0700
+
+    IBL: test single file version of tinyexr.
+
+commit df370d54fec4b4defdaf00bc3a6adf9128ffa18f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Nov 16 23:57:42 2021 -0700
+
+    Update asygl.
+
+commit 6fde5c414cfa02e3771126a29d7d376d9d0ee414
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Nov 16 23:55:56 2021 -0700
+
+    Standardize location of image-independent refl.exr.
+
+commit 7c82febdb56ee320cf7b89c8ce3b68e2ed6fd7aa
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Nov 16 22:58:27 2021 -0700
+
+    Fix ibl orientation and offset; re-organize fragment shaders.
+
+commit 4b32c102bebd2e95737ba492f42468857a1752b7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Nov 16 22:57:30 2021 -0700
+
+    CUDA: Fix logic.
+
+commit 2f842c4773e56850cc6f1d85a82b120cdbdd5702
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Nov 16 16:17:01 2021 -0700
+
+    Exit gracefully on missing EXR file.
+
+commit 11afb32b51e6f4f7508d9063552d266788aa6da8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Nov 16 16:15:59 2021 -0700
+
+    Separate image name from imageDir and imageURL.
+
+commit c69fcaa50d93930451b0828454beedee069ee8ab
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Nov 16 16:15:14 2021 -0700
+
+    Fix logic.
+
+commit 753e3d13eee10066fb63ab491a008e634ddbc3eb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Nov 15 22:28:52 2021 -0700
+
+    Replace deprecated OpenGL function.
+
+commit 53e1291eabc60e9d8cb1bee8481c6fdefdd22ee9
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Nov 15 21:41:39 2021 -0700
+
+    Fix compilation warning.
+
+commit 32e5a3a766cc17e26740ad1bf7d93062abc46316
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 14 22:59:46 2021 -0700
+
+    Add tinyexr JavaScript support files.
+
+commit 40a222986d8869296975732e9c30298dc66aaf09
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 14 22:52:57 2021 -0700
+
+    Update asygl.
+
+commit 11e4f084422311f4049ae30690706f32d5f0e4b2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 14 22:45:00 2021 -0700
+
+    Add sample IBL files.
+
+commit 278261e685996a747f3aca51358293653be87a7c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 14 22:38:26 2021 -0700
+
+    Standardize image-based lighting; port successively halved version to WebGL.
+
+commit 9e723d1c0c18d7983c870c987f34ec53df1b5bca
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Nov 14 10:29:00 2021 -0700
+
+    Recompile tinyexr.js.
+
+commit b048f3ed57ea6700cbf73225e642c23b3c707263
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Nov 12 11:47:19 2021 -0700
+
+    git subrepo pull (merge) cudareflect/tinyexr
+    
+    subrepo:
+      subdir:   "cudareflect/tinyexr"
+      merged:   "67010eae"
+    upstream:
+      origin:   "https://github.com/syoyo/tinyexr"
+      branch:   "master"
+      commit:   "67010eae"
+    git-subrepo:
+      version:  "0.4.1"
+      origin:   "https://github.com/ingydotnet/git-subrepo"
+      commit:   "a04d8c2"
+
+commit 150a1ec3c1460b49a4a7c6940c8ca4ab6b5088c2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Nov 12 10:03:17 2021 -0700
+
+    Update gl.js.
+
+commit a49741358f3f9c9b79bb24dac263c4dec8d1d785
+Merge: c7c084b6 568da114
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Nov 11 22:05:36 2021 -0700
+
+    Merge branch 'master' into cudareflect.
+
+commit c7c084b64b93bb3dab3f95a2077e7aa96a132114
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 1 10:09:16 2021 -0600
+
+    Remove obsolete comments.
+
+commit 568da1148099379911849355cff8d2afde5ec148
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Nov 11 21:31:24 2021 -0700
+
+    Fix vertex-dependent colors.
+
+commit 6c9c98f5969ded7634da1be6e6360c6213253914
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Nov 9 19:44:32 2021 -0700
+
+    V3D: Fix garbage collection.
+
+commit 1f3330aa53c1f7b17de27c85f67e89be654d6dd3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Nov 8 22:49:27 2021 -0700
+
+    Fix commit 263285fa05e0cae294b1ec8abda292407a6eb83b.
+
+commit da93b0f2fe7616f9dafddc346da292fe67fa261b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Nov 8 11:54:51 2021 -0700
+
+    Interpolate vertex-dependent colors as floats.
+
+commit 12315bf7b99311b434d0662e362012f83b35b76e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Nov 8 10:36:04 2021 -0700
+
+    Restore efficient Bezier rendering engine; fix prerendering for vertex-dependent colors.
+
+commit ddeaab0ce72488ea08c05415d5170647f6e8c866
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Nov 8 10:32:26 2021 -0700
+
+    Fix byteinv.
+
+commit bf21a3428f7dcf3466fa78a10ab01b1c01fa8486
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Nov 4 05:21:29 2021 -0600
+
+    Allow compilation without OpenGL support again.
+
+commit 24ab461a7e2c7768b7735620af723b4d1a04bee3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Oct 31 10:45:22 2021 -0600
+
+    Standardize AsyGL and v3d; remove alpha channel from light direction.
+    Increment asygl to version 1.01.
+
+commit f9e36b082ae4516e143552b685efb5f9860be252
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Oct 31 10:41:14 2021 -0600
+
+    V3D: Mention source file in header comment.
+
+commit 9f9b9cfdb450048341f4eac3778e4e1f5999b8a9
+Merge: ae624c44 3b3f33bb
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Oct 31 09:59:52 2021 -0600
+
+    Merge branch 'master' into v3d.
+
+commit 3b3f33bb7f0ded94761de6f03497bbadc7169d70
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 30 21:49:04 2021 -0600
+
+    Cache background color.
+
+commit 263285fa05e0cae294b1ec8abda292407a6eb83b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 30 21:40:03 2021 -0600
+
+    Keep 2D and 3D pictures separate.
+
+commit 4cd7ad1080819d88c1887e4e645124ed94c9a5e8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 30 21:39:54 2021 -0600
+
+    Fix last revision.
+
+commit b9a1aa0b3835ace3cfc0c5978abc75e7e61b1bb0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 30 13:48:14 2021 -0600
+
+    Clear offset buffer in blend shader.
+
+commit 7988a6f01a3e45e9099d89bcdad0ddc8a20f9337
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Oct 29 17:21:53 2021 -0600
+
+    Enforce std430 layout.
+
+commit 7257d628a6c49dd982787e05a8778a284c1faaf2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Oct 29 00:25:56 2021 -0600
+
+    Choose unique buffer names.
+
+commit 39be6abe5afbc2cc846ee41b08db6a13a8bd8059
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Oct 29 00:17:46 2021 -0600
+
+    Fix outline and wireframe mode.
+
+commit 70e20fc773e68d2fe3ed4da86bb77c218c6bc431
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Oct 26 22:34:36 2021 -0600
+
+    Remove troublesome u qualifiers from preprocessor constants.
+
+commit 3724879c8b1ca767c75559406c578df13670d52d
+Merge: 44a1a06a 172dda0b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Oct 25 22:31:48 2021 -0600
+
+    Merge branch 'oit9'.
+
+commit 172dda0ba85335690722f17fd1d2131ea2109b86
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Oct 25 09:53:42 2021 -0600
+
+    Use highest available GLSL version; detect compute shaders.
+
+commit b52992a66893b34a6d69812b9a900a7822afc2ee
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Oct 25 08:26:55 2021 -0600
+
+    Improve check on available number of GPU processors.
+
+commit b4e3174a085da72c9af55d044d319a96eba5c3d4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Oct 25 00:43:15 2021 -0600
+
+    Use CPU indexing for offscreen rendering; add setting GPUindexing=true.
+    Fix exporting.
+
+commit a13e84d544c12f10a13e8d5935c1d45fcfb92729
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Oct 24 17:22:46 2021 -0600
+
+    Improve frame rate diagnostic.
+
+commit 999c701e41507c7f54863c0a7b4536bb7061d559
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Oct 24 17:00:34 2021 -0600
+
+    Improve shader compilation diagnostics.
+
+commit 97ce07d029ab3f6f961e1673ce1db548b0d39d0d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Oct 24 16:57:32 2021 -0600
+
+    Unroll initial loop.
+
+commit ae34f5364218ab2b0ce3fc8d95c7614c6b9a6213
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Oct 24 13:20:47 2021 -0600
+
+    Use maximum number of available GPU processors.
+
+commit 44a1a06a99e5fd18b5d7557de2c6e3197597d256
+Merge: 7f57426f 025e14b2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Oct 24 11:15:13 2021 -0600
+
+    Merge pull request #273 from descodess/cleanup-code
+    
+    Cleanup code.
+
+commit 025e14b2b58fcd63c70df34f76e1a8af1c783d31
+Author: descodess <87569405+descodess at users.noreply.github.com>
+Date:   Sun Oct 24 15:06:34 2021 +0200
+
+    fix syntax
+    
+    remove trailing semicolon
+
+commit 832a7718661c83d96865a71efc4ace8b6b6796cf
+Author: descodess <87569405+descodess at users.noreply.github.com>
+Date:   Sun Oct 24 14:54:15 2021 +0200
+
+    unify and cleanup code
+    
+    - unify code
+    - cleanup code
+
+commit f4ddc1d7d9031189411010932aed3b3a6add867b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 23 17:10:04 2021 -0600
+
+    Fix offscreen rendering.
+
+commit 1f916adbd5532786b3d1ffd45cc8a26257976b46
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 23 16:35:17 2021 -0600
+
+    Optimize code.
+
+commit 00bc732b403334793bd6c28dcfb678e7c00b3572
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 23 16:35:17 2021 -0600
+
+    Simplify code.
+
+commit 5d2717ca3d552023f50d237dceb55c2108213602
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 23 15:21:17 2021 -0600
+
+    Backport HAVE_SSBO case to GLSL 1.50 with extensions; simplify shader calls.
+
+commit 82d54b08a1ba9082d022394bb9e3baac4edf087e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 23 13:37:52 2021 -0600
+
+    Remove unused glClearBufferData.
+
+commit 0f3904629e4f14d825ac4e26075d7a04c0de9a46
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 23 13:07:47 2021 -0600
+
+    Rename transparentfragment shader to blend shader.
+
+commit de5ffab119e32dd93e7aa1b507c69d7052648895
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 23 12:54:15 2021 -0600
+
+    Defer memory barrier as long as possible.
+
+commit c567e4b482d2f58eccde51aa510e61a549d49778
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 23 01:33:43 2021 -0600
+
+    Simplify code.
+
+commit 152c3c22fae4f5614aa82c520892c5cad61c6a14
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Oct 23 00:41:41 2021 -0600
+
+    Implement presum and postsum shaders with smaller workgroups.
+
+commit ca2c624141aae22b68d92e8f729fd01365468d49
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Oct 22 11:38:01 2021 -0600
+
+    Slightly overallocate fragmentBuffer.
+
+commit 1fdb1497f1349c3abc3b23f2aac1867c146d2253
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Oct 22 11:18:55 2021 -0600
+
+    Use glGetBufferSubData for better performance.
+
+commit 62bcdd35ae8378fd3624e039dc8951a02fa5f81b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Oct 22 10:00:19 2021 -0600
+
+    Add missing column.
+
+commit 0cd38189fd8e236c480278f5c1dffc9321f1da5b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Oct 12 23:25:20 2021 -0600
+
+    Detect SSBOs at configure time.
+
+commit a6626dc8476d85777b4935e200f80443155cfe3a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Oct 7 17:01:37 2021 -0600
+
+    Fix screen resizing.
+
+commit 8b705bda0c1d378e06ccfbe63d23c37f04fddba3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Oct 21 21:06:50 2021 -0600
+
+    Reduce sharedData size by 1.
+
+commit e16b6696a73fea89e247afcc8b3ca3f8fe1124a7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Oct 21 17:56:28 2021 -0600
+
+    Optimize partial summation.
+
+commit 7f57426f17798f6e7b67a3278b7b0123fa8ff188
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Aug 22 22:59:16 2021 -0600
+
+    Disable PRC output by default.
+
+commit 5278c0bc9ac8f7aec120d756849db6972fdac7ed
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Oct 1 12:18:52 2021 -0600
+
+    Reduce the number of writes.
+
+commit 2d5c76615a5656a69947fe52dbedc81d644d589f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Oct 1 11:59:34 2021 -0600
+
+    Fix transparent wireframe mode.
+
+commit e4adee2dc5dd930057cd52fe017b56635fa50149
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 30 22:18:26 2021 -0600
+
+    Add missing files.
+
+commit c28f97f86e8b58ec5b77e68b041948583081b59a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 30 18:08:05 2021 -0600
+
+    Clear counter array directly on GPU.
+
+commit 7bfd346e4570d4feb54ff606d6ac0cc1f868ba5b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Sep 30 17:19:30 2021 -0600
+
+    Compute partial sums on GPU.
+
+commit b90c8b2e5fefd1a2a8ffafdc964889c79e0d75c0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 28 16:56:07 2021 -0600
+
+    Blend transparent objects with background.
+
+commit 71aff16107856f58661358b727ba354d30cf0370
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Sep 27 02:18:26 2021 -0600
+
+    Only reallocate zbuffer as needed.
+    Fall back to centroid sorting for legacy GLSL versions.
+
+commit 43719418bac6b96a747727a38a012be4b60e63f9
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Sep 26 01:37:22 2021 -0600
+
+    Improve performance by not clearing depth buffer.
+
+commit 64224e276958ea86635722a36867830cf44abbf2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 25 16:30:58 2021 -0600
+
+    Invoke mergeShader once per pixel; sort large fragment lists in place.
+
+commit 63df2147cc8406171a9da3b8b36a58bed4c5e38e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 25 02:22:00 2021 -0600
+
+    Compress fragment list.
+
+commit 4e711e64b3b24a14f2e2f8c07b637c19cefd6406
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 24 18:15:35 2021 -0600
+
+    Handle errors gracefully.
+
+commit 95f5f2cf1b944abc994a8de363723afdcdc3ae66
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 24 17:51:03 2021 -0600
+
+    Remove unused extension.
+
+commit 6d43aa48cd703fc90c118d1dd2437919df081748
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Sep 24 17:03:51 2021 -0600
+
+    Remove unused code; reduce GLSL version.
+
+commit cf6880d79c87a4ae1a0ecd557be9cfb0de19be35
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 22 01:41:04 2021 -0600
+
+    Implement order-independent transparency up to fixed depth.
+
+commit 1a03ddc1990e6c98c668b000447a2d26a9816846
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Sep 11 22:51:11 2021 -0600
+
+    Update example.
+
+commit 4a471d9f141325e44af2090a00e7f80daa75d730
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 7 15:10:03 2021 -0600
+
+    Revert "SETTINGS: Implement once option that limits to one shipout."
+    
+    This reverts commit 51be72a7c0dcb66d9dfd54e490a7f9c0dffdfe29.
+
+commit acfacda74b6eb1e2c51432700b792e58d41e8703
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 7 15:09:40 2021 -0600
+
+    Revert "SETTINGS: Improve once setting."
+    
+    This reverts commit 863550d54f2fd73907829af9f10e28a158d8d8aa.
+
+commit 9aee221cb61a00c2ef275c4eb0415e7b913b234e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 7 15:08:20 2021 -0600
+
+    Fix hang on display.
+
+commit 26fee75283f3087df8174610707f437e43123e72
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Sep 7 14:53:50 2021 -0600
+
+    Update FFTW++.
+
+commit a21ba3043207290b82d3ef100f12e1f9c80f5799
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Sep 6 20:08:13 2021 -0600
+
+    XASY: Fix copy translation bug.
+
+commit 302d588b0498a9272152e2e262245d6d2a4d6b60
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Sat Sep 4 20:43:55 2021 -0600
+
+    XASY: Fix object copying translation glitch.
+
+commit e331cefff6f6136c691a69a0e0292b9f07feba48
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Sep 1 00:48:47 2021 -0600
+
+    Clamp oversaturated values.
+
+commit 781c2f8ba80b3a2b5a81103f838a249c7f98794c
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Tue Aug 31 23:42:25 2021 -0600
+
+    XASY: Change errors with pasting.
+
+commit f8359c15510ea5b383347892c85f90e386d78f46
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Tue Aug 31 15:59:07 2021 -0600
+
+    VS: Move linalg.cuh to utils.cuh.
+
+commit 4d4e1c433652076ff791942e52e3683a012d380f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 31 15:58:17 2021 -0600
+
+    Add missing file.
+
+commit c070d3cd7076c97d41d17f9de93d3a3bdb712d41
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 31 15:57:25 2021 -0600
+
+    Add reference.
+
+commit db0ef4c4955dca0853052fa81c9e1c4b01d64fae
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 31 15:54:36 2021 -0600
+
+    Rename file.
+
+commit 52a4bfbdd063f31abce9adb5c3202d7061c1e6f3
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Tue Aug 31 15:31:48 2021 -0600
+
+    CXX: Include abs2 in the DefaultVec3 function.
+
+commit e4e2a750179e8f6d6892ffeb6cc262d2a96a6914
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Tue Aug 31 15:31:30 2021 -0600
+
+    VS: Include simpson.cuh in vcxproj file.
+
+commit e0ae066f4968fa980899158ea6759d578479e304
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 31 00:40:46 2021 -0600
+
+    Integrate diffuse image with adaptive simpson integration.
+
+commit 79c8e33e7d7fc3f08fb7172de3ca8b96ae11699b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 30 21:38:52 2021 -0600
+
+    Simplify example.
+
+commit 37833d712a1993a13a0e0f82a8ae8e8c16a46352
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Mon Aug 30 19:05:08 2021 -0600
+
+    HEADER: Remove any unneeded functions from linalg.cuh.
+
+commit 866733b926da9ca839cfb52d305ab4737b64d784
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Mon Aug 30 18:55:16 2021 -0600
+
+    GLM: Migrate internal integraiton code to glm::vec3/mat3.
+
+commit 84f678b57544f677592b808678251b21c7d227d2
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Mon Aug 30 02:37:20 2021 -0600
+
+    WEBGL: Add missing closing bracket to fragment shader.
+
+commit 39ac3e241f5777f1dba1051d57b922b9755e84c4
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Mon Aug 30 02:33:50 2021 -0600
+
+    CUDA: Use Simpson's method for inner loop also.
+
+commit 6d5f8b735f5c0759a1073fe845e24b44b39de045
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Mon Aug 30 02:19:19 2021 -0600
+
+    CUDA: Use a template simpson's method for integration.
+
+commit e1165ce48521067074e6ef09062e3df11cd10354
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Mon Aug 30 01:59:29 2021 -0600
+
+    Refine simpson's method for integration.
+
+commit a9133135d236bb592814c19e92ddd87dc9e73729
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Aug 30 01:38:03 2021 -0600
+
+    XASY: Pasted objects follow mouse.
+
+commit 48d25978a7103a1b8485cb80ce4b7297dddcdb96
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Aug 30 01:16:52 2021 -0600
+
+    XASY: Fix copy/paste graphical bug.
+
+commit d82bb2de9416ce0a209b138c46850e211e5943d3
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Mon Aug 30 01:11:17 2021 -0600
+
+    GLM: Use glm for irradiation generation.
+
+commit 2d7af868033a42d6dbf1f0f024db3f3266caa2d7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 28 22:36:56 2021 -0600
+
+    Fix endpoint.
+
+commit d477d8577575831f57ad53ecb8df8bf808d490bc
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Sat Aug 28 18:08:59 2021 -0600
+
+    WEBGL: Add support for PBR Texture sampling.
+
+commit c7869c3face0d2ab79d8dac49d3c3af12b137a8c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 28 08:31:37 2021 -0600
+
+    Fix last commit.
+
+commit 1199f6db6b255f675f855b54ebb8f2d570b68c15
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 27 23:02:27 2021 -0600
+
+    Use Simpson's rule for integration over phi.
+
+commit 0cb2bc4b7c2f4ac82d98df80b3460d4b5797be44
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Fri Aug 27 22:28:34 2021 -0600
+
+    REFL: Allow for output size different to input and enable halving of sizes for mipmap.
+
+commit 6fce80c00b769c98fc53b5fc317ed31a99bc76a8
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Fri Aug 27 21:53:24 2021 -0600
+
+    CU: Extract integrand to a separate function.
+
+commit 77f18124bc5788561990d1d560053e26099c497a
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Fri Aug 27 21:42:49 2021 -0600
+
+    CU: Move integration function to a class.
+
+commit 89c414a94693d2be041dd9f9623e5e1186351809
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Fri Aug 27 17:00:57 2021 -0600
+
+    CXX: Use C++17 for structured bindings temporarily.
+
+commit e07757a43286d883642a2f5013ca0ab60c230e84
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 27 00:03:40 2021 -0600
+
+    Simplify code.
+
+commit d1ca5ca3c6400ba26c6da27dc74967c251cf7bdc
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Thu Aug 26 21:08:58 2021 -0600
+
+    EXR: Enable PIZ compression by default.
+
+commit 150323ec482871cf181aa7d809ee2ed5d6beb5fc
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 26 20:10:02 2021 -0600
+
+    Output missing directory.
+
+commit 881f038851e9f8c642344205b517e78eb84f33df
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Thu Aug 26 19:49:04 2021 -0600
+
+    CXX: Add copying file and extract some functions.
+
+commit 15e5b4783c6761592909d1b0048b251bcef8675b
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 25 16:53:29 2021 -0600
+
+    GL: Fix texture parameter bindings.
+
+commit 7b36e0e262b881f0b7da255e074818c4229ec359
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 25 16:42:41 2021 -0600
+
+    Extract loading IBL Data to a separate function.
+
+commit 722723098b87c74d6dfda6c4dfeb2391457950af
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 25 15:55:52 2021 -0600
+
+    GLSL: Extract IBL to a separate function.
+
+commit 096b673db236faab237f9a922ba78a9a00effc4d
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Tue Aug 24 23:59:06 2021 -0600
+
+    XASY: Remove debug message.
+
+commit 326bc7a96d283849ed4f88fba194985a19b6ddf0
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Tue Aug 24 23:51:31 2021 -0600
+
+    XASY: Expand functionality of copy and paste.
+
+commit 997e4ee59793d6136aec080368ed66220193b989
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Aug 24 22:17:39 2021 -0600
+
+    GLSL: Update shaders to use IBL.
+
+commit 8e8cb4e54072a87c736bd57f40011117a6753c2d
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Aug 24 22:03:25 2021 -0600
+
+    GL: Update parameters level.
+
+commit 5635f37214c2bd13c94dc52fa38f37e6831f923a
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Aug 24 15:43:20 2021 -0600
+
+    GL: Add basic texturing system to asy.
+
+commit 6e4fb11ab637a16076edc4673c35a94c7d54f674
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Aug 23 10:17:14 2021 -0600
+
+    XASY: Add message for copying unsupported types.
+
+commit 1a0127e0f4789974fe6dd8e7c214e7f0d2941bdd
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Aug 23 00:50:05 2021 -0600
+
+    XASY: Fix major copying bug.
+
+commit ae624c444c41b4441b6745e96528b0fe3b1bb79d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Aug 22 22:59:16 2021 -0600
+
+    Disable PRC output by default.
+
+commit e3f895e6dcee599193b369b501d72d562161cee6
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Sun Aug 22 18:58:44 2021 -0600
+
+    REFL: Formalize arguments for program.
+
+commit df676f0b62ce1b223fb62d509707c7aacd783352
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Sun Aug 22 17:55:14 2021 -0600
+
+    REFL: Add EXR and argument handling.
+
+commit 6a136116ddbb664241ac5a7cd2169e9f58f351ca
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Sun Aug 22 17:09:48 2021 -0600
+
+    REFL: Update Visual Studio solution to use vcpkg instead of nuget.
+
+commit b029cb065cc50bee50e611d9dddcb5e233820f29
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Sat Aug 21 23:48:58 2021 -0600
+
+    XASY: Fix crash bug with copying.
+
+commit 43bf5ad9483e40b42968fae7650bc624c0c28591
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 21 23:06:07 2021 -0600
+
+    REFL: Port to UNIX.
+
+commit ba4a5a979cca422caf5440c519c22ed5b05936a3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 21 22:01:29 2021 -0600
+
+    git subrepo clone https://github.com/syoyo/tinyexr cudareflectance/tinyexr
+    
+    subrepo:
+      subdir:   "cudareflectance/tinyexr"
+      merged:   "b0d2abbd"
+    upstream:
+      origin:   "https://github.com/syoyo/tinyexr"
+      branch:   "master"
+      commit:   "b0d2abbd"
+    git-subrepo:
+      version:  "0.4.1"
+      origin:   "https://github.com/ingydotnet/git-subrepo"
+      commit:   "a04d8c2"
+
+commit 283dbec8d3d31b538a397d4c7f8d737561f720a3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 21 21:45:23 2021 -0600
+
+    THREE: Add missing center transform.
+
+commit abbce6ee1dcfc13628eab49cc45ab3e4f4335dc5
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Sat Aug 21 18:22:53 2021 -0600
+
+    REFL: Use importance sampling for pre-computing fresnel values.
+    (Is this the right value?)
+
+commit 75d4cdd93180d0d81149b7a9aa5f28e244ba59d9
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Fri Aug 20 21:32:40 2021 -0600
+
+    CUDA: Add error checking to free and intellisense improvements.
+
+commit 89dfe5eec19fcec2e8cd1276bff6a5e94e392e11
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Fri Aug 20 21:32:26 2021 -0600
+
+    CUDA: Include a currently (broken) roughness/CosV map to reflectance values.
+
+commit 34fafd8d6b08f83fa2f505368593d75d3603ac6f
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Fri Aug 20 17:10:17 2021 -0600
+
+    CUDA: Add separate VC++ Irradiance generator code.
+    Note that our goal is to convert this VC++ project build script to a Makefile script and ensure it is compilable under linux.
+
+commit f6a8a83ba8f75119fdf9665b397b0992fa00f584
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Thu Aug 19 00:45:47 2021 -0600
+
+    XASY: Forbid changing fill status on open curves.
+
+commit 5f5e10a1de1aab07e046f9dda5dcec86fdd45e0a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 19 00:06:05 2021 -0600
+
+    Remove diagnostics.
+
+commit 3cbb0dbef8873f99fa7f447e337a862769222c2a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 19 00:03:14 2021 -0600
+
+    Avoid duplicate centers.
+
+commit 9d2892af776569e465f993c9324135eff612241e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 17 04:04:58 2021 -0600
+
+    Update asygl.
+
+commit 4acc17ed4c8f7530dd848ca43e7579a190541a31
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 17 04:01:27 2021 -0600
+
+    Support centerIndex in WebGL triangle groups.
+
+commit bcff5923ef657f7ea579179f63b7701208c8e993
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 17 04:07:56 2021 -0600
+
+    V3D: Add billboard support to triangle groups;
+    suppress primitives when prerendering.
+
+commit 0817a2f368dcb040d8fb0823df96a3e671782ba6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 17 04:04:58 2021 -0600
+
+    Update asygl.
+
+commit 82aa6d237153b7f3ac60e44b86402f1052c7e7cd
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 17 04:01:27 2021 -0600
+
+    Support centerIndex in WebGL triangle groups.
+
+commit 22a784d251242440f4cbdaa8ae2349ba031cf8db
+Merge: b0729f18 79137914
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 16 17:29:43 2021 -0600
+
+    Merge branch 'master' into v3d.
+
+commit b0729f182305c81242487207e4be370951ec791f
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Mon Aug 16 13:53:08 2021 -0600
+
+    V3D: Render triangle if primtiive flag is >0.
+
+commit 5c2379943e53d576dfa301afe20e209161f4eccb
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Mon Aug 16 12:45:56 2021 -0600
+
+    V3D: Add center to triangle groups.
+
+commit 79137914157f38ce1fb548e26d2a409cc36445d7
+Merge: d56f0966 3fdfbd69
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 16 10:13:34 2021 -0600
+
+    Merge branch 'Qt'.
+
+commit 8a9407456564b94c087791f51614cfe03a02b0b1
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Sun Aug 15 22:13:42 2021 -0600
+
+    XASY: Add alpha version of copy/paste.
+
+commit e5ab80073a29e25b3b9d94a96f22f312a79ec9b4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 14 02:36:43 2021 -0600
+
+    V3D: Simplify and optimize V3D workflow.
+
+commit 3d31566beae8f39b12a9b4b83f4627d92dbb0377
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Fri Aug 13 21:09:20 2021 -0600
+
+    V3D: Remove Min/Max from V3D generation.
+
+commit 9eefbed0d0c58736f12b67d5df4c2f7590d6b6df
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 13 18:43:54 2021 -0600
+
+    Fix prerender resolution.
+
+commit 906a5be824a2a7c6b4e800800f11e678d974e543
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 13 18:18:18 2021 -0600
+
+    Make prerender a real setting.
+
+commit 7afa49892cd20e38d19c3a18d4d2c956941db0d1
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 13 17:34:14 2021 -0600
+
+    Support reading material triangle arrays.
+
+commit d56f09667ca0e9f2b3b6fc4aadfe330e99915a9c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 13 00:23:05 2021 -0600
+
+    PEN: Make byte(double r) map [0,1] to [0,255] uniformly, with 0.5 mapping to 128.
+
+commit 98ba7ecd29378505c57c6579ab9ed06680a4584b
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Tue Aug 3 00:18:26 2021 -0600
+
+    XASY: Set up work for adding 3d objects in the interface.
+
+commit 3fdfbd69f7d75fecc4908ec07684553f897d9e47
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Wed Aug 11 22:34:21 2021 -0600
+
+    XASY: Remove unreachable code.
+
+commit f8fd80407962c18deee37029c764455e0050fc3c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 11 17:59:25 2021 -0600
+
+    Makefile: avoid python dependency in releases.
+
+commit 90608841304c3d233cd5194c05eb8783da60bd70
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Wed Aug 11 17:14:18 2021 -0600
+
+    V3D: Add java support for enum generation.
+
+commit 7448d4f8789152cd71cd2406d8299320ca37c5eb
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Wed Aug 11 16:55:27 2021 -0600
+
+    V3D: Add comment support for enum types.
+
+commit 4c633b4c95589cc029da7e99666bd26e7fac74f0
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Wed Aug 11 16:02:30 2021 -0600
+
+    V3D: Enable asy header generation to base/*.asy file.
+
+commit f2e2d37759a8514e0f51dc8535fbbe5bf1e061e8
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Wed Aug 11 15:58:47 2021 -0600
+
+    V3D: Move enumheader directories to the asy dir.
+
+commit c8ce4c0454d3c4b9a1f39cf854384c87ddaabaf9
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Wed Aug 11 15:24:36 2021 -0600
+
+    V3D: Use gzipped file as the reading mode for V3D.
+
+commit 676ee735c0715d1bf89322ea24f12d3e122d65df
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Wed Aug 11 15:24:17 2021 -0600
+
+    V3D: Add gzfile as igzxfile option.
+
+commit ff9766b6139e60c2db1feb0eed9ba4e28c28c98f
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Wed Aug 11 15:22:55 2021 -0600
+
+    V3D: Add memixstream to support input from memory.
+
+commit 50a11030172f594158e561b578bf42ba4a060eea
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 11 01:00:05 2021 -0600
+
+    V3D: Use global instead of local bounding box for drawTube.
+
+commit 8dbffd7305b72a6b5325d064581c0dd01e430478
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 11 00:59:30 2021 -0600
+
+    V3D: Fix WebGL sphere syntax.
+
+commit 4b855feb8728f7440219e2502af264a8d2043a6c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 11 00:25:13 2021 -0600
+
+    V3D: Implement light in v3d.asy.
+
+commit 60c849655df07657d2f3224afd9a193dda2bc06f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 10 01:27:47 2021 -0600
+
+    V3D: Improve description of lossy setting.
+
+commit a55a50c7cedd4a5c5ad7600ae73d1a63fa1f5e64
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Tue Aug 10 21:23:40 2021 -0600
+
+    V3D: Add in light information for v3d.
+
+commit 806c67a373c8dda38fc38d8638fe35235c798c55
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Tue Aug 10 21:53:31 2021 -0600
+
+    XASY: Add messages upon saving files.
+
+commit f921075a3738ab968dc594fcb6bcb29bb0f54e21
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Tue Aug 10 21:23:40 2021 -0600
+
+    V3D: Add in light information for v3d.
+
+commit 863550d54f2fd73907829af9f10e28a158d8d8aa
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 10 21:14:59 2021 -0600
+
+    SETTINGS: Improve once setting.
+
+commit 51be72a7c0dcb66d9dfd54e490a7f9c0dffdfe29
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 10 20:45:55 2021 -0600
+
+    SETTINGS: Implement once option that limits to one shipout.
+
+commit e361cf952267d786d462dda40ddcf8d6ddfb584b
+Author: Supakorn Rassameemasmuang <jamievlin at outlook.com>
+Date:   Tue Aug 10 19:35:06 2021 -0600
+
+    REPO: Add clang-format file.
+
+commit bc75527b354ef090064aa4777f779413a0339a9d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 10 01:20:10 2021 -0600
+
+    V3D: Fix precision, hemisphere alignment, curves, and cores.
+    Add primitve support.
+
+commit 0fc1a6bb15667544aecf77c0aafb014c45227742
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Aug 10 01:16:23 2021 -0600
+
+    THREE: Expose drawTube primitive.
+
+commit 5acc87fcfea6737a451c97301c52332ca7e8713f
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Aug 9 22:05:46 2021 -0600
+
+    V3D: Detect single real in v3d.
+
+commit 0d4ae3663c998315ba5c51694631621e7709b650
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Aug 9 21:55:24 2021 -0600
+
+    V3D: Add single precision as an option with -lossy.
+
+commit 45303157fed6b5525de65b10ee7206c42668f079
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 9 21:43:38 2021 -0600
+
+    V3D: Fix dependency.
+
+commit 486166359a2d6dd02101c9292370973c4827b22e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 9 21:35:18 2021 -0600
+
+    V3D: Simplify code.
+
+commit 84ab496c2a4e8e0957fdceb705b62c885b0f8920
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Aug 9 20:00:27 2021 -0600
+
+    V3D: Add gz as an option.
+
+commit 2fe8816e92ac59e28f14e8ef0aa7d24b2607dcd3
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Aug 9 18:26:51 2021 -0600
+
+    V3D: Use open_memstream for in-memory files.
+
+commit 9da89c31033c68fe8ed414b71725d93fa9206918
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Aug 9 17:44:00 2021 -0600
+
+    XASY: Fix changing text labels.
+
+commit aceb3d56f81f1552b3ccdc3a12c9eead22cc6984
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 9 17:14:17 2021 -0600
+
+    XASY: Color filledbucket and nodes of curve and polygon icons.
+
+commit 2c52f34e4439309cba661ef7d82c3328afcfdf41
+Merge: 71cb3f68 a6a23c75
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 9 16:06:52 2021 -0600
+
+    Merge branch 'master' into Qt.
+
+commit 7c8b9134cbca36073401b980b34c7870b0922267
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Aug 9 16:06:30 2021 -0600
+
+    V3D: Add memv3dfile option.
+
+commit 15fe906d4e07c81fa408a11c58fe04c9c522e15e
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Aug 9 15:17:48 2021 -0600
+
+    V3D: Abstractize v3dfile to absv3dfile.
+
+commit 2a533bc20aae3b1b50cffd644e81dc00e39de7d8
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Aug 9 15:17:07 2021 -0600
+
+    V3D: Add python as an makefile option.
+
+commit 71cb3f68c3ca463eb4ad6515cd25986b86a73d85
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Aug 9 15:02:45 2021 -0600
+
+    XASY: Fix saving bug.
+
+commit a6a23c75f8b9fd9c126c06509feb638a2eeb808a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 9 10:29:23 2021 -0600
+
+    Rename renderMode to renderDensity.
+
+commit 4603ec03cd7bdfa97e8c91559c115049d62593ba
+Merge: 867f44da 9c6677a2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 9 09:49:17 2021 -0600
+
+    Merge branch 'master' into Qt.
+
+commit 867f44da7c079b5c35512c3ddb35d23f9887902d
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Aug 9 00:38:08 2021 -0600
+
+    XASY: Add option to change keymaps.
+
+commit 9c6677a2e51a2503be8dd97924a061db47a1b9ee
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 7 10:57:08 2021 -0600
+
+    Revert "Disable threads again by default under MSDOS."
+    
+    This reverts commit 29f965b7050b6ffb4da77a73b66d277e76ae77d8.
+
+commit 8f07a8bca008738c5ee0ff6f8fa04482f4d69c3d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Aug 7 00:02:31 2021 -0600
+
+    PARSER: Fix declaration of yyparse.
+
+commit 787c1c397476890ae20abb0b6ed54d8f99471048
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 6 23:48:58 2021 -0600
+
+    V3D: Standardize names.
+
+commit 4b8c2489044c9fba4b2186889ed33bd22576665a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 6 22:35:44 2021 -0600
+
+    XASY: Add renderMode to default xasyconfig.cson.
+
+commit 2a5bd095a0492c66e5492cbe8c7523421e0f8e05
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 6 22:35:18 2021 -0600
+
+    Support prerelease suffixes.
+
+commit 922ab672ec7bd0e76d597eda23988e02ae7675c4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 6 21:33:19 2021 -0600
+
+    Port support for 3D rendered xasy pictures to MSDOS.
+
+commit 2b2a6926a92ff8022ba3ae7edcf0a0538adfa601
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 6 21:26:47 2021 -0600
+
+    V3D: Add more information to V3D header.
+
+commit c267db95d8c6fbf483e0a6a30d460b223d27b5d0
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 6 21:14:09 2021 -0600
+
+    V3D: Add Zoom0 and margin information to v3d.
+
+commit 1631e3967dd23bb03c051f060218475c9dfb5f9b
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 6 20:48:30 2021 -0600
+
+    V3D: Set camera info in V3D.
+
+commit 825fc91b375c160a92fc08573e6fe916daa6b29e
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 6 20:39:50 2021 -0600
+
+    V3D: Add Header reading in asy.
+
+commit 924c58c89d226cce0b5377ffa2baca2e90a8f96d
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 6 20:28:48 2021 -0600
+
+    V3D: Add enum generation for asy.
+
+commit 8bbce6486cb265e5b86308ee9ea9d660f83274bc
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 6 20:11:51 2021 -0600
+
+    V3D: Output header data.
+
+commit e44d572c6f8f0ed7fb8ae8921525b99d693dca1f
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 6 18:27:25 2021 -0600
+
+    V3D: Fix V3D Makefile generalization.
+
+commit 8dbbf33bcddc584cccdeb8027e58bdda1f8cf64c
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 6 17:39:30 2021 -0600
+
+    V3D: Add v3dheadertypes to enum headers.
+
+commit 455c5954a351315dec9575fe49ea32d72d7d7d5d
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 6 16:48:03 2021 -0600
+
+    V3D: Generalize Makefile rule for enum headers.
+
+commit 52a3fe49cb2e7b215beb88a295b3c20a21c75693
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 6 16:41:06 2021 -0600
+
+    V3D: Move csv and generated headers to enumheaders.
+
+commit fe5ea8845d6ec6288d021223b01ab5f98cefad65
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Aug 6 16:19:46 2021 -0600
+
+    V3D: Add script for v3dtypes generation from csv.
+
+commit 29f965b7050b6ffb4da77a73b66d277e76ae77d8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 6 09:00:30 2021 -0600
+
+    Disable threads again by default under MSDOS.
+
+commit af811ec03dccd4fab73dfe00d78bc9318f8e717f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 6 08:58:30 2021 -0600
+
+    Fix infinite loop on EOF when readline support is disabled.
+
+commit 52657aa0f28ffff1b884d09ccbe1f9f9fcef17a6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Aug 6 08:10:16 2021 -0600
+
+    Fix typo.
+
+commit e59b0fadcd1e2ef689f299dbad49f624db1b5469
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 5 23:19:24 2021 -0600
+
+    Update documentation.
+
+commit a5eda4eed14198827bcba139206faa0fbcc488d8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 5 22:13:18 2021 -0600
+
+    Suppress internal Qt diagnostics.
+
+commit 0995689e8505f85329b000c50e74daab196e887c
+Merge: 57b93d55 7dead80b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 5 21:45:03 2021 -0600
+
+    Merge branch 'Qt'.
+
+commit 7dead80b436bb90ed81090315538b21d20c3cbc0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 5 21:34:42 2021 -0600
+
+    Revert "XASY: Fix closing bug."
+    
+    This reverts commit 35aaf24d8bdf1db19ea001f88bfe44cecc6ec1ec.
+
+commit adc58bc87e608c8f6706115d8a71a0c738ac8b83
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 5 21:33:45 2021 -0600
+
+    Revert "XASY: Fix freehand saving bug."
+    
+    This reverts commit aac59af3405e51726a708b6ca06fb3fc35c5f45b.
+
+commit 57b93d5513b734a676a7633ddbf7b33a65fb42bf
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 5 18:06:07 2021 -0600
+
+    Revert "XASY: Set up work for adding 3d objects in the interface."
+    
+    This reverts commit bad1b04a2aaf6e21eacf07b046d99e07a839c18f.
+
+commit 94651febdff5250fb6bc98393817a578737a8ee4
+Merge: 2d4c3cde c2f559c8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 5 18:05:32 2021 -0600
+
+    Merge branch 'Qt'.
+
+commit 2d4c3cde07d7498301f337277522c69586deae76
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 5 15:34:23 2021 -0600
+
+    Add missing fuzz parameters to routines that call intersections.
+
+commit c2f559c8b7f6083542b650b5f3909e688ffe95be
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Aug 5 12:13:06 2021 -0600
+
+    XASY: Remove addressed note.
+
+commit aac59af3405e51726a708b6ca06fb3fc35c5f45b
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Thu Aug 5 10:33:43 2021 -0600
+
+    XASY: Fix freehand saving bug.
+
+commit 3850f9948b6d535b61988e5096514890fbb16d4d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 4 22:05:56 2021 -0600
+
+    V3D: Fix color triangle.
+
+commit 5c387a68c6912c6434434042b56e3ed35a8fa6af
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Wed Aug 4 20:05:02 2021 -0600
+
+    XASY: Fix fill status errors for freehand objects.
+
+commit 648015672687357ca36f94e503b9d8976a42286b
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Wed Aug 4 19:51:32 2021 -0600
+
+    XASY: Improves quality of fix to text saving bug.
+
+commit e6ac8c6ae41c8bd93f2df18670cd13965f843eb7
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Wed Aug 4 19:42:04 2021 -0600
+
+    XASY: Add option to fix text.
+
+commit af70420fdfc859862fca6ba760d2b7cda54e67c6
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Wed Aug 4 19:33:13 2021 -0600
+
+    XASY: Fix closing bug regarding text.
+
+commit 6bd3ad893a819b7020150db5c1ec82195bfe3b27
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Wed Aug 4 19:19:08 2021 -0600
+
+    XASY: Fix text saving bug with xasy format.
+
+commit 05e5ca886fec7372b0ada8d6305eb2b16efc7c0b
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 4 17:35:04 2021 -0600
+
+    V3D: Add generation for triangle lists.
+
+commit 7103e5c70ab519927d38b7f9bc549643caa034e8
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 4 17:27:29 2021 -0600
+
+    V3D: Add generation for path lists and pxiel lists.
+
+commit 379d8f71a73f900a6b6e3c192ba186d3c8d51332
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 4 17:14:12 2021 -0600
+
+    V3D: Fix surface typo.
+
+commit cab1f904c16b490711498a21d7954cfd95aa5e30
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 4 17:12:02 2021 -0600
+
+    V3D: Output Min and Max on bezier patches and triangles.
+
+commit 6843d56c53ecc246c1ca8523ccd56723084530bb
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Aug 4 17:08:09 2021 -0600
+
+    V3D: Add support for straight patches and triangles.
+
+commit 7e49626efc399d7b5581857fc16ab00a5a17936b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 4 00:48:56 2021 -0600
+
+    Fix alignment issues.
+
+commit 098789a4f4446125ffa3f16071c1f111d83cd76e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Aug 4 00:47:40 2021 -0600
+
+    V3D: Generate primitives for both v3d and webgl.
+
+commit fd7b1f0f8c3e2ead714f30ad88291c782d648e02
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Aug 3 18:47:10 2021 -0600
+
+    V3D: Add triangles and pixel to reading V3D.
+
+commit 51eb5ae116173a9e9fdbfd128bd8abf6e16a8d5d
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Aug 3 17:48:30 2021 -0600
+
+    V3D: Add pixel and curves to v3dfile.cc.
+
+commit 141a1fdde34df2908a0e6723e89142962bb5319e
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Aug 3 17:31:20 2021 -0600
+
+    V3D: Add multiple primitives function to importv3d.
+
+commit bad1b04a2aaf6e21eacf07b046d99e07a839c18f
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Tue Aug 3 00:18:26 2021 -0600
+
+    XASY: Set up work for adding 3d objects in the interface.
+
+commit 0689fcebfc49ac58f569ca0539a0c3f0134db5ae
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 2 22:31:58 2021 -0600
+
+    V3D: Fix pixels.
+
+commit 66d0aa1f9b0dbf08e5aabab94fc94589a93347fe
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Aug 2 21:04:49 2021 -0600
+
+    V3D: fix hang with -V option.
+
+commit e6e9739dd37b9e47fb2af647398d83ee31618b48
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Sun Aug 1 17:27:25 2021 -0600
+
+    XASY: Add beta version of changing fill status.
+
+commit bb9bfde7ff2e0d881a8d493a9c67a2adf89a8523
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Aug 1 11:35:26 2021 -0600
+
+    Support billboard labels.
+
+commit fb90ea9ec15ca2249dab02590a5fe15edcef5b4f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Aug 1 11:29:32 2021 -0600
+
+    Support billboard interaction mode for general patches via render argument.
+
+commit 35aaf24d8bdf1db19ea001f88bfe44cecc6ec1ec
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Sat Jul 31 22:26:39 2021 -0600
+
+    XASY: Fix closing bug.
+
+commit 32e4ede32ac0b9b74c5fbd65cd069f1720324348
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Sat Jul 31 22:11:45 2021 -0600
+
+    XASY: Change name of render mode.
+
+commit a6c2218a87ec02ba11ad96b2b520d40bf0650e9e
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Jul 31 19:20:15 2021 -0600
+
+    V3D: Enable generation of surface lists.
+
+commit 45447153388fa3bf4ddef89cbc6871de92ebc4cb
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Jul 31 19:14:53 2021 -0600
+
+    V3D: Enable reading color data.
+
+commit 4ca2bb85002f2cd5fb48d27fba0c533860e91945
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Jul 31 19:14:40 2021 -0600
+
+    V3D: Fix adding color information for v3d.
+
+commit 7b929621a7acbd322e6b2580c75cd7d39a5d4aef
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Jul 31 18:44:02 2021 -0600
+
+    V3D: Add reading in center information to importv3d.
+
+commit 8908226e183dd6b8d71a0035e5e5506855d244c9
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Jul 31 18:43:44 2021 -0600
+
+    V3D: Add center information to v3d file.
+
+commit cc3ce0aef490a62b616b16ec9ea8330979b92d04
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jul 30 22:00:13 2021 -0600
+
+    V3D: Add a draft v3d import script.
+
+commit 6d957f4d713ca58fa0a17f9a16ad04c11435ec1b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jul 30 18:08:50 2021 -0600
+
+    XASY: Standardize case.
+
+commit 0c81a76bb5a7546a1e75992c664512dd7b27f3e4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jul 30 17:16:50 2021 -0600
+
+    Update demo.
+
+commit 4e4e49a9a39a108ab11cebe04309e78632649b5c
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Fri Jul 30 13:21:45 2021 -0600
+
+    XASY: Fix crash on 'Exporting as Asy' for new files.
+
+commit 88a10b46356cf14d1ef91faeea7261f346b3a226
+Merge: 63eea214 9650c998
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Fri Jul 30 13:16:58 2021 -0600
+
+    Merge branch 'Qt' of https://github.com/vectorgraphics/asymptote into Qt.
+
+commit 63eea2141b1fbb356542d18a4116969f899f8db0
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Fri Jul 30 12:06:56 2021 -0600
+
+    XASY: Add ability to cancel operation if file changed while making new file or loading file.
+
+commit 1ca12fe7d1217efb4eb6acc4bc7384fda41c6dbb
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Fri Jul 30 11:48:50 2021 -0600
+
+    XASY: Change saving asy import file warning dialogue.
+
+commit 8b9d0d7e85a1a39e01fa2cb98885513eb73a3d87
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Fri Jul 30 11:45:50 2021 -0600
+
+    XASY: Move exportXasy code into xasyFile.py for modularity.
+
+commit cbbe012edfba70fdf101716d6e401e58ee72f7ca
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 17:58:17 2021 -0600
+
+    V3D: Standardize element types.
+
+commit 3da65efbabfc69660b1616f28fe27a0582038301
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 17:38:14 2021 -0600
+
+    V3D: Update demo.
+
+commit 0a8cda8f9d0989c22b6325a841ca595d2197dd2f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 17:00:55 2021 -0600
+
+    Update asygl.
+
+commit d1c850efb3edd7d5cc07e2233f07358507668e12
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 16:55:39 2021 -0600
+
+    ASYGL: Reformat gl.js.
+
+commit 8f6820ed364f37e5cb669dd669e21c78111b986c
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 16:44:53 2021 -0600
+
+    ASYGl: preallocate vertices array in Triangles.
+
+commit a5401fe15e3273d24ffa395f7670d74a1cebf7c2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 17:00:55 2021 -0600
+
+    Update asygl.
+
+commit 466763c02e5e0e4c005465f463be69076f125927
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 16:55:39 2021 -0600
+
+    ASYGL: Reformat gl.js.
+
+commit b968e9311ccd087285c105539f8fd9b5f576b00f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 16:54:39 2021 -0600
+
+    Port to C++-11.
+
+commit f5c34d02ab5cf4514234b8b1dc33ec419c387934
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 16:44:53 2021 -0600
+
+    ASYGl: preallocate vertices array in Triangles.
+
+commit 9650c9989582f20a02c72668f303c71bab15080a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 11:41:11 2021 -0600
+
+    XASY: override outformat rather than entire user config file.
+
+commit 63112fceb984838facceef072c87d79d5be76eff
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 11:38:20 2021 -0600
+
+    XASY: ignore user config file.
+
+commit cc7d93f40a7895cfc9599c9ada0f2655f4db7cee
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 29 11:33:02 2021 -0600
+
+    Use single quotes.
+
+commit bd449cf33f10a9dad41e34b91dbf161ad429d093
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jul 29 02:00:42 2021 -0600
+
+    XASY: Ensure consitency of dialog for found identical files.
+
+commit 363acfd36317d6c46fc6fa12c01312bd980d2ad9
+Merge: 3d91532e 9161d8bf
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jul 29 01:51:40 2021 -0600
+
+    Merge branch 'Qt' of https://github.com/vectorgraphics/asymptote into Qt.
+
+commit 3d91532e0068d2679eea9f441d52159535d13a34
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jul 29 01:51:18 2021 -0600
+
+    XASY: Xasy file saves asy2psmap + fix actionSave() dialogs.
+
+commit 0ac652ef39eff2fbeb2cf31acce4691d4edf701e
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jul 29 01:01:15 2021 -0600
+
+    XASY: Make saving xasy the default and remove previous link functionality.
+
+commit 9161d8bfae033bf1245785327904735e89ba0e3b
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Wed Jul 28 23:30:52 2021 -0600
+
+    XASY: Add customizability to 3d rendering.
+
+commit feebc7304af30531b2749a5d15d2098531f14067
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 28 18:32:07 2021 -0600
+
+    V3D: Unify v3d and jsfile to reduce code redundancy.
+
+commit d5644b3dc7dd8605eabf38be8ab870e5422b86e2
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Wed Jul 28 17:24:05 2021 -0600
+
+    XASY: Add ability to Export to Asy straight from file menu.
+
+commit 28cf5abe4ca5cd95687d6bfd9f7246ea1d2af811
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 28 17:14:49 2021 -0600
+
+    V3D: Abstractize jsfile to abstract 3d out file.
+
+commit a8eb62ffff5002f40220c88522865746a005baed
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Wed Jul 28 15:48:33 2021 -0600
+
+    XASY: Add ability to export to Asymptote file.
+
+commit 8ccc7c9139c022e412258cd4882c777ad3b94cbf
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Wed Jul 28 15:07:42 2021 -0600
+
+    XASY: Save pen data (color/linewidth) into xasy file.
+
+commit 4903f5cd10db64a3cf535f766f44fc43e539c599
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Wed Jul 28 15:06:47 2021 -0600
+
+    XASY: Fix labels not being added with color.
+
+commit c4c749e854829467bcf0791d0cb9b0844f0acc19
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 28 14:53:44 2021 -0600
+
+    V3D: Fix bezier triangle render function.
+
+commit d907057302a43768268b51a70c493cadb1680b37
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 28 14:47:30 2021 -0600
+
+    V3D: Allow baking options in bezier triangles.
+
+commit 1cea79b09f410a04a6643e3f7ef846134c15ee01
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 28 14:43:02 2021 -0600
+
+    V3D: Make BezierTriangle function standalone.
+
+commit 21ceb4e9c9bc1aef1318af9dad5b68d56e90f910
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 28 14:11:28 2021 -0600
+
+    V3D: Enable baking patches option.
+
+commit 20eb389ef5bdb6fde4a4ce57b88fe423d6996b42
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 28 14:11:15 2021 -0600
+
+    V3D: Enable rendering of raw vertexBuffer.
+
+commit 478e300281b1348add88364ceee0d89c103e2258
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 28 13:58:30 2021 -0600
+
+    V3D: Encapsulate existing information on render to a parameter struct.
+
+commit 45910d98e58b274fb213f0208477c93e66fc5a1a
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 28 00:00:28 2021 -0600
+
+    V3D: Simplify V3D specs.
+
+commit 399bbb1bc618ccc05a3f7ecf33f574b21cf74c90
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Wed Jul 28 13:38:34 2021 -0600
+
+    XASY: Save xasyText to xasy file without going through asy script.
+
+commit b4041c7da61e56c27a6f1bad48f9e1174ef27fb4
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jul 28 01:03:25 2021 -0600
+
+    Add override qualifiers.
+
+commit 694b4cd9770eb597a7c19696e7fe997119273f46
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jul 28 00:32:44 2021 -0600
+
+    Port to clang under MacOS.
+
+commit 0a79d4e6f6cbb4f206c7703a02985bccf0926b69
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jul 28 00:11:26 2021 -0600
+
+    V3D: Infer number of control points from element type.
+
+commit b4739fee01e50b97b34fc7df9032afb33a467534
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Jul 27 22:20:48 2021 -0600
+
+    V3D: Allow rendering target to an arbitrary vertexBuffer.
+
+commit 12cfa6ed19f7be372faa9a132ff0b5c2d1f60a14
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Jul 27 18:05:08 2021 -0600
+
+    V3D: Dynamically add indices based on if they are distinct or not.
+
+commit 01fbf32a46bd1bd28178bb1f647a8243ed0931e3
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Jul 27 17:46:19 2021 -0600
+
+    V3D: Use operator<< for triple and prc::PRCColour.
+
+commit c4f171f513b5021c49453e8909d17e2e0039cd53
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Tue Jul 27 16:17:23 2021 -0600
+
+    XASY: Make add button naming conventions the same.
+
+commit dbac7243b20b8de74827a256146f6ae676c80982
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jul 27 09:29:29 2021 -0600
+
+    FILE: Fix bug #258: support compilation when COMPACT=0.
+
+commit dd0d7033a7c0ec45f3fc1fce12b89f7f0e4b6b43
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jul 27 00:48:06 2021 -0600
+
+    Patch lasy-mode to work with Emacs >= 23.
+
+commit c46633df7ff517701b488d60a55fb51755df6c87
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 26 19:50:29 2021 -0600
+
+    XDR: Add triangles to v3d file.
+
+commit 35ee832a48783d2378adb508ca0724b0058de7be
+Merge: 3a338ba8 04a5d074
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jul 26 17:32:37 2021 -0600
+
+    Merge branch 'v3d' of ssh://cascade.math.ualberta.ca/git/asymptote into v3d
+
+commit 3a338ba8a4b30c24d9033fa94b8a7eabebd7570e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jul 26 17:32:31 2021 -0600
+
+    Update v3dstd.md.
+
+commit 70e3a5e2e53a3a8d028b8807f8bc5d124ca3ba57
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Jul 26 17:16:10 2021 -0600
+
+    XASY: Update icon clicking statuses.
+
+commit 0c74479fa00167fa0b5da22e927eb505019eb3f4
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Jul 26 16:32:18 2021 -0600
+
+    XASY: Set translate mode to be default state.
+
+commit 04a5d074d6496a8eb9bbe4b772d5c27f8cdbfe87
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 26 16:15:26 2021 -0600
+
+    V3D: Add options for other primitives.
+
+commit 461d011a67fff47587e5ea4757aebc237cae2446
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 26 16:15:13 2021 -0600
+
+    V3D: Add oxstream values for rvalue.
+
+commit 5df8b4e8e430e5808c7da03b37737bc3127c0f32
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Jul 26 16:08:31 2021 -0600
+
+    XASY: Fix save prompt mid-edit.
+
+commit b64c1f1a95361a0dd0aeeb599418a7647ad3c0f3
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 26 14:50:32 2021 -0600
+
+    V3D: Support bezier triangles.
+
+commit cfc1559b82cf43958b56b566656a8b92f7ec2795
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 26 14:19:14 2021 -0600
+
+    MAKE: Add v3dfile to makefile.
+
+commit da012aee1fbfa2448fd9dec6a39d465ec7493011
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 26 14:19:06 2021 -0600
+
+    ASY: Set format as v3d in three.asy.
+
+commit e8d02dadc8beec57e6fdf6bc2c2929a0a3bd453e
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 26 14:18:53 2021 -0600
+
+    V3D: Add support for bezier patches to v3d.
+
+commit a42c801b4bd00e36741fdd9f2f64ff9c993c8112
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 26 14:17:36 2021 -0600
+
+    V3D: Add v3dfile class.
+
+commit 1fc32e3b49fad691b5c34c2654794aa1d8da3321
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 26 14:17:04 2021 -0600
+
+    XDR: Add vector<double> and array<double,n> xdr packing.
+
+commit 9ead0267da5fbc0b6a1fcad95c4921e1e326d65f
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jul 26 12:16:59 2021 -0600
+
+    XASY: Check if file does not exist when loading file from command line.
+
+commit d17303f0fd9e14dfbf2923ab580de1fac2b4adf0
+Merge: 51367354 17c8855b
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jul 26 12:12:32 2021 -0600
+
+    XASY: Merge branch 'Qt' into 'Qt'.
+
+commit 51367354ca25fd96fd39f572ae246e47fc345181
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jul 26 12:10:11 2021 -0600
+
+    XASY: Opening files from command line now the same as in-app file loading.
+
+commit 6f73ced1b1db27e4880b5aad95682a47325337c6
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jul 26 11:51:55 2021 -0600
+
+    XASY: Change save to open dialog for default .xasy save.
+
+commit 17c8855b0acc7b736700ac4f7964486a7106781a
+Merge: 2a9d492d 9e6ef1e0
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Jul 26 11:21:12 2021 -0600
+
+    Merge branch 'Qt' of https://github.com/vectorgraphics/asymptote into Qt
+
+commit 2a9d492d0a1e43806b2c552c4d044edc417af129
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Jul 26 11:20:53 2021 -0600
+
+    XASY: Fix magnification error in bezier editor.
+
+commit 9e6ef1e0bbf41279563a02fc452c5f957cdc6906
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jul 26 11:19:31 2021 -0600
+
+    Force rendering of 3D objects.
+
+commit af78f0e9d7d2bd19c15854fcaa739ff887734f3a
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jul 26 11:05:46 2021 -0600
+
+    XASY: Remove debugging code & prevent .xasy load crash.
+
+commit adb4b1d1931ca4450a8833e98294ad78239b1ac4
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jul 26 00:41:27 2021 -0600
+
+    XASY: Handle undo from accepted edits in Edit Mode (i.e. controls/nodes).
+
+commit 11af899bc8fd2396c5a511201149bf98371b6f72
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Sat Jul 24 23:51:31 2021 -0600
+
+    XASY: Re-add code in 32cdfc22, deleted accidently in 14dfff01.
+
+commit 5415ca365f5c4bfee018cfa492d89cbfcab833ee
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Sat Jul 24 23:36:34 2021 -0600
+
+    XASY: Fix exporting recently made xasy objects to both .asy and .xasy.
+
+commit e6541aa352cb6b65a82057b24ad08158bd7804fc
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Sat Jul 24 19:56:34 2021 -0600
+
+    XASY: Create handler for loading legacy .xasy files.
+
+commit 7ff8049248cecd24b1c24139b72abbb8512d3dd5
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Sat Jul 24 19:38:42 2021 -0600
+
+    XASY: Add linked .asy file on title when editing .xasy file.
+
+commit 52cd9e7c2499fb6c8a6e9a57417a73b73ef31687
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Sat Jul 24 19:09:30 2021 -0600
+
+    XASY: Delete duplicate objects if user saved new objects to both .asy and .xasy.
+
+commit c854dd2c6bf04d0e3d48c65cc51831a6a281f5b5
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Sat Jul 24 01:54:05 2021 -0600
+
+    XASY: Load xasyScript object directly from linked .asy file while loading from .xasy.
+
+commit 8a650dc18fdd0989fc1f1879a2952d0dbeef2182
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jul 23 23:30:09 2021 -0600
+
+    Use pointer for WebGL cursor.
+
+commit e2640c1a08838801bed347122b0dfbd3c9b700c0
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jul 23 17:32:48 2021 -0600
+
+    Add preliminary v3d standard.
+
+commit 8c1d863d3c332b91490598c84d9bcc51ff9bb37d
+Merge: cfd3121e c84c526a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jul 23 16:42:22 2021 -0600
+
+    Merge branch 'master' into v3d.
+
+commit b8d4e3a39f9b5acc99e0219954139f5fe0b64a82
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Fri Jul 23 15:26:50 2021 -0600
+
+    XASY: Save .asy objects into linked .asy file when saving via .xasy.
+
+commit 14dfff01756801fe1f30f98f9bc6d7683f476b45
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Fri Jul 23 13:19:23 2021 -0600
+
+    XASY: Save corresponding .asy file on .xasy save + typo fixes.
+
+commit c84c526ae94c420b0555ef33c2c37fc2177f34d7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 22 11:35:52 2021 -0600
+
+    Update documentation.
+
+commit edfcc7bf88f0c1054d77a99bdaaf0d9acc8d1230
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Thu Jul 22 00:31:30 2021 -0600
+
+    XASY: Fix some drawing issues with the bezier editor.
+
+commit 5d5c43d366f876a28472c71838726294e4086efc
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Tue Jul 20 22:07:02 2021 -0600
+
+    XASY: Add more possible messages to the status bar.
+
+commit 32cdfc22ddbd02f779296db7db72f19713e51b8e
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Jul 19 11:13:13 2021 -0600
+
+    XASY: Fix closing bug.
+
+commit b8b046786d83fcc8f1728c2c084a4718ed8c13b4
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Jul 19 11:08:05 2021 -0600
+
+    XASY: Fix Bezier editor transform bug.
+
+commit ad84064b6721d033ea95ece4aa7702bd99ed5f29
+Merge: 86c8c792 f69347fe
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jul 19 10:42:16 2021 -0600
+
+    Merge branch 'Qt'.
+
+commit 86c8c7924bbf1c85d64f2b0939c2f70e5d614044
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jul 17 12:43:59 2021 -0600
+
+    Fix last revision.
+
+commit 92f6ecaed7ed3a90a3a83511fb26b153ce6f6bf6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jul 17 01:08:41 2021 -0600
+
+    TRANSPARENCY: Fix bug #253.
+
+commit 895c90e88d01515a784be33fc9c7923b1bfbe408
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Jul 17 00:25:13 2021 -0600
+
+    LSP: Properly stop DFS search if getExternalRef is empty (i.e. file does not exist).
+
+commit 34782cd981a38d9e7387f3c6a48c98e1905a8688
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Jul 17 00:17:37 2021 -0600
+
+    LSP: Skip BFS step if file fails to parse.
+
+commit 0a4009bde77cfaeb5003040f73a92f5e6d4c3013
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Jul 17 00:15:37 2021 -0600
+
+    LSP: Refine checks for virtual files: settings and gsl.
+
+commit b16efc20fdb0d22eb51bd2c250a0f924e1772138
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jul 16 20:23:24 2021 -0600
+
+    Fix segmentation fault.
+
+commit 9893e3d6a11d3c1c5169da4fd66d074e54ebf0e5
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Jul 15 23:23:51 2021 -0600
+
+    LSP: Exclude settings from search traversal.
+
+commit a939cea6be4b5e31ec0298b8d43a0ce26058a24e
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 15 18:08:42 2021 -0600
+
+    Distinguish between std::string and mem::string.
+
+commit fa5598cf9efccf17c9a8e2da31ee96d7a1b753d6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jul 15 00:45:42 2021 -0600
+
+    Work around null pointers.
+
+commit f69347fe1a84d77c7c024e6e453066140c224152
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Wed Jul 14 23:01:15 2021 -0600
+
+    XASY: Implement 'New File' functionality.
+
+commit ec6fcb25edeba2b88d19d91b05c4eaedbb99a5a5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jul 13 22:26:22 2021 -0600
+
+    Make lspport and lsphost environment settings.
+
+commit 4dc77c0eed54202ccafdbea6db7a851463e900d4
+Merge: 224a60e7 9cae116c
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Tue Jul 13 15:05:43 2021 -0600
+
+    Merge branch 'Qt' of https://github.com/vectorgraphics/asymptote into Qt
+
+commit 224a60e7195965740ac3b4e647192a8780c0ac80
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Tue Jul 13 15:05:36 2021 -0600
+
+    XASY: Remove window1.ui debugging code.
+
+commit 9cae116c1af47da0d237693e541fe20b347f7cb9
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Tue Jul 13 15:02:34 2021 -0600
+
+    XASY: Restores fixes with bounding box.
+
+commit 33fc5d9246c23ec1dab506fe302cbecf83f90831
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Tue Jul 13 12:35:00 2021 -0600
+
+    XASY: Fix tool tip name.
+
+commit 158b39a6a3f38d0f04a71a840bcc951940504176
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Tue Jul 13 00:15:29 2021 -0600
+
+    XASY: Fix crash on clearing recently opened menu.
+
+commit 63be9dc26f51af40d4d9430a29880cc4ce2e9777
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 12 20:14:19 2021 -0600
+
+    LSP: Use unique_ptr instead of manual new/delete initialization of remote end point.
+
+commit 5dc62f6c3c445077ff5782c9c3d53511b3fba90e
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jul 12 18:12:26 2021 -0600
+
+    XASY: Remove debugging code for .xasy binaries.
+
+commit c51dc292f0495aefefc6eff147aadff2204f5094
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jul 12 18:01:29 2021 -0600
+
+    XASY: Include .xasy binary export into main save/load flow.
+
+commit bacaf250eadf77a64ad6e4c05cd7a772d5a86868
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Jul 12 16:48:17 2021 -0600
+
+    XASY: Fix translation bounding box issue.
+
+commit 884f7ccf9e670e848ef7d5a8cdac44641677238b
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 12 14:35:02 2021 -0600
+
+    CXX: Set all errors to const& and exceptions from std::exception.
+
+commit bfb52602761c2fd0abaf4ac9da54e784828cd765
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jul 12 14:31:43 2021 -0600
+
+    LSP: Split Asymptote LSP Server into separate stdio/tcp components.
+
+commit 5a8403f3e22a568fc0e90c77134a0a36f93f18e5
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jul 12 14:17:03 2021 -0600
+
+    XASY: Include transformations into .xasy binary export/import.
+
+commit 15f814e7a6c8d897e10bec86a9dd15937c6abf2e
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jul 12 13:58:48 2021 -0600
+
+    XASY: Reverse previous bounding box calculation change.
+
+commit 4d38b8ecc211b7ad73910b91d1333aa6a2263a00
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon Jul 12 09:48:52 2021 -0600
+
+    Update year.
+
+commit ed73fd37a91dd6827a4bf1e9be2bde37f666eaa8
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jul 10 23:15:33 2021 -0600
+
+    Remove unused code.
+
+commit ad6f30f006b1bb277ec7d241c1696073c80a4d34
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Jul 10 15:26:04 2021 -0600
+
+    BUILD: Change C++ standard to -std=c++17.
+
+commit e3fc67832f9e3336234de399f8402d16d6ec2270
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Sat Jul 10 15:24:47 2021 -0600
+
+    LSP: Make mem::string explicit in dec.h.
+
+commit aa1ff6b608b06642d1103a1f0474c1a7992caa8f
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Fri Jul 9 13:04:24 2021 -0600
+
+    XASY: Include saving xasyScript and xasyTest while exporting to *.xasy binary.
+
+commit 9dfeff919260de7bc32acbd898abf944c7009c7c
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Fri Jul 9 13:01:13 2021 -0600
+
+    XASY: Break xf.saveFile function into creating and writing the asy string.
+
+commit b5da1baeb9fb335d28a802acc2042cb93aa8e612
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Jul 8 16:37:26 2021 -0600
+
+    LSP: Search through struct declarations for functions.
+
+commit 4f85dfc3d70a0287dd93141dd0996fd1275e0a29
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Jul 8 15:50:43 2021 -0600
+
+    LSP: Search unravel struct values alongside filenames.
+
+commit 7d158258b3ac1e6adc07aa2890d776d361af0854
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu Jul 8 15:44:26 2021 -0600
+
+    LSP: Check if unravel values is a fileId.
+
+commit 41f9ca54b1cb64ff597fff41f6df08c0662e9c9f
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Wed Jul 7 20:47:04 2021 -0600
+
+    Fix bounding box pen glitch and remove unused code.
+
+commit 74ecf40126466d16c20a26afeab1e84deb321757
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Wed Jul 7 19:46:07 2021 -0600
+
+    XASY: Add testing functions for export into .xasy binary.
+
+commit 546a841ba755f7696972438016f4b82251d98513
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Wed Jul 7 19:41:57 2021 -0600
+
+    XASY: Fix typo and makePenCosmetic issues.
+
+commit 7f08ed403043840051fd78a1d93c2e02e6cad3d6
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Wed Jul 7 19:39:41 2021 -0600
+
+    XASY: Set-up framework for export to  .xasy binary.
+
+commit 8a06b5701099e1941d8ea61acfcb27f039619f6a
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 7 15:46:50 2021 -0600
+
+    LSP: Search from access declarations for functions.
+
+commit 2fbdcbee88202969b31f2c52a4cf344d326c30e7
+Merge: cb0f82f3 20e1d214
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 7 14:36:20 2021 -0600
+
+    Merge branch 'lsp' of github.com:vectorgraphics/asymptote into lsp
+
+commit cb0f82f3bc1d60d3217c1ad744b9dd551cc41ee1
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 7 14:35:07 2021 -0600
+
+    LSP: Append the directory of the file to Asymptote's search path.
+
+commit 5ff8870351dda4586c6398b1245b10c78674c7b6
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 7 14:34:19 2021 -0600
+
+    LSP: Search "from" access declarations for variables.
+
+commit a1038310513b1b4c1025d8e98b30da0d68eeba27
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 7 14:29:05 2021 -0600
+
+    LSP: Enable recording of from declarations access.
+
+commit 9460297463f97d30aeba20d0669a24b74713538a
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jul 7 14:28:32 2021 -0600
+
+    LSP: Add general processing list function.
+
+commit be32229b074117fc2c44d7023f1162fbff21d78c
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Tue Jul 6 17:29:55 2021 -0600
+
+    XASY: Replace undo/redo icons.
+
+commit ce507966cfd81f01e62fd6a066ae0a307a46e31e
+Merge: 3726940a 2fe124e7
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Tue Jul 6 13:38:31 2021 -0600
+
+    XASY: Merge bounding box change with last commit.
+
+commit 2fe124e733c9d3e9accdf290d2463dbece1975ce
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Jul 5 10:46:38 2021 -0600
+
+    Fix bounding box branching.
+
+commit 20e1d214eb06570fed06aa4b26264a64a50362d8
+Author: Supakorn "Jamie" Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jul 2 16:37:16 2021 -0600
+
+    LSP: Add symbolmaps to Makefile temporarily.
+
+commit 9a94a6e4978fa677c5344bdb7c828b523a1eb0bd
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jul 2 15:35:10 2021 -0600
+
+    LSP: Enable symbol context search for access declarations.
+
+commit d43f8971b3c9de2bb8a67e33b686dc711910cc29
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jul 2 14:35:49 2021 -0600
+
+    REPO: Update vscode settings to disable js format and python language server.
+
+commit a6a88e866411b88ec8038fc28f5173824c7f3a67
+Merge: e38a3c3f 84451cf2
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jul 2 12:51:24 2021 -0600
+
+    Merge pull request #255 from Honghe/patch-1
+    
+    Update asymptote.texi.
+
+commit 84451cf2def1d149e6c4b26046263983ac58fd41
+Author: Honghe <leopardsaga at gmail.com>
+Date:   Sat Jul 3 00:00:31 2021 +0800
+
+    Update asymptote.texi
+    
+    `GSView 6.0` is  end of life.
+    `Sumatra PDF` can auto reload when the `.eps` is changed, and supports latest Ghostcript 9.54+.
+    https://forum.sumatrapdfreader.org/t/ghostscript-not-working-error-loading-on-ps-files/3826
+    https://github.com/sumatrapdfreader/sumatrapdf/commit/5a295db98381f925aa81d13988ffadf74953b8de
+
+commit 2a41b3468a2aeb18575b6cf5e54e1460eac94b72
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jun 30 17:17:15 2021 -0600
+
+    LSP: Centralize the logging process for LSP.
+
+commit 71bfb9ae3c11d31cea544632d7d9439de1cfba9f
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jun 30 16:40:51 2021 -0600
+
+    LSP: Remove filename from update file contents table.
+
+commit bfdf27e8c3ec27ac20bf7e317fa683e1a00e0c99
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jun 30 16:40:14 2021 -0600
+
+    LSP: Start in IO mode without tcp.
+
+commit 1a5d0f0e5c9ac0a5c484a18e781252b3dd3a9308
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jun 30 16:39:58 2021 -0600
+
+    LSP: Add StartIO mode for production.
+
+commit 7641b7ff4c18289d464d09b44414600c6dc88212
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jun 30 16:38:57 2021 -0600
+
+    LSP: Fix the initialization of NullResponse in shutdown request.
+
+commit ee5284574753a06d309d39a685db9c740d7a87f8
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jun 30 16:24:55 2021 -0600
+
+    LSP: Log level based on asymptote verbosity.
+
+commit 7131a2a5ef504c5178b875911dfff62f5ed03ab2
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed Jun 30 16:24:20 2021 -0600
+
+    LSP: Add onClose and onExit notification.
+
+commit 702a2344c7354fbc2dd79abea747d9f8236db9bd
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Jun 29 16:01:19 2021 -0600
+
+    LSP: Enable gc thread registration.
+
+commit 593e6337348fcca451a16ee64a906b2c80a9b9f1
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Jun 29 16:01:03 2021 -0600
+
+    LSP: Add LSP port and host option for tcp.
+
+commit ec04bce3d635af4efd6acc02ea5339104907ad99
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue Jun 29 15:52:19 2021 -0600
+
+    LSP: Fetch multiple definitions for functions.
+
+commit 3726940ad274b9c6fd96cbb98e5b7e274148ad84
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Tue Jun 29 13:13:28 2021 -0600
+
+    XASY: Fix typo on self.ui.txtLineWidth.
+
+commit 0fa72a41d4cb04feca7f7be71c2598b11692542f
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Tue Jun 29 13:12:43 2021 -0600
+
+    XASY: Make bounding box calculation factor in pen line width.
+
+commit 7d193e5188cf12035b4d50090e3534abb2e42e69
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jun 28 18:49:22 2021 -0600
+
+    LSP: Add the file's directory to the search path during symbol map construction.
+
+commit 3e161069eeb6c500f9e8cc47b239a9f6f691ed7b
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jun 28 18:48:53 2021 -0600
+
+    LSP: Update file contents on change if applicable.
+
+commit 06f7086af1f839e36b69d61c0cfd2329554cbb4a
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jun 28 18:42:15 2021 -0600
+
+    LSP: Enable full search of access and struct symbols.
+
+commit df92e1dfd81f33805ce3b59b71b800381dacb47d
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jun 28 18:38:31 2021 -0600
+
+    LSP: Add unravel ids to SymbolMaps.
+
+commit 249ce56ae2f13aee520ef22d21a640ce6f42c19b
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jun 28 18:36:29 2021 -0600
+
+    LSP: Move external reference data to a separate struct.
+
+commit 97513e53db27f902e9a79b6464751eff71b1c567
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jun 28 13:45:50 2021 -0600
+
+    PEN: Add rgba function to plain_pens.asy.
+
+commit 7f9811bae2afd80dd7efbe92e101145f5b39617a
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 18 22:47:55 2021 -0600
+
+    PARSER: Move icode and istring to header for accessibility.
+
+commit 0490c9d64ba49fe688cc9521947249c0d7f31e4d
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 18 22:26:20 2021 -0600
+
+    LSP: Handle crude document color request.
+
+commit 55b8c513140ca0475f786869bb8d516a036b4faf
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 18 22:25:35 2021 -0600
+
+    LSP: Extract out the SymContextPtr* fetch process.
+
+commit f249b2d8ea8275aba93050b3c82f48629f9b1420
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 18 22:22:27 2021 -0600
+
+    LSP: Clean up SymContextInfo.
+
+commit e38a3c3f7318691fadfde0cb3864687f48428aa6
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Jun 26 16:18:56 2021 -0600
+
+    Upgrade from ocgx to ocgx2.
+
+commit 8da12dc8ad0f4e56f0c0bd8f7300e9d3d4770572
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jun 25 14:23:59 2021 -0600
+
+    Upgrade from ocg to ocgx.
+
+commit 40022b3d35bd8321be2a86c8fc53bacf69eed787
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jun 21 22:52:41 2021 -0600
+
+    XASY: Change title when file is modified.
+
+commit 618d74c8f63bf8d419b40b400be9e4fc3a906d2e
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jun 21 22:28:36 2021 -0600
+
+    XASY: Update TODO comments.
+
+commit a0b6f422ee0e37705459246ccf04f3f73d538562
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jun 21 22:17:36 2021 -0600
+
+    XASY: Place xasyrecents.txt in ~/.asy folder along with other config files.
+
+commit ea62ca6f1e96938200f55125865bd30855cd0149
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jun 21 22:16:46 2021 -0600
+
+    XASY: Fix recently opened QActions from menu not linking to correct file.
+
+commit 3cad6938e2d4f8cf03b6e23dfb682e3a433d731d
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 18 22:17:55 2021 -0600
+
+    LSP: Add retrieval of color information from exp.
+
+commit f9fc032ab1df26434649f6ee0000fbc68750b184
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 18 22:14:09 2021 -0600
+
+    LSP: Fix decid createSymMap with type.
+
+commit 3ad2a131e12979daa5cea59bbd012ac8fa70b49f
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 18 22:13:43 2021 -0600
+
+    LIB: Update LspCpp library to use boost::optional.
+
+commit afa8dfd2c8d87b27ab8e8a678fff46fea0a6dd44
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 17 19:51:32 2021 -0600
+
+    XASY: Delete extraneous code on freehand drawing handler.
+
+commit faf82d60feca29fdcc5a8ab5d7aec71d09071ead
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 17 19:28:24 2021 -0600
+
+    XASY: Add placeholder function for freehand draw tool.
+
+commit 95e4a77a87a8deb4d9168b65fa36e59c4e06fe78
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 17 18:31:45 2021 -0600
+
+    XASY: Connect freehand drawing button on UI to to-be-implemented action handler.
+
+commit 75799ae0a1e079429021d7fc8cf402f747155bd2
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 17 18:23:37 2021 -0600
+
+    XASY: Change icons.qrc to include brush svg.
+
+commit 988439ac7dc406dcd0507b488e741f4b6b474de0
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 17 17:44:14 2021 -0600
+
+    XASY: GUI elements for freehand drawing.
+
+commit 3c7c07b2c47919c22a93774f8728db9514952e92
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 17 11:27:54 2021 -0600
+
+    XASY: Add TODO comment and recent.txt file in config directory.
+
+commit 26cc499ee03aa3200531282a67c41d94fffd0394
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 17 11:13:22 2021 -0600
+
+    XASY: Open recent class to handle paths
+
+commit 0f41b3af1bea5ad1c88c740502ee52b369e922e8
+Merge: 8dfb98bc 0d799204
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 17 11:11:11 2021 -0600
+
+    Merge branch 'Qt' of https://github.com/vectorgraphics/asymptote into Qt
+
+commit 8dfb98bc5bb4f5e9acb1a93d358cbe3592506a91
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 17 11:11:03 2021 -0600
+
+    XASY: UI elements for menu of recently opened files.
+
+commit 0d7992042bf973680d8c5e3b876fba156c885821
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Jun 14 00:00:46 2021 -0600
+
+    Fix bounding box sizing issue.
+
+commit f0b6d339c51a7d02176400fe2de468b58f4752a0
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Sat Jun 12 01:17:45 2021 -0600
+
+    Fix bounding box drawing under scaling.
+
+commit 99cadc21e19a82eddbcd54b84b19cf0aa14c70d6
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Sat Jun 12 00:49:01 2021 -0600
+
+    Fix line thickness of objects after magnification.
+
+commit 48af59ba9e87c530c260886ceb0ec168ed9ea87c
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 11 16:10:30 2021 -0600
+
+    LSP: Add createSymMap for range-based for loops.
+
+commit 01aefbdb8a911bad63c5d67b05db61990b82d9a9
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 11 16:10:13 2021 -0600
+
+    CXX: Format code files and add attributes.
+
+commit 8812cf49fe43371bac49d6480b838e595e87672a
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 11 16:09:08 2021 -0600
+
+    LSP: Add signature searching of struct contexts.
+
+commit 33db4bbc39ef70f55ff14564dc20ac5407c3d20c
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Fri Jun 11 02:32:37 2021 -0600
+
+    Fix some scaling bugs.
+
+commit 3b7bef84dec6b9b09e294f2d018abae9f6ee4daa
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon Jun 7 23:39:10 2021 -0600
+
+    LSP: Allow for multiple functions loading in hover request.
+
+commit f1f36b434958c125be2c110c81c52ae3266df1b0
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jun 7 16:31:01 2021 -0600
+
+    XASY: Change MainWindow1.erase() to fix crashing after opening a file then undo.
+
+commit e8f7946db8ac78ef73a64ff2cfe50daffd6048e2
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jun 7 15:42:03 2021 -0600
+
+    XASY: Make undo/redo menu button available after script object delete.
+
+commit 190676f02243ba514a4dad351a5834921d6469a7
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jun 7 15:01:20 2021 -0600
+
+    XASY: Change softDelete key name, and ncrease readibility on UI of addPolyOpt menu.
+
+commit 9be0e9269b1dca5eb651bca81b45d46cff046081
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jun 7 13:01:42 2021 -0600
+
+    XASY: Fix undo/redo for deleted objects imported from .asy scripts.
+
+commit 170743bcf5a9b00c8173059acdd96227676762e9
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Mon Jun 7 12:06:32 2021 -0600
+
+    XASY: Fix untransformed deleted objects not saving
+
+commit 5f3e93cd8118118154e97c8d3743998b668bfee8
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon Jun 7 09:01:27 2021 -0600
+
+    Fix line thickness issue with scaling.
+
+commit 21bafac812f6a9d0a28c64666db0572ac6e06ec4
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Fri Jun 4 21:29:55 2021 -0600
+
+    Fix exit error on startup.
+
+commit 138dc26012377f36b9b8a5a4457e5095a2ee70ae
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Fri Jun 4 21:24:24 2021 -0600
+
+    Add cancel feature to exit box.
+
+commit 74f24be64e1a18b8aa30424400eef5db718186c8
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 4 15:15:42 2021 -0600
+
+    LPS: Enable searching in external file locations.
+
+commit a517a4349086d6765bf5b0bb2b7bf383ee01775b
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri Jun 4 15:14:43 2021 -0600
+
+    LSP: only recurse statements if value is not null.
+
+commit aa5f5aecac3e399dda3e39eecfa67b82bc814b0b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jun 3 22:13:51 2021 -0600
+
+    FILE: Fix bug #247.
+
+commit 638206d86745878a746548d9ecc2d5fb1945d725
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 3 21:18:06 2021 -0600
+
+    fixed: undo create object crashes if selected object is deleted
+
+commit 8e95228aff14dbd37821bca7b519a20d4bcc73f5
+Merge: 0442d6c4 c195c1fc
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jun 3 14:03:32 2021 -0600
+
+    Merge branch 'Qt'.
+
+commit c195c1fc4c5b0631aae84cc75b3b9bf27da677e5
+Merge: bbacc4f8 ded4ea86
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Jun 3 13:55:00 2021 -0600
+
+    Merge pull request #249 from vectorgraphics/Qt-macos-accessibility
+    
+    Qt macos accessibility
+
+commit ded4ea8607cf1478871d6c1b9b951773b8e177b3
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 3 13:19:57 2021 -0600
+
+    accidental change to QMenuBar height
+
+commit ea63eb31c5925a01ea3219bead12dc6725201ec6
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 3 13:10:37 2021 -0600
+
+    changed git ignore to include python virtual environment
+
+commit 0433358c31035f123a8c2d9a0e4f304197b3030f
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Thu Jun 3 13:08:38 2021 -0600
+
+    Added possibility of keyboard focus on main screen so textbox shortcuts don't override global ones
+
+commit bbacc4f870f38222dff57f6de82d053a813b1cea
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Thu Jun 3 12:28:04 2021 -0600
+
+    Fix issues with checking buttons.
+
+commit 0442d6c4230ad48cd793f661812a17a106bfb17d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Wed Jun 2 17:31:15 2021 -0600
+
+    Update example.
+
+commit 7a46888f213770564bfbcf38fe63dda320393e1c
+Author: RubberNoodles <ocheng at ualberta.ca>
+Date:   Wed Jun 2 13:25:42 2021 -0600
+
+    fixed btnAlignX/Y not showing on Mac due to insufficient container width
+
+commit 76702591d248278c20260206bd1d8f6bff27993a
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Jun 1 13:13:31 2021 -0600
+
+    Force all threads to return error code.
+
+commit 0caac12482845a6d450730a76c6fc658c3475505
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon May 31 10:09:39 2021 -0600
+
+    Fix Y icon font.
+
+commit 4c83ba7857355dca85fc8c2c6bbbb83f8d4e3cd7
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon May 31 10:09:39 2021 -0600
+
+    Fix Y icon font.
+
+commit 15d3f030d7ec999213a8aaa75b9de42487485a2a
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon May 31 09:20:51 2021 -0600
+
+    Fix saving prompts and add hotkeys.
+
+commit 2ae710ed1822dc925f09a4f27ea895b9f7df3bdb
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu May 27 15:36:42 2021 -0600
+
+    LSP: Simplify hover requests and enable signature lookup.
+
+commit b0524e3dd020c76d0a49cb2bdd3cfb6f28131d6c
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu May 27 15:35:22 2021 -0600
+
+    LSP: Add fromMarkedStr for asymptote labelling.
+
+commit 2de9f75df81a4506b8748a58b15f3a99916975b0
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu May 27 15:34:42 2021 -0600
+
+    LSP: Build tree on open/save.
+
+commit 4b9bebd7df6a74706c803ad2c3ed57f562a32627
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu May 27 15:34:06 2021 -0600
+
+    LSP: Allow for type-searching in LSP lookup.
+
+commit 8e390ad19a5aab015f1501f07793a49f90ad7c29
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu May 27 15:32:19 2021 -0600
+
+    LSP: Add FunctionInfo struct to LSP.
+
+commit b94942859d268e7fc12f6e846dfb586f1a7b51a9
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Thu May 27 15:27:46 2021 -0600
+
+    LSP: Support exp statements createSymMap.
+
+commit 97926071c5b5e698192dfcd30d0be92df904ff22
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu May 27 14:10:15 2021 -0600
+
+    Fix bitwise negation operator.
+
+commit d4a09ce89a8d3541ef2f26e844db68f504bef8fe
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed May 26 13:57:22 2021 -0600
+
+    LSP: Support goto definitions.
+
+commit 5000b66451ff5bb88316fe68bc826c79c2894c81
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Wed May 26 13:55:48 2021 -0600
+
+    LSP: Add createSymbolMaps for more statements.
+
+commit e312cdf36414011f635329fdece0c45c02033220
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Mon May 24 23:59:49 2021 -0600
+
+    TRANSPARENCY: Fixed bug #245.
+
+commit 512c2dfc64a44dfdbc574b689668f9406d74db02
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 24 16:13:26 2021 -0600
+
+    RUNFILE: Explicitly use camp namespace to avoid conflicts.
+
+commit 369e43e3f821952c52cea45d3857300e284e3418
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 24 16:12:57 2021 -0600
+
+    LSP: Add createSymbols for exp and stm for blocks and symbols.
+
+commit f1ae4e1b35cbae7089ee3b2bdbd1e609d3328393
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 24 16:11:50 2021 -0600
+
+    LSP: Remove lineUsage and use the vector instead.
+
+commit b8b7dc4a5b023b452a34839c0fccdbe7cce3aa43
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 24 16:10:54 2021 -0600
+
+    LSP: Contextualize symbolmaps to support block codes.
+
+commit d2e6b12a8faeadccdc056e76a036743e3cdaea0b
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 24 16:08:05 2021 -0600
+
+    LSP: Add lt comparsion for positions.
+
+commit 9dac66a12fc7178d88ed0ab7a63544924b9b4018
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 24 16:00:55 2021 -0600
+
+    LSP: Add explicit operator to std::string.
+
+commit 5c35e19aaf39d58f8209b5e4956de8c935c2f355
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Tue May 18 19:07:26 2021 -0600
+
+    LSP: Separete Symbolmaps into a cc file.
+
+commit 7376cb1111d319e1eabda96f46270dc6ea9e340c
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 17 17:04:23 2021 -0600
+
+    LSP: Enable Asymptote to start in LSP mode.
+
+commit f8014e0ecc8096bfb32d86c767070901b67146de
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 17 17:03:43 2021 -0600
+
+    MAKE: Add temporary new files to Makefile.
+    This is a temporary change, it is meant to be added
+    to a proper place later on.
+
+commit f219b8caae79fe131999badfa8435fb0f9995eee
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 17 17:02:57 2021 -0600
+
+    LSP: Add basic LSP server code to Asymptote.
+
+commit 930e13f9530f1b8db05f4296369f5bd0da543c74
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 17 17:02:21 2021 -0600
+
+    LSP: Add crude symmap creation function to absyn.
+
+commit 4fe425671a58432291dd5daa0a81996209ab2d5e
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 17 16:59:08 2021 -0600
+
+    LSP: Add crude symbols data table.
+
+commit d7327c68d886a8856aa981fd7fca1409b603752c
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 17 16:56:22 2021 -0600
+
+    CXX: Add smart pointers to common.h for future convinence.
+
+commit a7ef5ded5503256a7607fd42e8643d4894735e56
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Mon May 17 16:52:50 2021 -0600
+
+    GDB: Add .gdbinit to ignore Boehm and asy signals.
+
+commit 2c33f258c58ae7df32139690eee606081cba61ad
+Author: Supakorn Rassameemasmuang <rassamee at ualberta.ca>
+Date:   Fri May 14 21:32:48 2021 -0600
+
+    Move ifile/tree/core declarations to process.h.
+
+commit ffa71972faef1b242cc9141440a0c7210dfe630b
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon May 10 10:39:53 2021 -0600
+
+    fixed y-axis inversion bug in initialized and load-fail states
+
+commit c71330188e834f3f4e47452dfd26eb51ec688649
+Author: chaumont-arch <chaumont at ualberta.ca>
+Date:   Mon May 10 10:39:53 2021 -0600
+
+    fixed y-axis inversion bug in initialized and load-fail states
+
+commit e1eb7e2c3c22caa8052e70b38055ca45420eebe2
+Merge: 634e1b8f c71d3faf
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu May 6 22:52:55 2021 -0600
+
+    Merge pull request #243 from vectorgraphics/graphwithderiv.
+    
+    Add graphwithderiv function.
+
+commit 634e1b8f97e8572d8448053f7f64c24657f3dc64
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu May 6 15:39:40 2021 -0600
+
+    Fix bug #229: Duplicate KEY in xasy.
+
+commit 0ecf39dbc3509938c568a254cb3acda77b8ac37d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu May 6 14:15:49 2021 -0600
+
+    Calculate maxKey.
+
+commit cbb05a8e2a46c2c1ab9f081d9ef469da71dbd382
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu May 6 15:39:40 2021 -0600
+
+    Fix bug #229: Duplicate KEY in xasy.
+
+commit e9c003d4b50402be1009f906dc97f6b8ba89b1f3
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu May 6 14:15:49 2021 -0600
+
+    Calculate maxKey.
+
+commit fc8b0803744cb892d670455c9d86d56ad348ad04
+Merge: b4bf0803 bbb1ed00
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu May 6 09:44:31 2021 -0600
+
+    Merge branch 'master' into Qt.
+
+commit 986cd0a49e4bcdae31bf3b49af04978c5e7e505b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue May 4 23:29:52 2021 -0600
+
+    Begin support for language server protocol.
+
+commit bbb1ed004e0962870889e85cf37b3b5ce0ef961b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Mar 23 08:15:57 2021 -0600
+
+    Fix typo in documentation.
+
+commit 37295db17c2d7fc305a9c587ac474f4d9da40e0f
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Tue Mar 23 08:12:32 2021 -0600
+
+    Fix asyPath in Xasy label editor.
+
+commit c2e38436032772e7d4a9ab5b093e0bb9ab03e59d
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sat Mar 20 10:58:24 2021 -0600
+
+    Override Xasy settings upon every load.
+
+commit 764e47fe845a27167d5d7f24f69dc454d6da4b24
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Sun Mar 14 19:33:31 2021 -0600
+
+    Increment version to 2.71.
+
 commit cef479451a35b8a242d68e45666f97583270df0d
 Author: John Bowman <bowman at ualberta.ca>
 Date:   Sun Mar 14 18:29:38 2021 -0600
@@ -1397,6 +6101,12 @@
 
     Raise logo3 camera.
 
+commit b4bf080363fc22960634ce565b5418db28692bd3
+Author: Pedram Emami <emami1 at ualberta.ca>
+Date:   Fri May 8 18:14:45 2020 -0600
+
+    Fix typo.
+
 commit d9bbb71b151c1ff1ee920045607240ed80ead95f
 Author: John Bowman <bowman at ualberta.ca>
 Date:   Wed May 6 01:00:21 2020 -0600
@@ -1578,6 +6288,37 @@
 
     Detect failure of TeX pipe.
 
+commit 40dc7d7b71fa5d02c5558a12b99b13385e460a75
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Mar 5 18:49:30 2020 -0700
+
+    Update documentation.
+
+commit 4891f4653598b70f2a9e1f5836f7e7bc2d4187aa
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Mar 5 18:08:42 2020 -0700
+
+    Fix typos.
+
+commit 4f54a5bedca4fb42418e49960ea8d82a4023e043
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Mar 5 18:00:46 2020 -0700
+
+    Fix typos.
+
+commit ce34396977cd41e372180d1cedbd5206891ff314
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Mar 5 18:00:32 2020 -0700
+
+    Update documentation.
+
+commit 79ec5d5c2b5bd432709265d53bcbe51d0cafe1ce
+Merge: c161ffe7 f9bc3f2b
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Thu Mar 5 14:15:05 2020 -0700
+
+    Merge branch 'master' into Qt.
+
 commit f9bc3f2bbdbb382a1cbf15b7b977608900b2d804
 Author: John Bowman <bowman at ualberta.ca>
 Date:   Wed Mar 4 22:44:32 2020 -0700
@@ -1931,6 +6672,12 @@
     
     Sync
 
+commit c161ffe7b7e4b84a0e0767fd3e881587660cc7a1
+Author: Pedram Emami <emami1 at ualberta.ca>
+Date:   Thu Feb 6 14:05:54 2020 -0700
+
+    Pulish the code and include incode documentation
+
 commit 9beb5b6c72ce47c8fad8c33f14b78015c9baa40f
 Author: John Bowman <bowman at ualberta.ca>
 Date:   Wed Feb 5 22:26:02 2020 -0700
@@ -2011,6 +6758,12 @@
 
     Fix degenerate surface normals.
 
+commit 7300f0c37ca036f7b47ea2197026a58f3b1a03d4
+Author: Pedram Emami <emami1 at ualberta.ca>
+Date:   Mon Jan 27 21:17:21 2020 -0700
+
+    Apply patch and modify getObjectCode() in xasy2asy.py
+
 commit fdf8aeae3c1a11fb04f70674ca060a814fe2b12c
 Author: John Bowman <bowman at ualberta.ca>
 Date:   Wed Jan 22 09:24:35 2020 -0700
@@ -6942,6 +11695,12 @@
 
     Fix segmentation fault.
 
+commit cfd3121e4a997376e8cebf3ee6c53cac9ed689c5
+Author: John Bowman <bowman at ualberta.ca>
+Date:   Fri Jul 13 17:06:40 2018 -0600
+
+    Add preliminary test of v3d format.
+
 commit e1f68286465d275a5677860950e266288ade44a1
 Author: John Bowman <bowman at ualberta.ca>
 Date:   Thu Jul 12 15:13:59 2018 -0600
@@ -10066,6 +14825,12 @@
 
     Add deepyellow synonym for olive color.
 
+commit c71d3faf1bd0370b6ad3e464e2c0dbed934d15a6
+Author: Charles Staats III <charles.staats.iii at gmail.com>
+Date:   Mon Dec 26 17:15:00 2016 -0500
+
+    Add graphwithderiv function
+
 commit 1cc7f83d73cbe2ece3e7e4f0e7640b2ec5cbe684
 Author: John Bowman <bowman at ualberta.ca>
 Date:   Sat Nov 26 10:56:46 2016 -0700

Added: trunk/Build/source/utils/asymptote/EXRFiles.cc
===================================================================
--- trunk/Build/source/utils/asymptote/EXRFiles.cc	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/EXRFiles.cc	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,49 @@
+//
+// Created by jamie on 8/23/21.
+//
+
+#include "EXRFiles.h"
+#include "locate.h"
+
+namespace camp
+{
+using std::cout;
+using std::cerr;
+using std::endl;
+
+IEXRFile::IEXRFile(const string& File)
+{
+  char const* err;
+  int ret;
+  string file=settings::locateFile(File);
+  string image=settings::getSetting<string>("image");
+  if(file.empty()) {
+    cerr << "EXR file not found: " << File << endl
+         << "Precomputed image directories like ibl/" << image << " can be "
+         << "downloaded into the Asymptote search path like this:"
+         << endl << endl
+         << "wget -q --show-progress -nH -np -r --cut-dirs=1 "
+         << settings::getSetting<string>("imageURL") << "/refl.exr" << endl
+         << "wget -q --show-progress -nH -np -r --cut-dirs=1 "
+         << settings::getSetting<string>("imageURL") << "/" << image
+         << endl;
+    exit(-1);
+  }
+  const char *filename=file.c_str();
+  if((ret=LoadEXR(&data,&width,&height,filename,&err)) != TINYEXR_SUCCESS)
+    {
+      cerr << "TinyEXR Error: " << err << " " << filename << endl;
+      FreeEXRErrorMessage(err);
+      exit(-1);
+    }
+}
+
+IEXRFile::~IEXRFile()
+{
+  if(data) {
+    free(data);
+    data=nullptr;
+  }
+}
+
+}


Property changes on: trunk/Build/source/utils/asymptote/EXRFiles.cc
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/EXRFiles.h
===================================================================
--- trunk/Build/source/utils/asymptote/EXRFiles.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/EXRFiles.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,32 @@
+//
+// Created by jamie on 8/23/21.
+//
+
+#pragma once
+#include "common.h"
+#include "cudareflect/tinyexr/tinyexr.h"
+
+namespace camp
+{
+class IEXRFile
+{
+public:
+  IEXRFile(string const& file);
+  ~IEXRFile();
+
+  [[nodiscard]]
+  float const* getData() const {
+    return data;
+  }
+
+  [[nodiscard]]
+  std::pair<int,int> size() const {
+    return std::make_pair(width, height);
+  }
+
+private:
+  float* data=nullptr;
+  int width=0, height=0;
+};
+
+} // namespace gl;


Property changes on: trunk/Build/source/utils/asymptote/EXRFiles.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/GLTextures.cc
===================================================================
--- trunk/Build/source/utils/asymptote/GLTextures.cc	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/GLTextures.cc	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,48 @@
+//
+// Created by jamie on 8/23/21.
+//
+
+#include "GLTextures.h"
+
+#ifdef HAVE_GL
+
+namespace gl
+{
+
+#ifdef __CYGWIN__
+#define glDeleteTextures glDeleteTexturesEXT  // Missing in 32-bit CYGWIN
+#endif
+
+AGLTexture::~AGLTexture()
+{
+  if (textureId != 0)
+    {
+      glDeleteTextures(1, &textureId);
+    }
+}
+
+AGLTexture& AGLTexture::operator=(AGLTexture&& glTex) noexcept
+{
+  textureId = glTex.textureId;
+  textureNumber = glTex.textureNumber;
+  glTex.textureId = 0;
+  glTex.textureNumber = -1;
+
+  return *this;
+}
+
+AGLTexture::AGLTexture(AGLTexture&& glTex) noexcept:
+  textureId(glTex.textureId), textureNumber(glTex.textureNumber)
+{
+}
+
+AGLTexture::AGLTexture(int textureNumber) : textureNumber(textureNumber) {}
+
+void AGLTexture::setActive() const
+{
+  glActiveTexture(GL_TEXTURE0+textureNumber);
+}
+
+} // namespace gl
+
+#endif


Property changes on: trunk/Build/source/utils/asymptote/GLTextures.cc
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/GLTextures.h
===================================================================
--- trunk/Build/source/utils/asymptote/GLTextures.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/GLTextures.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,127 @@
+//
+// Created by jamie on 8/23/21.
+//
+
+#pragma once
+#include "common.h"
+#include "GL/glew.h"
+
+namespace gl
+{
+struct GLTexturesFmt
+{
+  GLint minFilter=GL_LINEAR_MIPMAP_LINEAR;
+  GLint magFilter=GL_LINEAR;
+  GLint wrapS=GL_REPEAT;
+  GLint wrapT=GL_REPEAT;
+  GLint wrapR=GL_REPEAT;
+
+  GLuint format=GL_RGBA;
+  GLuint internalFmt=GL_RGBA;
+};
+
+class AGLTexture
+{
+protected:
+  AGLTexture() = default;
+  explicit AGLTexture(int textureNumber);
+
+  AGLTexture(AGLTexture const&) = delete;
+  AGLTexture& operator=(AGLTexture const&) = delete;
+
+  AGLTexture(AGLTexture&& glTex) noexcept;
+  AGLTexture& operator=(AGLTexture&& glTex) noexcept;
+
+public:
+  virtual ~AGLTexture();
+  void setActive() const;
+  virtual void setUniform(GLint uniformNumber) const = 0;
+
+protected:
+  GLuint textureId=0;
+  int textureNumber=-1;
+};
+
+template<typename T=float, GLuint GLDataType=GL_FLOAT>
+class GLTexture2 : public AGLTexture
+{
+public:
+  GLTexture2() = default;
+  GLTexture2(GLTexture2 const& glTex)=delete;
+  GLTexture2& operator= (GLTexture2 const& glTex)=delete;
+
+  GLTexture2(GLTexture2&& glTex) noexcept: AGLTexture(std::move(glTex))
+  {
+  }
+
+  GLTexture2& operator=(GLTexture2&& glTex) noexcept
+  {
+    AGLTexture::operator=(std::move(glTex));
+    return *this;
+  }
+
+  GLTexture2(T const* data, std::pair<int, int> size,
+             int textureNumber, GLTexturesFmt const& fmt) : AGLTexture(textureNumber)
+  {
+    glGenTextures(1, &textureId);
+
+    glActiveTexture(GL_TEXTURE0+textureNumber);
+    glBindTexture(GL_TEXTURE_2D, textureId);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, fmt.minFilter);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, fmt.magFilter);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, fmt.wrapS);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, fmt.wrapT);
+    glTexImage2D(GL_TEXTURE_2D, 0, fmt.internalFmt, size.first, size.second, 0,
+                 fmt.format, GLDataType, data);
+    glGenerateMipmap(GL_TEXTURE_2D);
+    glActiveTexture(0);
+  }
+
+  void setUniform(GLint uniformNumber) const override
+  {
+    glActiveTexture(GL_TEXTURE0+textureNumber);
+    glBindTexture(GL_TEXTURE_2D, textureId);
+    glUniform1i(uniformNumber, textureNumber);
+    glActiveTexture(0);
+  }
+};
+
+template<typename T=float, GLuint GLDataType=GL_FLOAT>
+class GLTexture3 : public AGLTexture
+{
+public:
+  GLTexture3() = default;
+  GLTexture3(T const* data, std::tuple<int, int, int> size,
+             int textureNumber, GLTexturesFmt const& fmt) : AGLTexture(textureNumber)
+  {
+    int width=std::get<0>(size);
+    int height=std::get<1>(size);
+    int depth=std::get<2>(size);
+    glEnable(GL_TEXTURE_3D);
+
+    glGenTextures(1, &textureId);
+    glActiveTexture(GL_TEXTURE0+textureNumber);
+    glBindTexture(GL_TEXTURE_3D, textureId);
+    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, fmt.wrapS);
+    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, fmt.wrapT);
+    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, fmt.wrapR);
+    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
+    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, fmt.minFilter);
+    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, fmt.magFilter);
+
+    glTexImage3D(GL_TEXTURE_3D, 0, fmt.internalFmt, width, height, depth, 0, fmt.format,
+                 GLDataType, data);
+    glGenerateMipmap(GL_TEXTURE_3D);
+    glActiveTexture(0);
+  }
+
+  void setUniform(GLint uniformNumber) const override
+  {
+    glActiveTexture(GL_TEXTURE0+textureNumber);
+    glBindTexture(GL_TEXTURE_3D, textureId);
+    glUniform1i(uniformNumber, textureNumber);
+    glActiveTexture(0);
+  }
+};
+
+} // namespace gl


Property changes on: trunk/Build/source/utils/asymptote/GLTextures.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/utils/asymptote/GUI/CustMatTransform.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/CustMatTransform.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/CustMatTransform.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,14 +1,14 @@
 #!/usr/bin/env python3
 
-import PyQt5.QtWidgets as Qw
-import PyQt5.QtGui as Qg
-import PyQt5.QtCore as Qc
-import numpy as np
-import xasy2asy as x2a
+import PyQt5.QtWidgets as QtWidgets
+import PyQt5.QtGui as QtGui
+import PyQt5.QtCore as QtCore
+import numpy as numpy
+import xasy2asy as xasy2asy
 from pyUIClass.custMatTransform import Ui_Dialog
 
 
-class CustMatTransform(Qw.QDialog):
+class CustMatTransform(QtWidgets.QDialog):
     def __init__(self):
         super().__init__()
         self.ui = Ui_Dialog()
@@ -18,7 +18,7 @@
         self.ui.btnCancel.clicked.connect(self.reject)
         self.ui.btnReset.clicked.connect(self.resetDialog)
 
-        self.mainTransformation = Qg.QTransform()
+        self.mainTransformation = QtGui.QTransform()
         self.mainTransformation.scale(1, -1)
 
         self.matrixLineInputs = [
@@ -25,7 +25,7 @@
             self.ui.lineMat00, self.ui.lineMat01, self.ui.lineMatTx,
             self.ui.lineMat10, self.ui.lineMat11, self.ui.lineMatTy]
 
-        validator = Qg.QDoubleValidator()
+        validator = QtGui.QDoubleValidator()
         for lineInput in self.matrixLineInputs:
             lineInput.setValidator(validator)
             lineInput.textChanged.connect(self.handleUpdateText)
@@ -37,7 +37,7 @@
 
     def createCanvas(self):
         self.canvSize = self.ui.imgPreview.size()
-        self.previewPixmap = Qg.QPixmap(self.canvSize)
+        self.previewPixmap = QtGui.QPixmap(self.canvSize)
         tx, ty = self.canvSize.width() / 2, self.canvSize.height() / 2
         self.mainTransformation.translate(tx, -ty)
 
@@ -52,27 +52,27 @@
 
     def updatePreview(self):
         self.previewPixmap.fill()
-        canvas = Qg.QPainter(self.previewPixmap)
+        canvas = QtGui.QPainter(self.previewPixmap)
         if not canvas.isActive():
             return
         canvas.setTransform(self.mainTransformation)
 
         canvas.save()
-        canvas.setPen(Qc.Qt.lightGray)
+        canvas.setPen(QtCore.Qt.lightGray)
         self.drawBasicGrid(canvas)
-        transform = x2a.asyTransform.fromNumpyMatrix(self.getTransformationMatrix())
+        transform = xasy2asy.asyTransform.fromNumpyMatrix(self.getTransformationMatrix())
         canvTransform = transform.toQTransform()
         canvas.setTransform(canvTransform, True)
 
-        canvas.setPen(Qc.Qt.black)
+        canvas.setPen(QtCore.Qt.black)
 
         if canvTransform.isInvertible():
             self.drawBasicGrid(canvas, False)
 
             if canvTransform.determinant() <= 0:
-                canvas.setPen(Qc.Qt.red)
+                canvas.setPen(QtCore.Qt.red)
 
-            canvas.drawRect(Qc.QRect(Qc.QPoint(0, 0), Qc.QSize(20, 20)))
+            canvas.drawRect(QtCore.QRect(QtCore.QPoint(0, 0), QtCore.QSize(20, 20)))
 
         self.ui.imgPreview.setPixmap(self.previewPixmap)
 
@@ -86,17 +86,17 @@
         self.ui.lineMat11.setText('1')
 
     def drawBasicGrid(self, canvas, grid=True):
-        canvas.drawLine(Qc.QLine(-9999, 0, 9999, 0))
-        canvas.drawLine(Qc.QLine(0, -9999, 0, 9999))
+        canvas.drawLine(QtCore.QLine(-9999, 0, 9999, 0))
+        canvas.drawLine(QtCore.QLine(0, -9999, 0, 9999))
 
         fromIter, toIter = -7, 7
         gridSize = 20
         if grid:
             for iterIndex in range(fromIter, toIter + 1):
-                canvas.drawLine(Qc.QLine(-9999, iterIndex * gridSize, 9999, iterIndex * gridSize))
-                canvas.drawLine(Qc.QLine(iterIndex * gridSize, -9999, iterIndex * gridSize, 9999))
+                canvas.drawLine(QtCore.QLine(-9999, iterIndex * gridSize, 9999, iterIndex * gridSize))
+                canvas.drawLine(QtCore.QLine(iterIndex * gridSize, -9999, iterIndex * gridSize, 9999))
 
     def getTransformationMatrix(self):
         rawMatrixNum = [float(lineInput.text()) for lineInput in self.matrixLineInputs]
         rawMatrixNum.extend([0, 0, 1])
-        return np.matrix(rawMatrixNum).reshape((3, 3))
+        return numpy.matrix(rawMatrixNum).reshape((3, 3))

Modified: trunk/Build/source/utils/asymptote/GUI/DebugFlags.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/DebugFlags.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/DebugFlags.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,6 +1,5 @@
 #!/usr/bin/env python3
 
 keepFiles = False
-printFoutTranscript = False
+printAsyTranscript = False
 printDeconstTranscript = False
-forceRasterizationSVG = False

Modified: trunk/Build/source/utils/asymptote/GUI/GuidesManager.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/GuidesManager.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/GuidesManager.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,18 +1,17 @@
 #!/usr/bin/env python3
-import PyQt5.QtWidgets as Qw
-import PyQt5.QtGui as Qg
-import PyQt5.QtCore as Qc
-import numpy as np
+import PyQt5.QtGui as QtGui
+import PyQt5.QtCore as QtCore
+import numpy as numpy
 
 class Guide:
     def __init__(self, pen=None):
         if pen is None:
-            pen = Qg.QPen()
-        assert isinstance(pen, Qg.QPen)
+            pen = QtGui.QPen()
+        assert isinstance(pen, QtGui.QPen)
         self.pen = pen
 
     def drawShape(self, pen):
-        assert isinstance(pen, Qg.QPainter)
+        assert isinstance(pen, QtGui.QPainter)
         pen.save()
         pen.setPen(self.pen)
 
@@ -24,19 +23,19 @@
 
     def drawShape(self, pen):
         super().drawShape(pen)
-        p1 = self.origin + (9999 * Qc.QPointF(np.cos(self.direction), np.sin(self.direction)))
-        p2 = self.origin - (9999 * Qc.QPointF(np.cos(self.direction), np.sin(self.direction)))
-        pen.drawLine(Qc.QLineF(p1, p2))
+        p1 = self.origin + (9999 * QtCore.QPointF(numpy.cos(self.direction), numpy.sin(self.direction)))
+        p2 = self.origin - (9999 * QtCore.QPointF(numpy.cos(self.direction), numpy.sin(self.direction)))
+        pen.drawLine(QtCore.QLineF(p1, p2))
         pen.restore()
 
 class ArcGuide(Guide):
     @classmethod
     def radTo16Deg(cls, radians):
-        return int(round(np.rad2deg(radians) * 16))
+        return int(round(numpy.rad2deg(radians) * 16))
 
-    def __init__(self, center=None, radius=1, startAng=0, endAng=(2*np.pi), pen=None):
+    def __init__(self, center=None, radius=1, startAng=0, endAng=(2*numpy.pi), pen=None):
         if center is None:
-            center = Qc.QPointF(0, 0)
+            center = QtCore.QPointF(0, 0)
         super().__init__(pen)
         self.center = center
         self.radius = int(radius)
@@ -45,7 +44,7 @@
 
     def drawShape(self, pen):
         super().drawShape(pen)
-        assert isinstance(pen, Qg.QPainter)
+        assert isinstance(pen, QtGui.QPainter)
         x, y = int(round(self.center.x())), int(round(self.center.y()))
         pen.drawArc(x - self.radius, y - self.radius, 2 * self.radius, 2 * self.radius, ArcGuide.radTo16Deg(self.startAng),
                     -ArcGuide.radTo16Deg(self.endAng - self.startAng))

Modified: trunk/Build/source/utils/asymptote/GUI/InplaceAddObj.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/InplaceAddObj.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/InplaceAddObj.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,8 +1,8 @@
 #!/usr/bin/env python3
 
-import PyQt5.QtCore as Qc
-import PyQt5.QtGui as Qg
-import xasy2asy as x2a
+import PyQt5.QtCore as QtCore
+import PyQt5.QtGui as QtGui
+import xasy2asy as xasy2asy
 
 import PrimitiveShape
 import math
@@ -11,9 +11,9 @@
 import Widg_addLabel
 
 
-class InplaceObjProcess(Qc.QObject):
-    objectCreated = Qc.pyqtSignal(Qc.QObject)
-    objectUpdated = Qc.pyqtSignal()
+class InplaceObjProcess(QtCore.QObject):
+    objectCreated = QtCore.pyqtSignal(QtCore.QObject)
+    objectUpdated = QtCore.pyqtSignal()
 
     def __init__(self, parent=None):
         super().__init__(parent)
@@ -24,10 +24,10 @@
     def active(self):
         return self._active
 
-    def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+    def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None):
         raise NotImplementedError
 
-    def mouseMove(self, pos, event: Qg.QMouseEvent):
+    def mouseMove(self, pos, event: QtGui.QMouseEvent):
         raise NotImplementedError
 
     def mouseRelease(self):
@@ -45,7 +45,7 @@
     def getXasyObject(self):
         raise NotImplementedError
 
-    def postDrawPreview(self, canvas: Qg.QPainter):
+    def postDrawPreview(self, canvas: QtGui.QPainter):
         pass
 
     def createOptWidget(self, info):
@@ -55,10 +55,10 @@
 class AddCircle(InplaceObjProcess):
     def __init__(self, parent=None):
         super().__init__(parent)
-        self.center = Qc.QPointF(0, 0)
+        self.center = QtCore.QPointF(0, 0)
         self.radius = 0
 
-    def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+    def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None):
         x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
         self.radius = 0
         self.center.setX(x)
@@ -75,9 +75,9 @@
 
     def getPreview(self):
         x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(self.center)
-        boundRect = Qc.QRectF(x - self.radius, y - self.radius, 2 * self.radius, 2 * self.radius)
+        boundRect = QtCore.QRectF(x - self.radius, y - self.radius, 2 * self.radius, 2 * self.radius)
         # because the internal image is flipped...
-        newPath = Qg.QPainterPath()
+        newPath = QtGui.QPainterPath()
         newPath.addEllipse(boundRect)
         # newPath.addRect(boundRect)
         return newPath
@@ -87,9 +87,9 @@
 
     def getXasyObject(self):
         if self.fill:
-            newObj = x2a.xasyFilledShape(self.getObject(), None)
+            newObj = xasy2asy.xasyFilledShape(self.getObject(), None)
         else:
-            newObj = x2a.xasyShape(self.getObject(), None)
+            newObj = xasy2asy.xasyShape(self.getObject(), None)
         return newObj
 
     def forceFinalize(self):
@@ -102,8 +102,9 @@
         self.alignMode = None
         self.opt = None
         self.text = None
-        self.anchor = Qc.QPointF(0, 0)
+        self.anchor = QtCore.QPointF(0, 0)
         self._active = False
+        self.fontSize = 12
 
     def createOptWidget(self, info):
         self.opt = Widg_addLabel.Widg_addLabel(info)
@@ -121,7 +122,7 @@
         self.anchor.setX(x)
         self.anchor.setY(y)
 
-    def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+    def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None):
         if self.opt is not None:
             self.text = self.opt.labelText
         x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
@@ -140,7 +141,7 @@
         text = self.text
         align = str(self.alignMode)
         anchor = PrimitiveShape.PrimitiveShape.pos_to_tuple(self.anchor)
-        newLabel = x2a.xasyText(text=text, location=anchor, pen=None,
+        newLabel = xasy2asy.xasyText(text=text, location=anchor, pen=None,
                                 align=align, asyengine=None, fontsize=self.fontSize)
         newLabel.asyfied = False
         return newLabel
@@ -164,11 +165,11 @@
         # Linkmode should be to the last point.
         # (x, y, linkmode), (u, v, lm2) <==> (x, y) <=lm2=> (u, v)
         self.pointsList = []
-        self.currentPoint = Qc.QPointF(0, 0)
+        self.currentPoint = QtCore.QPointF(0, 0)
         self.pendingPoint = None
         self.useLegacy = False
 
-    def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+    def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None):
         x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
         self.currentPoint.setX(x)
         self.currentPoint.setY(y)
@@ -222,7 +223,7 @@
         # self.updateBasePath()
 
     def updateBasePath(self):
-        self.basePath = x2a.asyPath(asyengine=self.asyengine, forceCurve=self.useBezierBase)
+        self.basePath = xasy2asy.asyPath(asyengine=self.asyengine, forceCurve=self.useBezierBase)
         newNode = [(x, y) for x, y, _ in self.pointsList]
         newLink = [lnk for *args, lnk in self.pointsList[1:]]
         if self.useLegacy:
@@ -237,7 +238,7 @@
             self.basePath.computeControls()
 
     def updateBasePathPreview(self):
-        self.basePathPreview = x2a.asyPath(
+        self.basePathPreview = xasy2asy.asyPath(
             asyengine=self.asyengine, forceCurve=self.useBezierBase)
         newNode = [(x, y) for x, y, _ in self.pointsList] + [(self.currentPoint.x(), self.currentPoint.y())]
         newLink = [lnk for *args, lnk in self.pointsList[1:]] + [self._getLinkType()]
@@ -271,16 +272,16 @@
 
     def getXasyObject(self):
         if self.fill:
-            return x2a.xasyFilledShape(self.getObject(), None)
+            return xasy2asy.xasyFilledShape(self.getObject(), None)
         else:
-            return x2a.xasyShape(self.getObject(), None)
+            return xasy2asy.xasyShape(self.getObject(), None)
 
 
 class AddPoly(InplaceObjProcess):
     def __init__(self, parent=None):
         super().__init__(parent)
-        self.center = Qc.QPointF(0, 0)
-        self.currPos = Qc.QPointF(0, 0)
+        self.center = QtCore.QPointF(0, 0)
+        self.currPos = QtCore.QPointF(0, 0)
         self.sides = None
         self.inscribed = None
         self.centermode = None
@@ -288,7 +289,7 @@
         self.fill = None
         self.opt = None
 
-    def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+    def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None):
         self._active = True
         self.sides = info['sides']
         self.inscribed = info['inscribed']
@@ -295,11 +296,11 @@
         self.centermode = info['centermode']
         self.fill = info['fill']
 
-        
+
         x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
         self.center.setX(x)
         self.center.setY(y)
-        self.currPos = Qc.QPointF(self.center)
+        self.currPos = QtCore.QPointF(self.center)
 
     def mouseMove(self, pos, event):
         x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
@@ -329,7 +330,7 @@
         else:
             poly = PrimitiveShape.PrimitiveShape.exscribedRegPolygon(self.sides, self.center, self._rad(),
                                                                      self._angle(), qpoly=True)
-        newPath = Qg.QPainterPath()
+        newPath = QtGui.QPainterPath()
         newPath.addPolygon(poly)
         return newPath
 
@@ -350,7 +351,121 @@
 
     def getXasyObject(self):
         if self.fill:
-            newObj = x2a.xasyFilledShape(self.getObject(), None)
+            newObj = xasy2asy.xasyFilledShape(self.getObject(), None)
         else:
-            newObj = x2a.xasyShape(self.getObject(), None)
+            newObj = xasy2asy.xasyShape(self.getObject(), None)
         return newObj
+
+class AddFreehand(InplaceObjProcess):
+    # TODO: At the moment this is just a copy-paste of the AddBezierObj.
+    # Must find a better algorithm for constructing the obj rather than
+    # a node for every pixel the mouse moves.
+    def __init__(self, parent=None):
+        super().__init__(parent)
+        self.asyengine = None
+        self.basePath = None
+        self.basePathPreview = None
+        self.closedPath = None
+        self.info = None
+        self.fill = False
+        self.opt = None
+
+        # list of "committed" points with Linkage information.
+        # Linkmode should be to the last point.
+        # (x, y, linkmode), (u, v, lm2) <==> (x, y) <=lm2=> (u, v)
+        self.pointsList = []
+        self.currentPoint = QtCore.QPointF(0, 0)
+        self.pendingPoint = None
+        self.useLegacy = False
+
+    def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None):
+        x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
+        self.currentPoint.setX(x)
+        self.currentPoint.setY(y)
+        self.info = info
+
+        if not self._active:
+            self._active = True
+            self.fill = info['fill']
+            self.asyengine = info['asyengine']
+            self.closedPath = info['closedPath']
+            self.useBezierBase = info['useBezier']
+            self.useLegacy = self.info['options']['useLegacyDrawMode']
+            self.pointsList.clear()
+            self.pointsList.append((x, y, None))
+        else:
+            # see http://doc.qt.io/archives/qt-4.8/qt.html#MouseButton-enum
+            if (int(mouseEvent.buttons()) if mouseEvent is not None else 0) & 0x2 and self.useLegacy:
+                self.forceFinalize()
+
+    def _getLinkType(self):
+        if self.info['useBezier']:
+            return '..'
+        else:
+            return '--'
+
+    def mouseMove(self, pos, event):
+        # in postscript coords.
+        if self._active:
+            x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
+
+            if self.useLegacy or int(event.buttons()) != 0:
+                self.currentPoint.setX(x)
+                self.currentPoint.setY(y)
+                self.pointsList.append((x, y, self._getLinkType()))
+
+
+    def createOptWidget(self, info):
+        return None
+
+    def mouseRelease(self):
+        self.updateBasePath()
+        self._active = False
+        self.pointsList.clear()
+        self.objectCreated.emit(self.getXasyObject())
+        self.basePath = None
+
+    def updateBasePath(self):
+        self.basePath = xasy2asy.asyPath(asyengine=self.asyengine, forceCurve=self.useBezierBase)
+        newNode = [(x, y) for x, y, _ in self.pointsList]
+        newLink = [lnk for *args, lnk in self.pointsList[1:]]
+        if self.useLegacy:
+            newNode += [(self.currentPoint.x(), self.currentPoint.y())]
+            newLink += [self._getLinkType()]
+        if self.closedPath:
+            newNode.append('cycle')
+            newLink.append(self._getLinkType())
+        self.basePath.initFromNodeList(newNode, newLink)
+
+        if self.useBezierBase:
+            self.basePath.computeControls()
+
+    def updateBasePathPreview(self):
+        self.basePathPreview = xasy2asy.asyPath(
+            asyengine=self.asyengine, forceCurve=self.useBezierBase)
+        newNode = [(x, y) for x, y, _ in self.pointsList] + [(self.currentPoint.x(), self.currentPoint.y())]
+        newLink = [lnk for *args, lnk in self.pointsList[1:]] + [self._getLinkType()]
+        if self.closedPath:
+            newNode.append('cycle')
+            newLink.append(self._getLinkType())
+        self.basePathPreview.initFromNodeList(newNode, newLink)
+
+        if self.useBezierBase:
+            self.basePathPreview.computeControls()
+
+    def getObject(self):
+        if self.basePath is None:
+            raise RuntimeError('BasePath is None')
+        self.basePath.asyengine = self.asyengine
+        return self.basePath
+
+    def getPreview(self):
+        if self._active:
+            if self.pointsList:
+                self.updateBasePathPreview()
+                newPath = self.basePathPreview.toQPainterPath()
+                return newPath
+
+    def getXasyObject(self):
+        self.fill = False
+        return xasy2asy.xasyShape(self.getObject(), None)

Modified: trunk/Build/source/utils/asymptote/GUI/PrimitiveShape.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/PrimitiveShape.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/PrimitiveShape.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,10 +1,10 @@
 #!/usr/bin/env python3
 
-import xasy2asy as x2a
-import numpy as np
+import xasy2asy as xasy2asy
+import numpy as numpy
 import math
-import PyQt5.QtCore as Qc
-import PyQt5.QtGui as Qg
+import PyQt5.QtCore as QtCore
+import PyQt5.QtGui as QtGui
 
 
 class PrimitiveShape:
@@ -14,9 +14,9 @@
 
     @staticmethod
     def pos_to_tuple(pos):
-        if isinstance(pos, tuple) or isinstance(pos, np.ndarray):
+        if isinstance(pos, tuple) or isinstance(pos, numpy.ndarray):
             return pos
-        elif isinstance(pos, Qc.QPoint) or isinstance(pos, Qc.QPointF):
+        elif isinstance(pos, QtCore.QPoint) or isinstance(pos, QtCore.QPointF):
             return pos.x(), pos.y()
         else:
             raise TypeError("Position must be a valid type!")
@@ -32,7 +32,7 @@
     @classmethod
     def circle(cls, position, radius):
         pos_x, pos_y = PrimitiveShape.pos_to_tuple(position)
-        newCircle = x2a.asyPath()
+        newCircle = xasy2asy.asyPath()
         ptsList = [(pos_x + radius, pos_y), (pos_x, pos_y + radius), (pos_x - radius, pos_y), (pos_x, pos_y - radius),
                    'cycle']
         # cycle doesn't work for now.
@@ -45,16 +45,16 @@
         pos_x, pos_y = PrimitiveShape.pos_to_tuple(position)
         lkList = ['--'] * sides
         ptsList = []
-        for ang in np.linspace(starting_rad, starting_rad + math.tau, sides, endpoint=False):
+        for ang in numpy.linspace(starting_rad, starting_rad + math.tau, sides, endpoint=False):
             ptsList.append((pos_x + radius * math.cos(ang), pos_y + radius * math.sin(ang)))
 
         if qpoly:
             ptsList.append((pos_x + radius * math.cos(starting_rad), pos_y + radius * math.sin(starting_rad)))
-            qpoints = [Qc.QPointF(x, y) for (x, y) in ptsList]
-            return Qg.QPolygonF(qpoints)
+            qpoints = [QtCore.QPointF(x, y) for (x, y) in ptsList]
+            return QtGui.QPolygonF(qpoints)
         else:
             ptsList.append('cycle')
-            newPoly = x2a.asyPath()
+            newPoly = xasy2asy.asyPath()
             newPoly.initFromNodeList(ptsList, lkList)
             return newPoly
 

Modified: trunk/Build/source/utils/asymptote/GUI/SetCustomAnchor.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/SetCustomAnchor.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/SetCustomAnchor.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,20 +1,20 @@
 #!/usr/bin/env python3
 
-import PyQt5.QtWidgets as Qw
-import PyQt5.QtGui as Qg
-import PyQt5.QtCore as Qc
+import PyQt5.QtWidgets as QtWidgets
+import PyQt5.QtGui as QtGui
+import PyQt5.QtCore as QtCore
 from pyUIClass.setCustomAnchor import Ui_Dialog
 
 
-class CustomAnchorDialog(Qw.QDialog):
+class CustomAnchorDialog(QtWidgets.QDialog):
 
     def __init__(self):
         super().__init__()
         self.ui = Ui_Dialog()
         self.ui.setupUi(self)
-        self.ui.buttonBox.button(Qw.QDialogButtonBox.Reset).clicked.connect(self.resetDialog)
+        self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Reset).clicked.connect(self.resetDialog)
 
-        validator = Qg.QDoubleValidator()
+        validator = QtGui.QDoubleValidator()
 
         self.ui.lineEditX.setValidator(validator)
         self.ui.lineEditY.setValidator(validator)
@@ -24,18 +24,18 @@
 
     def checkTextChanged(self, text):
         if str(text) not in {'.', '-', '.-', '-.'} and str(text):
-            self.ui.buttonBox.button(Qw.QDialogButtonBox.Ok).setEnabled(True)
+            self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setEnabled(True)
         else:
-            self.ui.buttonBox.button(Qw.QDialogButtonBox.Ok).setEnabled(False)
+            self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setEnabled(False)
 
     def getPoint(self):
         xPoint = float(self.ui.lineEditX.text())
         yPoint = float(self.ui.lineEditY.text())
 
-        return Qc.QPointF(xPoint, yPoint)
+        return QtCore.QPointF(xPoint, yPoint)
 
     def handleBtnBoxClick(self, button):
-        assert isinstance(button, Qw.QAbstractButton)
+        assert isinstance(button, QtWidgets.QAbstractButton)
         if button.text() == 'Reset':
             self.resetDialog()
 

Modified: trunk/Build/source/utils/asymptote/GUI/Widg_addLabel.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/Widg_addLabel.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/Widg_addLabel.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,14 +1,14 @@
 #!/usr/bin/env python3
 
 from pyUIClass.widg_addLabel import Ui_Form
-import PyQt5.QtWidgets as Qw
-import PyQt5.QtGui as Qg
+import PyQt5.QtWidgets as QtWidgets
+import PyQt5.QtGui as QtGui
 
 import labelEditor
 import xasyUtils as xu
 
 
-class Widg_addLabel(Qw.QWidget):
+class Widg_addLabel(QtWidgets.QWidget):
     def __init__(self, info):
         super().__init__()
         self.ui = Ui_Form()
@@ -34,11 +34,11 @@
         if self.info['shift_y'] is not None:
             self.ui.txtShiftY.setText(str(self.info['shift_y']))
 
-        
+
         self.ui.cmbFontSize.setCurrentText(str(self.info['fontSize']) if self.info['fontSize'] is not None else '-')
         self.ui.cmbAlign.setCurrentIndex(self.info['alignIndex'])
 
-        validator = Qg.QDoubleValidator()
+        validator = QtGui.QDoubleValidator()
 
         self.ui.txtShiftX.setValidator(validator)
         self.ui.txtShiftY.setValidator(validator)
@@ -53,7 +53,7 @@
 
         self.updateCheck(self.ui.cmbAlign.currentText())
 
-    def cmbFontSizeTextChanged(self, text: str): 
+    def cmbFontSizeTextChanged(self, text: str):
         tryParseVal = xu.tryParse(text, float)
         self.info['fontSize'] = tryParseVal
 
@@ -61,7 +61,7 @@
         advancedEditDialog = labelEditor.labelEditor(self.ui.txtLabelText.text())
         advancedEditDialog.show()
         result = advancedEditDialog.exec_()
-        if result == Qw.QDialog.Accepted:
+        if result == QtWidgets.QDialog.Accepted:
             self.ui.txtLabelText.setText(advancedEditDialog.getText())
 
     @property

Modified: trunk/Build/source/utils/asymptote/GUI/Widg_addPolyOpt.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/Widg_addPolyOpt.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/Widg_addPolyOpt.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,14 +1,13 @@
 #!/usr/bin/env python3
 
 from pyUIClass.widg_addPolyOpt import Ui_Form
-import PyQt5.QtWidgets as Qw
-import PyQt5.QtGui as Qg
-import PyQt5.QtCore as Qc
+import PyQt5.QtWidgets as QtWidgets
+import PyQt5.QtGui as QtGui
 
 import sys
 
 
-class Widg_addPolyOpt(Qw.QWidget):
+class Widg_addPolyOpt(QtWidgets.QWidget):
     def __init__(self, info):
         super().__init__()
         self.ui = Ui_Form()
@@ -18,7 +17,7 @@
 
         self.ui.chkInscribed.setChecked(self.info['inscribed'])
         self.ui.txtSides.setText(str(self.info['sides']))
-        self.ui.txtSides.setValidator(Qg.QIntValidator())
+        self.ui.txtSides.setValidator(QtGui.QIntValidator())
 
         self.ui.chkInscribed.stateChanged.connect(self.chkInscribedUpdate)
         self.ui.txtSides.textChanged.connect(self.txtSidesUpdate)

Modified: trunk/Build/source/utils/asymptote/GUI/Widg_editBezier.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/Widg_editBezier.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/Widg_editBezier.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,9 +2,8 @@
 
 from pyUIClass.widg_editBezier import Ui_Form
 
-import PyQt5.QtCore as Qc
-import PyQt5.QtWidgets as Qw
-import PyQt5.QtGui as Qg
+import PyQt5.QtWidgets as QtWidgets
+import PyQt5.QtCore as QtCore
 
 class LockMode:
     noLock = 0
@@ -11,7 +10,7 @@
     angleLock = 1
     angleAndScaleLock = 2
 
-class Widg_editBezier(Qw.QWidget):
+class Widg_editBezier(QtWidgets.QWidget):
     def __init__(self, info: dict, enableCurveFeatures: bool=True):
         super().__init__()
         self.ui = Ui_Form()
@@ -38,16 +37,16 @@
     def lockMode(self) -> int:
         return self.ui.cmbLockMode.currentIndex()
 
-    @Qc.pyqtSlot(int)
+    @QtCore.pyqtSlot(int)
     def cmbLockIndexChange(self, index: int):
         self.info['editBezierlockMode'] = index
 
-    @Qc.pyqtSlot(int)
+    @QtCore.pyqtSlot(int)
     def chkRecomputeChanged(self, checked: int):
         isChecked = (checked == 2)
         for obj in self.disableOnAutoRecompute:
             obj.setEnabled(not checked)
         self.info['autoRecompute'] = checked
-        
+
         if isChecked:
             self.ui.btnForceRecompute.clicked.emit()

Modified: trunk/Build/source/utils/asymptote/GUI/Window1.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/Window1.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/Window1.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -18,6 +18,7 @@
 import datetime
 import string
 import atexit
+import pickle
 
 import xasyUtils as xu
 import xasy2asy as x2a
@@ -50,7 +51,6 @@
         self.transformation = transformation
         self.isLocal = isLocal
 
-
 class ObjCreationChanges(ActionChanges):
     def __init__(self, obj):
         self.object = obj
@@ -60,6 +60,18 @@
         self.item = obj
         self.objIndex = pos
 
+class SoftDeletionChanges(ActionChanges):
+    def __init__(self, obj, keyPos):
+        self.item = obj
+        self.keyMap = keyPos
+
+class EditBezierChanges(ActionChanges):
+    def __init__(self, obj, pos, oldPath, newPath):
+        self.item = obj
+        self.objIndex = pos
+        self.oldPath = oldPath
+        self.newPath = newPath
+
 class AnchorMode:
     center = 0
     origin = 1
@@ -68,8 +80,8 @@
     bottomRight = 4
     bottomLeft = 5
     customAnchor = 6
-    
 
+
 class GridMode:
     cartesian = 0
     polar = 1
@@ -84,6 +96,14 @@
     delete = 5
     setAnchor = 6
     selectEdit = 7
+    openPoly = 8
+    closedPoly = 9
+    openCurve = 10
+    closedCurve = 11
+    addPoly = 12
+    addCircle = 13
+    addLabel = 14
+    addFreehand = 15
 
 class AddObjectMode:
     Circle = 0
@@ -92,14 +112,15 @@
 
 class MainWindow1(Qw.QMainWindow):
     defaultFrameStyle = """
-    QFrame{{ 
+    QFrame{{
         padding: 4.0;
-        border-radius: 3.0; 
+        border-radius: 3.0;
         background: rgb({0}, {1}, {2})
     }}
     """
 
     def __init__(self):
+        self.testingActions = []
         super().__init__()
         self.ui = Ui_MainWindow()
         global devicePixelRatio
@@ -109,12 +130,13 @@
 
         self.settings = xo.BasicConfigs.defaultOpt
         self.keyMaps = xo.BasicConfigs.keymaps
+        self.openRecent = xo.BasicConfigs.openRecent
 
         self.raw_args = Qc.QCoreApplication.arguments()
         self.args = xa.parseArgs(self.raw_args)
 
         self.strings = xs.xasyString(self.args.language)
-        self.asy2psmap = x2a.identity()
+        self.asy2psmap = x2a.yflip()
 
         if self.settings['asyBaseLocation'] is not None:
             os.environ['ASYMPTOTE_DIR'] = self.settings['asyBaseLocation']
@@ -134,7 +156,8 @@
 
         # For initialization purposes
         self.canvSize = Qc.QSize()
-        self.filename = None
+        self.fileName = None
+        self.asyFileName = None
         self.currDir = None
         self.mainCanvas = None
         self.dpi = 300
@@ -165,9 +188,9 @@
         self.inMidTransformation = False
         self.addMode = None
         self.currentlySelectedObj = {'key': None, 'allSameKey': set(), 'selectedIndex': None, 'keyIndex': None}
-        self.pendingSelectedObjList = [] 
+        self.pendingSelectedObjList = []
         self.pendingSelectedObjIndex = -1
-        
+
         self.savedMousePosition = None
         self.currentBoundingBox = None
         self.selectionDelta = None
@@ -177,9 +200,12 @@
         self.scaleFactor = 1
         self.panOffset = [0, 0]
 
+        # Keyboard can focus outside of textboxes
+        self.setFocusPolicy(Qc.Qt.StrongFocus)
+
         super().setMouseTracking(True)
         # setMouseTracking(True)
-        
+
         self.undoRedoStack = Urs.actionStack()
 
         self.lockX = False
@@ -211,8 +237,10 @@
 
         self.modeButtons = {
             self.ui.btnTranslate, self.ui.btnRotate, self.ui.btnScale, # self.ui.btnSelect,
-            self.ui.btnPan, self.ui.btnDeleteMode, self.ui.btnAnchor, 
-            self.ui.btnSelectEdit
+            self.ui.btnPan, self.ui.btnDeleteMode, self.ui.btnAnchor,
+            self.ui.btnSelectEdit, self.ui.btnOpenPoly, self.ui.btnClosedPoly,
+            self.ui.btnOpenCurve, self.ui.btnClosedCurve, self.ui.btnAddPoly,
+            self.ui.btnAddCircle, self.ui.btnAddLabel, self.ui.btnAddFreehand
                             }
 
         self.objButtons = {self.ui.btnCustTransform, self.ui.actionTransform, self.ui.btnSendForwards,
@@ -225,17 +253,17 @@
 
         self.currAddOptionsWgt = None
         self.currAddOptions = {
-            'options': self.settings, 
+            'options': self.settings,
             'inscribed': True,
             'sides': 3,
             'centermode': True,
-            'fontSize': None, 
+            'fontSize': None,
             'asyengine': self.asyEngine,
             'fill': self.ui.btnFill.isChecked(),
             'closedPath': False,
-            'useBezier': True, 
+            'useBezier': True,
             'magnification': self.magnification,
-            'editBezierlockMode': xbi.Web.LockMode.angleLock, 
+            'editBezierlockMode': xbi.Web.LockMode.angleLock,
             'autoRecompute': False
         }
 
@@ -249,7 +277,7 @@
 
         # commands switchboard
         self.commandsFunc = {
-            'quit': Qc.QCoreApplication.quit,
+            'quit': self.btnCloseFileonClick,
             'undo': self.btnUndoOnClick,
             'redo': self.btnRedoOnClick,
             'manual': self.actionManual,
@@ -261,10 +289,10 @@
             'commandPalette': self.enterCustomCommand,
             'clearGuide': self.clearGuides,
             'finalizeAddObj': self.finalizeAddObj,
-            'finalizeCurve': self.finalizeCurve, 
-            'finalizeCurveClosed': self.finalizeCurveClosed, 
+            'finalizeCurve': self.finalizeCurve,
+            'finalizeCurveClosed': self.finalizeCurveClosed,
             'setMag': self.setMagPrompt,
-            'deleteObject': self.btnSelectiveDeleteOnClick, 
+            'deleteObject': self.btnSelectiveDeleteOnClick,
             'anchorMode': self.switchToAnchorMode,
             'moveUp': lambda: self.translate(0, -1),
             'moveDown': lambda: self.translate(0, 1),
@@ -274,10 +302,17 @@
             'scrollLeft': lambda: self.arrowButtons(-1, 0, True),
             'scrollRight': lambda: self.arrowButtons(1, 0, True),
             'scrollUp': lambda: self.arrowButtons(0, 1, True),
-            'scrollDown': lambda: self.arrowButtons(0, -1, True), 
+            'scrollDown': lambda: self.arrowButtons(0, -1, True),
 
-            'zoomIn': lambda: self.arrowButtons(0, 1, False, True), 
-            'zoomOut': lambda: self.arrowButtons(0, -1, False, True)
+            'zoomIn': lambda: self.arrowButtons(0, 1, False, True),
+            'zoomOut': lambda: self.arrowButtons(0, -1, False, True),
+
+            'open': self.btnLoadFileonClick,
+            'save': self.actionSave,
+            'export': self.btnExportAsymptoteOnClick,
+
+            'copy': self.copyItem,
+            'paste': self.pasteItem
         }
 
         self.hiddenKeys = set()
@@ -291,6 +326,7 @@
         # from xasyoptions config file
         self.loadKeyMaps()
         self.setupXasyOptions()
+        self.populateOpenRecent()
 
         self.colorDialog = Qw.QColorDialog(x2a.asyPen.convertToQColor(self._currentPen.color), self)
         self.initPenInterface()
@@ -320,7 +356,7 @@
     def getScrsTransform(self):
         # pipeline:
         # assuming origin <==> top left
-        # (Pan) * (Translate) * (Flip the images) * (Zoom) * (Obj transform) * (Base Information) 
+        # (Pan) * (Translate) * (Flip the images) * (Zoom) * (Obj transform) * (Base Information)
 
         # pipeline --> let x, y be the postscript point
         # p = (mx + cx + panoffset, -ny + cy + panoffset)
@@ -366,6 +402,12 @@
         self.settings.load()
         self.quickUpdate()
 
+    def openAndReloadKeymaps(self):
+        keymapsFile = self.keyMaps.settingsFileLocation()
+        subprocess.run(args=self.getExternalEditor(asypath=keymapsFile))
+        self.settings.load()
+        self.quickUpdate()
+
     def setMagPrompt(self):
         commandText, result = Qw.QInputDialog.getText(self, '', 'Enter magnification:')
         if result:
@@ -373,6 +415,11 @@
             self.currAddOptions['magnification'] = self.magnification
             self.quickUpdate()
 
+    def setTextPrompt(self):
+        commandText, result = Qw.QInputDialog.getText(self, '', 'Enter new text:')
+        if result:
+            return commandText
+
     def btnTogglePythonOnClick(self, checked):
         self.terminalPythonMode = checked
 
@@ -381,7 +428,10 @@
 
     def handleArguments(self):
         if self.args.filename is not None:
-            self.loadFile(self.args.filename)
+            if os.path.exists(self.args.filename):
+                self.actionOpen(os.path.abspath(self.args.filename))
+            else:
+                self.loadFile(self.args.filename)
         else:
             self.initializeEmptyFile()
 
@@ -417,14 +467,18 @@
         self.ui.actionRedo.triggered.connect(lambda: self.execCustomCommand('redo'))
         self.ui.actionTransform.triggered.connect(lambda: self.execCustomCommand('transform'))
 
+        self.ui.actionNewFile.triggered.connect(self.actionNewFile)
         self.ui.actionOpen.triggered.connect(self.actionOpen)
+        self.ui.actionClearRecent.triggered.connect(self.actionClearRecent)
         self.ui.actionSave.triggered.connect(self.actionSave)
         self.ui.actionSaveAs.triggered.connect(self.actionSaveAs)
         self.ui.actionManual.triggered.connect(self.actionManual)
         self.ui.actionAbout.triggered.connect(self.actionAbout)
         self.ui.actionSettings.triggered.connect(self.openAndReloadSettings)
+        self.ui.actionKeymaps.triggered.connect(self.openAndReloadKeymaps)
         self.ui.actionEnterCommand.triggered.connect(self.enterCustomCommand)
-        self.ui.actionExportAsymptote.triggered.connect(self.btnExportAsyOnClick)
+        self.ui.actionExportAsymptote.triggered.connect(self.btnExportAsymptoteOnClick)
+        self.ui.actionExportToAsy.triggered.connect(self.btnExportToAsyOnClick)
 
     def setupXasyOptions(self):
         if self.settings['debugMode']:
@@ -443,7 +497,7 @@
         self.ui.btnSave.clicked.connect(self.btnSaveonClick)
         self.ui.btnQuickScreenshot.clicked.connect(self.btnQuickScreenshotOnClick)
 
-        # self.ui.btnExportAsy.clicked.connect(self.btnExportAsyOnClick)
+        # self.ui.btnExportAsy.clicked.connect(self.btnExportAsymptoteOnClick)
 
         self.ui.btnDrawAxes.clicked.connect(self.btnDrawAxesOnClick)
 #        self.ui.btnAsyfy.clicked.connect(lambda: self.asyfyCanvas(True))
@@ -467,7 +521,7 @@
         self.ui.btnAnchor.clicked.connect(self.btnAnchorModeOnClick)
 
         self.ui.btnSelectColor.clicked.connect(self.btnColorSelectOnClick)
-        self.ui.txtLineWidth.textEdited.connect(self.txtLineWithEdited)
+        self.ui.txtLineWidth.textEdited.connect(self.txtLineWidthEdited)
 
         # self.ui.btnCreateCurve.clicked.connect(self.btnCreateCurveOnClick)
         self.ui.btnDrawGrid.clicked.connect(self.btnDrawGridOnClick)
@@ -475,6 +529,7 @@
         self.ui.btnAddCircle.clicked.connect(self.btnAddCircleOnClick)
         self.ui.btnAddPoly.clicked.connect(self.btnAddPolyOnClick)
         self.ui.btnAddLabel.clicked.connect(self.btnAddLabelOnClick)
+        self.ui.btnAddFreehand.clicked.connect(self.btnAddFreehandOnClick)
         # self.ui.btnAddBezierInplace.clicked.connect(self.btnAddBezierInplaceOnClick)
         self.ui.btnClosedCurve.clicked.connect(self.btnAddClosedCurveOnClick)
         self.ui.btnOpenCurve.clicked.connect(self.btnAddOpenCurveOnClick)
@@ -489,16 +544,19 @@
         self.ui.btnDeleteMode.clicked.connect(self.btnDeleteModeOnClick)
         # self.ui.btnSoftDelete.clicked.connect(self.btnSoftDeleteOnClick)
         self.ui.btnToggleVisible.clicked.connect(self.btnSetVisibilityOnClick)
-        
+
         self.ui.btnEnterCommand.clicked.connect(self.btnTerminalCommandOnClick)
         self.ui.btnTogglePython.clicked.connect(self.btnTogglePythonOnClick)
         self.ui.btnSelectEdit.clicked.connect(self.btnSelectEditOnClick)
 
     def btnDeleteModeOnClick(self):
-        self.currentModeStack = [SelectionMode.delete]
-        self.ui.statusbar.showMessage('Delete Mode')
-        self.clearSelection()
-        self.updateChecks()
+        if self.currentModeStack[-1] != SelectionMode.delete:
+            self.currentModeStack = [SelectionMode.delete]
+            self.ui.statusbar.showMessage('Delete mode')
+            self.clearSelection()
+            self.updateChecks()
+        else:
+            self.btnTranslateonClick()
 
     def btnTerminalCommandOnClick(self):
         if self.terminalPythonMode:
@@ -507,18 +565,25 @@
         else:
             pass
             # TODO: How to handle this case?
-            # Like AutoCAD? 
+            # Like AutoCAD?
         self.ui.txtTerminalPrompt.clear()
 
-    def btnFillOnClick(self, checked): 
+    def btnFillOnClick(self, checked):
+        if self.currentModeStack == [SelectionMode.selectEdit]:
+            if isinstance(self.addMode,xbi.InteractiveBezierEditor):
+                self.addMode.swapObjFill() #Check for crashes
         self.currAddOptions['fill'] = checked
         self.ui.btnOpenCurve.setEnabled(not checked)
         self.ui.btnOpenPoly.setEnabled(not checked)
 
     def btnSelectEditOnClick(self):
-        self.ui.statusbar.showMessage('Edit mode')
-        self.currentModeStack = [SelectionMode.selectEdit]
-        self.updateChecks()
+        if self.currentModeStack[-1] != SelectionMode.selectEdit:
+            self.currentModeStack = [SelectionMode.selectEdit]
+            self.ui.statusbar.showMessage('Edit mode')
+            self.clearSelection()
+            self.updateChecks()
+        else:
+            self.btnTranslateonClick()
 
     @property
     def currentPen(self):
@@ -544,7 +609,7 @@
         except Exception:
             pass
 
-        self.currentModeStack[-1] = None
+        #self.currentModeStack[-1] = None
         self.addMode.objectCreated.connect(self.addInPlace)
         self.updateModeBtnsOnly()
 
@@ -557,7 +622,10 @@
 
     def addInPlace(self, obj):
         obj.asyengine = self.asyEngine
-        obj.pen = self.currentPen
+        if isinstance(obj, x2a.xasyText):
+            obj.label.pen = self.currentPen
+        else:
+            obj.pen = self.currentPen
         obj.onCanvas = self.xasyDrawObj
         obj.setKey(str(self.globalObjectCounter))
         self.globalObjectCounter = self.globalObjectCounter + 1
@@ -576,11 +644,6 @@
         self.currentGuides.clear()
         self.quickUpdate()
 
-    def btnAddCircleOnClick(self):
-        self.addMode = InplaceAddObj.AddCircle(self)
-        self.ui.statusbar.showMessage('')
-        self.updateOptionWidget()
-
     LegacyHint='Click and drag to draw; right click or space bar to finalize'
     Hint='Click and drag to draw; release and click in place to add node; continue dragging'
     HintClose=' or c to close.'
@@ -598,49 +661,90 @@
             self.ui.statusbar.showMessage(self.Hint+self.HintClose)
 
     def btnAddBezierInplaceOnClick(self):
+        self.fileChanged = True
         self.addMode = InplaceAddObj.AddBezierShape(self)
         self.updateOptionWidget()
 
     def btnAddOpenLineOnClick(self):
-        self.currAddOptions['useBezier'] = False
-        self.currAddOptions['closedPath'] = False
-        self.drawHintOpen()
-        self.btnAddBezierInplaceOnClick()
+        if self.currentModeStack[-1] != SelectionMode.openPoly:
+            self.currentModeStack = [SelectionMode.openPoly]
+            self.currAddOptions['useBezier'] = False
+            self.currAddOptions['closedPath'] = False
+            self.drawHintOpen()
+            self.btnAddBezierInplaceOnClick()
+        else:
+            self.btnTranslateonClick()
 
     def btnAddClosedLineOnClick(self):
-        self.currAddOptions['useBezier'] = False
-        self.currAddOptions['closedPath'] = True
-        self.drawHint()
-        self.btnAddBezierInplaceOnClick()
+        if self.currentModeStack[-1] != SelectionMode.closedPoly:
+            self.currentModeStack = [SelectionMode.closedPoly]
+            self.currAddOptions['useBezier'] = False
+            self.currAddOptions['closedPath'] = True
+            self.drawHint()
+            self.btnAddBezierInplaceOnClick()
+        else:
+            self.btnTranslateonClick()
 
     def btnAddOpenCurveOnClick(self):
-        self.currAddOptions['useBezier'] = True
-        self.currAddOptions['closedPath'] = False
-        self.drawHintOpen()
-        self.btnAddBezierInplaceOnClick()
+        if self.currentModeStack[-1] != SelectionMode.openCurve:
+            self.currentModeStack = [SelectionMode.openCurve]
+            self.currAddOptions['useBezier'] = True
+            self.currAddOptions['closedPath'] = False
+            self.drawHintOpen()
+            self.btnAddBezierInplaceOnClick()
+        else:
+            self.btnTranslateonClick()
 
     def btnAddClosedCurveOnClick(self):
-        self.currAddOptions['useBezier'] = True
-        self.currAddOptions['closedPath'] = True
-        self.drawHint()
-        self.btnAddBezierInplaceOnClick()
+        if self.currentModeStack[-1] != SelectionMode.closedCurve:
+            self.currentModeStack = [SelectionMode.closedCurve]
+            self.currAddOptions['useBezier'] = True
+            self.currAddOptions['closedPath'] = True
+            self.drawHint()
+            self.btnAddBezierInplaceOnClick()
+        else:
+            self.btnTranslateonClick()
 
     def btnAddPolyOnClick(self):
-        self.addMode = InplaceAddObj.AddPoly(self)
-        self.ui.statusbar.showMessage('')
-        self.updateOptionWidget()
+        if self.currentModeStack[-1] != SelectionMode.addPoly:
+            self.currentModeStack = [SelectionMode.addPoly]
+            self.addMode = InplaceAddObj.AddPoly(self)
+            self.ui.statusbar.showMessage('Add polygon on click')
+            self.updateOptionWidget()
+        else:
+            self.btnTranslateonClick()
 
+    def btnAddCircleOnClick(self):
+        if self.currentModeStack[-1] != SelectionMode.addCircle:
+            self.currentModeStack = [SelectionMode.addCircle]
+            self.addMode = InplaceAddObj.AddCircle(self)
+            self.ui.statusbar.showMessage('Add circle on click')
+            self.updateOptionWidget()
+        else:
+            self.btnTranslateonClick()
+
     def btnAddLabelOnClick(self):
-        self.addMode = InplaceAddObj.AddLabel(self)
-        self.ui.statusbar.showMessage('')
-        self.updateOptionWidget()
+        if self.currentModeStack[-1] != SelectionMode.addLabel:
+            self.currentModeStack = [SelectionMode.addLabel]
+            self.addMode = InplaceAddObj.AddLabel(self)
+            self.ui.statusbar.showMessage('Add label on click')
+            self.updateOptionWidget()
+        else:
+            self.btnTranslateonClick()
 
-    def updateCurve(self, valid, newCurve):
-        self.previewCurve = newCurve
-        self.quickUpdate()
+    def btnAddFreehandOnClick(self):
+        if self.currentModeStack[-1] != SelectionMode.addFreehand:
+            self.currentModeStack = [SelectionMode.addFreehand]
+            self.currAddOptions['useBezier'] = False
+            self.currAddOptions['closedPath'] = False
+            self.ui.statusbar.showMessage("Draw freehand")
+            self.addMode = InplaceAddObj.AddFreehand(self)
+            self.updateOptionWidget()
+        else:
+            self.btnTranslateonClick()
 
     def addTransformationChanges(self, objIndex, transform, isLocal=False):
-        self.undoRedoStack.add(self.createAction(TransformationChanges(objIndex, 
+        self.undoRedoStack.add(self.createAction(TransformationChanges(objIndex,
                             transform, isLocal)))
         self.checkUndoRedoButtons()
 
@@ -665,7 +769,11 @@
             parent = selectedObj.parent()
 
             if isinstance(parent, x2a.xasyScript):
-                self.hiddenKeys.add((selectedObj.key, selectedObj.keyIndex))
+                objKey=(selectedObj.key, selectedObj.keyIndex)
+                self.hiddenKeys.add(objKey)
+                self.undoRedoStack.add(self.createAction(
+                    SoftDeletionChanges(selectedObj.parent(), objKey)
+                    ))
                 self.softDeleteObj((maj, minor))
             else:
                 index = self.fileItems.index(selectedObj.parent())
@@ -673,10 +781,10 @@
                 self.undoRedoStack.add(self.createAction(
                     HardDeletionChanges(selectedObj.parent(), index)
                 ))
-                self.checkUndoRedoButtons()
-                
+
                 self.fileItems.remove(selectedObj.parent())
 
+            self.checkUndoRedoButtons()
             self.fileChanged = True
             self.clearSelection()
             self.asyfyCanvas()
@@ -709,8 +817,16 @@
 
 
     def btnUndoOnClick(self):
-        self.undoRedoStack.undo()
-        self.checkUndoRedoButtons()
+        if self.currentlySelectedObj['selectedIndex'] is not None:
+            # avoid deleting currently selected object
+            maj, minor = self.currentlySelectedObj['selectedIndex']
+            selectedObj = self.drawObjects[maj][minor]
+            if selectedObj != self.drawObjects[-1][0]:
+                self.undoRedoStack.undo()
+                self.checkUndoRedoButtons()
+        else:
+            self.undoRedoStack.undo()
+            self.checkUndoRedoButtons()
 
     def btnRedoOnClick(self):
         self.undoRedoStack.redo()
@@ -731,6 +847,12 @@
             self.fileItems.pop()
         elif isinstance(change, HardDeletionChanges):
             self.fileItems.insert(change.objIndex, change.item)
+        elif isinstance(change, SoftDeletionChanges):
+            key, keyIndex = change.keyMap
+            self.hiddenKeys.remove((key, keyIndex))
+            change.item.transfKeymap[key][keyIndex].deleted = False
+        elif isinstance(change, EditBezierChanges):
+            self.fileItems[change.objIndex].path = change.oldPath
         self.asyfyCanvas()
 
     def handleRedoChanges(self, change):
@@ -742,6 +864,12 @@
             self.fileItems.append(change.object)
         elif isinstance(change, HardDeletionChanges):
             self.fileItems.remove(change.item)
+        elif isinstance(change, SoftDeletionChanges):
+            key, keyIndex = change.keyMap
+            self.hiddenKeys.add((key, keyIndex))
+            change.item.transfKeymap[key][keyIndex].deleted = True
+        elif isinstance(change, EditBezierChanges):
+            self.fileItems[change.objIndex].path = change.newPath
         self.asyfyCanvas()
 
     #  is this a "pythonic" way?
@@ -765,12 +893,27 @@
         if result:
             self.execCustomCommand(commandText)
 
-    def addItemFromPath(self, path):
-        newItem = x2a.xasyShape(path, self.asyEngine, pen=self.currentPen)
+    def addXasyShapeFromPath(self, path, pen = None, transform = x2a.identity(), key = None):
+        if not pen:
+            pen = self.currentPen
+        else:
+            pen = x2a.asyPen(self.asyEngine, color = pen['color'], width = pen['width'], pen_options = pen['options'])
+
+        newItem = x2a.xasyShape(path, self.asyEngine, pen = pen, transform = transform)
+        newItem.setKey(key)
         self.fileItems.append(newItem)
-        self.fileChanged = True
-        self.asyfyCanvas()
 
+    def addXasyTextFromData(self, text, location, pen, transform, key, align, fontSize):
+        if not pen:
+            pen = self.currentPen
+        else:
+            pen = x2a.asyPen(self.asyEngine, color = pen['color'], width = pen['width'], pen_options = pen['options'])
+        newItem = x2a.xasyText(text, location, self.asyEngine, pen, transform, key, align, fontSize)
+        newItem.setKey(key)
+        newItem.onCanvas = self.xasyDrawObj
+        self.fileItems.append(newItem)
+
+
     def actionManual(self):
         asyManualURL = 'https://asymptote.sourceforge.io/asymptote.pdf'
         webbrowser.open_new(asyManualURL)
@@ -778,11 +921,35 @@
     def actionAbout(self):
         Qw.QMessageBox.about(self,"xasy","This is xasy "+xasyVersion.xasyVersion+"; a graphical front end to the Asymptote vector graphics language: https://asymptote.sourceforge.io/")
 
-    def btnExportAsyOnClick(self):
+    def actionExport(self, pathToFile):
+        asyFile = io.open(os.path.realpath(pathToFile), 'w')
+        xf.saveFile(asyFile, self.fileItems, self.asy2psmap)
+        asyFile.close()
+        self.ui.statusbar.showMessage(f"Exported to '{pathToFile}' as Asymptote File.")
+
+    def btnExportToAsyOnClick(self):
+        if self.fileName:
+            pathToFile = os.path.splitext(self.fileName)[0]+'.asy'
+        else:
+            self.btnExportAsymptoteOnClick()
+            return
+        if os.path.isfile(pathToFile):
+            reply = Qw.QMessageBox.question(self, 'Message',
+                f'"{os.path.split(pathToFile)[1]}" already exists.  Do you want to overwrite it?',
+                Qw.QMessageBox.Yes, Qw.QMessageBox.No)
+            if reply == Qw.QMessageBox.No:
+                return
+            self.actionExport(pathToFile)
+
+    def btnExportAsymptoteOnClick(self):
         diag = Qw.QFileDialog(self)
         diag.setAcceptMode(Qw.QFileDialog.AcceptSave)
 
         formatId = {
+            'asy': {
+                'name': 'Asymptote Files',
+                'ext': ['*.asy']
+            },
             'pdf': {
                 'name': 'PDF Files',
                 'ext': ['*.pdf']
@@ -805,7 +972,7 @@
             }
         }
 
-        formats = ['pdf', 'svg', 'eps', 'png', '*']
+        formats = ['asy', 'pdf', 'svg', 'eps', 'png', '*']
 
         formatText = ';;'.join('{0:s} ({1:s})'.format(formatId[form]['name'], ' '.join(formatId[form]['ext']))
                                for form in formats)
@@ -812,7 +979,7 @@
 
         if self.currDir is not None:
             diag.setDirectory(self.currDir)
-            rawFile = os.path.splitext(os.path.basename(self.filename))[0] + '.pdf'
+            rawFile = os.path.splitext(os.path.basename(self.fileName))[0] + '.asy'
             diag.selectFile(rawFile)
 
         diag.setNameFilter(formatText)
@@ -823,26 +990,108 @@
             return
 
         finalFiles = diag.selectedFiles()
+        finalString = xf.xasy2asyCode(self.fileItems, self.asy2psmap)
 
-        with io.StringIO() as finalCode:
-            xf.saveFile(finalCode, self.fileItems, self.asy2psmap)
-            finalString = finalCode.getvalue()
-
         for file in finalFiles:
             ext = os.path.splitext(file)
             if len(ext) < 2:
-                ext = 'pdf'
+                ext = 'asy'
             else:
                 ext = ext[1][1:]
+            if ext == 'asy':
+                pathToFile = os.path.splitext(file)[0]+'.'+ext
+                asyFile = io.open(os.path.realpath(pathToFile), 'w')
+                xf.saveFile(asyFile, self.fileItems, self.asy2psmap)
+                asyFile.close()
+            else:
+                with subprocess.Popen(args=[self.asyPath, '-f{0}'.format(ext), '-o{0}'.format(file), '-'], encoding='utf-8',
+                                    stdin=subprocess.PIPE) as asy:
 
-            with subprocess.Popen(args=[self.asyPath, '-f{0}'.format(ext), '-o{0}'.format(file), '-'], encoding='utf-8',
-                                  stdin=subprocess.PIPE) as asy:
-                print('test:', finalString)
-                asy.stdin.write(finalString)
-                asy.stdin.close()
-                asy.wait(timeout=35)
+                    asy.stdin.write(finalString)
+                    asy.stdin.close()
+                    asy.wait(timeout=35)
 
+    def actionExportXasy(self, file):
+        xasyObjects, asyItems = xf.xasyToDict(self.fileName, self.fileItems, self.asy2psmap)
 
+        if asyItems:
+
+            # Save imported items into the twin asy file
+            asyScriptItems = [item['item'] for item in asyItems if item['type'] == 'xasyScript']
+
+            prefix = os.path.splitext(self.fileName)[0]
+            asyFilePath = prefix + '.asy'
+
+            saveAsyFile = io.open(asyFilePath, 'w')
+            xf.saveFile(saveAsyFile, asyScriptItems, self.asy2psmap)
+            saveAsyFile.close()
+            self.updateScript()
+
+        openFile = open(file, 'wb')
+        pickle.dump(xasyObjects, openFile)
+        openFile.close()
+
+    def actionLoadXasy(self, file):
+        self.erase()
+        self.ui.statusbar.showMessage('Load {0}'.format(file)) # TODO: This doesn't show on the UI
+        self.fileName = file
+        self.currDir = os.path.dirname(self.fileName)
+
+        input_file = open(file, 'rb')
+        xasyObjects = pickle.load(input_file)
+        input_file.close()
+
+        prefix = os.path.splitext(self.fileName)[0]
+        asyFilePath = prefix + '.asy'
+        rawText = None
+        existsAsy = False
+
+        if os.path.isfile(asyFilePath):
+            asyFile = io.open(asyFilePath, 'r')
+            rawText = asyFile.read()
+            asyFile.close()
+            rawText, transfDict = xf.extractTransformsFromFile(rawText)
+            obj = x2a.xasyScript(canvas=self.xasyDrawObj, engine=self.asyEngine, transfKeyMap=transfDict)
+            obj.setScript(rawText)
+            self.fileItems.append(obj)
+            existsAsy = True
+
+        self.asyfyCanvas(force=True)
+
+        for item in xasyObjects['objects']:
+            key=item['transfKey']
+            if(key) in obj.transfKeymap.keys():
+                continue
+            obj.maxKey=max(obj.maxKey,int(key))
+            if item['type'] == 'xasyScript':
+                print("Uh oh, there should not be any asy objects loaded")
+
+            elif item['type'] == 'xasyText':
+                self.addXasyTextFromData( text = item['text'],
+                        location = item['location'], pen = None,
+                        transform = x2a.asyTransform(item['transform']), key = item['transfKey'],
+                        align = item['align'], fontSize = item['fontSize']
+                        )
+
+            elif item['type'] == 'xasyShape':
+                nodeSet = item['nodes']
+                linkSet = item['links']
+                path = x2a.asyPath(self.asyEngine)
+                path.initFromNodeList(nodeSet, linkSet)
+                self.addXasyShapeFromPath(path, pen = item['pen'], transform = x2a.asyTransform(item['transform']), key = item['transfKey'])
+            else:
+                print("ERROR")
+
+        self.asy2psmap = x2a.asyTransform(xasyObjects['asy2psmap'])
+        self.globalObjectCounter = obj.maxKey+1
+
+        self.asyfyCanvas()
+
+        if existsAsy:
+            self.ui.statusbar.showMessage(f"Corresponding Asymptote File '{os.path.basename(asyFilePath)}' found.  Loaded both files.")
+        else:
+            self.ui.statusbar.showMessage("No Asymptote file found.  Loaded exclusively GUI objects.")
+
     def loadKeyMaps(self):
         """Inverts the mapping of the key
            Input map is in format 'Action' : 'Key Sequence' """
@@ -865,28 +1114,147 @@
 
     def erase(self):
         self.fileItems.clear()
+        self.hiddenKeys.clear()
+        self.undoRedoStack.clear()
+        self.checkUndoRedoButtons()
         self.fileChanged = False
 
-    def actionOpen(self):
+    #We include this function to keep the general program flow consistent
+    def closeEvent(self, event):
+        if self.actionClose() == Qw.QMessageBox.Cancel:
+            event.ignore()
+
+    def actionNewFile(self):
         if self.fileChanged:
-            save="Save current file?"
-            reply=Qw.QMessageBox.question(self,'Message',save,Qw.QMessageBox.Yes,
-                                        Qw.QMessageBox.No)
+            reply = self.saveDialog()
             if reply == Qw.QMessageBox.Yes:
                 self.actionSave()
+            elif reply == Qw.QMessageBox.Cancel:
+                return
+        self.erase()
+        self.asyfyCanvas(force=True)
+        self.fileName = None
+        self.updateTitle()
 
-        filename = Qw.QFileDialog.getOpenFileName(self, 'Open Asymptote File','', '*.asy')
-        if filename[0]:
-            self.loadFile(filename[0])
 
+    def actionOpen(self, fileName = None):
+        if self.fileChanged:
+            reply = self.saveDialog()
+            if reply == Qw.QMessageBox.Yes:
+                self.actionSave()
+            elif reply == Qw.QMessageBox.Cancel:
+                return
+
+        if fileName:
+            # Opening via open recent or cmd args
+            _, file_extension = os.path.splitext(fileName)
+            if file_extension == '.xasy':
+                self.actionLoadXasy(fileName)
+            else:
+                self.loadFile(fileName)
+            self.populateOpenRecent(fileName)
+        else:
+            filename = Qw.QFileDialog.getOpenFileName(self, 'Open Xasy/Asymptote File','', '(*.xasy *.asy)')
+            if filename[0]:
+                _, file_extension = os.path.splitext(filename[0])
+                if file_extension == '.xasy':
+                    self.actionLoadXasy(filename[0])
+                else:
+                    self.loadFile(filename[0])
+
+            self.populateOpenRecent(filename[0].strip())
+
+    def actionClearRecent(self):
+        self.ui.menuOpenRecent.clear()
+        self.openRecent.clear()
+        self.ui.menuOpenRecent.addAction("Clear", self.actionClearRecent)
+
+    def populateOpenRecent(self, recentOpenedFile = None):
+        self.ui.menuOpenRecent.clear()
+        if recentOpenedFile:
+            self.openRecent.insert(recentOpenedFile)
+        for count, path in enumerate(self.openRecent.pathList):
+            if count > 8:
+                break
+            action = Qw.QAction(path, self, triggered = lambda state, path = path: self.actionOpen(fileName = path))
+            self.ui.menuOpenRecent.addAction(action)
+        self.ui.menuOpenRecent.addSeparator()
+        self.ui.menuOpenRecent.addAction("Clear", self.actionClearRecent)
+
+    def saveDialog(self) -> bool:
+        save = "Save current file?"
+        replyBox = Qw.QMessageBox()
+        replyBox.setText("Save current file?")
+        replyBox.setWindowTitle("Message")
+        replyBox.setStandardButtons(Qw.QMessageBox.Yes | Qw.QMessageBox.No | Qw.QMessageBox.Cancel)
+        reply = replyBox.exec()
+
+        return reply
+
+    def actionClose(self):
+        if self.fileChanged:
+            reply = self.saveDialog()
+            if reply == Qw.QMessageBox.Yes:
+                self.actionSave()
+                Qc.QCoreApplication.quit()
+            elif reply == Qw.QMessageBox.No:
+                Qc.QCoreApplication.quit()
+            else:
+                return reply
+        else:
+            Qc.QCoreApplication.quit()
+
     def actionSave(self):
-        if self.filename is None:
+        if self.fileName is None:
             self.actionSaveAs()
+
         else:
-            saveFile = io.open(self.filename, 'w')
-            xf.saveFile(saveFile, self.fileItems, self.asy2psmap)
-            saveFile.close()
+            _, file_extension = os.path.splitext(self.fileName)
+            if file_extension == ".asy":
+                if self.existsXasy():
+                    warning = "Choose save format. Note that objects saved in asy format cannot be edited graphically."
+                    replyBox = Qw.QMessageBox()
+                    replyBox.setWindowTitle('Warning')
+                    replyBox.setText(warning)
+                    replyBox.addButton("Save as .xasy", replyBox.NoRole)
+                    replyBox.addButton("Save as .asy", replyBox.YesRole)
+                    replyBox.addButton(Qw.QMessageBox.Cancel)
+                    reply = replyBox.exec()
+                    if reply == 1:
+                        saveFile = io.open(self.fileName, 'w')
+                        xf.saveFile(saveFile, self.fileItems, self.asy2psmap)
+                        saveFile.close()
+                        self.ui.statusbar.showMessage('File saved as {}'.format(self.fileName))
+                        self.fileChanged = False
+                    elif reply == 0:
+                        prefix = os.path.splitext(self.fileName)[0]
+                        xasyFilePath = prefix + '.xasy'
+                        if os.path.isfile(xasyFilePath):
+                            warning = f'"{os.path.basename(xasyFilePath)}" already exists.  Do you want to overwrite it?'
+                            reply = Qw.QMessageBox.question(self, "Same File", warning, Qw.QMessageBox.No, Qw.QMessageBox.Yes)
+                            if reply == Qw.QMessageBox.No:
+                                return
+
+                        self.actionExportXasy(xasyFilePath)
+                        self.fileName = xasyFilePath
+                        self.ui.statusbar.showMessage('File saved as {}'.format(self.fileName))
+                        self.fileChanged = False
+                    else:
+                        return
+
+                else:
+                    saveFile = io.open(self.fileName, 'w')
+                    xf.saveFile(saveFile, self.fileItems, self.asy2psmap)
+                    saveFile.close()
+                    self.fileChanged = False
+            elif file_extension == ".xasy":
+                self.actionExportXasy(self.fileName)
+                self.ui.statusbar.showMessage('File saved as {}'.format(self.fileName))
+                self.fileChanged = False
+            else:
+                print("ERROR: file extension not supported")
             self.updateScript()
+            self.updateTitle()
 
     def updateScript(self):
         for item in self.fileItems:
@@ -895,16 +1263,31 @@
                     item.setScript(item.updatedCode)
                     item.updatedCode = None
 
+    def existsXasy(self):
+        for item in self.fileItems:
+            if not isinstance(item, x2a.xasyScript):
+                return True
+        return False
+
     def actionSaveAs(self):
-        saveLocation = Qw.QFileDialog.getSaveFileName(self, 'Save File')[0]
+        initSave = os.path.splitext(str(self.fileName))[0]+'.xasy'
+        saveLocation = Qw.QFileDialog.getSaveFileName(self, 'Save File', initSave, "Xasy File (*.xasy)")[0]
         if saveLocation:
-            saveFile = io.open(saveLocation, 'w')
-            xf.saveFile(saveFile, self.fileItems, self.asy2psmap)
-            saveFile.close()
-            self.filename = saveLocation
+            _, file_extension = os.path.splitext(saveLocation)
+            if not file_extension:
+                saveLocation += '.xasy'
+                self.actionExportXasy(saveLocation)
+            elif file_extension == ".xasy":
+                self.actionExportXasy(saveLocation)
+            else:
+                print("ERROR: file extension not supported")
+            self.fileName = saveLocation
             self.updateScript()
-            
+            self.fileChanged = False
+            self.updateTitle()
+            self.populateOpenRecent(saveLocation)
 
+
     def btnQuickScreenshotOnClick(self):
         saveLocation = Qw.QFileDialog.getSaveFileName(self, 'Save Screenshot','')
         if saveLocation[0]:
@@ -913,6 +1296,9 @@
     def btnLoadFileonClick(self):
         self.actionOpen()
 
+    def btnCloseFileonClick(self):
+        self.actionClose()
+
     def btnSaveonClick(self):
         self.actionSave()
 
@@ -933,7 +1319,7 @@
             self._currentPen.setColorFromQColor(self.colorDialog.selectedColor())
             self.updateFrameDispColor()
 
-    def txtLineWithEdited(self, text):
+    def txtLineWidthEdited(self, text):
         new_val = xu.tryParse(text, float)
         if new_val is not None:
             if new_val > 0:
@@ -985,12 +1371,12 @@
 
     def mouseMoveEvent(self, mouseEvent: Qg.QMouseEvent):  # TODO: Actually refine grid snapping...
         if not self.ui.imgLabel.underMouse() and not self.mouseDown:
-            return 
+            return
 
         self.updateMouseCoordLabel()
         asyPos, canvasPos = self.getAsyCoordinates()
 
-        # add mode 
+        # add mode
         if self.addMode is not None:
             if self.addMode.active:
                 self.addMode.mouseMove(asyPos, mouseEvent)
@@ -1016,7 +1402,7 @@
             self.quickUpdate()
             return
 
-        # otherwise, in transformation 
+        # otherwise, in transformation
         if self.inMidTransformation:
             if self.currentModeStack[-1] == SelectionMode.translate:
                 newPos = canvasPos - self.savedMousePosition
@@ -1080,11 +1466,11 @@
                 self.pendingSelectedObjList.clear()
                 self.pendingSelectedObjIndex = -1
             self.quickUpdate()
-            return 
+            return
 
 
     def mouseReleaseEvent(self, mouseEvent):
-        assert isinstance(mouseEvent, Qg.QMouseEvent) 
+        assert isinstance(mouseEvent, Qg.QMouseEvent)
         if not self.mouseDown:
             return
 
@@ -1124,8 +1510,7 @@
         keyModifiers = keyModifiers | defaultModifiers
         if keyModifiers & int(Qc.Qt.ControlModifier):
             oldMag = self.magnification
-
-            factor=0.5/devicePixelRatio;
+            factor = 0.5/devicePixelRatio
             cx, cy = self.canvSize.width()*factor, self.canvSize.height()*factor
             centerPoint = Qc.QPointF(cx, cy) * self.getScrsTransform().inverted()[0]
 
@@ -1203,7 +1588,7 @@
         if self.addMode is not None:
             if self.addMode.active and isinstance(self.addMode, InplaceAddObj.AddBezierShape):
                 bezierException = True
-                
+
         if not self.ui.imgLabel.underMouse() and not bezierException:
             return
 
@@ -1252,7 +1637,15 @@
         self.addMode = None
         self.deleteAddOptions()
 
-    def editFinalized(self):
+    def editAccepted(self, obj, objIndex):
+        self.undoRedoStack.add(self.createAction(
+            EditBezierChanges(obj, objIndex,
+                    self.addMode.asyPathBackup,
+                    self.addMode.asyPath
+            )
+        ))
+        self.checkUndoRedoButtons()
+
         self.addMode.forceFinalize()
         self.removeAddMode()
         self.fileChanged = True
@@ -1260,7 +1653,10 @@
 
     def editRejected(self):
         self.addMode.resetObj()
-        self.editFinalized()
+        self.addMode.forceFinalize()
+        self.removeAddMode()
+        self.fileChanged = True
+        self.quickUpdate()
 
     def setupSelectEdit(self):
         """For Select-Edit mode. For now, if the object selected is a bezier curve, opens up a bezier editor"""
@@ -1270,12 +1666,20 @@
             # bezier path
             self.addMode = xbi.InteractiveBezierEditor(self, obj, self.currAddOptions)
             self.addMode.objectUpdated.connect(self.objectUpdated)
-            self.addMode.editAccepted.connect(self.editFinalized)
+            self.addMode.editAccepted.connect(lambda: self.editAccepted(obj, maj))
             self.addMode.editRejected.connect(self.editRejected)
             self.updateOptionWidget()
             self.currentModeStack[-1] = SelectionMode.selectEdit
             self.fileChanged = True
+        elif isinstance(obj, x2a.xasyText):
+            newText = self.setTextPrompt()
+            if newText:
+                self.drawObjects.remove(obj.generateDrawObjects(False))
+                obj.label.setText(newText)
+                self.drawObjects.append(obj.generateDrawObjects(True))
+                self.fileChanged = True
         else:
+            self.ui.statusbar.showMessage('Warning: Selected object cannot be edited')
             self.clearSelection()
         self.quickUpdate()
 
@@ -1359,7 +1763,7 @@
         # but it's much more work...
         newCenter = self.magnification * newCenter
         self.panOffset = [-newCenter.x(), newCenter.y()]
-        
+
         self.quickUpdate()
 
     def selectObject(self):
@@ -1410,7 +1814,7 @@
     def getWindowCoordinates(self):
         # assert self.ui.imgLabel.underMouse()
         return self.mapFromGlobal(Qg.QCursor.pos())
-        
+
     def refreshCanvas(self):
         if self.mainCanvas.isActive():
             self.mainCanvas.end()
@@ -1430,10 +1834,12 @@
         self.coordLabel.setText('{0:.2f}, {1:.2f}    '.format(nx, ny))
 
     def quickUpdate(self):
+        # TODO: Some documentation here would be nice since this is one of the
+        # main functions that gets called everywhere.
         self.updateMouseCoordLabel()
         self.refreshCanvas()
 
-        self.preDraw(self.mainCanvas)
+        self.preDraw(self.mainCanvas) # coordinates/background
         self.quickDraw()
 
         self.mainCanvas.end()
@@ -1440,6 +1846,8 @@
         self.postDraw()
         self.updateScreen()
 
+        self.updateTitle()
+
     def quickDraw(self):
         assert self.isReady()
         dpi = self.magnification * self.dpi
@@ -1466,7 +1874,7 @@
             if self.pendingSelectedObjList:
                 maj, minor = self.pendingSelectedObjList[self.pendingSelectedObjIndex]
                 self.drawObjects[maj][minor].draw(canvas=self.mainCanvas, dpi=dpi)
-            # and apply the preview too... 
+            # and apply the preview too...
             elif activeItem is not None:
                 if self.useGlobalCoords:
                     activeItem.draw(self.newTransform, canvas=self.mainCanvas, dpi=dpi)
@@ -1474,6 +1882,17 @@
                     activeItem.draw(self.newTransform, applyReverse=True, canvas=self.mainCanvas, dpi=dpi)
                 activeItem = None
 
+    def updateTitle(self):
+        # TODO: Undo redo doesn't update appropriately. Have to find a fix for this.
+        title = ''
+        if self.fileName:
+            title += os.path.basename(self.fileName)
+        else:
+            title += "[Not Saved]"
+        if self.fileChanged:
+            title += ' *'
+        self.setWindowTitle(title)
+
     def updateScreen(self):
         self.finalPixmap = Qg.QPixmap(self.canvSize)
         self.finalPixmap.setDevicePixelRatio(devicePixelRatio)
@@ -1502,6 +1921,7 @@
         for x in np.arange(0, 2 * x_range + 1, majorGrid):  # have to do
             # this in two stages...
             preCanvas.setPen(minorGridCol)
+            self.makePenCosmetic(preCanvas)
             for xMinor in range(1, minorGridCount + 1):
                 xCoord = x + ((xMinor / (minorGridCount + 1)) * majorGrid)
                 preCanvas.drawLine(Qc.QLine(xCoord, -9999, xCoord, 9999))
@@ -1509,6 +1929,7 @@
 
         for y in np.arange(0, 2 * y_range + 1, majorGrid):
             preCanvas.setPen(minorGridCol)
+            self.makePenCosmetic(preCanvas)
             for yMinor in range(1, minorGridCount + 1):
                 yCoord = y + ((yMinor / (minorGridCount + 1)) * majorGrid)
                 preCanvas.drawLine(Qc.QLine(-9999, yCoord, 9999, yCoord))
@@ -1515,11 +1936,13 @@
                 preCanvas.drawLine(Qc.QLine(-9999, -yCoord, 9999, -yCoord))
 
             preCanvas.setPen(majorGridCol)
+            self.makePenCosmetic(preCanvas)
             preCanvas.drawLine(Qc.QLine(-9999, y, 9999, y))
             preCanvas.drawLine(Qc.QLine(-9999, -y, 9999, -y))
 
         for x in np.arange(0, 2 * x_range + 1, majorGrid):
             preCanvas.setPen(majorGridCol)
+            self.makePenCosmetic(preCanvas)
             preCanvas.drawLine(Qc.QLine(x, -9999, x, 9999))
             preCanvas.drawLine(Qc.QLine(-x, -9999, -x, 9999))
 
@@ -1568,6 +1991,7 @@
 
         if self.drawAxes:
             preCanvas.setPen(Qc.Qt.gray)
+            self.makePenCosmetic(preCanvas)
             preCanvas.drawLine(Qc.QLine(-9999, 0, 9999, 0))
             preCanvas.drawLine(Qc.QLine(0, -9999, 0, 9999))
 
@@ -1590,13 +2014,14 @@
                     painter.setPen(self.currentPen.toQPen())
                     painter.drawPath(self.addMode.getPreview())
                 self.addMode.postDrawPreview(painter)
-                
 
+
     def drawTransformPreview(self, painter):
         if self.currentBoundingBox is not None and self.currentlySelectedObj['selectedIndex'] is not None:
             painter.save()
             maj, minor = self.currentlySelectedObj['selectedIndex']
             selObj = self.drawObjects[maj][minor]
+            self.makePenCosmetic(painter)
             if not self.useGlobalCoords:
                 painter.save()
                 painter.setTransform(
@@ -1621,6 +2046,7 @@
         with Qg.QPainter(self.postCanvasPixmap) as postCanvas:
             postCanvas.setRenderHints(self.mainCanvas.renderHints())
             postCanvas.setTransform(self.getScrsTransform())
+            # self.makePenCosmetic(postCanvas)
 
             self.drawTransformPreview(postCanvas)
 
@@ -1627,7 +2053,7 @@
             if self.pendingSelectedObjList:
                 maj, minor = self.pendingSelectedObjList[self.pendingSelectedObjIndex]
                 postCanvas.drawRect(self.drawObjects[maj][minor].boundingBox)
-                
+
             self.drawAddModePreview(postCanvas)
 
             if self.customAnchor is not None and self.anchorMode == AnchorMode.customAnchor:
@@ -1657,11 +2083,29 @@
             activeBtn = self.ui.btnDeleteMode
         elif self.currentModeStack[-1] == SelectionMode.selectEdit:
             activeBtn = self.ui.btnSelectEdit
+        elif self.currentModeStack[-1] == SelectionMode.openPoly:
+            activeBtn = self.ui.btnOpenPoly
+        elif self.currentModeStack[-1] == SelectionMode.closedPoly:
+            activeBtn = self.ui.btnClosedPoly
+        elif self.currentModeStack[-1] == SelectionMode.openCurve:
+            activeBtn = self.ui.btnOpenCurve
+        elif self.currentModeStack[-1] == SelectionMode.closedCurve:
+            activeBtn = self.ui.btnClosedCurve
+        elif self.currentModeStack[-1] == SelectionMode.addPoly:
+            activeBtn = self.ui.btnAddPoly
+        elif self.currentModeStack[-1] == SelectionMode.addCircle:
+            activeBtn = self.ui.btnAddCircle
+        elif self.currentModeStack[-1] == SelectionMode.addLabel:
+            activeBtn = self.ui.btnAddLabel
+        elif self.currentModeStack[-1] == SelectionMode.addFreehand:
+            activeBtn = self.ui.btnAddFreehand
         else:
             activeBtn = None
 
-        
+
         disableFill = isinstance(self.addMode, InplaceAddObj.AddBezierShape) and not self.currAddOptions['closedPath']
+        if isinstance(self.addMode, xbi.InteractiveBezierEditor):
+            disableFill = disableFill or not (self.addMode.obj.path.nodeSet[-1] == "cycle")
         self.ui.btnFill.setEnabled(not disableFill)
         if disableFill and self.ui.btnFill.isEnabled():
             self.ui.btnFill.setChecked(not disableFill)
@@ -1670,6 +2114,14 @@
         for button in self.modeButtons:
             button.setChecked(button is activeBtn)
 
+        if activeBtn in [self.ui.btnDeleteMode,self.ui.btnSelectEdit]:
+            self.ui.btnAlignX.setEnabled(False)
+            self.ui.btnAlignY.setEnabled(False)
+        else:
+            self.ui.btnAlignX.setEnabled(True)
+            self.ui.btnAlignY.setEnabled(True)
+
+
     def updateChecks(self):
         self.removeAddMode()
         self.updateModeBtnsOnly()
@@ -1676,16 +2128,22 @@
         self.quickUpdate()
 
     def btnAlignXOnClick(self, checked):
-        self.lockY = checked
-        if self.lockX:
-            self.lockX = False
-            self.ui.btnAlignY.setChecked(False)
+        if self.currentModeStack[0] in [SelectionMode.selectEdit,SelectionMode.delete]:
+            self.ui.btnAlignX.setChecked(False)
+        else:
+            self.lockY = checked
+            if self.lockX:
+                self.lockX = False
+                self.ui.btnAlignY.setChecked(False)
 
     def btnAlignYOnClick(self, checked):
-        self.lockX = checked
-        if self.lockY:
-            self.lockY = False
-            self.ui.btnAlignX.setChecked(False)
+        if self.currentModeStack[0] in [SelectionMode.selectEdit,SelectionMode.delete]:
+            self.ui.btnAlignY.setChecked(False)
+        else:
+            self.lockX = checked
+            if self.lockY:
+                self.lockY = False
+                self.ui.btnAlignX.setChecked(False)
 
     def btnAnchorModeOnClick(self):
         if self.currentModeStack[-1] != SelectionMode.setAnchor:
@@ -1704,22 +2162,31 @@
         self.updateChecks()
 
     def btnRotateOnClick(self):
-        self.currentModeStack = [SelectionMode.rotate]
-        self.ui.statusbar.showMessage('Rotate mode')
-        self.clearSelection()
-        self.updateChecks()
+        if self.currentModeStack[-1] != SelectionMode.rotate:
+            self.currentModeStack = [SelectionMode.rotate]
+            self.ui.statusbar.showMessage('Rotate mode')
+            self.clearSelection()
+            self.updateChecks()
+        else:
+            self.btnTranslateonClick()
 
     def btnScaleOnClick(self):
-        self.currentModeStack = [SelectionMode.scale]
-        self.ui.statusbar.showMessage('Scale mode')
-        self.clearSelection()
-        self.updateChecks()
+        if self.currentModeStack[-1] != SelectionMode.scale:
+            self.currentModeStack = [SelectionMode.scale]
+            self.ui.statusbar.showMessage('Scale mode')
+            self.clearSelection()
+            self.updateChecks()
+        else:
+            self.btnTranslateonClick()
 
     def btnPanOnClick(self):
-        self.currentModeStack = [SelectionMode.pan]
-        self.ui.statusbar.showMessage('Pan mode')
-        self.clearSelection()
-        self.updateChecks()
+        if self.currentModeStack[-1] != SelectionMode.pan:
+            self.currentModeStack = [SelectionMode.pan]
+            self.ui.statusbar.showMessage('Pan mode')
+            self.clearSelection()
+            self.updateChecks()
+        else:
+            self.btnTranslateonClick()
 
     def btnWorldCoordsOnClick(self, checked):
         self.useGlobalCoords = checked
@@ -1754,24 +2221,26 @@
         self.quickUpdate()
 
     def btnLoadEditorOnClick(self):
+        pathToFile = os.path.splitext(self.fileName)[0]+'.asy'
         if self.fileChanged:
             save = "Save current file?"
             reply = Qw.QMessageBox.question(self, 'Message', save, Qw.QMessageBox.Yes,
                                             Qw.QMessageBox.No)
             if reply == Qw.QMessageBox.Yes:
-                self.actionSave()
-                
-        subprocess.Popen(args=self.getExternalEditor(asypath=self.filename));
+                self.actionExport(pathToFile)
 
+        subprocess.run(args=self.getExternalEditor(asypath=pathToFile));
+        self.loadFile(pathToFile)
+
     def btnAddCodeOnClick(self):
         header = """
-// xasy object created at $time 
+// xasy object created at $time
 // Object Number: $uid
-// This header is automatically generated by xasy. 
+// This header is automatically generated by xasy.
 // Your code here
 """
         header = string.Template(header).substitute(time=str(datetime.datetime.now()), uid=str(self.globalObjectCounter))
-                
+
         with tempfile.TemporaryDirectory() as tmpdir:
             newPath = os.path.join(tmpdir, 'tmpcode.asy')
             f = io.open(newPath, 'w')
@@ -1791,6 +2260,7 @@
         self.asyfyCanvas()
 
         self.globalObjectCounter = self.globalObjectCounter + 1
+
     def softDeleteObj(self, objKey):
         maj, minor = objKey
         drawObj = self.drawObjects[maj][minor]
@@ -1869,7 +2339,7 @@
             s = editor.split()
             rawExternalEditor = s[0]
             rawExtEditorArgs = s[1:]+["$asypath"]
-            
+
         execEditor = [rawExternalEditor]
 
         for arg in rawExtEditorArgs:
@@ -1881,7 +2351,9 @@
     def loadFile(self, name):
         filename = os.path.abspath(name)
         if not os.path.isfile(filename):
-            filename = filename + '.asy'
+            parts = os.path.splitext(filename)
+            if parts[1] == '':
+                filename = parts[0] + '.asy'
 
         if not os.path.isfile(filename):
             self.ui.statusbar.showMessage('File {0} not found'.format(filename))
@@ -1888,27 +2360,28 @@
             return
 
         self.ui.statusbar.showMessage('Load {0}'.format(filename))
-        self.filename = filename
-        self.currDir = os.path.dirname(self.filename)
+        self.fileName = filename
+        self.asyFileName = filename
+        self.currDir = os.path.dirname(self.fileName)
 
         self.erase()
 
-        f = open(self.filename, 'rt')
+        f = open(self.fileName, 'rt')
         try:
             rawFileStr = f.read()
         except IOError:
             Qw.QMessageBox.critical(self, self.strings.fileOpenFailed, self.strings.fileOpenFailedText)
         else:
-            rawText, transfDict, maxKey = xf.extractTransformsFromFile(rawFileStr)
+            rawText, transfDict = xf.extractTransformsFromFile(rawFileStr)
             item = x2a.xasyScript(canvas=self.xasyDrawObj, engine=self.asyEngine, transfKeyMap=transfDict)
 
             item.setScript(rawText)
             self.fileItems.append(item)
-            self.asyfyCanvas(True)
+            self.asyfyCanvas(force=True)
 
-            maxKey2 = item.getMaxKeyCounter()
+            self.globalObjectCounter = item.maxKey+1
             self.asy2psmap = item.asy2psmap
-            self.globalObjectCounter = max(maxKey + 1, maxKey2)
+
         finally:
             f.close()
 
@@ -1916,3 +2389,37 @@
         self.itemCount = 0
         for item in self.fileItems:
             self.drawObjects.append(item.generateDrawObjects(forceUpdate))
+
+    def makePenCosmetic(self, painter):
+        localPen = painter.pen()
+        localPen.setCosmetic(True)
+        painter.setPen(localPen)
+
+    def copyItem(self):
+        self.selectOnHover()
+        if self.currentlySelectedObj['selectedIndex'] is not None:
+            maj, minor = self.currentlySelectedObj['selectedIndex']
+            if isinstance(self.fileItems[maj],x2a.xasyShape) or isinstance(self.fileItems[maj],x2a.xasyText):
+                self.copiedObject = self.fileItems[maj].copy()
+            else:
+                self.ui.statusbar.showMessage('Copying not supported with current item type')
+        else:
+            self.ui.statusbar.showMessage('No object selected to copy')
+            self.copiedObject = None
+        self.clearSelection()
+
+    def pasteItem(self):
+        if hasattr(self, 'copiedObject') and not self.copiedObject is None:
+            self.copiedObject = self.copiedObject.copy()
+            self.addInPlace(self.copiedObject)
+            mousePos = self.getWindowCoordinates() - self.copiedObject.path.toQPainterPath().boundingRect().center() - (Qc.QPointF(self.canvSize.width(), self.canvSize.height()) + Qc.QPointF(62, 201))/2 #I don't really know what that last constant is? Is it the size of the framing?
+            newTransform = Qg.QTransform.fromTranslate(mousePos.x(), mousePos.y())
+            self.currentlySelectedObj['selectedIndex'] = (self.globalObjectCounter - 1,0)
+            self.currentlySelectedObj['key'],  self.currentlySelectedObj['allSameKey'] = self.selectObjectSet()
+            newTransform = x2a.asyTransform.fromQTransform(newTransform)
+            objKey = self.currentlySelectedObj['selectedIndex']
+            self.addTransformationChanges(objKey, newTransform, not self.useGlobalCoords)
+            self.transformObject(objKey, newTransform, not self.useGlobalCoords)
+            self.quickUpdate()
+        else:
+            self.ui.statusbar.showMessage('No object to paste')

Modified: trunk/Build/source/utils/asymptote/GUI/configs/xasyconfig.cson
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/configs/xasyconfig.cson	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/configs/xasyconfig.cson	2022-01-08 18:39:01 UTC (rev 61532)
@@ -45,6 +45,9 @@
 gridMajorAxesSpacing: 5
 gridMinorAxesCount: 9
 
+# Number of pixels per bp in 3D rendered bitmaps
+renderDensity: 2
+
 # Magnification Settings
 minimumMagnification: 0.01
 maximumMagnification: 100

Modified: trunk/Build/source/utils/asymptote/GUI/configs/xasykeymap.cson
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/configs/xasykeymap.cson	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/configs/xasykeymap.cson	2022-01-08 18:39:01 UTC (rev 61532)
@@ -23,4 +23,11 @@
 scrollRight: 'Shift+Right'
 
 zoomIn: 'Ctrl+Up'
-zoomOut: 'Ctrl+Down'
\ No newline at end of file
+zoomOut: 'Ctrl+Down'
+
+open: 'Ctrl+O'
+save: 'Ctrl+S'
+export: 'Ctrl+E'
+
+copy: 'Ctrl+C'
+paste: 'Ctrl+V'

Deleted: trunk/Build/source/utils/asymptote/GUI/icons_rc.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/icons_rc.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/icons_rc.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,2721 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Resource object code
-#
-# Created by: The Resource Compiler for PyQt5 (Qt v5.12.5)
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt5 import QtCore
-
-qt_resource_data = b"\
-\x00\x00\x04\xa2\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
-\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
-\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
-\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
-\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
-\x38\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\x73\x69\
-\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x36\x33\
-\x2e\x39\x39\x39\x36\x70\x74\x27\x20\x68\x65\x69\x67\x68\x74\x3d\
-\x27\x36\x33\x2e\x39\x39\x39\x37\x70\x74\x27\x20\x76\x69\x65\x77\
-\x42\x6f\x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\
-\x38\x35\x38\x33\x20\x36\x33\x2e\x39\x39\x39\x36\x20\x36\x33\x2e\
-\x39\x39\x39\x37\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\
-\x67\x65\x31\x27\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
-\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
-\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
-\x20\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\
-\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x33\
-\x2e\x39\x35\x37\x33\x35\x20\x2d\x33\x32\x2e\x31\x32\x43\x20\x34\
-\x2e\x31\x35\x35\x35\x36\x20\x2d\x33\x39\x2e\x32\x37\x34\x35\x20\
-\x36\x2e\x39\x38\x34\x37\x33\x20\x2d\x34\x36\x2e\x31\x30\x34\x37\
-\x20\x31\x31\x2e\x39\x30\x33\x36\x20\x2d\x35\x31\x2e\x33\x30\x33\
-\x39\x43\x20\x32\x37\x2e\x34\x34\x31\x31\x20\x2d\x36\x37\x2e\x37\
-\x32\x36\x39\x20\x35\x33\x2e\x33\x30\x32\x31\x20\x2d\x36\x31\x2e\
-\x35\x34\x30\x35\x20\x35\x36\x2e\x31\x35\x32\x33\x20\x2d\x34\x32\
-\x2e\x35\x30\x32\x32\x43\x20\x35\x37\x2e\x36\x32\x37\x20\x2d\x33\
-\x32\x2e\x36\x35\x31\x39\x20\x35\x30\x2e\x35\x38\x35\x36\x20\x2d\
-\x32\x33\x2e\x35\x36\x32\x31\x20\x34\x30\x2e\x36\x37\x39\x34\x20\
-\x2d\x32\x32\x2e\x35\x32\x38\x31\x27\x20\x66\x69\x6c\x6c\x3d\x27\
-\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\
-\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\
-\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\
-\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\
-\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\
-\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\
-\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\
-\x32\x2e\x35\x30\x39\x33\x37\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
-\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
-\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
-\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\x38\x2e\x34\x36\
-\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\x63\
-\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x33\x2e\x39\x35\x37\x33\
-\x35\x27\x20\x63\x79\x3d\x27\x2d\x33\x32\x2e\x31\x32\x27\x20\x66\
-\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x72\x3d\
-\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
-\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
-\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
-\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\x38\x2e\x34\x36\
-\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\x63\
-\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x31\x31\x2e\x39\x30\x33\
-\x36\x27\x20\x63\x79\x3d\x27\x2d\x35\x31\x2e\x33\x30\x33\x39\x27\
-\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\
-\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\
-\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
-\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
-\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\x38\x2e\
-\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\
-\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x35\x36\x2e\x31\
-\x35\x32\x33\x27\x20\x63\x79\x3d\x27\x2d\x34\x32\x2e\x35\x30\x32\
-\x32\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\
-\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\
-\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\
-\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\
-\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\
-\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\
-\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x34\x30\
-\x2e\x36\x37\x39\x34\x27\x20\x63\x79\x3d\x27\x2d\x32\x32\x2e\x35\
-\x32\x38\x31\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\
-\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\
-\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\
-\x3e\
-\x00\x00\x03\x0c\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x43\x68\x65\x63\x6b\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\
-\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\
-\x78\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\
-\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\
-\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\
-\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\
-\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
-\x4d\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x63\x2d\x30\
-\x2e\x34\x33\x35\x2c\x30\x2d\x30\x2e\x38\x34\x37\x2d\x30\x2e\x32\
-\x30\x33\x2d\x31\x2e\x31\x31\x31\x2d\x30\x2e\x35\x35\x33\x4c\x33\
-\x2e\x36\x31\x2c\x31\x31\x2e\x37\x32\x34\x63\x2d\x30\x2e\x34\x36\
-\x35\x2d\x30\x2e\x36\x31\x33\x2d\x30\x2e\x33\x34\x34\x2d\x31\x2e\
-\x34\x38\x36\x2c\x30\x2e\x32\x37\x2d\x31\x2e\x39\x35\x31\x0d\x0a\
-\x09\x63\x30\x2e\x36\x31\x35\x2d\x30\x2e\x34\x36\x37\x2c\x31\x2e\
-\x34\x38\x38\x2d\x30\x2e\x33\x34\x34\x2c\x31\x2e\x39\x35\x33\x2c\
-\x30\x2e\x32\x37\x6c\x32\x2e\x33\x35\x31\x2c\x33\x2e\x31\x30\x34\
-\x6c\x35\x2e\x39\x31\x31\x2d\x39\x2e\x34\x39\x32\x63\x30\x2e\x34\
-\x30\x37\x2d\x30\x2e\x36\x35\x32\x2c\x31\x2e\x32\x36\x37\x2d\x30\
-\x2e\x38\x35\x32\x2c\x31\x2e\x39\x32\x31\x2d\x30\x2e\x34\x34\x35\
-\x0d\x0a\x09\x63\x30\x2e\x36\x35\x33\x2c\x30\x2e\x34\x30\x36\x2c\
-\x30\x2e\x38\x35\x34\x2c\x31\x2e\x32\x36\x36\x2c\x30\x2e\x34\x34\
-\x36\x2c\x31\x2e\x39\x32\x4c\x39\x2e\x34\x37\x38\x2c\x31\x36\x2e\
-\x33\x34\x63\x2d\x30\x2e\x32\x34\x32\x2c\x30\x2e\x33\x39\x31\x2d\
-\x30\x2e\x36\x36\x31\x2c\x30\x2e\x36\x33\x35\x2d\x31\x2e\x31\x32\
-\x2c\x30\x2e\x36\x35\x36\x43\x38\x2e\x33\x33\x36\x2c\x31\x36\x2e\
-\x39\x39\x38\x2c\x38\x2e\x33\x31\x36\x2c\x31\x36\x2e\x39\x39\x38\
-\x2c\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x7a\x22\x2f\
-\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\xc4\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4d\x61\x67\x6e\x69\x66\x79\x69\x6e\x67\x5f\x67\x6c\x61\
-\x73\x73\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
-\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
-\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
-\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
-\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x79\x3d\x22\
-\x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\
-\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\
-\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\
-\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\
-\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
-\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
-\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x32\x34\x20\x30\x20\
-\x30\x20\x32\x34\x20\x30\x20\x30\x29\x27\x3e\x0d\x0a\x3c\x70\x61\
-\x74\x68\x20\x64\x3d\x22\x4d\x31\x37\x2e\x35\x34\x35\x2c\x31\x35\
-\x2e\x34\x36\x37\x6c\x2d\x33\x2e\x37\x37\x39\x2d\x33\x2e\x37\x37\
-\x39\x63\x30\x2e\x35\x37\x2d\x30\x2e\x39\x33\x35\x2c\x30\x2e\x38\
-\x39\x38\x2d\x32\x2e\x30\x33\x35\x2c\x30\x2e\x38\x39\x38\x2d\x33\
-\x2e\x32\x31\x63\x30\x2d\x33\x2e\x34\x31\x37\x2d\x32\x2e\x39\x36\
-\x31\x2d\x36\x2e\x33\x37\x37\x2d\x36\x2e\x33\x37\x38\x2d\x36\x2e\
-\x33\x37\x37\x0d\x0a\x09\x43\x34\x2e\x38\x36\x39\x2c\x32\x2e\x31\
-\x2c\x32\x2e\x31\x2c\x34\x2e\x38\x37\x2c\x32\x2e\x31\x2c\x38\x2e\
-\x32\x38\x37\x63\x30\x2c\x33\x2e\x34\x31\x36\x2c\x32\x2e\x39\x36\
-\x31\x2c\x36\x2e\x33\x37\x37\x2c\x36\x2e\x33\x37\x37\x2c\x36\x2e\
-\x33\x37\x37\x63\x31\x2e\x31\x33\x37\x2c\x30\x2c\x32\x2e\x32\x2d\
-\x30\x2e\x33\x30\x39\x2c\x33\x2e\x31\x31\x35\x2d\x30\x2e\x38\x34\
-\x34\x6c\x33\x2e\x37\x39\x39\x2c\x33\x2e\x38\x30\x31\x0d\x0a\x09\
-\x63\x30\x2e\x33\x37\x32\x2c\x30\x2e\x33\x37\x31\x2c\x30\x2e\x39\
-\x37\x35\x2c\x30\x2e\x33\x37\x31\x2c\x31\x2e\x33\x34\x36\x2c\x30\
-\x6c\x30\x2e\x39\x34\x33\x2d\x30\x2e\x39\x34\x33\x43\x31\x38\x2e\
-\x30\x35\x31\x2c\x31\x36\x2e\x33\x30\x37\x2c\x31\x37\x2e\x39\x31\
-\x36\x2c\x31\x35\x2e\x38\x33\x38\x2c\x31\x37\x2e\x35\x34\x35\x2c\
-\x31\x35\x2e\x34\x36\x37\x7a\x20\x4d\x34\x2e\x30\x30\x34\x2c\x38\
-\x2e\x32\x38\x37\x0d\x0a\x09\x63\x30\x2d\x32\x2e\x33\x36\x36\x2c\
-\x31\x2e\x39\x31\x37\x2d\x34\x2e\x32\x38\x33\x2c\x34\x2e\x32\x38\
-\x32\x2d\x34\x2e\x32\x38\x33\x63\x32\x2e\x33\x36\x36\x2c\x30\x2c\
-\x34\x2e\x34\x37\x34\x2c\x32\x2e\x31\x30\x37\x2c\x34\x2e\x34\x37\
-\x34\x2c\x34\x2e\x34\x37\x34\x63\x30\x2c\x32\x2e\x33\x36\x35\x2d\
-\x31\x2e\x39\x31\x38\x2c\x34\x2e\x32\x38\x33\x2d\x34\x2e\x32\x38\
-\x33\x2c\x34\x2e\x32\x38\x33\x0d\x0a\x09\x43\x36\x2e\x31\x31\x31\
-\x2c\x31\x32\x2e\x37\x36\x2c\x34\x2e\x30\x30\x34\x2c\x31\x30\x2e\
-\x36\x35\x32\x2c\x34\x2e\x30\x30\x34\x2c\x38\x2e\x32\x38\x37\x7a\
-\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\
-\x3e\x0d\x0a\
-\x00\x00\x01\x69\
-\x3c\
-\x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
-\x30\x2f\x73\x76\x67\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x35\x31\
-\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\x32\
-\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\
-\x20\x35\x31\x32\x20\x35\x31\x32\x22\x3e\x3c\x67\x20\x74\x72\x61\
-\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x32\
-\x34\x20\x30\x20\x30\x20\x32\x34\x20\x30\x20\x30\x29\x27\x3e\x3c\
-\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x2e\x33\x34\x20\x31\x35\
-\x2e\x36\x36\x41\x37\x2e\x39\x37\x20\x37\x2e\x39\x37\x20\x30\x20\
-\x30\x20\x30\x20\x39\x20\x31\x37\x2e\x39\x34\x56\x31\x30\x48\x35\
-\x56\x38\x68\x34\x56\x35\x2e\x38\x33\x61\x33\x20\x33\x20\x30\x20\
-\x31\x20\x31\x20\x32\x20\x30\x56\x38\x68\x34\x76\x32\x68\x2d\x34\
-\x76\x37\x2e\x39\x34\x61\x37\x2e\x39\x37\x20\x37\x2e\x39\x37\x20\
-\x30\x20\x30\x20\x30\x20\x34\x2e\x36\x36\x2d\x32\x2e\x32\x38\x6c\
-\x2d\x31\x2e\x34\x32\x2d\x31\x2e\x34\x32\x68\x35\x2e\x36\x36\x6c\
-\x2d\x32\x2e\x38\x33\x20\x32\x2e\x38\x33\x61\x31\x30\x20\x31\x30\
-\x20\x30\x20\x30\x20\x31\x2d\x31\x34\x2e\x31\x34\x20\x30\x4c\x2e\
-\x31\x20\x31\x34\x2e\x32\x34\x68\x35\x2e\x36\x36\x6c\x2d\x31\x2e\
-\x34\x32\x20\x31\x2e\x34\x32\x7a\x4d\x31\x30\x20\x34\x61\x31\x20\
-\x31\x20\x30\x20\x31\x20\x30\x20\x30\x2d\x32\x20\x31\x20\x31\x20\
-\x30\x20\x30\x20\x30\x20\x30\x20\x32\x7a\x22\x2f\x3e\x3c\x2f\x67\
-\x3e\x3c\x2f\x73\x76\x67\x3e\x0a\
-\x00\x00\x03\x7c\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
-\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
-\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
-\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
-\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
-\x38\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\x73\x69\
-\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x36\x33\
-\x2e\x39\x39\x39\x36\x70\x74\x27\x20\x68\x65\x69\x67\x68\x74\x3d\
-\x27\x36\x33\x2e\x39\x39\x39\x37\x70\x74\x27\x20\x76\x69\x65\x77\
-\x42\x6f\x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\
-\x38\x35\x38\x33\x20\x36\x33\x2e\x39\x39\x39\x36\x20\x36\x33\x2e\
-\x39\x39\x39\x37\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\
-\x67\x65\x31\x27\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
-\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
-\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
-\x20\x35\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\x35\x38\
-\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x32\
-\x2e\x30\x30\x37\x35\x20\x2d\x32\x2e\x30\x30\x37\x35\x4c\x20\x36\
-\x32\x2e\x32\x33\x32\x35\x20\x2d\x32\x2e\x30\x30\x37\x35\x4c\x20\
-\x36\x32\x2e\x32\x33\x32\x35\x20\x2d\x36\x32\x2e\x32\x33\x32\x35\
-\x4c\x20\x32\x2e\x30\x30\x37\x35\x20\x2d\x36\x32\x2e\x32\x33\x32\
-\x35\x4c\x20\x32\x2e\x30\x30\x37\x35\x20\x2d\x32\x2e\x30\x30\x37\
-\x35\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\
-\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\
-\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\
-\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\
-\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\
-\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\
-\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\
-\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x34\x2e\x30\x31\x35\x27\
-\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\
-\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\
-\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\
-\x36\x34\x20\x35\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\
-\x35\x38\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\
-\x20\x34\x37\x2e\x31\x37\x36\x32\x20\x2d\x33\x32\x2e\x31\x32\x43\
-\x20\x34\x37\x2e\x31\x37\x36\x32\x20\x2d\x34\x30\x2e\x34\x33\x35\
-\x33\x20\x34\x30\x2e\x34\x33\x35\x33\x20\x2d\x34\x37\x2e\x31\x37\
-\x36\x32\x20\x33\x32\x2e\x31\x32\x20\x2d\x34\x37\x2e\x31\x37\x36\
-\x32\x43\x20\x32\x33\x2e\x38\x30\x34\x37\x20\x2d\x34\x37\x2e\x31\
-\x37\x36\x32\x20\x31\x37\x2e\x30\x36\x33\x37\x20\x2d\x34\x30\x2e\
-\x34\x33\x35\x33\x20\x31\x37\x2e\x30\x36\x33\x37\x20\x2d\x33\x32\
-\x2e\x31\x32\x43\x20\x31\x37\x2e\x30\x36\x33\x37\x20\x2d\x32\x33\
-\x2e\x38\x30\x34\x37\x20\x32\x33\x2e\x38\x30\x34\x37\x20\x2d\x31\
-\x37\x2e\x30\x36\x33\x37\x20\x33\x32\x2e\x31\x32\x20\x2d\x31\x37\
-\x2e\x30\x36\x33\x37\x43\x20\x34\x30\x2e\x34\x33\x35\x33\x20\x2d\
-\x31\x37\x2e\x30\x36\x33\x37\x20\x34\x37\x2e\x31\x37\x36\x32\x20\
-\x2d\x32\x33\x2e\x38\x30\x34\x37\x20\x34\x37\x2e\x31\x37\x36\x32\
-\x20\x2d\x33\x32\x2e\x31\x32\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\
-\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
-\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x02\x21\
-\x00\
-\x00\x07\xaf\x78\x9c\xdd\x55\x4d\x6f\x9c\x30\x10\xbd\xf7\x57\x4c\
-\xd5\x83\xdb\x03\xc6\xdf\x86\x28\x24\x52\x57\xea\x29\xbd\x25\x97\
-\xde\x68\xf0\x82\x9b\x5d\x58\x01\x5d\xb6\xff\xbe\x66\xd7\x60\x4a\
-\xaa\xf4\x92\x43\x15\x90\x30\xf3\x18\xbf\x99\xe7\xf1\x98\xeb\xdb\
-\xd3\x7e\x07\x47\xd3\x76\xb6\xa9\x33\x44\x31\x41\x60\xea\xc7\xa6\
-\xb0\x75\x99\xa1\x87\xfb\x2f\x51\x82\x6e\x6f\xde\x5d\xbf\x8f\x22\
-\xb8\xaf\x6c\x07\x5b\xbb\x33\x30\xe4\x1d\x94\xa6\x36\x6d\xde\x9b\
-\x02\xbe\xff\x82\xe2\x68\xbb\x63\xb9\x07\x86\x13\x88\x22\xe7\xef\
-\xac\x25\x2b\x45\xe0\xe2\xd4\x5d\x86\xaa\xbe\x3f\x5c\xc5\xf1\x30\
-\x0c\x78\xe0\xb8\x69\xcb\x98\x11\x42\x62\xe7\xef\x5d\xae\x4e\x3b\
-\x5b\x3f\xfd\xcd\x91\xa6\x69\x1a\x9f\xbf\x22\x18\x6c\xd1\x57\x19\
-\x52\x1c\x3b\x50\x1d\x7a\x04\x95\xb1\x65\xd5\x4f\x90\x1e\xa1\xa3\
-\x35\xc3\xe7\xe6\x94\x21\xa9\xb0\x20\xa9\x00\xc9\x71\x22\x13\x0e\
-\x7e\x9a\x1f\x35\x72\x09\x97\x60\x8b\x0c\x1d\xf2\xd2\xd0\x8b\xd9\
-\xb7\x79\xdd\x6d\x9b\x76\x9f\xa1\x7d\xde\xb7\xf6\xf4\x91\x38\x67\
-\xc5\x94\x00\x32\xde\x93\x31\x71\x53\xaa\x47\xf2\x4f\xe3\xec\x43\
-\xde\x57\xe0\xe8\xbe\x42\x8a\xb9\xd0\x82\x41\xc4\x38\x26\x94\xde\
-\x05\xc0\xbf\x3c\x47\x36\xcf\x90\x7f\x03\x8b\x39\x12\x53\x29\x29\
-\x05\x9a\x62\x29\x38\x85\x88\x62\x2d\x95\x54\xc0\x19\xa6\x6c\x36\
-\x37\x20\x04\x56\xa9\x4a\x83\x83\x14\x38\x49\x99\x0a\x14\x33\x30\
-\xe7\xfa\x02\x32\x09\x9c\x01\xae\xb0\xd2\x42\x6e\x02\x22\x08\x4e\
-\x94\x4a\x42\x64\xf7\xc2\x94\x14\x53\x6a\xde\xdc\x84\xdc\x27\x87\
-\x59\xdd\x44\x31\x03\x3e\xca\xdd\x7a\xa5\xbf\xa1\x71\xab\xee\x32\
-\xf4\x41\x6f\xc7\x1b\xc5\xae\x2e\x71\xf9\x8a\xa5\x0d\x42\x53\xac\
-\x29\x49\x97\x42\xdd\xbe\x22\x9c\x2d\x84\x6a\xcc\x09\xd5\xb3\xd0\
-\x8b\xb9\x14\xea\x1d\x82\x50\x4f\x11\x84\x4e\x51\x02\x22\xb1\xa4\
-\x89\x0c\x24\x17\x76\x1f\xe3\x3c\x2c\xaa\x7c\x81\x43\xd2\x7e\xf2\
-\x5a\xc5\xbc\x6e\x75\x53\x1b\x04\x5d\xdf\x36\x4f\xc6\xad\x22\x39\
-\x5f\x13\x10\xb9\x2e\x34\x8f\xf9\x21\x43\x6d\xf3\xb3\x2e\xfe\x80\
-\x7f\x34\xb6\x5e\xe3\x7b\xdb\x9b\x76\x67\xdd\xe0\x4e\x03\x82\x09\
-\xd7\x72\xfe\xe6\x5b\x99\xbb\x7c\x38\x65\xaf\x5f\xa7\xf5\x0a\xbe\
-\xe1\x1e\xf4\x0a\xdf\x5c\x09\x5f\x68\x35\xc9\x30\x4b\xf4\xe2\x4c\
-\x51\x0c\x8b\x84\xcf\x67\x8a\x37\x17\xad\x36\x39\x84\x6a\x79\x8a\
-\xf5\x46\xf9\x6f\x96\xf1\xf2\x70\xbf\xc8\x9b\xdf\xf9\x80\xe2\xe1\
-\
-\x00\x00\x04\x1c\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
-\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
-\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
-\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
-\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
-\x38\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\x73\x69\
-\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x36\x33\
-\x2e\x39\x39\x39\x36\x70\x74\x27\x20\x68\x65\x69\x67\x68\x74\x3d\
-\x27\x36\x33\x2e\x39\x39\x39\x37\x70\x74\x27\x20\x76\x69\x65\x77\
-\x42\x6f\x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\
-\x38\x35\x38\x33\x20\x36\x33\x2e\x39\x39\x39\x36\x20\x36\x33\x2e\
-\x39\x39\x39\x37\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\
-\x67\x65\x31\x27\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
-\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
-\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
-\x20\x35\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\x35\x38\
-\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x32\
-\x2e\x30\x30\x37\x35\x20\x2d\x32\x2e\x30\x30\x37\x35\x4c\x20\x36\
-\x32\x2e\x32\x33\x32\x35\x20\x2d\x32\x2e\x30\x30\x37\x35\x4c\x20\
-\x36\x32\x2e\x32\x33\x32\x35\x20\x2d\x36\x32\x2e\x32\x33\x32\x35\
-\x4c\x20\x32\x2e\x30\x30\x37\x35\x20\x2d\x36\x32\x2e\x32\x33\x32\
-\x35\x4c\x20\x32\x2e\x30\x30\x37\x35\x20\x2d\x32\x2e\x30\x30\x37\
-\x35\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\
-\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\
-\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\
-\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\
-\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\
-\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\
-\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\
-\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x34\x2e\x30\x31\x35\x27\
-\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\
-\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\
-\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\
-\x36\x34\x20\x35\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\
-\x35\x38\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\
-\x20\x32\x2e\x30\x30\x37\x35\x20\x2d\x33\x32\x2e\x31\x32\x4c\x20\
-\x36\x32\x2e\x32\x33\x32\x35\x20\x2d\x33\x32\x2e\x31\x32\x27\x20\
-\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\
-\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\
-\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\
-\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\
-\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\
-\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\
-\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\
-\x69\x64\x74\x68\x3d\x27\x34\x2e\x30\x31\x35\x27\x2f\x3e\x0a\x3c\
-\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\
-\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\
-\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\
-\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\
-\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x33\x32\x2e\
-\x31\x32\x20\x2d\x32\x2e\x30\x30\x37\x35\x4c\x20\x33\x32\x2e\x31\
-\x32\x20\x2d\x36\x32\x2e\x32\x33\x32\x35\x27\x20\x66\x69\x6c\x6c\
-\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\
-\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\
-\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\
-\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\
-\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\
-\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\
-\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
-\x3d\x27\x34\x2e\x30\x31\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
-\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x02\xa1\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x53\x61\x76\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
-\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
-\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
-\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
-\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x35\x31\x32\x70\x78\x22\x20\
-\x79\x3d\x22\x35\x31\x32\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\
-\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\
-\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\
-\x32\x20\x35\x31\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\
-\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\
-\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\
-\x69\x78\x28\x32\x34\x20\x30\x20\x30\x20\x32\x34\x20\x30\x20\x30\
-\x29\x27\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\
-\x35\x2e\x31\x37\x33\x2c\x32\x48\x34\x43\x32\x2e\x38\x39\x39\x2c\
-\x32\x2c\x32\x2c\x32\x2e\x39\x2c\x32\x2c\x34\x76\x31\x32\x63\x30\
-\x2c\x31\x2e\x31\x2c\x30\x2e\x38\x39\x39\x2c\x32\x2c\x32\x2c\x32\
-\x68\x31\x32\x63\x31\x2e\x31\x30\x31\x2c\x30\x2c\x32\x2d\x30\x2e\
-\x39\x2c\x32\x2d\x32\x56\x35\x2e\x31\x32\x37\x4c\x31\x35\x2e\x31\
-\x37\x33\x2c\x32\x7a\x20\x4d\x31\x34\x2c\x38\x63\x30\x2c\x30\x2e\
-\x35\x34\x39\x2d\x30\x2e\x34\x35\x2c\x31\x2d\x31\x2c\x31\x48\x37\
-\x0d\x0a\x09\x43\x36\x2e\x34\x35\x2c\x39\x2c\x36\x2c\x38\x2e\x35\
-\x34\x39\x2c\x36\x2c\x38\x56\x33\x68\x38\x56\x38\x7a\x20\x4d\x31\
-\x33\x2c\x34\x68\x2d\x32\x76\x34\x68\x32\x56\x34\x7a\x22\x2f\x3e\
-\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\
-\x00\x00\x02\xf7\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
-\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
-\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
-\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x31\x37\x2e\x34\
-\x2c\x32\x32\x34\x48\x32\x38\x38\x56\x39\x34\x2e\x36\x63\x30\x2d\
-\x31\x36\x2e\x39\x2d\x31\x34\x2e\x33\x2d\x33\x30\x2e\x36\x2d\x33\
-\x32\x2d\x33\x30\x2e\x36\x63\x2d\x31\x37\x2e\x37\x2c\x30\x2d\x33\
-\x32\x2c\x31\x33\x2e\x37\x2d\x33\x32\x2c\x33\x30\x2e\x36\x56\x32\
-\x32\x34\x48\x39\x34\x2e\x36\x43\x37\x37\x2e\x37\x2c\x32\x32\x34\
-\x2c\x36\x34\x2c\x32\x33\x38\x2e\x33\x2c\x36\x34\x2c\x32\x35\x36\
-\x0d\x0a\x09\x63\x30\x2c\x31\x37\x2e\x37\x2c\x31\x33\x2e\x37\x2c\
-\x33\x32\x2c\x33\x30\x2e\x36\x2c\x33\x32\x48\x32\x32\x34\x76\x31\
-\x32\x39\x2e\x34\x63\x30\x2c\x31\x36\x2e\x39\x2c\x31\x34\x2e\x33\
-\x2c\x33\x30\x2e\x36\x2c\x33\x32\x2c\x33\x30\x2e\x36\x63\x31\x37\
-\x2e\x37\x2c\x30\x2c\x33\x32\x2d\x31\x33\x2e\x37\x2c\x33\x32\x2d\
-\x33\x30\x2e\x36\x56\x32\x38\x38\x68\x31\x32\x39\x2e\x34\x63\x31\
-\x36\x2e\x39\x2c\x30\x2c\x33\x30\x2e\x36\x2d\x31\x34\x2e\x33\x2c\
-\x33\x30\x2e\x36\x2d\x33\x32\x0d\x0a\x09\x43\x34\x34\x38\x2c\x32\
-\x33\x38\x2e\x33\x2c\x34\x33\x34\x2e\x33\x2c\x32\x32\x34\x2c\x34\
-\x31\x37\x2e\x34\x2c\x32\x32\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\
-\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\x22\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x22\x32\x35\x36\x22\
-\x20\x63\x79\x3d\x22\x32\x38\x30\x22\x20\x72\x3d\x22\x36\x33\x22\
-\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\
-\x34\x30\x2c\x39\x36\x68\x2d\x38\x38\x6c\x2d\x33\x32\x2d\x33\x32\
-\x48\x31\x39\x32\x6c\x2d\x33\x32\x2c\x33\x32\x48\x37\x32\x63\x2d\
-\x32\x32\x2e\x30\x39\x32\x2c\x30\x2d\x34\x30\x2c\x31\x37\x2e\x39\
-\x30\x38\x2d\x34\x30\x2c\x34\x30\x76\x32\x37\x32\x63\x30\x2c\x32\
-\x32\x2e\x30\x39\x32\x2c\x31\x37\x2e\x39\x30\x38\x2c\x34\x30\x2c\
-\x34\x30\x2c\x34\x30\x68\x33\x36\x38\x63\x32\x32\x2e\x30\x39\x32\
-\x2c\x30\x2c\x34\x30\x2d\x31\x37\x2e\x39\x30\x38\x2c\x34\x30\x2d\
-\x34\x30\x0d\x0a\x09\x09\x56\x31\x33\x36\x43\x34\x38\x30\x2c\x31\
-\x31\x33\x2e\x39\x30\x38\x2c\x34\x36\x32\x2e\x30\x39\x32\x2c\x39\
-\x36\x2c\x34\x34\x30\x2c\x39\x36\x7a\x20\x4d\x32\x35\x36\x2c\x33\
-\x39\x32\x63\x2d\x36\x31\x2e\x38\x35\x35\x2c\x30\x2d\x31\x31\x32\
-\x2d\x35\x30\x2e\x31\x34\x35\x2d\x31\x31\x32\x2d\x31\x31\x32\x73\
-\x35\x30\x2e\x31\x34\x35\x2d\x31\x31\x32\x2c\x31\x31\x32\x2d\x31\
-\x31\x32\x73\x31\x31\x32\x2c\x35\x30\x2e\x31\x34\x35\x2c\x31\x31\
-\x32\x2c\x31\x31\x32\x0d\x0a\x09\x09\x53\x33\x31\x37\x2e\x38\x35\
-\x35\x2c\x33\x39\x32\x2c\x32\x35\x36\x2c\x33\x39\x32\x7a\x22\x2f\
-\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
-\x0a\
-\x00\x00\x02\xfc\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x32\x30\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
-\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
-\x35\x36\x2c\x34\x38\x43\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\
-\x2c\x34\x38\x2c\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\x2c\x32\
-\x35\x36\x73\x39\x33\x2e\x36\x30\x31\x2c\x32\x30\x38\x2c\x32\x30\
-\x38\x2c\x32\x30\x38\x73\x32\x30\x38\x2d\x39\x33\x2e\x36\x30\x31\
-\x2c\x32\x30\x38\x2d\x32\x30\x38\x53\x33\x37\x30\x2e\x33\x39\x39\
-\x2c\x34\x38\x2c\x32\x35\x36\x2c\x34\x38\x7a\x20\x4d\x32\x35\x36\
-\x2c\x34\x32\x32\x2e\x33\x39\x39\x0d\x0a\x09\x09\x09\x63\x2d\x39\
-\x31\x2e\x35\x31\x38\x2c\x30\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\
-\x37\x34\x2e\x38\x38\x32\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\x31\
-\x36\x36\x2e\x33\x39\x39\x53\x31\x36\x34\x2e\x34\x38\x32\x2c\x38\
-\x39\x2e\x36\x2c\x32\x35\x36\x2c\x38\x39\x2e\x36\x53\x34\x32\x32\
-\x2e\x34\x2c\x31\x36\x34\x2e\x34\x38\x32\x2c\x34\x32\x32\x2e\x34\
-\x2c\x32\x35\x36\x53\x33\x34\x37\x2e\x35\x31\x38\x2c\x34\x32\x32\
-\x2e\x33\x39\x39\x2c\x32\x35\x36\x2c\x34\x32\x32\x2e\x33\x39\x39\
-\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\
-\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\xf5\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x43\x68\x65\x76\x72\x6f\x6e\x5f\x63\x69\x72\x63\x6c\x65\
-\x64\x5f\x6c\x65\x66\x74\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
-\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
-\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
-\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
-\x6c\x69\x6e\x6b\x22\x0d\x0a\x09\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x74\x72\x61\
-\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x32\
-\x34\x20\x30\x20\x30\x20\x32\x34\x20\x30\x20\x30\x29\x27\x3e\x0d\
-\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x31\x2e\x33\x30\
-\x32\x2c\x36\x2e\x37\x37\x36\x63\x2d\x30\x2e\x31\x39\x36\x2d\x30\
-\x2e\x31\x39\x37\x2d\x30\x2e\x35\x31\x35\x2d\x30\x2e\x31\x39\x37\
-\x2d\x30\x2e\x37\x31\x2c\x30\x4c\x37\x2e\x37\x38\x35\x2c\x39\x2e\
-\x36\x34\x31\x63\x2d\x30\x2e\x31\x39\x36\x2c\x30\x2e\x31\x39\x39\
-\x2d\x30\x2e\x31\x39\x36\x2c\x30\x2e\x35\x32\x2c\x30\x2c\x30\x2e\
-\x37\x31\x37\x6c\x32\x2e\x38\x30\x37\x2c\x32\x2e\x38\x36\x34\x0d\
-\x0a\x09\x63\x30\x2e\x31\x39\x35\x2c\x30\x2e\x31\x39\x39\x2c\x30\
-\x2e\x35\x31\x34\x2c\x30\x2e\x31\x39\x38\x2c\x30\x2e\x37\x31\x2c\
-\x30\x63\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2c\x30\x2e\
-\x31\x39\x36\x2d\x30\x2e\x35\x31\x38\x2c\x30\x2d\x30\x2e\x37\x31\
-\x37\x4c\x39\x2c\x31\x30\x6c\x32\x2e\x33\x30\x32\x2d\x32\x2e\x35\
-\x30\x36\x43\x31\x31\x2e\x34\x39\x38\x2c\x37\x2e\x32\x39\x36\x2c\
-\x31\x31\x2e\x34\x39\x38\x2c\x36\x2e\x39\x37\x36\x2c\x31\x31\x2e\
-\x33\x30\x32\x2c\x36\x2e\x37\x37\x36\x7a\x0d\x0a\x09\x20\x4d\x31\
-\x30\x2c\x30\x2e\x34\x63\x2d\x35\x2e\x33\x30\x32\x2c\x30\x2d\x39\
-\x2e\x36\x2c\x34\x2e\x32\x39\x38\x2d\x39\x2e\x36\x2c\x39\x2e\x36\
-\x63\x30\x2c\x35\x2e\x33\x30\x33\x2c\x34\x2e\x32\x39\x38\x2c\x39\
-\x2e\x36\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x73\x39\x2e\x36\x2d\x34\
-\x2e\x32\x39\x37\x2c\x39\x2e\x36\x2d\x39\x2e\x36\x43\x31\x39\x2e\
-\x36\x2c\x34\x2e\x36\x39\x38\x2c\x31\x35\x2e\x33\x30\x32\x2c\x30\
-\x2e\x34\x2c\x31\x30\x2c\x30\x2e\x34\x7a\x20\x4d\x31\x30\x2c\x31\
-\x38\x2e\x33\x35\x34\x0d\x0a\x09\x63\x2d\x34\x2e\x36\x31\x35\x2c\
-\x30\x2d\x38\x2e\x33\x35\x34\x2d\x33\x2e\x37\x34\x2d\x38\x2e\x33\
-\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\x30\x2d\x34\x2e\x36\x31\x34\
-\x2c\x33\x2e\x37\x33\x39\x2d\x38\x2e\x33\x35\x34\x2c\x38\x2e\x33\
-\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\x34\x2e\x36\x31\x33\x2c\x30\
-\x2c\x38\x2e\x33\x35\x34\x2c\x33\x2e\x37\x34\x2c\x38\x2e\x33\x35\
-\x34\x2c\x38\x2e\x33\x35\x34\x0d\x0a\x09\x43\x31\x38\x2e\x33\x35\
-\x34\x2c\x31\x34\x2e\x36\x31\x34\x2c\x31\x34\x2e\x36\x31\x33\x2c\
-\x31\x38\x2e\x33\x35\x34\x2c\x31\x30\x2c\x31\x38\x2e\x33\x35\x34\
-\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\
-\x67\x3e\x0d\x0a\
-\x00\x00\x02\xb7\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x35\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
-\x0d\x0a\x09\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\
-\x6e\x74\x73\x3d\x22\x34\x30\x35\x2c\x31\x33\x36\x2e\x37\x39\x38\
-\x20\x33\x37\x35\x2e\x32\x30\x32\x2c\x31\x30\x37\x20\x32\x35\x36\
-\x2c\x32\x32\x36\x2e\x32\x30\x32\x20\x31\x33\x36\x2e\x37\x39\x38\
-\x2c\x31\x30\x37\x20\x31\x30\x37\x2c\x31\x33\x36\x2e\x37\x39\x38\
-\x20\x32\x32\x36\x2e\x32\x30\x32\x2c\x32\x35\x36\x20\x31\x30\x37\
-\x2c\x33\x37\x35\x2e\x32\x30\x32\x20\x31\x33\x36\x2e\x37\x39\x38\
-\x2c\x34\x30\x35\x20\x32\x35\x36\x2c\x32\x38\x35\x2e\x37\x39\x38\
-\x20\x0d\x0a\x09\x09\x09\x33\x37\x35\x2e\x32\x30\x32\x2c\x34\x30\
-\x35\x20\x34\x30\x35\x2c\x33\x37\x35\x2e\x32\x30\x32\x20\x32\x38\
-\x35\x2e\x37\x39\x38\x2c\x32\x35\x36\x20\x09\x09\x22\x2f\x3e\x0d\
-\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
-\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x04\xca\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\
-\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\
-\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x39\x2e\x32\x2e\x31\x2c\x20\
-\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\
-\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\
-\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\
-\x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\
-\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\
-\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\
-\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
-\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\
-\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\
-\x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\
-\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x09\x20\x69\x64\x3d\
-\x22\x73\x76\x67\x34\x36\x31\x39\x22\x20\x69\x6e\x6b\x73\x63\x61\
-\x70\x65\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x31\
-\x2b\x64\x65\x76\x65\x6c\x2b\x6f\x73\x78\x6d\x65\x6e\x75\x20\x72\
-\x31\x32\x39\x31\x31\x22\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
-\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x74\x72\x69\x61\x6e\x67\x6c\
-\x65\x2d\x73\x74\x72\x6f\x6b\x65\x64\x2d\x31\x35\x2e\x73\x76\x67\
-\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\
-\x3a\x2f\x2f\x63\x72\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\
-\x6e\x73\x2e\x6f\x72\x67\x2f\x6e\x73\x23\x22\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\
-\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\
-\x73\x2f\x31\x2e\x31\x2f\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\
-\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
-\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\
-\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\
-\x61\x70\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\
-\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\x22\x20\x78\x6d\x6c\
-\x6e\x73\x3a\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\
-\x70\x3a\x2f\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\
-\x72\x63\x65\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\
-\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\
-\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\
-\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\
-\x30\x30\x2f\x73\x76\x67\x22\x0a\x09\x20\x78\x6d\x6c\x6e\x73\x3d\
-\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\
-\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\
-\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\
-\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\
-\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\
-\x79\x3d\x22\x30\x70\x78\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\
-\x34\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x34\x70\
-\x78\x22\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\
-\x30\x20\x31\x35\x20\x31\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\
-\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\
-\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x31\x35\x20\x31\x35\x3b\
-\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\
-\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x70\x61\x74\x68\x20\x69\x64\
-\x3d\x22\x72\x65\x63\x74\x33\x33\x33\x38\x22\x20\x69\x6e\x6b\x73\
-\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\
-\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x20\x73\x6f\x64\
-\x69\x70\x6f\x64\x69\x3a\x6e\x6f\x64\x65\x74\x79\x70\x65\x73\x3d\
-\x22\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x22\x20\x64\
-\x3d\x22\x4d\x37\x2e\x35\x32\x34\x33\x2c\x31\x2e\x35\x30\x30\x34\
-\x0a\x09\x43\x37\x2e\x32\x34\x32\x39\x2c\x31\x2e\x34\x39\x31\x33\
-\x2c\x36\x2e\x39\x37\x38\x37\x2c\x31\x2e\x36\x34\x32\x33\x2c\x36\
-\x2e\x38\x33\x33\x36\x2c\x31\x2e\x38\x39\x35\x32\x6c\x2d\x35\x2e\
-\x35\x2c\x39\x2e\x38\x36\x39\x32\x43\x31\x2e\x30\x32\x31\x38\x2c\
-\x31\x32\x2e\x33\x30\x37\x38\x2c\x31\x2e\x33\x39\x35\x2c\x31\x32\
-\x2e\x39\x39\x39\x39\x2c\x32\x2c\x31\x33\x68\x31\x31\x0a\x09\x63\
-\x30\x2e\x36\x30\x35\x2d\x30\x2e\x30\x30\x30\x31\x2c\x30\x2e\x39\
-\x37\x38\x32\x2d\x30\x2e\x36\x39\x32\x32\x2c\x30\x2e\x36\x36\x36\
-\x34\x2d\x31\x2e\x32\x33\x35\x35\x6c\x2d\x35\x2e\x35\x2d\x39\x2e\
-\x38\x36\x39\x32\x43\x38\x2e\x30\x33\x30\x32\x2c\x31\x2e\x36\x35\
-\x37\x39\x2c\x37\x2e\x37\x38\x38\x34\x2c\x31\x2e\x35\x30\x39\x32\
-\x2c\x37\x2e\x35\x32\x34\x33\x2c\x31\x2e\x35\x30\x30\x34\x7a\x20\
-\x4d\x37\x2e\x35\x2c\x33\x2e\x38\x39\x39\x33\x6c\x34\x2e\x31\x32\
-\x36\x37\x2c\x37\x2e\x34\x37\x30\x34\x0a\x09\x48\x33\x2e\x33\x37\
-\x33\x33\x4c\x37\x2e\x35\x2c\x33\x2e\x38\x39\x39\x33\x7a\x22\x2f\
-\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
-\x00\x00\x01\xdd\
-\x00\
-\x00\x06\xe4\x78\x9c\xcd\x54\x4d\x6f\x9b\x40\x10\x3d\x13\x29\xff\
-\x61\xba\xb7\x4a\xec\x17\xc4\xd4\xa6\xa6\x51\xfd\x21\xcb\x52\x9a\
-\x58\x6a\xea\xaa\xa7\x0a\xc3\x16\x50\x28\x20\x58\xc0\xce\xaf\xef\
-\xee\x92\x54\x51\x95\xfa\x18\xfb\xb0\x33\xda\x79\x6f\xde\xbc\x65\
-\x24\xa6\xd7\xfb\xdf\x39\x74\xa2\x6e\xb2\xb2\x08\x10\x27\x0c\x81\
-\x28\xa2\x32\xce\x8a\x24\x40\xad\xfc\x85\xc7\xe8\xfa\xd3\xe5\xc5\
-\xf4\x1d\xc6\xb0\x12\x85\xa8\x43\x59\xd6\x3e\x7c\x8e\xcb\x9d\x80\
-\x75\x9e\xb7\x8d\x34\x25\xe0\x1e\x71\x08\xb7\xe1\xeb\x76\x05\xcb\
-\x7d\x55\xd6\x12\x36\x79\x9b\xe0\x75\x01\xc4\x14\xb7\xc3\x10\x1f\
-\x3c\xc2\x18\xcc\xda\x2c\x8f\x81\xbd\x07\xc0\xd8\xe8\x2f\xee\xe6\
-\xf7\x3f\x36\x4b\x68\xba\x04\x36\xdf\x66\x37\xeb\x39\x20\x4c\xe9\
-\x77\x77\x4e\xe9\xe2\x7e\x61\x24\x38\xe1\x94\x2e\x6f\x11\xa0\x54\
-\xca\xca\xa7\xb4\xef\x7b\xd2\xbb\xa4\xac\x13\xba\xaa\xc3\x2a\xcd\
-\xa2\x86\x2a\x22\xd5\x44\xd5\x44\x95\x18\xe7\x24\x96\x31\xd2\x33\
-\xb4\xf4\x8b\xa7\x72\x04\x59\x1c\xa0\x9b\xf0\x20\xea\x9f\xea\xa2\
-\xbe\x44\xd1\x04\xaf\x48\x3b\x8c\x31\x2d\xf5\x44\xf1\xf7\x79\x56\
-\x3c\xbc\x46\xe4\x93\xc9\x84\x1a\x54\x51\x03\xc4\xaa\x3d\x82\xc3\
-\x90\x2f\x2f\x2c\xe8\xb3\x58\xa6\x01\x1a\x71\x47\x03\xa9\xc8\x92\
-\x54\xfe\xbd\x76\x99\xe8\x67\xa5\xee\x02\x06\xaa\xa6\x0f\x82\x46\
-\x1e\x72\x11\x20\x51\x84\xbb\x5c\xe0\x5d\x18\x3d\x24\x75\xd9\x16\
-\xb1\x5f\x88\x1e\x5e\x30\x3f\x1a\x6f\x7e\x53\x85\x91\xa2\x57\xb5\
-\x68\x44\xdd\x09\xf3\xea\x44\x05\x6b\x88\xd6\xb4\x0a\x65\x0a\xea\
-\xd1\x5f\xb8\xc7\x6c\x3e\x72\x89\x1b\x31\xdb\x25\x1f\xb0\x6b\x7b\
-\x2a\xaa\xa3\x73\x8a\x47\x8c\x8c\x22\xac\x00\x9b\xe9\x22\x76\xf1\
-\x13\xdc\x0d\x10\x33\x98\xfb\xdc\xa0\x73\x6a\x00\xd3\xa2\x4b\xb6\
-\x51\xd4\x67\x6b\xe6\x3c\xea\x4f\x60\x59\xf4\x1f\x1f\xce\x78\x7c\
-\x16\x3e\xae\xb8\x77\x3a\x1f\x53\xfa\xff\x25\x39\x63\xfe\x26\xa6\
-\xcc\x9c\x23\x4b\x3a\x07\x1f\x7a\x49\x27\xf3\x71\x6c\x49\x57\x6c\
-\xf2\x26\xa6\xcc\x9c\x23\x4b\x3a\x07\x1f\x7a\x49\x27\xf3\x31\x2c\
-\xe9\x39\xaa\x7f\xb6\xca\x7f\x00\x99\x18\x96\x19\
-\x00\x00\x03\x46\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
-\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
-\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
-\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x33\x37\x2e\x35\
-\x2c\x33\x38\x36\x2e\x36\x4c\x33\x30\x36\x2e\x39\x2c\x32\x35\x36\
-\x6c\x31\x33\x30\x2e\x36\x2d\x31\x33\x30\x2e\x36\x63\x31\x34\x2e\
-\x31\x2d\x31\x34\x2e\x31\x2c\x31\x34\x2e\x31\x2d\x33\x36\x2e\x38\
-\x2c\x30\x2d\x35\x30\x2e\x39\x63\x2d\x31\x34\x2e\x31\x2d\x31\x34\
-\x2e\x31\x2d\x33\x36\x2e\x38\x2d\x31\x34\x2e\x31\x2d\x35\x30\x2e\
-\x39\x2c\x30\x4c\x32\x35\x36\x2c\x32\x30\x35\x2e\x31\x4c\x31\x32\
-\x35\x2e\x34\x2c\x37\x34\x2e\x35\x0d\x0a\x09\x63\x2d\x31\x34\x2e\
-\x31\x2d\x31\x34\x2e\x31\x2d\x33\x36\x2e\x38\x2d\x31\x34\x2e\x31\
-\x2d\x35\x30\x2e\x39\x2c\x30\x63\x2d\x31\x34\x2e\x31\x2c\x31\x34\
-\x2e\x31\x2d\x31\x34\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x30\x2c\x35\
-\x30\x2e\x39\x4c\x32\x30\x35\x2e\x31\x2c\x32\x35\x36\x4c\x37\x34\
-\x2e\x35\x2c\x33\x38\x36\x2e\x36\x63\x2d\x31\x34\x2e\x31\x2c\x31\
-\x34\x2e\x31\x2d\x31\x34\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x30\x2c\
-\x35\x30\x2e\x39\x0d\x0a\x09\x63\x31\x34\x2e\x31\x2c\x31\x34\x2e\
-\x31\x2c\x33\x36\x2e\x38\x2c\x31\x34\x2e\x31\x2c\x35\x30\x2e\x39\
-\x2c\x30\x4c\x32\x35\x36\x2c\x33\x30\x36\x2e\x39\x6c\x31\x33\x30\
-\x2e\x36\x2c\x31\x33\x30\x2e\x36\x63\x31\x34\x2e\x31\x2c\x31\x34\
-\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x31\x34\x2e\x31\x2c\x35\x30\x2e\
-\x39\x2c\x30\x43\x34\x35\x31\x2e\x35\x2c\x34\x32\x33\x2e\x34\x2c\
-\x34\x35\x31\x2e\x35\x2c\x34\x30\x30\x2e\x36\x2c\x34\x33\x37\x2e\
-\x35\x2c\x33\x38\x36\x2e\x36\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\
-\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\x26\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x33\x38\
-\x38\x63\x2d\x37\x32\x2e\x35\x39\x37\x2c\x30\x2d\x31\x33\x32\x2d\
-\x35\x39\x2e\x34\x30\x35\x2d\x31\x33\x32\x2d\x31\x33\x32\x63\x30\
-\x2d\x37\x32\x2e\x36\x30\x31\x2c\x35\x39\x2e\x34\x30\x33\x2d\x31\
-\x33\x32\x2c\x31\x33\x32\x2d\x31\x33\x32\x63\x33\x36\x2e\x33\x2c\
-\x30\x2c\x36\x39\x2e\x32\x39\x39\x2c\x31\x35\x2e\x34\x2c\x39\x32\
-\x2e\x34\x30\x36\x2c\x33\x39\x2e\x36\x30\x31\x4c\x32\x37\x38\x2c\
-\x32\x33\x34\x68\x31\x35\x34\x56\x38\x30\x0d\x0a\x09\x09\x6c\x2d\
-\x35\x31\x2e\x36\x39\x38\x2c\x35\x31\x2e\x37\x30\x32\x43\x33\x34\
-\x38\x2e\x34\x30\x36\x2c\x39\x39\x2e\x37\x39\x38\x2c\x33\x30\x34\
-\x2e\x34\x30\x36\x2c\x38\x30\x2c\x32\x35\x36\x2c\x38\x30\x63\x2d\
-\x39\x36\x2e\x37\x39\x37\x2c\x30\x2d\x31\x37\x36\x2c\x37\x39\x2e\
-\x32\x30\x33\x2d\x31\x37\x36\x2c\x31\x37\x36\x73\x37\x38\x2e\x30\
-\x39\x34\x2c\x31\x37\x36\x2c\x31\x37\x36\x2c\x31\x37\x36\x0d\x0a\
-\x09\x09\x63\x38\x31\x2e\x30\x34\x35\x2c\x30\x2c\x31\x34\x38\x2e\
-\x32\x38\x37\x2d\x35\x34\x2e\x31\x33\x34\x2c\x31\x36\x39\x2e\x34\
-\x30\x31\x2d\x31\x32\x38\x48\x33\x37\x38\x2e\x38\x35\x43\x33\x36\
-\x30\x2e\x31\x30\x35\x2c\x33\x35\x33\x2e\x35\x36\x31\x2c\x33\x31\
-\x31\x2e\x37\x31\x32\x2c\x33\x38\x38\x2c\x32\x35\x36\x2c\x33\x38\
-\x38\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\
-\x76\x67\x3e\x0d\x0a\
-\x00\x00\x05\xd4\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
-\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
-\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
-\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
-\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
-\x38\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\x73\x69\
-\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x36\x33\
-\x2e\x39\x39\x39\x36\x70\x74\x27\x20\x68\x65\x69\x67\x68\x74\x3d\
-\x27\x36\x33\x2e\x39\x39\x39\x37\x70\x74\x27\x20\x76\x69\x65\x77\
-\x42\x6f\x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\
-\x38\x35\x38\x33\x20\x36\x33\x2e\x39\x39\x39\x36\x20\x36\x33\x2e\
-\x39\x39\x39\x37\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\
-\x67\x65\x31\x27\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
-\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
-\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
-\x20\x35\x36\x2e\x34\x30\x39\x34\x20\x31\x31\x37\x2e\x38\x35\x38\
-\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x35\
-\x34\x2e\x38\x39\x32\x36\x20\x2d\x33\x39\x2e\x37\x31\x30\x39\x43\
-\x20\x35\x34\x2e\x38\x39\x32\x36\x20\x2d\x34\x33\x2e\x39\x30\x33\
-\x32\x20\x34\x34\x2e\x36\x39\x36\x39\x20\x2d\x34\x37\x2e\x33\x30\
-\x31\x37\x20\x33\x32\x2e\x31\x32\x20\x2d\x34\x37\x2e\x33\x30\x31\
-\x37\x43\x20\x31\x39\x2e\x35\x34\x33\x31\x20\x2d\x34\x37\x2e\x33\
-\x30\x31\x37\x20\x39\x2e\x33\x34\x37\x34\x32\x20\x2d\x34\x33\x2e\
-\x39\x30\x33\x32\x20\x39\x2e\x33\x34\x37\x34\x32\x20\x2d\x33\x39\
-\x2e\x37\x31\x30\x39\x43\x20\x39\x2e\x33\x34\x37\x34\x32\x20\x2d\
-\x33\x35\x2e\x35\x31\x38\x35\x20\x31\x39\x2e\x35\x34\x33\x31\x20\
-\x2d\x33\x32\x2e\x31\x32\x20\x33\x32\x2e\x31\x32\x20\x2d\x33\x32\
-\x2e\x31\x32\x43\x20\x34\x34\x2e\x36\x39\x36\x39\x20\x2d\x33\x32\
-\x2e\x31\x32\x20\x35\x34\x2e\x38\x39\x32\x36\x20\x2d\x33\x35\x2e\
-\x35\x31\x38\x35\x20\x35\x34\x2e\x38\x39\x32\x36\x20\x2d\x33\x39\
-\x2e\x37\x31\x30\x39\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\
-\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\
-\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\
-\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\
-\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\
-\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\
-\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\
-\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x33\x2e\
-\x35\x31\x33\x31\x32\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\
-\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\
-\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\
-\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\x36\x2e\x34\x30\x39\x34\
-\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\x70\x61\x74\
-\x68\x20\x64\x3d\x27\x4d\x20\x39\x2e\x33\x34\x37\x34\x32\x20\x2d\
-\x33\x39\x2e\x37\x31\x30\x39\x4c\x20\x39\x2e\x33\x34\x37\x34\x32\
-\x20\x2d\x39\x2e\x33\x34\x37\x34\x32\x4c\x20\x39\x2e\x33\x34\x37\
-\x34\x32\x20\x2d\x39\x2e\x33\x34\x37\x34\x32\x43\x20\x39\x2e\x33\
-\x34\x37\x34\x32\x20\x2d\x39\x2e\x33\x34\x37\x34\x32\x20\x39\x2e\
-\x33\x34\x37\x34\x32\x20\x2d\x39\x2e\x33\x34\x37\x34\x32\x20\x39\
-\x2e\x33\x34\x37\x34\x32\x20\x2d\x39\x2e\x33\x34\x37\x34\x32\x43\
-\x20\x39\x2e\x33\x34\x37\x34\x32\x20\x2d\x35\x2e\x31\x35\x35\x31\
-\x31\x20\x31\x39\x2e\x35\x34\x33\x31\x20\x2d\x31\x2e\x37\x35\x36\
-\x35\x36\x20\x33\x32\x2e\x31\x32\x20\x2d\x31\x2e\x37\x35\x36\x35\
-\x36\x43\x20\x34\x34\x2e\x36\x39\x36\x39\x20\x2d\x31\x2e\x37\x35\
-\x36\x35\x36\x20\x35\x34\x2e\x38\x39\x32\x36\x20\x2d\x35\x2e\x31\
-\x35\x35\x31\x31\x20\x35\x34\x2e\x38\x39\x32\x36\x20\x2d\x39\x2e\
-\x33\x34\x37\x34\x32\x4c\x20\x35\x34\x2e\x38\x39\x32\x36\x20\x2d\
-\x39\x2e\x33\x34\x37\x34\x32\x4c\x20\x35\x34\x2e\x38\x39\x32\x36\
-\x20\x2d\x33\x39\x2e\x37\x31\x30\x39\x27\x20\x66\x69\x6c\x6c\x3d\
-\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\
-\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\
-\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\
-\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\
-\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\
-\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\
-\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\
-\x27\x33\x2e\x35\x31\x33\x31\x32\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\
-\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\
-\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\
-\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\x36\x2e\x34\
-\x30\x39\x34\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\
-\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x35\x34\x2e\x38\x39\x32\
-\x36\x20\x2d\x33\x39\x2e\x37\x31\x30\x39\x43\x20\x35\x34\x2e\x38\
-\x39\x32\x36\x20\x2d\x35\x32\x2e\x32\x38\x37\x38\x20\x34\x34\x2e\
-\x36\x39\x36\x39\x20\x2d\x36\x32\x2e\x34\x38\x33\x34\x20\x33\x32\
-\x2e\x31\x32\x20\x2d\x36\x32\x2e\x34\x38\x33\x34\x43\x20\x31\x39\
-\x2e\x35\x34\x33\x31\x20\x2d\x36\x32\x2e\x34\x38\x33\x34\x20\x39\
-\x2e\x33\x34\x37\x34\x32\x20\x2d\x35\x32\x2e\x32\x38\x37\x38\x20\
-\x39\x2e\x33\x34\x37\x34\x32\x20\x2d\x33\x39\x2e\x37\x31\x30\x39\
-\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\
-\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\
-\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\
-\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\
-\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\
-\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\
-\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\
-\x2d\x77\x69\x64\x74\x68\x3d\x27\x33\x2e\x35\x31\x33\x31\x32\x27\
-\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\
-\x76\x67\x3e\
-\x00\x00\x03\xe6\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x43\x68\x65\x76\x72\x6f\x6e\x5f\x63\x69\x72\x63\x6c\x65\
-\x64\x5f\x72\x69\x67\x68\x74\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x22\x0d\x0a\x09\x20\x78\x3d\x22\x30\x70\x78\
-\x22\x20\x79\x3d\x22\x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\
-\x78\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\
-\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\
-\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\
-\x31\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\
-\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x74\x72\
-\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\
-\x32\x34\x20\x30\x20\x30\x20\x32\x34\x20\x30\x20\x30\x29\x27\x3e\
-\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x31\x2c\x31\
-\x30\x4c\x38\x2e\x36\x39\x38\x2c\x37\x2e\x34\x39\x34\x63\x2d\x30\
-\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x38\x2d\x30\x2e\x31\x39\x36\
-\x2d\x30\x2e\x35\x31\x39\x2c\x30\x2d\x30\x2e\x37\x31\x38\x63\x30\
-\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2c\x30\x2e\x35\x31\x35\
-\x2d\x30\x2e\x31\x39\x37\x2c\x30\x2e\x37\x31\x2c\x30\x6c\x32\x2e\
-\x38\x30\x37\x2c\x32\x2e\x38\x36\x34\x0d\x0a\x09\x63\x30\x2e\x31\
-\x39\x36\x2c\x30\x2e\x31\x39\x39\x2c\x30\x2e\x31\x39\x36\x2c\x30\
-\x2e\x35\x32\x2c\x30\x2c\x30\x2e\x37\x31\x37\x6c\x2d\x32\x2e\x38\
-\x30\x37\x2c\x32\x2e\x38\x36\x34\x63\x2d\x30\x2e\x31\x39\x35\x2c\
-\x30\x2e\x31\x39\x39\x2d\x30\x2e\x35\x31\x34\x2c\x30\x2e\x31\x39\
-\x38\x2d\x30\x2e\x37\x31\x2c\x30\x63\x2d\x30\x2e\x31\x39\x36\x2d\
-\x30\x2e\x31\x39\x37\x2d\x30\x2e\x31\x39\x36\x2d\x30\x2e\x35\x31\
-\x38\x2c\x30\x2d\x30\x2e\x37\x31\x37\x4c\x31\x31\x2c\x31\x30\x7a\
-\x20\x4d\x31\x30\x2c\x30\x2e\x34\x0d\x0a\x09\x63\x35\x2e\x33\x30\
-\x32\x2c\x30\x2c\x39\x2e\x36\x2c\x34\x2e\x32\x39\x38\x2c\x39\x2e\
-\x36\x2c\x39\x2e\x36\x63\x30\x2c\x35\x2e\x33\x30\x33\x2d\x34\x2e\
-\x32\x39\x38\x2c\x39\x2e\x36\x2d\x39\x2e\x36\x2c\x39\x2e\x36\x53\
-\x30\x2e\x34\x2c\x31\x35\x2e\x33\x30\x33\x2c\x30\x2e\x34\x2c\x31\
-\x30\x43\x30\x2e\x34\x2c\x34\x2e\x36\x39\x38\x2c\x34\x2e\x36\x39\
-\x38\x2c\x30\x2e\x34\x2c\x31\x30\x2c\x30\x2e\x34\x7a\x20\x4d\x31\
-\x30\x2c\x31\x38\x2e\x33\x35\x34\x0d\x0a\x09\x63\x34\x2e\x36\x31\
-\x33\x2c\x30\x2c\x38\x2e\x33\x35\x34\x2d\x33\x2e\x37\x34\x2c\x38\
-\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\x30\x2d\x34\x2e\x36\
-\x31\x34\x2d\x33\x2e\x37\x34\x31\x2d\x38\x2e\x33\x35\x34\x2d\x38\
-\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\x2d\x34\x2e\x36\x31\
-\x35\x2c\x30\x2d\x38\x2e\x33\x35\x34\x2c\x33\x2e\x37\x34\x2d\x38\
-\x2e\x33\x35\x34\x2c\x38\x2e\x33\x35\x34\x0d\x0a\x09\x43\x31\x2e\
-\x36\x34\x35\x2c\x31\x34\x2e\x36\x31\x34\x2c\x35\x2e\x33\x38\x35\
-\x2c\x31\x38\x2e\x33\x35\x34\x2c\x31\x30\x2c\x31\x38\x2e\x33\x35\
-\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\
-\x76\x67\x3e\x0d\x0a\
-\x00\x00\x01\x1c\
-\x3c\
-\x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
-\x30\x2f\x73\x76\x67\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x35\x31\
-\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\x32\
-\x70\x78\x22\x0a\x20\x20\x20\x20\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x3e\x0a\
-\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
-\x74\x72\x69\x78\x28\x34\x38\x20\x30\x20\x30\x20\x34\x38\x20\x34\
-\x38\x20\x34\x38\x29\x27\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x20\
-\x64\x3d\x22\x4d\x30\x20\x30\x76\x32\x68\x2e\x35\x63\x30\x2d\x2e\
-\x35\x35\x2e\x34\x35\x2d\x31\x20\x31\x2d\x31\x68\x31\x2e\x35\x76\
-\x35\x2e\x35\x63\x30\x20\x2e\x32\x38\x2d\x2e\x32\x32\x2e\x35\x2d\
-\x2e\x35\x2e\x35\x68\x2d\x2e\x35\x76\x31\x68\x34\x76\x2d\x31\x68\
-\x2d\x2e\x35\x63\x2d\x2e\x32\x38\x20\x30\x2d\x2e\x35\x2d\x2e\x32\
-\x32\x2d\x2e\x35\x2d\x2e\x35\x76\x2d\x35\x2e\x35\x68\x31\x2e\x35\
-\x63\x2e\x35\x35\x20\x30\x20\x31\x20\x2e\x34\x35\x20\x31\x20\x31\
-\x68\x2e\x35\x76\x2d\x32\x68\x2d\x38\x7a\x22\x20\x2f\x3e\x0a\x3c\
-\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
-\x00\x00\x04\x64\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\x0d\x0a\x09\
-\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x31\
-\x37\x36\x63\x2d\x34\x34\x2e\x30\x30\x34\x2c\x30\x2d\x38\x30\x2e\
-\x30\x30\x31\x2c\x33\x36\x2d\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\
-\x63\x30\x2c\x34\x34\x2e\x30\x30\x34\x2c\x33\x35\x2e\x39\x39\x37\
-\x2c\x38\x30\x2c\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\x63\x34\x34\
-\x2e\x30\x30\x35\x2c\x30\x2c\x37\x39\x2e\x39\x39\x39\x2d\x33\x35\
-\x2e\x39\x39\x36\x2c\x37\x39\x2e\x39\x39\x39\x2d\x38\x30\x0d\x0a\
-\x09\x09\x09\x43\x33\x33\x35\x2e\x39\x39\x39\x2c\x32\x31\x32\x2c\
-\x33\x30\x30\x2e\x30\x30\x35\x2c\x31\x37\x36\x2c\x32\x35\x36\x2c\
-\x31\x37\x36\x7a\x20\x4d\x34\x34\x36\x2e\x39\x33\x38\x2c\x32\x33\
-\x34\x2e\x36\x36\x37\x63\x2d\x39\x2e\x36\x30\x35\x2d\x38\x38\x2e\
-\x35\x33\x31\x2d\x38\x31\x2e\x30\x37\x34\x2d\x31\x36\x30\x2d\x31\
-\x36\x39\x2e\x36\x30\x35\x2d\x31\x36\x39\x2e\x35\x39\x39\x56\x33\
-\x32\x68\x2d\x34\x32\x2e\x36\x36\x36\x76\x33\x33\x2e\x30\x36\x37\
-\x0d\x0a\x09\x09\x09\x63\x2d\x38\x38\x2e\x35\x33\x31\x2c\x39\x2e\
-\x35\x39\x39\x2d\x31\x36\x30\x2c\x38\x31\x2e\x30\x36\x38\x2d\x31\
-\x36\x39\x2e\x36\x30\x34\x2c\x31\x36\x39\x2e\x35\x39\x39\x48\x33\
-\x32\x76\x34\x32\x2e\x36\x36\x37\x68\x33\x33\x2e\x30\x36\x32\x63\
-\x39\x2e\x36\x30\x34\x2c\x38\x38\x2e\x35\x33\x31\x2c\x38\x31\x2e\
-\x30\x37\x32\x2c\x31\x36\x30\x2c\x31\x36\x39\x2e\x36\x30\x34\x2c\
-\x31\x36\x39\x2e\x36\x30\x34\x56\x34\x38\x30\x68\x34\x32\x2e\x36\
-\x36\x36\x76\x2d\x33\x33\x2e\x30\x36\x32\x0d\x0a\x09\x09\x09\x63\
-\x38\x38\x2e\x35\x33\x31\x2d\x39\x2e\x36\x30\x34\x2c\x31\x36\x30\
-\x2d\x38\x31\x2e\x30\x37\x33\x2c\x31\x36\x39\x2e\x36\x30\x35\x2d\
-\x31\x36\x39\x2e\x36\x30\x34\x48\x34\x38\x30\x76\x2d\x34\x32\x2e\
-\x36\x36\x37\x48\x34\x34\x36\x2e\x39\x33\x38\x7a\x20\x4d\x32\x35\
-\x36\x2c\x34\x30\x35\x2e\x33\x33\x33\x63\x2d\x38\x32\x2e\x31\x33\
-\x37\x2c\x30\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x36\x37\x2e\x31\
-\x39\x38\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\
-\x33\x33\x0d\x0a\x09\x09\x09\x63\x30\x2d\x38\x32\x2e\x31\x33\x36\
-\x2c\x36\x37\x2e\x31\x39\x37\x2d\x31\x34\x39\x2e\x33\x33\x33\x2c\
-\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\x33\x33\x63\
-\x38\x32\x2e\x31\x33\x35\x2c\x30\x2c\x31\x34\x39\x2e\x33\x33\x32\
-\x2c\x36\x37\x2e\x31\x39\x38\x2c\x31\x34\x39\x2e\x33\x33\x32\x2c\
-\x31\x34\x39\x2e\x33\x33\x33\x43\x34\x30\x35\x2e\x33\x33\x32\x2c\
-\x33\x33\x38\x2e\x31\x33\x35\x2c\x33\x33\x38\x2e\x31\x33\x35\x2c\
-\x34\x30\x35\x2e\x33\x33\x33\x2c\x32\x35\x36\x2c\x34\x30\x35\x2e\
-\x33\x33\x33\x7a\x0d\x0a\x09\x09\x09\x22\x2f\x3e\x0d\x0a\x09\x3c\
-\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\
-\x3e\x0d\x0a\
-\x00\x00\x03\x36\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\
-\x22\x33\x39\x36\x2e\x37\x39\x35\x2c\x33\x39\x36\x2e\x38\x20\x33\
-\x32\x30\x2c\x33\x39\x36\x2e\x38\x20\x33\x32\x30\x2c\x34\x34\x38\
-\x20\x34\x34\x38\x2c\x34\x34\x38\x20\x34\x34\x38\x2c\x33\x32\x30\
-\x20\x33\x39\x36\x2e\x37\x39\x35\x2c\x33\x32\x30\x20\x09\x22\x2f\
-\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\
-\x6e\x74\x73\x3d\x22\x33\x39\x36\x2e\x38\x2c\x31\x31\x35\x2e\x32\
-\x30\x35\x20\x33\x39\x36\x2e\x38\x2c\x31\x39\x32\x20\x34\x34\x38\
-\x2c\x31\x39\x32\x20\x34\x34\x38\x2c\x36\x34\x20\x33\x32\x30\x2c\
-\x36\x34\x20\x33\x32\x30\x2c\x31\x31\x35\x2e\x32\x30\x35\x20\x09\
-\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\
-\x6f\x69\x6e\x74\x73\x3d\x22\x31\x31\x35\x2e\x32\x30\x35\x2c\x31\
-\x31\x35\x2e\x32\x20\x31\x39\x32\x2c\x31\x31\x35\x2e\x32\x20\x31\
-\x39\x32\x2c\x36\x34\x20\x36\x34\x2c\x36\x34\x20\x36\x34\x2c\x31\
-\x39\x32\x20\x31\x31\x35\x2e\x32\x30\x35\x2c\x31\x39\x32\x20\x09\
-\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\
-\x6f\x69\x6e\x74\x73\x3d\x22\x31\x31\x35\x2e\x32\x2c\x33\x39\x36\
-\x2e\x37\x39\x35\x20\x31\x31\x35\x2e\x32\x2c\x33\x32\x30\x20\x36\
-\x34\x2c\x33\x32\x30\x20\x36\x34\x2c\x34\x34\x38\x20\x31\x39\x32\
-\x2c\x34\x34\x38\x20\x31\x39\x32\x2c\x33\x39\x36\x2e\x37\x39\x35\
-\x20\x09\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\
-\x76\x67\x3e\x0d\x0a\
-\x00\x00\x04\xaa\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x43\x6f\x64\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
-\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
-\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
-\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
-\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x32\x34\x70\x78\x22\x20\x79\
-\x3d\x22\x32\x34\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\
-\x6f\x78\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\
-\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\
-\x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\
-\x35\x31\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\
-\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x74\
-\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\
-\x28\x32\x34\x20\x30\x20\x30\x20\x32\x34\x20\x30\x20\x30\x29\x27\
-\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x35\x2e\x37\x31\x39\
-\x2c\x31\x34\x2e\x37\x35\x63\x2d\x30\x2e\x32\x33\x36\x2c\x30\x2d\
-\x30\x2e\x34\x37\x34\x2d\x30\x2e\x30\x38\x33\x2d\x30\x2e\x36\x36\
-\x34\x2d\x30\x2e\x32\x35\x32\x4c\x2d\x30\x2e\x30\x30\x35\x2c\x31\
-\x30\x6c\x35\x2e\x33\x34\x31\x2d\x34\x2e\x37\x34\x38\x43\x35\x2e\
-\x37\x34\x38\x2c\x34\x2e\x38\x38\x37\x2c\x36\x2e\x33\x38\x2c\x34\
-\x2e\x39\x32\x32\x2c\x36\x2e\x37\x34\x37\x2c\x35\x2e\x33\x33\x35\
-\x0d\x0a\x09\x63\x30\x2e\x33\x36\x37\x2c\x30\x2e\x34\x31\x33\x2c\
-\x30\x2e\x33\x33\x2c\x31\x2e\x30\x34\x35\x2d\x30\x2e\x30\x38\x33\
-\x2c\x31\x2e\x34\x31\x32\x4c\x33\x2e\x30\x30\x35\x2c\x31\x30\x6c\
-\x33\x2e\x33\x37\x38\x2c\x33\x2e\x30\x30\x32\x63\x30\x2e\x34\x31\
-\x33\x2c\x30\x2e\x33\x36\x37\x2c\x30\x2e\x34\x35\x2c\x30\x2e\x39\
-\x39\x39\x2c\x30\x2e\x30\x38\x33\x2c\x31\x2e\x34\x31\x32\x0d\x0a\
-\x09\x43\x36\x2e\x32\x36\x39\x2c\x31\x34\x2e\x36\x33\x37\x2c\x35\
-\x2e\x39\x39\x34\x2c\x31\x34\x2e\x37\x35\x2c\x35\x2e\x37\x31\x39\
-\x2c\x31\x34\x2e\x37\x35\x7a\x20\x4d\x31\x34\x2e\x36\x36\x34\x2c\
-\x31\x34\x2e\x37\x34\x38\x4c\x32\x30\x2e\x30\x30\x35\x2c\x31\x30\
-\x6c\x2d\x35\x2e\x30\x36\x2d\x34\x2e\x34\x39\x38\x63\x2d\x30\x2e\
-\x34\x31\x33\x2d\x30\x2e\x33\x36\x37\x2d\x31\x2e\x30\x34\x35\x2d\
-\x30\x2e\x33\x33\x2d\x31\x2e\x34\x31\x31\x2c\x30\x2e\x30\x38\x33\
-\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x36\x37\x2c\x30\x2e\x34\x31\x33\
-\x2d\x30\x2e\x33\x33\x2c\x31\x2e\x30\x34\x35\x2c\x30\x2e\x30\x38\
-\x33\x2c\x31\x2e\x34\x31\x32\x4c\x31\x36\x2e\x39\x39\x35\x2c\x31\
-\x30\x6c\x2d\x33\x2e\x36\x35\x39\x2c\x33\x2e\x32\x35\x32\x63\x2d\
-\x30\x2e\x34\x31\x33\x2c\x30\x2e\x33\x36\x37\x2d\x30\x2e\x34\x35\
-\x2c\x30\x2e\x39\x39\x39\x2d\x30\x2e\x30\x38\x33\x2c\x31\x2e\x34\
-\x31\x32\x43\x31\x33\x2e\x34\x35\x2c\x31\x34\x2e\x38\x38\x37\x2c\
-\x31\x33\x2e\x37\x32\x35\x2c\x31\x35\x2c\x31\x34\x2c\x31\x35\x0d\
-\x0a\x09\x43\x31\x34\x2e\x32\x33\x36\x2c\x31\x35\x2c\x31\x34\x2e\
-\x34\x37\x34\x2c\x31\x34\x2e\x39\x31\x37\x2c\x31\x34\x2e\x36\x36\
-\x34\x2c\x31\x34\x2e\x37\x34\x38\x7a\x20\x4d\x39\x2e\x39\x38\x36\
-\x2c\x31\x36\x2e\x31\x36\x35\x6c\x32\x2d\x31\x32\x63\x30\x2e\x30\
-\x39\x31\x2d\x30\x2e\x35\x34\x35\x2d\x30\x2e\x32\x37\x37\x2d\x31\
-\x2e\x30\x36\x2d\x30\x2e\x38\x32\x32\x2d\x31\x2e\x31\x35\x31\x0d\
-\x0a\x09\x63\x2d\x30\x2e\x35\x34\x37\x2d\x30\x2e\x30\x39\x32\x2d\
-\x31\x2e\x30\x36\x31\x2c\x30\x2e\x32\x37\x37\x2d\x31\x2e\x31\x35\
-\x2c\x30\x2e\x38\x32\x32\x6c\x2d\x32\x2c\x31\x32\x63\x2d\x30\x2e\
-\x30\x39\x31\x2c\x30\x2e\x35\x34\x35\x2c\x30\x2e\x32\x37\x37\x2c\
-\x31\x2e\x30\x36\x2c\x30\x2e\x38\x32\x32\x2c\x31\x2e\x31\x35\x31\
-\x43\x38\x2e\x38\x39\x32\x2c\x31\x36\x2e\x39\x39\x36\x2c\x38\x2e\
-\x39\x34\x36\x2c\x31\x37\x2c\x39\x2e\x30\x30\x31\x2c\x31\x37\x0d\
-\x0a\x09\x43\x39\x2e\x34\x38\x31\x2c\x31\x37\x2c\x39\x2e\x39\x30\
-\x35\x2c\x31\x36\x2e\x36\x35\x33\x2c\x39\x2e\x39\x38\x36\x2c\x31\
-\x36\x2e\x31\x36\x35\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\
-\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x02\x7d\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x38\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
-\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x35\
-\x2c\x32\x37\x37\x2e\x33\x37\x35\x68\x32\x35\x39\x2e\x37\x30\x34\
-\x4c\x32\x32\x35\x2e\x30\x30\x32\x2c\x33\x39\x37\x2e\x30\x37\x37\
-\x4c\x32\x35\x36\x2c\x34\x32\x37\x6c\x31\x37\x31\x2d\x31\x37\x31\
-\x4c\x32\x35\x36\x2c\x38\x35\x6c\x2d\x32\x39\x2e\x39\x32\x32\x2c\
-\x32\x39\x2e\x39\x32\x34\x6c\x31\x31\x38\x2e\x36\x32\x36\x2c\x31\
-\x31\x39\x2e\x37\x30\x31\x48\x38\x35\x56\x32\x37\x37\x2e\x33\x37\
-\x35\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
-\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x04\x4e\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
-\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
-\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
-\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
-\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
-\x38\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\x73\x69\
-\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x36\x33\
-\x2e\x39\x39\x39\x36\x70\x74\x27\x20\x68\x65\x69\x67\x68\x74\x3d\
-\x27\x36\x33\x2e\x39\x39\x39\x37\x70\x74\x27\x20\x76\x69\x65\x77\
-\x42\x6f\x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\
-\x38\x35\x38\x33\x20\x36\x33\x2e\x39\x39\x39\x36\x20\x36\x33\x2e\
-\x39\x39\x39\x37\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\
-\x67\x65\x31\x27\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
-\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
-\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
-\x20\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\
-\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x33\
-\x2e\x39\x35\x37\x33\x35\x20\x2d\x33\x32\x2e\x31\x32\x4c\x20\x31\
-\x31\x2e\x39\x30\x33\x36\x20\x2d\x35\x31\x2e\x33\x30\x33\x39\x4c\
-\x20\x35\x36\x2e\x31\x35\x32\x33\x20\x2d\x34\x32\x2e\x35\x30\x32\
-\x32\x4c\x20\x34\x30\x2e\x36\x37\x39\x34\x20\x2d\x32\x32\x2e\x35\
-\x32\x38\x31\x4c\x20\x33\x2e\x39\x35\x37\x33\x35\x20\x2d\x33\x32\
-\x2e\x31\x32\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\
-\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\
-\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\
-\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\
-\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\
-\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\
-\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\
-\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x32\x2e\x35\x30\
-\x39\x33\x37\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\
-\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\
-\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\
-\x39\x39\x36\x32\x36\x34\x20\x35\x38\x2e\x34\x36\x36\x39\x20\x31\
-\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\
-\x65\x20\x63\x78\x3d\x27\x33\x2e\x39\x35\x37\x33\x35\x27\x20\x63\
-\x79\x3d\x27\x2d\x33\x32\x2e\x31\x32\x27\x20\x66\x69\x6c\x6c\x3d\
-\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\
-\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\
-\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\
-\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\
-\x39\x39\x36\x32\x36\x34\x20\x35\x38\x2e\x34\x36\x36\x39\x20\x31\
-\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\
-\x65\x20\x63\x78\x3d\x27\x31\x31\x2e\x39\x30\x33\x36\x27\x20\x63\
-\x79\x3d\x27\x2d\x35\x31\x2e\x33\x30\x33\x39\x27\x20\x66\x69\x6c\
-\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x72\x3d\x27\x36\
-\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\
-\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\
-\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\
-\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\x38\x2e\x34\x36\x36\x39\
-\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\
-\x63\x6c\x65\x20\x63\x78\x3d\x27\x35\x36\x2e\x31\x35\x32\x33\x27\
-\x20\x63\x79\x3d\x27\x2d\x34\x32\x2e\x35\x30\x32\x32\x27\x20\x66\
-\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x72\x3d\
-\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
-\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
-\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
-\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\x38\x2e\x34\x36\
-\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\x63\
-\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x34\x30\x2e\x36\x37\x39\
-\x34\x27\x20\x63\x79\x3d\x27\x2d\x32\x32\x2e\x35\x32\x38\x31\x27\
-\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\
-\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\
-\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x04\xd5\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
-\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
-\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
-\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
-\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
-\x38\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\x73\x69\
-\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x36\x33\
-\x2e\x39\x39\x39\x36\x70\x74\x27\x20\x68\x65\x69\x67\x68\x74\x3d\
-\x27\x36\x33\x2e\x39\x39\x39\x37\x70\x74\x27\x20\x76\x69\x65\x77\
-\x42\x6f\x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\
-\x38\x35\x38\x33\x20\x36\x33\x2e\x39\x39\x39\x36\x20\x36\x33\x2e\
-\x39\x39\x39\x37\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\
-\x67\x65\x31\x27\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
-\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
-\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
-\x20\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\
-\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x33\
-\x2e\x39\x35\x37\x33\x35\x20\x2d\x33\x32\x2e\x31\x32\x43\x20\x32\
-\x2e\x32\x38\x39\x32\x32\x20\x2d\x33\x39\x2e\x33\x31\x31\x33\x20\
-\x36\x2e\x33\x36\x37\x30\x32\x20\x2d\x34\x36\x2e\x32\x33\x38\x36\
-\x20\x31\x31\x2e\x39\x30\x33\x36\x20\x2d\x35\x31\x2e\x33\x30\x33\
-\x39\x43\x20\x32\x39\x2e\x36\x36\x38\x37\x20\x2d\x36\x37\x2e\x35\
-\x35\x36\x38\x20\x35\x35\x2e\x32\x32\x39\x32\x20\x2d\x36\x30\x2e\
-\x36\x34\x32\x20\x35\x36\x2e\x31\x35\x32\x33\x20\x2d\x34\x32\x2e\
-\x35\x30\x32\x32\x43\x20\x35\x36\x2e\x36\x31\x33\x36\x20\x2d\x33\
-\x33\x2e\x34\x33\x38\x31\x20\x34\x39\x2e\x31\x31\x33\x32\x20\x2d\
-\x32\x36\x2e\x35\x39\x35\x39\x20\x34\x30\x2e\x36\x37\x39\x34\x20\
-\x2d\x32\x32\x2e\x35\x32\x38\x31\x43\x20\x32\x35\x2e\x33\x39\x39\
-\x35\x20\x2d\x31\x35\x2e\x31\x35\x38\x32\x20\x37\x2e\x31\x39\x39\
-\x33\x35\x20\x2d\x31\x38\x2e\x31\x34\x33\x36\x20\x33\x2e\x39\x35\
-\x37\x33\x35\x20\x2d\x33\x32\x2e\x31\x32\x5a\x27\x20\x66\x69\x6c\
-\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\
-\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\
-\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\
-\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\
-\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\
-\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\
-\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\
-\x68\x3d\x27\x32\x2e\x35\x30\x39\x33\x37\x27\x2f\x3e\x0a\x3c\x2f\
-\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\
-\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\
-\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\x38\
-\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\
-\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x33\x2e\x39\
-\x35\x37\x33\x35\x27\x20\x63\x79\x3d\x27\x2d\x33\x32\x2e\x31\x32\
-\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\
-\x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\
-\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\
-\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\
-\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\x38\
-\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\
-\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x31\x31\x2e\
-\x39\x30\x33\x36\x27\x20\x63\x79\x3d\x27\x2d\x35\x31\x2e\x33\x30\
-\x33\x39\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\
-\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\
-\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\
-\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\
-\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
-\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\
-\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x35\
-\x36\x2e\x31\x35\x32\x33\x27\x20\x63\x79\x3d\x27\x2d\x34\x32\x2e\
-\x35\x30\x32\x32\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\
-\x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\
-\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\
-\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\
-\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\
-\x34\x20\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\
-\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\
-\x27\x34\x30\x2e\x36\x37\x39\x34\x27\x20\x63\x79\x3d\x27\x2d\x32\
-\x32\x2e\x35\x32\x38\x31\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\
-\x30\x30\x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\x32\x35\
-\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\
-\x73\x76\x67\x3e\
-\x00\x00\x02\xf2\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x43\x69\x72\x63\x6c\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\
-\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\
-\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\
-\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\
-\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\
-\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x35\x31\x32\x70\x78\
-\x22\x20\x79\x3d\x22\x35\x31\x32\x70\x78\x22\x0d\x0a\x09\x20\x76\
-\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\
-\x35\x31\x32\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\
-\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\
-\x35\x31\x32\x20\x35\x31\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\
-\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\
-\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
-\x74\x72\x69\x78\x28\x32\x34\x20\x30\x20\x30\x20\x32\x34\x20\x30\
-\x20\x30\x29\x27\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
-\x4d\x31\x30\x2c\x30\x2e\x34\x43\x34\x2e\x36\x39\x38\x2c\x30\x2e\
-\x34\x2c\x30\x2e\x34\x2c\x34\x2e\x36\x39\x38\x2c\x30\x2e\x34\x2c\
-\x31\x30\x43\x30\x2e\x34\x2c\x31\x35\x2e\x33\x30\x32\x2c\x34\x2e\
-\x36\x39\x38\x2c\x31\x39\x2e\x36\x2c\x31\x30\x2c\x31\x39\x2e\x36\
-\x63\x35\x2e\x33\x30\x31\x2c\x30\x2c\x39\x2e\x36\x2d\x34\x2e\x32\
-\x39\x38\x2c\x39\x2e\x36\x2d\x39\x2e\x36\x30\x31\x0d\x0a\x09\x43\
-\x31\x39\x2e\x36\x2c\x34\x2e\x36\x39\x38\x2c\x31\x35\x2e\x33\x30\
-\x31\x2c\x30\x2e\x34\x2c\x31\x30\x2c\x30\x2e\x34\x7a\x20\x4d\x31\
-\x30\x2c\x31\x37\x2e\x35\x39\x39\x63\x2d\x34\x2e\x31\x39\x37\x2c\
-\x30\x2d\x37\x2e\x36\x2d\x33\x2e\x34\x30\x32\x2d\x37\x2e\x36\x2d\
-\x37\x2e\x36\x53\x35\x2e\x38\x30\x32\x2c\x32\x2e\x34\x2c\x31\x30\
-\x2c\x32\x2e\x34\x63\x34\x2e\x31\x39\x37\x2c\x30\x2c\x37\x2e\x36\
-\x30\x31\x2c\x33\x2e\x34\x30\x32\x2c\x37\x2e\x36\x30\x31\x2c\x37\
-\x2e\x36\x0d\x0a\x09\x53\x31\x34\x2e\x31\x39\x37\x2c\x31\x37\x2e\
-\x35\x39\x39\x2c\x31\x30\x2c\x31\x37\x2e\x35\x39\x39\x7a\x22\x2f\
-\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
-\x0a\
-\x00\x00\x03\x4c\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x32\x31\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
-\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
-\x35\x36\x2c\x31\x35\x32\x63\x2d\x35\x37\x2e\x32\x2c\x30\x2d\x31\
-\x30\x34\x2c\x34\x36\x2e\x38\x2d\x31\x30\x34\x2c\x31\x30\x34\x73\
-\x34\x36\x2e\x38\x2c\x31\x30\x34\x2c\x31\x30\x34\x2c\x31\x30\x34\
-\x73\x31\x30\x34\x2d\x34\x36\x2e\x38\x2c\x31\x30\x34\x2d\x31\x30\
-\x34\x53\x33\x31\x33\x2e\x32\x2c\x31\x35\x32\x2c\x32\x35\x36\x2c\
-\x31\x35\x32\x7a\x20\x4d\x32\x35\x36\x2c\x34\x38\x0d\x0a\x09\x09\
-\x09\x43\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\x2c\x34\x38\x2c\
-\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\x2c\x32\x35\x36\x73\x39\
-\x33\x2e\x36\x30\x31\x2c\x32\x30\x38\x2c\x32\x30\x38\x2c\x32\x30\
-\x38\x73\x32\x30\x38\x2d\x39\x33\x2e\x36\x30\x31\x2c\x32\x30\x38\
-\x2d\x32\x30\x38\x53\x33\x37\x30\x2e\x33\x39\x39\x2c\x34\x38\x2c\
-\x32\x35\x36\x2c\x34\x38\x7a\x20\x4d\x32\x35\x36\x2c\x34\x32\x32\
-\x2e\x34\x0d\x0a\x09\x09\x09\x63\x2d\x39\x31\x2e\x35\x31\x38\x2c\
-\x30\x2d\x31\x36\x36\x2e\x34\x2d\x37\x34\x2e\x38\x38\x33\x2d\x31\
-\x36\x36\x2e\x34\x2d\x31\x36\x36\x2e\x34\x53\x31\x36\x34\x2e\x34\
-\x38\x32\x2c\x38\x39\x2e\x36\x2c\x32\x35\x36\x2c\x38\x39\x2e\x36\
-\x53\x34\x32\x32\x2e\x34\x2c\x31\x36\x34\x2e\x34\x38\x32\x2c\x34\
-\x32\x32\x2e\x34\x2c\x32\x35\x36\x53\x33\x34\x37\x2e\x35\x31\x38\
-\x2c\x34\x32\x32\x2e\x34\x2c\x32\x35\x36\x2c\x34\x32\x32\x2e\x34\
-\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\
-\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x02\x7f\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
-\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
-\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
-\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\
-\x3d\x22\x32\x38\x38\x2c\x39\x36\x20\x33\x33\x37\x2e\x39\x2c\x31\
-\x34\x35\x2e\x39\x20\x32\x37\x34\x2c\x32\x30\x39\x2e\x37\x20\x32\
-\x37\x34\x2c\x32\x30\x39\x2e\x37\x20\x31\x34\x35\x2e\x39\x2c\x33\
-\x33\x37\x2e\x39\x20\x39\x36\x2c\x32\x38\x38\x20\x39\x36\x2c\x34\
-\x31\x36\x20\x32\x32\x34\x2c\x34\x31\x36\x20\x31\x37\x34\x2e\x31\
-\x2c\x33\x36\x36\x2e\x31\x20\x33\x35\x37\x2e\x34\x2c\x31\x38\x32\
-\x2e\x39\x20\x33\x36\x36\x2e\x31\x2c\x31\x37\x34\x2e\x31\x20\x0d\
-\x0a\x09\x34\x31\x36\x2c\x32\x32\x34\x20\x34\x31\x36\x2c\x39\x36\
-\x20\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x02\xa2\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x32\x38\x2c\x34\x30\
-\x35\x2e\x34\x32\x39\x43\x31\x32\x38\x2c\x34\x32\x38\x2e\x38\x34\
-\x36\x2c\x31\x34\x37\x2e\x31\x39\x38\x2c\x34\x34\x38\x2c\x31\x37\
-\x30\x2e\x36\x36\x37\x2c\x34\x34\x38\x68\x31\x37\x30\x2e\x36\x36\
-\x37\x43\x33\x36\x34\x2e\x38\x30\x32\x2c\x34\x34\x38\x2c\x33\x38\
-\x34\x2c\x34\x32\x38\x2e\x38\x34\x36\x2c\x33\x38\x34\x2c\x34\x30\
-\x35\x2e\x34\x32\x39\x56\x31\x36\x30\x48\x31\x32\x38\x56\x34\x30\
-\x35\x2e\x34\x32\x39\x7a\x20\x4d\x34\x31\x36\x2c\x39\x36\x0d\x0a\
-\x09\x09\x68\x2d\x38\x30\x6c\x2d\x32\x36\x2e\x37\x38\x35\x2d\x33\
-\x32\x48\x32\x30\x32\x2e\x37\x38\x36\x4c\x31\x37\x36\x2c\x39\x36\
-\x48\x39\x36\x76\x33\x32\x68\x33\x32\x30\x56\x39\x36\x7a\x22\x2f\
-\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
-\x0a\
-\x00\x00\x04\x3d\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
-\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
-\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
-\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
-\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
-\x38\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\x73\x69\
-\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\
-\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
-\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\
-\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\
-\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
-\x78\x6c\x69\x6e\x6b\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x36\x33\
-\x2e\x39\x39\x39\x36\x70\x74\x27\x20\x68\x65\x69\x67\x68\x74\x3d\
-\x27\x36\x33\x2e\x39\x39\x39\x37\x70\x74\x27\x20\x76\x69\x65\x77\
-\x42\x6f\x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\
-\x38\x35\x38\x33\x20\x36\x33\x2e\x39\x39\x39\x36\x20\x36\x33\x2e\
-\x39\x39\x39\x37\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\
-\x67\x65\x31\x27\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
-\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
-\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
-\x20\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\x37\x2e\x38\x35\x38\
-\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x33\
-\x2e\x39\x35\x37\x33\x35\x20\x2d\x33\x32\x2e\x31\x32\x4c\x20\x31\
-\x31\x2e\x39\x30\x33\x36\x20\x2d\x35\x31\x2e\x33\x30\x33\x39\x4c\
-\x20\x35\x36\x2e\x31\x35\x32\x33\x20\x2d\x34\x32\x2e\x35\x30\x32\
-\x32\x4c\x20\x34\x30\x2e\x36\x37\x39\x34\x20\x2d\x32\x32\x2e\x35\
-\x32\x38\x31\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\
-\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\
-\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\
-\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\
-\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\
-\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\
-\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\
-\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x32\x2e\x35\x30\x39\
-\x33\x37\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\
-\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\
-\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\
-\x39\x36\x32\x36\x34\x20\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\
-\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\
-\x20\x63\x78\x3d\x27\x33\x2e\x39\x35\x37\x33\x35\x27\x20\x63\x79\
-\x3d\x27\x2d\x33\x32\x2e\x31\x32\x27\x20\x66\x69\x6c\x6c\x3d\x27\
-\x23\x30\x30\x30\x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\x30\x32\
-\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\
-\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\
-\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\
-\x39\x36\x32\x36\x34\x20\x35\x38\x2e\x34\x36\x36\x39\x20\x31\x31\
-\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\
-\x20\x63\x78\x3d\x27\x31\x31\x2e\x39\x30\x33\x36\x27\x20\x63\x79\
-\x3d\x27\x2d\x35\x31\x2e\x33\x30\x33\x39\x27\x20\x66\x69\x6c\x6c\
-\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x72\x3d\x27\x36\x2e\
-\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\
-\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\
-\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\
-\x2e\x39\x39\x36\x32\x36\x34\x20\x35\x38\x2e\x34\x36\x36\x39\x20\
-\x31\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\
-\x6c\x65\x20\x63\x78\x3d\x27\x35\x36\x2e\x31\x35\x32\x33\x27\x20\
-\x63\x79\x3d\x27\x2d\x34\x32\x2e\x35\x30\x32\x32\x27\x20\x66\x69\
-\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x72\x3d\x27\
-\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\
-\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\
-\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\
-\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x35\x38\x2e\x34\x36\x36\
-\x39\x20\x31\x31\x37\x2e\x38\x35\x38\x29\x27\x3e\x0a\x3c\x63\x69\
-\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x34\x30\x2e\x36\x37\x39\x34\
-\x27\x20\x63\x79\x3d\x27\x2d\x32\x32\x2e\x35\x32\x38\x31\x27\x20\
-\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x72\
-\x3d\x27\x36\x2e\x30\x32\x32\x35\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\
-\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x02\x7d\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x38\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
-\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x32\
-\x37\x2c\x32\x33\x34\x2e\x36\x32\x35\x48\x31\x36\x37\x2e\x32\x39\
-\x36\x6c\x31\x31\x39\x2e\x37\x30\x32\x2d\x31\x31\x39\x2e\x37\x30\
-\x32\x4c\x32\x35\x36\x2c\x38\x35\x4c\x38\x35\x2c\x32\x35\x36\x6c\
-\x31\x37\x31\x2c\x31\x37\x31\x6c\x32\x39\x2e\x39\x32\x32\x2d\x32\
-\x39\x2e\x39\x32\x34\x4c\x31\x36\x37\x2e\x32\x39\x36\x2c\x32\x37\
-\x37\x2e\x33\x37\x35\x48\x34\x32\x37\x56\x32\x33\x34\x2e\x36\x32\
-\x35\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
-\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x02\xc9\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
-\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
-\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
-\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\
-\x3d\x22\x34\x38\x30\x2c\x32\x35\x36\x20\x33\x38\x34\x2c\x31\x36\
-\x30\x20\x33\x38\x34\x2c\x32\x33\x36\x20\x32\x37\x36\x2c\x32\x33\
-\x36\x20\x32\x37\x36\x2c\x31\x32\x38\x20\x33\x35\x32\x2c\x31\x32\
-\x38\x20\x32\x35\x36\x2c\x33\x32\x20\x31\x36\x30\x2c\x31\x32\x38\
-\x20\x32\x33\x36\x2c\x31\x32\x38\x20\x32\x33\x36\x2c\x32\x33\x36\
-\x20\x31\x32\x38\x2c\x32\x33\x36\x20\x31\x32\x38\x2c\x31\x36\x30\
-\x20\x33\x32\x2c\x32\x35\x36\x20\x31\x32\x38\x2c\x33\x35\x32\x20\
-\x0d\x0a\x09\x31\x32\x38\x2c\x32\x37\x36\x20\x32\x33\x36\x2c\x32\
-\x37\x36\x20\x32\x33\x36\x2c\x33\x38\x34\x20\x31\x36\x30\x2c\x33\
-\x38\x34\x20\x32\x35\x36\x2c\x34\x38\x30\x20\x33\x35\x32\x2c\x33\
-\x38\x34\x20\x32\x37\x35\x2e\x38\x2c\x33\x38\x34\x20\x32\x37\x35\
-\x2e\x34\x2c\x32\x37\x35\x2e\x35\x20\x33\x38\x34\x2c\x32\x37\x35\
-\x2e\x38\x20\x33\x38\x34\x2c\x33\x35\x32\x20\x22\x2f\x3e\x0d\x0a\
-\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x05\xca\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\
-\x64\x3d\x22\x4d\x34\x35\x30\x2e\x36\x37\x39\x2c\x32\x37\x33\x2e\
-\x35\x63\x2d\x31\x34\x2e\x35\x38\x35\x2d\x31\x34\x2e\x35\x37\x37\
-\x2d\x33\x36\x2e\x30\x35\x34\x2d\x31\x35\x2e\x38\x39\x2d\x35\x30\
-\x2e\x36\x33\x39\x2d\x31\x2e\x33\x31\x32\x6c\x2d\x34\x31\x2e\x36\
-\x38\x37\x2c\x34\x31\x2e\x36\x36\x34\x63\x2d\x31\x30\x2e\x38\x35\
-\x32\x2c\x31\x30\x2e\x38\x33\x36\x2d\x32\x33\x2e\x39\x33\x2c\x31\
-\x30\x2e\x38\x35\x39\x2d\x33\x31\x2e\x35\x36\x34\x2c\x31\x2e\x38\
-\x35\x32\x0d\x0a\x09\x63\x2d\x35\x2e\x30\x35\x37\x2d\x35\x2e\x39\
-\x36\x38\x2d\x33\x2e\x30\x36\x31\x2d\x32\x34\x2e\x33\x37\x34\x2d\
-\x31\x2e\x36\x34\x34\x2d\x33\x36\x2e\x30\x34\x39\x6c\x32\x30\x2e\
-\x39\x30\x37\x2d\x31\x37\x31\x2e\x38\x34\x39\x63\x31\x2e\x38\x36\
-\x37\x2d\x31\x35\x2e\x33\x35\x33\x2d\x39\x2e\x30\x37\x2d\x33\x30\
-\x2e\x31\x38\x35\x2d\x32\x34\x2e\x34\x33\x2d\x33\x32\x2e\x30\x35\
-\x31\x0d\x0a\x09\x63\x2d\x31\x35\x2e\x33\x35\x38\x2d\x31\x2e\x38\
-\x36\x37\x2d\x32\x39\x2e\x33\x32\x32\x2c\x39\x2e\x39\x33\x39\x2d\
-\x33\x31\x2e\x31\x39\x31\x2c\x32\x35\x2e\x32\x38\x39\x4c\x32\x36\
-\x37\x2e\x33\x37\x2c\x32\x33\x36\x2e\x30\x32\x31\x63\x2d\x31\x2e\
-\x32\x30\x35\x2c\x33\x2e\x33\x35\x38\x2d\x33\x2e\x37\x39\x2c\x33\
-\x2e\x39\x33\x38\x2d\x34\x2e\x30\x38\x31\x2d\x30\x2e\x35\x38\x32\
-\x4c\x32\x35\x35\x2e\x34\x34\x2c\x36\x30\x0d\x0a\x09\x63\x30\x2d\
-\x31\x35\x2e\x34\x36\x35\x2d\x31\x32\x2e\x35\x34\x32\x2d\x32\x38\
-\x2d\x32\x38\x2e\x30\x31\x34\x2d\x32\x38\x63\x2d\x31\x35\x2e\x34\
-\x37\x33\x2c\x30\x2d\x32\x38\x2e\x30\x31\x35\x2c\x31\x32\x2e\x35\
-\x33\x35\x2d\x32\x38\x2e\x30\x31\x35\x2c\x32\x38\x6c\x2d\x30\x2e\
-\x35\x35\x32\x2c\x31\x37\x36\x2e\x37\x35\x32\x63\x30\x2e\x31\x34\
-\x36\x2c\x32\x2e\x30\x34\x2d\x31\x2e\x36\x30\x34\x2c\x32\x2e\x36\
-\x32\x34\x2d\x31\x2e\x39\x32\x2c\x30\x2e\x32\x39\x34\x4c\x31\x37\
-\x32\x2e\x30\x31\x36\x2c\x39\x39\x2e\x30\x37\x37\x0d\x0a\x09\x63\
-\x2d\x32\x2e\x37\x35\x2d\x31\x35\x2e\x32\x31\x39\x2d\x31\x37\x2e\
-\x33\x32\x33\x2d\x32\x36\x2e\x32\x30\x33\x2d\x33\x32\x2e\x35\x34\
-\x38\x2d\x32\x33\x2e\x34\x35\x33\x63\x2d\x31\x35\x2e\x32\x32\x37\
-\x2c\x32\x2e\x37\x34\x38\x2d\x32\x35\x2e\x33\x33\x39\x2c\x31\x38\
-\x2e\x31\x38\x37\x2d\x32\x32\x2e\x35\x39\x31\x2c\x33\x33\x2e\x34\
-\x30\x33\x6c\x32\x32\x2e\x31\x39\x33\x2c\x31\x36\x31\x2e\x34\x35\
-\x35\x0d\x0a\x09\x63\x30\x2e\x30\x32\x33\x2c\x32\x2e\x38\x37\x32\
-\x2d\x30\x2e\x39\x34\x31\x2c\x34\x2e\x35\x31\x33\x2d\x32\x2e\x33\
-\x30\x38\x2c\x30\x2e\x38\x33\x31\x6c\x2d\x33\x33\x2e\x31\x30\x39\
-\x2d\x38\x38\x2e\x35\x31\x37\x63\x2d\x35\x2e\x31\x38\x2d\x31\x34\
-\x2e\x35\x37\x32\x2d\x32\x31\x2e\x31\x39\x36\x2d\x32\x33\x2e\x30\
-\x36\x35\x2d\x33\x35\x2e\x37\x37\x36\x2d\x31\x37\x2e\x38\x38\x39\
-\x0d\x0a\x09\x63\x2d\x31\x34\x2e\x35\x37\x39\x2c\x35\x2e\x31\x37\
-\x37\x2d\x32\x32\x2e\x32\x30\x31\x2c\x32\x32\x2e\x30\x36\x31\x2d\
-\x31\x37\x2e\x30\x32\x33\x2c\x33\x36\x2e\x36\x33\x31\x6c\x35\x38\
-\x2e\x30\x34\x32\x2c\x31\x38\x39\x2e\x36\x32\x35\x63\x30\x2e\x33\
-\x30\x33\x2c\x31\x2e\x30\x34\x36\x2c\x30\x2e\x36\x32\x34\x2c\x32\
-\x2e\x30\x38\x35\x2c\x30\x2e\x39\x35\x33\x2c\x33\x2e\x31\x31\x38\
-\x6c\x30\x2e\x31\x32\x31\x2c\x30\x2e\x33\x39\x0d\x0a\x09\x63\x30\
-\x2e\x30\x31\x31\x2c\x30\x2e\x30\x33\x31\x2c\x30\x2e\x30\x32\x35\
-\x2c\x30\x2e\x30\x35\x38\x2c\x30\x2e\x30\x33\x35\x2c\x30\x2e\x30\
-\x38\x38\x43\x31\x32\x36\x2e\x30\x37\x39\x2c\x34\x34\x34\x2e\x32\
-\x33\x33\x2c\x31\x37\x32\x2e\x35\x37\x2c\x34\x38\x30\x2c\x32\x32\
-\x37\x2e\x34\x32\x37\x2c\x34\x38\x30\x63\x33\x35\x2e\x31\x31\x36\
-\x2c\x30\x2c\x37\x31\x2e\x35\x39\x31\x2d\x31\x32\x2e\x33\x37\x38\
-\x2c\x39\x39\x2e\x33\x35\x37\x2d\x33\x33\x2e\x36\x37\x32\x0d\x0a\
-\x09\x63\x30\x2e\x30\x30\x31\x2c\x30\x2c\x30\x2e\x30\x30\x33\x2d\
-\x30\x2e\x30\x30\x32\x2c\x30\x2e\x30\x30\x33\x2d\x30\x2e\x30\x30\
-\x32\x63\x32\x39\x2e\x39\x39\x2d\x31\x38\x2e\x30\x35\x31\x2c\x31\
-\x32\x36\x2e\x30\x37\x31\x2d\x31\x32\x31\x2e\x33\x34\x37\x2c\x31\
-\x32\x36\x2e\x30\x37\x31\x2d\x31\x32\x31\x2e\x33\x34\x37\x43\x34\
-\x36\x37\x2e\x34\x34\x35\x2c\x33\x31\x30\x2e\x34\x30\x32\x2c\x34\
-\x36\x35\x2e\x32\x36\x36\x2c\x32\x38\x38\x2e\x30\x38\x2c\x34\x35\
-\x30\x2e\x36\x37\x39\x2c\x32\x37\x33\x2e\x35\x7a\x22\x2f\x3e\x0d\
-\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\x52\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\
-\x64\x3d\x22\x4d\x34\x33\x37\x2e\x33\x33\x34\x2c\x31\x34\x34\x48\
-\x32\x35\x36\x2e\x30\x30\x36\x6c\x2d\x34\x32\x2e\x36\x36\x38\x2d\
-\x34\x38\x48\x37\x34\x2e\x36\x36\x36\x43\x35\x31\x2e\x31\x39\x37\
-\x2c\x39\x36\x2c\x33\x32\x2c\x31\x31\x35\x2e\x31\x39\x38\x2c\x33\
-\x32\x2c\x31\x33\x38\x2e\x36\x36\x37\x76\x32\x33\x34\x2e\x36\x36\
-\x36\x43\x33\x32\x2c\x33\x39\x36\x2e\x38\x30\x32\x2c\x35\x31\x2e\
-\x31\x39\x37\x2c\x34\x31\x36\x2c\x37\x34\x2e\x36\x36\x36\x2c\x34\
-\x31\x36\x68\x33\x36\x32\x2e\x36\x36\x38\x0d\x0a\x09\x43\x34\x36\
-\x30\x2e\x38\x30\x33\x2c\x34\x31\x36\x2c\x34\x38\x30\x2c\x33\x39\
-\x36\x2e\x38\x30\x32\x2c\x34\x38\x30\x2c\x33\x37\x33\x2e\x33\x33\
-\x33\x56\x31\x38\x36\x2e\x36\x36\x37\x43\x34\x38\x30\x2c\x31\x36\
-\x33\x2e\x31\x39\x38\x2c\x34\x36\x30\x2e\x38\x30\x33\x2c\x31\x34\
-\x34\x2c\x34\x33\x37\x2e\x33\x33\x34\x2c\x31\x34\x34\x7a\x20\x4d\
-\x34\x34\x38\x2c\x33\x37\x33\x2e\x33\x33\x33\x0d\x0a\x09\x63\x30\
-\x2c\x35\x2e\x37\x38\x32\x2d\x34\x2e\x38\x38\x35\x2c\x31\x30\x2e\
-\x36\x36\x37\x2d\x31\x30\x2e\x36\x36\x36\x2c\x31\x30\x2e\x36\x36\
-\x37\x48\x37\x34\x2e\x36\x36\x36\x43\x36\x38\x2e\x38\x38\x34\x2c\
-\x33\x38\x34\x2c\x36\x34\x2c\x33\x37\x39\x2e\x31\x31\x35\x2c\x36\
-\x34\x2c\x33\x37\x33\x2e\x33\x33\x33\x56\x31\x37\x36\x68\x33\x37\
-\x33\x2e\x33\x33\x34\x63\x35\x2e\x37\x38\x31\x2c\x30\x2c\x31\x30\
-\x2e\x36\x36\x36\x2c\x34\x2e\x38\x38\x35\x2c\x31\x30\x2e\x36\x36\
-\x36\x2c\x31\x30\x2e\x36\x36\x37\x0d\x0a\x09\x56\x33\x37\x33\x2e\
-\x33\x33\x33\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
-\x0a\
-\x00\x00\x00\x6c\
-\x3c\
-\x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
-\x30\x2f\x73\x76\x67\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\
-\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x3e\x3c\x70\x61\x74\x68\
-\x20\x64\x3d\x22\x4d\x31\x38\x20\x31\x32\x76\x31\x48\x38\x76\x35\
-\x6c\x2d\x36\x2d\x36\x20\x36\x2d\x36\x76\x35\x68\x38\x56\x32\x68\
-\x32\x7a\x22\x2f\x3e\x3c\x2f\x73\x76\x67\x3e\
-\x00\x00\x02\x79\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x31\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
-\x0d\x0a\x09\x09\x3c\x67\x3e\x0d\x0a\x09\x09\x09\x3c\x70\x6f\x6c\
-\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x31\x38\x36\
-\x2e\x33\x30\x31\x2c\x33\x33\x39\x2e\x38\x39\x33\x20\x39\x36\x2c\
-\x32\x34\x39\x2e\x34\x36\x31\x20\x36\x34\x2c\x32\x37\x39\x2e\x39\
-\x36\x38\x20\x31\x38\x36\x2e\x33\x30\x31\x2c\x34\x30\x32\x20\x34\
-\x34\x38\x2c\x31\x34\x30\x2e\x35\x30\x36\x20\x34\x31\x36\x2c\x31\
-\x31\x30\x20\x09\x09\x09\x22\x2f\x3e\x0d\x0a\x09\x09\x3c\x2f\x67\
-\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\
-\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\x6c\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x0d\x0a\x09\x09\x3c\x72\x65\x63\x74\x20\x78\x3d\x22\x31\x37\x38\
-\x2e\x38\x34\x36\x22\x20\x79\x3d\x22\x39\x32\x2e\x30\x38\x37\x22\
-\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
-\x69\x78\x28\x2d\x30\x2e\x37\x30\x37\x31\x20\x2d\x30\x2e\x37\x30\
-\x37\x31\x20\x30\x2e\x37\x30\x37\x31\x20\x2d\x30\x2e\x37\x30\x37\
-\x31\x20\x32\x32\x34\x2e\x33\x34\x37\x36\x20\x36\x33\x31\x2e\x31\
-\x34\x39\x38\x29\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x32\x38\
-\x2e\x30\x38\x35\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x35\
-\x34\x2e\x30\x34\x39\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\
-\x20\x64\x3d\x22\x4d\x34\x37\x31\x2e\x37\x32\x33\x2c\x38\x38\x2e\
-\x33\x39\x33\x6c\x2d\x34\x38\x2e\x31\x31\x35\x2d\x34\x38\x2e\x31\
-\x31\x34\x63\x2d\x31\x31\x2e\x37\x32\x33\x2d\x31\x31\x2e\x37\x32\
-\x34\x2d\x33\x31\x2e\x35\x35\x38\x2d\x31\x30\x2e\x38\x39\x36\x2d\
-\x34\x34\x2e\x33\x30\x34\x2c\x31\x2e\x38\x35\x6c\x2d\x34\x35\x2e\
-\x32\x30\x32\x2c\x34\x35\x2e\x32\x30\x33\x6c\x39\x30\x2e\x35\x36\
-\x39\x2c\x39\x30\x2e\x35\x36\x38\x6c\x34\x35\x2e\x32\x30\x32\x2d\
-\x34\x35\x2e\x32\x30\x32\x0d\x0a\x09\x09\x43\x34\x38\x32\x2e\x36\
-\x31\x36\x2c\x31\x31\x39\x2e\x39\x35\x32\x2c\x34\x38\x33\x2e\x34\
-\x34\x35\x2c\x31\x30\x30\x2e\x31\x31\x36\x2c\x34\x37\x31\x2e\x37\
-\x32\x33\x2c\x38\x38\x2e\x33\x39\x33\x7a\x22\x2f\x3e\x0d\x0a\x09\
-\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\
-\x22\x36\x34\x2e\x30\x32\x31\x2c\x33\x36\x33\x2e\x32\x35\x32\x20\
-\x33\x32\x2c\x34\x38\x30\x20\x31\x34\x38\x2e\x37\x33\x37\x2c\x34\
-\x34\x37\x2e\x39\x37\x39\x20\x09\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\
-\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x05\x27\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
-\x22\x49\x63\x6f\x6e\x5f\x31\x32\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
-\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
-\x35\x36\x2c\x36\x34\x43\x31\x35\x30\x2e\x34\x30\x31\x2c\x36\x34\
-\x2c\x36\x34\x2c\x31\x35\x30\x2e\x34\x30\x31\x2c\x36\x34\x2c\x32\
-\x35\x36\x63\x30\x2c\x31\x30\x35\x2e\x36\x30\x34\x2c\x38\x36\x2e\
-\x34\x30\x31\x2c\x31\x39\x32\x2c\x31\x39\x32\x2c\x31\x39\x32\x63\
-\x31\x38\x2e\x31\x33\x36\x2c\x30\x2c\x33\x32\x2d\x31\x33\x2e\x38\
-\x36\x34\x2c\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\x09\x63\x30\x2d\
-\x38\x2e\x35\x33\x31\x2d\x33\x2e\x31\x39\x38\x2d\x31\x36\x2d\x38\
-\x2e\x35\x33\x31\x2d\x32\x31\x2e\x33\x33\x33\x63\x2d\x35\x2e\x33\
-\x33\x33\x2d\x35\x2e\x33\x33\x34\x2d\x38\x2e\x35\x33\x31\x2d\x31\
-\x32\x2e\x38\x30\x33\x2d\x38\x2e\x35\x33\x31\x2d\x32\x31\x2e\x33\
-\x33\x34\x63\x30\x2d\x31\x38\x2e\x31\x33\x35\x2c\x31\x33\x2e\x38\
-\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x68\x33\x38\x2e\x33\
-\x39\x36\x0d\x0a\x09\x09\x09\x63\x35\x38\x2e\x36\x36\x37\x2c\x30\
-\x2c\x31\x30\x36\x2e\x36\x36\x37\x2d\x34\x38\x2c\x31\x30\x36\x2e\
-\x36\x36\x37\x2d\x31\x30\x36\x2e\x36\x36\x36\x43\x34\x34\x38\x2c\
-\x31\x34\x30\x2e\x38\x30\x32\x2c\x33\x36\x31\x2e\x36\x30\x34\x2c\
-\x36\x34\x2c\x32\x35\x36\x2c\x36\x34\x7a\x20\x4d\x31\x33\x38\x2e\
-\x36\x36\x37\x2c\x32\x35\x36\x63\x2d\x31\x38\x2e\x31\x33\x36\x2c\
-\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2d\x33\
-\x32\x73\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\
-\x32\x0d\x0a\x09\x09\x09\x63\x31\x38\x2e\x31\x33\x35\x2c\x30\x2c\
-\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x53\
-\x31\x35\x36\x2e\x38\x30\x32\x2c\x32\x35\x36\x2c\x31\x33\x38\x2e\
-\x36\x36\x37\x2c\x32\x35\x36\x7a\x20\x4d\x32\x30\x32\x2e\x36\x36\
-\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x63\x2d\x31\x38\x2e\x31\x33\
-\x36\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x35\x2d\x33\x32\
-\x2d\x33\x32\x63\x30\x2d\x31\x38\x2e\x31\x33\x36\x2c\x31\x33\x2e\
-\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\
-\x09\x63\x31\x38\x2e\x31\x33\x35\x2c\x30\x2c\x33\x32\x2c\x31\x33\
-\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x43\x32\x33\x34\x2e\x36\
-\x36\x37\x2c\x31\x35\x36\x2e\x38\x30\x32\x2c\x32\x32\x30\x2e\x38\
-\x30\x32\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\x32\x30\x32\x2e\x36\
-\x36\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x7a\x20\x4d\x33\x30\x39\
-\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\x37\x63\x2d\x31\x38\
-\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x35\
-\x2d\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\x09\x63\x30\x2d\x31\x38\
-\x2e\x31\x33\x36\x2c\x31\x33\x2e\x38\x36\x35\x2d\x33\x32\x2c\x33\
-\x32\x2d\x33\x32\x63\x31\x38\x2e\x31\x33\x36\x2c\x30\x2c\x33\x32\
-\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x43\x33\x34\
-\x31\x2e\x33\x33\x33\x2c\x31\x35\x36\x2e\x38\x30\x32\x2c\x33\x32\
-\x37\x2e\x34\x36\x39\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\x33\x30\
-\x39\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\x37\x7a\x20\x4d\
-\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x0d\x0a\x09\x09\x09\
-\x63\x2d\x31\x38\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\x2d\x31\x33\
-\x2e\x38\x36\x34\x2d\x33\x32\x2d\x33\x32\x73\x31\x33\x2e\x38\x36\
-\x35\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x63\x31\x38\x2e\x31\x33\
-\x36\x2c\x30\x2c\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\
-\x2c\x33\x32\x53\x33\x39\x31\x2e\x34\x36\x39\x2c\x32\x35\x36\x2c\
-\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x7a\x22\x2f\x3e\x0d\
-\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
-\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x07\x80\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
-\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
-\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
-\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
-\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
-\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x39\x33\x2e\x34\x36\
-\x2c\x32\x34\x39\x2e\x30\x35\x36\x63\x33\x2e\x37\x32\x33\x2d\x30\
-\x2e\x36\x37\x2c\x37\x2e\x35\x38\x39\x2d\x31\x2e\x30\x34\x31\x2c\
-\x31\x31\x2e\x35\x38\x36\x2d\x31\x2e\x30\x34\x31\x4c\x32\x30\x31\
-\x2e\x39\x32\x34\x2c\x32\x34\x38\x68\x31\x30\x33\x2e\x38\x32\x33\
-\x63\x34\x2e\x35\x30\x33\x2c\x30\x2c\x38\x2e\x38\x30\x36\x2d\x30\
-\x2e\x36\x31\x37\x2c\x31\x32\x2e\x39\x30\x38\x2d\x31\x2e\x37\x35\
-\x34\x0d\x0a\x09\x09\x63\x31\x39\x2e\x33\x37\x2d\x35\x2e\x33\x36\
-\x33\x2c\x33\x33\x2e\x33\x34\x35\x2d\x32\x32\x2e\x35\x33\x37\x2c\
-\x33\x33\x2e\x33\x34\x35\x2d\x34\x33\x2e\x36\x36\x33\x76\x2d\x33\
-\x30\x2e\x38\x32\x32\x76\x2d\x35\x36\x2e\x34\x30\x32\x63\x30\x2d\
-\x32\x34\x2e\x38\x33\x32\x2d\x32\x31\x2e\x31\x35\x2d\x34\x33\x2e\
-\x34\x38\x34\x2d\x34\x36\x2e\x32\x38\x39\x2d\x34\x37\x2e\x36\x30\
-\x36\x0d\x0a\x09\x09\x63\x2d\x31\x35\x2e\x39\x33\x31\x2d\x32\x2e\
-\x36\x32\x34\x2d\x33\x39\x2e\x32\x35\x38\x2d\x33\x2e\x38\x32\x37\
-\x2d\x35\x35\x2e\x30\x38\x39\x2d\x33\x2e\x37\x34\x39\x63\x2d\x31\
-\x35\x2e\x38\x32\x39\x2c\x30\x2e\x30\x38\x36\x2d\x33\x30\x2e\x39\
-\x38\x31\x2c\x31\x2e\x34\x30\x34\x2d\x34\x34\x2e\x32\x37\x37\x2c\
-\x33\x2e\x37\x34\x39\x43\x31\x36\x37\x2e\x31\x34\x33\x2c\x37\x34\
-\x2e\x35\x37\x36\x2c\x31\x36\x30\x2c\x38\x38\x2e\x39\x32\x38\x2c\
-\x31\x36\x30\x2c\x31\x31\x35\x2e\x33\x35\x39\x56\x31\x34\x34\x68\
-\x39\x36\x0d\x0a\x09\x09\x76\x31\x36\x48\x31\x32\x38\x2e\x38\x32\
-\x63\x2d\x33\x35\x2e\x36\x32\x38\x2c\x30\x2d\x36\x34\x2e\x35\x33\
-\x38\x2c\x34\x32\x2e\x35\x37\x31\x2d\x36\x34\x2e\x38\x31\x33\x2c\
-\x39\x35\x2e\x32\x34\x32\x43\x36\x34\x2e\x30\x30\x35\x2c\x32\x35\
-\x35\x2e\x34\x39\x35\x2c\x36\x34\x2c\x32\x35\x35\x2e\x37\x34\x37\
-\x2c\x36\x34\x2c\x32\x35\x36\x63\x30\x2c\x39\x2e\x35\x32\x33\x2c\
-\x30\x2e\x39\x34\x2c\x31\x38\x2e\x37\x32\x2c\x32\x2e\x36\x38\x35\
-\x2c\x32\x37\x2e\x34\x30\x34\x0d\x0a\x09\x09\x43\x37\x34\x2e\x36\
-\x34\x38\x2c\x33\x32\x33\x2e\x30\x37\x2c\x39\x39\x2e\x34\x35\x31\
-\x2c\x33\x35\x32\x2c\x31\x32\x38\x2e\x38\x32\x2c\x33\x35\x32\x48\
-\x31\x34\x34\x76\x2d\x32\x2e\x36\x36\x32\x76\x2d\x34\x33\x2e\x32\
-\x37\x33\x43\x31\x34\x34\x2c\x32\x37\x39\x2e\x32\x33\x38\x2c\x31\
-\x36\x34\x2e\x31\x34\x36\x2c\x32\x35\x34\x2e\x33\x33\x32\x2c\x31\
-\x39\x33\x2e\x34\x36\x2c\x32\x34\x39\x2e\x30\x35\x36\x7a\x20\x4d\
-\x32\x30\x33\x2e\x36\x35\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x0d\
-\x0a\x09\x09\x63\x2d\x39\x2e\x35\x39\x32\x2c\x30\x2d\x31\x37\x2e\
-\x33\x38\x34\x2d\x37\x2e\x37\x38\x35\x2d\x31\x37\x2e\x33\x38\x34\
-\x2d\x31\x37\x2e\x34\x30\x33\x63\x30\x2d\x39\x2e\x36\x36\x34\x2c\
-\x37\x2e\x37\x37\x34\x2d\x31\x37\x2e\x35\x32\x2c\x31\x37\x2e\x33\
-\x38\x34\x2d\x31\x37\x2e\x35\x32\x63\x39\x2e\x35\x37\x34\x2c\x30\
-\x2c\x31\x37\x2e\x33\x39\x39\x2c\x37\x2e\x38\x35\x35\x2c\x31\x37\
-\x2e\x33\x39\x39\x2c\x31\x37\x2e\x35\x32\x0d\x0a\x09\x09\x43\x32\
-\x32\x31\x2e\x30\x35\x36\x2c\x31\x31\x39\x2e\x32\x31\x37\x2c\x32\
-\x31\x33\x2e\x32\x34\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x2c\x32\
-\x30\x33\x2e\x36\x35\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x7a\x22\
-\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\
-\x34\x33\x2e\x39\x35\x31\x2c\x32\x32\x32\x2e\x35\x34\x33\x43\x34\
-\x33\x34\x2e\x37\x38\x2c\x31\x38\x36\x2e\x30\x32\x31\x2c\x34\x31\
-\x31\x2e\x30\x33\x33\x2c\x31\x36\x30\x2c\x33\x38\x33\x2e\x31\x38\
-\x2c\x31\x36\x30\x48\x33\x36\x38\x76\x32\x2e\x36\x32\x36\x76\x33\
-\x38\x2e\x30\x34\x36\x63\x30\x2c\x33\x33\x2e\x39\x31\x35\x2d\x32\
-\x32\x2e\x32\x38\x36\x2c\x35\x38\x2e\x34\x37\x34\x2d\x34\x39\x2e\
-\x34\x38\x39\x2c\x36\x32\x2e\x36\x38\x31\x0d\x0a\x09\x09\x63\x2d\
-\x32\x2e\x37\x33\x37\x2c\x30\x2e\x34\x32\x34\x2d\x35\x2e\x34\x38\
-\x33\x2c\x30\x2e\x36\x34\x36\x2d\x38\x2e\x33\x30\x31\x2c\x30\x2e\
-\x36\x34\x36\x48\x32\x30\x36\x2e\x33\x35\x31\x63\x2d\x34\x2e\x35\
-\x31\x38\x2c\x30\x2d\x38\x2e\x39\x30\x34\x2c\x30\x2e\x35\x38\x34\
-\x2d\x31\x33\x2e\x30\x34\x39\x2c\x31\x2e\x36\x37\x32\x43\x31\x37\
-\x34\x2e\x31\x38\x2c\x32\x37\x30\x2e\x36\x38\x39\x2c\x31\x36\x30\
-\x2c\x32\x38\x36\x2e\x36\x2c\x31\x36\x30\x2c\x33\x30\x37\x2e\x32\
-\x33\x36\x76\x33\x32\x2e\x39\x32\x32\x0d\x0a\x09\x09\x76\x35\x34\
-\x2e\x33\x30\x35\x63\x30\x2c\x32\x34\x2e\x38\x33\x32\x2c\x32\x34\
-\x2e\x39\x37\x37\x2c\x33\x39\x2e\x34\x32\x36\x2c\x34\x39\x2e\x34\
-\x38\x31\x2c\x34\x36\x2e\x35\x35\x31\x63\x32\x39\x2e\x33\x32\x37\
-\x2c\x38\x2e\x35\x33\x31\x2c\x36\x31\x2e\x32\x36\x37\x2c\x31\x30\
-\x2e\x30\x36\x38\x2c\x39\x36\x2e\x33\x36\x36\x2c\x30\x43\x33\x32\
-\x39\x2e\x31\x35\x2c\x34\x33\x34\x2e\x33\x35\x34\x2c\x33\x35\x32\
-\x2c\x34\x32\x30\x2e\x38\x39\x33\x2c\x33\x35\x32\x2c\x33\x39\x34\
-\x2e\x34\x36\x33\x56\x33\x36\x38\x0d\x0a\x09\x09\x68\x2d\x39\x36\
-\x76\x2d\x31\x36\x68\x31\x32\x37\x2e\x31\x38\x63\x32\x35\x2e\x32\
-\x34\x2c\x30\x2c\x34\x37\x2e\x31\x30\x37\x2d\x32\x31\x2e\x33\x36\
-\x35\x2c\x35\x37\x2e\x38\x31\x34\x2d\x35\x32\x2e\x35\x34\x39\x43\
-\x34\x34\x35\x2e\x34\x37\x34\x2c\x32\x38\x36\x2e\x34\x30\x34\x2c\
-\x34\x34\x38\x2c\x32\x37\x31\x2e\x36\x34\x31\x2c\x34\x34\x38\x2c\
-\x32\x35\x36\x0d\x0a\x09\x09\x43\x34\x34\x38\x2c\x32\x34\x34\x2e\
-\x32\x33\x32\x2c\x34\x34\x36\x2e\x35\x36\x37\x2c\x32\x33\x32\x2e\
-\x39\x36\x32\x2c\x34\x34\x33\x2e\x39\x35\x31\x2c\x32\x32\x32\x2e\
-\x35\x34\x33\x7a\x20\x4d\x33\x30\x37\x2e\x38\x36\x37\x2c\x33\x38\
-\x32\x2e\x38\x32\x63\x39\x2e\x35\x39\x2c\x30\x2c\x31\x37\x2e\x33\
-\x38\x31\x2c\x37\x2e\x37\x38\x35\x2c\x31\x37\x2e\x33\x38\x31\x2c\
-\x31\x37\x2e\x34\x0d\x0a\x09\x09\x63\x30\x2c\x39\x2e\x36\x35\x2d\
-\x37\x2e\x37\x39\x31\x2c\x31\x37\x2e\x35\x32\x31\x2d\x31\x37\x2e\
-\x33\x38\x31\x2c\x31\x37\x2e\x35\x32\x31\x63\x2d\x39\x2e\x35\x37\
-\x37\x2c\x30\x2d\x31\x37\x2e\x33\x39\x39\x2d\x37\x2e\x38\x37\x31\
-\x2d\x31\x37\x2e\x33\x39\x39\x2d\x31\x37\x2e\x35\x32\x31\x43\x32\
-\x39\x30\x2e\x34\x36\x38\x2c\x33\x39\x30\x2e\x35\x39\x2c\x32\x39\
-\x38\x2e\x32\x37\x34\x2c\x33\x38\x32\x2e\x38\x32\x2c\x33\x30\x37\
-\x2e\x38\x36\x37\x2c\x33\x38\x32\x2e\x38\x32\x7a\x22\x2f\x3e\x0d\
-\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-\x00\x00\x03\xeb\
-\x3c\
-\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
-\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
-\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
-\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
-\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
-\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
-\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
-\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
-\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
-\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
-\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
-\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
-\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
-\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
-\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
-\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
-\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
-\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
-\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
-\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
-\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
-\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
-\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
-\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
-\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
-\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
-\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
-\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
-\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
-\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
-\x0a\x3c\x67\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
-\x4d\x32\x35\x36\x2c\x31\x32\x38\x63\x2d\x38\x31\x2e\x39\x2c\x30\
-\x2d\x31\x34\x35\x2e\x37\x2c\x34\x38\x2e\x38\x2d\x32\x32\x34\x2c\
-\x31\x32\x38\x63\x36\x37\x2e\x34\x2c\x36\x37\x2e\x37\x2c\x31\x32\
-\x34\x2c\x31\x32\x38\x2c\x32\x32\x34\x2c\x31\x32\x38\x63\x39\x39\
-\x2e\x39\x2c\x30\x2c\x31\x37\x33\x2e\x34\x2d\x37\x36\x2e\x34\x2c\
-\x32\x32\x34\x2d\x31\x32\x36\x2e\x36\x0d\x0a\x09\x09\x43\x34\x32\
-\x38\x2e\x32\x2c\x31\x39\x38\x2e\x36\x2c\x33\x35\x34\x2e\x38\x2c\
-\x31\x32\x38\x2c\x32\x35\x36\x2c\x31\x32\x38\x7a\x20\x4d\x32\x35\
-\x36\x2c\x33\x34\x37\x2e\x33\x63\x2d\x34\x39\x2e\x34\x2c\x30\x2d\
-\x38\x39\x2e\x36\x2d\x34\x31\x2d\x38\x39\x2e\x36\x2d\x39\x31\x2e\
-\x33\x63\x30\x2d\x35\x30\x2e\x34\x2c\x34\x30\x2e\x32\x2d\x39\x31\
-\x2e\x33\x2c\x38\x39\x2e\x36\x2d\x39\x31\x2e\x33\x73\x38\x39\x2e\
-\x36\x2c\x34\x31\x2c\x38\x39\x2e\x36\x2c\x39\x31\x2e\x33\x0d\x0a\
-\x09\x09\x43\x33\x34\x35\x2e\x36\x2c\x33\x30\x36\x2e\x34\x2c\x33\
-\x30\x35\x2e\x34\x2c\x33\x34\x37\x2e\x33\x2c\x32\x35\x36\x2c\x33\
-\x34\x37\x2e\x33\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x67\x3e\x0d\x0a\
-\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\
-\x32\x32\x34\x63\x30\x2d\x37\x2e\x39\x2c\x32\x2e\x39\x2d\x31\x35\
-\x2e\x31\x2c\x37\x2e\x36\x2d\x32\x30\x2e\x37\x63\x2d\x32\x2e\x35\
-\x2d\x30\x2e\x34\x2d\x35\x2d\x30\x2e\x36\x2d\x37\x2e\x36\x2d\x30\
-\x2e\x36\x63\x2d\x32\x38\x2e\x38\x2c\x30\x2d\x35\x32\x2e\x33\x2c\
-\x32\x33\x2e\x39\x2d\x35\x32\x2e\x33\x2c\x35\x33\x2e\x33\x63\x30\
-\x2c\x32\x39\x2e\x34\x2c\x32\x33\x2e\x35\x2c\x35\x33\x2e\x33\x2c\
-\x35\x32\x2e\x33\x2c\x35\x33\x2e\x33\x0d\x0a\x09\x09\x09\x73\x35\
-\x32\x2e\x33\x2d\x32\x33\x2e\x39\x2c\x35\x32\x2e\x33\x2d\x35\x33\
-\x2e\x33\x63\x30\x2d\x32\x2e\x33\x2d\x30\x2e\x32\x2d\x34\x2e\x36\
-\x2d\x30\x2e\x34\x2d\x36\x2e\x39\x63\x2d\x35\x2e\x35\x2c\x34\x2e\
-\x33\x2d\x31\x32\x2e\x33\x2c\x36\x2e\x39\x2d\x31\x39\x2e\x38\x2c\
-\x36\x2e\x39\x43\x32\x37\x30\x2e\x33\x2c\x32\x35\x36\x2c\x32\x35\
-\x36\x2c\x32\x34\x31\x2e\x37\x2c\x32\x35\x36\x2c\x32\x32\x34\x7a\
-\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\
-\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
-"
-
-qt_resource_name = b"\
-\x00\x05\
-\x00\x6f\xa6\x53\
-\x00\x69\
-\x00\x63\x00\x6f\x00\x6e\x00\x73\
-\x00\x0d\
-\x05\x20\xce\x87\
-\x00\x6f\
-\x00\x70\x00\x65\x00\x6e\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x09\
-\x0b\x9e\x89\x07\
-\x00\x63\
-\x00\x68\x00\x65\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x14\
-\x0f\xa5\xe0\xc7\
-\x00\x6d\
-\x00\x61\x00\x67\x00\x6e\x00\x69\x00\x66\x00\x79\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x67\x00\x6c\x00\x61\x00\x73\x00\x73\x00\x2e\
-\x00\x73\x00\x76\x00\x67\
-\x00\x0a\
-\x0f\x68\x53\xe7\
-\x00\x61\
-\x00\x6e\x00\x63\x00\x68\x00\x6f\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0a\
-\x0a\xc8\x62\x67\
-\x00\x63\
-\x00\x65\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x10\
-\x04\xa9\x22\xc7\
-\x00\x66\
-\x00\x69\x00\x6c\x00\x6c\x00\x65\x00\x64\x00\x62\x00\x75\x00\x63\x00\x6b\x00\x65\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x10\
-\x08\x89\xfa\x47\
-\x00\x63\
-\x00\x65\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x6f\x00\x72\x00\x69\x00\x67\x00\x69\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x08\
-\x08\xc8\x55\xe7\
-\x00\x73\
-\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0e\
-\x0f\xcb\xd5\xc7\
-\x00\x70\
-\x00\x6c\x00\x75\x00\x73\x00\x2d\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x12\
-\x08\x79\x97\xe7\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x61\x00\x6d\x00\x65\x00\x72\x00\x61\x00\x2e\x00\x73\x00\x76\
-\x00\x67\
-\x00\x1c\
-\x08\x8a\x79\x07\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x61\x00\x64\x00\x69\x00\x6f\x00\x2d\x00\x62\x00\x75\x00\x74\
-\x00\x74\x00\x6f\x00\x6e\x00\x2d\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x1c\
-\x04\x66\xe1\x67\
-\x00\x63\
-\x00\x68\x00\x65\x00\x76\x00\x72\x00\x6f\x00\x6e\x00\x2d\x00\x77\x00\x69\x00\x74\x00\x68\x00\x2d\x00\x63\x00\x69\x00\x72\x00\x63\
-\x00\x6c\x00\x65\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x11\
-\x0c\xdb\x38\xe7\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\
-\x00\x17\
-\x06\xc6\x02\xa7\
-\x00\x74\
-\x00\x72\x00\x69\x00\x61\x00\x6e\x00\x67\x00\x6c\x00\x65\x00\x2d\x00\x73\x00\x74\x00\x72\x00\x6f\x00\x6b\x00\x65\x00\x64\x00\x2d\
-\x00\x31\x00\x35\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x08\
-\x08\xf7\x57\x07\
-\x00\x67\
-\x00\x72\x00\x69\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0f\
-\x09\x76\x60\xc7\
-\x00\x63\
-\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x2d\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x13\
-\x03\x24\x75\x47\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x2e\x00\x73\
-\x00\x76\x00\x67\
-\x00\x0a\
-\x01\xca\x6d\x87\
-\x00\x62\
-\x00\x75\x00\x63\x00\x6b\x00\x65\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x1d\
-\x06\xec\xf4\xc7\
-\x00\x63\
-\x00\x68\x00\x65\x00\x76\x00\x72\x00\x6f\x00\x6e\x00\x2d\x00\x77\x00\x69\x00\x74\x00\x68\x00\x2d\x00\x63\x00\x69\x00\x72\x00\x63\
-\x00\x6c\x00\x65\x00\x2d\x00\x72\x00\x69\x00\x67\x00\x68\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x08\
-\x0c\xf7\x55\x87\
-\x00\x74\
-\x00\x65\x00\x78\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x12\
-\x0c\x5e\xd4\xa7\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x6c\x00\x6f\x00\x63\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\
-\x00\x67\
-\x00\x12\
-\x04\xb2\x21\x47\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x65\x00\x78\x00\x70\x00\x61\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\
-\x00\x67\
-\x00\x08\
-\x05\xa8\x57\x87\
-\x00\x63\
-\x00\x6f\x00\x64\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x19\
-\x0a\x43\x45\xc7\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x66\x00\x6f\x00\x72\
-\x00\x77\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x11\
-\x0c\xa7\xc7\x47\
-\x00\x63\
-\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x64\x00\x70\x00\x6f\x00\x6c\x00\x79\x00\x67\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
-\
-\x00\x0f\
-\x04\xf2\xa7\x87\
-\x00\x63\
-\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x64\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0a\
-\x0a\x2d\x1b\xc7\
-\x00\x63\
-\x00\x69\x00\x72\x00\x63\x00\x6c\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x1b\
-\x0e\xb5\x68\xe7\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x61\x00\x64\x00\x69\x00\x6f\x00\x2d\x00\x62\x00\x75\x00\x74\
-\x00\x74\x00\x6f\x00\x6e\x00\x2d\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x10\
-\x0c\x57\x65\x47\
-\x00\x61\
-\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x73\x00\x69\x00\x7a\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x12\
-\x08\x55\xef\xc7\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x64\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\
-\x00\x67\
-\x00\x0f\
-\x07\x0e\xc4\x87\
-\x00\x6f\
-\x00\x70\x00\x65\x00\x6e\x00\x70\x00\x6f\x00\x6c\x00\x79\x00\x67\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x16\
-\x01\xfb\x76\x27\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x62\x00\x61\x00\x63\
-\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x0e\
-\x05\xed\x38\x67\
-\x00\x61\
-\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x10\
-\x06\xe3\xaf\xe7\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x68\x00\x61\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x17\
-\x07\x87\x48\x27\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x66\x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2d\x00\x6f\x00\x70\
-\x00\x65\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x15\
-\x0f\xc4\x59\xe7\
-\x00\x73\
-\x00\x75\x00\x62\x00\x64\x00\x69\x00\x72\x00\x65\x00\x63\x00\x74\x00\x6f\x00\x72\x00\x79\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\
-\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x10\
-\x08\xe4\xaf\x47\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x64\x00\x6f\x00\x6e\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x08\
-\x0b\x07\x57\xa7\
-\x00\x65\
-\x00\x64\x00\x69\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x19\
-\x0f\xef\x7b\xe7\
-\x00\x61\
-\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x6f\x00\x6c\x00\x6f\x00\x72\x00\x2d\x00\x70\x00\x61\x00\x6c\
-\x00\x65\x00\x74\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-\x00\x11\
-\x01\x60\xbc\x47\
-\x00\x73\
-\x00\x6f\x00\x63\x00\x69\x00\x61\x00\x6c\x00\x2d\x00\x70\x00\x79\x00\x74\x00\x68\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
-\
-\x00\x07\
-\x0c\xf8\x5a\x07\
-\x00\x65\
-\x00\x79\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
-"
-
-qt_resource_struct_v1 = b"\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x29\x00\x00\x00\x02\
-\x00\x00\x06\x10\x00\x00\x00\x00\x00\x01\x00\x00\x82\xd5\
-\x00\x00\x02\x96\x00\x00\x00\x00\x00\x01\x00\x00\x36\x4d\
-\x00\x00\x04\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x68\xdb\
-\x00\x00\x02\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x33\x23\
-\x00\x00\x01\x96\x00\x00\x00\x00\x00\x01\x00\x00\x22\x76\
-\x00\x00\x00\xaa\x00\x01\x00\x00\x00\x01\x00\x00\x10\x6b\
-\x00\x00\x03\x30\x00\x00\x00\x00\x00\x01\x00\x00\x45\x97\
-\x00\x00\x03\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x54\x52\
-\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x03\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x48\xd1\
-\x00\x00\x04\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x6b\x5c\
-\x00\x00\x01\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x29\x2a\
-\x00\x00\x05\x12\x00\x00\x00\x00\x00\x01\x00\x00\x6e\x29\
-\x00\x00\x02\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x25\
-\x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x64\x9a\
-\x00\x00\x05\x38\x00\x00\x00\x00\x00\x01\x00\x00\x73\xf7\
-\x00\x00\x04\x70\x00\x00\x00\x00\x00\x01\x00\x00\x61\xf4\
-\x00\x00\x01\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x1c\x50\
-\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x12\x90\
-\x00\x00\x01\x58\x00\x00\x00\x00\x00\x01\x00\x00\x1f\x76\
-\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x01\x00\x00\x16\xb0\
-\x00\x00\x05\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x77\xbd\
-\x00\x00\x02\x30\x00\x01\x00\x00\x00\x01\x00\x00\x2d\xf8\
-\x00\x00\x02\x46\x00\x00\x00\x00\x00\x01\x00\x00\x2f\xd9\
-\x00\x00\x03\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x59\x2b\
-\x00\x00\x03\x70\x00\x00\x00\x00\x00\x01\x00\x00\x4d\x7f\
-\x00\x00\x00\x90\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xeb\
-\x00\x00\x05\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x7a\x3a\
-\x00\x00\x00\x30\x00\x00\x00\x00\x00\x01\x00\x00\x04\xa6\
-\x00\x00\x04\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x5f\x71\
-\x00\x00\x03\x06\x00\x00\x00\x00\x00\x01\x00\x00\x41\x2f\
-\x00\x00\x03\xa8\x00\x00\x00\x00\x00\x01\x00\x00\x50\x00\
-\x00\x00\x01\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x26\x6f\
-\x00\x00\x02\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x40\x0f\
-\x00\x00\x06\x38\x00\x00\x00\x00\x00\x01\x00\x00\x8a\x59\
-\x00\x00\x04\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x5c\x21\
-\x00\x00\x00\x76\x00\x00\x00\x00\x00\x01\x00\x00\x0b\x7e\
-\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x07\xb6\
-\x00\x00\x05\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x77\x4d\
-\x00\x00\x01\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x19\x55\
-\x00\x00\x05\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x7d\xaa\
-"
-
-qt_resource_struct_v2 = b"\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
-\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x29\x00\x00\x00\x02\
-\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x06\x10\x00\x00\x00\x00\x00\x01\x00\x00\x82\xd5\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x02\x96\x00\x00\x00\x00\x00\x01\x00\x00\x36\x4d\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x04\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x68\xdb\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x02\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x33\x23\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x01\x96\x00\x00\x00\x00\x00\x01\x00\x00\x22\x76\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x00\xaa\x00\x01\x00\x00\x00\x01\x00\x00\x10\x6b\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x03\x30\x00\x00\x00\x00\x00\x01\x00\x00\x45\x97\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x03\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x54\x52\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x03\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x48\xd1\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x04\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x6b\x5c\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x01\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x29\x2a\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x05\x12\x00\x00\x00\x00\x00\x01\x00\x00\x6e\x29\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x02\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x25\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x64\x9a\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x05\x38\x00\x00\x00\x00\x00\x01\x00\x00\x73\xf7\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x04\x70\x00\x00\x00\x00\x00\x01\x00\x00\x61\xf4\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x01\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x1c\x50\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x12\x90\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x01\x58\x00\x00\x00\x00\x00\x01\x00\x00\x1f\x76\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x01\x00\x00\x16\xb0\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x05\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x77\xbd\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x02\x30\x00\x01\x00\x00\x00\x01\x00\x00\x2d\xf8\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x02\x46\x00\x00\x00\x00\x00\x01\x00\x00\x2f\xd9\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x03\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x59\x2b\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x03\x70\x00\x00\x00\x00\x00\x01\x00\x00\x4d\x7f\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x00\x90\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xeb\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x05\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x7a\x3a\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x00\x30\x00\x00\x00\x00\x00\x01\x00\x00\x04\xa6\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x04\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x5f\x71\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x03\x06\x00\x00\x00\x00\x00\x01\x00\x00\x41\x2f\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x03\xa8\x00\x00\x00\x00\x00\x01\x00\x00\x50\x00\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x01\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x26\x6f\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x02\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x40\x0f\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x06\x38\x00\x00\x00\x00\x00\x01\x00\x00\x8a\x59\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x04\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x5c\x21\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x00\x76\x00\x00\x00\x00\x00\x01\x00\x00\x0b\x7e\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x07\xb6\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x05\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x77\x4d\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x01\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x19\x55\
-\x00\x00\x01\x78\x33\x4a\x26\xbc\
-\x00\x00\x05\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x7d\xaa\
-\x00\x00\x01\x78\x33\x4a\x26\xbb\
-"
-
-qt_version = [int(v) for v in QtCore.qVersion().split('.')]
-if qt_version < [5, 8, 0]:
-    rcc_version = 1
-    qt_resource_struct = qt_resource_struct_v1
-else:
-    rcc_version = 2
-    qt_resource_struct = qt_resource_struct_v2
-
-def qInitResources():
-    QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-def qCleanupResources():
-    QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-qInitResources()

Modified: trunk/Build/source/utils/asymptote/GUI/labelEditor.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/labelEditor.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/labelEditor.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,15 +1,15 @@
 #!/usr/bin/env python3
 
 from pyUIClass.labelTextEditor import Ui_Dialog
-import PyQt5.QtWidgets as Qw
-import PyQt5.QtSvg as Qs
-import PyQt5.QtGui as Qg
-import PyQt5.QtCore as Qc
-import xasyArgs as xa
-import xasy2asy as x2a
+import PyQt5.QtWidgets as QtWidgets
+import PyQt5.QtSvg as QtSvg
+import PyQt5.QtGui as QtGui
+import PyQt5.QtCore as QtCore
+import xasyArgs as xasyArgs
+import xasy2asy as xasy2asy
+import xasyOptions as xasyOptions
+import xasyUtils as xasyUtils
 import subprocess
-import xasyOptions as xo
-import xasyUtils as xu
 import tempfile
 import uuid
 import os
@@ -16,7 +16,7 @@
 import io
 
 
-class labelEditor(Qw.QDialog):
+class labelEditor(QtWidgets.QDialog):
     def __init__(self, text=''):
         super().__init__()
         self.ui = Ui_Dialog()
@@ -67,9 +67,9 @@
             return rawText
 
     def btnPreviewOnClick(self):
-        path = xa.getArgs().asypath
+        path = xasyArgs.getArgs().asypath
         if path is None:
-            opt = xo.xasyOptions().load()
+            opt = xo.BasicConfigs.defaultOpt
             path = opt['asyPath']
 
         asyInput = """
@@ -80,7 +80,7 @@
         shipout(f);
         """
 
-        self.svgPreview = Qs.QSvgRenderer()
+        self.svgPreview = QtSvg.QSvgRenderer()
         with tempfile.TemporaryDirectory(prefix='xasylbl_') as tmpdir:
             id = str(uuid.uuid4())
             tmpFile = os.path.join(tmpdir, 'lbl-{0}.svg'.format(id))
@@ -95,8 +95,8 @@
 
             bounds_1, bounds_2 = [val.strip() for val in raw_array]
 
-            min_bounds = xu.listize(bounds_1, (float, float))
-            max_bounds = xu.listize(bounds_2, (float, float))
+            min_bounds = xasyUtils.listize(bounds_1, (float, float))
+            max_bounds = xasyUtils.listize(bounds_2, (float, float))
 
             new_rect = self.processBounds(min_bounds, max_bounds)
             self.svgPreview.load(tmpFile)
@@ -106,12 +106,12 @@
         self.drawPreview(new_rect)
 
     def drawPreview(self, naturalBounds):
-        img = Qg.QPixmap(self.ui.lblLabelPreview.size())
-        img.fill(Qg.QColor.fromRgbF(1, 1, 1, 1))
+        img = QtGui.QPixmap(self.ui.lblLabelPreview.size())
+        img.fill(QtGui.QColor.fromRgbF(1, 1, 1, 1))
         if self.svgPreview is None:
             pass
         else:
-            with Qg.QPainter(img) as pnt:
+            with QtGui.QPainter(img) as pnt:
                 scale_ratio = self.getIdealScaleRatio(naturalBounds, self.ui.lblLabelPreview.rect())
 
                 pnt.translate(self.ui.lblLabelPreview.rect().center())
@@ -121,8 +121,8 @@
 
 
     def getIdealScaleRatio(self, rect, boundsRect):
-        assert isinstance(rect, (Qc.QRect, Qc.QRectF))
-        assert isinstance(rect, (Qc.QRect, Qc.QRectF))
+        assert isinstance(rect, (QtCore.QRect, QtCore.QRectF))
+        assert isinstance(rect, (QtCore.QRect, QtCore.QRectF))
 
         magic_ratio = 0.50
         idealRatioHeight = (magic_ratio * boundsRect.height()) / rect.height()
@@ -139,15 +139,15 @@
         p1x, p1y = minPt
         p2x, p2y = maxPt
 
-        minPt = Qc.QPointF(p1x, p1y)
-        maxPt = Qc.QPointF(p2x, p2y)
+        minPt = QtCore.QPointF(p1x, p1y)
+        maxPt = QtCore.QPointF(p2x, p2y)
 
-        newRect = Qc.QRectF(minPt, maxPt)
+        newRect = QtCore.QRectF(minPt, maxPt)
         return newRect
 
 
     def btnGetTextOnClick(self):
-        msgbox = Qw.QMessageBox()
+        msgbox = QtWidgets.QMessageBox()
         msgbox.setText('Text Preview:\n' + self.getText())
         msgbox.setWindowTitle('Text preview')
         msgbox.show()

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,9 +2,10 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/custMatTransform.ui'
 #
-# Created by: PyQt5 UI code generator 5.13.1
+# Created by: PyQt5 UI code generator 5.15.0
 #
-# WARNING! All changes made in this file will be lost!
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
 
 
 from PyQt5 import QtCore, QtGui, QtWidgets

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,9 +2,10 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/labelTextEditor.ui'
 #
-# Created by: PyQt5 UI code generator 5.13.1
+# Created by: PyQt5 UI code generator 5.15.0
 #
-# WARNING! All changes made in this file will be lost!
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
 
 
 from PyQt5 import QtCore, QtGui, QtWidgets

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,9 +2,10 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/setCustomAnchor.ui'
 #
-# Created by: PyQt5 UI code generator 5.13.1
+# Created by: PyQt5 UI code generator 5.15.0
 #
-# WARNING! All changes made in this file will be lost!
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
 
 
 from PyQt5 import QtCore, QtGui, QtWidgets

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,9 +2,10 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/widg_addLabel.ui'
 #
-# Created by: PyQt5 UI code generator 5.13.1
+# Created by: PyQt5 UI code generator 5.15.0
 #
-# WARNING! All changes made in this file will be lost!
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
 
 
 from PyQt5 import QtCore, QtGui, QtWidgets

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,9 +2,10 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/widg_addPolyOpt.ui'
 #
-# Created by: PyQt5 UI code generator 5.13.1
+# Created by: PyQt5 UI code generator 5.15.0
 #
-# WARNING! All changes made in this file will be lost!
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
 
 
 from PyQt5 import QtCore, QtGui, QtWidgets
@@ -31,11 +32,21 @@
         self.chkInscribed = QtWidgets.QCheckBox(Form)
         self.chkInscribed.setObjectName("chkInscribed")
         self.horizontalLayout.addWidget(self.chkInscribed)
+        spacerItem = QtWidgets.QSpacerItem(19, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem)
+        self.label = QtWidgets.QLabel(Form)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
+        self.label.setSizePolicy(sizePolicy)
+        self.label.setObjectName("label")
+        self.horizontalLayout.addWidget(self.label)
         self.txtSides = QtWidgets.QLineEdit(Form)
         self.txtSides.setObjectName("txtSides")
         self.horizontalLayout.addWidget(self.txtSides)
-        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
-        self.horizontalLayout.addItem(spacerItem)
+        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem1)
         self.horizontalLayout_2.addLayout(self.horizontalLayout)
 
         self.retranslateUi(Form)
@@ -45,5 +56,6 @@
         _translate = QtCore.QCoreApplication.translate
         Form.setWindowTitle(_translate("Form", "Form"))
         self.chkInscribed.setText(_translate("Form", "Start at Vertex"))
+        self.label.setText(_translate("Form", "Sides:  "))
         self.txtSides.setToolTip(_translate("Form", "Number of Sides"))
         self.txtSides.setPlaceholderText(_translate("Form", "Sides"))

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,9 +2,10 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/widg_editBezier.ui'
 #
-# Created by: PyQt5 UI code generator 5.13.1
+# Created by: PyQt5 UI code generator 5.15.0
 #
-# WARNING! All changes made in this file will be lost!
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
 
 
 from PyQt5 import QtCore, QtGui, QtWidgets

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,9 +2,10 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/widgetPointEditor.ui'
 #
-# Created by: PyQt5 UI code generator 5.13.1
+# Created by: PyQt5 UI code generator 5.15.0
 #
-# WARNING! All changes made in this file will be lost!
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
 
 
 from PyQt5 import QtCore, QtGui, QtWidgets

Modified: trunk/Build/source/utils/asymptote/GUI/pyUIClass/window1.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/pyUIClass/window1.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/pyUIClass/window1.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,9 +2,10 @@
 
 # Form implementation generated from reading ui file 'GUI/windows/window1.ui'
 #
-# Created by: PyQt5 UI code generator 5.13.1
+# Created by: PyQt5 UI code generator 5.15.0
 #
-# WARNING! All changes made in this file will be lost!
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
 
 
 from PyQt5 import QtCore, QtGui, QtWidgets
@@ -62,7 +63,7 @@
         self.btnUndo.setBaseSize(QtCore.QSize(32, 32))
         self.btnUndo.setText("")
         icon = QtGui.QIcon()
-        icon.addPixmap(QtGui.QPixmap(":/icons/android-arrow-back.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        icon.addPixmap(QtGui.QPixmap(":/icons/undo.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.btnUndo.setIcon(icon)
         self.btnUndo.setIconSize(QtCore.QSize(16, 16))
         self.btnUndo.setFlat(True)
@@ -79,7 +80,7 @@
         self.btnRedo.setBaseSize(QtCore.QSize(32, 32))
         self.btnRedo.setText("")
         icon1 = QtGui.QIcon()
-        icon1.addPixmap(QtGui.QPixmap(":/icons/android-arrow-forward.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        icon1.addPixmap(QtGui.QPixmap(":/icons/redo.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.btnRedo.setIcon(icon1)
         self.btnRedo.setIconSize(QtCore.QSize(16, 16))
         self.btnRedo.setFlat(True)
@@ -251,7 +252,7 @@
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.btnAlignX.sizePolicy().hasHeightForWidth())
         self.btnAlignX.setSizePolicy(sizePolicy)
-        self.btnAlignX.setMaximumSize(QtCore.QSize(25, 25))
+        self.btnAlignX.setMaximumSize(QtCore.QSize(32, 25))
         self.btnAlignX.setBaseSize(QtCore.QSize(32, 32))
         font = QtGui.QFont()
         font.setFamily("Roboto")
@@ -269,9 +270,10 @@
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.btnAlignY.sizePolicy().hasHeightForWidth())
         self.btnAlignY.setSizePolicy(sizePolicy)
-        self.btnAlignY.setMaximumSize(QtCore.QSize(25, 25))
+        self.btnAlignY.setMaximumSize(QtCore.QSize(32, 25))
         self.btnAlignY.setBaseSize(QtCore.QSize(32, 32))
         font = QtGui.QFont()
+        font.setFamily("Roboto")
         font.setBold(True)
         font.setWeight(75)
         self.btnAlignY.setFont(font)
@@ -295,6 +297,7 @@
         icon11.addPixmap(QtGui.QPixmap(":/icons/edit.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.btnSelectEdit.setIcon(icon11)
         self.btnSelectEdit.setIconSize(QtCore.QSize(16, 16))
+        self.btnSelectEdit.setCheckable(True)
         self.btnSelectEdit.setFlat(True)
         self.btnSelectEdit.setObjectName("btnSelectEdit")
         self.horizontalLayout.addWidget(self.btnSelectEdit)
@@ -312,7 +315,7 @@
         icon12.addPixmap(QtGui.QPixmap(":/icons/android-delete.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.btnDeleteMode.setIcon(icon12)
         self.btnDeleteMode.setIconSize(QtCore.QSize(16, 16))
-        self.btnDeleteMode.setCheckable(False)
+        self.btnDeleteMode.setCheckable(True)
         self.btnDeleteMode.setFlat(True)
         self.btnDeleteMode.setObjectName("btnDeleteMode")
         self.horizontalLayout.addWidget(self.btnDeleteMode)
@@ -646,6 +649,7 @@
         icon24.addPixmap(QtGui.QPixmap(":/icons/openpolygon.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.btnOpenPoly.setIcon(icon24)
         self.btnOpenPoly.setIconSize(QtCore.QSize(16, 16))
+        self.btnOpenPoly.setCheckable(True)
         self.btnOpenPoly.setFlat(True)
         self.btnOpenPoly.setObjectName("btnOpenPoly")
         self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.btnOpenPoly)
@@ -662,6 +666,7 @@
         icon25.addPixmap(QtGui.QPixmap(":/icons/closedpolygon.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.btnClosedPoly.setIcon(icon25)
         self.btnClosedPoly.setIconSize(QtCore.QSize(16, 16))
+        self.btnClosedPoly.setCheckable(True)
         self.btnClosedPoly.setFlat(True)
         self.btnClosedPoly.setObjectName("btnClosedPoly")
         self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.btnClosedPoly)
@@ -678,6 +683,7 @@
         icon26.addPixmap(QtGui.QPixmap(":/icons/opencurve.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.btnOpenCurve.setIcon(icon26)
         self.btnOpenCurve.setIconSize(QtCore.QSize(16, 16))
+        self.btnOpenCurve.setCheckable(True)
         self.btnOpenCurve.setFlat(True)
         self.btnOpenCurve.setObjectName("btnOpenCurve")
         self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.btnOpenCurve)
@@ -694,6 +700,7 @@
         icon27.addPixmap(QtGui.QPixmap(":/icons/closedcurve.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.btnClosedCurve.setIcon(icon27)
         self.btnClosedCurve.setIconSize(QtCore.QSize(16, 16))
+        self.btnClosedCurve.setCheckable(True)
         self.btnClosedCurve.setFlat(True)
         self.btnClosedCurve.setObjectName("btnClosedCurve")
         self.formLayout.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.btnClosedCurve)
@@ -710,6 +717,7 @@
         icon28.addPixmap(QtGui.QPixmap(":/icons/triangle-stroked-15.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.btnAddPoly.setIcon(icon28)
         self.btnAddPoly.setIconSize(QtCore.QSize(16, 16))
+        self.btnAddPoly.setCheckable(True)
         self.btnAddPoly.setFlat(True)
         self.btnAddPoly.setObjectName("btnAddPoly")
         self.formLayout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.btnAddPoly)
@@ -726,6 +734,7 @@
         icon29.addPixmap(QtGui.QPixmap(":/icons/circle.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.btnAddCircle.setIcon(icon29)
         self.btnAddCircle.setIconSize(QtCore.QSize(16, 16))
+        self.btnAddCircle.setCheckable(True)
         self.btnAddCircle.setFlat(True)
         self.btnAddCircle.setObjectName("btnAddCircle")
         self.formLayout.setWidget(10, QtWidgets.QFormLayout.LabelRole, self.btnAddCircle)
@@ -742,9 +751,27 @@
         icon30.addPixmap(QtGui.QPixmap(":/icons/text.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.btnAddLabel.setIcon(icon30)
         self.btnAddLabel.setIconSize(QtCore.QSize(16, 16))
+        self.btnAddLabel.setCheckable(True)
         self.btnAddLabel.setFlat(True)
         self.btnAddLabel.setObjectName("btnAddLabel")
         self.formLayout.setWidget(11, QtWidgets.QFormLayout.LabelRole, self.btnAddLabel)
+        self.btnAddFreehand = QtWidgets.QPushButton(self.formFrame)
+        self.btnAddFreehand.setEnabled(True)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.btnAddFreehand.sizePolicy().hasHeightForWidth())
+        self.btnAddFreehand.setSizePolicy(sizePolicy)
+        self.btnAddFreehand.setMaximumSize(QtCore.QSize(32, 32))
+        self.btnAddFreehand.setText("")
+        icon31 = QtGui.QIcon()
+        icon31.addPixmap(QtGui.QPixmap(":/icons/brush.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.btnAddFreehand.setIcon(icon31)
+        self.btnAddFreehand.setIconSize(QtCore.QSize(16, 16))
+        self.btnAddFreehand.setCheckable(True)
+        self.btnAddFreehand.setFlat(True)
+        self.btnAddFreehand.setObjectName("btnAddFreehand")
+        self.formLayout.setWidget(12, QtWidgets.QFormLayout.LabelRole, self.btnAddFreehand)
         self.horizontalLayout_7.addWidget(self.formFrame)
         self.imgFrame = QtWidgets.QFrame(self.mainWidget)
         self.imgFrame.setMinimumSize(QtCore.QSize(0, 6))
@@ -783,9 +810,9 @@
         sizePolicy.setHeightForWidth(self.btnTogglePython.sizePolicy().hasHeightForWidth())
         self.btnTogglePython.setSizePolicy(sizePolicy)
         self.btnTogglePython.setText("")
-        icon31 = QtGui.QIcon()
-        icon31.addPixmap(QtGui.QPixmap(":/icons/social-python.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.btnTogglePython.setIcon(icon31)
+        icon32 = QtGui.QIcon()
+        icon32.addPixmap(QtGui.QPixmap(":/icons/social-python.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.btnTogglePython.setIcon(icon32)
         self.btnTogglePython.setIconSize(QtCore.QSize(16, 16))
         self.btnTogglePython.setCheckable(True)
         self.btnTogglePython.setFlat(True)
@@ -807,9 +834,9 @@
         sizePolicy.setHeightForWidth(self.btnEnterCommand.sizePolicy().hasHeightForWidth())
         self.btnEnterCommand.setSizePolicy(sizePolicy)
         self.btnEnterCommand.setText("")
-        icon32 = QtGui.QIcon()
-        icon32.addPixmap(QtGui.QPixmap(":/icons/subdirectory-left.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.btnEnterCommand.setIcon(icon32)
+        icon33 = QtGui.QIcon()
+        icon33.addPixmap(QtGui.QPixmap(":/icons/subdirectory-left.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.btnEnterCommand.setIcon(icon33)
         self.btnEnterCommand.setIconSize(QtCore.QSize(16, 16))
         self.btnEnterCommand.setFlat(True)
         self.btnEnterCommand.setObjectName("btnEnterCommand")
@@ -820,10 +847,12 @@
         self.horizontalLayout_4.addWidget(self.mainWidget)
         MainWindow.setCentralWidget(self.centralwidget)
         self.menubar = QtWidgets.QMenuBar(MainWindow)
-        self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 29))
+        self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 26))
         self.menubar.setObjectName("menubar")
         self.menuFIle = QtWidgets.QMenu(self.menubar)
         self.menuFIle.setObjectName("menuFIle")
+        self.menuOpenRecent = QtWidgets.QMenu(self.menuFIle)
+        self.menuOpenRecent.setObjectName("menuOpenRecent")
         self.menuEdit = QtWidgets.QMenu(self.menubar)
         self.menuEdit.setObjectName("menuEdit")
         self.menuOptions = QtWidgets.QMenu(self.menubar)
@@ -869,9 +898,22 @@
         self.actionSave.setObjectName("actionSave")
         self.actionOpen = QtWidgets.QAction(MainWindow)
         self.actionOpen.setObjectName("actionOpen")
+        self.actionClearRecent = QtWidgets.QAction(MainWindow)
+        self.actionClearRecent.setObjectName("actionClearRecent")
+        self.actionNewFile = QtWidgets.QAction(MainWindow)
+        self.actionNewFile.setObjectName("actionNewFile")
+        self.actionExportToAsy = QtWidgets.QAction(MainWindow)
+        self.actionExportToAsy.setObjectName("actionExportToAsy")
+        self.actionKeymaps = QtWidgets.QAction(MainWindow)
+        self.actionKeymaps.setObjectName("actionKeymaps")
+        self.menuOpenRecent.addSeparator()
+        self.menuOpenRecent.addAction(self.actionClearRecent)
+        self.menuFIle.addAction(self.actionNewFile)
         self.menuFIle.addAction(self.actionOpen)
+        self.menuFIle.addAction(self.menuOpenRecent.menuAction())
         self.menuFIle.addAction(self.actionSave)
         self.menuFIle.addAction(self.actionSaveAs)
+        self.menuFIle.addAction(self.actionExportToAsy)
         self.menuFIle.addAction(self.actionExportAsymptote)
         self.menuFIle.addSeparator()
         self.menuFIle.addAction(self.actionQuit)
@@ -879,6 +921,7 @@
         self.menuEdit.addAction(self.actionRedo)
         self.menuEdit.addSeparator()
         self.menuOptions.addAction(self.actionSettings)
+        self.menuOptions.addAction(self.actionKeymaps)
         self.menuHelp.addAction(self.actionManual)
         self.menuHelp.addAction(self.actionAbout)
         self.menuTools.addAction(self.actionEnterCommand)
@@ -941,7 +984,9 @@
         self.btnAddPoly.setToolTip(_translate("MainWindow", "<html><head/><body><p>Regular polygon</p></body></html>"))
         self.btnAddCircle.setToolTip(_translate("MainWindow", "<html><head/><body><p>Circle</p></body></html>"))
         self.btnAddLabel.setToolTip(_translate("MainWindow", "<html><head/><body><p>Text</p></body></html>"))
+        self.btnAddFreehand.setToolTip(_translate("MainWindow", "<html><head/><body><p>Freehand</p></body></html>"))
         self.menuFIle.setTitle(_translate("MainWindow", "&File"))
+        self.menuOpenRecent.setTitle(_translate("MainWindow", "Open Recent"))
         self.menuEdit.setTitle(_translate("MainWindow", "&Edit"))
         self.menuOptions.setTitle(_translate("MainWindow", "Optio&ns"))
         self.menuHelp.setTitle(_translate("MainWindow", "&Help"))
@@ -950,7 +995,7 @@
         self.actionManual.setText(_translate("MainWindow", "&Manual"))
         self.actionSettings.setText(_translate("MainWindow", "&Settings"))
         self.actionPause.setText(_translate("MainWindow", "Pause "))
-        self.actionSaveAs.setText(_translate("MainWindow", "&Save As"))
+        self.actionSaveAs.setText(_translate("MainWindow", "&Save as"))
         self.actionEnterCommand.setText(_translate("MainWindow", "&Enter Command"))
         self.actionQuit.setText(_translate("MainWindow", "&Quit"))
         self.actionUndo.setText(_translate("MainWindow", "&Undo"))
@@ -958,7 +1003,11 @@
         self.actionShow_Grid.setText(_translate("MainWindow", "&Show Grid"))
         self.actionShow_Local_Grid.setText(_translate("MainWindow", "Show &Local Grid"))
         self.actionTransform.setText(_translate("MainWindow", "&Transform"))
-        self.actionExportAsymptote.setText(_translate("MainWindow", "Export"))
+        self.actionExportAsymptote.setText(_translate("MainWindow", "Export as..."))
         self.actionSave.setText(_translate("MainWindow", "Save"))
         self.actionOpen.setText(_translate("MainWindow", "Open"))
+        self.actionClearRecent.setText(_translate("MainWindow", "Clear Menu"))
+        self.actionNewFile.setText(_translate("MainWindow", "New File"))
+        self.actionExportToAsy.setText(_translate("MainWindow", "Export as Asy"))
+        self.actionKeymaps.setText(_translate("MainWindow", "&Keymaps"))
 import icons_rc

Added: trunk/Build/source/utils/asymptote/GUI/res/icons/brush.svg
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/brush.svg	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/brush.svg	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g>
+	<path d="M48.451,464.828c40.023-0.315,45.01-9.955,58.052-50.132c24.057-63.408,132.419,16.591,65.269,44.374
+		C104.622,486.852,8.428,465.143,48.451,464.828z"/>
+	<path d="M458.857,46.902c-19.417-15.647-51.592-7.938-71.864,17.219L181.645,355.849c-20.272,25.154-20.171,20.347-0.754,35.992
+		c19.417,15.648,14.738,16.77,35.011-8.388l241.406-262.669C477.581,95.628,478.275,62.55,458.857,46.902z M406.065,81.825
+		c0,0-3-3.5-13-11.5c15-24.5,44.5-20,44.5-20C409.565,66.825,406.065,81.825,406.065,81.825z"/>
+</g>
+</svg>

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/bucket.asy
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/bucket.asy	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/bucket.asy	2022-01-08 18:39:01 UTC (rev 61532)
@@ -9,7 +9,7 @@
 path right=(r,0)--(r,h);
 path bottom=xscale(r)*arc(0,1,180,360);
 
-real H=0.9h;
+real H=0.8h;
 path Left=(-r,H/2)--(-r,0);
 path Right=(r,0)--(r,H/2);
 
@@ -17,7 +17,7 @@
 usersetting();
 
 if(fill)
-  fill(Left--bottom--Right--shift(0,H)*xscale(r)*arc(0,1,0,180)--cycle,gray);
+  fill(Left--bottom--Right--shift(0,H)*xscale(r)*arc(0,1,0,180)--cycle,paleblue);
 
 draw(shift(0,h)*xscale(r)*unitcircle);
 draw(left--bottom--right);

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/bucket.svg
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/bucket.svg	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/bucket.svg	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,15 +1,15 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!-- This file was generated by dvisvgm 2.8 -->
-<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='63.9997pt' viewBox='56.4094 53.8583 63.9996 63.9997'>
+<!-- This file was generated by dvisvgm 2.11.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='64pt' viewBox='56.4094 117.858 63.9996 64'>
 <g id='page1'>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 54.8926 -39.7109C 54.8926 -43.9032 44.6969 -47.3017 32.12 -47.3017C 19.5431 -47.3017 9.34742 -43.9032 9.34742 -39.7109C 9.34742 -35.5185 19.5431 -32.12 32.12 -32.12C 44.6969 -32.12 54.8926 -35.5185 54.8926 -39.7109Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 54.8926 24.5291C 54.8926 20.3368 44.6969 16.9383 32.12 16.9383C 19.5431 16.9383 9.34742 20.3368 9.34742 24.5291C 9.34742 28.7215 19.5431 32.12 32.12 32.12C 44.6969 32.12 54.8926 28.7215 54.8926 24.5291Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 9.34742 -39.7109L 9.34742 -9.34742L 9.34742 -9.34742C 9.34742 -9.34742 9.34742 -9.34742 9.34742 -9.34742C 9.34742 -5.15511 19.5431 -1.75656 32.12 -1.75656C 44.6969 -1.75656 54.8926 -5.15511 54.8926 -9.34742L 54.8926 -9.34742L 54.8926 -39.7109' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 9.34742 24.5291L 9.34742 54.8926L 9.34742 54.8926C 9.34742 54.8926 9.34742 54.8926 9.34742 54.8926C 9.34742 59.0849 19.5431 62.4834 32.12 62.4834C 44.6969 62.4834 54.8926 59.0849 54.8926 54.8926L 54.8926 54.8926L 54.8926 24.5291' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 54.8926 -39.7109C 54.8926 -52.2878 44.6969 -62.4834 32.12 -62.4834C 19.5431 -62.4834 9.34742 -52.2878 9.34742 -39.7109' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 54.8926 24.5291C 54.8926 11.9522 44.6969 1.75656 32.12 1.75656C 19.5431 1.75656 9.34742 11.9522 9.34742 24.5291' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
 </g>
 </g>
 </svg>
\ No newline at end of file

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/center.svg
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/center.svg	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/center.svg	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,12 +1,12 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!-- This file was generated by dvisvgm 2.8 -->
-<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='63.9997pt' viewBox='56.4094 53.8583 63.9996 63.9997'>
+<!-- This file was generated by dvisvgm 2.11.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='64pt' viewBox='56.4094 117.858 63.9996 64'>
 <g id='page1'>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 2.0075 -2.0075L 62.2325 -2.0075L 62.2325 -62.2325L 2.0075 -62.2325L 2.0075 -2.0075Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='4.015'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 2.0075 62.2325L 62.2325 62.2325L 62.2325 2.0075L 2.0075 2.0075L 2.0075 62.2325Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='4.015'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 47.1762 -32.12C 47.1762 -40.4353 40.4353 -47.1762 32.12 -47.1762C 23.8047 -47.1762 17.0637 -40.4353 17.0637 -32.12C 17.0637 -23.8047 23.8047 -17.0637 32.12 -17.0637C 40.4353 -17.0637 47.1762 -23.8047 47.1762 -32.12Z' fill='#000000'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 47.1762 32.12C 47.1762 23.8047 40.4353 17.0637 32.12 17.0637C 23.8047 17.0637 17.0637 23.8047 17.0637 32.12C 17.0637 40.4353 23.8047 47.1762 32.12 47.1762C 40.4353 47.1762 47.1762 40.4353 47.1762 32.12Z' fill='#000000'/>
 </g>
 </g>
 </svg>
\ No newline at end of file

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/centerorigin.svg
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/centerorigin.svg	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/centerorigin.svg	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,15 +1,15 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!-- This file was generated by dvisvgm 2.8 -->
-<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='63.9997pt' viewBox='56.4094 53.8583 63.9996 63.9997'>
+<!-- This file was generated by dvisvgm 2.11.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='64pt' viewBox='56.4094 117.858 63.9996 64'>
 <g id='page1'>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 2.0075 -2.0075L 62.2325 -2.0075L 62.2325 -62.2325L 2.0075 -62.2325L 2.0075 -2.0075Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='4.015'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 2.0075 62.2325L 62.2325 62.2325L 62.2325 2.0075L 2.0075 2.0075L 2.0075 62.2325Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='4.015'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 2.0075 -32.12L 62.2325 -32.12' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='4.015'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 2.0075 32.12L 62.2325 32.12' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='4.015'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 32.12 -2.0075L 32.12 -62.2325' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='4.015'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 32.12 62.2325L 32.12 2.0075' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='4.015'/>
 </g>
 </g>
 </svg>
\ No newline at end of file

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/closedcurve.asy
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/closedcurve.asy	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/closedcurve.asy	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,6 +2,6 @@
 
 path p=W..NW..ENE..0.5*SE..cycle;
 draw(p);
-dot(p,linewidth(12));
+dot(p,red+linewidth(12));
 
 shipout(pad(64,64));

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/closedcurve.svg
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/closedcurve.svg	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/closedcurve.svg	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,21 +1,21 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!-- This file was generated by dvisvgm 2.8 -->
-<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='63.9997pt' viewBox='56.4094 53.8583 63.9996 63.9997'>
+<!-- This file was generated by dvisvgm 2.11.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='64.0001pt' height='64pt' viewBox='58.4669 117.858 64.0001 64'>
 <g id='page1'>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<path d='M 3.95735 -32.12C 2.28922 -39.3113 6.36702 -46.2386 11.9036 -51.3039C 29.6687 -67.5568 55.2292 -60.642 56.1523 -42.5022C 56.6136 -33.4381 49.1132 -26.5959 40.6794 -22.5281C 25.3995 -15.1582 7.19935 -18.1436 3.95735 -32.12Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='2.50937'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<path d='M 6.0225 32.12C 4.35438 24.9287 8.43217 18.0014 13.9687 12.9361C 31.7339 -3.31675 57.2943 3.59797 58.2175 21.7378C 58.6788 30.8019 51.1783 37.6441 42.7445 41.7119C 27.4646 49.0818 9.26451 46.0964 6.0225 32.12Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='2.50937'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='3.95735' cy='-32.12' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='6.0225' cy='32.12' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='11.9036' cy='-51.3039' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='13.9687' cy='12.9361' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='56.1523' cy='-42.5022' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='58.2175' cy='21.7378' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='40.6794' cy='-22.5281' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='42.7445' cy='41.7119' fill='#ff0000' r='6.0225'/>
 </g>
 </g>
 </svg>
\ No newline at end of file

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.asy
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.asy	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.asy	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,6 +2,6 @@
 
 path p=W--NW--ENE--0.5*SE--cycle;
 draw(p);
-dot(p,linewidth(12));
+dot(p,red+linewidth(12));
 
 shipout(pad(64,64));

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.svg
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.svg	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.svg	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,21 +1,21 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!-- This file was generated by dvisvgm 2.8 -->
-<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='63.9997pt' viewBox='56.4094 53.8583 63.9996 63.9997'>
+<!-- This file was generated by dvisvgm 2.11.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='64.0001pt' height='64pt' viewBox='58.4669 117.858 64.0001 64'>
 <g id='page1'>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<path d='M 3.95735 -32.12L 11.9036 -51.3039L 56.1523 -42.5022L 40.6794 -22.5281L 3.95735 -32.12Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='2.50937'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<path d='M 6.0225 32.12L 13.9687 12.9361L 58.2175 21.7378L 42.7445 41.7119L 6.0225 32.12Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='2.50937'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='3.95735' cy='-32.12' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='6.0225' cy='32.12' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='11.9036' cy='-51.3039' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='13.9687' cy='12.9361' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='56.1523' cy='-42.5022' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='58.2175' cy='21.7378' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='40.6794' cy='-22.5281' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='42.7445' cy='41.7119' fill='#ff0000' r='6.0225'/>
 </g>
 </g>
 </svg>
\ No newline at end of file

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/filledbucket.svg
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/filledbucket.svg	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/filledbucket.svg	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,18 +1,18 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!-- This file was generated by dvisvgm 2.8 -->
-<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='63.9997pt' viewBox='56.4094 53.8583 63.9996 63.9997'>
+<!-- This file was generated by dvisvgm 2.11.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='64pt' viewBox='56.4094 117.858 63.9996 64'>
 <g id='page1'>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 9.34742 -23.011L 9.34742 -9.34742L 9.34742 -9.34742C 9.34742 -9.34742 9.34742 -9.34742 9.34742 -9.34742C 9.34742 -5.15511 19.5431 -1.75656 32.12 -1.75656C 44.6969 -1.75656 54.8926 -5.15511 54.8926 -9.34742L 54.8926 -9.34742L 54.8926 -23.011L 54.8926 -36.6745C 54.8926 -40.8668 44.6969 -44.2654 32.12 -44.2654C 19.5431 -44.2654 9.34742 -40.8668 9.34742 -36.6745L 9.34742 -23.011Z' fill='#7f7f7f'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 9.34742 42.7472L 9.34742 54.8926L 9.34742 54.8926C 9.34742 54.8926 9.34742 54.8926 9.34742 54.8926C 9.34742 59.0849 19.5431 62.4834 32.12 62.4834C 44.6969 62.4834 54.8926 59.0849 54.8926 54.8926L 54.8926 54.8926L 54.8926 42.7472L 54.8926 30.6018C 54.8926 26.4095 44.6969 23.011 32.12 23.011C 19.5431 23.011 9.34742 26.4095 9.34742 30.6018L 9.34742 42.7472Z' fill='#bfbfff'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 54.8926 -39.7109C 54.8926 -43.9032 44.6969 -47.3017 32.12 -47.3017C 19.5431 -47.3017 9.34742 -43.9032 9.34742 -39.7109C 9.34742 -35.5185 19.5431 -32.12 32.12 -32.12C 44.6969 -32.12 54.8926 -35.5185 54.8926 -39.7109Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 54.8926 24.5291C 54.8926 20.3368 44.6969 16.9383 32.12 16.9383C 19.5431 16.9383 9.34742 20.3368 9.34742 24.5291C 9.34742 28.7215 19.5431 32.12 32.12 32.12C 44.6969 32.12 54.8926 28.7215 54.8926 24.5291Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 9.34742 -39.7109L 9.34742 -9.34742L 9.34742 -9.34742C 9.34742 -9.34742 9.34742 -9.34742 9.34742 -9.34742C 9.34742 -5.15511 19.5431 -1.75656 32.12 -1.75656C 44.6969 -1.75656 54.8926 -5.15511 54.8926 -9.34742L 54.8926 -9.34742L 54.8926 -39.7109' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 9.34742 24.5291L 9.34742 54.8926L 9.34742 54.8926C 9.34742 54.8926 9.34742 54.8926 9.34742 54.8926C 9.34742 59.0849 19.5431 62.4834 32.12 62.4834C 44.6969 62.4834 54.8926 59.0849 54.8926 54.8926L 54.8926 54.8926L 54.8926 24.5291' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 56.4094 117.858)'>
-<path d='M 54.8926 -39.7109C 54.8926 -52.2878 44.6969 -62.4834 32.12 -62.4834C 19.5431 -62.4834 9.34742 -52.2878 9.34742 -39.7109' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
+<g transform='translate(56.4094 117.858)scale(.996264)'>
+<path d='M 54.8926 24.5291C 54.8926 11.9522 44.6969 1.75656 32.12 1.75656C 19.5431 1.75656 9.34742 11.9522 9.34742 24.5291' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='3.51312'/>
 </g>
 </g>
 </svg>
\ No newline at end of file

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/opencurve.asy
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/opencurve.asy	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/opencurve.asy	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,6 +2,6 @@
 
 path p=W..NW..ENE..0.5*SE;
 draw(p);
-dot(p,linewidth(12));
+dot(p,red+linewidth(12));
 
 shipout(pad(64,64));

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/opencurve.svg
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/opencurve.svg	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/opencurve.svg	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,21 +1,21 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!-- This file was generated by dvisvgm 2.8 -->
-<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='63.9997pt' viewBox='56.4094 53.8583 63.9996 63.9997'>
+<!-- This file was generated by dvisvgm 2.11.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='64.0001pt' height='64pt' viewBox='58.4669 117.858 64.0001 64'>
 <g id='page1'>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<path d='M 3.95735 -32.12C 4.15556 -39.2745 6.98473 -46.1047 11.9036 -51.3039C 27.4411 -67.7269 53.3021 -61.5405 56.1523 -42.5022C 57.627 -32.6519 50.5856 -23.5621 40.6794 -22.5281' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='2.50937'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<path d='M 6.0225 32.12C 6.22072 24.9655 9.04989 18.1353 13.9687 12.9361C 29.5062 -3.48686 55.3673 2.6995 58.2175 21.7378C 59.6922 31.5881 52.6508 40.6779 42.7445 41.7119' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='2.50937'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='3.95735' cy='-32.12' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='6.0225' cy='32.12' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='11.9036' cy='-51.3039' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='13.9687' cy='12.9361' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='56.1523' cy='-42.5022' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='58.2175' cy='21.7378' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='40.6794' cy='-22.5281' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='42.7445' cy='41.7119' fill='#ff0000' r='6.0225'/>
 </g>
 </g>
 </svg>
\ No newline at end of file

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/openpolygon.asy
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/openpolygon.asy	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/openpolygon.asy	2022-01-08 18:39:01 UTC (rev 61532)
@@ -2,6 +2,6 @@
 
 path p=W--NW--ENE--0.5*SE;
 draw(p);
-dot(p,linewidth(12));
+dot(p,red+linewidth(12));
 
 shipout(pad(64,64));

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons/openpolygon.svg
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/openpolygon.svg	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/openpolygon.svg	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,21 +1,21 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!-- This file was generated by dvisvgm 2.8 -->
-<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='63.9996pt' height='63.9997pt' viewBox='56.4094 53.8583 63.9996 63.9997'>
+<!-- This file was generated by dvisvgm 2.11.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='64.0001pt' height='64pt' viewBox='58.4669 117.858 64.0001 64'>
 <g id='page1'>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<path d='M 3.95735 -32.12L 11.9036 -51.3039L 56.1523 -42.5022L 40.6794 -22.5281' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='2.50937'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<path d='M 6.0225 32.12L 13.9687 12.9361L 58.2175 21.7378L 42.7445 41.7119' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='2.50937'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='3.95735' cy='-32.12' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='6.0225' cy='32.12' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='11.9036' cy='-51.3039' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='13.9687' cy='12.9361' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='56.1523' cy='-42.5022' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='58.2175' cy='21.7378' fill='#ff0000' r='6.0225'/>
 </g>
-<g transform='matrix(0.996264 0 0 0.996264 58.4669 117.858)'>
-<circle cx='40.6794' cy='-22.5281' fill='#000000' r='6.0225'/>
+<g transform='translate(58.4669 117.858)scale(.996264)'>
+<circle cx='42.7445' cy='41.7119' fill='#ff0000' r='6.0225'/>
 </g>
 </g>
 </svg>
\ No newline at end of file

Added: trunk/Build/source/utils/asymptote/GUI/res/icons/redo.svg
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/redo.svg	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/redo.svg	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 423.754 423.754" style="enable-background:new 0 0 423.754 423.754;" xml:space="preserve">
+<path d="M407.516,123.239l-27.717,11.48c18.585,44.869,18.585,94.291,0,139.159c-18.585,44.869-53.531,79.815-98.4,98.4
+	c-22.438,9.293-46.004,13.94-69.579,13.939c-23.569-0.001-47.147-4.647-69.579-13.939c-44.869-18.585-79.815-53.531-98.4-98.4
+	C13.507,200.647,34.758,118.71,90.758,68.644l60.801,60.801V7.521H29.635L69.514,47.4C5.222,105.826-18.985,200.6,16.123,285.359
+	c21.652,52.272,62.364,92.984,114.636,114.636c26.137,10.826,53.599,16.239,81.061,16.239s54.924-5.413,81.06-16.239
+	c52.272-21.652,92.984-62.364,114.637-114.636C429.167,233.087,429.167,175.511,407.516,123.239z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

Added: trunk/Build/source/utils/asymptote/GUI/res/icons/undo.svg
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons/undo.svg	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons/undo.svg	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 423.754 423.754" style="enable-background:new 0 0 423.754 423.754;" xml:space="preserve">
+<path d="M354.24,47.4l39.879-39.879H272.196v121.924l60.801-60.801c56,50.066,77.251,132.004,46.918,205.235
+	c-18.585,44.869-53.531,79.815-98.4,98.4c-44.866,18.585-94.288,18.585-139.158,0c-44.869-18.585-79.815-53.531-98.4-98.4
+	c-18.585-44.869-18.585-94.29,0-139.159l-27.717-11.48c-21.651,52.272-21.651,109.848,0,162.12
+	c21.652,52.272,62.364,92.984,114.637,114.636c26.14,10.827,53.595,16.24,81.06,16.239c27.459-0.001,54.927-5.414,81.061-16.239
+	c52.271-21.652,92.983-62.364,114.636-114.636C442.739,200.6,418.532,105.826,354.24,47.4z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

Modified: trunk/Build/source/utils/asymptote/GUI/res/icons.qrc
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/res/icons.qrc	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/res/icons.qrc	2022-01-08 18:39:01 UTC (rev 61532)
@@ -41,5 +41,8 @@
     <file>icons/android-radio-button-off.svg</file>
     <file>icons/android-locate.svg</file>
     <file>icons/close-round.svg</file>
+    <file>icons/brush.svg</file>
+    <file>icons/undo.svg</file>
+    <file>icons/redo.svg</file>
   </qresource>
 </RCC>

Modified: trunk/Build/source/utils/asymptote/GUI/setup.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/setup.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/setup.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -7,7 +7,7 @@
     name="xasy",
     version=xasyVersion.xasyVersion,
     author="Supakorn Rassameemasmuang, Orest Shardt, and John C. Bowman",
-    description="User interface for Asymptote, a vector graphics language", 
+    description="User interface for Asymptote, a vector graphics language",
     url="https://asymptote.sourceforge.io",
     download_url="https://sourceforge.net/projects/asymptote/"
 )

Modified: trunk/Build/source/utils/asymptote/GUI/windows/widg_addPolyOpt.ui
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/windows/widg_addPolyOpt.ui	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/windows/widg_addPolyOpt.ui	2022-01-08 18:39:01 UTC (rev 61532)
@@ -60,6 +60,35 @@
       </widget>
      </item>
      <item>
+      <spacer name="horizontalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeType">
+        <enum>QSizePolicy::Fixed</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>19</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>Sides:  </string>
+       </property>
+      </widget>
+     </item>
+     <item>
       <widget class="QLineEdit" name="txtSides">
        <property name="toolTip">
         <string>Number of Sides</string>

Modified: trunk/Build/source/utils/asymptote/GUI/windows/window1.ui
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/windows/window1.ui	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/windows/window1.ui	2022-01-08 18:39:01 UTC (rev 61532)
@@ -127,7 +127,7 @@
             </property>
             <property name="icon">
              <iconset resource="../res/icons.qrc">
-              <normaloff>:/icons/android-arrow-back.svg</normaloff>:/icons/android-arrow-back.svg</iconset>
+              <normaloff>:/icons/undo.svg</normaloff>:/icons/undo.svg</iconset>
             </property>
             <property name="iconSize">
              <size>
@@ -171,7 +171,7 @@
             </property>
             <property name="icon">
              <iconset resource="../res/icons.qrc">
-              <normaloff>:/icons/android-arrow-forward.svg</normaloff>:/icons/android-arrow-forward.svg</iconset>
+              <normaloff>:/icons/redo.svg</normaloff>:/icons/redo.svg</iconset>
             </property>
             <property name="iconSize">
              <size>
@@ -605,7 +605,7 @@
             </property>
             <property name="maximumSize">
              <size>
-              <width>25</width>
+              <width>32</width>
               <height>25</height>
              </size>
             </property>
@@ -652,7 +652,7 @@
             </property>
             <property name="maximumSize">
              <size>
-              <width>25</width>
+              <width>32</width>
               <height>25</height>
              </size>
             </property>
@@ -664,6 +664,7 @@
             </property>
             <property name="font">
              <font>
+              <family>Roboto</family>
               <weight>75</weight>
               <bold>true</bold>
              </font>
@@ -737,6 +738,9 @@
               <height>16</height>
              </size>
             </property>
+            <property name="checkable">
+             <bool>true</bool>
+            </property>
             <property name="flat">
              <bool>true</bool>
             </property>
@@ -782,7 +786,7 @@
              </size>
             </property>
             <property name="checkable">
-             <bool>false</bool>
+             <bool>true</bool>
             </property>
             <property name="flat">
              <bool>true</bool>
@@ -1644,6 +1648,9 @@
                     <height>16</height>
                    </size>
                   </property>
+                  <property name="checkable">
+                   <bool>true</bool>
+                  </property>
                   <property name="flat">
                    <bool>true</bool>
                   </property>
@@ -1682,6 +1689,9 @@
                     <height>16</height>
                    </size>
                   </property>
+                  <property name="checkable">
+                   <bool>true</bool>
+                  </property>
                   <property name="flat">
                    <bool>true</bool>
                   </property>
@@ -1720,6 +1730,9 @@
                     <height>16</height>
                    </size>
                   </property>
+                  <property name="checkable">
+                   <bool>true</bool>
+                  </property>
                   <property name="flat">
                    <bool>true</bool>
                   </property>
@@ -1758,6 +1771,9 @@
                     <height>16</height>
                    </size>
                   </property>
+                  <property name="checkable">
+                   <bool>true</bool>
+                  </property>
                   <property name="flat">
                    <bool>true</bool>
                   </property>
@@ -1796,6 +1812,9 @@
                     <height>16</height>
                    </size>
                   </property>
+                  <property name="checkable">
+                   <bool>true</bool>
+                  </property>
                   <property name="flat">
                    <bool>true</bool>
                   </property>
@@ -1834,6 +1853,9 @@
                     <height>16</height>
                    </size>
                   </property>
+                  <property name="checkable">
+                   <bool>true</bool>
+                  </property>
                   <property name="flat">
                    <bool>true</bool>
                   </property>
@@ -1872,11 +1894,55 @@
                     <height>16</height>
                    </size>
                   </property>
+                  <property name="checkable">
+                   <bool>true</bool>
+                  </property>
                   <property name="flat">
                    <bool>true</bool>
                   </property>
                  </widget>
                 </item>
+                <item row="12" column="0">
+                 <widget class="QPushButton" name="btnAddFreehand">
+                  <property name="enabled">
+                   <bool>true</bool>
+                  </property>
+                  <property name="sizePolicy">
+                   <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+                    <horstretch>0</horstretch>
+                    <verstretch>0</verstretch>
+                   </sizepolicy>
+                  </property>
+                  <property name="maximumSize">
+                   <size>
+                    <width>32</width>
+                    <height>32</height>
+                   </size>
+                  </property>
+                  <property name="toolTip">
+                   <string><html><head/><body><p>Freehand</p></body></html></string>
+                  </property>
+                  <property name="text">
+                   <string/>
+                  </property>
+                  <property name="icon">
+                   <iconset resource="../res/icons.qrc">
+                    <normaloff>:/icons/brush.svg</normaloff>:/icons/brush.svg</iconset>
+                  </property>
+                  <property name="iconSize">
+                   <size>
+                    <width>16</width>
+                    <height>16</height>
+                   </size>
+                  </property>
+                  <property name="checkable">
+                   <bool>true</bool>
+                  </property>
+                  <property name="flat">
+                   <bool>true</bool>
+                  </property>
+                 </widget>
+                </item>
                </layout>
               </widget>
              </item>
@@ -2039,7 +2105,7 @@
      <x>0</x>
      <y>0</y>
      <width>1000</width>
-     <height>29</height>
+     <height>26</height>
     </rect>
    </property>
    <widget class="QMenu" name="menuFIle">
@@ -2046,9 +2112,19 @@
     <property name="title">
      <string>&File</string>
     </property>
+    <widget class="QMenu" name="menuOpenRecent">
+     <property name="title">
+      <string>Open Recent</string>
+     </property>
+     <addaction name="separator"/>
+     <addaction name="actionClearRecent"/>
+    </widget>
+    <addaction name="actionNewFile"/>
     <addaction name="actionOpen"/>
+    <addaction name="menuOpenRecent"/>
     <addaction name="actionSave"/>
     <addaction name="actionSaveAs"/>
+    <addaction name="actionExportToAsy"/>
     <addaction name="actionExportAsymptote"/>
     <addaction name="separator"/>
     <addaction name="actionQuit"/>
@@ -2066,6 +2142,7 @@
      <string>Optio&ns</string>
     </property>
     <addaction name="actionSettings"/>
+    <addaction name="actionKeymaps"/>
    </widget>
    <widget class="QMenu" name="menuHelp">
     <property name="title">
@@ -2113,7 +2190,7 @@
   </action>
   <action name="actionSaveAs">
    <property name="text">
-    <string>&Save As</string>
+    <string>&Save as</string>
    </property>
   </action>
   <action name="actionEnterCommand">
@@ -2159,7 +2236,7 @@
   </action>
   <action name="actionExportAsymptote">
    <property name="text">
-    <string>Export</string>
+    <string>Export as...</string>
    </property>
   </action>
   <action name="actionSave">
@@ -2172,6 +2249,26 @@
     <string>Open</string>
    </property>
   </action>
+  <action name="actionClearRecent">
+   <property name="text">
+    <string>Clear Menu</string>
+   </property>
+  </action>
+  <action name="actionNewFile">
+   <property name="text">
+    <string>New File</string>
+   </property>
+  </action>
+  <action name="actionExportToAsy">
+   <property name="text">
+    <string>Export as Asy</string>
+   </property>
+  </action>
+  <action name="actionKeymaps">
+   <property name="text">
+    <string>&Keymaps</string>
+   </property>
+  </action>
  </widget>
  <layoutdefault spacing="6" margin="9"/>
  <resources>

Modified: trunk/Build/source/utils/asymptote/GUI/xasy.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/xasy.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/xasy.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,14 +1,15 @@
 #!/usr/bin/env python3
 
-import sys,signal,os
-import PyQt5.QtWidgets as Qw
-import PyQt5.QtCore as Qc
+import sys, signal, os
+import PyQt5.QtWidgets as QtWidgets
+import PyQt5.QtCore as QtCore
 from Window1 import MainWindow1
 
 def main(args):
-    Qw.QApplication.setAttribute(Qc.Qt.AA_UseHighDpiPixmaps,True)
-    Qw.QApplication.setAttribute(Qc.Qt.AA_EnableHighDpiScaling,True)
-    qtApp = Qw.QApplication(args)
+    os.environ["QT_LOGGING_RULES"]="*.debug=false;qt.qpa.*=false"
+    QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps,True)
+    QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling,True)
+    qtApp = QtWidgets.QApplication(args)
     signal.signal(signal.SIGINT,signal.SIG_DFL)
     mainWin1 = MainWindow1()
     mainWin1.show()

Modified: trunk/Build/source/utils/asymptote/GUI/xasy2asy.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/xasy2asy.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/xasy2asy.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -9,12 +9,12 @@
 #
 ###########################################################################
 
-import PyQt5.QtWidgets as Qw
-import PyQt5.QtGui as Qg
-import PyQt5.QtCore as Qc
-import PyQt5.QtSvg as Qs
+import PyQt5.QtWidgets as QtWidgets
+import PyQt5.QtGui as QtGui
+import PyQt5.QtCore as QtCore
+import PyQt5.QtSvg as QtSvg
 
-import numpy as np
+import numpy as numpy
 
 import sys
 import os
@@ -37,8 +37,39 @@
 import xasySvg as xs
 
 class AsymptoteEngine:
-    xasy=chr(4)+"\n"
+    """
+    Purpose:
+    --------
+        Class that makes it possible for xasy to communicate with asy
+    through a background pipe. It communicates with asy through a
+    subprocess of an existing xasy process.
 
+    Attributes:
+    -----------
+        istream     : input stream
+        ostream     : output stream
+        keepFiles   : keep communicated files
+        tmpdir      : temporary directory
+        args        : system call arguments to start a required subprocess
+        asyPath     : directory path to asymptote
+        asyProcess  : the subprocess through which xasy communicates with asy
+
+    Virtual Methods: NULL
+    ----------------
+    Static Methods:
+    ---------------  NULL
+    Class Methods:
+    --------------   NULL
+
+    Object Methods:
+    ---------------
+        start()
+        wait()
+        stop()
+        cleanup()
+    """
+
+    xasy=chr(4)+'\n'
     def __init__(self, path=None, keepFiles=DebugFlags.keepFiles, keepDefaultArgs=True):
         if path is None:
             path = xa.getArgs().asypath
@@ -59,7 +90,7 @@
             os.set_inheritable(wa, True)
             self.ostream = os.fdopen(wx, 'w')
             self.istream = os.fdopen(ra, 'r')
-            
+
         self.keepFiles = keepFiles
         if sys.platform[:3] == 'win':
             self.tmpdir = tempfile.mkdtemp(prefix='xasyData_',dir='./')+'/'
@@ -66,12 +97,22 @@
         else:
             self.tmpdir = tempfile.mkdtemp(prefix='xasyData_')+os.sep
 
-        self.args=['-xasy', '-noV', '-q', '-inpipe=' + str(rx), '-outpipe=' + str(wa), '-o', self.tmpdir]
+        if xa.getArgs().render:
+            renderDensity=xa.getArgs().render
+        else:
+            try:
+                renderDensity = xo.BasicConfigs.defaultOpt['renderDensity']
+            except:
+                renderDensity = 2
+        renderDensity=max(renderDensity,1)
 
+        self.args=['-xasy', '-noV', '-q', '-outformat=', '-inpipe=' + str(rx), '-outpipe=' + str(wa), '-render='+str(renderDensity), '-o', self.tmpdir]
+
         self.asyPath = path
         self.asyProcess = None
 
     def start(self):
+        """ starts a subprocess (opens a pipe) """
         try:
             if sys.platform[:3] == 'win':
                 self.asyProcess = subprocess.Popen([self.asyPath] + self.args,
@@ -85,6 +126,7 @@
             atexit.register(self.cleanup)
 
     def wait(self):
+        """ wait for the pipe to finish any outstanding communication """
         if self.asyProcess.returncode is not None:
             return
         else:
@@ -114,10 +156,12 @@
         return self.asyProcess.returncode is None
 
     def stop(self):
+        """ kill an active asyProcess and close the pipe """
         if self.active:
             self.asyProcess.kill()
 
     def cleanup(self):
+        """ terminate processes and cleans up communication files """
         self.stop()
         if self.asyProcess is not None:
             self.asyProcess.wait()
@@ -125,11 +169,46 @@
             if os.path.isdir(self.tempDirName + os.sep):
                 shutil.rmtree(self.tempDirName, ignore_errors=True)
 
-class asyTransform(Qc.QObject):
-    """A python implementation of an asy transform"""
+class asyTransform(QtCore.QObject):
+    """
+    Purpose:
+    --------
+        A python implementation of an asy transform. This class takes care of calibrating asymptote
+        coordinate system with the one used in PyQt to handle all existing inconsistencies.
+        To understand how this class works, having enough acquaintance with asymptote transform
+        feature is required. It is a child class of QtCore.QObject class.
 
+    Attributes:
+    -----------
+        t                       : The tuple
+        x, y, xx, xy, yx, yy    : Coordinates corresponding to 6 entries
+        _deleted                : Private local flag
+
+    Virtual Methods:      NULL
+    ----------------
+    Static Methods:       NULL
+    ---------------
+
+    Class Methods:
+    --------------
+        zero            : Class method that returns an asyTransform object initialized with 6 zero entries
+        fromQTransform  : Class method that converts QTransform object to asyTransform object
+        fromNumpyMatrix : Class method that converts transform matrix object to asyTransform object
+
+    Object Methods:
+    --------------
+        getRawCode      : Returns the tuple entries
+        getCode         : Returns the textual format of the asy code corresponding to the given transform
+        scale           : Returns the scales version of the existing asyTransform
+        toQTransform    : Converts asy transform object to QTransform object
+        identity        : Return Identity asyTransform object
+        isIdentity      : Check whether the asyTransform object is identity object
+        inverted        : Applies the QTransform object's inverted method on the asyTransform object
+        yflip           : Returns y-flipped asyTransform object
+    """
+
     def __init__(self, initTuple, delete=False):
-        """Initialize the transform with a 6 entry tuple"""
+        """ Initialize the transform with a 6 entry tuple """
         super().__init__()
         if isinstance(initTuple, (tuple, list)) and len(initTuple) == 6:
             self.t = initTuple
@@ -151,7 +230,7 @@
         return asyTransform((0, 0, 0, 0, 0, 0))
 
     @classmethod
-    def fromQTransform(cls, transform: Qg.QTransform):
+    def fromQTransform(cls, transform: QtGui.QTransform):
         tx, ty = transform.dx(), transform.dy()
         xx, xy, yx, yy = transform.m11(), transform.m21(), transform.m12(), transform.m22()
 
@@ -158,7 +237,7 @@
         return asyTransform((tx, ty, xx, xy, yx, yy))
 
     @classmethod
-    def fromNumpyMatrix(cls, transform: np.ndarray):
+    def fromNumpyMatrix(cls, transform: numpy.ndarray):
         assert transform.shape == (3, 3)
 
         tx = transform[0, 2]
@@ -171,8 +250,8 @@
     def getRawCode(self):
         return xu.tuple2StrWOspaces(self.t)
 
-    def getCode(self, asy2psmap=None):
-        """Obtain the asy code that represents this transform"""
+    def getCode(self, asy2psmap = None):
+        """ Obtain the asy code that represents this transform """
         if asy2psmap is None:
             asy2psmap = asyTransform((0, 0, 1, 0, 0, 1))
         if self.deleted:
@@ -184,10 +263,10 @@
         return asyTransform((0, 0, s, 0, 0, s)) * self
 
     def toQTransform(self):
-        return Qg.QTransform(self.xx, self.yx, self.xy, self.yy, self.x, self.y)
+        return QtGui.QTransform(self.xx, self.yx, self.xy, self.yy, self.x, self.y)
 
     def __str__(self):
-        """Equivalent functionality to getCode(). It allows the expression str(asyTransform) to be meaningful."""
+        """ Equivalent functionality to getCode(). It allows the expression str(asyTransform) to be meaningful """
         return self.getCode()
 
     def isIdentity(self):
@@ -200,7 +279,7 @@
         return list(self.t) == list(other.t)
 
     def __mul__(self, other):
-        """Define multiplication of transforms as composition."""
+        """ Define multiplication of transforms as composition """
         if isinstance(other, tuple):
             if len(other) == 6:
                 return self * asyTransform(other)
@@ -234,25 +313,88 @@
 def yflip():
     return asyTransform((0, 0, 1, 0, 0, -1))
 
-class asyObj(Qc.QObject):
-    """A base class for asy objects: an item represented by asymptote code."""
+class asyObj(QtCore.QObject):
+    """
+    Purpose:
+    --------
+        A base class to create a Python object which contains all common
+    data and behaviors required during the translation of an xasy
+    object to its Asymptote code.
+
+    Attributes:
+    -----------
+        asyCode         :The corresponding Asymptote code for the asyObj instance
+
+    Virtual Methods:
+    ----------------
+        updateCode      :Must to be re-implemented
+
+    Static Methods:      NULL
+     --------------
+    Class Methods:       NULL
+    --------------
+
+    Object Methods:
+    ---------------
+        getCode         :Return the Asymptote code that corresponds to the passed object
+
+    """
+
     def __init__(self):
-        """Initialize the object"""
+        """ Initialize the object """
         super().__init__()
         self.asyCode = ''
 
-    def updateCode(self, ps2asymap=identity()):
-        """Update the object's code: should be overriden."""
+    def updateCode(self, ps2asymap = identity()):
+        """ Update the object's code: should be overridden """
         raise NotImplementedError
 
-    def getCode(self, ps2asymap=identity()):
-        """Return the code describing the object"""
+    def getCode(self, ps2asymap = identity()):
+        """ Return the code describing the object """
         self.updateCode(ps2asymap)
         return self.asyCode
 
 
 class asyPen(asyObj):
-    """A python wrapper for an asymptote pen"""
+    """
+    Purpose:
+    --------
+        A Python object that corresponds to an Asymptote pen type. It
+    extends the 'asyObj' class to include a pen object. This object
+    will be used to make the corresponding Asymptote pen when
+    an xasy object gets translated to Asymptote code.
+
+    Attributes:
+    -----------
+        color               : The color of Path
+        options             : The options that can be passed to the path
+        width               : The path width
+        _asyengine          : The Asymptote engine that will be used
+        _deferAsyfy         : ?
+
+    Virtual Methods:         NULL
+    ----------------
+    Static Methods:
+    ---------------
+        getColorFromQColor  :
+        convertToQColor     :
+
+    Class Methods:
+    --------------
+        fromAsyPen          :
+
+    Object Methods:
+    ---------------
+        asyEngine           :
+        updateCode          :
+        setWidth            :
+        setColor            :
+        setColorFromQColor  :
+        computeColor        :
+        tkColor             :
+        toQPen              :
+    """
+
     @staticmethod
     def getColorFromQColor(color):
         return color.redF(), color.greenF(), color.blueF()
@@ -260,15 +402,16 @@
     @staticmethod
     def convertToQColor(color):
         r, g, b = color
-        return Qg.QColor.fromRgbF(r, g, b)
+        return QtGui.QColor.fromRgbF(r, g, b)
 
     @classmethod
     def fromAsyPen(cls, pen):
         assert isinstance(pen, cls)
-        return cls(asyengine=pen._asyengine, color=pen.color, width=pen.width, pen_options=pen.options)
+        return cls(asyengine = pen._asyengine, color = pen.color, width = pen.width,
+                   pen_options = pen.options)
 
-    def __init__(self, asyengine=None, color=(0, 0, 0), width=0.5, pen_options=""):
-        """Initialize the pen"""
+    def __init__(self, asyengine = None, color=(0, 0, 0), width = 0.5, pen_options = ""):
+        """ Initialize the pen """
         asyObj.__init__(self)
         self.color = (0, 0, 0)
         self.options = pen_options
@@ -288,8 +431,8 @@
     def asyEngine(self, value):
         self._asyengine = value
 
-    def updateCode(self, asy2psmap=identity()):
-        """Generate the pen's code"""
+    def updateCode(self, asy2psmap = identity()):
+        """ Generate the pen's code """
         if self._deferAsyfy:
             self.computeColor()
         self.asyCode = 'rgb({:g},{:g},{:g})+{:s}'.format(self.color[0], self.color[1], self.color[2], str(self.width))
@@ -297,12 +440,12 @@
             self.asyCode = self.asyCode + '+' + self.options
 
     def setWidth(self, newWidth):
-        """Set the pen's width"""
+        """ Set the pen's width """
         self.width = newWidth
         self.updateCode()
 
     def setColor(self, color):
-        """Set the pen's color"""
+        """ Set the pen's color """
         if isinstance(color, tuple) and len(color) == 3:
             self.color = color
         else:
@@ -313,13 +456,12 @@
         self.setColor(asyPen.getColorFromQColor(color))
 
     def computeColor(self):
-        """Find out the color of an arbitrary asymptote pen."""
+        """ Find out the color of an arbitrary Asymptote pen """
         assert isinstance(self.asyEngine, AsymptoteEngine)
         assert self.asyEngine.active
 
         fout = self.asyEngine.ostream
         fin = self.asyEngine.istream
-
         fout.write("pen p=" + self.getCode() + ';\n')
         fout.write("write(_outpipe,colorspace(p),newl);\n")
         fout.write("write(_outpipe,colors(p));\n")
@@ -347,15 +489,10 @@
         self.color = (r, g, b)
         self._deferAsyfy = False
 
-    def tkColor(self):
-        """Return the tk version of the pen's color"""
-        self.computeColor()
-        return '#{}'.format("".join(["{:02x}".format(min(int(256 * a), 255)) for a in self.color]))
-
     def toQPen(self):
         if self._deferAsyfy:
             self.computeColor()
-        newPen = Qg.QPen()
+        newPen = QtGui.QPen()
         newPen.setColor(asyPen.convertToQColor(self.color))
         newPen.setWidthF(self.width)
 
@@ -363,10 +500,34 @@
 
 
 class asyPath(asyObj):
-    """A python wrapper for an asymptote path"""
+    """
+    Purpose:
+    --------
+        A Python object that corresponds to an Asymptote path type. It
+    extends the 'asyObj' class to include a path object. This object
+    will be used to make the corresponding Asymptote path object when
+    an xasy object gets translated to its Asymptote code.
 
+    Attributes:
+    -----------
+
+    Virtual Methods:
+    ----------------
+
+    Static Methods:
+    ---------------
+
+    Class Methods:
+    --------------
+
+    Object Methods:
+    ---------------
+
+    """
+
+
     def __init__(self, asyengine: AsymptoteEngine=None, forceCurve=False):
-        """Initialize the path to be an empty path: a path with no nodes, control points, or links."""
+        """ Initialize the path to be an empty path: a path with no nodes, control points, or links """
         super().__init__()
         self.nodeSet = []
         self.linkSet = []
@@ -374,6 +535,7 @@
         self.controlSet = []
         self.computed = False
         self.asyengine = asyengine
+        self.fill = False
 
     @classmethod
     def fromPath(cls, oldPath):
@@ -380,6 +542,7 @@
         newObj = asyPath(None)
         newObj.nodeSet = copy.copy(oldPath.nodeSet)
         newObj.linkSet = copy.copy(oldPath.linkSet)
+        newObj.fill = copy.copy(oldPath.fill)
         newObj.controlSet = copy.deepcopy(oldPath.controlSet)
         newObj.computed = oldPath.computed
         newObj.asyengine = oldPath.asyengine
@@ -406,6 +569,7 @@
     def setInfo(self, path):
         self.nodeSet = copy.copy(path.nodeSet)
         self.linkSet = copy.copy(path.linkSet)
+        self.fill = copy.copy(path.fill)
         self.controlSet = copy.deepcopy(path.controlSet)
         self.computed = path.computed
 
@@ -417,12 +581,12 @@
     def isDrawable(self):
         return len(self.nodeSet) >= 2
 
-    def toQPainterPath(self) -> Qg.QPainterPath:
+    def toQPainterPath(self) -> QtGui.QPainterPath:
         return self.toQPainterPathCurve() if self.containsCurve else self.toQPainterPathLine()
 
     def toQPainterPathLine(self):
         baseX, baseY = self.nodeSet[0]
-        painterPath = Qg.QPainterPath(Qc.QPointF(baseX, baseY))
+        painterPath = QtGui.QPainterPath(QtCore.QPointF(baseX, baseY))
 
         for pointIndex in range(1, len(self.nodeSet)):
             node = self.nodeSet[pointIndex]
@@ -439,21 +603,21 @@
             self.computeControls()
 
         baseX, baseY = self.nodeSet[0]
-        painterPath = Qg.QPainterPath(Qc.QPointF(baseX, baseY))
+        painterPath = QtGui.QPainterPath(QtCore.QPointF(baseX, baseY))
 
         for pointIndex in range(1, len(self.nodeSet)):
             node = self.nodeSet[pointIndex]
             if self.nodeSet[pointIndex] == 'cycle':
                 node = self.nodeSet[0]
-            endPoint = Qc.QPointF(node[0], node[1])
-            ctrlPoint1 = Qc.QPointF(self.controlSet[pointIndex-1][0][0], self.controlSet[pointIndex-1][0][1])
-            ctrlPoint2 = Qc.QPointF(self.controlSet[pointIndex-1][1][0], self.controlSet[pointIndex-1][1][1])
+            endPoint = QtCore.QPointF(node[0], node[1])
+            ctrlPoint1 = QtCore.QPointF(self.controlSet[pointIndex-1][0][0], self.controlSet[pointIndex-1][0][1])
+            ctrlPoint2 = QtCore.QPointF(self.controlSet[pointIndex-1][1][0], self.controlSet[pointIndex-1][1][1])
 
             painterPath.cubicTo(ctrlPoint1, ctrlPoint2, endPoint)
         return painterPath
 
     def initFromNodeList(self, nodeSet, linkSet):
-        """Initialize the path from a set of nodes and link types, "--", "..", or "::" """
+        """ Initialize the path from a set of nodes and link types, '--', '..', or '::' """
         if len(nodeSet) > 0:
             self.nodeSet = nodeSet[:]
             self.linkSet = linkSet[:]
@@ -460,22 +624,22 @@
             self.computed = False
 
     def initFromControls(self, nodeSet, controlSet):
-        """Initialize the path from nodes and control points"""
+        """ Initialize the path from nodes and control points """
         self.controlSet = controlSet[:]
         self.nodeSet = nodeSet[:]
         self.computed = True
 
     def makeNodeStr(self, node):
-        """Represent a node as a string"""
+        """ Represent a node as a string """
         if node == 'cycle':
             return node
         else:
             # if really want to, disable this rounding
-            # shouldn't be to much of a problem since 10e-6 is quite small... 
+            # shouldn't be to much of a problem since 10e-6 is quite small...
             return '({:.6g},{:.6g})'.format(node[0], node[1])
 
     def updateCode(self, ps2asymap=identity()):
-        """Generate the code describing the path"""
+        """ Generate the code describing the path """
         # currently at postscript. Convert to asy
         asy2psmap =  ps2asymap.inverted()
         with io.StringIO() as rawAsyCode:
@@ -499,28 +663,28 @@
         return '..' in self.linkSet or self.forceCurve
 
     def getNode(self, index):
-        """Return the requested node"""
+        """ Return the requested node """
         return self.nodeSet[index]
 
     def getLink(self, index):
-        """Return the requested link"""
+        """ Return the requested link """
         return self.linkSet[index]
 
     def setNode(self, index, newNode):
-        """Set a node to a new position"""
+        """ Set a node to a new position """
         self.nodeSet[index] = newNode
 
     def moveNode(self, index, offset):
-        """Translate a node"""
+        """ Translate a node """
         if self.nodeSet[index] != "cycle":
             self.nodeSet[index] = (self.nodeSet[index][0] + offset[0], self.nodeSet[index][1] + offset[1])
 
     def setLink(self, index, ltype):
-        """Change the specified link"""
+        """ Change the specified link """
         self.linkSet[index] = ltype
 
     def addNode(self, point, ltype):
-        """Add a node to the end of a path"""
+        """ Add a node to the end of a path """
         self.nodeSet.append(point)
         if len(self.nodeSet) != 1:
             self.linkSet.append(ltype)
@@ -528,7 +692,7 @@
             self.computeControls()
 
     def insertNode(self, index, point, ltype=".."):
-        """Insert a node, and its corresponding link, at the given index"""
+        """ Insert a node, and its corresponding link, at the given index """
         self.nodeSet.insert(index, point)
         self.linkSet.insert(index, ltype)
         if self.computed:
@@ -535,7 +699,7 @@
             self.computeControls()
 
     def setControl(self, index, position):
-        """Set a control point to a new position"""
+        """ Set a control point to a new position """
         self.controlSet[index] = position
 
     def popNode(self):
@@ -545,11 +709,11 @@
         self.linkSet.pop()
 
     def moveControl(self, index, offset):
-        """Translate a control point"""
+        """ Translate a control point """
         self.controlSet[index] = (self.controlSet[index][0] + offset[0], self.controlSet[index][1] + offset[1])
 
     def computeControls(self):
-        """Evaluate the code of the path to obtain its control points"""
+        """ Evaluate the code of the path to obtain its control points """
         # For now, if no asymptote process is given spawns a new one.
         # Only happens if asyengine is None.
         if self.asyengine is not None:
@@ -595,9 +759,33 @@
             asy.stop()
 
 class asyLabel(asyObj):
-    """A python wrapper for an asy label"""
+    """
+    Purpose:
+    --------
+        A Python object that corresponds to an asymptote label
+    type. It extends the 'asyObj' class to include a label
+    object. This object will be used to make the corresponding
+    Asymptote label object when an xasy object gets translated to its
+    asymptote code.
 
-    def __init__(self, text="", location=(0, 0), pen=None, align=None, fontSize:int=None):
+    Attributes:
+    -----------
+
+    Virtual Methods:
+    ----------------
+
+    Static Methods:
+    ---------------
+
+    Class Methods:
+    --------------
+
+    Object Methods:
+    ---------------
+
+    """
+
+    def __init__(self, text = "", location = (0, 0), pen = None, align = None, fontSize:int = None):
         """Initialize the label with the given test, location, and pen"""
         asyObj.__init__(self)
         self.align = align
@@ -610,8 +798,8 @@
         self.text = text
         self.location = location
 
-    def updateCode(self, asy2psmap=identity()):
-        """Generate the code describing the label"""
+    def updateCode(self, asy2psmap = identity()):
+        """ Generate the code describing the label """
         newLoc = asy2psmap.inverted() * self.location
         locStr = xu.tuple2StrWOspaces(newLoc)
         self.asyCode = 'Label("{0}",{1},p={2}{4},align={3})'.format(self.text, locStr, self.pen.getCode(), self.align,
@@ -624,22 +812,45 @@
             return ''
 
     def setText(self, text):
-        """Set the label's text"""
+        """ Set the label's text """
         self.text = text
         self.updateCode()
 
     def setPen(self, pen):
-        """Set the label's pen"""
+        """ Set the label's pen """
         self.pen = pen
         self.updateCode()
 
     def moveTo(self, newl):
-        """Translate the label's location"""
+        """ Translate the label's location """
         self.location = newl
 
 
 class asyImage:
-    """A structure containing an image and its format, bbox, and IDTag"""
+    """
+    Purpose:
+    --------
+        A Python object that is a container for an image coming from
+    Asymptote that is populated with the format, bounding box, and
+    IDTag, Asymptote key.
+
+    Attributes:
+    -----------
+
+    Virtual Methods:
+    ----------------
+
+    Static Methods:
+    ---------------
+
+    Class Methods:
+    --------------
+
+    Object Methods:
+    ---------------
+
+    """
+
     def __init__(self, image, format, bbox, transfKey=None, keyIndex=0):
         self.image = image
         self.format = format
@@ -648,8 +859,31 @@
         self.key = transfKey
         self.keyIndex = keyIndex
 
-class xasyItem(Qc.QObject):
-    """A base class for items in the xasy GUI"""
+class xasyItem(QtCore.QObject):
+    """
+    Purpose:
+    --------
+        A base class for any xasy object that can be drawn in PyQt. This class takes
+        care of all common behaviors available on any xasy item as well as all common
+        actions that can be done or applied to every xasy item.
+
+    Attributes:
+    -----------
+
+    Virtual Methods:
+    ----------------
+
+    Static Methods:
+    ---------------
+
+    Class Methods:
+    --------------
+
+    Object Methods:
+    ---------------
+
+    """
+
     mapString = 'xmap'
     setKeyFormatStr = string.Template('$map("{:s}",{:s});').substitute(map=mapString)
     setKeyAloneFormatStr = string.Template('$map("{:s}");').substitute(map=mapString)
@@ -656,7 +890,7 @@
     resizeComment="// Resize to initial xasy transform"
     asySize=""
     def __init__(self, canvas=None, asyengine=None):
-        """Initialize the item to an empty item"""
+        """ Initialize the item to an empty item """
         super().__init__()
         self.transfKeymap = {}              # the new keymap.
         # should be a dictionary to a list...
@@ -672,11 +906,10 @@
         self.setKeyed = True
         self.unsetKeys = set()
         self.userKeys = set()
-        self.lineOffset = 0
         self.imageHandleQueue = queue.Queue()
 
-    def updateCode(self, ps2asymap=identity()):
-        """Update the item's code: to be overriden"""
+    def updateCode(self, ps2asymap = identity()):
+        """ Update the item's code: to be overridden """
         with io.StringIO() as rawCode:
             transfCode = self.getTransformCode()
             objCode = self.getObjectCode()
@@ -683,7 +916,7 @@
 
             rawCode.write(transfCode)
             rawCode.write(objCode)
-            self.asyCode = rawCode.getvalue() 
+            self.asyCode = rawCode.getvalue()
 
         return len(transfCode.splitlines()), len(objCode.splitlines())
 
@@ -695,34 +928,32 @@
     def asyengine(self, value):
         self._asyengine = value
 
-    def getCode(self, ps2asymap=identity()):
-        """Return the code describing the item"""
+    def getCode(self, ps2asymap = identity()):
+        """ Return the code describing the item """
         self.updateCode(ps2asymap)
         return self.asyCode
 
-    def getTransformCode(self, asy2psmap=identity()):
+    def getTransformCode(self, asy2psmap = identity()):
         raise NotImplementedError
 
-    def getObjectCode(self, asy2psmap=identity()):
+    def getObjectCode(self, asy2psmap = identity()):
         raise NotImplementedError
 
     def generateDrawObjects(self):
         raise NotImplementedError
 
-    def handleImageReception(self, file, fileformat, bbox, count, key=None, localCount=0, containsClip=False):
-        """Receive an image from an asy deconstruction. It replaces the default n asyProcess."""
+    def handleImageReception(self, file, fileformat, bbox, count, key = None, localCount = 0, containsClip = False):
+        """ Receive an image from an asy deconstruction. It replaces the default n asyProcess """
         # image = Image.open(file).transpose(Image.FLIP_TOP_BOTTOM)
-        if fileformat == 'png':
-            image = Qg.QImage(file)
-        elif fileformat == 'svg':
+        if fileformat == 'svg':
             if containsClip:
                 image = xs.SvgObject(self.asyengine.tempDirName+file)
             else:
-                image = Qs.QSvgRenderer(file)
+                image = QtSvg.QSvgRenderer(file)
                 assert image.isValid()
         else:
-            raise Exception('Format not supported!')
-        self.imageList.append(asyImage(image, fileformat, bbox, transfKey=key, keyIndex=localCount))
+            raise Exception('Format {} not supported!'.format(fileformat))
+        self.imageList.append(asyImage(image, fileformat, bbox, transfKey = key, keyIndex = localCount))
         if self.onCanvas is not None:
             # self.imageList[-1].iqt = ImageTk.PhotoImage(image)
             currImage = self.imageList[-1]
@@ -733,7 +964,7 @@
             currImage.performCanvasTransform = False
 
             # handle this case if transform is not in the map yet.
-            # if deleted - set transform to 0, 0, 0, 0, 0
+            # if deleted - set transform to (0,0,0,0,0,0)
             transfExists = key in self.transfKeymap.keys()
             if transfExists:
                 transfExists = localCount <= len(self.transfKeymap[key]) - 1
@@ -745,7 +976,7 @@
             if (not transfExists) or validKey:
                 currImage.IDTag = str(file)
                 newDrawObj = DrawObject(currImage.iqt, self.onCanvas['canvas'], transform=identity(),
-                                        btmRightanchor=Qc.QPointF(bbox[0], bbox[2]), drawOrder=-1, key=key,
+                                        btmRightanchor=QtCore.QPointF(bbox[0], bbox[2]), drawOrder=-1, key=key,
                                         parentObj=self, keyIndex=localCount)
                 newDrawObj.setBoundingBoxPs(bbox)
                 newDrawObj.setParent(self)
@@ -757,7 +988,8 @@
                 else:
                     self.drawObjectsMap[key].append(newDrawObj)
         return containsClip
-    def asyfy(self, force=False):
+
+    def asyfy(self, force = False):
         if self.asyengine is None:
             return 1
         if self.asyfied and not force:
@@ -772,7 +1004,7 @@
         self.userKeys.clear()
 
         self.imageHandleQueue = queue.Queue()
-        worker = threading.Thread(target=self.asyfyThread, args=[])
+        worker = threading.Thread(target = self.asyfyThread, args = [])
         worker.start()
         item = self.imageHandleQueue.get()
         cwd=os.getcwd();
@@ -797,22 +1029,25 @@
         worker.join()
 
     def asyfyThread(self):
-        """Convert the item to a list of images by deconstructing this item's code"""
+        """
+        Convert the item to a list of images by deconstructing this item's code
+        """
         assert self.asyengine.active
 
         fout = self.asyengine.ostream
         fin = self.asyengine.istream
 
-        self.lineOffset = len(self.getTransformCode().splitlines())
+        self.maxKey=0
 
         fout.write("reset\n")
         fout.flush();
         for line in self.getCode().splitlines():
-            if DebugFlags.printDeconstTranscript:
-                print('fout:', line)
+            if DebugFlags.printAsyTranscript:
+                print(line)
             fout.write(line+"\n")
         fout.write(self.asySize)
-        fout.write("deconstruct();\n")
+
+        fout.write('deconstruct();\n')
         fout.write('write(_outpipe,yscale(-1)*currentpicture.calculateTransform(),endl);\n')
         fout.write(self.asyengine.xasy)
         fout.flush()
@@ -826,21 +1061,21 @@
             for i in range(len(imageInfos)):
                 box, key, localCount, useClip = imageInfos[i]
                 l, b, r, t = [float(a) for a in box.split()]
-                name = "_{:d}.{:s}".format(i, fileformat)
+                name = '_{:d}.{:s}'.format(1+i, fileformat)
 
                 self.imageHandleQueue.put((name, fileformat, (l, -t, r, -b), i, key, localCount, useClip))
 
         # key first, box second.
-        # if key is "Done"
+        # if key is 'Done'
         raw_text = fin.readline()
-        text = ""
+        text = ''
         if DebugFlags.printDeconstTranscript:
+            print(self.asyengine.tmpdir)
             print(raw_text.strip())
 
-        # template=AsyTempDir+"%d_%d.%s"
-        fileformat = 'svg'
+        fileformat = 'svg' # Output format
 
-        while raw_text != "Done\n" and raw_text != "Error\n":
+        while raw_text != 'Done\n' and raw_text != 'Error\n':
 #            print(raw_text)
             text = fin.readline()       # the actual bounding box.
             # print('TESTING:', text)
@@ -847,16 +1082,23 @@
             keydata = raw_text.strip().replace('KEY=', '', 1)  # key
 
             clipflag = keydata[-1] == '1'
+            deleted = keydata[-1] == '2'
             userkey = keydata[-2] == '1'
             keydata = keydata[:-3]
 
             if not userkey:
-                self.unsetKeys.add(keydata)     # the line and column to replace. 
+                self.unsetKeys.add(keydata)     # the line and column to replace.
             else:
+                if keydata.isdigit():
+                    self.maxKey=max(self.maxKey,int(keydata))
                 self.userKeys.add(keydata)
-            
+
 #                print(line, col)
 
+            if deleted:
+                raw_text = fin.readline()
+                continue
+
             if keydata not in keyCounts.keys():
                 keyCounts[keydata] = 0
 
@@ -873,23 +1115,45 @@
 
             n += 1
 
-        if raw_text != "Error\n":
-            if text == "Error\n":
-                self.imageHandleQueue.put(("ERROR", fin.readline()))
+        if raw_text != 'Error\n':
+            if text == 'Error\n':
+                self.imageHandleQueue.put(('ERROR', fin.readline()))
             else:
                 render()
 
             self.asy2psmap = asyTransform(xu.listize(fin.readline().rstrip(),float))
         else:
-            self.asy2psmap = identity()
+            self.asy2psmap = yflip()
         self.imageHandleQueue.put((None,))
         self.asyfied = True
 
 class xasyDrawnItem(xasyItem):
-    """A base class for GUI items was drawn by the user. It combines a path, a pen, and a transform."""
+    """
+    Purpose:
+    --------
+        A base class dedicated to any xasy item that is drawn on GUI. Every object of this class
+        will correspond to a particular drawn xasy item on GUI, which contains all its particular
+        data.
 
-    def __init__(self, path, engine, pen=None, transform=identity(), key=None):
-        """Initialize the item with a path, pen, and transform"""
+    Attributes:
+    -----------
+
+    Virtual Methods:
+    ----------------
+
+    Static Methods:
+    ---------------
+
+    Class Methods:
+    --------------
+
+    Object Methods:
+    ---------------
+
+    """
+
+    def __init__(self, path, engine, pen = None, transform = identity(), key = None):
+        """ Initialize the item with a path, pen, and transform """
         super().__init__(canvas=None, asyengine=engine)
         if pen is None:
             pen = asyPen()
@@ -921,7 +1185,9 @@
         raise NotImplementedError
 
     def appendPoint(self, point, link=None):
-        """Append a point to the path. If the path is cyclic, add this point before the 'cycle' node."""
+        """ Append a point to the path. If the path is cyclic, add this point before the 'cycle'
+            node
+        """
         if self.path.nodeSet[-1] == 'cycle':
             self.path.nodeSet[-1] = point
             self.path.nodeSet.append('cycle')
@@ -933,12 +1199,14 @@
             self.path.linkSet.append(link)
 
     def clearTransform(self):
-        """Reset the item's transform"""
+        """ Reset the item's transform """
         self.transform = [identity()]
         self.asyfied = False
 
     def removeLastPoint(self):
-        """Remove the last point in the path. If the path is cyclic, remove the node before the 'cycle' node."""
+        """ Remove the last point in the path. If the path is cyclic, remove the node before the 'cycle'
+            node
+        """
         if self.path.nodeSet[-1] == 'cycle':
             del self.path.nodeSet[-2]
         else:
@@ -948,7 +1216,9 @@
         self.asyfied = False
 
     def setLastPoint(self, point):
-        """Modify the last point in the path. If the path is cyclic, modify the node before the 'cycle' node."""
+        """ Modify the last point in the path. If the path is cyclic, modify the node before the 'cycle'
+            node
+        """
         if self.path.nodeSet[-1] == 'cycle':
             self.path.nodeSet[-2] = point
         else:
@@ -958,13 +1228,38 @@
 
 
 class xasyShape(xasyDrawnItem):
-    """An outlined shape drawn on the GUI"""
+    """ An outlined shape drawn on the GUI """
+    """
+    Purpose:
+    --------
+
+    Attributes:
+    -----------
+
+    Virtual Methods:
+    ----------------
+
+    Static Methods:
+    ---------------
+
+    Class Methods:
+    --------------
+
+    Object Methods:
+    ---------------
+
+    """
+
+
     def __init__(self, path, asyengine, pen=None, transform=identity()):
         """Initialize the shape with a path, pen, and transform"""
         super().__init__(path=path, engine=asyengine, pen=pen, transform=transform)
 
     def getObjectCode(self, asy2psmap=identity()):
-        return 'draw(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n'
+        if self.path.fill:
+            return 'fill(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n'
+        else:
+            return 'draw(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n'
 
     def getTransformCode(self, asy2psmap=identity()):
         transf = self.transfKeymap[self.transfKey][0]
@@ -982,63 +1277,121 @@
                             key=self.transfKey)
         newObj.originalObj = self
         newObj.setParent(self)
+        newObj.fill=self.path.fill
         return [newObj]
 
     def __str__(self):
-        """Create a string describing this shape"""
+        """ Create a string describing this shape """
         return "xasyShape code:{:s}".format("\n\t".join(self.getCode().splitlines()))
 
+    def swapFill(self):
+        self.path.fill = not self.path.fill
 
+    def copy(self):
+        return type(self)(self.path,self._asyengine,self.pen)
+
+
 class xasyFilledShape(xasyShape):
-    """A filled shape drawn on the GUI"""
+    """ A filled shape drawn on the GUI """
 
-    def __init__(self, path, asyengine, pen=None, transform=identity()):
-        """Initialize this shape with a path, pen, and transform"""
+    """
+    Purpose:
+    --------
+
+    Attributes:
+    -----------
+
+    Virtual Methods:
+    ----------------
+
+    Static Methods:
+    ---------------
+
+    Class Methods:
+    --------------
+
+    Object Methods:
+    ---------------
+
+    """
+
+    def __init__(self, path, asyengine, pen = None, transform = identity()):
+        """ Initialize this shape with a path, pen, and transform """
         if path.nodeSet[-1] != 'cycle':
             raise Exception("Filled paths must be cyclic")
         super().__init__(path, asyengine, pen, transform)
+        self.path.fill=True
 
     def getObjectCode(self, asy2psmap=identity()):
-        return 'fill(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n'
+        if self.path.fill:
+            return 'fill(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n'
+        else:
+            return 'draw(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n'
 
-    def generateDrawObjects(self, forceUpdate=False):
+    def generateDrawObjects(self, forceUpdate = False):
         if self.path.containsCurve:
             self.path.computeControls()
-        newObj = DrawObject(self.path.toQPainterPath(), None, drawOrder=0, transform=self.transfKeymap[self.transfKey][0],
-                            pen=self.pen, key=self.transfKey, fill=True)
+        newObj = DrawObject(self.path.toQPainterPath(), None, drawOrder = 0, transform = self.transfKeymap[self.transfKey][0],
+                            pen = self.pen, key = self.transfKey, fill = True)
         newObj.originalObj = self
         newObj.setParent(self)
+        newObj.fill=self.path.fill
         return [newObj]
 
     def __str__(self):
-        """Return a string describing this shape"""
+        """ Return a string describing this shape """
         return "xasyFilledShape code:{:s}".format("\n\t".join(self.getCode().splitlines()))
 
+    def swapFill(self):
+        self.path.fill = not self.path.fill
 
+
 class xasyText(xasyItem):
-    """Text created by the GUI"""
+    """ Text created by the GUI """
 
-    def __init__(self, text, location, asyengine, pen=None, transform=yflip(), key=None, align=None, fontsize:int=None):
-        """Initialize this item with text, a location, pen, and transform"""
-        super().__init__(asyengine=asyengine)
+    """
+    Purpose:
+    --------
+
+    Attributes:
+    -----------
+
+    Virtual Methods:
+    ----------------
+
+    Static Methods:
+    ---------------
+
+    Class Methods:
+    --------------
+
+    Object Methods:
+    ---------------
+
+    """
+
+    def __init__(self, text, location, asyengine, pen = None, transform = yflip(), key = None, align = None, fontsize:int = None):
+        """ Initialize this item with text, a location, pen, and transform """
+        super().__init__(asyengine = asyengine)
         if pen is None:
-            pen = asyPen(asyengine=asyengine)
+            pen = asyPen(asyengine = asyengine)
         if pen.asyEngine is None:
             pen.asyEngine = asyengine
-        self.label = asyLabel(text, location, pen, align, fontSize=fontsize)
+        self.label = asyLabel(text, location, pen, align, fontSize = fontsize)
         # self.transform = [transform]
         self.transfKey = key
         self.transfKeymap = {self.transfKey: [transform]}
         self.asyfied = False
         self.onCanvas = None
-    
-    def setKey(self, newKey=None):
+        self.pen = pen
+
+    def setKey(self, newKey = None):
         transform = self.transfKeymap[self.transfKey][0]
 
         self.transfKey = newKey
         self.transfKeymap = {self.transfKey: [transform]}
 
-    def getTransformCode(self, asy2psmap=yflip()):
+    def getTransformCode(self, asy2psmap = yflip()):
         transf = self.transfKeymap[self.transfKey][0]
         if transf == yflip():
             # return xasyItem.setKeyAloneFormatStr.format(self.transfKey)
@@ -1046,10 +1399,10 @@
         else:
             return xasyItem.setKeyFormatStr.format(self.transfKey, transf.getCode(asy2psmap))+"\n"
 
-    def getObjectCode(self, asy2psmap=yflip()):
+    def getObjectCode(self, asy2psmap = yflip()):
         return 'label(KEY="{0}",{1});'.format(self.transfKey, self.label.getCode(asy2psmap))+'\n'
 
-    def generateDrawObjects(self, forceUpdate=False):
+    def generateDrawObjects(self, forceUpdate = False):
         self.asyfy(forceUpdate)
         return self.drawObjects
 
@@ -1060,12 +1413,36 @@
     def __str__(self):
         return "xasyText code:{:s}".format("\n\t".join(self.getCode().splitlines()))
 
+    def copy(self):
+        return type(self)(self.label.text,self.label.location,self._asyengine)
 
+
 class xasyScript(xasyItem):
-    """A set of images create from asymptote code. It is always deconstructed."""
+    """ A set of images create from asymptote code. It is always deconstructed """
 
+    """
+    Purpose:
+    --------
+
+    Attributes:
+    -----------
+
+    Virtual Methods:
+    ----------------
+
+    Static Methods:
+    ---------------
+
+    Class Methods:
+    --------------
+
+    Object Methods:
+    ---------------
+
+    """
+
     def __init__(self, canvas, engine, script="", transforms=None, transfKeyMap=None):
-        """Initialize this script item"""
+        """ Initialize this script item """
         super().__init__(canvas, asyengine=engine)
         if transfKeyMap is not None:
             self.transfKeymap = transfKeyMap
@@ -1080,7 +1457,7 @@
         self.updatedPrefix = True
 
     def clearTransform(self):
-        """Reset the transforms for each of the deconstructed images"""
+        """ Reset the transforms for each of the deconstructed images """
         # self.transform = [identity()] * len(self.imageList)
         keyCount = {}
 
@@ -1093,14 +1470,6 @@
         for key in keyCount:
             self.transfKeymap[key] = [identity()] * keyCount[key]
 
-    def getMaxKeyCounter(self):
-        maxCounter = -1
-        for key in self.transfKeymap:
-            testNum = re.match(r'^x(\d+)$', key)
-            if testNum is not None:
-                maxCounter = max(maxCounter, int(testNum.group(1)))
-        return maxCounter + 1
-
     def getTransformCode(self, asy2psmap=identity()):
         with io.StringIO() as rawAsyCode:
             if self.transfKeymap:
@@ -1109,21 +1478,22 @@
 
                     writeval = list(reversed(val))
                     # need to map all transforms in a list if there is any non-identity
-                    # unfortunately, have to check all transformations in the list. 
-                    while not all(checktransf == identity() for checktransf in writeval) and writeval:
+                    # unfortunately, have to check all transformations in the list.
+                    while not all((checktransf == identity() and not checktransf.deleted) for checktransf in writeval) and writeval:
                         transf = writeval.pop()
                         if transf.deleted:
-                            rawAsyCode.write(xasyItem.setKeyFormatStr.format(key, transf.getCode(asy2psmap)) + '\n//')
-                        if transf == identity() and not transf.deleted:
-                            rawAsyCode.write(xasyItem.setKeyAloneFormatStr.format(key))
+                            rawAsyCode.write(xasyItem.setKeyFormatStr.format(key, transf.getCode(asy2psmap)))
                         else:
-                            rawAsyCode.write(xasyItem.setKeyFormatStr.format(key, transf.getCode(asy2psmap)))
+                            if transf == identity():
+                                rawAsyCode.write(xasyItem.setKeyAloneFormatStr.format(key))
+                            else:
+                                rawAsyCode.write(xasyItem.setKeyFormatStr.format(key, transf.getCode(asy2psmap)))
                         rawAsyCode.write('\n')
             result = rawAsyCode.getvalue()
         return result
 
     def findNonIdKeys(self):
-        return {key for key in self.transfKeymap if not all(transf == identity() for transf in self.transfKeymap[key]) }
+        return {key for key in self.transfKeymap if not all(not transf.deleted and transf == identity() for transf in self.transfKeymap[key]) }
 
     def getObjectCode(self, asy2psmap=identity()):
         numeric=r'([-+]?(?:(?:\d*\.\d+)|(?:\d+\.?)))'
@@ -1144,7 +1514,7 @@
             return self.updatedCode
 
     def setScript(self, script):
-        """Sets the content of the script item."""
+        """ Sets the content of the script item """
         self.script = script
         self.updateCode()
 
@@ -1155,7 +1525,7 @@
     def getReplacedKeysCode(self, key2replace: set=None) -> str:
         keylist = {}
         prefix = ''
-        
+
         key2replaceSet = self.unsetKeys if key2replace is None else \
                         self.unsetKeys & key2replace
 
@@ -1180,9 +1550,8 @@
 
         raw_code_lines = self.script.splitlines()
         with io.StringIO() as raw_str:
-            for i_0 in range(len(raw_code_lines)):
-                i = i_0 + self.lineOffset
-                curr_str = raw_code_lines[i_0]
+            for i in range(len(raw_code_lines)):
+                curr_str = raw_code_lines[i]
                 if i + 1 in keylist.keys():
                     # this case, we have a key.
                     with io.StringIO() as raw_line:
@@ -1205,11 +1574,13 @@
             baseCounter += 1
         return newKey
 
-    def asyfy(self, keyOnly=False):
-        """Generate the list of images described by this object and adjust the length of the transform list."""
+    def asyfy(self, keyOnly = False):
+        """ Generate the list of images described by this object and adjust the length of the
+            transform list
+        """
         super().asyfy()
 
-        # Id --> Transf --> asy-fied --> Transf
+        # Id --> Transf --> asyfied --> Transf
         # Transf should keep the original, raw transformation
         # but for all new drawn objects - assign Id as transform.
 
@@ -1246,8 +1617,8 @@
             else:
                 self.key2imagemap[im.key].append(im)
 
-            
 
+
         for key in keyCount:
             if key not in self.transfKeymap.keys():
                 self.transfKeymap[key] = [identity()] * keyCount[key]
@@ -1258,7 +1629,7 @@
                 # while len(self.transfKeymap[key]) > keyCount[key]:
                     # self.transfKeymap[key].pop()
 
-        # change of basis 
+        # change of basis
         for keylist in self.transfKeymap.values():
             for i in range(len(keylist)):
                 if keylist[i] != identity():
@@ -1272,17 +1643,41 @@
         return self.drawObjects
 
     def __str__(self):
-        """Return a string describing this script"""
+        """ Return a string describing this script """
         retVal = "xasyScript\n\tTransforms:\n"
         for xform in self.transform:
             retVal += "\t" + str(xform) + "\n"
-        retVal += "\tCode Ommitted"
+        retVal += "\tCode Omitted"
         return retVal
 
 
-class DrawObject(Qc.QObject):
-    def __init__(self, drawObject, mainCanvas=None, transform=identity(), btmRightanchor=Qc.QPointF(0, 0),
-                 drawOrder=(-1, -1), pen=None, key=None, parentObj=None, fill=False, keyIndex=0):
+class DrawObject(QtCore.QObject):
+    """
+    Purpose:
+    --------
+        The main Python class to draw an object with the help of PyQt graphical library.
+        Every instance of the class is
+
+
+    Attributes:
+    -----------
+
+    Virtual Methods:
+    ----------------
+
+    Static Methods:
+    ---------------
+
+    Class Methods:
+    --------------
+
+    Object Methods:
+    ---------------
+
+    """
+
+    def __init__(self, drawObject, mainCanvas = None, transform = identity(), btmRightanchor = QtCore.QPointF(0, 0),
+                 drawOrder = (-1, -1), pen = None, key = None, parentObj = None, fill = False, keyIndex = 0):
         super().__init__()
         self.drawObject = drawObject
         self.mainCanvas = mainCanvas
@@ -1302,8 +1697,8 @@
         self.fill = fill
 
     def getInteriorScrTransform(self, transform):
-        """Generates the transform with Interior transform applied beforehand."""
-        if isinstance(transform, Qg.QTransform):
+        """ Generates the transform with Interior transform applied beforehand """
+        if isinstance(transform, QtGui.QTransform):
             transform = asyTransform.fromQTransform(transform)
         return self.transform * transform * self.baseTransform.inverted()
 
@@ -1317,26 +1712,37 @@
 
     def setBoundingBoxPs(self, bbox):
         l, b, r, t = bbox
-        self.explicitBoundingBox = Qc.QRectF(Qc.QPointF(l, b), Qc.QPointF(r, t))
-        # self.explicitBoundingBox = Qc.QRectF(0, 0, 100, 100)
+        self.explicitBoundingBox = QtCore.QRectF(QtCore.QPointF(l, b), QtCore.QPointF(r, t))
+        # self.explicitBoundingBox = QtCore.QRectF(0, 0, 100, 100)
 
     @property
     def boundingBox(self):
         if self.explicitBoundingBox is not None:
-            testBbox = self.explicitBoundingBox
+            tempItem = self.baseTransform.toQTransform().mapRect(self.explicitBoundingBox)
+            testBbox = self.getScreenTransform().toQTransform().mapRect(tempItem)
+        elif isinstance(self.drawObject, QtGui.QPainterPath):
+            tempItem = self.baseTransform.toQTransform().map(self.drawObject)
+            testBbox = self.getScreenTransform().toQTransform().map(tempItem).boundingRect()
         else:
-            if isinstance(self.drawObject, Qg.QImage):
-                testBbox = self.drawObject.rect()
-                testBbox.moveTo(self.btmRightAnchor.toPoint())
-            elif isinstance(self.drawObject, Qg.QPainterPath):
-                testBbox = self.baseTransform.toQTransform().mapRect(self.drawObject.boundingRect())
-            else:
-                raise TypeError('drawObject is not a valid type!')
-        pointList = [self.getScreenTransform().toQTransform().map(point) for point in [
-            testBbox.topLeft(), testBbox.topRight(), testBbox.bottomLeft(), testBbox.bottomRight()
-        ]]
-        return Qg.QPolygonF(pointList).boundingRect()
+            raise TypeError('drawObject is not a valid type!')
 
+        if self.pen is not None:
+            lineWidth = self.pen.width
+            const = lineWidth/2
+            bl = QtCore.QPointF(-const, const)
+            br = QtCore.QPointF(const, const)
+            tl = QtCore.QPointF(-const, -const)
+            tr = QtCore.QPointF(const, -const)
+
+            pointList = [testBbox.topLeft(), testBbox.topRight(), testBbox.bottomLeft(), testBbox.bottomRight()
+            ]
+
+        else:
+            pointList = [testBbox.topLeft(), testBbox.topRight(), testBbox.bottomLeft(), testBbox.bottomRight()
+            ]
+
+        return QtGui.QPolygonF(pointList).boundingRect()
+
     @property
     def localBoundingBox(self):
         testBbox = self.drawObject.rect()
@@ -1345,22 +1751,25 @@
 
     def getScreenTransform(self):
         scrTransf = self.baseTransform.toQTransform().inverted()[0] * self.pTransform.toQTransform()
+        # print(asyTransform.fromQTransform(scrTransf).t)
         return asyTransform.fromQTransform(scrTransf)
 
-    def draw(self, additionalTransformation=None, applyReverse=False, canvas: Qg.QPainter=None, dpi=300):
+    def draw(self, additionalTransformation = None, applyReverse = False, canvas: QtGui.QPainter = None, dpi = 300):
         if canvas is None:
             canvas = self.mainCanvas
         if additionalTransformation is None:
-            additionalTransformation = Qg.QTransform()
-            
+            additionalTransformation = QtGui.QTransform()
+
         assert canvas.isActive()
 
         canvas.save()
         if self.pen:
-            oldPen = Qg.QPen(canvas.pen())
-            canvas.setPen(self.pen.toQPen())
+            oldPen = QtGui.QPen(canvas.pen())
+            localPen = self.pen.toQPen()
+            # localPen.setCosmetic(True)
+            canvas.setPen(localPen) #this fixes the object but not the box
         else:
-            oldPen = Qg.QPen()
+            oldPen = QtGui.QPen()
 
         if not applyReverse:
             canvas.setTransform(additionalTransformation, True)
@@ -1371,11 +1780,9 @@
 
         canvas.setTransform(self.baseTransform.toQTransform().inverted()[0], True)
 
-        if isinstance(self.drawObject, Qg.QImage):
-            canvas.drawImage(self.explicitBoundingBox, self.drawObject)
-        elif isinstance(self.drawObject, xs.SvgObject):
+        if isinstance(self.drawObject, xs.SvgObject):
             threshold = 1.44
-            
+
             if self.cachedDPI is None or self.cachedSvgImg is None \
                or dpi > self.maxDPI*threshold:
                 self.cachedDPI = dpi
@@ -1383,15 +1790,15 @@
                 self.cachedSvgImg = self.drawObject.render(dpi)
 
             canvas.drawImage(self.explicitBoundingBox, self.cachedSvgImg)
-        elif isinstance(self.drawObject, Qs.QSvgRenderer):
+        elif isinstance(self.drawObject, QtSvg.QSvgRenderer):
             self.drawObject.render(canvas, self.explicitBoundingBox)
-        elif isinstance(self.drawObject, Qg.QPainterPath):
+        elif isinstance(self.drawObject, QtGui.QPainterPath):
             path = self.baseTransform.toQTransform().map(self.drawObject)
             if self.fill:
                 if self.pen:
                     brush = self.pen.toQPen().brush()
                 else:
-                    brush = Qg.QBrush()
+                    brush = QtGui.QBrush()
                 canvas.fillPath(path, brush)
             else:
                 canvas.drawPath(path)
@@ -1400,14 +1807,14 @@
             canvas.setPen(oldPen)
         canvas.restore()
 
-    def collide(self, coords, canvasCoordinates=True):
-        # modify these values to grow/shrink the fuzz. 
+    def collide(self, coords, canvasCoordinates = True):
+        # modify these values to grow/shrink the fuzz.
         fuzzTolerance = 1
         marginGrowth = 1
         leftMargin = marginGrowth if self.boundingBox.width() < fuzzTolerance else 0
         topMargin = marginGrowth if self.boundingBox.height() < fuzzTolerance else 0
 
-        newMargin = Qc.QMarginsF(leftMargin, topMargin, leftMargin, topMargin)
+        newMargin = QtCore.QMarginsF(leftMargin, topMargin, leftMargin, topMargin)
         return self.boundingBox.marginsAdded(newMargin).contains(coords)
 
     def getID(self):

Modified: trunk/Build/source/utils/asymptote/GUI/xasyArgs.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/xasyArgs.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/xasyArgs.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,23 +1,32 @@
 #!/usr/bin/env python3
 import argparse
 import xasyVersion
-import PyQt5.QtCore as Qc
+import PyQt5.QtCore as QtCore
 # Add arguments here.
 
 
 def parseArgs(args):
     parser = argparse.ArgumentParser(args)
-    parser.add_argument('-p', '--asypath', help='Custom Asymptote asy executable')
-    parser.add_argument('-v', '--version', help='Version number', action='version',
+    parser.add_argument('-p', '-asypath', '--asypath',
+                        help='Custom path to asy executable')
+    parser.add_argument('-v', '-version', '--version',
+                        help='Version number', action='version',
                         version='xasy v{0}'.format(xasyVersion.xasyVersion))
-    parser.add_argument('-l', '--language', help='language')
-    parser.add_argument('-x', '--mag', help='Magnification. Defaults to 1', default=1, type=float)
-
+    parser.add_argument('-l', '-language', '--language',
+                        help='language')
+    parser.add_argument('-x', '-mag', '--mag',
+                        help='Initial magnification. Defaults to 1',
+                        default=1, type=float)
+    parser.add_argument('-render', '--render',
+                        help='Number of pixels per bp in 3D rendered bitmaps',
+                        default=None, type=float)
     parser.add_argument(
-            'filename', help='Filename to load. If empty, initializes empty xasy canvas.', nargs='?', default=None)
+        'filename',
+        help='Filename to load (if omitted, initialize blank canvas)',
+        nargs='?', default=None)
 
     return parser.parse_args()
 
 
 def getArgs():
-    return parseArgs(Qc.QCoreApplication.arguments())
+    return parseArgs(QtCore.QCoreApplication.arguments())

Modified: trunk/Build/source/utils/asymptote/GUI/xasyBezierInterface.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/xasyBezierInterface.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/xasyBezierInterface.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,16 +1,14 @@
 #!/usr/bin/env python3
 
-import xasy2asy as x2a
-import xasyUtils as xu
 
-import PyQt5.QtCore as Qc
-import PyQt5.QtGui as Qg
-import PyQt5.QtWidgets as Qw
-
+import PyQt5.QtWidgets as QtWidgets
+import PyQt5.QtCore as QtCore
+import PyQt5.QtGui as QtGui
+import xasy2asy as xasy2asy
+import xasyUtils as xasyUtils
 import Widg_editBezier as Web
 
 import InplaceAddObj
-
 import math
 
 class CurrentlySelctedType:
@@ -19,16 +17,16 @@
     ctrlPoint = 1
 
 class InteractiveBezierEditor(InplaceAddObj.InplaceObjProcess):
-    editAccepted = Qc.pyqtSignal()
-    editRejected = Qc.pyqtSignal()
+    editAccepted = QtCore.pyqtSignal()
+    editRejected = QtCore.pyqtSignal()
 
-    def __init__(self, parent: Qc.QObject, obj: x2a.xasyDrawnItem, info: dict={}):
+    def __init__(self, parent: QtCore.QObject, obj: xasy2asy.xasyDrawnItem, info: dict={}):
         super().__init__(parent)
         self.info = info
-        self.asyPathBackup = x2a.asyPath.fromPath(obj.path)
+        self.asyPathBackup = xasy2asy.asyPath.fromPath(obj.path)
         self.asyPath = obj.path
         self.curveMode = self.asyPath.containsCurve
-        assert isinstance(self.asyPath, x2a.asyPath)
+        assert isinstance(self.asyPath, xasy2asy.asyPath)
         self.transf = obj.transfKeymap[obj.transfKey][0]
         self._active = True
 
@@ -47,10 +45,20 @@
         self.inTransformMode = False
 
         self.opt = None
+        self.obj = obj
 
         self.prosectiveNodes = []
         self.prospectiveCtrlPts = []
 
+        #The magnification isn't being set. Here I'm manually setting it to be the square root of the determinant.
+        self.info['magnification'] = math.sqrt(self.transf.xx * self.transf.yy - self.transf.xy * self.transf.yx)
+        self.parent = parent
+        if isinstance(obj,xasy2asy.xasyFilledShape) or isinstance(obj,xasy2asy.xasyShape):
+            parent.ui.btnFill.setChecked(obj.path.fill)
+
+    def swapObjFill(self):
+        self.obj.swapFill() #This may end up being more in the future
+
     def setSelectionBoundaries(self):
         self.nodeSelRects = self.handleNodeSelectionBounds()
 
@@ -66,11 +74,11 @@
                 continue
 
             selEpsilon = 6/self.info['magnification']
-            newRect = Qc.QRect(0, 0, 2 * selEpsilon, 2 * selEpsilon)
+            newRect = QtCore.QRect(0, 0, 2 * selEpsilon, 2 * selEpsilon)
             x, y = self.transf * node
             x = int(round(x))
             y = int(round(y))
-            newRect.moveCenter(Qc.QPoint(x, y))
+            newRect.moveCenter(QtCore.QPoint(x, y))
 
             nodeSelectionBoundaries.append(newRect)
 
@@ -84,8 +92,8 @@
 
             selEpsilon = 6/self.info['magnification']
 
-            newRect = Qc.QRect(0, 0, 2 * selEpsilon, 2 * selEpsilon)
-            newRectb = Qc.QRect(0, 0, 2 * selEpsilon, 2 * selEpsilon)
+            newRect = QtCore.QRect(0, 0, 2 * selEpsilon, 2 * selEpsilon)
+            newRectb = QtCore.QRect(0, 0, 2 * selEpsilon, 2 * selEpsilon)
 
             x, y = self.transf * nodea
             x2, y2 = self.transf * nodeb
@@ -96,18 +104,19 @@
             x2 = int(round(x2))
             y2 = int(round(y2))
 
-            newRect.moveCenter(Qc.QPoint(x, y))
-            newRectb.moveCenter(Qc.QPoint(x2, y2))
+            newRect.moveCenter(QtCore.QPoint(x, y))
+            newRectb.moveCenter(QtCore.QPoint(x2, y2))
 
             ctrlPointSelBoundaries.append((newRect, newRectb))
 
         return ctrlPointSelBoundaries
 
-    def postDrawPreview(self, canvas: Qg.QPainter):
+
+    def postDrawPreview(self, canvas: QtGui.QPainter):
         assert canvas.isActive()
 
-        dashedPen = Qg.QPen(Qc.Qt.DashLine)
-        dashedPen.setWidthF(1/self.info['magnification'])
+        dashedPen = QtGui.QPen(QtCore.Qt.DashLine)
+        dashedPen.setCosmetic(True)
         # draw the base points
         canvas.save()
         canvas.setWorldTransform(self.transf.toQTransform(), True)
@@ -123,27 +132,27 @@
 
         canvas.drawPath(self.asyPath.toQPainterPath())
 
-        nodePen = Qg.QPen(Qg.QColor('blue'))
-        nodePen.setWidthF(1/self.info['magnification'])
+        nodePen = QtGui.QPen(QtGui.QColor('blue'))
+        nodePen.setCosmetic(True)
 
-        ctlPtsPen = Qg.QPen(Qg.QColor(ctrlPtsColor))
-        ctlPtsPen.setWidthF(1/self.info['magnification'])
+        ctlPtsPen = QtGui.QPen(QtGui.QColor(ctrlPtsColor))
+        ctlPtsPen.setCosmetic(True)
 
         for index in range(len(self.asyPath.nodeSet)):
             point = self.asyPath.nodeSet[index]
-            
+
             if point != 'cycle':
-                basePoint = Qc.QPointF(point[0], point[1])
+                basePoint = QtCore.QPointF(point[0], point[1])
                 canvas.setPen(nodePen)
                 canvas.drawEllipse(basePoint, epsilonSize, epsilonSize)
             else:
                 point = self.asyPath.nodeSet[0]
-                basePoint = Qc.QPointF(point[0], point[1])
-            if self.curveMode:   
+                basePoint = QtCore.QPointF(point[0], point[1])
+            if self.curveMode:
                 if index != 0:
                     canvas.setPen(ctlPtsPen)
                     postCtrolSet = self.asyPath.controlSet[index - 1][1]
-                    postCtrlPoint = Qc.QPointF(postCtrolSet[0], postCtrolSet[1])
+                    postCtrlPoint = QtCore.QPointF(postCtrolSet[0], postCtrolSet[1])
                     canvas.drawEllipse(postCtrlPoint, epsilonSize, epsilonSize)
 
                     canvas.setPen(dashedPen)
@@ -152,7 +161,7 @@
                 if index != len(self.asyPath.nodeSet) - 1:
                     canvas.setPen(ctlPtsPen)
                     preCtrlSet = self.asyPath.controlSet[index][0]
-                    preCtrlPoint = Qc.QPointF(preCtrlSet[0], preCtrlSet[1])
+                    preCtrlPoint = QtCore.QPointF(preCtrlSet[0], preCtrlSet[1])
                     canvas.drawEllipse(preCtrlPoint, epsilonSize, epsilonSize)
 
                     canvas.setPen(dashedPen)
@@ -189,7 +198,7 @@
         self.asyPath.setInfo(self.asyPathBackup)
         self.setSelectionBoundaries()
 
-    def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+    def mouseDown(self, pos, info, mouseEvent: QtGui.QMouseEvent=None):
         self.lastSelPoint = pos
         if self.inTransformMode:
             return
@@ -204,13 +213,13 @@
             self.currentSelIndex = self.prospectiveCtrlPts[0]
             self.inTransformMode = True
             self.parentNodeIndex = self.findLinkingNode(*self.currentSelIndex)
-        
+
         if self.inTransformMode:
             parentNode = self.asyPath.nodeSet[self.parentNodeIndex]
 
             # find the offset of each control point to the node
             if not self.curveMode:
-                return 
+                return
 
             preCtrl, postCtrl = self.getPreAndPostCtrlPts(self.parentNodeIndex)
 
@@ -219,20 +228,20 @@
                 self.parentNodeIndex = 0
 
             if preCtrl is not None:
-                self.preCtrlOffset = xu.funcOnList(
+                self.preCtrlOffset = xasyUtils.funcOnList(
                     preCtrl, parentNode, lambda a, b: a - b)
             else:
                 self.preCtrlOffset = None
 
             if postCtrl is not None:
-                self.postCtrlOffset = xu.funcOnList(
+                self.postCtrlOffset = xasyUtils.funcOnList(
                     postCtrl, parentNode, lambda a, b: a - b)
             else:
                 self.postCtrlOffset = None
 
-    def mouseMove(self, pos, event: Qg.QMouseEvent):
+    def mouseMove(self, pos, event: QtGui.QMouseEvent):
         if self.currentSelMode is None and not self.inTransformMode:
-            # in this case, search for prosective nodes. 
+            # in this case, search for prosective nodes.
             prospectiveNodes = []
             prospectiveCtrlpts = []
 
@@ -262,8 +271,7 @@
 
         if self.inTransformMode:
             index, subindex = self.currentSelIndex
-            deltaPos = pos - self.lastSelPoint
-            newNode = (pos.x(), pos.y())
+            newNode = (self.transf.inverted().toQTransform().map(pos.x(), pos.y()))
             if self.currentSelMode == CurrentlySelctedType.node:
                 # static throughout the moving
                 if self.asyPath.nodeSet[index] == 'cycle':
@@ -270,25 +278,25 @@
                     return
 
                 self.asyPath.setNode(index, newNode)
-                # if also move node: 
+                # if also move node:
 
                 if self.curveMode:
                     checkPre, checkPost = self.getPreAndPostCtrlPts(index)
 
-                    if 1 == 1: # TODO: Replace this with an option to also move control pts. 
+                    if 1 == 1: # TODO: Replace this with an option to also move control pts.
                         if checkPre is not None:
-                            self.asyPath.controlSet[index - 1][1] = xu.funcOnList(
+                            self.asyPath.controlSet[index - 1][1] = xasyUtils.funcOnList(
                                 newNode, self.preCtrlOffset, lambda a, b: a + b
                             )
                         if checkPost is not None:
-                            self.asyPath.controlSet[index][0] = xu.funcOnList(
+                            self.asyPath.controlSet[index][0] = xasyUtils.funcOnList(
                                 newNode, self.postCtrlOffset, lambda a, b: a + b
                             )
 
                     if self.info['autoRecompute']:
                         self.quickRecalculateCtrls()
-                        
 
+
             elif self.currentSelMode == CurrentlySelctedType.ctrlPoint and self.curveMode:
                 self.asyPath.controlSet[index][subindex] = newNode
                 parentNode = self.asyPath.nodeSet[self.parentNodeIndex]
@@ -302,46 +310,46 @@
                 if self.parentNodeIndex == 0 and self.asyPath.nodeSet[-1] == 'cycle':
                     isCycle = True
 
-                rawNewNode = xu.funcOnList(newNode, parentNode, lambda a, b: a - b)
+                rawNewNode = xasyUtils.funcOnList(newNode, parentNode, lambda a, b: a - b)
                 rawAngle = math.atan2(rawNewNode[1], rawNewNode[0])
-                newNorm = xu.twonorm(rawNewNode)
+                newNorm = xasyUtils.twonorm(rawNewNode)
 
 
                 if self.info['editBezierlockMode'] >= Web.LockMode.angleLock:
-                    otherIndex = 1 - subindex       # 1 if 0, 0 otherwise. 
+                    otherIndex = 1 - subindex       # 1 if 0, 0 otherwise.
                     if otherIndex == 0:
                         if index < (len(self.asyPath.controlSet) - 1) or isCycle:
                             newIndex = 0 if isCycle else index + 1
 
-                            oldOtherCtrlPnt = xu.funcOnList(
+                            oldOtherCtrlPnt = xasyUtils.funcOnList(
                                 self.asyPath.controlSet[newIndex][0], parentNode, lambda a, b: a - b)
-                        
+
                             if self.info['editBezierlockMode'] >= Web.LockMode.angleAndScaleLock:
                                 rawNorm = newNorm
                             else:
-                                rawNorm = xu.twonorm(oldOtherCtrlPnt)
+                                rawNorm = xasyUtils.twonorm(oldOtherCtrlPnt)
 
-                            newPnt = (rawNorm * math.cos(rawAngle + math.pi), 
+                            newPnt = (rawNorm * math.cos(rawAngle + math.pi),
                                 rawNorm * math.sin(rawAngle + math.pi))
-                                
-                            self.asyPath.controlSet[newIndex][0] = xu.funcOnList(
+
+                            self.asyPath.controlSet[newIndex][0] = xasyUtils.funcOnList(
                                 newPnt, parentNode, lambda a, b: a + b)
                     else:
                         if index > 0 or isCycle:
                             newIndex = -1 if isCycle else index - 1
-                            oldOtherCtrlPnt = xu.funcOnList(
+                            oldOtherCtrlPnt = xasyUtils.funcOnList(
                                 self.asyPath.controlSet[newIndex][1], parentNode, lambda a, b: a - b)
 
                             if self.info['editBezierlockMode'] >= Web.LockMode.angleAndScaleLock:
                                 rawNorm = newNorm
                             else:
-                                rawNorm = xu.twonorm(oldOtherCtrlPnt)
+                                rawNorm = xasyUtils.twonorm(oldOtherCtrlPnt)
 
                             newPnt = (rawNorm * math.cos(rawAngle + math.pi),
                                       rawNorm * math.sin(rawAngle + math.pi))
-                            self.asyPath.controlSet[newIndex][1] = xu.funcOnList(
+                            self.asyPath.controlSet[newIndex][1] = xasyUtils.funcOnList(
                                 newPnt, parentNode, lambda a, b: a + b)
-        
+
     def recalculateCtrls(self):
         self.quickRecalculateCtrls()
         self.setSelectionBoundaries()
@@ -356,7 +364,7 @@
             self.currentSelMode = None
 
             self.setSelectionBoundaries()
-            
+
     def forceFinalize(self):
         self.objectUpdated.emit()
 

Modified: trunk/Build/source/utils/asymptote/GUI/xasyFile.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/xasyFile.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/xasyFile.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 ###########################################################################
 #
-# xasyFile implements the loading, parsing, and saving of an xasy file.
+# xasyFile implements the loading, parsing, and saving of an asy file.
 #
 #
 # Author: Orest Shardt
@@ -10,7 +10,7 @@
 ############################################################################
 
 from string import *
-import xasy2asy as x2a
+import xasy2asy as xasy2asy
 import io
 import re
 
@@ -28,7 +28,7 @@
 def extractTransform(line):
     """Returns key and the new transform."""
     # see https://regex101.com/r/6DqkRJ/4 for info
-    mapString = x2a.xasyItem.mapString
+    mapString = xasy2asy.xasyItem.mapString
     testMatch = re.match(
         r'^{0:s}\s*\(\s*\"([^\"]+)\"\s*,\s*\(([-\d, .]+)\)\s*\)'.format(mapString), line.strip())
     if testMatch is None:
@@ -37,7 +37,7 @@
             return None
         else:
             key = mapOnlyMatch.group(1)
-            return key, x2a.identity()
+            return key, xasy2asy.identity()
     else:
         key = testMatch.group(1)
         rawStr = testMatch.group(2)
@@ -46,7 +46,7 @@
         if len(rawStrArray) != 6:
             return None
         transf = [float(val.strip()) for val in rawStrArray]
-        return key, x2a.asyTransform(transf)
+        return key, xasy2asy.asyTransform(transf)
 
 
 def extractTransformsFromFile(fileStr):
@@ -62,22 +62,58 @@
                 if key not in transfDict.keys():
                     transfDict[key] = []
                 transfDict[key].append(transf)
+        final_str = rawCode.getvalue()
+    return final_str, transfDict
 
-                # see https://regex101.com/r/RgeBVc/2 for regex
+def xasy2asyCode(xasyItems, asy2psmap):
+    asyCode = ''
+    for item in xasyItems:
+        asyCode += item.getTransformCode(asy2psmap)
+    for item in xasyItems:
+        asyCode += item.getObjectCode(asy2psmap)
 
-                testNum = re.match(r'^x(\d+)($|:.*$)', key)
-                if testNum is not None:
-                    maxItemCount = max(maxItemCount, int(testNum.group(1)))
-        final_str = rawCode.getvalue()
-    return final_str, transfDict, maxItemCount
+    asyCode += 'size('+str(asy2psmap*xasy2asy.yflip())+'); '+ xasy2asy.xasyItem.resizeComment+'\n'
+    return asyCode
 
-
 def saveFile(file, xasyItems, asy2psmap):
     """Write a list of xasyItems to a file"""
-    for item in xasyItems:
-        file.write(item.getTransformCode(asy2psmap))
+    file.write(xasy2asyCode(xasyItems, asy2psmap))
 
+def xasyToDict(file, xasyItems, asy2psmap):
+    fileItems = []
+    asyItems = []
     for item in xasyItems:
-        file.write(item.getObjectCode(asy2psmap))
+        if isinstance(item, xasy2asy.xasyScript):
+            # reusing xasyFile code for objects
+            # imported from asy script.
+            asyItems.append({'item':item, 'type': 'xasyScript'})
 
-    file.write('size('+str(asy2psmap*x2a.yflip())+'); '+ x2a.xasyItem.resizeComment+'\n')
+        elif isinstance(item, xasy2asy.xasyText):
+            # At the moment xasyText cannot be edited
+            # so we treat it the same as xasyScript
+            penData = {'color': item.pen.color, 'width': item.pen.width, 'options': item.pen.options}
+            fileItems.append({'type': 'xasyText',
+                    'align': item.label.align,
+                    'location': item.label.location,
+                    'fontSize': item.label.fontSize,
+                    'text': item.label.text,
+                    'transform': item.transfKeymap[item.transfKey][0].t,
+                    'transfKey': item.transfKey,
+                    'pen': penData
+                    })
+
+        elif isinstance(item, xasy2asy.xasyShape):
+            penData = {'color': item.pen.color, 'width': item.pen.width, 'options': item.pen.options}
+            fileItems.append({'type': 'xasyShape',
+                    'nodes': item.path.nodeSet,
+                    'links': item.path.linkSet,
+                    'transform': item.transfKeymap[item.transfKey][0].t,
+                    'transfKey': item.transfKey,
+                    'pen': penData
+                    })
+
+        else:
+            # DEBUGGING PURPOSES ONLY
+            print(type(item))
+
+    return {'objects': fileItems, 'asy2psmap': asy2psmap.t}, asyItems

Modified: trunk/Build/source/utils/asymptote/GUI/xasyOptions.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/xasyOptions.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/xasyOptions.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -10,26 +10,14 @@
 #
 ###########################################################################
 
-import json
 import sys
 import io
 import os
 import platform
 import shutil
-
 import configs
+import cson
 
-try:
-    import cson
-except ModuleNotFoundError:
-    cson = None
-
-try:
-    pass
-#     import yaml
-except ModuleNotFoundError:
-    yaml = None
-
 class xasyOptions:
     def defaultOptions(self):
         if self._defaultOptions is None:
@@ -49,12 +37,12 @@
 
         for key in self.options[settingsName]:
             self.options[key] = self.options[settingsName][key]
-    
-    
+
+
     def settingsFileLocation(self):
         folder = os.path.expanduser("~/.asy/")
 
-        searchOrder = ['.cson', '.yaml', '.json', '']
+        searchOrder = ['.cson', '']
 
         searchIndex = 0
         found = False
@@ -64,7 +52,7 @@
             if os.path.isfile(currentFile):
                 found = True
             searchIndex += 1
-        
+
         if found:
             return os.path.normcase(currentFile)
         else:
@@ -79,7 +67,6 @@
 
         self.options = self.defaultOptions()
         self.load()
-        self.overrideSettings()
 
     def __getitem__(self, item):
         return self.options[item]
@@ -100,16 +87,7 @@
         f = io.open(fileName, 'r')
         try:
             ext = os.path.splitext(fileName)[1]
-            if ext == '.cson':
-                if cson is None:
-                    raise ModuleNotFoundError
-                newOptions = cson.loads(f.read())
-            elif ext in {'.yml', '.yaml'}:
-                if yaml is None:
-                    raise ModuleNotFoundError
-                newOptions = yaml.load(f)
-            else:
-                newOptions = json.loads(f.read())
+            newOptions = cson.loads(f.read())
         except (IOError, ModuleNotFoundError):
             self.setDefaults()
         else:
@@ -121,6 +99,7 @@
             self.options = newOptions
         finally:
             f.close()
+        self.overrideSettings()
 
     def setDefaults(self):
         self.options = self.defaultOptions()
@@ -130,8 +109,8 @@
         folder = os.path.expanduser("~/.asy/")
         defaultPath = os.path.join(folder, self.configName + '.cson')
         shutil.copy2(self._defaultOptLocation, defaultPath)
-        
 
+
 # TODO: Figure out how to merge this back.
 """
 def setAsyPathFromWindowsRegistry():
@@ -150,7 +129,73 @@
             registry.CloseKey(key)
 """
 
+class xasyOpenRecent:
+    def __init__(self, configName, defaultConfigLocation):
+        self.configName = configName
+        self.fileName = self.settingsFileLocation()
+        if not os.path.isfile(self.fileName):
+            f = io.open(self.fileName, 'w')
+            f.write('')
+            f.close()
 
+    def settingsFileLocation(self):
+        folder = os.path.expanduser("~/.asy/")
+
+        currentFile = os.path.join(folder, self.configName + '.txt')
+        return os.path.normcase(currentFile)
+
+    def insert(self, path):
+        if not os.path.exists(self.fileName):
+            # make folder
+            thedir = os.path.dirname(self.fileName)
+            if not os.path.exists(thedir):
+                os.makedirs(thedir)
+            if not os.path.isdir(thedir):
+                raise Exception("Configuration folder path does not point to a folder")
+
+        f = io.open(self.fileName, 'r')
+        lines = f.readlines()
+        f.close()
+
+        f = io.open(self.fileName, 'w')
+        f.write(path.strip() + '\n')
+        for line in lines:
+            if line.strip() != path.strip():
+                f.write(line.strip() + '\n')
+        f.close()
+
+    @property
+    def pathList(self):
+        self.findingPaths=True
+        return self.findPath()
+
+    def findPath(self):
+        f = io.open(self.fileName, 'r')
+        paths = [path.strip() for path in f.readlines()]
+        f.close()
+
+        trueFiles = list(map(lambda path: os.path.isfile(os.path.expanduser(path)), paths))
+        if all(trueFiles):
+            return paths
+        else:
+            if self.findingPaths == False:
+                raise RecursionError
+            self.findingPaths = False
+            self.removeNotFound(list(trueFiles), paths)
+            return self.findPath()
+
+    def removeNotFound(self, trueFiles, paths):
+        f = io.open(self.fileName, 'w')
+        for index, path in enumerate(paths):
+            if trueFiles[index] == True:
+                f.write(path + '\n')
+        f.close()
+
+    def clear(self):
+        f = io.open(self.fileName, 'w')
+        f.write('')
+        f.close()
+
 class BasicConfigs:
     _configPath = list(configs.__path__)[0]
     defaultOpt = xasyOptions(
@@ -157,3 +202,4 @@
         'xasyconfig', os.path.join(_configPath, 'xasyconfig.cson'))
     keymaps = xasyOptions('xasykeymap', os.path.join(
         _configPath, 'xasykeymap.cson'))
+    openRecent = xasyOpenRecent('xasyrecents', os.path.join( _configPath, "xasyrecent.txt"))

Modified: trunk/Build/source/utils/asymptote/GUI/xasyStrings.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/xasyStrings.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/xasyStrings.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -8,12 +8,12 @@
     def __init__(self, lang=None):
         s = self
         if lang is None:
-            _ = lambda x:  x 
+            _ = lambda x:  x
         else:
             lng = gettext.translation('base', localedir='GUI/locale', languages=[lang])
             lng.install()
             _ = lng.gettext
-            
+
         s.rotate = _('Rotate')
         s.scale = _('Scale')
         s.translate = _('Translate')

Modified: trunk/Build/source/utils/asymptote/GUI/xasySvg.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/xasySvg.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/xasySvg.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 
-import PyQt5.QtGui as Qg
-import PyQt5.QtWidgets as Qw
+import PyQt5.QtGui as QtGui
+import PyQt5.QtWidgets as QtWidgets
 import io
 import subprocess
 import sys
@@ -10,13 +10,13 @@
     def __init__(self, file: str):
         self.file=file
 
-    def render(self, dpi:int) -> Qg.QImage:
+    def render(self, dpi:int) -> QtGui.QImage:
         try:
             rawDataProc = subprocess.Popen(['rsvg-convert', '--dpi-x', str(dpi),
                                             '--dpi-y', str(dpi), self.file],
                                            stdout=subprocess.PIPE)
         except:
-            Qw.QMessageBox.about(None,'rsvg-convert missing','Please install rsvg-convert version >= 2.40 in your path.')
+            QtWidgets.QMessageBox.about(None,'rsvg-convert missing','Please install rsvg-convert version >= 2.40 in your path.')
             sys.exit(-1)
 
-        return Qg.QImage.fromData(rawDataProc.stdout.read(), 'PNG')
+        return QtGui.QImage.fromData(rawDataProc.stdout.read(), 'PNG')

Modified: trunk/Build/source/utils/asymptote/GUI/xasyTransform.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/xasyTransform.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/xasyTransform.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,8 +1,8 @@
 #!/usr/bin/env python3
-import xasy2asy as x2a
-import PyQt5.QtGui as Qg
-import PyQt5.QtCore as Qc
-import numpy as np
+import xasy2asy as xasy2asy
+import PyQt5.QtGui as QtGui
+import PyQt5.QtCore as QtCore
+import numpy as numpy
 import math
 
 
@@ -9,16 +9,16 @@
 class xasyTransform:
     @classmethod
     def makeRotTransform(cls, theta, origin):
-        if isinstance(origin, Qc.QPointF) or isinstance(origin, Qc.QPoint):
+        if isinstance(origin, QtCore.QPointF) or isinstance(origin, QtCore.QPoint):
             origin = (origin.x(), origin.y())
         rotMat = (math.cos(theta), -math.sin(theta), math.sin(theta), math.cos(theta))
-        shift = x2a.asyTransform((0, 0, 1 - rotMat[0], -rotMat[1], -rotMat[2], 1 - rotMat[3])) * origin
-        return x2a.asyTransform((shift[0], shift[1], rotMat[0], rotMat[1], rotMat[2], rotMat[3]))
+        shift = xasy2asy.asyTransform((0, 0, 1 - rotMat[0], -rotMat[1], -rotMat[2], 1 - rotMat[3])) * origin
+        return xasy2asy.asyTransform((shift[0], shift[1], rotMat[0], rotMat[1], rotMat[2], rotMat[3]))
 
     @classmethod
     def makeScaleTransform(cls, sx, sy, origin):
-        if isinstance(origin, Qc.QPointF) or isinstance(origin, Qc.QPoint):
+        if isinstance(origin, QtCore.QPointF) or isinstance(origin, QtCore.QPoint):
             origin = (origin.x(), origin.y())
-        shiftMat = x2a.asyTransform((0, 0, 1 - sx, 0, 0, 1 - sy)) * origin
-        return x2a.asyTransform((shiftMat[0], shiftMat[1], sx, 0, 0, sy))
+        shiftMat = xasy2asy.asyTransform((0, 0, 1 - sx, 0, 0, 1 - sy)) * origin
+        return xasy2asy.asyTransform((shiftMat[0], shiftMat[1], sx, 0, 0, sy))
 

Modified: trunk/Build/source/utils/asymptote/GUI/xasyUtils.py
===================================================================
--- trunk/Build/source/utils/asymptote/GUI/xasyUtils.py	2022-01-08 02:33:28 UTC (rev 61531)
+++ trunk/Build/source/utils/asymptote/GUI/xasyUtils.py	2022-01-08 18:39:01 UTC (rev 61532)
@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 
 import re
-import typing as ty
+import typing as typing
 import math
 import itertools
 
@@ -15,12 +15,12 @@
     except ValueError:
         return None
 
-def funcOnList(list1: ty.Union[ty.List, ty.Tuple], list2: ty.Union[ty.List, ty.Tuple], func: ty.Callable) -> tuple:
-    """Returns [f(x[i], y[i]) : i in 1, ..., n - 1] in order with f as func 
+def funcOnList(list1: typing.Union[typing.List, typing.Tuple], list2: typing.Union[typing.List, typing.Tuple], func: typing.Callable) -> tuple:
+    """Returns [f(x[i], y[i]) : i in 1, ..., n - 1] in order with f as func
     and x and y as list1 and 2. """
 
     assert len(list1) == len(list2)
-    return tuple([func(list1[i], list2[i]) for i in range(len(list1))]) 
+    return tuple([func(list1[i], list2[i]) for i in range(len(list1))])
 
 
 def listize(str, typ, delim='()') -> list:
@@ -39,7 +39,7 @@
             final_list.append(typ(elem.strip()))
     return final_list
 
-def twonorm(vec: ty.Iterable[ty.Union[float, int]]) -> float:
+def twonorm(vec: typing.Iterable[typing.Union[float, int]]) -> float:
     rawSquared = sum(map(lambda x: x*x, vec))
     return math.sqrt(rawSquared)
 

Added: trunk/Build/source/utils/asymptote/LspCpp/LICENSE
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LICENSE	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LICENSE	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 kuafuwang
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Cancellation.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Cancellation.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Cancellation.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,23 @@
+#pragma once
+#include <functional>
+#include "lsRequestId.h"
+#include <LibLsp/JsonRpc/NotificationInMessage.h>
+using CancelMonitor = std::function<int()>;
+namespace Cancellation
+{
+
+  struct Params {
+	  /**
+	   * The request id to cancel.
+	   */
+	  lsRequestId id;
+  	
+	  MAKE_SWAP_METHOD(Cancellation::Params, id);
+  };
+
+};
+MAKE_REFLECT_STRUCT(Cancellation::Params, id);
+
+DEFINE_NOTIFICATION_TYPE(Notify_Cancellation, Cancellation::Params,"$/cancelRequest");
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Cancellation.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Condition.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Condition.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Condition.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,48 @@
+#pragma once
+#include <condition_variable>
+template <class T>
+class Condition
+{
+public:
+
+	std::mutex m_mutex;
+	std::condition_variable   m_condition;
+	~Condition() {
+		m_condition.notify_all();
+	}
+	void notify(std::unique_ptr<T> data) noexcept
+	{
+		{
+			std::lock_guard<std::mutex> eventLock(m_mutex);
+			any.swap(data);
+		}
+		// wake up one waiter
+		m_condition.notify_one();
+	};
+
+	
+	std::unique_ptr<T> wait(unsigned timeout=0)
+	{
+		std::unique_lock<std::mutex> ul(m_mutex);
+		if (!timeout) {
+			m_condition.wait(ul,[&]() {
+					if (!any)
+						return false;
+					return true;
+			});
+		}
+		else{
+			if(!any){
+				std::cv_status status = m_condition.wait_for(ul, std::chrono::milliseconds(timeout));
+				if (status == std::cv_status::timeout)
+				{
+					return {};
+				}
+			}
+		}
+		return std::unique_ptr<T>(any.release());
+		
+	}
+private:
+	std::unique_ptr<T> any;
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Condition.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Context.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Context.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Context.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,35 @@
+//===--- Context.cpp ---------------------------------------------*- C++-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "Context.h"
+#include <cassert>
+
+namespace lsp {
+
+
+Context Context::empty() { return Context(/*dataPtr=*/nullptr); }
+
+Context::Context(std::shared_ptr<const Data> DataPtr)
+    : dataPtr(std::move(DataPtr)) {}
+
+Context Context::clone() const { return Context(dataPtr); }
+
+static Context &currentContext() {
+  static thread_local auto c = Context::empty();
+  return c;
+}
+
+const Context &Context::current() { return currentContext(); }
+
+Context Context::swapCurrent(Context Replacement) {
+  std::swap(Replacement, currentContext());
+  return Replacement;
+}
+
+
+} // lsp clang


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Context.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Context.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Context.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Context.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,216 @@
+//===--- Context.h - Mechanism for passing implicit data --------*- C++-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Context for storing and retrieving implicit data. Useful for passing implicit
+// parameters on a per-request basis.
+//
+//===----------------------------------------------------------------------===//
+
+#pragma once
+
+#include <memory>
+#include <type_traits>
+
+namespace lsp {
+
+
+/// Values in a Context are indexed by typed keys.
+/// Key<T> serves two purposes:
+///   - it provides a lookup key for the context (each Key is unique),
+///   - it makes lookup type-safe: a Key<T> can only map to a T (or nothing).
+///
+/// Example:
+///    Key<int> RequestID;
+///    Key<int> Version;
+///
+///    Context Ctx = Context::empty().derive(RequestID, 10).derive(Version, 3);
+///    assert(*Ctx.get(RequestID) == 10);
+///    assert(*Ctx.get(Version) == 3);
+///
+/// Keys are typically used across multiple functions, so most of the time you
+/// would want to make them static class members or global variables.
+template <class Type> class Key {
+public:
+  static_assert(!std::is_reference<Type>::value,
+                "Reference arguments to Key<> are not allowed");
+
+  constexpr Key() = default;
+
+  Key(Key const &) = delete;
+  Key &operator=(Key const &) = delete;
+  Key(Key &&) = delete;
+  Key &operator=(Key &&) = delete;
+};
+
+/// A context is an immutable container for per-request data that must be
+/// propagated through layers that don't care about it. An example is a request
+/// ID that we may want to use when logging.
+///
+/// Conceptually, a context is a heterogeneous map<Key<T>, T>. Each key has
+/// an associated value type, which allows the map to be typesafe.
+///
+/// There is an "ambient" context for each thread, Context::current().
+/// Most functions should read from this, and use WithContextValue or
+/// WithContext to extend or replace the context within a block scope.
+/// Only code dealing with threads and extension points should need to use
+/// other Context objects.
+///
+/// You can't add data to an existing context, instead you create a new
+/// immutable context derived from it with extra data added. When you retrieve
+/// data, the context will walk up the parent chain until the key is found.
+class Context {
+public:
+  /// Returns an empty root context that contains no data.
+  static Context empty();
+  /// Returns the context for the current thread, creating it if needed.
+  static const Context &current();
+  // Sets the current() context to Replacement, and returns the old context.
+  // Prefer to use WithContext or WithContextValue to do this safely.
+  static Context swapCurrent(Context Replacement);
+
+private:
+  struct Data;
+  Context(std::shared_ptr<const Data> DataPtr);
+
+public:
+  /// Same as Context::empty(), please use Context::empty() instead.
+  Context() = default;
+
+  /// Copy operations for this class are deleted, use an explicit clone() method
+  /// when you need a copy of the context instead.
+  Context(Context const &) = delete;
+  Context &operator=(const Context &) = delete;
+
+  Context(Context &&) = default;
+  Context &operator=(Context &&) = default;
+
+  /// Get data stored for a typed \p Key. If values are not found
+  /// \returns Pointer to the data associated with \p Key. If no data is
+  /// specified for \p Key, return null.
+  template <class Type> const Type *get(const Key<Type> &Key) const {
+    for (const Data *DataPtr = this->dataPtr.get(); DataPtr != nullptr;
+         DataPtr = DataPtr->parent.get()) {
+      if (DataPtr->KeyPtr == &Key)
+        return static_cast<const Type *>(DataPtr->value->getValuePtr());
+    }
+    return nullptr;
+  }
+
+  /// A helper to get a reference to a \p Key that must exist in the map.
+  /// Must not be called for keys that are not in the map.
+  template <class Type> const Type &getExisting(const Key<Type> &Key) const {
+    auto Val = get(Key);
+    assert(Val && "Key does not exist");
+    return *Val;
+  }
+
+  /// Derives a child context
+  /// It is safe to move or destroy a parent context after calling derive().
+  /// The child will keep its parent alive, and its data remains accessible.
+  template <class Type>
+  Context derive(const Key<Type> &Key,
+                 typename std::decay<Type>::type Value) const & {
+    return Context(std::make_shared<Data>(
+        Data{/*parent=*/dataPtr, &Key,
+             std::make_unique<TypedAnyStorage<typename std::decay<Type>::type>>(
+                 std::move(Value))}));
+  }
+
+  template <class Type>
+  Context
+  derive(const Key<Type> &Key,
+         typename std::decay<Type>::type Value) && /* takes ownership */ {
+    return Context(std::make_shared<Data>(
+        Data{/*parent=*/std::move(dataPtr), &Key,
+             std::make_unique<TypedAnyStorage<typename std::decay<Type>::type>>(
+                 std::move(Value))}));
+  }
+
+  /// Derives a child context, using an anonymous key.
+  /// Intended for objects stored only for their destructor's side-effect.
+  template <class Type> Context derive(Type &&Value) const & {
+    static Key<typename std::decay<Type>::type> Private;
+    return derive(Private, std::forward<Type>(Value));
+  }
+
+  template <class Type> Context derive(Type &&Value) && {
+    static Key<typename std::decay<Type>::type> Private;
+    return std::move(*this).derive(Private, std::forward<Type>(Value));
+  }
+
+  /// Clone this context object.
+  Context clone() const;
+
+private:
+  class AnyStorage {
+  public:
+    virtual ~AnyStorage() = default;
+    virtual void *getValuePtr() = 0;
+  };
+
+  template <class T> class TypedAnyStorage : public Context::AnyStorage {
+    static_assert(std::is_same<typename std::decay<T>::type, T>::value,
+                  "Argument to TypedAnyStorage must be decayed");
+
+  public:
+    TypedAnyStorage(T &&Value) : value(std::move(Value)) {}
+
+    void *getValuePtr() override { return &value; }
+
+  private:
+    T value;
+  };
+
+  struct Data {
+    // We need to make sure parent outlives the value, so the order of members
+    // is important. We do that to allow classes stored in Context's child
+    // layers to store references to the data in the parent layers.
+    std::shared_ptr<const Data> parent;
+    const void *KeyPtr;
+    std::unique_ptr<AnyStorage> value;
+  };
+
+  std::shared_ptr<const Data> dataPtr;
+};
+
+/// WithContext replaces Context::current() with a provided scope.
+/// When the WithContext is destroyed, the original scope is restored.
+/// For extending the current context with new value, prefer WithContextValue.
+class  WithContext {
+public:
+  WithContext(Context C) : restore(Context::swapCurrent(std::move(C))) {}
+  ~WithContext() { Context::swapCurrent(std::move(restore)); }
+  WithContext(const WithContext &) = delete;
+  WithContext &operator=(const WithContext &) = delete;
+  WithContext(WithContext &&) = delete;
+  WithContext &operator=(WithContext &&) = delete;
+
+private:
+  Context restore;
+};
+
+/// WithContextValue extends Context::current() with a single value.
+/// When the WithContextValue is destroyed, the original scope is restored.
+class  WithContextValue {
+public:
+  template <typename T>
+  WithContextValue(const Key<T> &K, typename std::decay<T>::type V)
+      : restore(Context::current().derive(K, std::move(V))) {}
+
+  // Anonymous values can be used for the destructor side-effect.
+  template <typename T>
+  WithContextValue(T &&V)
+      : restore(Context::current().derive(std::forward<T>(V))) {}
+
+private:
+  WithContext restore;
+};
+
+
+} // namespace lsp
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Context.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Endpoint.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Endpoint.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Endpoint.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,46 @@
+#include "Endpoint.h"
+#include "message.h"
+
+
+bool GenericEndpoint::notify(std::unique_ptr<LspMessage> msg)
+{
+	auto findIt = method2notification.find(msg->GetMethodType());
+
+	if (findIt != method2notification.end())
+	{
+		return  findIt->second(std::move(msg));
+	}
+	std::string info = "can't find method2notification for notification:\n" + msg->ToJson() + "\n";
+	log.log(lsp::Log::Level::SEVERE, info);
+	return false;
+}
+
+bool GenericEndpoint::onResponse(const std::string& method, std::unique_ptr<LspMessage>msg)
+{
+	auto findIt = method2response.find(method);
+
+	if (findIt != method2response.end())
+	{
+		return  findIt->second(std::move(msg));
+	}
+	
+	std::string info = "can't find method2response for response:\n" + msg->ToJson() + "\n";
+	log.log(lsp::Log::Level::SEVERE, info);
+	
+	return false;
+}
+
+
+
+bool GenericEndpoint::onRequest(std::unique_ptr<LspMessage> request)
+{
+	auto findIt = method2request.find(request->GetMethodType());
+
+	if (findIt != method2request.end())
+	{
+		return  findIt->second(std::move(request));
+	}
+	std::string info = "can't find method2request for request:\n" + request->ToJson() + "\n";
+	log.log(lsp::Log::Level::SEVERE, info);
+	return false;
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Endpoint.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Endpoint.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Endpoint.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Endpoint.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,53 @@
+#pragma once
+#include <map>
+#include <functional>
+#include <memory>
+#include "MessageIssue.h"
+struct LspMessage;
+struct NotificationInMessage;
+struct lsBaseOutMessage;
+struct  RequestInMessage;
+
+using GenericResponseHandler = std::function< bool(std::unique_ptr<LspMessage>) >;
+using GenericRequestHandler = std::function< bool(std::unique_ptr<LspMessage>) >;
+using GenericNotificationHandler = std::function< bool(std::unique_ptr<LspMessage>) >;
+
+class Endpoint
+{
+public:
+	virtual  ~Endpoint() = default;
+	virtual  bool onRequest(std::unique_ptr<LspMessage>) = 0;
+	virtual  bool notify(std::unique_ptr<LspMessage>) = 0;
+	
+	virtual  bool onResponse(const std::string&, std::unique_ptr<LspMessage>) = 0;
+	virtual  void registerRequestHandler(const std::string&, GenericResponseHandler ) = 0;
+	virtual  void registerNotifyHandler(const std::string&,  GenericNotificationHandler ) = 0;
+};
+
+class GenericEndpoint :public Endpoint
+{
+
+public:
+	GenericEndpoint(lsp::Log& l):log(l){}
+	bool notify(std::unique_ptr<LspMessage>) override;
+	bool onResponse(const std::string&, std::unique_ptr<LspMessage>) override;
+
+	bool onRequest(std::unique_ptr<LspMessage>) override;
+	std::map< std::string, GenericRequestHandler > method2request;
+	std::map< std::string, GenericResponseHandler  > method2response;
+	std::map< std::string, GenericNotificationHandler  > method2notification;
+	
+	  void registerRequestHandler(const std::string& method, GenericResponseHandler cb) override
+	{
+		  method2request[method] = cb;
+	}
+
+	void registerNotifyHandler(const std::string& method, GenericNotificationHandler cb) override
+	  {
+		method2notification[method] = cb;
+	  }
+	lsp::Log& log;
+
+
+
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/Endpoint.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/GCThreadContext.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/GCThreadContext.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/GCThreadContext.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,17 @@
+#include "GCThreadContext.h"
+#include <iostream>
+
+GCThreadContext::GCThreadContext()
+{
+#ifdef USEGC
+    GC_get_stack_base(&gsb);
+    GC_register_my_thread(&gsb);
+#endif
+}
+
+GCThreadContext::~GCThreadContext()
+{
+#ifdef USEGC
+    GC_unregister_my_thread();
+#endif
+}
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/GCThreadContext.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/GCThreadContext.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/GCThreadContext.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/GCThreadContext.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,19 @@
+#pragma once
+
+#if defined(USEGC)
+#define GC_THREADS
+#include <gc.h>
+#endif
+
+class GCThreadContext
+{
+public:
+    GCThreadContext();
+    ~GCThreadContext();
+
+private:
+#if defined(USEGC)
+    GC_stack_base gsb;
+#endif
+
+};
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/GCThreadContext.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageIssue.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageIssue.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageIssue.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,182 @@
+#pragma once
+#include <string>
+#include <functional>
+#include <vector>
+namespace lsp
+{
+	class Log
+	{
+	public:
+		virtual ~Log() = default;
+
+		enum class Level
+		{
+			/**
+			  * OFF is a special level that can be used to turn off logging.
+
+			  */
+			OFF = 1,
+
+			/**
+			 * SEVERE is a message level indicating a serious failure.
+			 * <p>
+			 * In general SEVERE messages should describe events that are
+			 * of considerable importance and which will prevent normal
+			 * program execution.   They should be reasonably intelligible
+			 * to end users and to system administrators.
+
+			 */
+			 SEVERE = 2,
+
+			 /**
+			  * WARNING is a message level indicating a potential problem.
+			  * <p>
+			  * In general WARNING messages should describe events that will
+			  * be of interest to end users or system managers, or which
+			  * indicate potential problems.
+
+			  *
+			  */
+			  WARNING = 3,
+			  /**
+			 * INFO is a message level for informational messages.
+			 * <p>
+			 * Typically INFO messages will be written to the console
+			 * or its equivalent.  So the INFO level should only be
+			 * used for reasonably significant messages that will
+			 * make sense to end users and system administrators.
+
+			 */
+			 INFO = 3,
+			 /**
+			 * CONFIG is a message level for static configuration messages.
+			 * <p>
+			 * CONFIG messages are intended to provide a variety of static
+			 * configuration information, to assist in debugging problems
+			 * that may be associated with particular configurations.
+			 * For example, CONFIG message might include the CPU type,
+			 * the graphics depth, the GUI look-and-feel, etc.
+			 * This level is initialized to <CODE>4</CODE>.
+			 */
+
+			 CONFIG = 4,
+
+
+
+			 /**
+			  * FINE is a message level providing tracing information.
+			  * <p>
+			  * All of FINE, FINER, and FINEST are intended for relatively
+			  * detailed tracing.  The exact meaning of the three levels will
+			  * vary between subsystems, but in general, FINEST should be used
+			  * for the most voluminous detailed output, FINER for somewhat
+			  * less detailed output, and FINE for the  lowest volume (and
+			  * most important) messages.
+			  * <p>
+			  * In general the FINE level should be used for information
+			  * that will be broadly interesting to developers who do not have
+			  * a specialized interest in the specific subsystem.
+			  * <p>
+			  * FINE messages might include things like minor (recoverable)
+			  * failures.  Issues indicating potential performance problems
+			  * are also worth logging as FINE.
+			  * This level is initialized to <CODE>5</CODE>.
+			  */
+			  FINE = 5,
+
+			  /**
+			  * FINER indicates a fairly detailed tracing message.
+			  * By default logging calls for entering, returning, or throwing
+			  * an exception are traced at this level.
+			  * This level is initialized to <CODE>400</CODE>.
+			  */
+			  FINER = 6,
+
+			  /**
+			   * FINEST indicates a highly detailed tracing message.
+			   * This level is initialized to <CODE>300</CODE>.
+			   */
+			   FINEST = 7,
+
+			   /**
+				* ALL indicates that all messages should be logged.
+				* This level is initialized to <CODE>Integer.MIN_VALUE</CODE>.
+				*/
+				ALL,
+		};
+		virtual  void log(Level level, std::wstring&& msg) = 0;
+		virtual  void log(Level level, const std::wstring& msg) = 0;
+		virtual  void log(Level level, std::string&& msg) = 0;
+		virtual  void log(Level level, const std::string& msg) = 0;
+		
+		void  info(const std::string& msg)
+		{
+			log(Level::INFO, msg);
+		}
+		void  info(const std::wstring& msg)
+		{
+			log(Level::INFO, msg);
+		}
+		void  error(const std::string& msg)
+		{
+			log(Level::SEVERE, msg);
+		}
+		void  error(const std::wstring& msg)
+		{
+			log(Level::SEVERE, msg);
+		}
+		void  warning(const std::string& msg)
+		{
+			log(Level::WARNING, msg);
+		}
+		void  warning(const std::wstring& msg)
+		{
+			log(Level::WARNING, msg);
+		}
+	};
+}
+
+class MessageIssue {
+
+public:
+	std::string text;
+
+	lsp::Log::Level code;
+
+	MessageIssue(const std::string& text, lsp::Log::Level code) :text(text), code(code)
+	{
+
+
+	}
+	MessageIssue(std::string&& text, lsp::Log::Level code) :text(text), code(code)
+	{
+
+
+	}
+
+
+	std::string getText() {
+		return text;
+	}
+
+	lsp::Log::Level getIssueCode() {
+		return code;
+	}
+
+
+	std::string toString() {
+		return getText();
+	}
+
+};
+class  MessageIssueHandler
+{
+public:
+	/**
+	 * Handle issues found while parsing or validating a message. The list of issues must not be empty.
+	 */
+	virtual  ~MessageIssueHandler() = default;
+	
+	virtual  void handle(std::vector<MessageIssue>&&) = 0;
+	virtual  void handle( MessageIssue&&) = 0;
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageIssue.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageJsonHandler.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageJsonHandler.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageJsonHandler.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,57 @@
+#include "MessageJsonHandler.h"
+#include <string>
+#include <rapidjson/document.h>
+
+
+
+std::unique_ptr<LspMessage> MessageJsonHandler::parseResponseMessage(const std::string& method, Reader& r)
+{
+	auto findIt = method2response.find(method);
+	
+	if( findIt != method2response.end())
+	{
+		return  findIt->second(r);
+	}
+	return nullptr;
+}
+
+std::unique_ptr<LspMessage> MessageJsonHandler::parseRequstMessage(const std::string& method, Reader&r)
+{
+	auto findIt = method2request.find(method);
+
+	if (findIt != method2request.end())
+	{
+		return  findIt->second(r);
+	}
+	return nullptr;
+}
+
+bool MessageJsonHandler::resovleResponseMessage(Reader&r, std::pair<std::string, std::unique_ptr<LspMessage>>& result)
+{
+	for (auto& handler : method2response)
+	{
+		try
+		{
+			auto msg =  handler.second(r);
+			result.first = handler.first;
+			result.second = std::move(msg);
+			return true;
+		}
+		catch (...)
+		{
+
+		}
+	}
+	return false;
+}
+
+std::unique_ptr<LspMessage> MessageJsonHandler::parseNotificationMessage(const std::string& method, Reader& r)
+{
+	auto findIt = method2notification.find(method);
+
+	if (findIt != method2notification.end())
+	{
+		return  findIt->second(r);
+	}
+	return nullptr;
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageJsonHandler.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageJsonHandler.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageJsonHandler.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageJsonHandler.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,61 @@
+#pragma once
+#include <string>
+#include <map>
+#include <functional>
+#include <LibLsp/JsonRpc/message.h>
+class Reader;
+
+
+using  GenericRequestJsonHandler = std::function< std::unique_ptr<LspMessage>(Reader&) >;
+using  GenericResponseJsonHandler = std::function< std::unique_ptr<LspMessage>(Reader&) >;
+using  GenericNotificationJsonHandler = std::function< std::unique_ptr<LspMessage>(Reader&) >;
+
+class MessageJsonHandler
+{
+public:
+	std::map< std::string, GenericRequestJsonHandler > method2request;
+	std::map< std::string,  GenericResponseJsonHandler > method2response;
+	std::map< std::string, GenericNotificationJsonHandler > method2notification;
+
+
+	const GenericRequestJsonHandler* GetRequestJsonHandler(const char* methodInfo) const
+	{
+		const auto findIt = method2request.find(methodInfo);
+		return  findIt == method2request.end() ? nullptr : &findIt->second;
+	}
+	
+	void SetRequestJsonHandler(const std::string& methodInfo, GenericRequestJsonHandler handler)
+	{
+		method2request[methodInfo] = handler;
+	}
+	
+	const GenericResponseJsonHandler* GetResponseJsonHandler(const char* methodInfo) const
+	{
+		const auto findIt = method2response.find(methodInfo);
+		return  findIt == method2response.end() ? nullptr : &findIt->second;
+	}
+	
+	void SetResponseJsonHandler(const std::string& methodInfo,GenericResponseJsonHandler handler) 
+	{
+		method2response[methodInfo] = handler;
+	}
+
+	const GenericNotificationJsonHandler* GetNotificationJsonHandler(const char* methodInfo) const
+	{
+		const auto findIt = method2notification.find(methodInfo);
+		return  findIt == method2notification.end() ? nullptr : &findIt->second;
+	}
+
+	void SetNotificationJsonHandler(const std::string& methodInfo, GenericNotificationJsonHandler handler)
+	{
+		method2notification[methodInfo] = handler;
+	}
+
+
+	
+	std::unique_ptr<LspMessage> parseResponseMessage(const std::string&, Reader&);
+	std::unique_ptr<LspMessage> parseRequstMessage(const std::string&, Reader&);
+	bool resovleResponseMessage(Reader&, std::pair<std::string, std::unique_ptr<LspMessage>>& result);
+	std::unique_ptr<LspMessage> parseNotificationMessage(const std::string&, Reader&);
+};
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageJsonHandler.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageProducer.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageProducer.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageProducer.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,13 @@
+#pragma once
+#include <string>
+#include <functional>
+
+class MessageProducer
+{
+public:
+	
+	
+	typedef  std::function< void(std::string&&) >  MessageConsumer;
+	virtual  ~MessageProducer() = default;
+	virtual void listen(MessageConsumer) = 0;
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/MessageProducer.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/NotificationInMessage.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/NotificationInMessage.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/NotificationInMessage.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,62 @@
+#pragma once
+
+
+#include "lsRequestId.h"
+#include "LibLsp/JsonRpc/message.h"
+
+
+
+// NotificationInMessage does not have |id|.
+struct NotificationInMessage : public LspMessage {
+
+	Kind GetKid() override
+	{
+		return  NOTIFICATION_MESSAGE;
+	}
+	MethodType GetMethodType() const override
+	{
+		return method.c_str();
+	}
+	void SetMethodType(MethodType _t) override
+	{
+		method = _t;
+	}
+	std::string method;
+};
+template <class T, class TDerived >
+struct lsNotificationInMessage : NotificationInMessage {
+
+	void ReflectWriter(Writer& writer) override {
+		Reflect(writer, static_cast<TDerived&>(*this));
+	}
+	lsNotificationInMessage(MethodType _method)
+	{
+		method = _method;
+	}
+
+	static std::unique_ptr<LspMessage> ReflectReader(Reader& visitor) {
+
+		TDerived* temp = new TDerived();
+
+		std::unique_ptr<TDerived>  message = std::unique_ptr<TDerived>(temp);
+		// Reflect may throw and *message will be partially deserialized.
+		Reflect(visitor, static_cast<TDerived&>(*temp));
+		return message;
+
+	}
+	void swap(lsNotificationInMessage& arg) noexcept
+	{
+		method.swap(method);
+		std::swap(params, arg.params);
+	}
+	T params;
+};
+
+#define DEFINE_NOTIFICATION_TYPE(MSG,paramType,methodInfo)\
+namespace  MSG {\
+	struct notify : public lsNotificationInMessage< paramType , notify >{\
+		static constexpr   MethodType  kMethodInfo = methodInfo;\
+		notify():lsNotificationInMessage(kMethodInfo){}                                   \
+	};\
+};\
+MAKE_REFLECT_STRUCT(MSG::notify, jsonrpc,method, params)


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/NotificationInMessage.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RemoteEndPoint.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RemoteEndPoint.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RemoteEndPoint.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,612 @@
+#include "MessageJsonHandler.h"
+#include "Endpoint.h"
+#include "message.h"
+#include "RemoteEndPoint.h"
+#include <future>
+#include "Cancellation.h"
+#include "StreamMessageProducer.h"
+#include "NotificationInMessage.h"
+#include "lsResponseMessage.h"
+#include "Condition.h"
+#include "Context.h"
+#include "rapidjson/error/en.h"
+#include "json.h"
+#include "GCThreadContext.h"
+#include "ScopeExit.h"
+#include "stream.h"
+
+#define BOOST_BIND_GLOBAL_PLACEHOLDERS
+#include "boost/threadpool.hpp"
+#include <atomic>
+namespace lsp {
+
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//===----------------------------------------------------------------------===//
+
+// Cancellation mechanism for long-running tasks.
+//
+// This manages interactions between:
+//
+// 1. Client code that starts some long-running work, and maybe cancels later.
+//
+//   std::pair<Context, Canceler> Task = cancelableTask();
+//   {
+//     WithContext Cancelable(std::move(Task.first));
+//     Expected
+//     deepThoughtAsync([](int answer){ errs() << answer; });
+//   }
+//   // ...some time later...
+//   if (User.fellAsleep())
+//     Task.second();
+//
+//  (This example has an asynchronous computation, but synchronous examples
+//  work similarly - the Canceler should be invoked from another thread).
+//
+// 2. Library code that executes long-running work, and can exit early if the
+//   result is not needed.
+//
+//   void deepThoughtAsync(std::function<void(int)> Callback) {
+//     runAsync([Callback]{
+//       int A = ponder(6);
+//       if (getCancelledMonitor())
+//         return;
+//       int B = ponder(9);
+//       if (getCancelledMonitor())
+//         return;
+//       Callback(A * B);
+//     });
+//   }
+//
+//   (A real example may invoke the callback with an error on cancellation,
+//   the CancelledError is provided for this purpose).
+//
+// Cancellation has some caveats:
+//   - the work will only stop when/if the library code next checks for it.
+//     Code outside clangd such as Sema will not do this.
+//   - it's inherently racy: client code must be prepared to accept results
+//     even after requesting cancellation.
+//   - it's Context-based, so async work must be dispatched to threads in
+//     ways that preserve the context. (Like runAsync() or TUScheduler).
+//
+
+	/// A canceller requests cancellation of a task, when called.
+	/// Calling it again has no effect.
+	using Canceler = std::function<void()>;
+
+	// We don't want a cancelable scope to "shadow" an enclosing one.
+	struct CancelState {
+		std::shared_ptr<std::atomic<int>> cancelled;
+		const CancelState* parent = nullptr;
+		lsRequestId id;
+	};
+	static Key<CancelState> g_stateKey;
+
+	/// Defines a new task whose cancellation may be requested.
+	/// The returned Context defines the scope of the task.
+	/// When the context is active, getCancelledMonitor() is 0 until the Canceler is
+	/// invoked, and equal to Reason afterwards.
+	/// Conventionally, Reason may be the LSP error code to return.
+	std::pair<Context, Canceler> cancelableTask(const lsRequestId& id,int reason = 1){
+		assert(reason != 0 && "Can't detect cancellation if Reason is zero");
+		CancelState state;
+		state.id = id;
+		state.cancelled = std::make_shared<std::atomic<int>>();
+		state.parent = Context::current().get(g_stateKey);
+		return {
+			Context::current().derive(g_stateKey, state),
+			[reason, cancelled(state.cancelled)] { *cancelled = reason; },
+		};
+	}
+	/// If the current context is within a cancelled task, returns the reason.
+/// (If the context is within multiple nested tasks, true if any are cancelled).
+/// Always zero if there is no active cancelable task.
+/// This isn't free (context lookup) - don't call it in a tight loop.
+	boost::optional<CancelMonitor> getCancelledMonitor(const lsRequestId& id, const Context& ctx = Context::current()){
+		for (const CancelState* state = ctx.get(g_stateKey); state != nullptr;
+			state = state->parent)
+		{
+			if (id != state->id)continue;
+			const std::shared_ptr<std::atomic<int> > cancelled = state->cancelled;
+			std::function<int()> temp = [=]{
+				return cancelled->load();
+			};
+			return std::move(temp);
+		}
+
+		return {};
+	}
+} // namespace lsp
+
+using namespace  lsp;
+class PendingRequestInfo
+{
+	using   RequestCallBack = std::function< bool(std::unique_ptr<LspMessage>) >;
+public:
+	PendingRequestInfo(const std::string& md,
+		const RequestCallBack& callback);
+	PendingRequestInfo(const std::string& md);
+	PendingRequestInfo() {}
+	std::string method;
+	RequestCallBack futureInfo;
+};
+
+PendingRequestInfo::PendingRequestInfo(const std::string& _md,
+	const	RequestCallBack& callback) : method(_md),
+	futureInfo(callback)
+{
+}
+
+PendingRequestInfo::PendingRequestInfo(const std::string& md) : method(md)
+{
+}
+struct RemoteEndPoint::Data
+{
+	explicit Data(lsp::Log& _log , RemoteEndPoint* owner)
+          : m_id(0), next_request_cookie(0), message_producer(new StreamMessageProducer(*owner)), log(_log)
+	{
+
+	}
+	~Data()
+	{
+	   delete	message_producer;
+	}
+	std::atomic<unsigned> m_id;
+	boost::threadpool::pool tp;
+	// Method calls may be cancelled by ID, so keep track of their state.
+ // This needs a mutex: handlers may finish on a different thread, and that's
+ // when we clean up entries in the map.
+	mutable std::mutex request_cancelers_mutex;
+
+	std::map< lsRequestId, std::pair<Canceler, /*Cookie*/ unsigned> > requestCancelers;
+
+	std::atomic<unsigned>  next_request_cookie; // To disambiguate reused IDs, see below.
+	void onCancel(Notify_Cancellation::notify* notify) {
+		std::lock_guard<std::mutex> Lock(request_cancelers_mutex);
+		const auto it = requestCancelers.find(notify->params.id);
+		if (it != requestCancelers.end())
+			it->second.first(); // Invoke the canceler.
+	}
+
+	// We run cancelable requests in a context that does two things:
+	//  - allows cancellation using requestCancelers[ID]
+	//  - cleans up the entry in requestCancelers when it's no longer needed
+	// If a client reuses an ID, the last wins and the first cannot be canceled.
+	Context cancelableRequestContext(lsRequestId id) {
+		auto task = cancelableTask(id,
+			/*Reason=*/static_cast<int>(lsErrorCodes::RequestCancelled));
+		unsigned cookie;
+		{
+			std::lock_guard<std::mutex> Lock(request_cancelers_mutex);
+			cookie = next_request_cookie.fetch_add(1, std::memory_order_relaxed);
+			requestCancelers[id] = { std::move(task.second), cookie };
+		}
+		// When the request ends, we can clean up the entry we just added.
+		// The cookie lets us check that it hasn't been overwritten due to ID
+		// reuse.
+		return task.first.derive(lsp::make_scope_exit([this, id, cookie] {
+			std::lock_guard<std::mutex> lock(request_cancelers_mutex);
+			const auto& it = requestCancelers.find(id);
+			if (it != requestCancelers.end() && it->second.second == cookie)
+				requestCancelers.erase(it);
+			}));
+	}
+
+	std::map <lsRequestId, std::shared_ptr<PendingRequestInfo>>  _client_request_futures;
+	StreamMessageProducer* message_producer;
+	std::atomic<bool> quit{};
+	lsp::Log& log;
+	std::shared_ptr<lsp::istream>  input;
+	std::shared_ptr<lsp::ostream>  output;
+
+	void pendingRequest(RequestInMessage& info, GenericResponseHandler&& handler)
+	{
+		auto id = m_id.fetch_add(1, std::memory_order_relaxed);
+		info.id.set(id);
+		std::lock_guard<std::mutex> lock(m_requsetInfo);
+		_client_request_futures[info.id] = std::make_shared<PendingRequestInfo>(info.method, handler);
+
+	}
+	const std::shared_ptr<const PendingRequestInfo> getRequestInfo(const lsRequestId& _id)
+	{
+		std::lock_guard<std::mutex> lock(m_requsetInfo);
+		auto findIt = _client_request_futures.find(_id);
+		if (findIt != _client_request_futures.end())
+		{
+			return findIt->second;
+		}
+		return  nullptr;
+	}
+
+	std::mutex m_requsetInfo;
+	void removeRequestInfo(const lsRequestId& _id)
+	{
+		std::lock_guard<std::mutex> lock(m_requsetInfo);
+		auto findIt = _client_request_futures.find(_id);
+		if (findIt != _client_request_futures.end())
+		{
+			_client_request_futures.erase(findIt);
+		}
+	}
+	void clear()
+	{
+		{
+			std::lock_guard<std::mutex> lock(m_requsetInfo);
+			_client_request_futures.clear();
+
+		}
+		tp.clear();
+		quit.store(true, std::memory_order_relaxed);
+	}
+};
+
+namespace
+{
+void WriterMsg(std::shared_ptr<lsp::ostream>&  output, LspMessage& msg)
+{
+	const auto& s = msg.ToJson();
+	const auto value =
+		std::string("Content-Length: ") + std::to_string(s.size()) + "\r\n\r\n" + s;
+	output->write(value);
+	output->flush();
+}
+
+bool isResponseMessage(JsonReader& visitor)
+{
+
+	if (!visitor.HasMember("id"))
+	{
+		return false;
+	}
+
+	if (!visitor.HasMember("result") && !visitor.HasMember("error"))
+	{
+		return false;
+	}
+
+	return true;
+}
+
+bool isRequestMessage(JsonReader& visitor)
+{
+	if (!visitor.HasMember("method"))
+	{
+		return false;
+	}
+	if (!visitor["method"]->IsString())
+	{
+		return false;
+	}
+	if (!visitor.HasMember("id"))
+	{
+		return false;
+	}
+	return true;
+}
+bool isNotificationMessage(JsonReader& visitor)
+{
+	if (!visitor.HasMember("method"))
+	{
+		return false;
+	}
+	if (!visitor["method"]->IsString())
+	{
+		return false;
+	}
+	if (visitor.HasMember("id"))
+	{
+		return false;
+	}
+	return true;
+}
+}
+
+CancelMonitor RemoteEndPoint::getCancelMonitor(const lsRequestId& id)
+{
+	auto  monitor =  getCancelledMonitor(id);
+	if(monitor.has_value())
+	{
+		return  monitor.value();
+	}
+	return [] {
+		return 0;
+	};
+
+}
+
+RemoteEndPoint::RemoteEndPoint(
+	const std::shared_ptr < MessageJsonHandler >& json_handler,const std::shared_ptr < Endpoint>& localEndPoint, lsp::Log& _log, uint8_t max_workers):
+    d_ptr(new Data(_log,this)),jsonHandler(json_handler), local_endpoint(localEndPoint)
+{
+	jsonHandler->method2notification[Notify_Cancellation::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_Cancellation::notify::ReflectReader(visitor);
+	};
+
+	d_ptr->quit.store(false, std::memory_order_relaxed);
+	d_ptr->tp.size_controller().resize(max_workers);
+}
+
+RemoteEndPoint::~RemoteEndPoint()
+{
+	delete d_ptr;
+	d_ptr->quit.store(true, std::memory_order_relaxed);
+}
+
+bool RemoteEndPoint::dispatch(const std::string& content)
+{
+		rapidjson::Document document;
+		document.Parse(content.c_str(), content.length());
+		if (document.HasParseError())
+		{
+			std::string info ="lsp msg format error:";
+			rapidjson::GetParseErrorFunc GetParseError = rapidjson::GetParseError_En; // or whatever
+			info+= GetParseError(document.GetParseError());
+			info += "\n";
+			info += "ErrorContext offset:\n";
+			info += content.substr(document.GetErrorOffset());
+			d_ptr->log.log(Log::Level::SEVERE, info);
+
+			return false;
+		}
+
+		JsonReader visitor{ &document };
+		if (!visitor.HasMember("jsonrpc") ||
+			std::string(visitor["jsonrpc"]->GetString()) != "2.0")
+		{
+			std::string reason;
+			reason = "Reason:Bad or missing jsonrpc version\n";
+			reason += "content:\n" + content;
+			d_ptr->log.log(Log::Level::SEVERE, reason);
+			return  false;
+
+		}
+		LspMessage::Kind _kind = LspMessage::NOTIFICATION_MESSAGE;
+		try {
+			if (isRequestMessage(visitor))
+			{
+				_kind = LspMessage::REQUEST_MESSAGE;
+				auto msg = jsonHandler->parseRequstMessage(visitor["method"]->GetString(), visitor);
+				if (msg) {
+					mainLoop(std::move(msg));
+				}
+				else {
+					std::string info = "Unknown support request message when consumer message:\n";
+					info += content;
+					d_ptr->log.log(Log::Level::WARNING, info);
+					return false;
+				}
+			}
+			else if (isResponseMessage(visitor))
+			{
+				_kind = LspMessage::RESPONCE_MESSAGE;
+				lsRequestId id;
+				ReflectMember(visitor, "id", id);
+
+				auto msgInfo = d_ptr->getRequestInfo(id);
+				if (!msgInfo)
+				{
+					std::pair<std::string, std::unique_ptr<LspMessage>> result;
+					auto b = jsonHandler->resovleResponseMessage(visitor, result);
+					if (b)
+					{
+						result.second->SetMethodType(result.first.c_str());
+						mainLoop(std::move(result.second));
+					}
+					else
+					{
+						std::string info = "Unknown response message :\n";
+						info += content;
+						d_ptr->log.log(Log::Level::INFO, info);
+					}
+				}
+				else
+				{
+
+					auto msg = jsonHandler->parseResponseMessage(msgInfo->method, visitor);
+					if (msg) {
+						mainLoop(std::move(msg));
+					}
+					else
+					{
+						std::string info = "Unknown response message :\n";
+						info += content;
+						d_ptr->log.log(Log::Level::SEVERE, info);
+						return  false;
+					}
+
+				}
+			}
+			else if (isNotificationMessage(visitor))
+			{
+				auto msg = jsonHandler->parseNotificationMessage(visitor["method"]->GetString(), visitor);
+				if (!msg)
+				{
+					std::string info = "Unknown notification message :\n";
+					info += content;
+					d_ptr->log.log(Log::Level::SEVERE, info);
+					return  false;
+				}
+				mainLoop(std::move(msg));
+			}
+			else
+			{
+				std::string info = "Unknown lsp message when consumer message:\n";
+				info += content;
+				d_ptr->log.log(Log::Level::WARNING, info);
+				return false;
+			}
+		}
+		catch (std::exception& e)
+		{
+
+			std::string info = "Exception  when process ";
+			if(_kind==LspMessage::REQUEST_MESSAGE)
+			{
+				info += "request";
+			}
+			if (_kind == LspMessage::RESPONCE_MESSAGE)
+			{
+				info += "response";
+			}
+			else
+			{
+				info += "notification";
+			}
+			info += " message:\n";
+			info += e.what();
+			std::string reason = "Reason:" + info + "\n";
+			reason += "content:\n" + content;
+			d_ptr->log.log(Log::Level::SEVERE, reason);
+			return false;
+		}
+	return  true;
+}
+
+
+
+void RemoteEndPoint::internalSendRequest( RequestInMessage& info, GenericResponseHandler handler)
+{
+	std::lock_guard<std::mutex> lock(m_sendMutex);
+	if (!d_ptr->output || d_ptr->output->bad())
+	{
+		std::string desc = "Output isn't good any more:\n";
+		d_ptr->log.log(Log::Level::INFO, desc);
+		return ;
+	}
+	d_ptr->pendingRequest(info, std::move(handler));
+	WriterMsg(d_ptr->output, info);
+}
+
+
+std::unique_ptr<LspMessage> RemoteEndPoint::internalWaitResponse(RequestInMessage& request, unsigned time_out)
+{
+	auto  eventFuture = std::make_shared< Condition< LspMessage > >();
+	internalSendRequest(request, [=](std::unique_ptr<LspMessage> data)
+	{
+		eventFuture->notify(std::move(data));
+		return  true;
+	});
+	return   eventFuture->wait(time_out);
+}
+
+void RemoteEndPoint::mainLoop(std::unique_ptr<LspMessage>msg)
+{
+	if(d_ptr->quit.load(std::memory_order_relaxed))
+	{
+		return;
+	}
+	const auto _kind = msg->GetKid();
+	if (_kind == LspMessage::REQUEST_MESSAGE)
+	{
+		auto req = static_cast<RequestInMessage*>(msg.get());
+		// Calls can be canceled by the client. Add cancellation context.
+		WithContext WithCancel(d_ptr->cancelableRequestContext(req->id));
+		local_endpoint->onRequest(std::move(msg));
+	}
+
+	else if (_kind == LspMessage::RESPONCE_MESSAGE)
+	{
+		auto response = static_cast<ResponseInMessage*>(msg.get());
+		auto msgInfo = d_ptr->getRequestInfo(response->id);
+		if (!msgInfo)
+		{
+			const auto _method_desc = msg->GetMethodType();
+			local_endpoint->onResponse(_method_desc, std::move(msg));
+		}
+		else
+		{
+			bool needLocal = true;
+			if (msgInfo->futureInfo)
+			{
+				if (msgInfo->futureInfo(std::move(msg)))
+				{
+					needLocal = false;
+				}
+			}
+			if (needLocal)
+			{
+				local_endpoint->onResponse(msgInfo->method, std::move(msg));
+			}
+			d_ptr->removeRequestInfo(response->id);
+		}
+	}
+	else if (_kind == LspMessage::NOTIFICATION_MESSAGE)
+	{
+		if (strcmp(Notify_Cancellation::notify::kMethodInfo, msg->GetMethodType())==0)
+		{
+			d_ptr->onCancel(static_cast<Notify_Cancellation::notify*>(msg.get()));
+		}
+		else
+		{
+			local_endpoint->notify(std::move(msg));
+		}
+
+	}
+	else
+	{
+		std::string info = "Unknown lsp message  when process  message  in mainLoop:\n";
+		d_ptr->log.log(Log::Level::WARNING, info);
+	}
+}
+
+void RemoteEndPoint::handle(std::vector<MessageIssue>&& issue)
+{
+	for(auto& it : issue)
+	{
+		d_ptr->log.log(it.code, it.text);
+	}
+}
+
+void RemoteEndPoint::handle(MessageIssue&& issue)
+{
+	d_ptr->log.log(issue.code, issue.text);
+}
+
+
+void RemoteEndPoint::startProcessingMessages(std::shared_ptr<lsp::istream> r,
+	std::shared_ptr<lsp::ostream> w)
+{
+	d_ptr->quit.store(false, std::memory_order_relaxed);
+	d_ptr->input = r;
+	d_ptr->output = w;
+	d_ptr->message_producer->bind(r);
+	message_producer_thread_ = std::make_shared<std::thread>([&]()
+   {
+		d_ptr->message_producer->listen([&](std::string&& content){
+			const auto temp = std::make_shared<std::string>(std::move(content));
+				d_ptr->tp.schedule([this, temp]{
+#ifdef USEGC
+                        GCThreadContext gcContext;
+#endif
+
+						dispatch(*temp);
+				});
+		});
+	});
+}
+
+void RemoteEndPoint::Stop()
+{
+	if(message_producer_thread_ && message_producer_thread_->joinable())
+	{
+		message_producer_thread_->detach();
+	}
+	d_ptr->clear();
+
+}
+
+void RemoteEndPoint::sendMsg( LspMessage& msg)
+{
+
+	std::lock_guard<std::mutex> lock(m_sendMutex);
+	if (!d_ptr->output || d_ptr->output->bad())
+	{
+		std::string info = "Output isn't good any more:\n";
+		d_ptr->log.log(Log::Level::INFO, info);
+		return;
+	}
+	WriterMsg(d_ptr->output, msg);
+
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RemoteEndPoint.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RemoteEndPoint.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RemoteEndPoint.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RemoteEndPoint.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,340 @@
+#pragma once
+#include "LibLsp/lsp/lsp_diagnostic.h"
+#include "LibLsp/JsonRpc/Cancellation.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+#include "traits.h"
+#include <future>
+#include <string>
+#include "threaded_queue.h"
+#include <unordered_map>
+#include "MessageIssue.h"
+#include "LibLsp/JsonRpc/MessageJsonHandler.h"
+#include "Endpoint.h"
+
+
+class MessageJsonHandler;
+class  Endpoint;
+struct LspMessage;
+class RemoteEndPoint;
+namespace lsp {
+	class ostream;
+	class istream;
+
+	////////////////////////////////////////////////////////////////////////////////
+	// ResponseOrError<T>
+	////////////////////////////////////////////////////////////////////////////////
+
+	// ResponseOrError holds either the response to a  request or an error
+	// message.
+	template <typename T>
+	struct ResponseOrError {
+		 using Request = T;
+		 ResponseOrError();
+		 ResponseOrError(const T& response);
+		 ResponseOrError(T&& response);
+		 ResponseOrError(const Rsp_Error& error);
+		 ResponseOrError(Rsp_Error&& error);
+		 ResponseOrError(const ResponseOrError& other);
+		 ResponseOrError(ResponseOrError&& other) noexcept;
+
+		 ResponseOrError& operator=(const ResponseOrError& other);
+		 ResponseOrError& operator=(ResponseOrError&& other) noexcept;
+		bool  IsError() const { return  is_error; }
+		std::string ToJson()
+		{
+			if (is_error) return  error.ToJson();
+			return  response.ToJson();
+		}
+		T response;
+		Rsp_Error error;  // empty represents success.
+		bool is_error;
+	};
+
+	template <typename T>
+	ResponseOrError<T>::ResponseOrError(): is_error(false)
+	{
+	}
+
+	template <typename T>
+	ResponseOrError<T>::ResponseOrError(const T& resp) : response(resp), is_error(false) {}
+	template <typename T>
+	ResponseOrError<T>::ResponseOrError(T&& resp) : response(std::move(resp)), is_error(false) {}
+	template <typename T>
+	ResponseOrError<T>::ResponseOrError(const Rsp_Error& err) : error(err), is_error(true) {}
+	template <typename T>
+	ResponseOrError<T>::ResponseOrError(Rsp_Error&& err) : error(std::move(err)), is_error(true) {}
+	template <typename T>
+	ResponseOrError<T>::ResponseOrError(const ResponseOrError& other)
+		: response(other.response), error(other.error), is_error(other.is_error) {}
+	template <typename T>
+	ResponseOrError<T>::ResponseOrError(ResponseOrError&& other) noexcept
+		: response(std::move(other.response)), error(std::move(other.error)), is_error(other.is_error) {}
+	template <typename T>
+	ResponseOrError<T>& ResponseOrError<T>::operator=(
+		const ResponseOrError& other) {
+		response = other.response;
+		error = other.error;
+		is_error = other.is_error;
+		return *this;
+	}
+	template <typename T>
+	ResponseOrError<T>& ResponseOrError<T>::operator=(ResponseOrError&& other) noexcept
+	{
+		response = std::move(other.response);
+		error = std::move(other.error);
+		is_error = other.is_error;
+		return *this;
+	}
+
+}
+
+
+class RemoteEndPoint :MessageIssueHandler
+{
+
+	template <typename F, int N>
+	using ParamType = lsp::traits::ParameterType<F, N>;
+
+	template <typename T>
+	using IsRequest = lsp::traits::EnableIfIsType<RequestInMessage, T>;
+
+	template <typename T>
+	using IsResponse = lsp::traits::EnableIfIsType<ResponseInMessage, T>;
+
+	template <typename T>
+	using IsNotify = lsp::traits::EnableIfIsType<NotificationInMessage, T>;
+
+
+	template <typename F, typename ReturnType>
+	using IsRequestHandler = lsp::traits::EnableIf<lsp::traits::CompatibleWith<
+		F,
+		std::function<ReturnType(const RequestInMessage&)>>::
+		value>;
+
+	template <typename F, typename ReturnType>
+	using IsRequestHandlerWithMonitor = lsp::traits::EnableIf<lsp::traits::CompatibleWith<
+		F,
+		std::function<ReturnType(const RequestInMessage&,const CancelMonitor&)>>::
+		value>;
+
+public:
+
+	
+	RemoteEndPoint(const std::shared_ptr <MessageJsonHandler>& json_handler,
+		const std::shared_ptr < Endpoint >& localEndPoint,
+		lsp::Log& _log, uint8_t max_workers = 2);
+	
+	~RemoteEndPoint() override;
+	template <typename F, typename RequestType = ParamType<F, 0>, typename ResponseType = typename RequestType::Response>
+	IsRequestHandler< F, lsp::ResponseOrError<ResponseType> >  registerHandler(F&& handler)
+	{
+		ProcessRequestJsonHandler(handler);
+		local_endpoint->registerRequestHandler(RequestType::kMethodInfo, [=](std::unique_ptr<LspMessage> msg) {
+			auto  req = reinterpret_cast<const RequestType*>(msg.get());
+			lsp::ResponseOrError<ResponseType> res(handler(*req));
+			if (res.is_error) {
+				res.error.id = req->id;
+				send(res.error);
+			}
+			else
+			{
+				res.response.id = req->id;
+				send(res.response);
+			}
+			return  true;
+		});
+	}
+	template <typename F, typename RequestType = ParamType<F, 0>, typename ResponseType = typename RequestType::Response>
+	IsRequestHandlerWithMonitor< F, lsp::ResponseOrError<ResponseType> >  registerHandler(F&& handler)  {
+		ProcessRequestJsonHandler(handler);
+		local_endpoint->registerRequestHandler(RequestType::kMethodInfo, [=](std::unique_ptr<LspMessage> msg) {
+			auto  req = static_cast<const RequestType*>(msg.get());
+			lsp::ResponseOrError<ResponseType> res(handler(*req , getCancelMonitor(req->id)));
+			if (res.is_error) {
+				res.error.id = req->id;
+				send(res.error);
+			}
+			else
+			{
+				res.response.id = req->id;
+				send(res.response);
+			}
+			return  true;
+		});
+	}
+	using RequestErrorCallback = std::function<void(const Rsp_Error&)>;
+	
+	template <typename T, typename F, typename ResponseType = ParamType<F, 0> >
+	void send(T& request, F&& handler, RequestErrorCallback onError)
+	{
+		ProcessRequestJsonHandler(handler);
+		auto cb = [=](std::unique_ptr<LspMessage> msg) {
+			if (!msg)
+				return true;
+			const auto result = msg.get();
+		
+			if (static_cast<ResponseInMessage*>(result)->IsErrorType()) {
+				const auto rsp_error = static_cast<const Rsp_Error*>(result);
+				onError(*rsp_error);
+			}
+			else {
+				handler(*static_cast<ResponseType*>(result));
+			}
+
+			return  true;
+		};
+		internalSendRequest(request, cb);
+	}
+	
+
+	template <typename F, typename NotifyType = ParamType<F, 0> >
+	IsNotify<NotifyType>  registerHandler(F&& handler) {
+		{
+			std::lock_guard<std::mutex> lock(m_sendMutex);
+			if (!jsonHandler->GetNotificationJsonHandler(NotifyType::kMethodInfo))
+			{
+				jsonHandler->SetNotificationJsonHandler(NotifyType::kMethodInfo,
+					[](Reader& visitor)
+					{
+						return NotifyType::ReflectReader(visitor);
+					});
+			}
+		}
+		local_endpoint->registerNotifyHandler(NotifyType::kMethodInfo, [=](std::unique_ptr<LspMessage> msg) {
+			handler(*static_cast<NotifyType*>(msg.get()));
+			return  true;
+			});
+	}
+
+	template <typename T, typename = IsRequest<T>>
+	std::future< lsp::ResponseOrError<typename T::Response> > send(T& request) {
+
+		ProcessResponseJsonHandler(request);
+		using Response = typename T::Response;
+		auto promise = std::make_shared< std::promise<lsp::ResponseOrError<Response>>>();
+		auto cb = [=](std::unique_ptr<LspMessage> msg) {
+			if (!msg)
+				return true;
+			auto result = msg.get();
+
+			if (reinterpret_cast<ResponseInMessage*>(result)->IsErrorType())
+			{
+				Rsp_Error* rsp_error = static_cast<Rsp_Error*>(result);
+				Rsp_Error temp;
+				std::swap(temp, *rsp_error);
+				promise->set_value(std::move(lsp::ResponseOrError<Response>(std::move(temp))));
+			}
+			else
+			{
+				Response temp;
+				std::swap(temp, *static_cast<Response*>(result));
+				promise->set_value(std::move(lsp::ResponseOrError<Response>(std::move(temp))));
+			}
+			return  true;
+		};
+		internalSendRequest(request, cb);
+		return promise->get_future();
+	}
+
+	template <typename T, typename = IsRequest<T>>
+	std::unique_ptr<lsp::ResponseOrError<typename T::Response>> waitResponse(T& request, const unsigned time_out = 0)
+	{
+		auto future_rsp = send(request);
+		if (time_out == 0)
+		{
+			future_rsp.wait();
+		}
+		else
+		{
+			auto state = future_rsp.wait_for(std::chrono::milliseconds(time_out));
+			if (std::future_status::timeout == state)
+			{
+				return {};
+			}
+		}
+
+		using Response = typename T::Response;
+		return std::make_unique<lsp::ResponseOrError<Response>>(std::move(future_rsp.get()));
+	}
+
+	void send(NotificationInMessage& msg)
+	{
+		sendMsg(msg);
+	}
+
+	void send(ResponseInMessage& msg)
+	{
+		sendMsg(msg);
+	}
+	
+	void sendNotification(NotificationInMessage& msg)
+	{
+		send(msg);
+	}
+	void sendResponse(ResponseInMessage& msg)
+	{
+		send(msg);
+	}
+	void startProcessingMessages(std::shared_ptr<lsp::istream> r,
+		std::shared_ptr<lsp::ostream> w);
+
+	bool IsWorking() const
+	{
+		if (message_producer_thread_)
+			return true;
+		return  false;
+	}
+	void Stop();
+
+	std::unique_ptr<LspMessage> internalWaitResponse(RequestInMessage&, unsigned time_out = 0);
+
+	void internalSendRequest(RequestInMessage&, GenericResponseHandler);
+
+	void handle(std::vector<MessageIssue>&&) override;
+	void handle(MessageIssue&&) override;
+private:
+	CancelMonitor getCancelMonitor(const lsRequestId&);
+	void sendMsg(LspMessage& msg);
+	void mainLoop(std::unique_ptr<LspMessage>);
+	bool dispatch(const std::string&);
+	template <typename F, typename RequestType = ParamType<F, 0>>
+	IsRequest<RequestType>  ProcessRequestJsonHandler(const F& handler) {
+		std::lock_guard<std::mutex> lock(m_sendMutex);
+		if (!jsonHandler->GetRequestJsonHandler(RequestType::kMethodInfo))
+		{
+			jsonHandler->SetRequestJsonHandler(RequestType::kMethodInfo,
+				[](Reader& visitor)
+				{
+					return RequestType::ReflectReader(visitor);
+				});
+		}	
+	}
+	template <typename T, typename = IsRequest<T>>
+	void ProcessResponseJsonHandler(T& request)
+	{
+		using Response = typename T::Response;
+		std::lock_guard<std::mutex> lock(m_sendMutex);
+		if (!jsonHandler->GetResponseJsonHandler(T::kMethodInfo))
+		{
+			jsonHandler->SetResponseJsonHandler(T::kMethodInfo, [](Reader& visitor)
+				{
+					if (visitor.HasMember("error"))
+						return 	Rsp_Error::ReflectReader(visitor);
+					return Response::ReflectReader(visitor);
+				});
+		}
+	}
+
+	struct Data;
+
+	Data* d_ptr;
+
+	std::shared_ptr < MessageJsonHandler> jsonHandler;
+	std::mutex m_sendMutex;
+
+	std::shared_ptr < Endpoint > local_endpoint;
+public:
+	std::shared_ptr < std::thread > message_producer_thread_;
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RemoteEndPoint.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RequestInMessage.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RequestInMessage.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RequestInMessage.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,70 @@
+#pragma once
+
+
+#include "serializer.h"
+#include <atomic>
+#include <mutex>
+#include "lsRequestId.h"
+#include "LibLsp/JsonRpc/message.h"
+#include "LibLsp/lsp/method_type.h"
+#include "lsResponseMessage.h"
+
+struct RequestInMessage : public LspMessage {
+	// number or string, actually no null
+	lsRequestId id;
+	std::string method;
+	Kind GetKid() override
+	{
+		return  REQUEST_MESSAGE;
+	}
+	
+};
+
+
+
+template <class T, class TDerived >
+struct lsRequest : public RequestInMessage
+{
+	lsRequest(MethodType _method)
+	{
+		method = _method;
+	}
+	MethodType GetMethodType() const override { return method.c_str(); }
+	void SetMethodType(MethodType _method) override
+	{
+		method = _method;
+	}								  \
+	void ReflectWriter(Writer& writer) override {
+		Reflect(writer, static_cast<TDerived&>(*this));
+	}
+	
+	static std::unique_ptr<LspMessage> ReflectReader(Reader& visitor) {
+
+		TDerived* temp = new TDerived();
+		std::unique_ptr<TDerived>  message = std::unique_ptr<TDerived>(temp);
+		// Reflect may throw and *message will be partially deserialized.
+		Reflect(visitor, static_cast<TDerived&>(*temp));
+		return message;
+	}
+	void swap(lsRequest& arg) noexcept
+	{
+		id.swap(arg.id);
+		method.swap(method);
+		std::swap(params, arg.params);
+	}
+	T params;
+};
+
+
+#define DEFINE_REQUEST_RESPONSE_TYPE(MSG,request_param,response_result,methodInfo)\
+namespace  MSG {\
+	struct response :public ResponseMessage< response_result, response> {}; \
+	struct request : public lsRequest< request_param , request >{\
+		static constexpr   MethodType  kMethodInfo = methodInfo;\
+		request():lsRequest(kMethodInfo){}                                   \
+		 using Response = response;\
+	};\
+};\
+MAKE_REFLECT_STRUCT(MSG::request, jsonrpc, id, method, params);\
+MAKE_REFLECT_STRUCT(MSG::response, jsonrpc, id, result);
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/RequestInMessage.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/ScopeExit.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/ScopeExit.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/ScopeExit.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,59 @@
+//===- llvm/ADT/ScopeExit.h - Execute code at scope exit --------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the make_scope_exit function, which executes user-defined
+// cleanup logic at scope exit.
+//
+//===----------------------------------------------------------------------===//
+#pragma once
+#include <type_traits>
+#include <utility>
+
+namespace lsp {
+namespace detail {
+
+template <typename Callable> class scope_exit {
+  Callable ExitFunction;
+  bool Engaged = true; // False once moved-from or release()d.
+
+public:
+  template <typename Fp>
+  explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
+
+  scope_exit(scope_exit &&Rhs)
+      : ExitFunction(std::move(Rhs.ExitFunction)), Engaged(Rhs.Engaged) {
+    Rhs.release();
+  }
+  scope_exit(const scope_exit &) = delete;
+  scope_exit &operator=(scope_exit &&) = delete;
+  scope_exit &operator=(const scope_exit &) = delete;
+
+  void release() { Engaged = false; }
+
+  ~scope_exit() {
+    if (Engaged)
+      ExitFunction();
+  }
+};
+
+} // end namespace detail
+
+// Keeps the callable object that is passed in, and execute it at the
+// destruction of the returned object (usually at the scope exit where the
+// returned object is kept).
+//
+// Interface is specified by p0052r2.
+template <typename Callable>
+ detail::scope_exit<typename std::decay<Callable>::type>
+make_scope_exit(Callable &&F) {
+  return detail::scope_exit<typename std::decay<Callable>::type>(
+      std::forward<Callable>(F));
+}
+
+} // end namespace lsp
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/ScopeExit.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/StreamMessageProducer.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/StreamMessageProducer.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/StreamMessageProducer.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,191 @@
+
+#include "StreamMessageProducer.h"
+#include <cassert>
+
+#include "stream.h"
+
+
+bool StartsWith(std::string value, std::string start);
+bool StartsWith(std::string value, std::string start) {
+	if (start.size() > value.size())
+		return false;
+	return std::equal(start.begin(), start.end(), value.begin());
+}
+
+using  namespace std;
+namespace
+{
+	string JSONRPC_VERSION = "2.0";
+	string CONTENT_LENGTH_HEADER = "Content-Length";
+	string CONTENT_TYPE_HEADER = "Content-Type";
+	string JSON_MIME_TYPE = "application/json";
+	string CRLF = "\r\n";
+
+}
+
+  void StreamMessageProducer::parseHeader(std::string& line, StreamMessageProducer::Headers& headers)
+  {
+	  int sepIndex = line.find(':');
+	  if (sepIndex >= 0) {
+		  auto key = line.substr(0, sepIndex);
+	      if(key == CONTENT_LENGTH_HEADER)
+	      {	
+			headers.contentLength = atoi(line.substr(sepIndex + 1).data());
+	      }
+		  else if(key == CONTENT_TYPE_HEADER)
+		  {
+			  int charsetIndex = line.find("charset=");
+			  if (charsetIndex >= 0)
+				  headers.charset = line.substr(charsetIndex + 8);
+		  }
+	  }
+  }
+  
+
+void StreamMessageProducer::listen(MessageConsumer callBack)
+{
+  	if(!input)
+		return;
+  	
+	keepRunning = true;
+	bool newLine = false;
+	Headers headers;
+	string headerBuilder ;
+	string debugBuilder ;
+	// Read the content length. It is terminated by the "\r\n" sequence.
+	while (keepRunning) 
+	{
+		if(input->bad())
+		{
+			std::string info = "Input stream is bad.";
+			auto what = input->what();
+			if (what.size())
+			{
+				info += "Reason:";
+				info += input->what();
+			}
+			MessageIssue issue(info, lsp::Log::Level::SEVERE);
+			issueHandler.handle(std::move(issue));
+			return;
+		}
+		if(input->fail())
+		{
+			std::string info = "Input fail.";
+			auto what = input->what();
+			if(what.size())
+			{
+				info += "Reason:";
+				info += input->what();
+			}
+			MessageIssue issue(info, lsp::Log::Level::WARNING);
+			issueHandler.handle(std::move(issue));
+			if(input->need_to_clear_the_state())
+				input->clear();
+			else
+			{
+				return;
+			}
+		}
+		int c = input->get();
+		if (c == EOF) {
+			// End of input stream has been reached
+			keepRunning = false;
+		}
+		else 
+		{
+
+			debugBuilder.push_back((char)c);
+			if (c == '\n') 
+			{
+				if (newLine) {
+					// Two consecutive newlines have been read, which signals the start of the message content
+					if (headers.contentLength <= 0) 
+					{
+						string info = "Unexpected token:" + debugBuilder;
+						info = +"  (expected Content-Length: sequence);";
+						 MessageIssue issue(info, lsp::Log::Level::WARNING);
+						 issueHandler.handle(std::move(issue));
+					}
+					else {
+						bool result = handleMessage(headers,callBack);
+						if (!result)
+							keepRunning = false;
+						newLine = false;
+					}
+					headers.clear();
+					debugBuilder.clear();
+				}
+				else if (!headerBuilder.empty()) {
+					// A single newline ends a header line
+					parseHeader(headerBuilder, headers);
+					headerBuilder.clear();
+				}
+				newLine = true;
+			}
+			else if (c != '\r') {
+				// Add the input to the current header line
+				
+				headerBuilder.push_back((char)c);
+				newLine = false;
+			}
+		}
+	}
+
+}
+
+void StreamMessageProducer::bind(std::shared_ptr<lsp::istream>_in)
+{
+	input = _in;
+}
+
+bool StreamMessageProducer::handleMessage(Headers& headers ,MessageConsumer callBack)
+{
+	 		 // Read content.
+	auto content_length = headers.contentLength;
+ 	 std::string content(content_length,0);
+ 	 auto data = &content[0];
+	 input->read(data, content_length);
+	 if (input->bad())
+	 {
+		 std::string info = "Input stream is bad.";
+		 auto what = input->what();
+		 if (!what.empty())
+		 {
+			 info += "Reason:";
+			 info += input->what();
+		 }
+		 MessageIssue issue(info, lsp::Log::Level::SEVERE);
+		 issueHandler.handle(std::move(issue));
+		 return false;
+	 }
+
+	 if (input->eof())
+	 {
+		 MessageIssue issue("No more input when reading content body", lsp::Log::Level::INFO);
+		 issueHandler.handle(std::move(issue));
+		 return false;
+	 }
+	 if (input->fail())
+	 {
+		 std::string info = "Input fail.";
+		 auto what = input->what();
+		 if (!what.empty())
+		 {
+			 info += "Reason:";
+			 info += input->what();
+		 }
+		 MessageIssue issue(info, lsp::Log::Level::WARNING);
+		 issueHandler.handle(std::move(issue));
+		 if (input->need_to_clear_the_state())
+			 input->clear();
+		 else
+		 {
+			 return false;
+		 }
+	 }
+
+	 callBack(std::move(content));
+ 	
+	return true;
+}
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/StreamMessageProducer.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/StreamMessageProducer.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/StreamMessageProducer.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/StreamMessageProducer.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,48 @@
+#pragma once
+#include <string>
+#include <functional>
+#include "MessageProducer.h"
+#include <iostream>
+#include <memory>
+#include "MessageIssue.h"
+
+namespace lsp {
+	class istream;
+}
+
+class StreamMessageProducer : public MessageProducer
+{
+public:
+	struct Headers
+	{
+		int contentLength = -1;
+		std::string charset;
+		void clear()
+		{
+			contentLength = -1;
+			charset.clear();
+		}
+	};
+	bool handleMessage(Headers& headers, MessageConsumer callBack);
+	StreamMessageProducer(
+		MessageIssueHandler& message_issue_handler, std::shared_ptr < lsp::istream> _input)
+		: issueHandler(message_issue_handler),
+		  input(_input)
+	{
+	}
+	StreamMessageProducer(
+		MessageIssueHandler& message_issue_handler)
+		: issueHandler(message_issue_handler)
+	{
+	}
+	
+	bool keepRunning = false;
+	void listen(MessageConsumer) override;
+	void bind(std::shared_ptr < lsp::istream>);
+	void parseHeader(std::string& line, Headers& headers);
+private:
+	MessageIssueHandler& issueHandler;
+	std::shared_ptr < lsp::istream> input;
+	
+
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/StreamMessageProducer.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/TcpServer.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/TcpServer.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/TcpServer.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,299 @@
+//
+// server.cpp
+
+#include "TcpServer.h"
+#include <signal.h>
+#include <utility>
+#include <boost/bind/bind.hpp>
+
+#include "MessageIssue.h"
+#include "stream.h"
+
+
+namespace lsp {
+	struct tcp_connect_session;
+
+
+		class tcp_stream_wrapper :public istream, public ostream
+	    {
+	    public:
+		    tcp_stream_wrapper(tcp_connect_session& _w);
+
+	        tcp_connect_session& session;
+	        std::atomic<bool> quit{};
+	        std::shared_ptr < MultiQueueWaiter> request_waiter;
+	        ThreadedQueue< char > on_request;
+            std::string error_message;
+
+
+	        bool fail() override
+	        {
+	            return  bad();
+	        }
+
+
+
+	        bool eof() override
+	        {
+	            return  bad();
+	        }
+	        bool good() override
+	        {
+	            return  !bad();
+	        }
+	        tcp_stream_wrapper& read(char* str, std::streamsize count)
+                  override
+	        {
+                auto some = on_request.TryDequeueSome(static_cast<size_t>( count ));
+                for (size_t i = 0; i < some.size(); ++i)
+				{
+				    str[i] = some[i];
+				}
+                for (std::streamsize i = 0; i < count; ++i)
+                {
+                    str[i] = static_cast<char>(get());
+                }
+
+	            return *this;
+	        }
+	        int get() override
+	        {
+	            return on_request.Dequeue();
+	        }
+
+	        bool bad() override;
+
+	        tcp_stream_wrapper& write(const std::string& c) override;
+
+	        tcp_stream_wrapper& write(std::streamsize _s) override;
+
+	        tcp_stream_wrapper& flush() override
+	        {
+	            return *this;
+	        }
+	        void reset_state()
+	        {
+	            return;
+	        }
+
+		    void clear() override
+	        {
+
+	        }
+
+		    std::string what() override;
+		    bool need_to_clear_the_state() override
+		    {
+                return false;
+		    }
+	    };
+	    struct tcp_connect_session:std::enable_shared_from_this<tcp_connect_session>
+	    {
+            /// Buffer for incoming data.
+            std::array<unsigned char, 8192> buffer_;
+            boost::asio::ip::tcp::socket socket_;
+            /// Strand to ensure the connection's handlers are not called concurrently.
+            boost::asio::io_context::strand strand_;
+            std::shared_ptr<tcp_stream_wrapper>  proxy_;
+            explicit tcp_connect_session(boost::asio::io_context& io_context, boost::asio::ip::tcp::socket&& _socket)
+	            : socket_(std::move(_socket)), strand_(io_context), proxy_(new tcp_stream_wrapper(*this))
+            {
+                do_read();
+            }
+            void do_write(const std::string& data)
+            {
+                socket_.async_write_some(boost::asio::buffer(data.data(), data.size()),
+                    boost::asio::bind_executor(strand_,[this](boost::system::error_code ec, std::size_t n)
+                   {
+                        if (!ec)
+                        {
+                            return;
+                        }
+                        proxy_->error_message = ec.message();
+
+                    }));
+            }
+            void do_read()
+            {
+                socket_.async_read_some(boost::asio::buffer(buffer_),
+            boost::asio::bind_executor(strand_,
+                [this](boost::system::error_code ec, size_t bytes_transferred)
+                {
+                    if (!ec)
+                    {
+                        std::vector<char> elements(buffer_.data(), buffer_.data() + bytes_transferred);
+                        proxy_->on_request.EnqueueAll(std::move(elements), false);
+                        do_read();
+                        return;
+                    }
+                    proxy_->error_message = ec.message();
+
+                }));
+            }
+	    };
+
+	tcp_stream_wrapper::tcp_stream_wrapper(tcp_connect_session& _w): session(_w)
+	{
+	}
+
+	bool tcp_stream_wrapper::bad()
+    {
+        return !session.socket_.is_open();
+    }
+
+	tcp_stream_wrapper& tcp_stream_wrapper::write(const std::string& c)
+	{
+		session.do_write(c);
+		return *this;
+	}
+
+    tcp_stream_wrapper& tcp_stream_wrapper::write(std::streamsize _s)
+    {
+        session.do_write(std::to_string(_s));
+        return *this;
+    }
+
+	std::string tcp_stream_wrapper::what()
+	{
+        if (error_message.size())
+            return error_message;
+
+       if(! session.socket_.is_open())
+       {
+           return  "Socket is not open.";
+       }
+		return {};
+	}
+
+    struct TcpServer::Data
+    {
+        Data(
+            lsp::Log& log, uint32_t _max_workers) :
+		    acceptor_(io_context_), _log(log)
+	    {
+	    }
+
+	    ~Data()
+	    {
+
+	    }
+        /// The io_context used to perform asynchronous operations.
+        boost::asio::io_context io_context_;
+
+        std::shared_ptr<boost::asio::io_service::work> work;
+
+        std::shared_ptr<tcp_connect_session> _connect_session;
+        /// Acceptor used to listen for incoming connections.
+        boost::asio::ip::tcp::acceptor acceptor_;
+
+        lsp::Log& _log;
+
+    };
+
+	    TcpServer::~TcpServer()
+	    {
+            delete d_ptr;
+	    }
+
+        TcpServer::TcpServer(const std::string& address, const std::string& port,
+            std::shared_ptr < MessageJsonHandler> json_handler,
+            std::shared_ptr < Endpoint> localEndPoint, lsp::Log& log, uint32_t _max_workers)
+            : point(json_handler, localEndPoint, log, _max_workers),d_ptr(new Data( log, _max_workers))
+
+        {
+
+            d_ptr->work = std::make_shared<boost::asio::io_service::work>(d_ptr->io_context_);
+
+            // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
+            boost::asio::ip::tcp::resolver resolver(d_ptr->io_context_);
+            boost::asio::ip::tcp::endpoint endpoint =
+                *resolver.resolve(address, port).begin();
+            d_ptr->acceptor_.open(endpoint.protocol());
+            d_ptr->acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
+            try
+            {
+                d_ptr->acceptor_.bind(endpoint);
+            }
+            catch (boost::system::system_error & e)
+            {
+                std::string temp = "Socket Server  bind failed.";
+                d_ptr->_log.log(lsp::Log::Level::INFO , temp + e.what());
+                return;
+            }
+            d_ptr->acceptor_.listen();
+
+            do_accept();
+            std::string desc = "Socket TcpServer " + address + " " + port + " start.";
+            d_ptr->_log.log(lsp::Log::Level::INFO, desc);
+        }
+
+        void TcpServer::run()
+        {
+            // The io_context::run() call will block until all asynchronous operations
+            // have finished. While the TcpServer is running, there is always at least one
+            // asynchronous operation outstanding: the asynchronous accept call waiting
+            // for new incoming connections.
+            d_ptr->io_context_.run();
+
+        }
+
+        void TcpServer::stop()
+        {
+            try
+            {
+            	if(d_ptr->work)
+                    d_ptr->work.reset();
+
+                do_stop();
+            }
+            catch (...)
+            {
+            }
+        }
+
+        void TcpServer::do_accept()
+        {
+            d_ptr->acceptor_.async_accept(
+                [this](boost::system::error_code ec, boost::asio::ip::tcp::socket socket)
+                {
+                    // Check whether the TcpServer was stopped by a signal before this
+                    // completion handler had a chance to run.
+                    if (!d_ptr->acceptor_.is_open())
+                    {
+                        return;
+                    }
+
+                    if (!ec)
+                    {
+                    	if(d_ptr->_connect_session)
+                    	{
+                    		if(d_ptr->_connect_session->socket_.is_open())
+                    		{
+                                std::string desc = "Disconnect previous client " + d_ptr->_connect_session->socket_.local_endpoint().address().to_string();
+                                d_ptr->_log.log(lsp::Log::Level::INFO, desc);
+                                d_ptr->_connect_session->socket_.close();
+                    		}
+
+                            point.Stop();
+                    	}
+                        auto local_point = socket.local_endpoint();
+
+                        std::string desc = ("New client " + local_point.address().to_string() + " connect.");
+                        d_ptr->_log.log(lsp::Log::Level::INFO, desc);
+                        d_ptr->_connect_session = std::make_shared<tcp_connect_session>(d_ptr->io_context_,std::move(socket));
+
+                        point.startProcessingMessages(d_ptr->_connect_session->proxy_, d_ptr->_connect_session->proxy_);
+                        do_accept();
+                    }
+                });
+        }
+
+        void TcpServer::do_stop()
+        {
+            d_ptr->acceptor_.close();
+
+           point.Stop();
+
+        }
+
+    } // namespace


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/TcpServer.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/TcpServer.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/TcpServer.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/TcpServer.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,40 @@
+#pragma once
+
+#include <boost/asio.hpp>
+#include <string>
+#include "RemoteEndPoint.h"
+
+namespace lsp {
+    class Log;
+}
+namespace lsp
+{
+        /// The top-level class of the HTTP server.
+        class TcpServer
+        {
+        public:
+            TcpServer(const TcpServer&) = delete;
+            TcpServer& operator=(const TcpServer&) = delete;
+            ~TcpServer();
+            /// Construct the server to listen on the specified TCP address and port, and
+            /// serve up files from the given directory.
+            explicit TcpServer(const std::string& address, const std::string& port,
+                std::shared_ptr < MessageJsonHandler> json_handler,
+                std::shared_ptr < Endpoint> localEndPoint, lsp::Log& ,uint32_t _max_workers = 2);
+
+            /// Run the server's io_context loop.
+            void run();
+            void stop();
+
+           RemoteEndPoint point;
+        private:
+            struct Data;
+            /// Perform an asynchronous accept operation.
+            void do_accept();
+
+            /// Wait for a request to stop the server.
+            void do_stop();
+            Data* d_ptr = nullptr;
+        };
+} // namespace 
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/TcpServer.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/WebSocketServer.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/WebSocketServer.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/WebSocketServer.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,341 @@
+#include "MessageIssue.h"
+#include "WebSocketServer.h"
+#include <iostream>
+#include <signal.h>
+#include <utility>
+#include "stream.h"
+#include <boost/beast/core.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/asio/dispatch.hpp>
+namespace beast = boost::beast;         // from <boost/beast.hpp>
+namespace http = beast::http;           // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio;            // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp;       // from <boost/asio/ip/tcp.hpp>
+namespace lsp {
+
+    // Echoes back all received WebSocket messages
+    class server_session : public std::enable_shared_from_this<server_session>
+    {
+        websocket::stream<beast::tcp_stream> ws_;
+
+        beast::flat_buffer buffer_;
+        std::string user_agent_;
+    public:
+        std::shared_ptr<websocket_stream_wrapper>  proxy_;
+        // Take ownership of the socket
+        explicit
+            server_session(tcp::socket&& socket,const std::string& user_agent)
+            : ws_(std::move(socket)),user_agent_(user_agent)
+        {
+            proxy_ = std::make_shared<websocket_stream_wrapper>(ws_);
+        }
+
+        // Get on the correct executor
+        void
+            run()
+        {
+            // We need to be executing within a strand to perform async operations
+            // on the I/O objects in this server_session. Although not strictly necessary
+            // for single-threaded contexts, this example code is written to be
+            // thread-safe by default.
+            net::dispatch(ws_.get_executor(),
+                beast::bind_front_handler(
+                    &server_session::on_run,
+                    shared_from_this()));
+        }
+
+        // Start the asynchronous operation
+        void
+            on_run()
+        {
+            // Set suggested timeout settings for the websocket
+            ws_.set_option(
+                websocket::stream_base::timeout::suggested(
+                    beast::role_type::server));
+
+            // Set a decorator to change the Server of the handshake
+            ws_.set_option(websocket::stream_base::decorator(
+                [=](websocket::response_type& res)
+                {
+                    res.set(http::field::server, user_agent_.c_str());
+                }));
+            // Accept the websocket handshake
+            ws_.async_accept(
+                beast::bind_front_handler(
+                    &server_session::on_accept,
+                    shared_from_this()));
+        }
+
+        void
+            on_accept(beast::error_code ec)
+        {
+            if (ec)
+                return ;
+
+            // Read a message
+            // Read a message into our buffer
+            ws_.async_read(
+                buffer_,
+                beast::bind_front_handler(
+                    &server_session::on_read,
+                    shared_from_this()));
+        }
+
+
+
+        void
+            on_read(
+                beast::error_code ec,
+                std::size_t bytes_transferred)
+        {
+
+            if(!ec)
+            {
+                char* data = reinterpret_cast<char*>(buffer_.data().data());
+                std::vector<char> elements(data, data + bytes_transferred);
+
+                buffer_.clear();
+                proxy_->on_request.EnqueueAll(std::move(elements), false);
+
+                // Read a message into our buffer
+                ws_.async_read(
+                    buffer_,
+                    beast::bind_front_handler(
+                        &server_session::on_read,
+                        shared_from_this()));
+                return;
+            }
+            if (ec){
+                proxy_->error_message = ec.message();
+            }
+        }
+
+
+
+        void close()
+        {
+        	if(ws_.is_open())
+        	{
+        		boost::system::error_code ec;
+        		ws_.close(websocket::close_code::normal, ec);
+        	}
+
+        }
+    };
+
+    //------------------------------------------------------------------------------
+
+	    struct WebSocketServer::Data
+	    {
+            Data(const std::string& user_agent, lsp::Log& log) :
+			    acceptor_(io_context_), user_agent_(user_agent), _log(log)
+
+		    {
+		    }
+
+	    	~Data()
+		    {
+
+		    }
+            /// The io_context used to perform asynchronous operations.
+            boost::asio::io_context io_context_;
+
+            std::shared_ptr<boost::asio::io_service::work> work;
+
+            /// Acceptor used to listen for incoming connections.
+            boost::asio::ip::tcp::acceptor acceptor_;
+
+            std::shared_ptr < server_session> _server_session;
+
+            std::string user_agent_;
+            lsp::Log& _log;
+
+	    };
+
+    websocket_stream_wrapper::websocket_stream_wrapper(boost::beast::websocket::stream<boost::beast::tcp_stream>& _w):
+	    ws_(_w), request_waiter(new MultiQueueWaiter()),
+	    on_request(request_waiter)
+    {
+    }
+
+    bool websocket_stream_wrapper::fail()
+    {
+	    return bad();
+    }
+
+    bool websocket_stream_wrapper::eof()
+    {
+	    return bad();
+    }
+
+    bool websocket_stream_wrapper::good()
+    {
+	    return !bad();
+    }
+
+    websocket_stream_wrapper& websocket_stream_wrapper::read(char* str, std::streamsize count)
+    {
+	    auto some = on_request.TryDequeueSome(static_cast<size_t>(count));
+
+	    for (size_t i = 0; i < some.size(); ++i)
+	    {
+		    str[i] = some[i];
+	    }
+	    for (std::streamsize i = 0; i < count; ++i)
+	    {
+		    str[i] = static_cast<char>(get());
+	    }
+	    return *this;
+    }
+
+    int websocket_stream_wrapper::get()
+    {
+	    return on_request.Dequeue();
+    }
+
+    bool websocket_stream_wrapper::bad()
+    {
+	    return !ws_.next_layer().socket().is_open();
+    }
+
+    websocket_stream_wrapper& websocket_stream_wrapper::write(const std::string& c)
+    {
+	    ws_.write(boost::asio::buffer(std::string(c)));
+	    return *this;
+    }
+
+
+    websocket_stream_wrapper& websocket_stream_wrapper::write(std::streamsize _s)
+    {
+	    std::ostringstream temp;
+	    temp << _s;
+	    ws_.write(boost::asio::buffer(temp.str()));
+	    return *this;
+    }
+
+    websocket_stream_wrapper& websocket_stream_wrapper::flush()
+    {
+	    return *this;
+    }
+
+    void websocket_stream_wrapper::clear()
+    {
+    }
+
+    std::string websocket_stream_wrapper::what()
+    {
+            if (!error_message.empty())
+                     return  error_message;
+
+	    if (!ws_.next_layer().socket().is_open())
+	    {
+		    return "Socket is not open.";
+	    }
+	    return {};
+    }
+
+    WebSocketServer::~WebSocketServer()
+	    {
+            delete d_ptr;
+	    }
+
+        WebSocketServer::WebSocketServer(const std::string& user_agent, const std::string& address, const std::string& port,
+            std::shared_ptr < MessageJsonHandler> json_handler,
+            std::shared_ptr < Endpoint> localEndPoint, lsp::Log& log, uint32_t _max_workers)
+            : point(json_handler,localEndPoint,log, _max_workers),d_ptr(new Data(user_agent,log))
+
+        {
+
+            d_ptr->work = std::make_shared<boost::asio::io_service::work>(d_ptr->io_context_);
+
+            // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
+            boost::asio::ip::tcp::resolver resolver(d_ptr->io_context_);
+            boost::asio::ip::tcp::endpoint endpoint =
+                *resolver.resolve(address, port).begin();
+            d_ptr->acceptor_.open(endpoint.protocol());
+            d_ptr->acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
+            try
+            {
+                d_ptr->acceptor_.bind(endpoint);
+            }
+            catch (boost::system::system_error & e)
+            {
+                std::string temp = "Socket Server  blid faild.";
+                d_ptr->_log.log(lsp::Log::Level::INFO , temp + e.what());
+                return;
+            }
+            d_ptr->acceptor_.listen();
+
+            do_accept();
+            std::string desc = "Socket WebSocketServer " + address + " " + port + " start.";
+            d_ptr->_log.log(lsp::Log::Level::INFO, desc);
+        }
+
+        void WebSocketServer::run()
+        {
+            // The io_context::run() call will block until all asynchronous operations
+            // have finished. While the WebSocketServer is running, there is always at least one
+            // asynchronous operation outstanding: the asynchronous accept call waiting
+            // for new incoming connections.
+            d_ptr->io_context_.run();
+
+        }
+
+        void WebSocketServer::stop()
+        {
+            try
+            {
+            	if(d_ptr->work)
+                    d_ptr->work.reset();
+
+                do_stop();
+            }
+            catch (...)
+            {
+            }
+        }
+
+        void WebSocketServer::do_accept()
+        {
+            d_ptr->acceptor_.async_accept(
+                [this](boost::system::error_code ec, boost::asio::ip::tcp::socket socket)
+                {
+                    // Check whether the WebSocketServer was stopped by a signal before this
+                    // completion handler had a chance to run.
+                    if (!d_ptr->acceptor_.is_open())
+                    {
+                        return;
+                    }
+                    if (!ec)
+                    {
+                    	if(d_ptr->_server_session)
+                    	{
+	                        try
+	                        {
+                                d_ptr->_server_session->close();
+                                point.Stop();
+	                        }
+	                        catch (...)
+	                        {
+	                        }
+                    	}
+                        d_ptr->_server_session = std::make_shared<server_session>(std::move(socket), d_ptr->user_agent_);
+                        d_ptr->_server_session->run();
+
+                        point.startProcessingMessages(d_ptr->_server_session->proxy_, d_ptr->_server_session->proxy_);
+                        do_accept();
+                    }
+
+                });
+        }
+
+        void WebSocketServer::do_stop()
+        {
+            d_ptr->acceptor_.close();
+
+          point.Stop();
+
+        }
+
+    } // namespace


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/WebSocketServer.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/WebSocketServer.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/WebSocketServer.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/WebSocketServer.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,87 @@
+#pragma once
+
+#include <boost/asio.hpp>
+#include <string>
+#include <boost/beast/core/tcp_stream.hpp>
+#include <boost/beast/websocket/stream.hpp>
+
+
+#include "RemoteEndPoint.h"
+#include "stream.h"
+#include "threaded_queue.h"
+
+namespace lsp {
+    class Log;
+}
+
+
+namespace lsp
+{
+
+
+
+        class websocket_stream_wrapper :public istream, public ostream
+        {
+        public:
+
+            websocket_stream_wrapper(boost::beast::websocket::stream<boost::beast::tcp_stream>& _w);
+
+            boost::beast::websocket::stream<boost::beast::tcp_stream>& ws_;
+            std::atomic<bool> quit{};
+            std::shared_ptr < MultiQueueWaiter> request_waiter;
+            ThreadedQueue< char > on_request;
+            std::string error_message;
+            bool fail() override;
+
+            bool eof() override;
+
+            bool good() override;
+
+            websocket_stream_wrapper& read(char* str, std::streamsize count) override;
+
+            int get() override;
+
+            bool bad() override;
+
+            websocket_stream_wrapper& write(const std::string& c) override;
+
+            websocket_stream_wrapper& write(std::streamsize _s) override;
+
+            websocket_stream_wrapper& flush() override;
+
+            void clear() override;
+
+            std::string what() override;
+        };
+
+        /// The top-level class of the HTTP server.
+        class WebSocketServer
+        {
+        public:
+            WebSocketServer(const WebSocketServer&) = delete;
+            WebSocketServer& operator=(const WebSocketServer&) = delete;
+            ~WebSocketServer();
+            /// Construct the server to listen on the specified TCP address and port, and
+            /// serve up files from the given directory.
+            explicit WebSocketServer(const std::string& user_agent, const std::string& address, const std::string& port,
+                std::shared_ptr < MessageJsonHandler> json_handler,
+                std::shared_ptr < Endpoint> localEndPoint, lsp::Log& ,uint32_t _max_workers = 2);
+
+            /// Run the server's io_context loop.
+            void run();
+            void stop();
+
+            RemoteEndPoint point;
+        private:
+            struct Data;
+            /// Perform an asynchronous accept operation.
+            void do_accept();
+
+            /// Wait for a request to stop the server.
+            void do_stop();
+            Data* d_ptr = nullptr;
+
+
+        };
+
+    } // namespace


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/WebSocketServer.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/json.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/json.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/json.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,81 @@
+#pragma once
+
+#include "serializer.h"
+
+#include <rapidjson/document.h>
+#include <rapidjson/prettywriter.h>
+
+class JsonReader : public Reader {
+
+  std::vector<const char*> path_;
+
+ public:
+	 rapidjson::GenericValue<rapidjson::UTF8<>>* m_;
+  JsonReader(rapidjson::GenericValue<rapidjson::UTF8<>>* m) : m_(m) {}
+  SerializeFormat Format() const override { return SerializeFormat::Json; }
+
+  bool IsBool() override { return m_->IsBool(); }
+  bool IsNull() override { return m_->IsNull(); }
+  bool IsArray() override { return m_->IsArray(); }
+  bool IsInt() override { return m_->IsInt(); }
+  bool IsInt64() override { return m_->IsInt64(); }
+  bool IsUint64() override { return m_->IsUint64(); }
+  bool IsDouble() override { return m_->IsDouble(); }
+  bool IsNumber() override { return m_->IsNumber(); }
+  bool IsString() override { return m_->IsString(); }
+
+  void GetNull() override {}
+  bool GetBool() override { return m_->GetBool(); }
+  int GetInt() override { return m_->GetInt(); }
+  uint32_t GetUint32() override { return uint32_t(m_->GetUint64()); }
+  int64_t GetInt64() override { return m_->GetInt64(); }
+  uint64_t GetUint64() override { return m_->GetUint64(); }
+  double GetDouble() override { return m_->GetDouble(); }
+  std::string GetString() override { return m_->GetString(); }
+
+  bool HasMember(const char* x) override
+  {
+	  if (m_->IsObject())
+		  return m_->HasMember(x);
+	  else
+		  return false;
+  }
+  std::unique_ptr<Reader> operator[](const char* x) override {
+    auto& sub = (*m_)[x];
+    return std::unique_ptr<JsonReader>(new JsonReader(&sub));
+  }
+
+  std::string ToString() const override;
+
+  void IterMap(std::function<void(const char*, Reader&)> fn) override;
+
+  void IterArray(std::function<void(Reader&)> fn) override;
+
+  void DoMember(const char* name, std::function<void(Reader&)> fn) override;
+
+  std::string GetPath() const;
+};
+
+class JsonWriter : public Writer {
+
+ public:
+	 rapidjson::Writer<rapidjson::StringBuffer>* m_;
+
+  JsonWriter(rapidjson::Writer<rapidjson::StringBuffer>* m) : m_(m) {}
+  SerializeFormat Format() const override { return SerializeFormat::Json; }
+
+  void Null() override { m_->Null(); }
+  void Bool(bool x) override { m_->Bool(x); }
+  void Int(int x) override { m_->Int(x); }
+  void Uint32(uint32_t x) override { m_->Uint64(x); }
+  void Int64(int64_t x) override { m_->Int64(x); }
+  void Uint64(uint64_t x) override { m_->Uint64(x); }
+  void Double(double x) override { m_->Double(x); }
+  void String(const char* x) override { m_->String(x); }
+  void String(const char* x, size_t len) override { m_->String(x, len); }
+  void StartArray(size_t) override { m_->StartArray(); }
+  void EndArray() override { m_->EndArray(); }
+  void StartObject() override { m_->StartObject(); }
+  void EndObject() override { m_->EndObject(); }
+  void Key(const char* name) override { m_->Key(name); }
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/json.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/lsRequestId.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/lsRequestId.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/lsRequestId.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,51 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+
+struct lsRequestId {
+	// The client can send the request id as an int or a string. We should output
+	// the same format we received.
+	enum Type { kNone, kInt, kString };
+	Type type = kNone;
+
+	int value = -1;
+	std::string  k_string;
+	bool has_value() const { return type != kNone; }
+	void swap(lsRequestId& arg) noexcept
+	{
+		std::swap(arg, *this);
+	}
+	void set(int v)
+	{
+		value = v;
+		type = kInt;
+	}
+	void set(const std::string& v)
+	{
+		k_string = v;
+		type = kString;
+	}
+	bool operator==(const lsRequestId& rhs) const
+	{
+		if (type != rhs.type) return  false;
+		if (type == kInt)
+			return  value == rhs.value;
+		return  k_string == rhs.k_string;
+	}
+	bool operator!=(const lsRequestId& rhs) const
+	{
+		return !operator==(rhs);
+	}
+	bool operator<(const lsRequestId& rhs) const
+	{
+		if (type != rhs.type) return  false;
+		if (type == kInt)
+			return  value < rhs.value;
+		return  k_string < rhs.k_string;
+	}
+};
+void Reflect(Reader& visitor, lsRequestId& value);
+void Reflect(Writer& visitor, lsRequestId& value);
+
+// Debug method to convert an id to a string.
+std::string ToString(const lsRequestId& id);
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/lsRequestId.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/lsResponseMessage.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/lsResponseMessage.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/lsResponseMessage.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,71 @@
+#pragma once
+#include "serializer.h"
+#include "lsRequestId.h"
+#include "LibLsp/JsonRpc/message.h"
+#include "LibLsp/lsp/method_type.h"
+
+
+struct ResponseInMessage :public LspMessage {
+
+	lsRequestId id;
+	std::string m_methodType;
+
+	virtual  MethodType GetMethodType() const override
+	{
+		return m_methodType.data();
+	};
+	virtual  void SetMethodType(MethodType _type) override
+	{
+		m_methodType = _type;
+	};
+
+	Kind GetKid() override
+	{
+		return  RESPONCE_MESSAGE;
+	}
+	virtual  bool IsErrorType()
+	{
+		return false;
+	}
+};
+template <class TDerived >
+struct BaseResponseMessage : ResponseInMessage {
+
+	void ReflectWriter(Writer& writer) override {
+		Reflect(writer, static_cast<TDerived&>(*this));
+	}
+	static std::unique_ptr<LspMessage> ReflectReader(Reader& visitor) {
+
+		TDerived* temp = new TDerived();
+		std::unique_ptr<TDerived>  message = std::unique_ptr<TDerived>(temp);
+		// Reflect may throw and *message will be partially deserialized.
+		Reflect(visitor, static_cast<TDerived&>(*temp));
+		return message;
+	}
+
+};
+
+
+template <class T, class TDerived >
+struct ResponseMessage : BaseResponseMessage<TDerived> {
+	T result;
+	void swap(ResponseMessage<T, TDerived>& arg) noexcept
+	{
+		std::swap(result, arg.result);
+		this->id.swap(arg.id);
+		this->m_methodType.swap(arg.m_methodType);
+	}
+};
+
+template <class T, class TDerived >
+struct ResponseError : BaseResponseMessage<TDerived> {
+	T error;
+	bool IsErrorType() override { return true; }
+	void swap(ResponseError<T, TDerived>& arg) noexcept
+	{
+
+		this->id.swap(arg.id);
+		this->m_methodType.swap(arg.m_methodType);
+		std::swap(error, arg.error);
+	}
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/lsResponseMessage.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/message.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/message.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/message.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,88 @@
+#include "message.h"
+#include <rapidjson/stringbuffer.h>
+#include <rapidjson/writer.h>
+#include "serializer.h"
+#include "lsRequestId.h"
+#include "RequestInMessage.h"
+#include "Condition.h"
+#include "json.h"
+
+void LspMessage::Write(std::ostream& out) {
+	rapidjson::StringBuffer output;
+	rapidjson::Writer<rapidjson::StringBuffer> writer(output);
+	JsonWriter json_writer{ &writer };
+	ReflectWriter(json_writer);
+
+	const auto value = std::string("Content-Length: ") + std::to_string(output.GetSize()) + "\r\n\r\n" + output.GetString();
+	out << value;
+	out.flush();
+}
+
+std::string LspMessage::ToJson() {
+	rapidjson::StringBuffer output;
+	rapidjson::Writer<rapidjson::StringBuffer> writer(output);
+	JsonWriter json_writer{ &writer };
+	this->ReflectWriter(json_writer);
+	return  output.GetString();
+}
+
+void Reflect(Reader& visitor, lsRequestId& value) {
+	if (visitor.IsInt()) {
+		value.type = lsRequestId::kInt;
+		value.value = visitor.GetInt();
+	}
+	else if (visitor.IsInt64()) {
+		value.type = lsRequestId::kInt;
+		// `lsRequestId.value` is an `int`, so we're forced to truncate.
+		value.value = static_cast<int>(visitor.GetInt64());
+	}
+	else if (visitor.IsString()) {
+		value.type = lsRequestId::kString;
+		value.k_string = visitor.GetString();
+		value.value = atoi(value.k_string.c_str());
+		
+	}
+	else {
+		value.type = lsRequestId::kNone;
+		value.value = -1;
+	}
+}
+
+void Reflect(Writer& visitor, lsRequestId& value) {
+	switch (value.type) {
+	case lsRequestId::kNone:
+		visitor.Null();
+		break;
+	case lsRequestId::kInt:
+		visitor.Int(value.value);
+		break;
+	case lsRequestId::kString:
+		
+		if(value.k_string.empty())
+		{
+			std::string str = std::to_string(value.value);
+			visitor.String(str.c_str(), str.length());
+		}
+		else
+		{
+			visitor.String(value.k_string.c_str(), value.k_string.length());
+		}
+		break;
+	}
+}
+
+std::string ToString(const lsRequestId& id) {
+	if (id.type != lsRequestId::kNone)
+	{
+		if(id.type == lsRequestId::kString)
+		{
+			if (!id.k_string.empty())
+				return id.k_string;
+		}
+		return std::to_string(id.value);
+	}
+	
+	return "";
+}
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/message.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/message.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/message.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/message.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,34 @@
+#pragma once
+
+#include <atomic>
+#include <string>
+#include <iostream>
+#include <LibLsp/JsonRpc/serializer.h>
+#include "LibLsp/lsp/method_type.h"
+
+struct LspMessage
+{
+public:
+	std::string jsonrpc = "2.0";
+	virtual void ReflectWriter(Writer&)   = 0;
+
+	// Send the message to the language client by writing it to stdout.
+	void Write(std::ostream& out);
+	
+
+	virtual MethodType GetMethodType() const = 0;
+	virtual void SetMethodType(MethodType) = 0;
+	
+	virtual ~LspMessage()=default;
+	enum Kind
+	{
+		REQUEST_MESSAGE,
+		RESPONCE_MESSAGE,
+		NOTIFICATION_MESSAGE
+	};
+
+	virtual  Kind GetKid() = 0;
+	virtual std::string ToJson()  ;
+	
+};
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/message.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/optional.hpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/optional.hpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/optional.hpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,1846 @@
+//
+// Copyright (c) 2014-2021 Martin Moene
+//
+// https://github.com/martinmoene/optional-lite
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#pragma once
+
+#ifndef NONSTD_OPTIONAL_LITE_HPP
+#define NONSTD_OPTIONAL_LITE_HPP
+
+#define optional_lite_MAJOR  3
+#define optional_lite_MINOR  5
+#define optional_lite_PATCH  0
+
+#define optional_lite_VERSION  optional_STRINGIFY(optional_lite_MAJOR) "." optional_STRINGIFY(optional_lite_MINOR) "." optional_STRINGIFY(optional_lite_PATCH)
+
+#define optional_STRINGIFY(  x )  optional_STRINGIFY_( x )
+#define optional_STRINGIFY_( x )  #x
+
+// optional-lite configuration:
+
+#define optional_OPTIONAL_DEFAULT  0
+#define optional_OPTIONAL_NONSTD   1
+#define optional_OPTIONAL_STD      2
+
+// tweak header support:
+
+#ifdef __has_include
+# if __has_include(<nonstd/optional.tweak.hpp>)
+#  include <nonstd/optional.tweak.hpp>
+# endif
+#define optional_HAVE_TWEAK_HEADER  1
+#else
+#define optional_HAVE_TWEAK_HEADER  0
+//# pragma message("optional.hpp: Note: Tweak header not supported.")
+#endif
+
+// optional selection and configuration:
+
+#if !defined( optional_CONFIG_SELECT_OPTIONAL )
+# define optional_CONFIG_SELECT_OPTIONAL  ( optional_HAVE_STD_OPTIONAL ? optional_OPTIONAL_STD : optional_OPTIONAL_NONSTD )
+#endif
+
+// Control presence of extensions:
+
+#ifndef optional_CONFIG_NO_EXTENSIONS
+#define optional_CONFIG_NO_EXTENSIONS  0
+#endif
+
+// Control presence of exception handling (try and auto discover):
+
+#ifndef optional_CONFIG_NO_EXCEPTIONS
+# if defined(_MSC_VER)
+# include <cstddef>     // for _HAS_EXCEPTIONS
+# endif
+# if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || (_HAS_EXCEPTIONS)
+#  define optional_CONFIG_NO_EXCEPTIONS  0
+# else
+#  define optional_CONFIG_NO_EXCEPTIONS  1
+# endif
+#endif
+
+// C++ language version detection (C++20 is speculative):
+// Note: VC14.0/1900 (VS2015) lacks too much from C++14.
+
+#ifndef   optional_CPLUSPLUS
+# if defined(_MSVC_LANG ) && !defined(__clang__)
+#  define optional_CPLUSPLUS  (_MSC_VER == 1900 ? 201103L : _MSVC_LANG )
+# else
+#  define optional_CPLUSPLUS  __cplusplus
+# endif
+#endif
+
+#define optional_CPP98_OR_GREATER  ( optional_CPLUSPLUS >= 199711L )
+#define optional_CPP11_OR_GREATER  ( optional_CPLUSPLUS >= 201103L )
+#define optional_CPP11_OR_GREATER_ ( optional_CPLUSPLUS >= 201103L )
+#define optional_CPP14_OR_GREATER  ( optional_CPLUSPLUS >= 201402L )
+#define optional_CPP17_OR_GREATER  ( optional_CPLUSPLUS >= 201703L )
+#define optional_CPP20_OR_GREATER  ( optional_CPLUSPLUS >= 202000L )
+
+// C++ language version (represent 98 as 3):
+
+#define optional_CPLUSPLUS_V  ( optional_CPLUSPLUS / 100 - (optional_CPLUSPLUS > 200000 ? 2000 : 1994) )
+
+// Use C++17 std::optional if available and requested:
+
+#if optional_CPP17_OR_GREATER && defined(__has_include )
+# if __has_include( <optional> )
+#  define optional_HAVE_STD_OPTIONAL  1
+# else
+#  define optional_HAVE_STD_OPTIONAL  0
+# endif
+#else
+# define  optional_HAVE_STD_OPTIONAL  0
+#endif
+
+#define optional_USES_STD_OPTIONAL  ( (optional_CONFIG_SELECT_OPTIONAL == optional_OPTIONAL_STD) || ((optional_CONFIG_SELECT_OPTIONAL == optional_OPTIONAL_DEFAULT) && optional_HAVE_STD_OPTIONAL) )
+
+//
+// in_place: code duplicated in any-lite, expected-lite, optional-lite, value-ptr-lite, variant-lite:
+//
+
+#ifndef nonstd_lite_HAVE_IN_PLACE_TYPES
+#define nonstd_lite_HAVE_IN_PLACE_TYPES  1
+
+// C++17 std::in_place in <utility>:
+
+#if optional_CPP17_OR_GREATER
+
+#include <utility>
+
+namespace nonstd {
+
+using std::in_place;
+using std::in_place_type;
+using std::in_place_index;
+using std::in_place_t;
+using std::in_place_type_t;
+using std::in_place_index_t;
+
+#define nonstd_lite_in_place_t(      T)  std::in_place_t
+#define nonstd_lite_in_place_type_t( T)  std::in_place_type_t<T>
+#define nonstd_lite_in_place_index_t(K)  std::in_place_index_t<K>
+
+#define nonstd_lite_in_place(      T)    std::in_place_t{}
+#define nonstd_lite_in_place_type( T)    std::in_place_type_t<T>{}
+#define nonstd_lite_in_place_index(K)    std::in_place_index_t<K>{}
+
+} // namespace nonstd
+
+#else // optional_CPP17_OR_GREATER
+
+#include <cstddef>
+
+namespace nonstd {
+namespace detail {
+
+template< class T >
+struct in_place_type_tag {};
+
+template< std::size_t K >
+struct in_place_index_tag {};
+
+} // namespace detail
+
+struct in_place_t {};
+
+template< class T >
+inline in_place_t in_place( detail::in_place_type_tag<T> /*unused*/ = detail::in_place_type_tag<T>() )
+{
+    return in_place_t();
+}
+
+template< std::size_t K >
+inline in_place_t in_place( detail::in_place_index_tag<K> /*unused*/ = detail::in_place_index_tag<K>() )
+{
+    return in_place_t();
+}
+
+template< class T >
+inline in_place_t in_place_type( detail::in_place_type_tag<T> /*unused*/ = detail::in_place_type_tag<T>() )
+{
+    return in_place_t();
+}
+
+template< std::size_t K >
+inline in_place_t in_place_index( detail::in_place_index_tag<K> /*unused*/ = detail::in_place_index_tag<K>() )
+{
+    return in_place_t();
+}
+
+// mimic templated typedef:
+
+#define nonstd_lite_in_place_t(      T)  nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag<T>  )
+#define nonstd_lite_in_place_type_t( T)  nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag<T>  )
+#define nonstd_lite_in_place_index_t(K)  nonstd::in_place_t(&)( nonstd::detail::in_place_index_tag<K> )
+
+#define nonstd_lite_in_place(      T)    nonstd::in_place_type<T>
+#define nonstd_lite_in_place_type( T)    nonstd::in_place_type<T>
+#define nonstd_lite_in_place_index(K)    nonstd::in_place_index<K>
+
+} // namespace nonstd
+
+#endif // optional_CPP17_OR_GREATER
+#endif // nonstd_lite_HAVE_IN_PLACE_TYPES
+
+//
+// Using std::optional:
+//
+
+#if optional_USES_STD_OPTIONAL
+
+#include <optional>
+
+namespace nonstd {
+
+    using std::optional;
+    using std::bad_optional_access;
+    using std::hash;
+
+    using std::nullopt;
+    using std::nullopt_t;
+
+    using std::operator==;
+    using std::operator!=;
+    using std::operator<;
+    using std::operator<=;
+    using std::operator>;
+    using std::operator>=;
+    using std::make_optional;
+    using std::swap;
+}
+
+#else // optional_USES_STD_OPTIONAL
+
+#include <cassert>
+#include <utility>
+
+// optional-lite alignment configuration:
+
+#ifndef  optional_CONFIG_MAX_ALIGN_HACK
+# define optional_CONFIG_MAX_ALIGN_HACK  0
+#endif
+
+#ifndef  optional_CONFIG_ALIGN_AS
+// no default, used in #if defined()
+#endif
+
+#ifndef  optional_CONFIG_ALIGN_AS_FALLBACK
+# define optional_CONFIG_ALIGN_AS_FALLBACK  double
+#endif
+
+// Compiler warning suppression:
+
+#if defined(__clang__)
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wundef"
+#elif defined(__GNUC__)
+# pragma GCC   diagnostic push
+# pragma GCC   diagnostic ignored "-Wundef"
+#elif defined(_MSC_VER )
+# pragma warning( push )
+#endif
+
+// half-open range [lo..hi):
+#define optional_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) )
+
+// Compiler versions:
+//
+// MSVC++  6.0  _MSC_VER == 1200  optional_COMPILER_MSVC_VERSION ==  60  (Visual Studio 6.0)
+// MSVC++  7.0  _MSC_VER == 1300  optional_COMPILER_MSVC_VERSION ==  70  (Visual Studio .NET 2002)
+// MSVC++  7.1  _MSC_VER == 1310  optional_COMPILER_MSVC_VERSION ==  71  (Visual Studio .NET 2003)
+// MSVC++  8.0  _MSC_VER == 1400  optional_COMPILER_MSVC_VERSION ==  80  (Visual Studio 2005)
+// MSVC++  9.0  _MSC_VER == 1500  optional_COMPILER_MSVC_VERSION ==  90  (Visual Studio 2008)
+// MSVC++ 10.0  _MSC_VER == 1600  optional_COMPILER_MSVC_VERSION == 100  (Visual Studio 2010)
+// MSVC++ 11.0  _MSC_VER == 1700  optional_COMPILER_MSVC_VERSION == 110  (Visual Studio 2012)
+// MSVC++ 12.0  _MSC_VER == 1800  optional_COMPILER_MSVC_VERSION == 120  (Visual Studio 2013)
+// MSVC++ 14.0  _MSC_VER == 1900  optional_COMPILER_MSVC_VERSION == 140  (Visual Studio 2015)
+// MSVC++ 14.1  _MSC_VER >= 1910  optional_COMPILER_MSVC_VERSION == 141  (Visual Studio 2017)
+// MSVC++ 14.2  _MSC_VER >= 1920  optional_COMPILER_MSVC_VERSION == 142  (Visual Studio 2019)
+
+#if defined(_MSC_VER ) && !defined(__clang__)
+# define optional_COMPILER_MSVC_VER      (_MSC_VER )
+# define optional_COMPILER_MSVC_VERSION  (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900 ) ) )
+#else
+# define optional_COMPILER_MSVC_VER      0
+# define optional_COMPILER_MSVC_VERSION  0
+#endif
+
+#define optional_COMPILER_VERSION( major, minor, patch )  ( 10 * (10 * (major) + (minor) ) + (patch) )
+
+#if defined(__GNUC__) && !defined(__clang__)
+# define optional_COMPILER_GNUC_VERSION   optional_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+#else
+# define optional_COMPILER_GNUC_VERSION   0
+#endif
+
+#if defined(__clang__)
+# define optional_COMPILER_CLANG_VERSION  optional_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
+#else
+# define optional_COMPILER_CLANG_VERSION  0
+#endif
+
+#if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 70, 140 )
+# pragma warning( disable: 4345 )   // initialization behavior changed
+#endif
+
+#if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 70, 150 )
+# pragma warning( disable: 4814 )   // in C++14 'constexpr' will not imply 'const'
+#endif
+
+// Presence of language and library features:
+
+#define optional_HAVE(FEATURE) ( optional_HAVE_##FEATURE )
+
+#ifdef _HAS_CPP0X
+# define optional_HAS_CPP0X  _HAS_CPP0X
+#else
+# define optional_HAS_CPP0X  0
+#endif
+
+// Unless defined otherwise below, consider VC14 as C++11 for optional-lite:
+
+#if optional_COMPILER_MSVC_VER >= 1900
+# undef  optional_CPP11_OR_GREATER
+# define optional_CPP11_OR_GREATER  1
+#endif
+
+#define optional_CPP11_90   (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1500)
+#define optional_CPP11_100  (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1600)
+#define optional_CPP11_110  (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1700)
+#define optional_CPP11_120  (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1800)
+#define optional_CPP11_140  (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1900)
+#define optional_CPP11_141  (optional_CPP11_OR_GREATER_ || optional_COMPILER_MSVC_VER >= 1910)
+
+#define optional_CPP14_000  (optional_CPP14_OR_GREATER)
+#define optional_CPP17_000  (optional_CPP17_OR_GREATER)
+
+// clang >= 2.9, gcc >= 4.9, msvc >= vc14.0/1900 (vs15):
+#define optional_CPP11_140_C290_G490    ((optional_CPP11_OR_GREATER_ && (optional_COMPILER_CLANG_VERSION >= 290 || optional_COMPILER_GNUC_VERSION >= 490)) || (optional_COMPILER_MSVC_VER >= 1900))
+
+// clang >= 3.5, msvc >= vc11 (vs12):
+#define optional_CPP11_110_C350         ( optional_CPP11_110 && !optional_BETWEEN( optional_COMPILER_CLANG_VERSION, 1, 350 ) )
+
+// clang >= 3.5, gcc >= 5.0, msvc >= vc11 (vs12):
+#define optional_CPP11_110_C350_G500 \
+    (  optional_CPP11_110 && \
+    !( optional_BETWEEN( optional_COMPILER_CLANG_VERSION, 1, 350 ) \
+    || optional_BETWEEN( optional_COMPILER_GNUC_VERSION , 1, 500 ) ) )
+
+// Presence of C++11 language features:
+
+#define optional_HAVE_CONSTEXPR_11      optional_CPP11_140
+#define optional_HAVE_IS_DEFAULT        optional_CPP11_140
+#define optional_HAVE_NOEXCEPT          optional_CPP11_140
+#define optional_HAVE_NULLPTR           optional_CPP11_100
+#define optional_HAVE_REF_QUALIFIER     optional_CPP11_140_C290_G490
+#define optional_HAVE_STATIC_ASSERT     optional_CPP11_110
+#define optional_HAVE_INITIALIZER_LIST  optional_CPP11_140
+
+// Presence of C++14 language features:
+
+#define optional_HAVE_CONSTEXPR_14      optional_CPP14_000
+
+// Presence of C++17 language features:
+
+#define optional_HAVE_NODISCARD         optional_CPP17_000
+
+// Presence of C++ library features:
+
+#define optional_HAVE_CONDITIONAL       optional_CPP11_120
+#define optional_HAVE_REMOVE_CV         optional_CPP11_120
+#define optional_HAVE_TYPE_TRAITS       optional_CPP11_90
+
+#define optional_HAVE_TR1_TYPE_TRAITS   (!! optional_COMPILER_GNUC_VERSION )
+#define optional_HAVE_TR1_ADD_POINTER   (!! optional_COMPILER_GNUC_VERSION )
+
+#define optional_HAVE_IS_ASSIGNABLE                     optional_CPP11_110_C350
+#define optional_HAVE_IS_MOVE_CONSTRUCTIBLE             optional_CPP11_110_C350
+#define optional_HAVE_IS_NOTHROW_MOVE_ASSIGNABLE        optional_CPP11_110_C350
+#define optional_HAVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE     optional_CPP11_110_C350
+#define optional_HAVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE   optional_CPP11_110_C350_G500
+#define optional_HAVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE   optional_CPP11_110_C350_G500
+
+// C++ feature usage:
+
+#if optional_HAVE( CONSTEXPR_11 )
+# define optional_constexpr  constexpr
+#else
+# define optional_constexpr  /*constexpr*/
+#endif
+
+#if optional_HAVE( IS_DEFAULT )
+# define optional_is_default  = default;
+#else
+# define optional_is_default  {}
+#endif
+
+#if optional_HAVE( CONSTEXPR_14 )
+# define optional_constexpr14  constexpr
+#else
+# define optional_constexpr14  /*constexpr*/
+#endif
+
+#if optional_HAVE( NODISCARD )
+# define optional_nodiscard  [[nodiscard]]
+#else
+# define optional_nodiscard  /*[[nodiscard]]*/
+#endif
+
+#if optional_HAVE( NOEXCEPT )
+# define optional_noexcept  noexcept
+#else
+# define optional_noexcept  /*noexcept*/
+#endif
+
+#if optional_HAVE( NULLPTR )
+# define optional_nullptr  nullptr
+#else
+# define optional_nullptr  NULL
+#endif
+
+#if optional_HAVE( REF_QUALIFIER )
+// NOLINTNEXTLINE( bugprone-macro-parentheses )
+# define optional_ref_qual  &
+# define optional_refref_qual  &&
+#else
+# define optional_ref_qual  /*&*/
+# define optional_refref_qual  /*&&*/
+#endif
+
+#if optional_HAVE( STATIC_ASSERT )
+# define optional_static_assert(expr, text)    static_assert(expr, text);
+#else
+# define optional_static_assert(expr, text)  /*static_assert(expr, text);*/
+#endif
+
+// additional includes:
+
+#if optional_CONFIG_NO_EXCEPTIONS
+// already included: <cassert>
+#else
+# include <stdexcept>
+#endif
+
+#if optional_CPP11_OR_GREATER
+# include <functional>
+#endif
+
+#if optional_HAVE( INITIALIZER_LIST )
+# include <initializer_list>
+#endif
+
+#if optional_HAVE( TYPE_TRAITS )
+# include <type_traits>
+#elif optional_HAVE( TR1_TYPE_TRAITS )
+# include <tr1/type_traits>
+#endif
+
+// Method enabling
+
+#if optional_CPP11_OR_GREATER
+
+#define optional_REQUIRES_0(...) \
+    template< bool B = (__VA_ARGS__), typename std::enable_if<B, int>::type = 0 >
+
+#define optional_REQUIRES_T(...) \
+    , typename std::enable_if< (__VA_ARGS__), int >::type = 0
+
+#define optional_REQUIRES_R(R, ...) \
+    typename std::enable_if< (__VA_ARGS__), R>::type
+
+#define optional_REQUIRES_A(...) \
+    , typename std::enable_if< (__VA_ARGS__), void*>::type = nullptr
+
+#endif
+
+//
+// optional:
+//
+
+namespace nonstd { namespace optional_lite {
+
+namespace std11 {
+
+template< class T, T v > struct integral_constant { enum { value = v }; };
+template< bool B       > struct bool_constant : integral_constant<bool, B>{};
+
+typedef bool_constant< true  > true_type;
+typedef bool_constant< false > false_type;
+
+#if optional_CPP11_OR_GREATER
+    using std::move;
+#else
+    template< typename T > T & move( T & t ) { return t; }
+#endif
+
+#if optional_HAVE( CONDITIONAL )
+    using std::conditional;
+#else
+    template< bool B, typename T, typename F > struct conditional              { typedef T type; };
+    template<         typename T, typename F > struct conditional<false, T, F> { typedef F type; };
+#endif // optional_HAVE_CONDITIONAL
+
+#if optional_HAVE( IS_ASSIGNABLE )
+    using std::is_assignable;
+#else
+    template< class T, class U > struct is_assignable : std11::true_type{};
+#endif
+
+#if optional_HAVE( IS_MOVE_CONSTRUCTIBLE )
+    using std::is_move_constructible;
+#else
+    template< class T > struct is_move_constructible : std11::true_type{};
+#endif
+
+#if optional_HAVE( IS_NOTHROW_MOVE_ASSIGNABLE )
+    using std::is_nothrow_move_assignable;
+#else
+    template< class T > struct is_nothrow_move_assignable : std11::true_type{};
+#endif
+
+#if optional_HAVE( IS_NOTHROW_MOVE_CONSTRUCTIBLE )
+    using std::is_nothrow_move_constructible;
+#else
+    template< class T > struct is_nothrow_move_constructible : std11::true_type{};
+#endif
+
+#if optional_HAVE( IS_TRIVIALLY_COPY_CONSTRUCTIBLE )
+    using std::is_trivially_copy_constructible;
+#else
+    template< class T > struct is_trivially_copy_constructible : std11::true_type{};
+#endif
+
+#if optional_HAVE( IS_TRIVIALLY_MOVE_CONSTRUCTIBLE )
+    using std::is_trivially_move_constructible;
+#else
+    template< class T > struct is_trivially_move_constructible : std11::true_type{};
+#endif
+
+} // namespace std11
+
+#if optional_CPP11_OR_GREATER
+
+/// type traits C++17:
+
+namespace std17 {
+
+#if optional_CPP17_OR_GREATER
+
+using std::is_swappable;
+using std::is_nothrow_swappable;
+
+#elif optional_CPP11_OR_GREATER
+
+namespace detail {
+
+using std::swap;
+
+struct is_swappable
+{
+    template< typename T, typename = decltype( swap( std::declval<T&>(), std::declval<T&>() ) ) >
+    static std11::true_type test( int /*unused*/ );
+
+    template< typename >
+    static std11::false_type test(...);
+};
+
+struct is_nothrow_swappable
+{
+    // wrap noexcept(expr) in separate function as work-around for VC140 (VS2015):
+
+    template< typename T >
+    static constexpr bool satisfies()
+    {
+        return noexcept( swap( std::declval<T&>(), std::declval<T&>() ) );
+    }
+
+    template< typename T >
+    static auto test( int /*unused*/ ) -> std11::integral_constant<bool, satisfies<T>()>{}
+
+    template< typename >
+    static auto test(...) -> std11::false_type;
+};
+
+} // namespace detail
+
+// is [nothow] swappable:
+
+template< typename T >
+struct is_swappable : decltype( detail::is_swappable::test<T>(0) ){};
+
+template< typename T >
+struct is_nothrow_swappable : decltype( detail::is_nothrow_swappable::test<T>(0) ){};
+
+#endif // optional_CPP17_OR_GREATER
+
+} // namespace std17
+
+/// type traits C++20:
+
+namespace std20 {
+
+template< typename T >
+struct remove_cvref
+{
+    typedef typename std::remove_cv< typename std::remove_reference<T>::type >::type type;
+};
+
+} // namespace std20
+
+#endif // optional_CPP11_OR_GREATER
+
+/// class optional
+
+template< typename T >
+class optional;
+
+namespace detail {
+
+// C++11 emulation:
+
+struct nulltype{};
+
+template< typename Head, typename Tail >
+struct typelist
+{
+    typedef Head head;
+    typedef Tail tail;
+};
+
+#if optional_CONFIG_MAX_ALIGN_HACK
+
+// Max align, use most restricted type for alignment:
+
+#define optional_UNIQUE(  name )       optional_UNIQUE2( name, __LINE__ )
+#define optional_UNIQUE2( name, line ) optional_UNIQUE3( name, line )
+#define optional_UNIQUE3( name, line ) name ## line
+
+#define optional_ALIGN_TYPE( type ) \
+    type optional_UNIQUE( _t ); struct_t< type > optional_UNIQUE( _st )
+
+template< typename T >
+struct struct_t { T _; };
+
+union max_align_t
+{
+    optional_ALIGN_TYPE( char );
+    optional_ALIGN_TYPE( short int );
+    optional_ALIGN_TYPE( int );
+    optional_ALIGN_TYPE( long int  );
+    optional_ALIGN_TYPE( float  );
+    optional_ALIGN_TYPE( double );
+    optional_ALIGN_TYPE( long double );
+    optional_ALIGN_TYPE( char * );
+    optional_ALIGN_TYPE( short int * );
+    optional_ALIGN_TYPE( int *  );
+    optional_ALIGN_TYPE( long int * );
+    optional_ALIGN_TYPE( float * );
+    optional_ALIGN_TYPE( double * );
+    optional_ALIGN_TYPE( long double * );
+    optional_ALIGN_TYPE( void * );
+
+#ifdef HAVE_LONG_LONG
+    optional_ALIGN_TYPE( long long );
+#endif
+
+    struct Unknown;
+
+    Unknown ( * optional_UNIQUE(_) )( Unknown );
+    Unknown * Unknown::* optional_UNIQUE(_);
+    Unknown ( Unknown::* optional_UNIQUE(_) )( Unknown );
+
+    struct_t< Unknown ( * )( Unknown)         > optional_UNIQUE(_);
+    struct_t< Unknown * Unknown::*            > optional_UNIQUE(_);
+    struct_t< Unknown ( Unknown::* )(Unknown) > optional_UNIQUE(_);
+};
+
+#undef optional_UNIQUE
+#undef optional_UNIQUE2
+#undef optional_UNIQUE3
+
+#undef optional_ALIGN_TYPE
+
+#elif defined( optional_CONFIG_ALIGN_AS ) // optional_CONFIG_MAX_ALIGN_HACK
+
+// Use user-specified type for alignment:
+
+#define optional_ALIGN_AS( unused ) \
+    optional_CONFIG_ALIGN_AS
+
+#else // optional_CONFIG_MAX_ALIGN_HACK
+
+// Determine POD type to use for alignment:
+
+#define optional_ALIGN_AS( to_align ) \
+    typename type_of_size< alignment_types, alignment_of< to_align >::value >::type
+
+template< typename T >
+struct alignment_of;
+
+template< typename T >
+struct alignment_of_hack
+{
+    char c;
+    T t;
+    alignment_of_hack();
+};
+
+template< size_t A, size_t S >
+struct alignment_logic
+{
+    enum { value = A < S ? A : S };
+};
+
+template< typename T >
+struct alignment_of
+{
+    enum { value = alignment_logic<
+        sizeof( alignment_of_hack<T> ) - sizeof(T), sizeof(T) >::value };
+};
+
+template< typename List, size_t N >
+struct type_of_size
+{
+    typedef typename std11::conditional<
+        N == sizeof( typename List::head ),
+            typename List::head,
+            typename type_of_size<typename List::tail, N >::type >::type type;
+};
+
+template< size_t N >
+struct type_of_size< nulltype, N >
+{
+    typedef optional_CONFIG_ALIGN_AS_FALLBACK type;
+};
+
+template< typename T>
+struct struct_t { T _; };
+
+#define optional_ALIGN_TYPE( type ) \
+    typelist< type , typelist< struct_t< type >
+
+struct Unknown;
+
+typedef
+    optional_ALIGN_TYPE( char ),
+    optional_ALIGN_TYPE( short ),
+    optional_ALIGN_TYPE( int ),
+    optional_ALIGN_TYPE( long ),
+    optional_ALIGN_TYPE( float ),
+    optional_ALIGN_TYPE( double ),
+    optional_ALIGN_TYPE( long double ),
+
+    optional_ALIGN_TYPE( char *),
+    optional_ALIGN_TYPE( short * ),
+    optional_ALIGN_TYPE( int * ),
+    optional_ALIGN_TYPE( long * ),
+    optional_ALIGN_TYPE( float * ),
+    optional_ALIGN_TYPE( double * ),
+    optional_ALIGN_TYPE( long double * ),
+
+    optional_ALIGN_TYPE( Unknown ( * )( Unknown ) ),
+    optional_ALIGN_TYPE( Unknown * Unknown::*     ),
+    optional_ALIGN_TYPE( Unknown ( Unknown::* )( Unknown ) ),
+
+    nulltype
+    > > > > > > >    > > > > > > >
+    > > > > > > >    > > > > > > >
+    > > > > > >
+    alignment_types;
+
+#undef optional_ALIGN_TYPE
+
+#endif // optional_CONFIG_MAX_ALIGN_HACK
+
+/// C++03 constructed union to hold value.
+
+template< typename T >
+union storage_t
+{
+//private:
+//    template< typename > friend class optional;
+
+    typedef T value_type;
+
+    storage_t() optional_is_default
+
+    explicit storage_t( value_type const & v )
+    {
+        construct_value( v );
+    }
+
+    void construct_value( value_type const & v )
+    {
+        ::new( value_ptr() ) value_type( v );
+    }
+
+#if optional_CPP11_OR_GREATER
+
+    explicit storage_t( value_type && v )
+    {
+        construct_value( std::move( v ) );
+    }
+
+    void construct_value( value_type && v )
+    {
+        ::new( value_ptr() ) value_type( std::move( v ) );
+    }
+
+    template< class... Args >
+    storage_t( nonstd_lite_in_place_t(T), Args&&... args )
+    {
+        emplace( std::forward<Args>(args)... );
+    }
+
+    template< class... Args >
+    void emplace( Args&&... args )
+    {
+        ::new( value_ptr() ) value_type( std::forward<Args>(args)... );
+    }
+
+    template< class U, class... Args >
+    void emplace( std::initializer_list<U> il, Args&&... args )
+    {
+        ::new( value_ptr() ) value_type( il, std::forward<Args>(args)... );
+    }
+
+#endif
+
+    void destruct_value()
+    {
+        value_ptr()->~T();
+    }
+
+    optional_nodiscard value_type const * value_ptr() const
+    {
+        return as<value_type>();
+    }
+
+    value_type * value_ptr()
+    {
+        return as<value_type>();
+    }
+
+    optional_nodiscard value_type const & value() const optional_ref_qual
+    {
+        return * value_ptr();
+    }
+
+    value_type & value() optional_ref_qual
+    {
+        return * value_ptr();
+    }
+
+#if optional_HAVE( REF_QUALIFIER )
+
+    optional_nodiscard value_type const && value() const optional_refref_qual
+    {
+        return std::move( value() );
+    }
+
+    value_type && value() optional_refref_qual
+    {
+        return std::move( value() );
+    }
+
+#endif
+
+#if optional_CPP11_OR_GREATER
+
+    using aligned_storage_t = typename std::aligned_storage< sizeof(value_type), alignof(value_type) >::type;
+    aligned_storage_t data;
+
+#elif optional_CONFIG_MAX_ALIGN_HACK
+
+    typedef struct { unsigned char data[ sizeof(value_type) ]; } aligned_storage_t;
+
+    max_align_t hack;
+    aligned_storage_t data;
+
+#else
+    typedef optional_ALIGN_AS(value_type) align_as_type;
+
+    typedef struct { align_as_type data[ 1 + ( sizeof(value_type) - 1 ) / sizeof(align_as_type) ]; } aligned_storage_t;
+    aligned_storage_t data;
+
+#   undef optional_ALIGN_AS
+
+#endif // optional_CONFIG_MAX_ALIGN_HACK
+
+    optional_nodiscard void * ptr() optional_noexcept
+    {
+        return &data;
+    }
+
+    optional_nodiscard void const * ptr() const optional_noexcept
+    {
+        return &data;
+    }
+
+    template <typename U>
+    optional_nodiscard U * as()
+    {
+        return reinterpret_cast<U*>( ptr() );
+    }
+
+    template <typename U>
+    optional_nodiscard U const * as() const
+    {
+        return reinterpret_cast<U const *>( ptr() );
+    }
+};
+
+} // namespace detail
+
+/// disengaged state tag
+
+struct nullopt_t
+{
+    struct init{};
+    explicit optional_constexpr nullopt_t( init /*unused*/ ) optional_noexcept {}
+};
+
+#if optional_HAVE( CONSTEXPR_11 )
+constexpr nullopt_t nullopt{ nullopt_t::init{} };
+#else
+// extra parenthesis to prevent the most vexing parse:
+const nullopt_t nullopt(( nullopt_t::init() ));
+#endif
+
+/// optional access error
+
+#if ! optional_CONFIG_NO_EXCEPTIONS
+
+class bad_optional_access : public std::logic_error
+{
+public:
+  explicit bad_optional_access()
+  : logic_error( "bad optional access" ) {}
+};
+
+#endif //optional_CONFIG_NO_EXCEPTIONS
+
+/// optional
+
+template< typename T>
+class optional
+{
+    optional_static_assert(( !std::is_same<typename std::remove_cv<T>::type, nullopt_t>::value  ),
+        "T in optional<T> must not be of type 'nullopt_t'.")
+
+    optional_static_assert(( !std::is_same<typename std::remove_cv<T>::type, in_place_t>::value ),
+        "T in optional<T> must not be of type 'in_place_t'.")
+
+    optional_static_assert(( std::is_object<T>::value && std::is_destructible<T>::value && !std::is_array<T>::value ),
+        "T in optional<T> must meet the Cpp17Destructible requirements.")
+
+private:
+    template< typename > friend class optional;
+
+    typedef void (optional::*safe_bool)() const;
+
+public:
+    typedef T value_type;
+
+     // x.x.3.1, constructors
+
+    // 1a - default construct
+    optional_constexpr optional() optional_noexcept
+    : has_value_( false )
+    , contained()
+    {}
+
+    // 1b - construct explicitly empty
+    // NOLINTNEXTLINE( google-explicit-constructor, hicpp-explicit-conversions )
+    optional_constexpr optional( nullopt_t /*unused*/ ) optional_noexcept
+    : has_value_( false )
+    , contained()
+    {}
+
+    // 2 - copy-construct
+#if optional_CPP11_OR_GREATER
+    // template< typename U = T
+    //     optional_REQUIRES_T(
+    //         std::is_copy_constructible<U>::value
+    //         || std11::is_trivially_copy_constructible<U>::value
+    //     )
+    // >
+#endif
+    optional_constexpr14 optional( optional const & other )
+    : has_value_( other.has_value() )
+    {
+        if ( other.has_value() )
+        {
+            contained.construct_value( other.contained.value() );
+        }
+    }
+
+#if optional_CPP11_OR_GREATER
+
+    // 3 (C++11) - move-construct from optional
+    template< typename U = T
+        optional_REQUIRES_T(
+            std11::is_move_constructible<U>::value
+            || std11::is_trivially_move_constructible<U>::value
+        )
+    >
+    optional_constexpr14 optional( optional && other )
+    // NOLINTNEXTLINE( performance-noexcept-move-constructor )
+        noexcept( std11::is_nothrow_move_constructible<T>::value )
+    : has_value_( other.has_value() )
+    {
+        if ( other.has_value() )
+        {
+            contained.construct_value( std::move( other.contained.value() ) );
+        }
+    }
+
+    // 4a (C++11) - explicit converting copy-construct from optional
+    template< typename U
+        optional_REQUIRES_T(
+            std::is_constructible<T, U const &>::value
+            && !std::is_constructible<T, optional<U> &          >::value
+            && !std::is_constructible<T, optional<U> &&         >::value
+            && !std::is_constructible<T, optional<U> const &    >::value
+            && !std::is_constructible<T, optional<U> const &&   >::value
+            && !std::is_convertible<     optional<U> &       , T>::value
+            && !std::is_convertible<     optional<U> &&      , T>::value
+            && !std::is_convertible<     optional<U> const & , T>::value
+            && !std::is_convertible<     optional<U> const &&, T>::value
+            && !std::is_convertible<               U const & , T>::value /*=> explicit */
+        )
+    >
+    explicit optional( optional<U> const & other )
+    : has_value_( other.has_value() )
+    {
+        if ( other.has_value() )
+        {
+            contained.construct_value( T{ other.contained.value() } );
+        }
+    }
+#endif // optional_CPP11_OR_GREATER
+
+    // 4b (C++98 and later) - non-explicit converting copy-construct from optional
+    template< typename U
+#if optional_CPP11_OR_GREATER
+        optional_REQUIRES_T(
+            std::is_constructible<T, U const &>::value
+            && !std::is_constructible<T, optional<U> &          >::value
+            && !std::is_constructible<T, optional<U> &&         >::value
+            && !std::is_constructible<T, optional<U> const &    >::value
+            && !std::is_constructible<T, optional<U> const &&   >::value
+            && !std::is_convertible<     optional<U> &       , T>::value
+            && !std::is_convertible<     optional<U> &&      , T>::value
+            && !std::is_convertible<     optional<U> const & , T>::value
+            && !std::is_convertible<     optional<U> const &&, T>::value
+            &&  std::is_convertible<               U const & , T>::value /*=> non-explicit */
+        )
+#endif // optional_CPP11_OR_GREATER
+    >
+    // NOLINTNEXTLINE( google-explicit-constructor, hicpp-explicit-conversions )
+    /*non-explicit*/ optional( optional<U> const & other )
+    : has_value_( other.has_value() )
+    {
+        if ( other.has_value() )
+        {
+            contained.construct_value( other.contained.value() );
+        }
+    }
+
+#if optional_CPP11_OR_GREATER
+
+    // 5a (C++11) - explicit converting move-construct from optional
+    template< typename U
+        optional_REQUIRES_T(
+            std::is_constructible<T, U &&>::value
+            && !std::is_constructible<T, optional<U> &          >::value
+            && !std::is_constructible<T, optional<U> &&         >::value
+            && !std::is_constructible<T, optional<U> const &    >::value
+            && !std::is_constructible<T, optional<U> const &&   >::value
+            && !std::is_convertible<     optional<U> &       , T>::value
+            && !std::is_convertible<     optional<U> &&      , T>::value
+            && !std::is_convertible<     optional<U> const & , T>::value
+            && !std::is_convertible<     optional<U> const &&, T>::value
+            && !std::is_convertible<                     U &&, T>::value /*=> explicit */
+        )
+    >
+    explicit optional( optional<U> && other
+    )
+    : has_value_( other.has_value() )
+    {
+        if ( other.has_value() )
+        {
+            contained.construct_value( T{ std::move( other.contained.value() ) } );
+        }
+    }
+
+    // 5a (C++11) - non-explicit converting move-construct from optional
+    template< typename U
+        optional_REQUIRES_T(
+            std::is_constructible<T, U &&>::value
+            && !std::is_constructible<T, optional<U> &          >::value
+            && !std::is_constructible<T, optional<U> &&         >::value
+            && !std::is_constructible<T, optional<U> const &    >::value
+            && !std::is_constructible<T, optional<U> const &&   >::value
+            && !std::is_convertible<     optional<U> &       , T>::value
+            && !std::is_convertible<     optional<U> &&      , T>::value
+            && !std::is_convertible<     optional<U> const & , T>::value
+            && !std::is_convertible<     optional<U> const &&, T>::value
+            &&  std::is_convertible<                     U &&, T>::value /*=> non-explicit */
+        )
+    >
+    // NOLINTNEXTLINE( google-explicit-constructor, hicpp-explicit-conversions )
+    /*non-explicit*/ optional( optional<U> && other )
+    : has_value_( other.has_value() )
+    {
+        if ( other.has_value() )
+        {
+            contained.construct_value( std::move( other.contained.value() ) );
+        }
+    }
+
+    // 6 (C++11) - in-place construct
+    template< typename... Args
+        optional_REQUIRES_T(
+            std::is_constructible<T, Args&&...>::value
+        )
+    >
+    optional_constexpr explicit optional( nonstd_lite_in_place_t(T), Args&&... args )
+    : has_value_( true )
+    , contained( in_place, std::forward<Args>(args)... )
+    {}
+
+    // 7 (C++11) - in-place construct,  initializer-list
+    template< typename U, typename... Args
+        optional_REQUIRES_T(
+            std::is_constructible<T, std::initializer_list<U>&, Args&&...>::value
+        )
+    >
+    optional_constexpr explicit optional( nonstd_lite_in_place_t(T), std::initializer_list<U> il, Args&&... args )
+    : has_value_( true )
+    , contained( T( il, std::forward<Args>(args)...) )
+    {}
+
+    // 8a (C++11) - explicit move construct from value
+    template< typename U = T
+        optional_REQUIRES_T(
+            std::is_constructible<T, U&&>::value
+            && !std::is_same<typename std20::remove_cvref<U>::type, nonstd_lite_in_place_t(U)>::value
+            && !std::is_same<typename std20::remove_cvref<U>::type, optional<T>>::value
+            && !std::is_convertible<U&&, T>::value /*=> explicit */
+        )
+    >
+    optional_constexpr explicit optional( U && value )
+    : has_value_( true )
+    , contained( nonstd_lite_in_place(T), std::forward<U>( value ) )
+    {}
+
+    // 8b (C++11) - non-explicit move construct from value
+    template< typename U = T
+        optional_REQUIRES_T(
+            std::is_constructible<T, U&&>::value
+            && !std::is_same<typename std20::remove_cvref<U>::type, nonstd_lite_in_place_t(U)>::value
+            && !std::is_same<typename std20::remove_cvref<U>::type, optional<T>>::value
+            && std::is_convertible<U&&, T>::value /*=> non-explicit */
+        )
+    >
+    // NOLINTNEXTLINE( google-explicit-constructor, hicpp-explicit-conversions )
+    optional_constexpr /*non-explicit*/ optional( U && value )
+    : has_value_( true )
+    , contained( nonstd_lite_in_place(T), std::forward<U>( value ) )
+    {}
+
+#else // optional_CPP11_OR_GREATER
+
+    // 8 (C++98)
+    optional( value_type const & value )
+    : has_value_( true )
+    , contained( value )
+    {}
+
+#endif // optional_CPP11_OR_GREATER
+
+    // x.x.3.2, destructor
+
+    ~optional()
+    {
+        if ( has_value() )
+        {
+            contained.destruct_value();
+        }
+    }
+
+    // x.x.3.3, assignment
+
+    // 1 (C++98and later) -  assign explicitly empty
+    optional & operator=( nullopt_t /*unused*/) optional_noexcept
+    {
+        reset();
+        return *this;
+    }
+
+    // 2 (C++98and later) - copy-assign from optional
+#if optional_CPP11_OR_GREATER
+    // NOLINTNEXTLINE( cppcoreguidelines-c-copy-assignment-signature, misc-unconventional-assign-operator )
+    optional_REQUIRES_R(
+        optional &,
+        true
+//      std::is_copy_constructible<T>::value
+//      && std::is_copy_assignable<T>::value
+    )
+    operator=( optional const & other )
+        noexcept(
+            std11::is_nothrow_move_assignable<T>::value
+            && std11::is_nothrow_move_constructible<T>::value
+        )
+#else
+    optional & operator=( optional const & other )
+#endif
+    {
+        if      ( (has_value() == true ) && (other.has_value() == false) ) { reset(); }
+        else if ( (has_value() == false) && (other.has_value() == true ) ) { initialize( *other ); }
+        else if ( (has_value() == true ) && (other.has_value() == true ) ) { contained.value() = *other; }
+        return *this;
+    }
+
+#if optional_CPP11_OR_GREATER
+
+    // 3 (C++11) - move-assign from optional
+    // NOLINTNEXTLINE( cppcoreguidelines-c-copy-assignment-signature, misc-unconventional-assign-operator )
+    optional_REQUIRES_R(
+        optional &,
+        true
+//      std11::is_move_constructible<T>::value
+//      && std::is_move_assignable<T>::value
+    )
+    operator=( optional && other ) noexcept
+    {
+        if      ( (has_value() == true ) && (other.has_value() == false) ) { reset(); }
+        else if ( (has_value() == false) && (other.has_value() == true ) ) { initialize( std::move( *other ) ); }
+        else if ( (has_value() == true ) && (other.has_value() == true ) ) { contained.value() = std::move( *other ); }
+        return *this;
+    }
+
+    // 4 (C++11) - move-assign from value
+    template< typename U = T >
+        // NOLINTNEXTLINE( cppcoreguidelines-c-copy-assignment-signature, misc-unconventional-assign-operator )
+        optional_REQUIRES_R(
+            optional &,
+            std::is_constructible<T , U>::value
+            && std11::is_assignable<T&, U>::value
+            && !std::is_same<typename std20::remove_cvref<U>::type, nonstd_lite_in_place_t(U)>::value
+            && !std::is_same<typename std20::remove_cvref<U>::type, optional<T>>::value
+            && !(std::is_scalar<T>::value && std::is_same<T, typename std::decay<U>::type>::value)
+        )
+    operator=( U && value )
+    {
+        if ( has_value() )
+        {
+            contained.value() = std::forward<U>( value );
+        }
+        else
+        {
+            initialize( T( std::forward<U>( value ) ) );
+        }
+        return *this;
+    }
+
+#else // optional_CPP11_OR_GREATER
+
+    // 4 (C++98) - copy-assign from value
+    template< typename U /*= T*/ >
+    optional & operator=( U const & value )
+    {
+        if ( has_value() ) contained.value() = value;
+        else               initialize( T( value ) );
+        return *this;
+    }
+
+#endif // optional_CPP11_OR_GREATER
+
+    // 5 (C++98 and later) - converting copy-assign from optional
+    template< typename U >
+#if optional_CPP11_OR_GREATER
+        // NOLINTNEXTLINE( cppcoreguidelines-c-copy-assignment-signature, misc-unconventional-assign-operator )
+        optional_REQUIRES_R(
+            optional&,
+            std::is_constructible<  T , U const &>::value
+            &&  std11::is_assignable< T&, U const &>::value
+            && !std::is_constructible<T, optional<U> &          >::value
+            && !std::is_constructible<T, optional<U> &&         >::value
+            && !std::is_constructible<T, optional<U> const &    >::value
+            && !std::is_constructible<T, optional<U> const &&   >::value
+            && !std::is_convertible<     optional<U> &       , T>::value
+            && !std::is_convertible<     optional<U> &&      , T>::value
+            && !std::is_convertible<     optional<U> const & , T>::value
+            && !std::is_convertible<     optional<U> const &&, T>::value
+            && !std11::is_assignable<  T&, optional<U> &          >::value
+            && !std11::is_assignable<  T&, optional<U> &&         >::value
+            && !std11::is_assignable<  T&, optional<U> const &    >::value
+            && !std11::is_assignable<  T&, optional<U> const &&   >::value
+        )
+#else
+    optional&
+#endif // optional_CPP11_OR_GREATER
+    operator=( optional<U> const & other )
+    {
+        return *this = optional( other );
+    }
+
+#if optional_CPP11_OR_GREATER
+
+    // 6 (C++11) -  converting move-assign from optional
+    template< typename U >
+        // NOLINTNEXTLINE( cppcoreguidelines-c-copy-assignment-signature, misc-unconventional-assign-operator )
+        optional_REQUIRES_R(
+            optional&,
+            std::is_constructible<  T , U>::value
+            &&  std11::is_assignable< T&, U>::value
+            && !std::is_constructible<T, optional<U> &          >::value
+            && !std::is_constructible<T, optional<U> &&         >::value
+            && !std::is_constructible<T, optional<U> const &    >::value
+            && !std::is_constructible<T, optional<U> const &&   >::value
+            && !std::is_convertible<     optional<U> &       , T>::value
+            && !std::is_convertible<     optional<U> &&      , T>::value
+            && !std::is_convertible<     optional<U> const & , T>::value
+            && !std::is_convertible<     optional<U> const &&, T>::value
+            && !std11::is_assignable<  T&, optional<U> &          >::value
+            && !std11::is_assignable<  T&, optional<U> &&         >::value
+            && !std11::is_assignable<  T&, optional<U> const &    >::value
+            && !std11::is_assignable<  T&, optional<U> const &&   >::value
+        )
+    operator=( optional<U> && other )
+    {
+        return *this = optional( std::move( other ) );
+    }
+
+    // 7 (C++11) - emplace
+    template< typename... Args
+        optional_REQUIRES_T(
+            std::is_constructible<T, Args&&...>::value
+        )
+    >
+    T& emplace( Args&&... args )
+    {
+        *this = nullopt;
+        contained.emplace( std::forward<Args>(args)...  );
+        has_value_ = true;
+        return contained.value();
+    }
+
+    // 8 (C++11) - emplace, initializer-list
+    template< typename U, typename... Args
+        optional_REQUIRES_T(
+            std::is_constructible<T, std::initializer_list<U>&, Args&&...>::value
+        )
+    >
+    T& emplace( std::initializer_list<U> il, Args&&... args )
+    {
+        *this = nullopt;
+        contained.emplace( il, std::forward<Args>(args)...  );
+        has_value_ = true;
+        return contained.value();
+    }
+
+#endif // optional_CPP11_OR_GREATER
+
+    // x.x.3.4, swap
+
+    void swap( optional & other )
+#if optional_CPP11_OR_GREATER
+        noexcept(
+            std11::is_nothrow_move_constructible<T>::value
+            && std17::is_nothrow_swappable<T>::value
+        )
+#endif
+    {
+        using std::swap;
+        if      ( (has_value() == true ) && (other.has_value() == true ) ) { swap( **this, *other ); }
+        else if ( (has_value() == false) && (other.has_value() == true ) ) { initialize( std11::move(*other) ); other.reset(); }
+        else if ( (has_value() == true ) && (other.has_value() == false) ) { other.initialize( std11::move(**this) ); reset(); }
+    }
+
+    // x.x.3.5, observers
+
+    optional_constexpr value_type const * operator ->() const
+    {
+        return assert( has_value() ),
+            contained.value_ptr();
+    }
+
+    optional_constexpr14 value_type * operator ->()
+    {
+        return assert( has_value() ),
+            contained.value_ptr();
+    }
+
+    optional_constexpr value_type const & operator *() const optional_ref_qual
+    {
+        return assert( has_value() ),
+            contained.value();
+    }
+
+    optional_constexpr14 value_type & operator *() optional_ref_qual
+    {
+        return assert( has_value() ),
+            contained.value();
+    }
+
+#if optional_HAVE( REF_QUALIFIER )
+
+    optional_constexpr value_type const && operator *() const optional_refref_qual
+    {
+        return std::move( **this );
+    }
+
+    optional_constexpr14 value_type && operator *() optional_refref_qual
+    {
+        return std::move( **this );
+    }
+
+#endif
+
+#if optional_CPP11_OR_GREATER
+    optional_constexpr explicit operator bool() const optional_noexcept
+    {
+        return has_value();
+    }
+#else
+    optional_constexpr operator safe_bool() const optional_noexcept
+    {
+        return has_value() ? &optional::this_type_does_not_support_comparisons : 0;
+    }
+#endif
+
+    // NOLINTNEXTLINE( modernize-use-nodiscard )
+    /*optional_nodiscard*/ optional_constexpr bool has_value() const optional_noexcept
+    {
+        return has_value_;
+    }
+
+    // NOLINTNEXTLINE( modernize-use-nodiscard )
+    /*optional_nodiscard*/ optional_constexpr14 value_type const & value() const optional_ref_qual
+    {
+#if optional_CONFIG_NO_EXCEPTIONS
+        assert( has_value() );
+#else
+        if ( ! has_value() )
+        {
+            throw bad_optional_access();
+        }
+#endif
+        return contained.value();
+    }
+
+    optional_constexpr14 value_type & value() optional_ref_qual
+    {
+#if optional_CONFIG_NO_EXCEPTIONS
+        assert( has_value() );
+#else
+        if ( ! has_value() )
+        {
+            throw bad_optional_access();
+        }
+#endif
+        return contained.value();
+    }
+
+#if optional_HAVE( REF_QUALIFIER )  &&  ( !optional_COMPILER_GNUC_VERSION || optional_COMPILER_GNUC_VERSION >= 490 )
+
+    // NOLINTNEXTLINE( modernize-use-nodiscard )
+    /*optional_nodiscard*/ optional_constexpr value_type const && value() const optional_refref_qual
+    {
+        return std::move( value() );
+    }
+
+    optional_constexpr14 value_type && value() optional_refref_qual
+    {
+        return std::move( value() );
+    }
+
+#endif
+
+#if optional_HAVE( REF_QUALIFIER )
+
+    template< typename U >
+    optional_constexpr value_type value_or( U && v ) const optional_ref_qual
+    {
+        return has_value() ? contained.value() : static_cast<T>(std::forward<U>( v ) );
+    }
+
+    template< typename U >
+    optional_constexpr14 value_type value_or( U && v ) optional_refref_qual
+    {
+#if optional_COMPILER_CLANG_VERSION
+        return has_value() ? /*std::move*/( contained.value() ) : static_cast<T>(std::forward<U>( v ) );
+#else
+        return has_value() ? std::move( contained.value() ) : static_cast<T>(std::forward<U>( v ) );
+#endif
+    }
+
+#else
+
+    template< typename U >
+    optional_constexpr value_type value_or( U const & v ) const
+    {
+        return has_value() ? contained.value() : static_cast<value_type>( v );
+    }
+
+#endif // optional_HAVE( REF_QUALIFIER )
+
+#if !optional_CONFIG_NO_EXTENSIONS
+#if  optional_HAVE( REF_QUALIFIER )
+
+    template< typename F >
+    optional_constexpr value_type value_or_eval( F f ) const &
+    {
+        return has_value() ? contained.value() : f();
+    }
+
+    template< typename F >
+    optional_constexpr14 value_type value_or_eval( F f ) &&
+    {
+        if ( has_value() )
+        {
+            return std::move( contained.value() );
+        }
+        else
+        {
+            return f();
+        }
+    }
+
+#else
+
+    template< typename F >
+    optional_constexpr value_type value_or_eval( F f ) const
+    {
+        return has_value() ? contained.value() : f();
+    }
+
+#endif //  optional_HAVE( REF_QUALIFIER )
+#endif // !optional_CONFIG_NO_EXTENSIONS
+
+    // x.x.3.6, modifiers
+
+    void reset() optional_noexcept
+    {
+        if ( has_value() )
+        {
+            contained.destruct_value();
+        }
+
+        has_value_ = false;
+    }
+
+private:
+    void this_type_does_not_support_comparisons() const {}
+
+    template< typename V >
+    void initialize( V const & value )
+    {
+        assert( ! has_value()  );
+        contained.construct_value( value );
+        has_value_ = true;
+    }
+
+#if optional_CPP11_OR_GREATER
+    template< typename V >
+    void initialize( V && value )
+    {
+        assert( ! has_value()  );
+        contained.construct_value( std::move( value ) );
+        has_value_ = true;
+    }
+
+#endif
+
+private:
+    bool has_value_;
+    detail::storage_t< value_type > contained;
+
+};
+
+// Relational operators
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator==( optional<T> const & x, optional<U> const & y )
+{
+    return bool(x) != bool(y) ? false : !bool( x ) ? true : *x == *y;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator!=( optional<T> const & x, optional<U> const & y )
+{
+    return !(x == y);
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator<( optional<T> const & x, optional<U> const & y )
+{
+    return (!y) ? false : (!x) ? true : *x < *y;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator>( optional<T> const & x, optional<U> const & y )
+{
+    return (y < x);
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator<=( optional<T> const & x, optional<U> const & y )
+{
+    return !(y < x);
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator>=( optional<T> const & x, optional<U> const & y )
+{
+    return !(x < y);
+}
+
+// Comparison with nullopt
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator==( optional<T> const & x, nullopt_t /*unused*/ ) optional_noexcept
+{
+    return (!x);
+}
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator==( nullopt_t /*unused*/, optional<T> const & x ) optional_noexcept
+{
+    return (!x);
+}
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator!=( optional<T> const & x, nullopt_t /*unused*/ ) optional_noexcept
+{
+    return bool(x);
+}
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator!=( nullopt_t /*unused*/, optional<T> const & x ) optional_noexcept
+{
+    return bool(x);
+}
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator<( optional<T> const & /*unused*/, nullopt_t /*unused*/ ) optional_noexcept
+{
+    return false;
+}
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator<( nullopt_t /*unused*/, optional<T> const & x ) optional_noexcept
+{
+    return bool(x);
+}
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator<=( optional<T> const & x, nullopt_t /*unused*/ ) optional_noexcept
+{
+    return (!x);
+}
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator<=( nullopt_t /*unused*/, optional<T> const & /*unused*/ ) optional_noexcept
+{
+    return true;
+}
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator>( optional<T> const & x, nullopt_t /*unused*/ ) optional_noexcept
+{
+    return bool(x);
+}
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator>( nullopt_t /*unused*/, optional<T> const & /*unused*/ ) optional_noexcept
+{
+    return false;
+}
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator>=( optional<T> const & /*unused*/, nullopt_t /*unused*/ ) optional_noexcept
+{
+    return true;
+}
+
+template< typename T >
+optional_nodiscard optional_constexpr bool operator>=( nullopt_t /*unused*/, optional<T> const & x ) optional_noexcept
+{
+    return (!x);
+}
+
+// Comparison with T
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator==( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x == v : false;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator==( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v == *x : false;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator!=( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x != v : true;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator!=( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v != *x : true;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator<( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x < v : true;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator<( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v < *x : false;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator<=( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x <= v : true;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator<=( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v <= *x : false;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator>( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x > v : false;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator>( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v > *x : true;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator>=( optional<T> const & x, U const & v )
+{
+    return bool(x) ? *x >= v : false;
+}
+
+template< typename T, typename U >
+optional_nodiscard optional_constexpr bool operator>=( U const & v, optional<T> const & x )
+{
+    return bool(x) ? v >= *x : true;
+}
+
+// Specialized algorithms
+
+template< typename T
+#if optional_CPP11_OR_GREATER
+    optional_REQUIRES_T(
+        std11::is_move_constructible<T>::value
+        && std17::is_swappable<T>::value )
+#endif
+>
+void swap( optional<T> & x, optional<T> & y )
+#if optional_CPP11_OR_GREATER
+    noexcept( noexcept( x.swap(y) ) )
+#endif
+{
+    x.swap( y );
+}
+
+#if optional_CPP11_OR_GREATER
+
+template< typename T >
+optional_constexpr optional< typename std::decay<T>::type > make_optional( T && value )
+{
+    return optional< typename std::decay<T>::type >( std::forward<T>( value ) );
+}
+
+template< typename T, typename...Args >
+optional_constexpr optional<T> make_optional( Args&&... args )
+{
+    return optional<T>( nonstd_lite_in_place(T), std::forward<Args>(args)...);
+}
+
+template< typename T, typename U, typename... Args >
+optional_constexpr optional<T> make_optional( std::initializer_list<U> il, Args&&... args )
+{
+    return optional<T>( nonstd_lite_in_place(T), il, std::forward<Args>(args)...);
+}
+
+#else
+
+template< typename T >
+optional<T> make_optional( T const & value )
+{
+    return optional<T>( value );
+}
+
+#endif // optional_CPP11_OR_GREATER
+
+} // namespace optional_lite
+
+using optional_lite::optional;
+using optional_lite::nullopt_t;
+using optional_lite::nullopt;
+
+#if ! optional_CONFIG_NO_EXCEPTIONS
+using optional_lite::bad_optional_access;
+#endif
+
+using optional_lite::make_optional;
+
+} // namespace nonstd
+
+#if optional_CPP11_OR_GREATER
+
+// specialize the std::hash algorithm:
+
+namespace std {
+
+template< class T >
+struct hash< nonstd::optional<T> >
+{
+public:
+    std::size_t operator()( nonstd::optional<T> const & v ) const optional_noexcept
+    {
+        return bool( v ) ? std::hash<T>{}( *v ) : 0;
+    }
+};
+
+} //namespace std
+
+#endif // optional_CPP11_OR_GREATER
+
+#if defined(__clang__)
+# pragma clang diagnostic pop
+#elif defined(__GNUC__)
+# pragma GCC   diagnostic pop
+#elif defined(_MSC_VER )
+# pragma warning( pop )
+#endif
+
+#endif // optional_USES_STD_OPTIONAL
+
+#endif // NONSTD_OPTIONAL_LITE_HPP

Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/serializer.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/serializer.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/serializer.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,214 @@
+#include "serializer.h"
+#include <stdexcept>
+#include <rapidjson/allocators.h>
+#include "json.h"
+
+
+
+//// Elementary types
+
+void JsonNull::swap(JsonNull& arg) noexcept
+{
+}
+
+
+void Reflect(Reader& visitor, uint8_t& value) {
+  if (!visitor.IsInt())
+    throw std::invalid_argument("uint8_t");
+  value = (uint8_t)visitor.GetInt();
+}
+void Reflect(Writer& visitor, uint8_t& value) {
+  visitor.Int(value);
+}
+
+void Reflect(Reader& visitor, short& value) {
+  if (!visitor.IsInt())
+    throw std::invalid_argument("short");
+  value = (short)visitor.GetInt();
+}
+void Reflect(Writer& visitor, short& value) {
+  visitor.Int(value);
+}
+
+void Reflect(Reader& visitor, unsigned short& value) {
+  if (!visitor.IsInt())
+    throw std::invalid_argument("unsigned short");
+  value = (unsigned short)visitor.GetInt();
+}
+void Reflect(Writer& visitor, unsigned short& value) {
+  visitor.Int(value);
+}
+
+void Reflect(Reader& visitor, int& value) {
+  if (!visitor.IsInt())
+    throw std::invalid_argument("int");
+  value = visitor.GetInt();
+}
+void Reflect(Writer& visitor, int& value) {
+  visitor.Int(value);
+}
+
+void Reflect(Reader& visitor, unsigned& value) {
+  if (!visitor.IsUint64())
+    throw std::invalid_argument("unsigned");
+  value = visitor.GetUint32();
+}
+void Reflect(Writer& visitor, unsigned& value) {
+  visitor.Uint32(value);
+}
+
+void Reflect(Reader& visitor, long& value) {
+  if (!visitor.IsInt64())
+    throw std::invalid_argument("long");
+  value = long(visitor.GetInt64());
+}
+void Reflect(Writer& visitor, long& value) {
+  visitor.Int64(value);
+}
+
+void Reflect(Reader& visitor, unsigned long& value) {
+  if (!visitor.IsUint64())
+    throw std::invalid_argument("unsigned long");
+  value = (unsigned long)visitor.GetUint64();
+}
+void Reflect(Writer& visitor, unsigned long& value) {
+  visitor.Uint64(value);
+}
+
+void Reflect(Reader& visitor, long long& value) {
+  if (!visitor.IsInt64())
+    throw std::invalid_argument("long long");
+  value = visitor.GetInt64();
+}
+void Reflect(Writer& visitor, long long& value) {
+  visitor.Int64(value);
+}
+
+void Reflect(Reader& visitor, unsigned long long& value) {
+  if (!visitor.IsUint64())
+    throw std::invalid_argument("unsigned long long");
+  value = visitor.GetUint64();
+}
+void Reflect(Writer& visitor, unsigned long long& value) {
+  visitor.Uint64(value);
+}
+
+void Reflect(Reader& visitor, double& value) {
+  if (!visitor.IsNumber())
+    throw std::invalid_argument("double");
+  value = visitor.GetDouble();
+}
+void Reflect(Writer& visitor, double& value) {
+  visitor.Double(value);
+}
+
+void Reflect(Reader& visitor, bool& value) {
+  if (!visitor.IsBool())
+    throw std::invalid_argument("bool");
+  value = visitor.GetBool();
+}
+void Reflect(Writer& visitor, bool& value) {
+  visitor.Bool(value);
+}
+
+void Reflect(Reader& visitor, std::string& value) {
+  if (!visitor.IsString())
+    throw std::invalid_argument("std::string");
+  value = visitor.GetString();
+}
+void Reflect(Writer& visitor, std::string& value) {
+  visitor.String(value.c_str(), (rapidjson::SizeType)value.size());
+}
+
+void Reflect(Reader& visitor, JsonNull& value) {
+  visitor.GetNull();
+}
+
+void Reflect(Writer& visitor, JsonNull& value) {
+  visitor.Null();
+}
+
+
+void Reflect(Reader& visitor, SerializeFormat& value) {
+  std::string fmt = visitor.GetString();
+  value = fmt[0] == 'm' ? SerializeFormat::MessagePack : SerializeFormat::Json;
+}
+
+void Reflect(Writer& visitor, SerializeFormat& value) {
+  switch (value) {
+    case SerializeFormat::Json:
+      visitor.String("json");
+      break;
+    case SerializeFormat::MessagePack:
+      visitor.String("msgpack");
+      break;
+  }
+}
+
+
+std::string JsonReader::ToString() const
+{
+	rapidjson::StringBuffer strBuf;
+	strBuf.Clear();
+	rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);
+	m_->Accept(writer);
+	std::string strJson = strBuf.GetString();
+	return strJson;
+}
+
+void JsonReader::IterMap(std::function<void(const char*, Reader&)> fn)
+{
+	path_.push_back("0");
+	for (auto& entry : m_->GetObject())
+	{
+		auto saved = m_;
+		m_ = &(entry.value);
+
+		fn(entry.name.GetString(), *this);
+		m_ = saved;
+	}
+	path_.pop_back();
+}
+
+ void JsonReader::IterArray(std::function<void(Reader&)> fn)
+{
+	if (!m_->IsArray())
+		throw std::invalid_argument("array");
+	// Use "0" to indicate any element for now.
+	path_.push_back("0");
+	for (auto& entry : m_->GetArray())
+	{
+		auto saved = m_;
+		m_ = &entry;
+		fn(*this);
+		m_ = saved;
+	}
+	path_.pop_back();
+}
+
+void JsonReader::DoMember(const char* name, std::function<void(Reader&)> fn)
+{
+	path_.push_back(name);
+	auto it = m_->FindMember(name);
+	if (it != m_->MemberEnd())
+	{
+		auto saved = m_;
+		m_ = &it->value;
+		fn(*this);
+		m_ = saved;
+	}
+	path_.pop_back();
+}
+
+std::string JsonReader::GetPath() const
+{
+	std::string ret;
+	for (auto& t : path_)
+	{
+		ret += '/';
+		ret += t;
+	}
+	ret.pop_back();
+	return ret;
+}
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/serializer.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/serializer.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/serializer.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/serializer.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,378 @@
+#pragma once
+
+
+#include <macro_map.h>
+#ifdef boost
+#include "optional.hpp"
+#else
+#include <boost/optional.hpp>
+#endif
+#include <cassert>
+#include <memory>
+#include <string>
+#include <type_traits>
+#include <vector>
+#include <functional>
+#include <map>
+#include <algorithm>
+
+
+struct AbsolutePath;
+
+enum class SerializeFormat { Json, MessagePack };
+
+// A tag type that can be used to write `null` to json.
+struct JsonNull
+{
+	void swap(JsonNull& arg) noexcept;
+};
+
+
+
+class Reader {
+public:
+	virtual ~Reader() {}
+	virtual SerializeFormat Format() const = 0;
+
+	virtual bool IsBool() = 0;
+	virtual bool IsNull() = 0;
+	virtual bool IsArray() = 0;
+	virtual bool IsInt() = 0;
+	virtual bool IsInt64() = 0;
+	virtual bool IsUint64() = 0;
+	virtual bool IsDouble() = 0;
+    virtual bool IsNumber() = 0;
+    virtual bool IsString() = 0;
+
+	virtual void GetNull() = 0;
+	virtual bool GetBool() = 0;
+	virtual int GetInt() = 0;
+	virtual uint32_t GetUint32() = 0;
+	virtual int64_t GetInt64() = 0;
+	virtual uint64_t GetUint64() = 0;
+	virtual double GetDouble() = 0;
+	virtual std::string GetString() = 0;
+
+	virtual bool HasMember(const char* x) = 0;
+	virtual std::unique_ptr<Reader> operator[](const char* x) = 0;
+	virtual void IterMap( std::function<void(const char*, Reader&)> fn) = 0;
+	virtual void IterArray(std::function<void(Reader&)> fn) = 0;
+	virtual void DoMember(const char* name, std::function<void(Reader&)> fn) = 0;
+	virtual std::string ToString() const = 0;
+};
+
+
+
+class Writer {
+public:
+	virtual ~Writer() {}
+	virtual SerializeFormat Format() const = 0;
+
+	virtual void Null() = 0;
+	virtual void Bool(bool x) = 0;
+	virtual void Int(int x) = 0;
+	virtual void Uint32(uint32_t x) = 0;
+	virtual void Int64(int64_t x) = 0;
+	virtual void Uint64(uint64_t x) = 0;
+	virtual void Double(double x) = 0;
+	virtual void String(const char* x) = 0;
+	virtual void String(const char* x, size_t len) = 0;
+	virtual void StartArray(size_t) = 0;
+	virtual void EndArray() = 0;
+	virtual void StartObject() = 0;
+	virtual void EndObject() = 0;
+	virtual void Key(const char* name) = 0;
+};
+
+
+
+struct optionals_mandatory_tag {};
+
+#define REFLECT_MEMBER_START() ReflectMemberStart(visitor, value)
+#define REFLECT_MEMBER_END() ReflectMemberEnd(visitor, value);
+#define REFLECT_MEMBER_END1(value) ReflectMemberEnd(visitor, value);
+#define REFLECT_MEMBER(name) ReflectMember(visitor, #name, value.name)
+#define REFLECT_MEMBER_OPTIONALS(name) \
+  ReflectMember(visitor, #name, value.name, optionals_mandatory_tag{})
+#define REFLECT_MEMBER2(name, value) ReflectMember(visitor, name, value)
+
+#define MAKE_REFLECT_TYPE_PROXY(type_name) \
+  MAKE_REFLECT_TYPE_PROXY2(type_name, std::underlying_type<type_name>::type)
+#define MAKE_REFLECT_TYPE_PROXY2(type, as_type)       \
+  inline void Reflect(Reader& visitor, type& value) { \
+    as_type value0;                                   \
+    ::Reflect(visitor, value0);                       \
+    value = static_cast<type>(value0);                \
+  }                                                   \
+  inline void Reflect(Writer& visitor, type& value) { \
+    auto value0 = static_cast<as_type>(value);        \
+    ::Reflect(visitor, value0);                       \
+  }
+
+#define _MAPPABLE_REFLECT_MEMBER(name) REFLECT_MEMBER(name);
+#define _MAPPABLE_REFLECT_MEMBER_OPTIONALS(name) REFLECT_MEMBER_OPTIONALS(name);
+
+#define MAKE_REFLECT_EMPTY_STRUCT(type, ...)     \
+  template <typename TVisitor>                   \
+  void Reflect(TVisitor& visitor, type& value) { \
+    REFLECT_MEMBER_START();                      \
+    REFLECT_MEMBER_END();                        \
+  }
+
+#define MAKE_REFLECT_STRUCT(type, ...)               \
+  template <typename TVisitor>                       \
+  void Reflect(TVisitor& visitor, type& value) {     \
+    REFLECT_MEMBER_START();                          \
+    MACRO_MAP(_MAPPABLE_REFLECT_MEMBER, __VA_ARGS__) \
+    REFLECT_MEMBER_END();                            \
+  }
+
+
+#define _MAPPABLE_SWAP_MEMBER(name)  std::swap(name,arg.name);
+
+#define  MAKE_SWAP_METHOD(type, ...)			\
+void swap(type& arg) noexcept{			\
+	MACRO_MAP(_MAPPABLE_SWAP_MEMBER, __VA_ARGS__) \
+}
+
+#define MAKE_REFLECT_STRUCT_OPTIONALS_MANDATORY(type, ...)     \
+  template <typename TVisitor>                                 \
+  void Reflect(TVisitor& visitor, type& value) {               \
+    REFLECT_MEMBER_START();                                    \
+    MACRO_MAP(_MAPPABLE_REFLECT_MEMBER_OPTIONALS, __VA_ARGS__) \
+    REFLECT_MEMBER_END();                                      \
+  }
+
+// clang-format off
+// Config has many fields, we need to support at least its number of fields.
+#define NUM_VA_ARGS_IMPL(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,N,...) N
+#define NUM_VA_ARGS(...) NUM_VA_ARGS_IMPL(__VA_ARGS__,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
+// clang-format on
+
+#define _MAPPABLE_REFLECT_ARRAY(name) Reflect(visitor, value.name);
+
+// Reflects the struct so it is serialized as an array instead of an object.
+// This currently only supports writers.
+#define MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY(type, ...) \
+  inline void Reflect(Writer& visitor, type& value) {  \
+    visitor.StartArray(NUM_VA_ARGS(__VA_ARGS__));      \
+    MACRO_MAP(_MAPPABLE_REFLECT_ARRAY, __VA_ARGS__)    \
+    visitor.EndArray();                                \
+  }
+
+//// Elementary types
+
+void Reflect(Reader& visitor, uint8_t& value);
+void Reflect(Writer& visitor, uint8_t& value);
+
+void Reflect(Reader& visitor, short& value);
+void Reflect(Writer& visitor, short& value);
+
+void Reflect(Reader& visitor, unsigned short& value);
+void Reflect(Writer& visitor, unsigned short& value);
+
+void Reflect(Reader& visitor, int& value);
+void Reflect(Writer& visitor, int& value);
+
+void Reflect(Reader& visitor, unsigned& value);
+void Reflect(Writer& visitor, unsigned& value);
+
+void Reflect(Reader& visitor, long& value);
+void Reflect(Writer& visitor, long& value);
+
+void Reflect(Reader& visitor, unsigned long& value);
+void Reflect(Writer& visitor, unsigned long& value);
+
+void Reflect(Reader& visitor, long long& value);
+void Reflect(Writer& visitor, long long& value);
+
+void Reflect(Reader& visitor, unsigned long long& value);
+void Reflect(Writer& visitor, unsigned long long& value);
+
+void Reflect(Reader& visitor, double& value);
+void Reflect(Writer& visitor, double& value);
+
+void Reflect(Reader& visitor, bool& value);
+void Reflect(Writer& visitor, bool& value);
+
+void Reflect(Reader& visitor, std::string& value);
+void Reflect(Writer& visitor, std::string& value);
+
+void Reflect(Reader& visitor, JsonNull& value);
+void Reflect(Writer& visitor, JsonNull& value);
+
+void Reflect(Reader& visitor, SerializeFormat& value);
+void Reflect(Writer& visitor, SerializeFormat& value);
+
+//// Type constructors
+
+template <typename T>
+void Reflect(Reader& visitor, boost::optional<T>& value) {
+	if (visitor.IsNull()) {
+		visitor.GetNull();
+		return;
+	}
+	T real_value;
+	Reflect(visitor, real_value);
+	value = std::move(real_value);
+}
+template <typename T>
+void Reflect(Writer& visitor, boost::optional<T>& value) {
+	if (value)
+		Reflect(visitor, *value);
+	else
+		visitor.Null();
+}
+
+
+template <typename T>
+void ReflectMember(Writer& visitor, const char* name, boost::optional<T>& value) {
+	// For TypeScript optional property key?: value in the spec,
+	// We omit both key and value if value is std::nullopt (null) for JsonWriter
+	// to reduce output. But keep it for other serialization formats.
+	if (value || visitor.Format() != SerializeFormat::Json) {
+		visitor.Key(name);
+		Reflect(visitor, value);
+	}
+}
+
+
+
+template <typename T>
+void ReflectMember(Writer& visitor,
+	const char* name,
+	T& value,
+	optionals_mandatory_tag) {
+	visitor.Key(name);
+	Reflect(visitor, value);
+}
+template <typename T>
+void ReflectMember(Reader& visitor,
+	const char* name,
+	T& value,
+	optionals_mandatory_tag) {
+	Reflect(visitor, value);
+}
+
+template<class T >
+void Reflect(Reader& visitor, std::map<std::string, T>& value)
+{
+	visitor.IterMap([&](const char* name,Reader& entry) {
+		T entry_value;
+		Reflect(entry, entry_value);
+		value[name]=(std::move(entry_value));
+	});
+}
+template<class _Ty >
+void Reflect(Writer& visitor, std::map<std::string, _Ty>& value)
+{
+	REFLECT_MEMBER_START();
+	for (auto& it : value)
+	{
+		visitor.Key(it.first.c_str());
+		Reflect(visitor, it.second);
+	}
+	REFLECT_MEMBER_END();
+}
+
+// std::vector
+template <typename T>
+void Reflect(Reader& visitor, std::vector<T>& values) {
+	visitor.IterArray([&](Reader& entry) {
+		T entry_value;
+		Reflect(entry, entry_value);
+		values.push_back(std::move(entry_value));
+		});
+}
+
+
+template <typename T>
+void Reflect(Writer& visitor, std::vector<T>& values) {
+	visitor.StartArray(values.size());
+	for (auto& value : values)
+		Reflect(visitor, value);
+	visitor.EndArray();
+}
+
+// ReflectMember
+
+inline void DefaultReflectMemberStart(Writer& visitor) {
+	visitor.StartObject();
+}
+inline void DefaultReflectMemberStart(Reader& visitor) {}
+
+template <typename T>
+bool ReflectMemberStart(Reader& visitor, T& value) {
+	return false;
+}
+template <typename T>
+bool ReflectMemberStart(Writer& visitor, T& value) {
+	visitor.StartObject();
+	return true;
+}
+
+template <typename T>
+void ReflectMemberEnd(Reader& visitor, T& value) {}
+template <typename T>
+void ReflectMemberEnd(Writer& visitor, T& value) {
+	visitor.EndObject();
+}
+
+template <typename T>
+void ReflectMember(Reader& visitor, const char* name, T& value) {
+	visitor.DoMember(name, [&](Reader& child) { Reflect(child, value); });
+}
+template <typename T>
+void ReflectMember(Writer& visitor, const char* name, T& value) {
+	visitor.Key(name);
+	Reflect(visitor, value);
+}
+
+template<class _Ty1, class _Ty2>
+void Reflect(Writer& visitor, std::pair<  boost::optional<_Ty1>, boost::optional<_Ty2> >& value)
+{
+	if (value.first)
+	{
+		Reflect(visitor, value.first);
+	}
+	else
+	{
+		Reflect(visitor, value.second);
+	}
+}
+template<class _Ty2>
+void Reflect(Reader& visitor, std::pair<  boost::optional<bool>, boost::optional<_Ty2> >& value)
+{
+	if(visitor.IsBool())
+	{
+		Reflect(visitor, value.first);
+		return;
+	}
+
+	Reflect(visitor, value.second);
+}
+template<class _Ty2>
+void Reflect(Reader& visitor, std::pair<  boost::optional<std::string>, boost::optional<_Ty2> >& value)
+{
+	if (visitor.IsString())
+	{
+		Reflect(visitor, value.first);
+		return;
+	}
+
+	Reflect(visitor, value.second);
+}
+
+
+template<class _Ty1, class _Ty2>
+void Reflect(Reader& visitor, std::pair<  boost::optional<_Ty1>, boost::optional<_Ty2> >& value)
+{
+	try
+	{
+		Reflect(visitor, value.second);
+	}
+	catch (...)
+	{
+		Reflect(visitor, value.first);
+	}
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/serializer.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/stream.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/stream.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/stream.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,196 @@
+#pragma once
+#include <mutex>
+#include <string>
+namespace lsp
+{
+	class stream
+	{
+	public:
+		virtual ~stream() = default;
+		virtual  bool fail() = 0;
+		virtual  bool bad() = 0;
+		virtual  bool eof() = 0;
+		virtual  bool good() = 0;
+		virtual  void clear() = 0;
+		virtual  std::string  what() = 0;
+		virtual  bool need_to_clear_the_state()
+		{
+			return false;
+		}
+
+		bool  operator!()
+		{
+			return bad();
+		}
+	};
+	class istream : public  stream
+	{
+	public:
+		virtual  int get() = 0;
+		virtual ~istream() = default;
+		virtual  istream& read(char* str, std::streamsize count) = 0;
+	};
+	template <class T >
+	class base_istream : public istream
+	{
+	public:
+		explicit  base_istream(T& _t) :_impl(_t)
+		{
+
+		}
+
+		int get() override
+		{
+			return  _impl.get();
+		}
+		bool fail() override
+		{
+			return  _impl.fail();
+		}
+		bool bad() override
+		{
+			return  _impl.bad();
+		}
+		bool eof() override
+		{
+			return  _impl.eof();
+		}
+		bool good() override
+		{
+			return  _impl.good();
+		}
+		istream& read(char* str, std::streamsize count) override
+		{
+			_impl.read(str, count);
+			return *this;
+		}
+
+		void clear() override
+		{
+			_impl.clear();
+		}
+		T& _impl;
+	};
+	class ostream : public  stream
+	{
+	public:
+		virtual ~ostream() = default;
+
+		virtual  ostream& write(const std::string&) = 0;
+		virtual  ostream& write(std::streamsize) = 0;
+		virtual  ostream& flush() = 0;
+
+	};
+	template <class T >
+	class base_ostream : public ostream
+	{
+	public:
+		explicit  base_ostream(T& _t) :_impl(_t)
+		{
+
+		}
+
+		bool fail() override
+		{
+			return  _impl.fail();
+		}
+		bool good() override
+		{
+			return  _impl.good();
+		}
+		bool bad() override
+		{
+			return  _impl.bad();
+		}
+		bool eof() override
+		{
+			return  _impl.eof();
+		}
+
+		ostream& write(const std::string& c) override
+		{
+			_impl << c;
+			return *this;
+		}
+
+		ostream& write(std::streamsize _s) override
+		{
+
+			_impl << std::to_string(_s);
+			return *this;
+		}
+
+		ostream& flush() override
+		{
+			_impl.flush();
+			return *this;
+		}
+
+		void clear() override
+		{
+			_impl.clear();
+		}
+	protected:
+		T& _impl;
+	};
+
+	template <class T >
+	class base_iostream : public istream, public ostream
+	{
+	public:
+		explicit  base_iostream(T& _t) :_impl(_t)
+		{
+
+		}
+
+		int get() override
+		{
+			return  _impl.get();
+		}
+		bool fail() override
+		{
+			return  _impl.fail();
+		}
+		bool bad() override
+		{
+			return  _impl.bad();
+		}
+		bool eof() override
+		{
+			return  _impl.eof();
+		}
+		bool good() override
+		{
+			return  _impl.good();
+		}
+		istream& read(char* str, std::streamsize count) override
+		{
+			_impl.read(str, count);
+			return *this;
+		}
+		ostream& write(const std::string& c) override
+		{
+			_impl << c;
+			return *this;
+		}
+
+		ostream& write(std::streamsize _s) override
+		{
+			_impl << std::to_string(_s);
+			return *this;
+		}
+
+		ostream& flush() override
+		{
+			_impl.flush();
+			return *this;
+		}
+
+		void clear() override
+		{
+			_impl.clear();
+		}
+	protected:
+		T& _impl;
+	};
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/stream.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/threaded_queue.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/threaded_queue.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/threaded_queue.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,20 @@
+#include "threaded_queue.h"
+
+// static
+bool MultiQueueWaiter::HasState(
+    std::initializer_list<BaseThreadQueue*> queues) {
+  for (BaseThreadQueue* queue : queues) {
+    if (!queue->IsEmpty())
+      return true;
+  }
+  return false;
+}
+
+bool MultiQueueWaiter::ValidateWaiter(
+    std::initializer_list<BaseThreadQueue*> queues) {
+  for (BaseThreadQueue* queue : queues) {
+    if (queue->waiter.get() != this)
+      return false;
+  }
+  return true;
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/threaded_queue.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/threaded_queue.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/threaded_queue.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/threaded_queue.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,249 @@
+#pragma once
+
+#include <boost/optional/optional.hpp>
+#include <algorithm>
+#include <atomic>
+#include <condition_variable>
+#include <deque>
+#include <memory>
+#include <mutex>
+#include <tuple>
+#include <utility>
+#include <vector>
+
+
+struct MultiQueueWaiter;
+
+struct BaseThreadQueue {
+  virtual ~BaseThreadQueue() = default;
+
+  virtual bool IsEmpty() = 0;
+
+  std::shared_ptr<MultiQueueWaiter> waiter;
+};
+
+// std::lock accepts two or more arguments. We define an overload for one
+// argument.
+namespace std {
+template <typename Lockable>
+void lock(Lockable& l) {
+  l.lock();
+}
+}  // namespace std
+
+template <typename... Queue>
+struct MultiQueueLock {
+  MultiQueueLock(Queue... lockable) : tuple_{lockable...} { lock(); }
+  ~MultiQueueLock() { unlock(); }
+  void lock() { lock_impl(typename std::index_sequence_for<Queue...>{}); }
+  void unlock() { unlock_impl(typename std::index_sequence_for<Queue...>{}); }
+
+ private:
+  template <size_t... Is>
+  void lock_impl(std::index_sequence<Is...>) {
+    std::lock(std::get<Is>(tuple_)->mutex...);
+  }
+
+  template <size_t... Is>
+  void unlock_impl(std::index_sequence<Is...>) {
+    (void)std::initializer_list<int>{
+        (std::get<Is>(tuple_)->mutex.unlock(), 0)...};
+  }
+
+  std::tuple<Queue...> tuple_;
+};
+
+struct MultiQueueWaiter {
+  static bool HasState(std::initializer_list<BaseThreadQueue*> queues);
+
+  bool ValidateWaiter(std::initializer_list<BaseThreadQueue*> queues);
+	
+  template <typename... BaseThreadQueue>
+  bool Wait(std::atomic<bool>& quit, BaseThreadQueue... queues) {
+	  MultiQueueLock<BaseThreadQueue...> l(queues...);
+	  while (!quit.load(std::memory_order_relaxed)) {
+		  if (HasState({ queues... }))
+			  return false;
+		  cv.wait(l);
+	  }
+	  return true;
+  }
+  template <typename... BaseThreadQueue>
+  void WaitUntil(std::chrono::steady_clock::time_point t,
+	  BaseThreadQueue... queues) {
+	  MultiQueueLock<BaseThreadQueue...> l(queues...);
+	  if (!HasState({ queues... }))
+		  cv.wait_until(l, t);
+  }
+  template <typename... BaseThreadQueue>
+  void Wait(BaseThreadQueue... queues) {
+    assert(ValidateWaiter({queues...}));
+
+    MultiQueueLock<BaseThreadQueue...> l(queues...);
+    while (!HasState({queues...}))
+      cv.wait(l);
+  }
+
+  std::condition_variable_any cv;
+};
+
+// A threadsafe-queue. http://stackoverflow.com/a/16075550
+template <class T>
+struct ThreadedQueue : public BaseThreadQueue {
+ public:
+  ThreadedQueue() : ThreadedQueue(std::make_shared<MultiQueueWaiter>()) {}
+
+  explicit ThreadedQueue(std::shared_ptr<MultiQueueWaiter> waiter)
+      : total_count_(0) {
+    this->waiter = waiter;
+  }
+
+  // Returns the number of elements in the queue. This is lock-free.
+  size_t Size() const { return total_count_; }
+
+  // Add an element to the queue.
+  void Enqueue(T&& t, bool priority) {
+    {
+      std::lock_guard<std::mutex> lock(mutex);
+      if (priority)
+        priority_.push_back(std::move(t));
+      else
+        queue_.push_back(std::move(t));
+      ++total_count_;
+    }
+    waiter->cv.notify_one();
+  }
+
+  // Add a set of elements to the queue.
+  void EnqueueAll(std::vector<T>&& elements, bool priority) {
+    if (elements.empty())
+      return;
+
+    {
+      std::lock_guard<std::mutex> lock(mutex);
+      total_count_ += elements.size();
+      for (T& element : elements) {
+        if (priority)
+          priority_.push_back(std::move(element));
+        else
+          queue_.push_back(std::move(element));
+      }
+      elements.clear();
+    }
+
+    waiter->cv.notify_all();
+  }
+
+  // Returns true if the queue is empty. This is lock-free.
+  bool IsEmpty() { return total_count_ == 0; }
+
+  // Get the first element from the queue. Blocks until one is available.
+  T Dequeue() {
+    std::unique_lock<std::mutex> lock(mutex);
+    waiter->cv.wait(lock,
+                    [&]() { return !priority_.empty() || !queue_.empty(); });
+
+    auto execute = [&](std::deque<T>* q) {
+      auto val = std::move(q->front());
+      q->pop_front();
+      --total_count_;
+      return std::move(val);
+    };
+    if (!priority_.empty())
+      return execute(&priority_);
+    return execute(&queue_);
+  }
+
+  // Get the first element from the queue without blocking. Returns a null
+  // value if the queue is empty.
+  boost::optional<T> TryDequeue(bool priority) {
+    std::lock_guard<std::mutex> lock(mutex);
+
+    auto pop = [&](std::deque<T>* q) {
+      auto val = std::move(q->front());
+      q->pop_front();
+      --total_count_;
+      return std::move(val);
+    };
+
+    auto get_result = [&](std::deque<T>* first,
+                          std::deque<T>* second) -> boost::optional<T> {
+      if (!first->empty())
+        return pop(first);
+      if (!second->empty())
+        return pop(second);
+      return {};
+    };
+
+    if (priority)
+      return get_result(&priority_, &queue_);
+    return get_result(&queue_, &priority_);
+  }
+  // Return all elements in the queue.
+  std::vector<T> DequeueAll() {
+	  std::lock_guard<std::mutex> lock(mutex);
+
+	  total_count_ = 0;
+
+	  std::vector<T> result;
+	  result.reserve(priority_.size() + queue_.size());
+	  while (!priority_.empty()) {
+		  result.emplace_back(std::move(priority_.front()));
+		  priority_.pop_front();
+	  }
+	  while (!queue_.empty()) {
+		  result.emplace_back(std::move(queue_.front()));
+		  queue_.pop_front();
+	  }
+
+	  return result;
+  }
+  std::vector<T> TryDequeueSome(size_t num) {
+      std::lock_guard<std::mutex> lock(mutex);
+
+      std::vector<T> result;
+      num = std::min(num, priority_.size() + queue_.size());
+      total_count_ -= num;
+      result.reserve(num);
+      while (num)
+      {
+          if(!priority_.empty()) {
+              result.emplace_back(std::move(priority_.front()));
+              priority_.pop_front();
+          }
+          else
+          {
+	          break;
+          }
+          num -= 1;
+      }
+      while (num)
+      {
+          if (!queue_.empty()) {
+              result.emplace_back(std::move(queue_.front()));
+              queue_.pop_front();
+          }
+          else
+          {
+              break;
+          }
+          num -= 1;
+      }
+      return result;
+  }
+  template <typename Fn>
+  void Iterate(Fn fn) {
+    std::lock_guard<std::mutex> lock(mutex);
+    for (auto& entry : priority_)
+      fn(entry);
+    for (auto& entry : queue_)
+      fn(entry);
+  }
+
+  mutable std::mutex mutex;
+
+ private:
+  std::atomic<int> total_count_;
+  std::deque<T> priority_;
+  std::deque<T> queue_;
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/threaded_queue.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/traits.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/traits.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/traits.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,158 @@
+// Copyright 2021 Google 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
+//
+//     https://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.
+
+#pragma once
+
+
+#include <tuple>
+#include <type_traits>
+
+namespace lsp {
+namespace traits {
+
+// NthTypeOf returns the `N`th type in `Types`
+template <int N, typename... Types>
+using NthTypeOf = typename std::tuple_element<N, std::tuple<Types...>>::type;
+
+// `IsTypeOrDerived<BASE, T>::value` is true iff `T` is of type `BASE`, or
+// derives from `BASE`.
+template <typename BASE, typename T>
+using IsTypeOrDerived = std::integral_constant<
+    bool,
+    std::is_base_of<BASE, typename std::decay<T>::type>::value ||
+        std::is_same<BASE, typename std::decay<T>::type>::value>;
+
+// `EachIsTypeOrDerived<N, BASES, TYPES>::value` is true iff all of the types in
+// the std::tuple `TYPES` is of, or derives from the corresponding indexed type
+// in the std::tuple `BASES`.
+// `N` must be equal to the number of types in both the std::tuple `BASES` and
+// `TYPES`.
+template <int N, typename BASES, typename TYPES>
+struct EachIsTypeOrDerived {
+  using base = typename std::tuple_element<N - 1, BASES>::type;
+  using type = typename std::tuple_element<N - 1, TYPES>::type;
+  using last_matches = IsTypeOrDerived<base, type>;
+  using others_match = EachIsTypeOrDerived<N - 1, BASES, TYPES>;
+  static constexpr bool value = last_matches::value && others_match::value;
+};
+
+// EachIsTypeOrDerived specialization for N = 1
+template <typename BASES, typename TYPES>
+struct EachIsTypeOrDerived<1, BASES, TYPES> {
+  using base = typename std::tuple_element<0, BASES>::type;
+  using type = typename std::tuple_element<0, TYPES>::type;
+  static constexpr bool value = IsTypeOrDerived<base, type>::value;
+};
+
+// EachIsTypeOrDerived specialization for N = 0
+template <typename BASES, typename TYPES>
+struct EachIsTypeOrDerived<0, BASES, TYPES> {
+  static constexpr bool value = true;
+};
+
+// Signature describes the signature of a function.
+template <typename RETURN, typename... PARAMETERS>
+struct Signature {
+  // The return type of the function signature
+  using ret = RETURN;
+  // The parameters of the function signature held in a std::tuple
+  using parameters = std::tuple<PARAMETERS...>;
+  // The type of the Nth parameter of function signature
+  template <std::size_t N>
+  using parameter = NthTypeOf<N, PARAMETERS...>;
+  // The total number of parameters
+  static constexpr std::size_t parameter_count = sizeof...(PARAMETERS);
+};
+
+// SignatureOf is a traits helper that infers the signature of the function,
+// method, static method, lambda, or function-like object `F`.
+template <typename F>
+struct SignatureOf {
+  // The signature of the function-like object `F`
+  using type = typename SignatureOf<decltype(&F::operator())>::type;
+};
+
+// SignatureOf specialization for a regular function or static method.
+template <typename R, typename... ARGS>
+struct SignatureOf<R (*)(ARGS...)> {
+  // The signature of the function-like object `F`
+  using type = Signature<typename std::decay<R>::type,
+                         typename std::decay<ARGS>::type...>;
+};
+
+// SignatureOf specialization for a non-static method.
+template <typename R, typename C, typename... ARGS>
+struct SignatureOf<R (C::*)(ARGS...)> {
+  // The signature of the function-like object `F`
+  using type = Signature<typename std::decay<R>::type,
+                         typename std::decay<ARGS>::type...>;
+};
+
+// SignatureOf specialization for a non-static, const method.
+template <typename R, typename C, typename... ARGS>
+struct SignatureOf<R (C::*)(ARGS...) const> {
+  // The signature of the function-like object `F`
+  using type = Signature<typename std::decay<R>::type,
+                         typename std::decay<ARGS>::type...>;
+};
+
+// SignatureOfT is an alias to `typename SignatureOf<F>::type`.
+template <typename F>
+using SignatureOfT = typename SignatureOf<F>::type;
+
+// ParameterType is an alias to `typename SignatureOf<F>::type::parameter<N>`.
+template <typename F, std::size_t N>
+using ParameterType = typename SignatureOfT<F>::template parameter<N>;
+
+// `HasSignature<F, S>::value` is true iff the function-like `F` has a matching
+// signature to the function-like `S`.
+template <typename F, typename S>
+using HasSignature = std::integral_constant<
+    bool,
+    std::is_same<SignatureOfT<F>, SignatureOfT<S>>::value>;
+
+// `Min<A, B>::value` resolves to the smaller value of A and B.
+template <std::size_t A, std::size_t B>
+using Min = std::integral_constant<std::size_t, (A < B ? A : B)>;
+
+// `CompatibleWith<F, S>::value` is true iff the function-like `F`
+// can be called with the argument types of the function-like `S`. Return type
+// of the two functions are not considered.
+template <typename F, typename S>
+using CompatibleWith = std::integral_constant<
+    bool,
+    (SignatureOfT<S>::parameter_count == SignatureOfT<F>::parameter_count) &&
+        EachIsTypeOrDerived<Min<SignatureOfT<S>::parameter_count,
+                                SignatureOfT<F>::parameter_count>::value,
+                            typename SignatureOfT<S>::parameters,
+                            typename SignatureOfT<F>::parameters>::value>;
+
+// If `CONDITION` is true then EnableIf resolves to type T, otherwise an
+// invalid type.
+template <bool CONDITION, typename T = void>
+using EnableIf = typename std::enable_if<CONDITION, T>::type;
+
+// If `BASE` is a base of `T` then EnableIfIsType resolves to type `TRUE`,
+// otherwise an invalid type.
+template <typename BASE, typename T, typename TRUE_ = void>
+using EnableIfIsType = EnableIf<IsTypeOrDerived<BASE, T>::value, TRUE_>;
+
+// If the function-like `F` has a matching signature to the function-like `S`
+// then EnableIfHasSignature resolves to type `TRUE`, otherwise an invalid type.
+template <typename F, typename S, typename TRUE_ = void>
+using EnableIfHasSignature = EnableIf<HasSignature<F, S>::value, TRUE_>;
+
+}  // namespace traits
+}  // namespace lsp
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/JsonRpc/traits.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/AbsolutePath.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/AbsolutePath.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/AbsolutePath.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <LibLsp/JsonRpc/serializer.h>
+#include <string>
+
+struct AbsolutePath {
+	static AbsolutePath BuildDoNotUse(const std::string& path);
+
+	// Try not to use this.
+	AbsolutePath();
+
+	// Provide implicit conversions to std::string for the time being.
+	AbsolutePath(const std::string& path, bool validate = true);
+	operator std::string() const;
+
+	bool operator==(const AbsolutePath& rhs) const;
+	bool operator!=(const AbsolutePath& rhs) const;
+	bool operator<(const AbsolutePath& rhs) const;
+	bool operator>(const AbsolutePath& rhs) const;
+	std::string path;
+	bool qualify = true;
+};
+
+
+void Reflect(Reader& visitor, AbsolutePath& value);
+void Reflect(Writer& visitor, AbsolutePath& value);
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/AbsolutePath.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ClientPreferences.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ClientPreferences.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ClientPreferences.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,306 @@
+#pragma once
+#include <LibLsp/lsp/general/lsClientCapabilities.h>
+#include <LibLsp/lsp/utils.h>
+#include <memory>
+#include <vector>
+#include <string>
+
+class ClientPreferences
+{
+public:
+
+	std::shared_ptr<lsWorkspaceClientCapabilites>  workspace;
+	lsTextDocumentClientCapabilities textDocument ;
+	
+	ClientPreferences(const lsClientCapabilities& capabilities)
+	{
+		v3supported = capabilities.textDocument.has_value();
+		if (v3supported)
+			textDocument = capabilities.textDocument.value();
+		if(capabilities.workspace)
+		{
+			workspace = std::make_shared<lsWorkspaceClientCapabilites>(capabilities.workspace.value());
+		}
+	}
+	
+	bool v3supported=false;
+
+	bool isSignatureHelpSupported() {
+	
+		return v3supported && (textDocument.signatureHelp);
+	}
+	bool  isWorkspaceDidChangeConfigurationSupported() const
+	{
+		return workspace && isDynamicRegistrationSupported(workspace->didChangeConfiguration);
+	}
+	bool isWorkspaceFoldersSupported() {
+		return workspace != nullptr && isTrue(workspace->workspaceFolders);
+	}
+
+	bool isCompletionDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.completion);
+	}
+
+	bool isCompletionSnippetsSupported() {
+		//@formatter:off
+		if(!v3supported || !textDocument.completion)
+		{
+			return false;
+		}
+		const auto& completion = textDocument.completion.value();
+		if(completion.completionItem)
+		{
+			return isTrue(completion.completionItem.value().snippetSupport);
+		}
+		return false;
+	}
+
+	bool isV3Supported() {
+		return v3supported;
+	}
+
+	bool isFormattingDynamicRegistrationSupported() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.formatting);
+	}
+
+	bool isRangeFormattingDynamicRegistrationSupported() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.rangeFormatting);
+	}
+
+	bool isOnTypeFormattingDynamicRegistrationSupported() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.onTypeFormatting);
+	}
+
+	bool isCodeLensDynamicRegistrationSupported() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.codeLens);
+	}
+
+	bool isSignatureHelpDynamicRegistrationSupported() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.signatureHelp);
+	}
+	template<typename  T>
+	static bool isDynamicRegistrationSupported(boost::optional<T>& capability)
+	{
+		if(capability)
+			return (capability.value().dynamicRegistration.value());
+		return false;
+	}
+	
+	bool isTrue(const boost::optional<bool>& value)
+	{
+		return  value.get_value_or(false);
+	}
+
+	bool isRenameDynamicRegistrationSupported() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.rename);
+	}
+
+	bool isExecuteCommandDynamicRegistrationSupported() {
+		return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->executeCommand);
+	}
+
+	bool isWorkspaceSymbolDynamicRegistered() {
+		return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->symbol);
+	}
+
+	bool isWorkspaceChangeWatchedFilesDynamicRegistered() {
+		return v3supported && workspace != nullptr && isDynamicRegistrationSupported(workspace->didChangeWatchedFiles);
+	}
+
+	bool isDocumentSymbolDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.documentSymbol);
+	}
+
+	bool isCodeActionDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.codeAction);
+	}
+
+	bool isDefinitionDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.definition);
+	}
+
+	bool isTypeDefinitionDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.typeDefinition);
+	}
+
+	bool isHoverDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.hover);
+	}
+
+	bool isReferencesDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.references);
+	}
+
+	bool isDocumentHighlightDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.documentHighlight);
+	}
+
+	bool isFoldgingRangeDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.foldingRange);
+	}
+
+	bool isImplementationDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.implementation);
+	}
+
+	bool isSelectionRangeDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.selectionRange);
+	}
+
+	bool isWillSaveRegistered() {
+		return v3supported && isTrue(textDocument.synchronization.willSave);
+	}
+
+	bool isWillSaveWaitUntilRegistered() {
+		return v3supported && isTrue(textDocument.synchronization.willSaveWaitUntil);
+	}
+
+	bool isWorkspaceApplyEditSupported() {
+		return workspace != nullptr && isTrue(workspace->applyEdit);
+	}
+
+	bool isSupportsCompletionDocumentationMarkdown() {
+
+		if (!v3supported || !textDocument.completion)
+		{
+			return false;
+		}
+		const auto& completion = textDocument.completion.value();
+		if (completion.completionItem)
+		{
+			auto& documentationFormat = completion.completionItem.value().documentationFormat;
+			if(documentationFormat)
+			{
+				auto& data = documentationFormat.value();
+				for(auto& it : data)
+				{
+					if(it == "markdown")
+					{
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+		
+	}
+
+
+	bool isWorkspaceEditResourceChangesSupported() {
+		if(!workspace) return false;
+		
+		if(workspace->workspaceEdit)
+		{
+			return isTrue(workspace->workspaceEdit.value().resourceChanges);
+		}
+		return false;
+	}
+	static  bool contains(const std::vector<std::string>& v, const std::string& target)
+	{
+		for(auto& it : v)
+		{
+			if(it == target) return true;
+		}
+		return false;
+	}
+	bool isResourceOperationSupported() const
+	{
+		if (!workspace) return false;
+		if (!workspace->workspaceEdit)
+		{
+			return false;
+		}
+		auto& it = (workspace->workspaceEdit.value());
+		if(!it.resourceOperations) return false;
+		const auto& resourceOperations = it.resourceOperations.value();
+		return contains(resourceOperations, "create") && contains(resourceOperations, "rename") && contains(resourceOperations, "delete");
+		
+	}
+
+	/**
+	 * {@code true} if the client has explicitly set the
+	 * {@code textDocument.documentSymbol.hierarchicalDocumentSymbolSupport} to
+	 * {@code true} when initializing the LS. Otherwise, {@code false}.
+	 */
+	bool isHierarchicalDocumentSymbolSupported() {
+		if(!v3supported || !textDocument.documentSymbol) return false;
+		return  isTrue(textDocument.documentSymbol.value().hierarchicalDocumentSymbolSupport);
+
+	}
+
+	bool isSemanticHighlightingSupported() {
+		//@formatter:off
+		if (!v3supported || !textDocument.semanticHighlightingCapabilities) return false;
+		return  isTrue(textDocument.semanticHighlightingCapabilities.value().semanticHighlighting);
+		//@formatter:on
+	}
+
+	/**
+	 * {@code true} if the client has explicitly set the
+	 * {@code textDocument.codeAction.codeActionLiteralSupport.codeActionKind.valueSet}
+	 * value. Otherwise, {@code false}.
+	 */
+	bool isSupportedCodeActionKind(const std::string& kind) {
+		if (!v3supported || !textDocument.codeAction) return false;
+		//@formatter:off
+		const auto& codeAction = textDocument.codeAction.value();
+		if(codeAction.codeActionLiteralSupport)
+		{
+			const auto& codeActionKind = codeAction.codeActionLiteralSupport.value().codeActionKind;
+			if(codeActionKind)
+			{
+				const auto& valueSet = codeActionKind.value().valueSet;
+				if(valueSet)
+				{
+					for(auto& k : valueSet.value())
+					{
+						if(lsp::StartsWith(kind,k))
+						{
+							return true;
+						}
+					}
+				}
+			}
+		}
+		return false;
+
+		//@formatter:on
+	}
+
+	/**
+	 * {@code true} if the client has explicitly set the
+	 * {@code textDocument.publishDiagnostics.tagSupport} to
+	 * {@code true} when initializing the LS. Otherwise, {@code false}.
+	 */
+	bool isDiagnosticTagSupported() {
+		if (!v3supported || !textDocument.publishDiagnostics) return false;
+		const auto& publishDiagnostics = textDocument.publishDiagnostics.value();
+		if(publishDiagnostics.tagSupport)
+		{
+			isTagSupported(publishDiagnostics.tagSupport);
+		}
+		return false;
+	}
+
+	bool isTagSupported(const boost::optional < std::pair<boost::optional<bool>,
+		boost::optional<DiagnosticsTagSupport> > >& tagSupport) {
+		if(tagSupport)
+		{
+			auto &v = tagSupport.value();
+			if (v.first)
+			{
+				return v.first.value();
+			}
+			if (v.second) {
+				return !v.second.value().valueSet.empty();
+			}
+		}
+		return false;
+	}
+
+	bool isCallHierarchyDynamicRegistered() {
+		return v3supported && isDynamicRegistrationSupported(textDocument.callHierarchy);
+	}
+
+};
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ClientPreferences.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/CodeActionParams.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/CodeActionParams.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/CodeActionParams.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,114 @@
+#pragma once
+#include "LibLsp/lsp/method_type.h"
+#include "LibLsp/JsonRpc/message.h"
+#include "LibLsp/lsp/lsp_diagnostic.h"
+#include "LibLsp/lsp/workspace/execute_command.h"
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+#include "LibLsp/lsp/lsCodeAction.h"
+namespace  JDT
+{
+	namespace CodeActionKind {
+
+
+		/**
+		 * Base kind for quickfix actions: 'quickfix'
+		 */
+		extern  const char* QuickFix;
+
+		/**
+		 * Base kind for refactoring actions: 'refactor'
+		 */
+		extern const char* Refactor;
+
+		/**
+		 * Base kind for refactoring extraction actions: 'refactor.extract'
+		 *
+		 * Example extract actions:
+		 *
+		 * - Extract method - Extract function - Extract variable - Extract interface
+		 * from class - ...
+		 */
+		extern	const char* RefactorExtract;
+
+		/**
+		 * Base kind for refactoring inline actions: 'refactor.inline'
+		 *
+		 * Example inline actions:
+		 *
+		 * - Inline function - Inline variable - Inline constant - ...
+		 */
+		extern const char* RefactorInline;
+
+		/**
+		 * Base kind for refactoring rewrite actions: 'refactor.rewrite'
+		 *
+		 * Example rewrite actions:
+		 *
+		 * - Convert JavaScript function to class - Add or remove parameter -
+		 * Encapsulate field - Make method static - Move method to base class - ...
+		 */
+		extern const char* RefactorRewrite;
+
+		/**
+		 * Base kind for source actions: `source`
+		 *
+		 * Source code actions apply to the entire file.
+		 */
+		extern const char* Source ;
+
+		/**
+		 * Base kind for an organize imports source action: `source.organizeImports`
+		 */
+		extern const char* SourceOrganizeImports;
+
+		extern  const char* COMMAND_ID_APPLY_EDIT;
+	};
+
+
+}
+struct lsCodeActionContext {
+	// An array of diagnostics.
+	std::vector<lsDiagnostic> diagnostics;
+	/**
+	 * Requested kind of actions to return.
+	 *
+	 * Actions not of this kind are filtered out by the client before being shown. So servers
+	 * can omit computing them.
+	 *
+	 * See {@link CodeActionKind} for allowed values.
+	 */
+	boost::optional<std::vector<std::string>> only;
+
+	MAKE_SWAP_METHOD(lsCodeActionContext,
+		diagnostics, only);
+};
+MAKE_REFLECT_STRUCT(lsCodeActionContext,
+	diagnostics, only);
+
+
+// Params for the CodeActionRequest
+struct lsCodeActionParams {
+	// The document in which the command was invoked.
+	lsTextDocumentIdentifier textDocument;
+	// The range for which the command was invoked.
+	lsRange range;
+	// Context carrying additional information.
+	lsCodeActionContext context;
+
+	MAKE_SWAP_METHOD(lsCodeActionParams,
+		textDocument,
+		range,
+		context);
+};
+MAKE_REFLECT_STRUCT(lsCodeActionParams,
+                    textDocument,
+                    range,
+                    context);
+
+
+
+
+
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/CodeActionParams.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Directory.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Directory.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Directory.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,13 @@
+#pragma once
+#include <string>
+
+struct AbsolutePath;
+
+struct Directory {
+	explicit Directory(const AbsolutePath& path);
+
+	bool operator==(const Directory& rhs) const;
+	bool operator!=(const Directory& rhs) const;
+
+	std::string path;
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Directory.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ExecuteCommandParams.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ExecuteCommandParams.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ExecuteCommandParams.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "lsAny.h"
+struct ExecuteCommandParams {
+	/**
+	 * The identifier of the actual command handler.
+	 */
+
+	std::string command;
+
+	/**
+	 * Arguments that the command should be invoked with.
+	 * The arguments are typically specified when a command is returned from the server to the client.
+	 * Example requests that return a command are textDocument/codeAction or textDocument/codeLens.
+	 */
+	boost::optional<std::vector<lsp::Any>>  arguments;
+	
+	MAKE_SWAP_METHOD(ExecuteCommandParams, command, arguments);
+};
+MAKE_REFLECT_STRUCT(ExecuteCommandParams,command,arguments)


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ExecuteCommandParams.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/IProgressMonitor.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/IProgressMonitor.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/IProgressMonitor.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,145 @@
+#pragma once
+
+
+#include <string>
+namespace lsp { 
+/**
+ * The <code>IProgressMonitor</code> interface is implemented
+ * by objects that monitor the progress of an activity; the methods
+ * in this interface are invoked by code that performs the activity.
+ * <p>
+ * All activity is broken down into a linear sequence of tasks against
+ * which progress is reported. When a task begins, a <code>beginTask(const wstring&, int)
+ * </code> notification is reported, followed by any number and mixture of
+ * progress reports (<code>worked()</code>) and subtask notifications
+ * (<code>subTask(const wstring&)</code>).  When the task is eventually completed, a
+ * <code>done()</code> notification is reported.  After the <code>done()</code>
+ * notification, the progress monitor cannot be reused;  i.e., <code>
+ * beginTask(const wstring&, int)</code> cannot be called again after the call to
+ * <code>done()</code>.
+ * </p>
+ * <p>
+ * A request to cancel an operation can be signaled using the
+ * <code>setCanceled</code> method.  Operations taking a progress
+ * monitor are expected to poll the monitor (using <code>isCanceled</code>)
+ * periodically and abort at their earliest convenience.  Operation can however
+ * choose to ignore cancelation requests.
+ * </p>
+ * <p>
+ * Since notification is synchronous with the activity itself, the listener should
+ * provide a fast and robust implementation. If the handling of notifications would
+ * involve blocking operations, or operations which might throw uncaught exceptions,
+ * the notifications should be queued, and the actual processing deferred (or perhaps
+ * delegated to a separate thread).
+ * </p>
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ */
+	class  IProgressMonitor {
+	public:
+		virtual ~IProgressMonitor()
+		{
+		}
+
+		/** Constant indicating an unknown amount of work.
+		 */
+
+		const static int UNKNOWN = -1;
+
+	/**
+		* Notifies that the main task is beginning.  This must only be called once
+		* on a given progress monitor instance.
+		*
+		* @param name the name (or description) of the main task
+		* @param totalWork the total number of work units into which
+		*  the main task is been subdivided. If the value is <code>UNKNOWN</code>
+		*  the implemenation is free to indicate progress in a way which
+		*  doesn't require the total number of work units in advance.
+		*/
+		virtual void beginTask(void* , int totalWork)
+		{
+
+		};
+		/**
+		 * Notifies that the work is done; that is, either the main task is completed
+		 * or the user canceled it. This method may be called more than once
+		 * (implementations should be prepared to handle this case).
+		 */
+
+		virtual void endTask(void*, int totalWork)
+		{
+
+		}
+
+		virtual void done(void*) = 0;
+
+		/**
+		 * Internal method to handle scaling correctly. This method
+		 * must not be called by a client. Clients should
+		 * always use the method </code>worked(int)</code>.
+		 */
+		virtual void internalWorked(double work)
+		{
+
+		}
+		/**
+		 * Returns whether cancelation of current operation has been requested.
+		 * Long-running operations should poll to see if cancelation
+		 * has been requested.
+		 *
+		 * @return <code>true</code> if cancellation has been requested,
+		 *    and <code>false</code> otherwise
+		 * @see #setCanceled
+		 */
+		virtual bool isCanceled() = 0;
+		/**
+		 * Sets the cancel state to the given value.
+		 *
+		 * @param value <code>true</code> indicates that cancelation has
+		 *     been requested (but not necessarily acknowledged);
+		 *     <code>false</code> clears this flag
+		 *
+		 * @see #isCanceled
+		 */
+		virtual void setCanceled(bool value) = 0;
+		/**
+		 * Sets the task name to the given value. This method is used to
+		 * restore the task label after a nested operation was executed.
+		 * Normally there is no need for clients to call this method.
+		 *
+		 * @param name the name (or description) of the main task
+		 * @see #beginTask(java.lang.const wstring&, int)
+		 */
+		virtual void setTaskName(void*)
+		{
+
+		};
+		/**
+		 * Notifies that a subtask of the main task is beginning.
+		 * Subtasks are optional; the main task might not have subtasks.
+		 *
+		 * @param name the name (or description) of the subtask
+		 */
+		virtual void subTask(void* )
+		{
+
+		}
+		/**
+		 * Notifies that a given number of work unit of the main task
+		 * has been completed. Note that this amount represents an
+		 * installment, as opposed to a cumulative amount of work done
+		 * to date.
+		 *
+		 * @param work the number of work units just completed
+		 */
+		virtual void worked(int work)
+		{
+
+		};
+		
+		virtual void catch_exception(void*) = 0;
+	};
+}
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/IProgressMonitor.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/Markup.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/Markup.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/Markup.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,942 @@
+//===--- Markup.cpp -----------------------------------------*- C++-*------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://lsp.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#include "Markup.h"
+
+#include <algorithm>
+#include <cassert>
+#include <cstddef>
+#include <iterator>
+#include <memory>
+#include <string>
+#include <vector>
+#include <boost/algorithm/string.hpp>
+
+namespace lsp {
+ 
+    /// hexdigit - Return the hexadecimal character for the
+    /// given number \p X (which should be less than 16).
+    inline char hexdigit(unsigned X, bool LowerCase = false) {
+        const char HexChar = LowerCase ? 'a' : 'A';
+        return X < 10 ? '0' + X : HexChar + X - 10;
+    }
+
+    /// Given an array of c-style strings terminated by a null pointer, construct
+    /// a vector of StringRefs representing the same strings without the terminating
+    /// null string.
+    inline std::vector< std::string_ref> toStringRefArray(const char* const* Strings) {
+        std::vector< std::string_ref> Result;
+        while (*Strings)
+            Result.push_back(*Strings++);
+        return Result;
+    }
+
+    /// Construct a string ref from a boolean.
+    inline  std::string_ref toStringRef(bool B) { return  std::string_ref(B ? "true" : "false"); }
+
+    /// Construct a string ref from an array ref of unsigned chars.
+    inline  std::string_ref toStringRef(const std::vector<uint8_t>& Input) {
+        return  std::string_ref(Input.begin(), Input.end());
+    }
+
+    /// Construct a string ref from an array ref of unsigned chars.
+    inline std::vector<uint8_t> arrayRefFromStringRef(const  std::string_ref& Input) {
+        return { Input.begin(), Input.end() };
+    }
+
+    /// Interpret the given character \p C as a hexadecimal digit and return its
+    /// value.
+    ///
+    /// If \p C is not a valid hex digit, -1U is returned.
+    inline unsigned hexDigitValue(char C) {
+        struct HexTable {
+            unsigned LUT[255] = {};
+            constexpr HexTable() {
+                // Default initialize everything to invalid.
+                for (int i = 0; i < 255; ++i)
+                    LUT[i] = ~0U;
+                // Initialize `0`-`9`.
+                for (int i = 0; i < 10; ++i)
+                    LUT['0' + i] = i;
+                // Initialize `A`-`F` and `a`-`f`.
+                for (int i = 0; i < 6; ++i)
+                    LUT['A' + i] = LUT['a' + i] = 10 + i;
+            }
+        };
+        constexpr HexTable Table;
+        return Table.LUT[static_cast<unsigned char>(C)];
+    }
+
+    /// Checks if character \p C is one of the 10 decimal digits.
+    inline bool isDigit(char C) { return C >= '0' && C <= '9'; }
+
+    /// Checks if character \p C is a hexadecimal numeric character.
+    inline bool isHexDigit(char C) { return hexDigitValue(C) != ~0U; }
+
+    /// Checks if character \p C is a valid letter as classified by "C" locale.
+    inline bool isAlpha(char C) {
+        return ('a' <= C && C <= 'z') || ('A' <= C && C <= 'Z');
+    }
+
+    /// Checks whether character \p C is either a decimal digit or an uppercase or
+    /// lowercase letter as classified by "C" locale.
+    inline bool isAlnum(char C) { return isAlpha(C) || isDigit(C); }
+
+    /// Checks whether character \p C is valid ASCII (high bit is zero).
+    inline bool isASCII(char C) { return static_cast<unsigned char>(C) <= 127; }
+
+    /// Checks whether all characters in S are ASCII.
+    inline bool isASCII(std::string_ref S) {
+        for (char C : S)
+        {
+	        if(!isASCII(C))return true;
+        }
+        return true;
+    }
+
+    /// Checks whether character \p C is printable.
+    ///
+    /// Locale-independent version of the C standard library isprint whose results
+    /// may differ on different platforms.
+    inline bool isPrint(char C) {
+        unsigned char UC = static_cast<unsigned char>(C);
+        return (0x20 <= UC) && (UC <= 0x7E);
+    }
+
+    /// Checks whether character \p C is whitespace in the "C" locale.
+    ///
+    /// Locale-independent version of the C standard library isspace.
+    inline bool isSpace(char C) {
+        return C == ' ' || C == '\f' || C == '\n' || C == '\r' || C == '\t' ||
+            C == '\v';
+    }
+
+    /// Returns the corresponding lowercase character if \p x is uppercase.
+    inline char toLower(char x) {
+        if (x >= 'A' && x <= 'Z')
+            return x - 'A' + 'a';
+        return x;
+    }
+
+    /// Returns the corresponding uppercase character if \p x is lowercase.
+    inline char toUpper(char x) {
+        if (x >= 'a' && x <= 'z')
+            return x - 'a' + 'A';
+        return x;
+    }
+
+    inline std::string utohexstr(uint64_t X, bool LowerCase = false) {
+        char Buffer[17];
+        char* BufPtr = std::end(Buffer);
+
+        if (X == 0) *--BufPtr = '0';
+
+        while (X) {
+            unsigned char Mod = static_cast<unsigned char>(X) & 15;
+            *--BufPtr = hexdigit(Mod, LowerCase);
+            X >>= 4;
+        }
+
+        return std::string(BufPtr, std::end(Buffer));
+    }
+
+    /// Convert buffer \p Input to its hexadecimal representation.
+    /// The returned string is double the size of \p Input.
+    inline std::string toHex( std::string_ref Input, bool LowerCase = false) {
+        static const char* const LUT = "0123456789ABCDEF";
+        const uint8_t Offset = LowerCase ? 32 : 0;
+        size_t Length = Input.size();
+
+        std::string Output;
+        Output.reserve(2 * Length);
+        for (size_t i = 0; i < Length; ++i) {
+            const unsigned char c = Input[i];
+            Output.push_back(LUT[c >> 4] | Offset);
+            Output.push_back(LUT[c & 15] | Offset);
+        }
+        return Output;
+    }
+
+    inline std::string toHex(std::vector<uint8_t> Input, bool LowerCase = false) {
+        return toHex(toStringRef(Input), LowerCase);
+    }
+
+    /// Store the binary representation of the two provided values, \p MSB and
+    /// \p LSB, that make up the nibbles of a hexadecimal digit. If \p MSB or \p LSB
+    /// do not correspond to proper nibbles of a hexadecimal digit, this method
+    /// returns false. Otherwise, returns true.
+    inline bool tryGetHexFromNibbles(char MSB, char LSB, uint8_t& Hex) {
+        unsigned U1 = hexDigitValue(MSB);
+        unsigned U2 = hexDigitValue(LSB);
+        if (U1 == ~0U || U2 == ~0U)
+            return false;
+
+        Hex = static_cast<uint8_t>((U1 << 4) | U2);
+        return true;
+    }
+
+    /// Return the binary representation of the two provided values, \p MSB and
+    /// \p LSB, that make up the nibbles of a hexadecimal digit.
+    inline uint8_t hexFromNibbles(char MSB, char LSB) {
+        uint8_t Hex = 0;
+        bool GotHex = tryGetHexFromNibbles(MSB, LSB, Hex);
+        (void)GotHex;
+        assert(GotHex && "MSB and/or LSB do not correspond to hex digits");
+        return Hex;
+    }
+
+    /// Convert hexadecimal string \p Input to its binary representation and store
+    /// the result in \p Output. Returns true if the binary representation could be
+    /// converted from the hexadecimal string. Returns false if \p Input contains
+    /// non-hexadecimal digits. The output string is half the size of \p Input.
+    inline bool tryGetFromHex( std::string_ref Input, std::string& Output) {
+        if (Input.empty())
+            return true;
+
+        Output.reserve((Input.size() + 1) / 2);
+        if (Input.size() % 2 == 1) {
+            uint8_t Hex = 0;
+            if (!tryGetHexFromNibbles('0', Input.front(), Hex))
+                return false;
+
+            Output.push_back(Hex);
+            Input = Input.drop_front();
+        }
+
+        assert(Input.size() % 2 == 0);
+        while (!Input.empty()) {
+            uint8_t Hex = 0;
+            if (!tryGetHexFromNibbles(Input[0], Input[1], Hex))
+                return false;
+
+            Output.push_back(Hex);
+            Input = Input.drop_front(2);
+        }
+        return true;
+    }
+
+    /// Convert hexadecimal string \p Input to its binary representation.
+    /// The return string is half the size of \p Input.
+    inline std::string fromHex( std::string_ref Input) {
+        std::string Hex;
+        bool GotHex = tryGetFromHex(Input, Hex);
+        (void)GotHex;
+        assert(GotHex && "Input contains non hex digits");
+        return Hex;
+    }
+
+
+
+    inline std::string utostr(uint64_t X, bool isNeg = false) {
+        char Buffer[21];
+        char* BufPtr = std::end(Buffer);
+
+        if (X == 0) *--BufPtr = '0';  // Handle special case...
+
+        while (X) {
+            *--BufPtr = '0' + char(X % 10);
+            X /= 10;
+        }
+
+        if (isNeg) *--BufPtr = '-';   // Add negative sign...
+        return std::string(BufPtr, std::end(Buffer));
+    }
+
+    inline std::string itostr(int64_t X) {
+        if (X < 0)
+            return utostr(static_cast<uint64_t>(1) + ~static_cast<uint64_t>(X), true);
+        else
+            return utostr(static_cast<uint64_t>(X));
+    }
+
+    /// StrInStrNoCase - Portable version of strcasestr.  Locates the first
+    /// occurrence of string 's1' in string 's2', ignoring case.  Returns
+    /// the offset of s2 in s1 or npos if s2 cannot be found.
+     std::string_ref::size_type StrInStrNoCase( std::string_ref s1,  std::string_ref s2);
+
+    /// getToken - This function extracts one token from source, ignoring any
+    /// leading characters that appear in the Delimiters string, and ending the
+    /// token at any of the characters that appear in the Delimiters string.  If
+    /// there are no tokens in the source string, an empty string is returned.
+    /// The function returns a pair containing the extracted token and the
+    /// remaining tail string.
+    std::pair< std::string_ref,  std::string_ref> getToken( std::string_ref Source,
+         std::string_ref Delimiters = " \t\n\v\f\r");
+
+
+
+    /// Returns the English suffix for an ordinal integer (-st, -nd, -rd, -th).
+    inline  std::string_ref getOrdinalSuffix(unsigned Val) {
+        // It is critically important that we do this perfectly for
+        // user-written sequences with over 100 elements.
+        switch (Val % 100) {
+        case 11:
+        case 12:
+        case 13:
+            return "th";
+        default:
+            switch (Val % 10) {
+            case 1: return "st";
+            case 2: return "nd";
+            case 3: return "rd";
+            default: return "th";
+            }
+        }
+    }
+
+    namespace detail {
+
+        template <typename IteratorT>
+        inline std::string join_impl(IteratorT Begin, IteratorT End,
+             std::string_ref Separator, std::input_iterator_tag) {
+            std::string S;
+            if (Begin == End)
+                return S;
+
+            S += (*Begin);
+            while (++Begin != End) {
+                S += Separator;
+                S += (*Begin);
+            }
+            return S;
+        }
+
+        template <typename IteratorT>
+        inline std::string join_impl(IteratorT Begin, IteratorT End,
+             std::string_ref Separator, std::forward_iterator_tag) {
+            std::string S;
+            if (Begin == End)
+                return S;
+
+            size_t Len = (std::distance(Begin, End) - 1) * Separator.size();
+            for (IteratorT I = Begin; I != End; ++I)
+                Len += (*I).size();
+            S.reserve(Len);
+            size_t PrevCapacity = S.capacity();
+            (void)PrevCapacity;
+            S += (*Begin);
+            while (++Begin != End) {
+                S += Separator;
+                S += (*Begin);
+            }
+            assert(PrevCapacity == S.capacity() && "String grew during building");
+            return S;
+        }
+
+        template <typename Sep>
+        inline void join_items_impl(std::string& Result, Sep Separator) {}
+
+        template <typename Sep, typename Arg>
+        inline void join_items_impl(std::string& Result, Sep Separator,
+            const Arg& Item) {
+            Result += Item;
+        }
+
+        template <typename Sep, typename Arg1, typename... Args>
+        inline void join_items_impl(std::string& Result, Sep Separator, const Arg1& A1,
+            Args &&... Items) {
+            Result += A1;
+            Result += Separator;
+            join_items_impl(Result, Separator, std::forward<Args>(Items)...);
+        }
+
+        inline size_t join_one_item_size(char) { return 1; }
+        inline size_t join_one_item_size(const char* S) { return S ? ::strlen(S) : 0; }
+
+        template <typename T> inline size_t join_one_item_size(const T& Str) {
+            return Str.size();
+        }
+
+        inline size_t join_items_size() { return 0; }
+
+        template <typename A1> inline size_t join_items_size(const A1& A) {
+            return join_one_item_size(A);
+        }
+        template <typename A1, typename... Args>
+        inline size_t join_items_size(const A1& A, Args &&... Items) {
+            return join_one_item_size(A) + join_items_size(std::forward<Args>(Items)...);
+        }
+
+    } // end namespace detail
+
+    /// Joins the strings in the range [Begin, End), adding Separator between
+    /// the elements.
+    template <typename IteratorT>
+    inline std::string join(IteratorT Begin, IteratorT End,  std::string_ref Separator) {
+        using tag = typename std::iterator_traits<IteratorT>::iterator_category;
+        return detail::join_impl(Begin, End, Separator, tag());
+    }
+
+    /// Joins the strings in the range [R.begin(), R.end()), adding Separator
+    /// between the elements.
+    template <typename Range>
+    inline std::string join(Range&& R,  std::string_ref Separator) {
+        return join(R.begin(), R.end(), Separator);
+    }
+
+    /// Joins the strings in the parameter pack \p Items, adding \p Separator
+    /// between the elements.  All arguments must be implicitly convertible to
+    /// std::string, or there should be an overload of std::string::operator+=()
+    /// that accepts the argument explicitly.
+    template <typename Sep, typename... Args>
+    inline std::string join_items(Sep Separator, Args &&... Items) {
+        std::string Result;
+        if (sizeof...(Items) == 0)
+            return Result;
+
+        size_t NS = detail::join_one_item_size(Separator);
+        size_t NI = detail::join_items_size(std::forward<Args>(Items)...);
+        Result.reserve(NI + (sizeof...(Items) - 1) * NS + 1);
+        detail::join_items_impl(Result, Separator, std::forward<Args>(Items)...);
+        return Result;
+    }
+
+    /// A helper class to return the specified delimiter string after the first
+    /// invocation of operator  std::string_ref().  Used to generate a comma-separated
+    /// list from a loop like so:
+    ///
+    /// \code
+    ///   ListSeparator LS;
+    ///   for (auto &I : C)
+    ///     OS << LS << I.getName();
+    /// \end
+    class ListSeparator {
+        bool First = true;
+         std::string_ref Separator;
+
+    public:
+        ListSeparator( std::string_ref Separator = ", ") : Separator(Separator) {}
+        operator  std::string_ref() {
+            if (First) {
+                First = false;
+                return {};
+            }
+            return Separator;
+        }
+    };
+
+} // end namespace lsp
+
+namespace lsp{
+
+// Is <contents a plausible start to an HTML tag?
+// Contents may not be the rest of the line, but it's the rest of the plain
+// text, so we expect to see at least the tag name.
+bool looksLikeTag(std::string_ref& Contents) {
+  if (Contents.empty())
+    return false;
+  if (Contents.front() == '!' || Contents.front() == '?' ||
+      Contents.front() == '/')
+    return true;
+  // Check the start of the tag name.
+  if (!lsp::isAlpha(Contents.front()))
+    return false;
+  // Drop rest of the tag name, and following whitespace.
+  Contents = Contents
+                 .drop_while([](char C) {
+                   return lsp::isAlnum(C) || C == '-' || C == '_' || C == ':';
+                 })
+                 .drop_while(lsp::isSpace);
+  // The rest of the tag consists of attributes, which have restrictive names.
+  // If we hit '=', all bets are off (attribute values can contain anything).
+  for (; !Contents.empty(); Contents = Contents.drop_front()) {
+    if (lsp::isAlnum(Contents.front()) || lsp::isSpace(Contents.front()))
+      continue;
+    if (Contents.front() == '>' || Contents.start_with("/>"))
+      return true; // May close the tag.
+    if (Contents.front() == '=')
+      return true; // Don't try to parse attribute values.
+    return false;  // Random punctuation means this isn't a tag.
+  }
+  return true; // Potentially incomplete tag.
+}
+
+// Tests whether C should be backslash-escaped in markdown.
+// The string being escaped is Before + C + After. This is part of a paragraph.
+// StartsLine indicates whether `Before` is the start of the line.
+// After may not be everything until the end of the line.
+//
+// It's always safe to escape punctuation, but want minimal escaping.
+// The strategy is to escape the first character of anything that might start
+// a markdown grammar construct.
+bool needsLeadingEscape(char C, std::string_ref Before,  std::string_ref After,
+                        bool StartsLine) {
+ 
+  auto RulerLength = [&]() -> /*Length*/ unsigned {
+    if (!StartsLine || !Before.empty())
+      return false;
+    std::string_ref A = After.trim_right();
+    return std::all_of(A.begin(),A.end(), [C](char D) { return C == D; }) ? 1 + A.size() : 0;
+  };
+  auto IsBullet = [&]() {
+    return StartsLine && Before.empty() &&
+           (After.empty() || After.start_with(" "));
+  };
+  auto SpaceSurrounds = [&]() {
+    return (After.empty() || std::isspace(After.front())) &&
+           (Before.empty() || std::isspace(Before.back()));
+  };
+
+  auto WordSurrounds = [&]() {
+    return (!After.empty() && std::isalnum(After.front())) &&
+           (!Before.empty() && std::isalnum(Before.back()));
+  };
+
+  switch (C) {
+  case '\\': // Escaped character.
+    return true;
+  case '`': // Code block or inline code
+    // Any number of backticks can delimit an inline code block that can end
+    // anywhere (including on another line). We must escape them all.
+    return true;
+  case '~': // Code block
+    return StartsLine && Before.empty() && After.start_with("~~");
+  case '#': { // ATX heading.
+    if (!StartsLine || !Before.empty())
+      return false;
+    std::string_ref& Rest = After.trim_left(C);
+    return Rest.empty() || Rest.start_with(" ");
+  }
+  case ']': // Link or link reference.
+    // We escape ] rather than [ here, because it's more constrained:
+    //   ](...) is an in-line link
+    //   ]: is a link reference
+    // The following are only links if the link reference exists:
+    //   ] by itself is a shortcut link
+    //   ][...] is an out-of-line link
+    // Because we never emit link references, we don't need to handle these.
+    return After.start_with(":") || After.start_with("(");
+  case '=': // Setex heading.
+    return RulerLength() > 0;
+  case '_': // Horizontal ruler or matched delimiter.
+    if (RulerLength() >= 3)
+      return true;
+    // Not a delimiter if surrounded by space, or inside a word.
+    // (The rules at word boundaries are subtle).
+    return !(SpaceSurrounds() || WordSurrounds());
+  case '-': // Setex heading, horizontal ruler, or bullet.
+    if (RulerLength() > 0)
+      return true;
+    return IsBullet();
+  case '+': // Bullet list.
+    return IsBullet();
+  case '*': // Bullet list, horizontal ruler, or delimiter.
+    return IsBullet() || RulerLength() >= 3 || !SpaceSurrounds();
+  case '<': // HTML tag (or autolink, which we choose not to escape)
+    return looksLikeTag(After);
+  case '>': // Quote marker. Needs escaping at start of line.
+    return StartsLine && Before.empty();
+  case '&': { // HTML entity reference
+    auto End = After.find(';');
+    if (End == std::string_ref::npos)
+      return false;
+    std::string_ref Content = After.substr(0, End);
+    if (Content.consume_front("#"))
+    {
+      if (Content.consume_front("x") || Content.consume_front("X"))
+      {
+          return std::all_of(Content.begin(),Content.end(), lsp::isHexDigit);
+      }
+     
+      return std::all_of(Content.begin(), Content.end(), [](char c)
+      {
+	      return lsp::isDigit(c);
+      });
+    }
+    return std::all_of(Content.begin(), Content.end(), [](char c)
+        {
+            return lsp::isAlpha(c);
+        });
+  }
+  case '.': // Numbered list indicator. Escape 12. -> 12\. at start of line.
+  case ')':
+    return StartsLine && !Before.empty() &&
+           std::all_of(Before.begin(), Before.end(), [](char c)
+               {
+                   return lsp::isDigit(c);
+               }) && After.start_with(" ");
+  default:
+    return false;
+  }
+}
+
+/// Escape a markdown text block. Ensures the punctuation will not introduce
+/// any of the markdown constructs.
+ std::string_ref renderText(const std::string_ref& Input, bool StartsLine) {
+  std::string_ref R;
+  for (unsigned I = 0; I < Input.size(); ++I) {
+    if (needsLeadingEscape(Input[I], Input.substr(0, I), Input.substr(I + 1),
+                           StartsLine))
+      R.push_back('\\');
+    R.push_back(Input[I]);
+  }
+  return R;
+}
+
+/// Renders \p Input as an inline block of code in markdown. The returned value
+/// is surrounded by backticks and the inner contents are properly escaped.
+ std::string_ref renderInlineBlock(const std::string_ref& Input) {
+  std::string_ref R;
+  // Double all backticks to make sure we don't close the inline block early.
+  for (size_t From = 0; From < Input.size();) {
+    size_t Next = Input.find("`", From);
+    R += Input.substr(From, Next - From);
+    if (Next == std::string_ref::npos)
+      break;
+    R += "``"; // double the found backtick.
+
+    From = Next + 1;
+  }
+  // If results starts with a backtick, add spaces on both sides. The spaces
+  // are ignored by markdown renderers.
+  if (std::string_ref(R).start_with("`") || std::string_ref(R).end_with("`"))
+    return "` " + std::move(R) + " `";
+  // Markdown render should ignore first and last space if both are there. We
+  // add an extra pair of spaces in that case to make sure we render what the
+  // user intended.
+  if (std::string_ref(R).start_with(" ") && std::string_ref(R).end_with(" "))
+    return "` " + std::move(R) + " `";
+  return "`" + std::move(R) + "`";
+}
+
+/// Get marker required for \p Input to represent a markdown codeblock. It
+/// consists of at least 3 backticks(`). Although markdown also allows to use
+/// tilde(~) for code blocks, they are never used.
+ std::string_ref getMarkerForCodeBlock(const std::string_ref& Input) {
+  // Count the maximum number of consecutive backticks in \p Input. We need to
+  // start and end the code block with more.
+  unsigned MaxBackticks = 0;
+  unsigned Backticks = 0;
+  for (char C : Input) {
+    if (C == '`') {
+      ++Backticks;
+      continue;
+    }
+    MaxBackticks = std::max(MaxBackticks, Backticks);
+    Backticks = 0;
+  }
+  MaxBackticks = std::max(Backticks, MaxBackticks);
+  // Use the corresponding number of backticks to start and end a code block.
+  return std::string_ref(/*Repeat=*/std::max(3u, MaxBackticks + 1), '`');
+}
+
+ /// SplitString - Split up the specified string according to the specified
+/// delimiters, appending the result fragments to the output list.
+ void SplitString(const std::string& Source,
+                  std::vector<std::string_ref>& OutFragments,
+     std::string Delimiters = " \t\n\v\f\r")
+{
+     boost::split(OutFragments, Source, boost::is_any_of(Delimiters));
+}
+
+	
+// Trims the input and concatenates whitespace blocks into a single ` `.
+ std::string_ref canonicalizeSpaces(const std::string_ref& Input) {
+  std::vector<std::string_ref> Words;
+  SplitString(Input, Words);
+	
+  return lsp::join(Words, " ");
+}
+
+
+ std::string_ref renderBlocks( std::vector<Block*>&& Children,
+     void (Block::* RenderFunc)(std::ostringstream&) const) {
+     std::string_ref R;
+     std::ostringstream OS(R);
+
+     std::vector<int> v{ 1, 2, 3 };
+    
+     // Trim rulers.
+     Children.erase(std::remove_if(Children.begin(), Children.end(), [](const Block* C)
+	  {
+		  return C->isRuler();
+	  }), Children.end());
+	
+     bool LastBlockWasRuler = true;
+     for (const auto& C : Children) {
+         if (C->isRuler() && LastBlockWasRuler)
+             continue;
+         LastBlockWasRuler = C->isRuler();
+         ((*C).*RenderFunc)(OS);
+     }
+
+     // Get rid of redundant empty lines introduced in plaintext while imitating
+     // padding in markdown.
+     std::string_ref AdjustedResult;
+     std::string_ref TrimmedText(OS.str());
+     TrimmedText = TrimmedText.trim();
+
+     std::copy_if(TrimmedText.begin(), TrimmedText.end(),
+         std::back_inserter(AdjustedResult),
+         [&TrimmedText](const char& C) {
+             return !std::string_ref(TrimmedText.data(),
+                 &C - TrimmedText.data() + 1)
+                 // We allow at most two newlines.
+                 .end_with("\n\n\n");
+         });
+
+     return AdjustedResult;
+ };
+ std::string_ref renderBlocks(const std::vector<std::unique_ptr<Block> >& children,
+     void (Block::* renderFunc)(std::ostringstream&) const)
+ {
+    std::vector<Block*> temp(children.size(), nullptr);
+ 	for(size_t i = 0 ; i < children.size() ; ++i)
+ 	{
+        temp[i]=(children[i].get());
+ 	}
+    return renderBlocks(std::move(temp), renderFunc);
+ }
+// Separates two blocks with extra spacing. Note that it might render strangely
+// in vscode if the trailing block is a codeblock, see
+// https://github.com/microsoft/vscode/issues/88416 for details.
+class Ruler : public Block {
+public:
+  void renderMarkdown(std::ostringstream &OS) const override {
+    // Note that we need an extra new line before the ruler, otherwise we might
+    // make previous block a title instead of introducing a ruler.
+    OS << "\n---\n";
+  }
+  void renderPlainText(std::ostringstream &OS) const override { OS << '\n'; }
+  std::unique_ptr<Block> clone() const override {
+    return std::make_unique<Ruler>(*this);
+  }
+  bool isRuler() const override { return true; }
+};
+
+class CodeBlock : public Block {
+public:
+  void renderMarkdown(std::ostringstream &OS) const override {
+    std::string_ref Marker = getMarkerForCodeBlock(Contents);
+    // No need to pad from previous blocks, as they should end with a new line.
+    OS << Marker << Language << '\n' << Contents << '\n' << Marker << '\n';
+  }
+
+  void renderPlainText(std::ostringstream &OS) const override {
+    // In plaintext we want one empty line before and after codeblocks.
+    OS << '\n' << Contents << "\n\n";
+  }
+
+  std::unique_ptr<Block> clone() const override {
+    return std::make_unique<CodeBlock>(*this);
+  }
+
+  CodeBlock( std::string_ref Contents, std::string_ref Language)
+      : Contents(std::move(Contents)), Language(std::move(Language)) {}
+
+private:
+	
+  std::string_ref Contents;
+  std::string_ref Language;
+};
+
+// Inserts two spaces after each `\n` to indent each line. First line is not
+// indented.
+ std::string_ref indentLines(const std::string_ref& Input) {
+  assert(!Input.end_with("\n") && "Input should've been trimmed.");
+  std::string_ref IndentedR;
+  // We'll add 2 spaces after each new line.
+  IndentedR.reserve(Input.size() + Input.count("\n") * 2);
+  for (char C : Input) {
+    IndentedR += C;
+    if (C == '\n')
+      IndentedR.append("  ");
+  }
+  return IndentedR;
+}
+
+class Heading : public Paragraph {
+public:
+  Heading(size_t Level) : Level(Level) {}
+  void renderMarkdown(std::ostringstream &OS) const override {
+    OS << std::string_ref(Level, '#') << ' ';
+    Paragraph::renderMarkdown(OS);
+  }
+
+private:
+  size_t Level;
+};
+
+
+
+
+
+ std::string_ref Block::asMarkdown() const {
+  std::string_ref R;
+  std::ostringstream OS(R);
+  renderMarkdown(OS);
+  return std::string_ref(OS.str()).trim();
+}
+
+ std::string_ref Block::asPlainText() const {
+  std::string_ref R;
+  std::ostringstream OS(R);
+  renderPlainText(OS);
+  return std::string_ref(OS.str()).trim().c_str();
+}
+
+     void Paragraph::renderMarkdown(std::ostringstream& OS) const {
+         bool NeedsSpace = false;
+         bool HasChunks = false;
+         for (auto& C : Chunks) {
+             if (C.SpaceBefore || NeedsSpace)
+                 OS << " ";
+             switch (C.Kind) {
+             case Chunk::PlainText:
+                 OS << renderText(C.Contents, !HasChunks);
+                 break;
+             case Chunk::InlineCode:
+                 OS << renderInlineBlock(C.Contents);
+                 break;
+             }
+             HasChunks = true;
+             NeedsSpace = C.SpaceAfter;
+         }
+         // Paragraphs are translated into markdown lines, not markdown paragraphs.
+         // Therefore it only has a single linebreak afterwards.
+         // VSCode requires two spaces at the end of line to start a new one.
+         OS << "  \n";
+     }
+
+     std::unique_ptr<Block> Paragraph::clone() const {
+         return std::make_unique<Paragraph>(*this);
+     }
+
+     /// Choose a marker to delimit `Text` from a prioritized list of options.
+     /// This is more readable than escaping for plain-text.
+     std::string_ref chooseMarker(std::vector<std::string_ref> Options,
+         const std::string_ref& Text)
+     {
+         // Prefer a delimiter whose characters don't appear in the text.
+         for (std::string_ref& S : Options)
+             if (Text.find_first_of(S) == std::string_ref::npos)
+                 return S;
+         return Options.front();
+     }
+
+     void Paragraph::renderPlainText(std::ostringstream& OS) const {
+         bool NeedsSpace = false;
+         for (auto& C : Chunks) {
+             if (C.SpaceBefore || NeedsSpace)
+                 OS << " ";
+             std::string_ref Marker = "";
+             if (C.Preserve && C.Kind == Chunk::InlineCode)
+                 Marker = chooseMarker({ "`", "'", "\"" }, C.Contents);
+             OS << Marker << C.Contents << Marker;
+             NeedsSpace = C.SpaceAfter;
+         }
+         OS << '\n';
+     }
+
+     void BulletList::renderMarkdown(std::ostringstream& OS) const {
+         for (auto& D : Items) {
+             // Instead of doing this we might prefer passing Indent to children to get
+             // rid of the copies, if it turns out to be a bottleneck.
+
+             OS << "- ";
+             OS << indentLines(D.asMarkdown()) << '\n';
+         }
+         // We need a new line after list to terminate it in markdown.
+         OS << '\n';
+     }
+
+     void BulletList::renderPlainText(std::ostringstream& OS) const {
+         for (auto& D : Items) {
+             // Instead of doing this we might prefer passing Indent to children to get
+             // rid of the copies, if it turns out to be a bottleneck.
+             OS << "- " << indentLines(D.asPlainText()) << '\n';
+         }
+     }
+
+     Paragraph& Paragraph::appendSpace() {
+         if (!Chunks.empty())
+             Chunks.back().SpaceAfter = true;
+         return *this;
+     }
+
+     Paragraph& Paragraph::appendText(const std::string_ref& Text) {
+         std::string_ref Norm = canonicalizeSpaces(Text);
+         if (Norm.empty())
+             return *this;
+         Chunks.emplace_back();
+         Chunk& C = Chunks.back();
+         C.Contents = std::move(Norm);
+         C.Kind = Chunk::PlainText;
+
+         C.SpaceBefore = std::isspace(Text.front());
+         C.SpaceAfter = std::isspace(Text.back());
+         return *this;
+     }
+
+     Paragraph& Paragraph::appendCode(const std::string_ref& Code, bool Preserve) {
+         bool AdjacentCode =
+             !Chunks.empty() && Chunks.back().Kind == Chunk::InlineCode;
+         std::string_ref Norm = canonicalizeSpaces(Code);
+         if (Norm.empty())
+             return *this;
+         Chunks.emplace_back();
+         Chunk& C = Chunks.back();
+         C.Contents = std::move(Norm);
+         C.Kind = Chunk::InlineCode;
+         C.Preserve = Preserve;
+         // Disallow adjacent code spans without spaces, markdown can't render them.
+         C.SpaceBefore = AdjacentCode;
+         return *this;
+     }
+
+     std::unique_ptr<Block> BulletList::clone() const {
+         return std::make_unique<BulletList>(*this);
+     }
+
+     class Document& BulletList::addItem() {
+         Items.emplace_back();
+         return Items.back();
+     }
+
+     Document& Document::operator=(const Document& Other) {
+         Children.clear();
+         for (const auto& C : Other.Children)
+             Children.push_back(C->clone());
+         return *this;
+     }
+
+     void Document::append(Document Other) {
+         std::move(Other.Children.begin(), Other.Children.end(),
+             std::back_inserter(Children));
+     }
+
+     Paragraph& Document::addParagraph() {
+         Children.push_back(std::make_unique<Paragraph>());
+         return *static_cast<Paragraph*>(Children.back().get());
+     }
+
+     void Document::addRuler() { Children.push_back(std::make_unique<Ruler>()); }
+
+     void Document::addCodeBlock(std::string_ref Code, std::string_ref Language) {
+         Children.emplace_back(
+             std::make_unique<CodeBlock>(std::move(Code), std::move(Language)));
+     }
+
+     std::string_ref Document::asMarkdown() const {
+         return renderBlocks(Children, &Block::renderMarkdown);
+     }
+
+     std::string_ref Document::asPlainText() const {
+         return renderBlocks(Children, &Block::renderPlainText);
+     }
+
+     BulletList& Document::addBulletList() {
+         Children.emplace_back(std::make_unique<BulletList>());
+         return *static_cast<BulletList*>(Children.back().get());
+     }
+
+     Paragraph& Document::addHeading(size_t Level) {
+         assert(Level > 0);
+         Children.emplace_back(std::make_unique<Heading>(Level));
+         return *static_cast<Paragraph*>(Children.back().get());
+     }
+ };
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/Markup.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/Markup.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/Markup.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/Markup.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,119 @@
+#pragma once
+#include <cctype> 
+#include <clocale>
+#include <cstddef>
+#include <memory>
+#include <string>
+#include <vector>
+#include <sstream>
+
+#include "string_ref.h"
+
+namespace lsp
+{
+	
+/// Holds text and knows how to lay it out. Multiple blocks can be grouped to
+/// form a document. Blocks include their own trailing newlines,  std::string_ref
+/// should trim them if need be.
+class Block {
+public:
+  virtual void renderMarkdown(std::ostringstream &OS) const = 0;
+  virtual void renderPlainText(std::ostringstream &OS) const = 0;
+  virtual std::unique_ptr<Block> clone() const = 0;
+   std::string_ref asMarkdown() const;
+   std::string_ref asPlainText() const;
+
+  virtual bool isRuler() const { return false; }
+  virtual ~Block() = default;
+};
+
+/// Represents parts of the markup that can contain strings, like inline code,
+/// code block or plain text.
+/// One must introduce different paragraphs to create separate blocks.
+class Paragraph : public Block {
+public:
+  void renderMarkdown(std::ostringstream &OS) const override;
+  void renderPlainText(std::ostringstream &OS) const override;
+  std::unique_ptr<Block> clone() const override;
+
+  /// Append plain text to the end of the string.
+  Paragraph &appendText(const std::string_ref& Text);
+
+  /// Append inline code, this translates to the ` block in markdown.
+  /// \p Preserve indicates the code span must be apparent even in plaintext.
+  Paragraph &appendCode(const std::string_ref& Code, bool Preserve = false);
+
+  /// Ensure there is space between the surrounding chunks.
+  /// Has no effect at the beginning or end of a paragraph.
+  Paragraph &appendSpace();
+
+private:
+  struct Chunk {
+    enum {
+      PlainText,
+      InlineCode,
+    } Kind = PlainText;
+    // Preserve chunk markers in plaintext.
+    bool Preserve = false;
+     std::string_ref Contents;
+    // Whether this chunk should be surrounded by whitespace.
+    // Consecutive SpaceAfter and SpaceBefore will be collapsed into one space.
+    // Code spans don't usually set this: their spaces belong "inside" the span.
+    bool SpaceBefore = false;
+    bool SpaceAfter = false;
+  };
+  std::vector<Chunk> Chunks;
+};
+
+/// Represents a sequence of one or more documents. Knows how to print them in a
+/// list like format, e.g. by prepending with "- " and indentation.
+class BulletList : public Block {
+public:
+  void renderMarkdown(std::ostringstream &OS) const override;
+  void renderPlainText(std::ostringstream &OS) const override;
+  std::unique_ptr<Block> clone() const override;
+
+  class Document &addItem();
+
+private:
+  std::vector<class Document> Items;
+};
+
+/// A format-agnostic representation for structured text. Allows rendering into
+/// markdown and plaintext.
+class Document {
+public:
+  Document() = default;
+  Document(const Document &Other) { *this = Other; }
+  Document &operator=(const Document &);
+  Document(Document &&) = default;
+  Document &operator=(Document &&) = default;
+
+  void append(Document Other);
+
+  /// Adds a semantical block that will be separate from others.
+  Paragraph &addParagraph();
+  /// Inserts a horizontal separator to the document.
+  void addRuler();
+  /// Adds a block of code. This translates to a ``` block in markdown. In plain
+  /// text representation, the code block will be surrounded by newlines.
+  void addCodeBlock( std::string_ref Code,  std::string_ref Language = "cpp");
+  /// Heading is a special type of paragraph that will be prepended with \p
+  /// Level many '#'s in markdown.
+  Paragraph &addHeading(size_t Level);
+
+  BulletList &addBulletList();
+
+  /// Doesn't contain any trailing newlines.
+  /// We try to make the markdown human-readable, e.g. avoid extra escaping.
+  /// At least one client (coc.nvim) displays the markdown verbatim!
+   std::string_ref asMarkdown() const;
+  /// Doesn't contain any trailing newlines.
+   std::string_ref asPlainText() const;
+
+private:
+  std::vector<std::unique_ptr<Block>> Children;
+};
+
+
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/Markup.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/string_ref.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/string_ref.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/string_ref.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,1059 @@
+
+#pragma once
+#include <algorithm>
+#include <string>
+#include <vector>
+#include <stdarg.h>
+#include<functional>
+
+#ifndef _WIN32
+#include <cstring>
+#endif
+namespace std
+{
+
+	/**
+	 * An extension of STL's string providing additional functionality that is often availiable in
+	 * higher-level languages such as Python.
+	 */
+	class string_ref : public string
+	{
+	public:
+
+		//static unsigned GetAutoSenseRadix(string_ref& Str) {
+		//	if (Str.empty())
+		//		return 10;
+
+		//	if (Str.start_with("0x") || Str.start_with("0X")) {
+		//		Str = Str.substr(2);
+		//		return 16;
+		//	}
+
+		//	if (Str.start_with("0b") || Str.start_with("0B")) {
+		//		Str = Str.substr(2);
+		//		return 2;
+		//	}
+
+		//	if (Str.start_with("0o")) {
+		//		Str = Str.substr(2);
+		//		return 8;
+		//	}
+
+		//	if (Str[0] == '0' && Str.size() > 1 && std::isdigit(Str[1])) {
+		//		Str = Str.substr(1);
+		//		return 8;
+		//	}
+
+		//	return 10;
+		//}
+
+		//static bool consumeUnsignedInteger(string_ref& Str, unsigned Radix,
+		//	unsigned long long& Result) {
+		//	// Autosense radix if not specified.
+		//	if (Radix == 0)
+		//		Radix = GetAutoSenseRadix(Str);
+
+		//	// Empty strings (after the radix autosense) are invalid.
+		//	if (Str.empty()) return true;
+
+		//	// Parse all the bytes of the string given this radix.  Watch for overflow.
+		//	string_ref Str2 = Str;
+		//	Result = 0;
+		//	while (!Str2.empty()) {
+		//		unsigned CharVal;
+		//		if (Str2[0] >= '0' && Str2[0] <= '9')
+		//			CharVal = Str2[0] - '0';
+		//		else if (Str2[0] >= 'a' && Str2[0] <= 'z')
+		//			CharVal = Str2[0] - 'a' + 10;
+		//		else if (Str2[0] >= 'A' && Str2[0] <= 'Z')
+		//			CharVal = Str2[0] - 'A' + 10;
+		//		else
+		//			break;
+
+		//		// If the parsed value is larger than the integer radix, we cannot
+		//		// consume any more characters.
+		//		if (CharVal >= Radix)
+		//			break;
+
+		//		// Add in this character.
+		//		unsigned long long PrevResult = Result;
+		//		Result = Result * Radix + CharVal;
+
+		//		// Check for overflow by shifting back and seeing if bits were lost.
+		//		if (Result / Radix < PrevResult)
+		//			return true;
+
+		//		Str2 = Str2.substr(1);
+		//	}
+
+		//	// We consider the operation a failure if no characters were consumed
+		//	// successfully.
+		//	if (Str.size() == Str2.size())
+		//		return true;
+
+		//	Str = Str2;
+		//	return false;
+		//}
+
+		//static bool consumeSignedInteger(string_ref& Str, unsigned Radix,
+		//	long long& Result) {
+		//	unsigned long long ULLVal;
+
+		//	// Handle positive strings first.
+		//	if (Str.empty() || Str.front() != '-') {
+		//		if (consumeUnsignedInteger(Str, Radix, ULLVal) ||
+		//			// Check for value so large it overflows a signed value.
+		//			(long long)ULLVal < 0)
+		//			return true;
+		//		Result = ULLVal;
+		//		return false;
+		//	}
+
+		//	// Get the positive part of the value.
+		//	string_ref Str2 = Str.drop_front(1);
+		//	if (consumeUnsignedInteger(Str2, Radix, ULLVal) ||
+		//		// Reject values so large they'd overflow as negative signed, but allow
+		//		// "-0".  This negates the unsigned so that the negative isn't undefined
+		//		// on signed overflow.
+		//		(long long)-ULLVal > 0)
+		//		return true;
+
+		//	Str = Str2;
+		//	Result = -ULLVal;
+		//	return false;
+		//}
+
+		///// GetAsUnsignedInteger - Workhorse method that converts a integer character
+		///// sequence of radix up to 36 to an unsigned long long value.
+		//static	bool getAsUnsignedInteger(string_ref Str, unsigned Radix,
+		//	unsigned long long& Result) {
+		//	if (consumeUnsignedInteger(Str, Radix, Result))
+		//		return true;
+
+		//	// For getAsUnsignedInteger, we require the whole string to be consumed or
+		//	// else we consider it a failure.
+		//	return !Str.empty();
+		//}
+
+		//static  bool getAsSignedInteger(string_ref Str, unsigned Radix,
+		//	long long& Result) {
+		//	if (consumeSignedInteger(Str, Radix, Result))
+		//		return true;
+
+		//	// For getAsSignedInteger, we require the whole string to be consumed or else
+		//	// we consider it a failure.
+		//	return !Str.empty();
+		//}
+
+
+		///// Parse the current string as an integer of the specified radix.  If
+		///// \p Radix is specified as zero, this does radix autosensing using
+		///// extended C rules: 0 is octal, 0x is hex, 0b is binary.
+		/////
+		///// If the string is invalid or if only a subset of the string is valid,
+		///// this returns true to signify the error.  The string is considered
+		///// erroneous if empty or if it overflows T.
+		//template <typename T>
+		//std::enable_if_t<std::numeric_limits<T>::is_signed, bool>
+		//	getAsInteger(unsigned Radix, T& Result) const {
+		//	long long LLVal;
+		//	if (getAsSignedInteger(*this, Radix, LLVal) ||
+		//		static_cast<T>(LLVal) != LLVal)
+		//		return true;
+		//	Result = LLVal;
+		//	return false;
+		//}
+
+		//template <typename T>
+		//std::enable_if_t<!std::numeric_limits<T>::is_signed, bool>
+		//	getAsInteger(unsigned Radix, T& Result) const {
+		//	unsigned long long ULLVal;
+		//	// The additional cast to unsigned long long is required to avoid the
+		//	// Visual C++ warning C4805: '!=' : unsafe mix of type 'bool' and type
+		//	// 'unsigned __int64' when instantiating getAsInteger with T = bool.
+		//	if (getAsUnsignedInteger(*this, Radix, ULLVal) ||
+		//		static_cast<unsigned long long>(static_cast<T>(ULLVal)) != ULLVal)
+		//		return true;
+		//	Result = ULLVal;
+		//	return false;
+		//}
+
+
+		
+		/**`
+		 * Default constructor
+		 *
+		 * Constructs an empty string_ref ("")
+		 */
+		string_ref() : string() { }
+
+		/**
+		 * Duplicate the STL string copy constructor
+		 *
+		 * @param[in] s   The string to copy
+		 * @param[in] pos The starting position in the string to copy from
+		 * @param[in] n   The number of characters to copy
+		 */
+		string_ref(const string &s, size_type pos = 0, size_type n = npos) : string(s, pos, npos) { }
+
+		/**
+		 * Construct an string_ref from a null-terminated character array
+		 *
+		 * @param[in] s The character array to copy into the new string
+		 */
+		string_ref(const value_type *s) : string(s) { }
+
+		/**
+		 * Construct an string_ref from a character array and a length
+		 *
+		 * @param[in] s The character array to copy into the new string
+		 * @param[in] n The number of characters to copy
+		 */
+		string_ref(const value_type *s, size_type n) : string(s, n) { }
+
+		/**
+		 * Create an string_ref with @p n copies of @p c
+		 *
+		 * @param[in] n The number of copies
+		 * @param[in] c The character to copy @p n times
+		 */
+		string_ref(size_type n, value_type c) : string(n, c) { }
+
+		/**
+		 * Create a string from a range
+		 *
+		 * @param[in] first The first element to copy in
+		 * @param[in] last  The last element to copy in
+		 */
+		template <class InputIterator>
+			string_ref(InputIterator first, InputIterator last) : string(first, last) { }
+
+		/**
+		 * The destructor
+		 */
+		~string_ref() { }
+
+		/**
+		 * Split a string by whitespace
+		 *
+		 * @return A vector of strings, each of which is a substring of the string
+		 */
+		vector<string_ref> split(size_type limit = npos) const
+		{
+			vector<string_ref> v;
+
+			const_iterator 
+				i = begin(),
+				  last = i;
+			for (; i != end(); i++)
+			{
+				if (*i == ' ' || *i == '\n' || *i == '\t' || *i == '\r')
+				{
+					if (i + 1 != end() && (i[1] == ' ' || i[1] == '\n' || i[1] == '\t' || i[1] == '\r'))
+						continue;
+					v.push_back(string_ref(last, i));
+					last = i + 1;
+					if (v.size() >= limit - 1)
+					{
+						v.push_back(string_ref(last, end()));
+						return v;
+					}
+				}
+			}
+
+			if (last != i)
+				v.push_back(string_ref(last, i));
+
+			return v;
+		}
+
+		/**
+		 * Split a string by a character
+		 *
+		 * Returns a vector of ext_strings, each of which is a substring of the string formed by splitting
+		 * it on boundaries formed by the character @p separator.  If @p limit is set, the returned vector
+		 * will contain a maximum of @p limit elements with the last element containing the rest of
+		 * the string.
+		 *
+		 * If @p separator is not found in the string, a single element will be returned in the vector
+		 * containing the entire string.
+		 *
+		 * The separators are removed from the output
+		 *
+		 * @param[in] separator The character separator to split the string on
+		 * @param[in] limit     The maximum number of output elements
+		 * @return A vector of strings, each of which is a substring of the string
+		 *
+		 * @section split_ex Example
+		 * @code
+		 * std::string_ref s("This|is|a|test.");
+		 * std::vector<std::string_ref> v = s.split('|');
+		 * std::copy(v.begin(), v.end(), std::ostream_iterator<std::string_ref>(std::cout, "\n"));
+		 *
+		 * This
+		 * is
+		 * a
+		 * test.
+		 * @endcode
+		 */
+		vector<string_ref> split(value_type separator, size_type limit = npos) const
+		{
+			vector<string_ref> v;
+
+			const_iterator 
+				i = begin(),
+				last = i;
+			for (; i != end(); i++)
+			{
+				if (*i == separator)
+				{
+					v.push_back(string_ref(last, i));
+					last = i + 1;
+					if (v.size() >= limit - 1)
+					{
+						v.push_back(string_ref(last, end()));
+						return v;
+					}
+				}
+			}
+
+			if (last != i)
+				v.push_back(string_ref(last, i));
+
+			return v;
+		}
+
+		/**
+		 * Split a string by another string
+		 *
+		 * Returns a vector of ext_strings, each of which is a substring of the string formed by
+		 * splitting it on boundaries formed by the string @p separator.  If @p limit is set, the
+		 * returned vector will contain a maximum of @p limit elements with the last element
+		 * containing the rest of the string.
+		 *
+		 * If @p separator is not found in the string, a single element will be returned in the
+		 * vector containing the entire string.
+		 *
+		 * The separators are removed from the output
+		 *
+		 * @param[in] separator The string separator to split the string on
+		 * @param[in] limit     The maximum number of output elements
+		 * @return A vector of strings, each of which is a substring of the string
+		 *
+		 * @ref split_ex
+		 */
+		vector<string_ref> split(const string &separator, size_type limit = npos) const
+		{
+			vector<string_ref> v;
+
+			const_iterator
+				i = begin(),
+				last = i;
+			for (; i != end(); i++)
+			{
+				if (string(i, i + separator.length()) == separator)
+				{
+					v.push_back(string_ref(last, i));
+					last = i + separator.length();
+
+					if (v.size() >= limit - 1)
+					{
+						v.push_back(string_ref(last, end()));
+						return v;
+					}
+				}
+			}
+
+			if (last != i)
+				v.push_back(string_ref(last, i));
+
+			return v;
+		}
+
+		/**
+		 * Convert a string into an integer
+		 *
+		 * Convert the initial portion of a string into a signed integer.  Once a non-numeric
+		 * character is reached, the remainder of @p string is ignored and the integer that was
+		 * read returned.
+		 *
+		 * @param s The string to convert
+		 * @return The integer converted from @p string
+		 */
+		static long int integer(const string &s)
+		{
+			long int retval = 0;
+			bool neg = false;
+
+			for (const_iterator i = s.begin(); i != s.end(); i++)
+			{
+				if (i == s.begin())
+				{
+					if (*i == '-')
+					{
+						neg = true;
+						continue;
+					}
+					else if (*i == '+')
+						continue;
+				}
+				if (*i >= '0' && *i <= '9')
+				{
+					retval *= 10;
+					retval += *i - '0';
+				}
+				else
+					break;
+			}
+
+			if (neg)
+				retval *= -1;
+
+			return retval;
+		}
+
+		/**
+		 * Convert the string to an integer
+		 *
+		 * Convert the initial portion of the string into a signed integer.  Once a non-numeric
+		 * character is reached, the remainder of the string is ignored and the integer that had
+		 * been read thus far is returned.
+		 *
+		 * @return The integer converted from the string
+		 */
+		long int integer() const
+		{
+			return integer(*this);
+		}
+
+		/**
+		 * Split a string into chunks of size @p chunklen.  Returns a vector of strings.
+		 *
+		 * Splits a string into chunks of the given size.  The final chunk may not fill its
+		 * entire allocated number of characters.
+		 *
+		 * @param[in] chunklen The number of characters per chunk
+		 * @return A vector of strings, each of length <= chunklen
+		 *
+		 * @section chunk_split-ex Example
+		 * @code
+		 * std::string_ref s("abcdefghijk");
+		 * std::vector<std::string_ref> v = s.chunk_split(3);
+		 * std::copy(v.begin(), v.end(), ostream_iterator<std::string_ref>(cout, " "));
+		 *
+		 * abc def ghi jk
+		 * @endcode
+		 */
+		vector<string_ref> chunk_split(size_type chunklen) const
+		{
+			vector<string_ref> retval;
+			retval.reserve(size() / chunklen + 1);
+
+			size_type count = 0;
+			const_iterator
+				i = begin(),
+				last = i;
+			for (; i != end(); i++, count++)
+			{
+				if (count == chunklen)
+				{
+					count = 0;
+					retval.push_back(string_ref(last, i));
+					last = i;
+				}
+			}
+			
+			if (last != i)
+				retval.push_back(string_ref(last, i));
+
+			return retval;
+		}
+
+		/**
+		 * Join a sequence of strings by some glue to create a new string
+		 *
+		 * Glue is not added to the end of the string.
+		 *
+		 * @pre [first, last) is a valid range
+		 * @pre InputIterator is a model of STL's Input Iterator
+		 * @pre InputIterator must point to a string type (std::string, std::string_ref, char *)
+		 *
+		 * @param[in] glue  The glue to join strings with
+		 * @param[in] first The beginning of the range to join
+		 * @param[in] last  The end of the range to join
+		 * @return A string constructed of each element of the range connected together with @p glue
+		 *
+		 * @section join_ex Example
+		 * @code
+		 * std::vector<std::string_ref> v;
+		 * v.push_back("This");
+		 * v.push_back("is");
+		 * v.push_back("a");
+		 * v.push_back("test.");
+		 * std::cout << std::string_ref::join("|", v.begin(), v.end()) << std::endl;
+		 *
+		 * This|is|a|test.
+		 * @endcode
+		 */
+		template <class InputIterator>
+			static string_ref join(const string &glue, InputIterator first, InputIterator last)
+			{
+				string_ref retval;
+
+				for (; first != last; ++first)
+				{
+					retval.append(*first);
+					retval.append(glue);
+				}
+				retval.erase(retval.length() - glue.length());
+
+				return retval;
+			}
+
+		/**
+		 * Join a sequence of strings by some glue to create a new string
+		 *
+		 * @copydoc join
+		 * @ref join_ex
+		 */
+		template <class InputIterator>
+			static string_ref join(value_type glue, InputIterator first, InputIterator last)
+			{
+				string_ref retval;
+
+				for (; first != last; ++first)
+				{
+					retval.append(*first);
+					retval.append(1, glue);
+				}
+				retval.erase(retval.length() - 1);
+
+				return retval;
+			}
+
+		/**
+		 * Search for any instances of @p needle and replace them with @p s
+		 *
+		 * @param[in] needle The string to replace
+		 * @param[in] s      The replacement string
+		 * @return				*this
+		 * @post					All instances of @p needle in the string are replaced with @p s
+		 *
+		 * @section replace-ex Example
+		 * @code
+		 * std::string_ref s("This is a test.");
+		 * s.replace("is", "ere");
+		 * std::cout << s << std::endl;
+		 *
+		 * There ere a test.
+		 * @endcode
+		 */
+		string_ref &replace(const string &needle, const string &s)
+		{
+			size_type
+				lastpos = 0,
+				thispos;
+
+			while ((thispos = find(needle, lastpos)) != npos)
+			{
+				string::replace(thispos, needle.length(), s);
+				lastpos = thispos + 1;
+			}
+			return *this;
+		}
+		string_ref &replace_first(const string &needle, const string &s)
+		{
+			size_type
+				lastpos = 0,
+				thispos;
+
+			if ((thispos = find(needle, lastpos)) != npos)
+			{
+				string::replace(thispos, needle.length(), s);
+				lastpos = thispos + 1;
+			}
+			return *this;
+		}
+		/**
+		 * Search of any instances of @p needle and replace them with @p c
+		 *
+		 * @param[in] needle The character to replace
+		 * @param[in] c      The replacement character
+		 * @return           *this
+		 * @post             All instances of @p needle in the string are replaced with @p c
+		 *
+		 * @ref replace-ex
+		 */
+		string_ref &replace(value_type needle, value_type c)
+		{
+			for (iterator i = begin(); i != end(); i++)
+				if (*i == needle)
+					*i = c;
+
+			return *this;
+		}
+
+		/**
+		 * Repeat a string @p n times
+		 *
+		 * @param[in] n The number of times to repeat the string
+		 * @return string_ref containing @p n copies of the string
+		 *
+		 * @section repeat-ex Example
+		 * @code
+		 * std::string_ref s("123");
+		 * s = s * 3;
+		 * std::cout << s << std::endl;
+		 *
+		 * 123123123
+		 * @endcode
+		 */
+		string_ref operator*(size_type n)
+		{
+			string_ref retval;
+			for (size_type i = 0; i < n; i++)
+				retval.append(*this);
+
+			return retval;
+		}
+
+		/**
+		 * Convert the string to lowercase
+		 *
+		 * @return *this
+		 * @post The string is converted to lowercase
+		 */
+		string_ref &tolower()
+		{
+			for (iterator i = begin(); i != end(); i++)
+				if (*i >= 'A' && *i <= 'Z')
+					*i = (*i) + ('a' - 'A');
+			return *this;
+		}
+
+		/**
+		 * Convert the string to uppercase
+		 *
+		 * @return *this
+		 * @post The string is converted to uppercase
+		 */
+		string_ref &toupper()
+		{
+			for (iterator i = begin(); i != end(); i++)
+				if (*i >= 'a' && *i <= 'z')
+					*i = (*i) - ('a' - 'A');
+			return *this;
+		}
+
+		/**
+		 * Count the occurances of @p str in the string.
+		 *
+		 * @return The count of substrings @p str in the string
+		 */
+		size_type count(const string &str) const
+		{
+			size_type
+				count = 0,
+				last = 0,
+				cur = 0;
+
+			while ((cur = find(str, last + 1)) != npos)
+			{
+				count++;
+				last = cur;
+			}
+
+			return count;
+		}
+
+		/**
+		 * Determine if the string is alphanumeric
+		 *
+		 * @return true if the string contains only characters between a-z, A-Z and 0-9 and
+		 * contains at least one character, else false
+		 */
+		bool is_alnum() const
+		{
+			if (length() == 0)
+				return false;
+
+			for (const_iterator i = begin(); i != end(); i++)
+			{
+				if (*i < 'A' || *i > 'Z')
+					if (*i < '0' || *i > '9')
+						if (*i < 'a' || *i > 'z')
+							return false;
+			}
+
+			return true;
+		}
+
+		/**
+		 * Determine if the string is alphabetic only
+		 *
+		 * @return true of the string contains only characters between a-z and A-Z and contains at
+		 * least one character, else false
+		 */
+		bool is_alpha() const
+		{
+			if (length() == 0)
+				return false;
+
+			for (const_iterator i = begin(); i != end(); i++)
+				if (*i < 'A' || (*i > 'Z' && (*i < 'a' || *i > 'z')))
+					return false;
+
+			return true;
+		}
+
+		/**
+		 * Determine if the string is numeric only
+		 *
+		 * @return true if the string contains only characters between 0-9 and contains at least
+		 * one character, else false
+		 */
+		bool is_numeric() const
+		{
+			if (length() == 0)
+				return false;
+
+			for (const_iterator i = begin(); i != end(); i++)
+				if (*i < '0' || *i > '9')
+					return false;
+
+			return true;
+		}
+
+		/**
+		 * Determine if a string is all lower case
+		 *
+		 * @return true if there is at least one character, and all characters are lowercase
+		 * letters, else false
+		 */
+		bool is_lower() const
+		{
+			if (length() == 0)
+				return false;
+
+			for (const_iterator i = begin(); i != end(); i++)
+				if (*i < 'a' || *i < 'z')
+					return false;
+
+			return true;
+		}
+
+		/**
+		 * Determine if a string is all upper case
+		 *
+		 * @return true if there is at least one character, and all characters are uppercase
+		 * letters, else false
+		 */
+		bool is_upper() const
+		{
+			if (length() == 0)
+				return false;
+
+			for (const_iterator i = begin(); i != end(); i++)
+				if (*i < 'A' || *i > 'Z')
+					return false;
+
+			return true;
+		}
+
+		/**
+		 * Swap the case of a string
+		 *
+		 * @post Converts all uppercase to lowercase, and all lowercase to uppercase in the string
+		 * @return *this
+		 */
+		string_ref &swapcase()
+		{
+			for (iterator i = begin(); i != end(); i++)
+				if (*i >= 'A' && *i <= 'Z')
+					*i += ('a' - 'A');
+				else if (*i >= 'a' && *i <= 'z')
+					*i -= ('a' - 'A');
+			
+			return *this;
+		}
+
+		/*******************************************************************************
+			Function:	std::string_ref::start_with
+			Access:		public 
+			Qualifier:	const
+			Parameter:	const string & str			
+			Returns:	bool		
+		
+			Purpose:	is the string start with str
+		*******************************************************************************/
+		bool start_with(const string& str) const
+		{
+			return ( this->find(str) == 0 );
+		}
+
+		/// Return a string_ref equal to 'this' but with only the last \p N
+		/// elements remaining.  If \p N is greater than the length of the
+		/// string, the entire string is returned.
+		
+		string_ref take_back(size_t N = 1) const {
+			if (N >= size())
+				return *this;
+			return drop_front(size() - N);
+		}
+		/// Return a string_ref equal to 'this' but with the first \p N elements
+		/// dropped.
+		
+		string_ref drop_front(size_t N = 1) const {
+			//assert(size() >= N && "Dropping more elements than exist");
+			return substr(N);
+		}
+
+
+
+		/// Return a string_ref equal to 'this' but with the last \p N elements
+		/// dropped.
+		
+		string_ref drop_back(size_t N = 1) const {
+		
+			return substr(0, size() - N);
+		}
+
+		/// Return a string_ref equal to 'this', but with all characters satisfying
+		/// the given predicate dropped from the beginning of the string.
+		
+		string_ref drop_while(std::function<bool(char)> F) const {
+			return substr(std::find_if_not(begin(),end(),F)-begin());
+		}
+
+		/// Return a string_ref equal to 'this', but with all characters not
+		/// satisfying the given predicate dropped from the beginning of the string.
+		
+			string_ref drop_until(std::function<bool(char)> F) const {
+			return substr(std::find_if(begin(), end(), F) - begin());
+		}
+
+		/// Returns true if this string_ref has the given prefix and removes that
+		/// prefix.
+		bool consume_front(string_ref Prefix) {
+			if (!start_with(Prefix))
+				return false;
+
+			*this = drop_front(Prefix.size());
+			return true;
+		}
+
+		/// Returns true if this string_ref has the given suffix and removes that
+		/// suffix.
+		bool consume_back(string_ref Suffix) {
+			if (!end_with(Suffix))
+				return false;
+
+			*this = drop_back(Suffix.size());
+			return true;
+		}
+
+		/*******************************************************************************
+			Function:	std::string_ref::end_with
+			Access:		public 
+			Qualifier:	const
+			Parameter:	const string & str			
+			Returns:	bool		
+		
+			Purpose:	is the string end with str
+		*******************************************************************************/
+		bool end_with(const string& str) const
+		{
+			if (str.length() > this->length())
+			{
+				return false;
+			}
+			size_type off = this->length() - str.length();
+			return ( find(str, off) == off);
+		}
+
+		/*******************************************************************************
+			Function:	hl_lib::string_ref::format
+			Access:		public 
+			Qualifier:	
+			Parameter:	const char * format_string
+			Parameter:	...
+			Returns:	string_ref&
+			
+			Purpose:	format the string
+		*******************************************************************************/
+		string_ref& format(const char* format_string, ...)
+		{
+			if (format_string == 0)
+			{
+				return *this;
+			}
+
+			va_list argList;
+			char* pbuf = 0;
+			va_start( argList, format_string );
+#ifdef _WIN32
+			int len = _vscprintf( format_string, argList );
+#else
+			int len = vsnprintf(nullptr, 0, format_string, argList);
+#endif
+			pbuf = new char[len + 1];
+			if (pbuf != 0)
+			{
+#ifdef _WIN32
+				vsprintf_s( pbuf, len + 1, format_string, argList );
+#else
+                vsprintf(pbuf, format_string, argList);
+#endif
+				*this = pbuf;
+			}
+			delete[] pbuf;
+			va_end( argList );
+
+			return *this;
+		}
+
+		/*******************************************************************************
+			Function:	hl_lib::string_ref::trim_left
+			Access:		public 
+			Qualifier:	
+			Parameter:	value_type ch
+			Returns:	string_ref&
+			
+			Purpose:	delete all char which is ch at the left of the string
+		*******************************************************************************/
+		string_ref& trim_left(value_type ch = ' ')
+		{
+			size_type off = this->find_first_not_of(ch);
+			if (off != string::npos)
+			{
+				this->erase(0, off);
+			}
+			return *this;
+		}
+
+		/*******************************************************************************
+			Function:	hl_lib::string_ref::trim_right
+			Access:		public 
+			Qualifier:	
+			Parameter:	value_type ch
+			Returns:	string_ref&
+			
+			Purpose:	delete all char which is ch at the right of the string
+		*******************************************************************************/
+		string_ref& trim_right(value_type ch = ' ')
+		{
+			size_type off = this->find_last_not_of(ch);
+			if (off == string::npos)
+			{
+				off = 0;
+			}
+			else
+			{
+				off++;
+			}
+			this->erase(off, length() - off);
+			return *this;
+		}
+
+		/*******************************************************************************
+			Function:	hl_lib::string_ref::trim
+			Access:		public 
+			Qualifier:	
+			Parameter:	value_type ch
+			Returns:	string_ref&
+			
+			Purpose:	delete all char which is ch at the left and right of the string
+		*******************************************************************************/
+		string_ref& trim(value_type ch = ' ')
+		{
+			trim_left(ch);
+			trim_right(ch);
+			return *this;
+		}
+
+		/*******************************************************************************
+			Function:	hl_lib::string_ref::float_num
+			Access:		public static 
+			Qualifier:	
+			Parameter:	const string & str
+			Returns:	double
+			
+			Purpose:	parse str to a float number
+		*******************************************************************************/
+		static double float_num(const string& str)
+		{
+			return atof(str.c_str());
+		}
+
+		/*******************************************************************************
+			Function:	hl_lib::string_ref::float_num
+			Access:		public static 
+			Qualifier:	
+			Returns:	double
+			
+			Purpose:	parse this to a float number
+		*******************************************************************************/
+		double float_num() const
+		{
+			return float_num(*this);
+		}
+
+		/*******************************************************************************
+			Function:	hl_lib::string_ref::compare_nocase
+			Access:		public 
+			Qualifier:	const
+			Parameter:	const string & str
+			Returns:	int
+			
+			Purpose:	compare string no case
+		*******************************************************************************/
+		int compare_nocase(const string& str) const
+		{
+#ifdef _WIN32
+			return _stricmp(this->c_str(), str.c_str());
+#else
+		    return strcasecmp(this->c_str(), str.c_str());
+#endif
+		}
+
+		/*******************************************************************************
+			Function:	hl_lib::string_ref::compare_nocase
+			Access:		public 
+			Qualifier:	const
+			Parameter:	size_type index
+			Parameter:	size_type length
+			Parameter:	const string & str
+			Returns:	int
+			
+			Purpose:	compare substring no case
+		*******************************************************************************/
+		int compare_nocase( size_type index, size_type length, const string &str ) const
+		{
+			string_ref temp = this->substr(index, length);
+			return temp.compare_nocase(str);
+		}
+
+		/*******************************************************************************
+			Function:	hl_lib::string_ref::compare_nocase
+			Access:		public 
+			Qualifier:	const
+			Parameter:	size_type index
+			Parameter:	size_type length
+			Parameter:	const string & str
+			Parameter:	size_type index2
+			Parameter:	size_type length2
+			Returns:	int
+			
+			Purpose:	compare two substring no case
+		*******************************************************************************/
+		int compare_nocase( size_type index, size_type length, const string &str, size_type index2,	size_type length2) const
+		{
+			string_ref temp1 = this->substr(index, length);
+			string_ref temp2 = str.substr(index2, length2);
+			return temp1.compare_nocase(temp2);
+		}
+
+	};
+
+}
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/Markup/string_ref.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ParentProcessWatcher.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ParentProcessWatcher.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ParentProcessWatcher.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,106 @@
+#include "ParentProcessWatcher.h"
+#include <boost/process.hpp>
+
+#ifdef _WIN32
+#include <boost/process/windows.hpp>
+#endif
+
+#include <boost/filesystem.hpp>
+#include <boost/asio.hpp>
+#include <iostream>
+
+#include "ProcessIoService.h"
+#include "SimpleTimer.h"
+
+
+using namespace boost::asio::ip;
+using namespace std;
+
+struct ParentProcessWatcher::ParentProcessWatcherData : std::enable_shared_from_this<ParentProcessWatcherData>
+{
+	std::unique_ptr<SimpleTimer<boost::posix_time::seconds>>  timer;
+	lsp::Log& _log;
+	std::function<void()>  on_exit;
+	lsp::ProcessIoService asio_io;
+	std::shared_ptr < boost::process::opstream>  write_to_service;
+	std::shared_ptr< boost::process::ipstream >   read_from_service;
+	int pid;
+	const  int _poll_delay_secs /*= 10*/;
+	std::string command;
+	std::shared_ptr<boost::process::child> c;
+
+	ParentProcessWatcherData(lsp::Log& log, int _pid,
+		const std::function<void()>&& callback, uint32_t  poll_delay_secs) :
+		_log(log), on_exit(callback), pid(_pid), _poll_delay_secs(poll_delay_secs)
+	{
+#ifdef _WIN32
+		command = "cmd /c \"tasklist /FI \"PID eq " + std::to_string(pid) + "\" | findstr " +
+			std::to_string(pid) + "\"";
+#else
+		command = "ps -p " + std::to_string(pid);
+#endif
+
+	}
+
+	void run()
+	{
+		write_to_service = std::make_shared<boost::process::opstream>();
+		read_from_service = std::make_shared<boost::process::ipstream>();
+
+//		const uint32_t POLL_DELAY_SECS = _poll_delay_secs;
+		auto self(shared_from_this());
+		std::error_code ec;
+		namespace bp = boost::process;
+		c = std::make_shared<bp::child>(asio_io.getIOService(), command,
+			ec,
+#ifdef _WIN32
+			bp::windows::hide,
+#endif
+			bp::std_out > *read_from_service,
+			bp::std_in < *write_to_service,
+			bp::on_exit([self](int exit_code, const std::error_code& ec_in) {
+				// the tasklist command should return 0 (parent process exists) or 1 (parent process doesn't exist)
+				if (exit_code == 1)//
+				{
+					if (self->on_exit)
+					{
+
+						std::thread([=]()
+							{
+								std::this_thread::sleep_for(std::chrono::seconds(3));
+								self->on_exit();
+							}).detach();
+					}
+				}
+				else
+				{
+					if (exit_code > 1)
+					{
+						self->_log.log(lsp::Log::Level::WARNING, "The tasklist command: '" + self->command + "' returns " + std::to_string(exit_code));
+					}
+
+					self->timer = std::make_unique<SimpleTimer<boost::posix_time::seconds>>(self->_poll_delay_secs, [=]() {
+						self->run();
+						});
+				}
+
+				}));
+		if (ec)
+		{
+			// fail
+			_log.log(lsp::Log::Level::SEVERE, "Start parent process watcher failed.");
+		}
+	}
+};
+
+ParentProcessWatcher::ParentProcessWatcher(lsp::Log& log, int pid,
+	const std::function<void()>&& callback, uint32_t  poll_delay_secs) : d_ptr(new ParentProcessWatcherData(log, pid, std::move(callback), poll_delay_secs))
+{
+	d_ptr->run();
+}
+
+ParentProcessWatcher::~ParentProcessWatcher()
+{
+	if (d_ptr->timer)
+		d_ptr->timer->Stop();
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ParentProcessWatcher.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ParentProcessWatcher.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ParentProcessWatcher.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ParentProcessWatcher.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/MessageIssue.h"
+#include <memory>
+
+class ParentProcessWatcher
+{
+public:
+	struct ParentProcessWatcherData;
+
+	ParentProcessWatcher(lsp::Log& log, int pid, const std::function<void()>&& callback, uint32_t  poll_delay_secs = 10);
+
+	~ParentProcessWatcher();
+
+	std::shared_ptr<ParentProcessWatcherData>  d_ptr;
+};
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ParentProcessWatcher.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProcessIoService.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProcessIoService.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProcessIoService.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,48 @@
+#pragma once
+#include <boost/asio.hpp>
+#include <iostream>
+
+namespace lsp
+{
+	class ProcessIoService
+	{
+	public:
+		using IOService = boost::asio::io_service;
+		using Work = boost::asio::io_service::work;
+		using WorkPtr = std::unique_ptr<Work>;
+
+		ProcessIoService() {
+
+			work_ = std::unique_ptr<Work>(new Work(ioService_));
+			auto temp_thread_ = new std::thread([this]
+				{
+					ioService_.run();
+				});
+			thread_ = std::unique_ptr<std::thread>(temp_thread_);
+		}
+
+		ProcessIoService(const ProcessIoService&) = delete;
+		ProcessIoService& operator=(const ProcessIoService&) = delete;
+
+		boost::asio::io_service& getIOService()
+		{
+			return ioService_;
+		}
+
+		void stop()
+		{
+
+			work_.reset();
+
+			thread_->join();
+
+		}
+
+	private:
+		IOService       ioService_;
+		WorkPtr        work_;
+		std::unique_ptr<std::thread>    thread_;
+
+	};
+
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProcessIoService.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProtocolJsonHandler.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProtocolJsonHandler.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProtocolJsonHandler.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,716 @@
+#include "ProtocolJsonHandler.h"
+#include "general/initialize.h"
+#include "general/shutdown.h"
+#include "textDocument/code_action.h"
+#include "textDocument/code_lens.h"
+#include "textDocument/completion.h"
+
+
+#include "textDocument/did_close.h"
+
+#include "textDocument/highlight.h"
+#include "textDocument/document_link.h"
+#include "textDocument/formatting.h"
+#include "textDocument/hover.h"
+#include "textDocument/implementation.h"
+#include "textDocument/range_formatting.h"
+#include "textDocument/references.h"
+#include "textDocument/rename.h"
+#include "textDocument/signature_help.h"
+#include "textDocument/type_definition.h"
+#include "workspace/symbol.h"
+#include "textDocument/typeHierarchy.h"
+#include "out_list.h"
+#include "extention/jdtls/codeActionResult.h"
+#include "textDocument/declaration_definition.h"
+#include "textDocument/resolveCompletionItem.h"
+#include "textDocument/resolveCodeLens.h"
+#include "textDocument/colorPresentation.h"
+#include "textDocument/foldingRange.h"
+#include "textDocument/prepareRename.h"
+#include "textDocument/resolveTypeHierarchy.h"
+#include "textDocument/callHierarchy.h"
+#include "textDocument/selectionRange.h"
+#include "extention/jdtls/classFileContents.h"
+#include "extention/jdtls/buildWorkspace.h"
+#include "extention/jdtls/listOverridableMethods.h"
+#include "extention/jdtls/addOverridableMethods.h"
+#include "extention/jdtls/checkHashCodeEqualsStatus.h"
+#include "extention/jdtls/checkConstructorsStatus.h"
+#include "extention/jdtls/checkDelegateMethodsStatus.h"
+#include "extention/jdtls/checkToStringStatus.h"
+#include "extention/jdtls/executeCommand.h"
+#include "extention/jdtls/findLinks.h"
+#include "extention/jdtls/generateAccessors.h"
+#include "extention/jdtls/generateConstructors.h"
+#include "extention/jdtls/generateDelegateMethods.h"
+#include "extention/jdtls/generateHashCodeEquals.h"
+#include "extention/jdtls/generateToString.h"
+#include "extention/jdtls/getMoveDestinations.h"
+#include "extention/jdtls/Move.h"
+#include "extention/jdtls/organizeImports.h"
+#include "general/exit.h"
+#include "general/initialized.h"
+#include "extention/jdtls/projectConfigurationUpdate.h"
+#include "textDocument/did_change.h"
+#include "textDocument/did_open.h"
+#include "textDocument/did_save.h"
+#include "textDocument/publishDiagnostics.h"
+#include "textDocument/willSave.h"
+
+#include "workspace/didChangeWorkspaceFolders.h"
+#include "workspace/did_change_configuration.h"
+#include "workspace/did_change_watched_files.h"
+#include "windows/MessageNotify.h"
+#include "language/language.h"
+#include "client/registerCapability.h"
+#include "client/unregisterCapability.h"
+#include "LibLsp/JsonRpc/Cancellation.h"
+#include "textDocument/didRenameFiles.h"
+#include "textDocument/semanticHighlighting.h"
+#include "workspace/configuration.h"
+
+
+void AddStadardResponseJsonRpcMethod(MessageJsonHandler& handler)
+{
+	
+	handler.method2response[td_initialize::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if(visitor.HasMember("error"))
+		 return 	Rsp_Error::ReflectReader(visitor);
+		
+		return td_initialize::response::ReflectReader(visitor);
+	};
+	
+	handler.method2response[td_shutdown::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_shutdown::response::ReflectReader(visitor);
+	};
+	handler.method2response[td_codeAction::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return td_codeAction::response::ReflectReader(visitor);
+	};
+	handler.method2response[td_codeLens::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_codeLens::response::ReflectReader(visitor);
+	};
+	handler.method2response[td_completion::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_completion::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[td_definition::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_definition::response::ReflectReader(visitor);
+	};
+	handler.method2response[td_declaration::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_declaration::response::ReflectReader(visitor);
+	};
+	handler.method2response[td_willSaveWaitUntil::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_willSaveWaitUntil::response::ReflectReader(visitor);
+	};
+	
+	handler.method2response[td_highlight::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_highlight::response::ReflectReader(visitor);
+	};
+	
+	handler.method2response[td_links::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_links::response::ReflectReader(visitor);
+	};
+	
+	handler.method2response[td_linkResolve::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_linkResolve::response::ReflectReader(visitor);
+	};
+	
+	handler.method2response[td_symbol::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_symbol::response::ReflectReader(visitor);
+	};
+	
+	handler.method2response[td_formatting::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_formatting::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[td_hover::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_hover::response::ReflectReader(visitor);
+	
+	};
+	
+	handler.method2response[td_implementation::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_implementation::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[td_rangeFormatting::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_rangeFormatting::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[td_references::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_references::response::ReflectReader(visitor);
+	};
+	
+	handler.method2response[td_rename::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_rename::response::ReflectReader(visitor);
+	};
+
+
+	handler.method2response[td_signatureHelp::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_signatureHelp::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[td_typeDefinition::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_typeDefinition::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[wp_executeCommand::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return wp_executeCommand::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[wp_symbol::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return wp_symbol::response::ReflectReader(visitor);
+	};
+	handler.method2response[td_typeHierarchy::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_typeHierarchy::response::ReflectReader(visitor);
+	};
+	handler.method2response[completionItem_resolve::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return completionItem_resolve::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[codeLens_resolve::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		
+		return codeLens_resolve::response::ReflectReader(visitor);
+		
+	};
+
+	handler.method2response[td_colorPresentation::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return td_colorPresentation::response::ReflectReader(visitor);
+
+	};
+	handler.method2response[td_documentColor::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return td_documentColor::response::ReflectReader(visitor);
+
+	};
+	handler.method2response[td_foldingRange::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return td_foldingRange::response::ReflectReader(visitor);
+
+	};
+	handler.method2response[td_prepareRename::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return td_prepareRename::response::ReflectReader(visitor);
+
+	};
+	handler.method2response[typeHierarchy_resolve::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return typeHierarchy_resolve::response::ReflectReader(visitor);
+
+	};
+
+	handler.method2response[td_selectionRange::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return td_selectionRange::response::ReflectReader(visitor);
+
+	};
+	handler.method2response[td_didRenameFiles::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return td_didRenameFiles::response::ReflectReader(visitor);
+
+	};
+	handler.method2response[td_willRenameFiles::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return td_willRenameFiles::response::ReflectReader(visitor);
+
+	};
+	
+}
+
+
+void AddJavaExtentionResponseJsonRpcMethod(MessageJsonHandler& handler)
+{
+	handler.method2response[java_classFileContents::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_classFileContents::response::ReflectReader(visitor);
+	};
+	handler.method2response[java_buildWorkspace::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_buildWorkspace::response::ReflectReader(visitor);
+	};
+	handler.method2response[java_listOverridableMethods::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_listOverridableMethods::response::ReflectReader(visitor);
+	};
+	handler.method2response[java_listOverridableMethods::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_listOverridableMethods::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[java_checkHashCodeEqualsStatus::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_checkHashCodeEqualsStatus::response::ReflectReader(visitor);
+	};
+
+
+	handler.method2response[java_addOverridableMethods::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_addOverridableMethods::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[java_checkConstructorsStatus::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_checkConstructorsStatus::response::ReflectReader(visitor);
+	};
+
+
+	handler.method2response[java_checkDelegateMethodsStatus::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_checkDelegateMethodsStatus::response::ReflectReader(visitor);
+	};
+	handler.method2response[java_checkToStringStatus::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_checkToStringStatus::response::ReflectReader(visitor);
+	};
+
+
+	handler.method2response[java_generateAccessors::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_generateAccessors::response::ReflectReader(visitor);
+	};
+	handler.method2response[java_generateConstructors::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_generateConstructors::response::ReflectReader(visitor);
+	};
+	handler.method2response[java_generateDelegateMethods::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_generateDelegateMethods::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[java_generateHashCodeEquals::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_generateHashCodeEquals::response::ReflectReader(visitor);
+	};
+	handler.method2response[java_generateToString::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_generateToString::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[java_generateToString::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_generateToString::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[java_getMoveDestinations::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_getMoveDestinations::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[java_getRefactorEdit::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_getRefactorEdit::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[java_move::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_move::response ::ReflectReader(visitor);
+	};
+
+	handler.method2response[java_organizeImports::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_organizeImports::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[java_resolveUnimplementedAccessors::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_resolveUnimplementedAccessors::response::ReflectReader(visitor);
+	};
+
+	handler.method2response[java_searchSymbols::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return java_searchSymbols::response::ReflectReader(visitor);
+	};
+
+	handler.method2request[WorkspaceConfiguration::request::kMethodInfo] = [](Reader& visitor)
+	{
+		return WorkspaceConfiguration::request::ReflectReader(visitor);
+	};
+	handler.method2request[WorkspaceFolders::request::kMethodInfo] = [](Reader& visitor)
+	{
+		return WorkspaceFolders::request::ReflectReader(visitor);
+	};
+	
+}
+
+void AddNotifyJsonRpcMethod(MessageJsonHandler& handler)
+{
+
+	handler.method2notification[Notify_Exit::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_Exit::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[Notify_InitializedNotification::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_InitializedNotification::notify::ReflectReader(visitor);
+	};
+
+	handler.method2notification[java_projectConfigurationUpdate::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return java_projectConfigurationUpdate::notify::ReflectReader(visitor);
+	};
+
+	handler.method2notification[Notify_TextDocumentDidChange::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_TextDocumentDidChange::notify::ReflectReader(visitor);
+	};
+
+	handler.method2notification[Notify_TextDocumentDidClose::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_TextDocumentDidClose::notify::ReflectReader(visitor);
+	};
+
+
+	handler.method2notification[Notify_TextDocumentDidOpen::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_TextDocumentDidOpen::notify::ReflectReader(visitor);
+	};
+
+	handler.method2notification[Notify_TextDocumentDidSave::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_TextDocumentDidSave::notify::ReflectReader(visitor);
+	};
+
+	handler.method2notification[Notify_TextDocumentPublishDiagnostics::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_TextDocumentPublishDiagnostics::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[Notify_semanticHighlighting::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_semanticHighlighting::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[td_willSave::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return td_willSave::notify::ReflectReader(visitor);
+	};
+
+	handler.method2notification[Notify_LogMessage::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_LogMessage::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[Notify_ShowMessage::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_ShowMessage::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[Notify_WorkspaceDidChangeWorkspaceFolders::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_WorkspaceDidChangeWorkspaceFolders::notify::ReflectReader(visitor);
+	};
+
+	handler.method2notification[Notify_WorkspaceDidChangeConfiguration::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_WorkspaceDidChangeConfiguration::notify::ReflectReader(visitor);
+	};
+
+
+	handler.method2notification[Notify_WorkspaceDidChangeWatchedFiles::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_WorkspaceDidChangeWatchedFiles::notify::ReflectReader(visitor);
+	};
+
+	handler.method2notification[Notify_sendNotification::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_sendNotification::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[lang_status::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return lang_status::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[lang_actionableNotification::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return lang_actionableNotification::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[lang_progressReport::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return lang_progressReport::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[lang_eventNotification::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return lang_eventNotification::notify::ReflectReader(visitor);
+	};
+}
+
+void AddRequstJsonRpcMethod(MessageJsonHandler& handler)
+{
+	handler.method2request[Req_ClientRegisterCapability::request::kMethodInfo]= [](Reader& visitor)
+	{
+
+		return Req_ClientRegisterCapability::request::ReflectReader(visitor);
+	};
+	handler.method2request[Req_ClientUnregisterCapability::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+		return Req_ClientUnregisterCapability::request::ReflectReader(visitor);
+	};
+}
+
+void AddStandardRequestJsonRpcMethod(MessageJsonHandler& handler)
+{
+
+	handler.method2request[td_initialize::request::kMethodInfo] = [](Reader& visitor)
+	{
+	
+		return td_initialize::request::ReflectReader(visitor);
+	};
+	handler.method2request[td_shutdown::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+		return td_shutdown::request::ReflectReader(visitor);
+	};
+	handler.method2request[td_codeAction::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+
+		return td_codeAction::request::ReflectReader(visitor);
+	};
+	handler.method2request[td_codeLens::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+		return td_codeLens::request::ReflectReader(visitor);
+	};
+	handler.method2request[td_completion::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+		return td_completion::request::ReflectReader(visitor);
+	};
+
+	handler.method2request[td_definition::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+		return td_definition::request::ReflectReader(visitor);
+	};
+	handler.method2request[td_declaration::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+		return td_declaration::request::ReflectReader(visitor);
+	};
+	handler.method2request[td_willSaveWaitUntil::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+		return td_willSaveWaitUntil::request::ReflectReader(visitor);
+	};
+
+	handler.method2request[td_highlight::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+		return td_highlight::request::ReflectReader(visitor);
+	};
+
+	handler.method2request[td_links::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+		return td_links::request::ReflectReader(visitor);
+	};
+
+	handler.method2request[td_linkResolve::request::kMethodInfo] = [](Reader& visitor)
+	{
+	
+		return td_linkResolve::request::ReflectReader(visitor);
+	};
+
+	handler.method2request[td_symbol::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+		return td_symbol::request::ReflectReader(visitor);
+	};
+
+	handler.method2request[td_formatting::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+		return td_formatting::request::ReflectReader(visitor);
+	};
+
+	handler.method2request[td_hover::request::kMethodInfo] = [](Reader& visitor)
+	{
+		return td_hover::request::ReflectReader(visitor);
+	};
+
+	handler.method2request[td_implementation::request::kMethodInfo] = [](Reader& visitor)
+	{
+	
+		return td_implementation::request::ReflectReader(visitor);
+	};
+	
+	handler.method2request[td_didRenameFiles::request::kMethodInfo] = [](Reader& visitor)
+	{
+
+		return td_didRenameFiles::request::ReflectReader(visitor);
+	};
+	
+	handler.method2request[td_willRenameFiles::request::kMethodInfo] = [](Reader& visitor)
+	{
+		return td_willRenameFiles::request::ReflectReader(visitor);
+	};
+}
+
+
+lsp::ProtocolJsonHandler::ProtocolJsonHandler()
+{
+	AddStadardResponseJsonRpcMethod(*this);
+	AddJavaExtentionResponseJsonRpcMethod(*this);
+	AddNotifyJsonRpcMethod(*this);
+	AddStandardRequestJsonRpcMethod(*this);
+	AddRequstJsonRpcMethod(*this);
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProtocolJsonHandler.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProtocolJsonHandler.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProtocolJsonHandler.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProtocolJsonHandler.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/MessageJsonHandler.h"
+namespace lsp {
+	class ProtocolJsonHandler : public MessageJsonHandler
+	{
+	public:
+		ProtocolJsonHandler();
+	};
+
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ProtocolJsonHandler.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ResourceOperation.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ResourceOperation.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ResourceOperation.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,121 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+#include <vector>
+#include "lsDocumentUri.h"
+#include "LibLsp/lsp/lsAny.h"
+#include "LibLsp/lsp/lsTextEdit.h"
+struct ResourceOperation {
+	std::string kind;
+	virtual  ~ResourceOperation() = default;
+	
+	MAKE_SWAP_METHOD(ResourceOperation, kind);
+};
+MAKE_REFLECT_STRUCT(ResourceOperation, kind);
+extern void Reflect(Writer& visitor, ResourceOperation* value);
+struct CreateFileOptions{
+
+	/**
+	 * Overwrite existing file. Overwrite wins over `ignoreIfExists`
+	 */
+	boost::optional<bool>  overwrite = false;
+
+	/**
+	 * Ignore if exists.
+	 */
+	boost::optional< bool> ignoreIfExists =false;
+	
+	MAKE_SWAP_METHOD(CreateFileOptions, overwrite, ignoreIfExists)
+};
+MAKE_REFLECT_STRUCT(CreateFileOptions, overwrite, ignoreIfExists)
+struct lsCreateFile :public ResourceOperation {
+
+	/**
+	 * The resource to create.
+	 */
+	lsCreateFile();
+	lsDocumentUri uri;
+
+	/**
+	 * Additional options
+	 */
+	boost::optional<CreateFileOptions>  options;
+
+
+	/**
+	 * An optional annotation identifer describing the operation.
+	 *
+	 * @since 3.16.0
+	 */
+	boost::optional<lsChangeAnnotationIdentifier> annotationId;
+	
+	MAKE_SWAP_METHOD(lsCreateFile, kind, uri, options, annotationId)
+};
+MAKE_REFLECT_STRUCT(lsCreateFile, kind, uri,options, annotationId)
+
+
+struct DeleteFileOptions {
+	/**
+	 * Delete the content recursively if a folder is denoted.
+	 */
+	boost::optional<bool>  recursive = false;
+
+	/**
+	 * Ignore the operation if the file doesn't exist.
+	 */
+	boost::optional<bool> ignoreIfNotExists = false;
+
+
+	MAKE_SWAP_METHOD(DeleteFileOptions, recursive, ignoreIfNotExists);
+};
+
+MAKE_REFLECT_STRUCT(DeleteFileOptions, recursive, ignoreIfNotExists)
+
+struct lsDeleteFile :public ResourceOperation {
+	/**
+	 * The file to delete.
+	 */
+	lsDeleteFile();
+	lsDocumentUri uri;
+
+	/**
+	 * Delete options.
+	 */
+	boost::optional<DeleteFileOptions>  options;
+
+	MAKE_SWAP_METHOD(lsDeleteFile, kind, uri, options);
+};
+MAKE_REFLECT_STRUCT(lsDeleteFile, kind, uri,options);
+
+typedef  CreateFileOptions RenameFileOptions;
+struct lsRenameFile :public ResourceOperation {
+	/**
+	 * The old (existing) location.
+	 */
+	lsRenameFile();
+	lsDocumentUri oldUri;
+
+	/**
+	 * The new location.
+	 */
+
+	lsDocumentUri newUri;
+
+	/**
+	 * Rename options.
+	 */
+	boost::optional<RenameFileOptions>  options;
+
+	/**
+	 * An optional annotation identifer describing the operation.
+	 *
+	 * @since 3.16.0
+	 */
+	boost::optional<lsChangeAnnotationIdentifier> annotationId;
+	
+	MAKE_SWAP_METHOD(lsRenameFile, kind, oldUri, newUri, options, annotationId)
+};
+MAKE_REFLECT_STRUCT(lsRenameFile, kind, oldUri, newUri, options, annotationId);
+
+
+extern  ResourceOperation* GetResourceOperation(lsp::Any& lspAny);
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/ResourceOperation.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/SimpleTimer.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/SimpleTimer.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/SimpleTimer.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,49 @@
+#pragma once
+#include <thread>
+#include <atomic>
+#include <functional>
+#include <boost/asio.hpp>
+
+template<typename Duration = boost::posix_time::milliseconds>
+class SimpleTimer
+{
+public:
+    SimpleTimer(unsigned int duration,const std::function<void()>& _call_back)
+	:is_running_(true), call_back(_call_back), _deadline_timer(_ios, Duration(duration))
+    {
+        _deadline_timer.async_wait([&](const boost::system::error_code& e)
+        {
+            if (e.value() == boost::asio::error::operation_aborted)
+            {
+                return;
+            }
+            if(is_running_.load(std::memory_order_relaxed))
+            {
+                call_back();
+            }
+
+        });
+        _thread = std::thread([this] { _ios.run(); });
+    }
+    ~SimpleTimer()
+    {
+        Stop();
+    }
+    void Stop()
+    {
+        is_running_.store(false, std::memory_order_relaxed);
+        _ios.stop();
+        if (_thread.joinable())
+        {
+            _thread.join();
+        }
+    }
+private:
+    std::atomic_bool is_running_;
+    std::function<void()> call_back;
+    boost::asio::io_service _ios;
+    boost::asio::deadline_timer _deadline_timer;
+    std::thread _thread;
+
+
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/SimpleTimer.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/client/registerCapability.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/client/registerCapability.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/client/registerCapability.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,49 @@
+#pragma once
+#include "LibLsp/JsonRpc/message.h"
+#include "LibLsp/lsp/lsDocumentUri.h"
+
+/**
+ * General parameters to register for a capability.
+ */
+
+struct Registration {
+	static  Registration Create(const std::string& method);
+	/**
+	 * The id used to register the request. The id can be used to deregister
+	 * the request again.
+	 */
+	std::string id;
+
+	/**
+	 * The method / capability to register for.
+	 */
+
+	std::string method;
+	
+	MAKE_SWAP_METHOD(Registration, id, method);
+};
+
+
+MAKE_REFLECT_STRUCT(Registration, id, method);
+
+/**
+ * The client/registerCapability request is sent from the server to the client to register
+ * for a new capability on the client side. Not all clients need to support dynamic
+ * capability registration. A client opts in via the dynamicRegistration property on the
+ * specific client capabilities. A client can even provide dynamic registration for
+ * capability A but not for capability B (see TextDocumentClientCapabilities as an example).
+ */
+struct RegistrationParams
+{
+	std::vector<Registration> registrations;
+	MAKE_SWAP_METHOD(RegistrationParams, registrations);
+};
+/**
+ * The client/registerCapability request is sent from the server to the client
+ * to register for a new capability on the client side.
+ * Not all clients need to support dynamic capability registration.
+ * A client opts in via the ClientCapabilities.dynamicRegistration property
+ */
+MAKE_REFLECT_STRUCT(RegistrationParams, registrations);
+
+DEFINE_REQUEST_RESPONSE_TYPE(Req_ClientRegisterCapability, RegistrationParams,JsonNull, "client/registerCapability");
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/client/registerCapability.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/client/unregisterCapability.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/client/unregisterCapability.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/client/unregisterCapability.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,41 @@
+#pragma once
+
+#include "LibLsp/lsp/lsDocumentUri.h"
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+/**
+ * General parameters to unregister a capability.
+ */
+
+struct Unregistration {
+	/**
+	 * The id used to unregister the request or notification. Usually an id
+	 * provided during the register request.
+	 */
+
+	std::string id;
+
+	/**
+	 * The method / capability to unregister for.
+	 */
+
+	std::string method;
+	
+	MAKE_SWAP_METHOD(Unregistration, id, method);
+};
+MAKE_REFLECT_STRUCT(Unregistration, id, method);
+/**
+ * The client/unregisterCapability request is sent from the server to the client to unregister
+ * a previously registered capability.
+ */
+struct UnregistrationParams
+{
+	std::vector<Unregistration> unregisterations;
+	MAKE_SWAP_METHOD(UnregistrationParams, unregisterations);
+};
+
+MAKE_REFLECT_STRUCT(UnregistrationParams, unregisterations);
+
+DEFINE_REQUEST_RESPONSE_TYPE(Req_ClientUnregisterCapability, UnregistrationParams,JsonNull, "client/unregisterCapability");
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/client/unregisterCapability.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/Move.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/Move.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/Move.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <string>
+#include "LibLsp/lsp/CodeActionParams.h"
+#include "getMoveDestinations.h"
+#include "getRefactorEdit.h"
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_move, MoveParams, RefactorWorkspaceEdit, "java/move");
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/Move.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/OverridableMethod.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/OverridableMethod.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/OverridableMethod.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,34 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+#include <string>
+struct OverridableMethod
+{
+	std::string bindingKey;
+	std::string name;
+	std::vector<std::string> parameters;
+	bool unimplemented = false;
+	std::string declaringClass;
+	std::string declaringClassType;
+
+	void swap(OverridableMethod& arg) noexcept
+	{
+		bindingKey.swap(arg.bindingKey);
+		name.swap(arg.name);
+		parameters.swap(arg.parameters);
+		declaringClass.swap(arg.declaringClass);
+		declaringClassType.swap(arg.declaringClassType);
+		std::swap(unimplemented, arg.unimplemented);
+	}
+};
+MAKE_REFLECT_STRUCT(OverridableMethod, bindingKey, name, parameters, unimplemented, declaringClass, declaringClassType);
+
+struct  OverridableMethodsResponse
+{
+	std::string type;
+	std::vector<OverridableMethod> methods;
+
+	MAKE_SWAP_METHOD(OverridableMethodsResponse, type, methods)
+};
+
+MAKE_REFLECT_STRUCT(OverridableMethodsResponse, type, methods)


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/OverridableMethod.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+#include <string>
+
+
+struct  WorkspaceSymbolParams
+{
+	std::string query;
+	MAKE_SWAP_METHOD(WorkspaceSymbolParams, query);
+};
+MAKE_REFLECT_STRUCT(WorkspaceSymbolParams, query);
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/addOverridableMethods.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/addOverridableMethods.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/addOverridableMethods.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/message.h"
+#include "OverridableMethod.h"
+#include "LibLsp/lsp/CodeActionParams.h"
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+struct AddOverridableMethodParams {
+	lsCodeActionParams context;
+	std::vector<OverridableMethod> overridableMethods;
+
+	MAKE_SWAP_METHOD(AddOverridableMethodParams, context, overridableMethods);
+};
+
+MAKE_REFLECT_STRUCT(AddOverridableMethodParams, context, overridableMethods);
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_addOverridableMethods, AddOverridableMethodParams, lsWorkspaceEdit, "java/addOverridableMethods");
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/addOverridableMethods.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/buildWorkspace.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/buildWorkspace.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/buildWorkspace.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "WorkspaceSymbolParams.h"
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+
+
+
+
+enum class  BuildWorkspaceStatus : uint8_t{
+
+	FAILED, SUCCEED, WITH_ERROR, CANCELLED,
+};
+MAKE_REFLECT_TYPE_PROXY(BuildWorkspaceStatus)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_buildWorkspace, bool, BuildWorkspaceStatus, "java/buildWorkspace");
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/buildWorkspace.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkConstructorsStatus.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkConstructorsStatus.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkConstructorsStatus.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/lsp/CodeActionParams.h"
+#include "checkHashCodeEqualsStatus.h"
+
+struct  LspMethodBinding {
+	 std::string bindingKey;
+	 std::string name;
+	std::vector< std::string> parameters;
+
+	MAKE_SWAP_METHOD(LspMethodBinding, bindingKey, name, parameters);
+};
+MAKE_REFLECT_STRUCT(LspMethodBinding, bindingKey, name, parameters);
+
+
+struct CheckConstructorsResponse {
+	std::vector<LspMethodBinding> constructors;
+	std::vector<LspVariableBinding>  fields;
+	MAKE_SWAP_METHOD(CheckConstructorsResponse, constructors, fields)
+};
+MAKE_REFLECT_STRUCT(CheckConstructorsResponse, constructors,fields)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_checkConstructorsStatus, lsCodeActionParams, CheckConstructorsResponse,"java/checkConstructorsStatus")
+
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkConstructorsStatus.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkDelegateMethodsStatus.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkDelegateMethodsStatus.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkDelegateMethodsStatus.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/CodeActionParams.h"
+#include "checkHashCodeEqualsStatus.h"
+#include "checkConstructorsStatus.h"
+
+struct  LspDelegateField {
+	LspVariableBinding field;
+	std::vector<LspMethodBinding> delegateMethods;
+
+	MAKE_SWAP_METHOD(LspDelegateField, field, delegateMethods);
+};
+MAKE_REFLECT_STRUCT(LspDelegateField, field, delegateMethods);
+
+
+struct CheckDelegateMethodsResponse {
+	std::vector<LspDelegateField> delegateFields;
+
+	MAKE_SWAP_METHOD(CheckDelegateMethodsResponse, delegateFields)
+};
+MAKE_REFLECT_STRUCT(CheckDelegateMethodsResponse, delegateFields)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_checkDelegateMethodsStatus,
+	lsCodeActionParams, CheckDelegateMethodsResponse, "java/checkDelegateMethodsStatus");
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkDelegateMethodsStatus.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkHashCodeEqualsStatus.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkHashCodeEqualsStatus.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkHashCodeEqualsStatus.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,36 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include <LibLsp/lsp/lsCodeAction.h>
+
+#include "LibLsp/lsp/CodeActionParams.h"
+
+struct LspVariableBinding {
+	std::string bindingKey;
+	std::string name;
+	std::string type;
+	bool isField;
+	void swap(LspVariableBinding& arg) noexcept
+	{
+		bindingKey.swap(arg.bindingKey);
+		name.swap(arg.name);
+		type.swap(arg.type);
+		std::swap(isField, arg.isField);
+	}
+};
+MAKE_REFLECT_STRUCT(LspVariableBinding, bindingKey, name, type, isField)
+
+struct CheckHashCodeEqualsResponse {
+	 std::string type;
+	 std::vector<LspVariableBinding>  fields;
+	 std::vector<std::string> existingMethods;
+	 MAKE_SWAP_METHOD(CheckHashCodeEqualsResponse, type, fields, type, existingMethods)
+};
+MAKE_REFLECT_STRUCT(CheckHashCodeEqualsResponse, type, fields, type, existingMethods)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_checkHashCodeEqualsStatus,
+	lsCodeActionParams, CheckHashCodeEqualsResponse, "java/checkHashCodeEqualsStatus")
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkHashCodeEqualsStatus.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkToStringStatus.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkToStringStatus.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkToStringStatus.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/CodeActionParams.h"
+#include "checkHashCodeEqualsStatus.h"
+struct CheckToStringResponse {
+	std::string type;
+	std::vector<LspVariableBinding>  fields;
+	 bool exists;
+	 void swap(CheckToStringResponse& arg) noexcept
+	 {
+		 type.swap(arg.type);
+		 fields.swap(arg.fields);
+		 std::swap(exists, arg.exists);
+	 }
+};
+MAKE_REFLECT_STRUCT(CheckToStringResponse,type,fields,exists)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_checkToStringStatus,
+	lsCodeActionParams, CheckToStringResponse ,"java/checkToStringStatus")
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/checkToStringStatus.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/classFileContents.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/classFileContents.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/classFileContents.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,10 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include <string>
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_classFileContents, lsTextDocumentIdentifier, std::string ,"java/classFileContents");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/classFileContents.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/codeActionResult.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/codeActionResult.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/codeActionResult.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+#include "LibLsp/JsonRpc/message.h"
+#include "LibLsp/lsp/lsCodeAction.h"
+#include "LibLsp/lsp/workspace/execute_command.h"
+#include <set>
+#include "LibLsp/lsp/textDocument/code_action.h"
+
+namespace SourceAssistProcessor {
+
+	/*std::set<std::string> UNSUPPORTED_RESOURCES = { "module-info.java", "package-info.java"
+	};*/
+
+//	static  const char* COMMAND_ID_ACTION_OVERRIDEMETHODSPROMPT = "java.action.overrideMethodsPrompt";
+//	static  const char* COMMAND_ID_ACTION_HASHCODEEQUALSPROMPT = "java.action.hashCodeEqualsPrompt";
+//	static  const char* COMMAND_ID_ACTION_ORGANIZEIMPORTS = "java.action.organizeImports";
+//	static  const char* COMMAND_ID_ACTION_GENERATETOSTRINGPROMPT = "java.action.generateToStringPrompt";
+//	static  const char* COMMAND_ID_ACTION_GENERATEACCESSORSPROMPT = "java.action.generateAccessorsPrompt";
+//	static  const char* COMMAND_ID_ACTION_GENERATECONSTRUCTORSPROMPT = "java.action.generateConstructorsPrompt";
+//	static  const char* COMMAND_ID_ACTION_GENERATEDELEGATEMETHODSPROMPT = "java.action.generateDelegateMethodsPrompt";
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/codeActionResult.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/executeCommand.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/executeCommand.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/executeCommand.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,29 @@
+#pragma once
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <string>
+#include "LibLsp/lsp/lsWorkspaceEdit.h"
+#include "LibLsp/lsp/ExecuteCommandParams.h"
+namespace  buildpath
+{
+//	static  const char* EDIT_ORGNIZEIMPORTS = "java.edit.organizeImports";
+//	static  const char* RESOLVE_SOURCE_ATTACHMENT = "java.project.resolveSourceAttachment";
+
+//	static  const char* UPDATE_SOURCE_ATTACHMENT = "java.project.updateSourceAttachment";
+
+//	static  const char* ADD_TO_SOURCEPATH = "java.project.addToSourcePath";
+
+//	static  const char* REMOVE_FROM_SOURCEPATH = "java.project.removeFromSourcePath";
+
+//	static  const char* LIST_SOURCEPATHS = "java.project.listSourcePaths";
+	struct Result {
+		bool status;
+		std::string message;
+	};
+
+
+
+}
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_executeCommand, ExecuteCommandParams, lsWorkspaceEdit, "java/executeCommand");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/executeCommand.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/findLinks.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/findLinks.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/findLinks.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <string>
+#include "LibLsp/lsp/CodeActionParams.h"
+#include "getRefactorEdit.h"
+#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
+
+struct  FindLinksParams {
+	// Supported link types: superImplementation
+	std::string type;
+	lsTextDocumentPositionParams position;
+	
+	MAKE_SWAP_METHOD(FindLinksParams, type, position)
+};
+MAKE_REFLECT_STRUCT(FindLinksParams,type,position)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_findLinks, FindLinksParams,lsp::Any, "java/findLinks");
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/findLinks.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateAccessors.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateAccessors.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateAccessors.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <string>
+#include "checkHashCodeEqualsStatus.h"
+#include "resolveUnimplementedAccessors.h"
+
+
+struct GenerateAccessorsParams {
+	lsCodeActionParams context;
+	std::vector<AccessorField>  accessors;
+
+
+	MAKE_SWAP_METHOD(GenerateAccessorsParams, context, accessors)
+};
+MAKE_REFLECT_STRUCT(GenerateAccessorsParams, context, accessors)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_generateAccessors, GenerateAccessorsParams, lsWorkspaceEdit, "java/generateAccessors");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateAccessors.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateConstructors.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateConstructors.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateConstructors.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <string>
+#include "checkHashCodeEqualsStatus.h"
+#include "checkConstructorsStatus.h"
+
+
+struct GenerateConstructorsParams {
+	lsCodeActionParams context;
+	std::vector<LspMethodBinding> constructors;
+	std::vector< LspVariableBinding >fields;
+	MAKE_SWAP_METHOD(GenerateConstructorsParams, context, fields)
+};
+MAKE_REFLECT_STRUCT(GenerateConstructorsParams, context, fields)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_generateConstructors, GenerateConstructorsParams, lsWorkspaceEdit, "java/generateConstructors");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateConstructors.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateDelegateMethods.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateDelegateMethods.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateDelegateMethods.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <string>
+#include "checkHashCodeEqualsStatus.h"
+#include "checkConstructorsStatus.h"
+
+struct  LspDelegateEntry {
+	LspVariableBinding field;
+	LspMethodBinding delegateMethod;
+	MAKE_SWAP_METHOD(LspDelegateEntry, field, delegateMethod);
+};
+MAKE_REFLECT_STRUCT(LspDelegateEntry, field, delegateMethod);
+
+
+struct GenerateDelegateMethodsParams {
+	lsCodeActionParams context;
+	std::vector<LspDelegateEntry> delegateEntries;
+	MAKE_SWAP_METHOD(GenerateDelegateMethodsParams, context, delegateEntries)
+};
+MAKE_REFLECT_STRUCT(GenerateDelegateMethodsParams, context, delegateEntries)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_generateDelegateMethods, GenerateDelegateMethodsParams, lsWorkspaceEdit, "java/generateDelegateMethods");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateDelegateMethods.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateHashCodeEquals.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateHashCodeEquals.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateHashCodeEquals.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <LibLsp/lsp/lsCodeAction.h>
+
+#include "LibLsp/lsp/CodeActionParams.h"
+#include "checkHashCodeEqualsStatus.h"
+
+struct GenerateHashCodeEqualsParams {
+	lsCodeActionParams context;
+	std::vector<LspVariableBinding>  fields;
+	bool regenerate= false;
+	void swap(GenerateHashCodeEqualsParams& arg) noexcept
+	{
+		context.swap(arg.context);
+		fields.swap(arg.fields);
+		std::swap(regenerate, arg.regenerate);
+	}
+};
+MAKE_REFLECT_STRUCT(GenerateHashCodeEqualsParams, context, fields, regenerate);
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_generateHashCodeEquals, GenerateHashCodeEqualsParams, lsWorkspaceEdit, "java/generateHashCodeEquals")
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateHashCodeEquals.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateToString.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateToString.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateToString.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <string>
+#include "checkHashCodeEqualsStatus.h"
+
+
+struct GenerateToStringParams {
+	lsCodeActionParams context;
+	std::vector< LspVariableBinding >fields;
+	
+	MAKE_SWAP_METHOD(GenerateToStringParams, context, fields)
+	
+};
+MAKE_REFLECT_STRUCT(GenerateToStringParams, context, fields)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_generateToString, GenerateToStringParams, lsWorkspaceEdit, "java/generateToString");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/generateToString.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/getMoveDestinations.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/getMoveDestinations.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/getMoveDestinations.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,65 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <string>
+#include "LibLsp/lsp/lsAny.h"
+#include "LibLsp/lsp/CodeActionParams.h"
+
+struct MoveKindInfo
+{
+	static   std::string moveResource()
+	{
+		return "moveResource";
+	}
+	static   std::string moveInstanceMethod()
+	{
+		return "moveInstanceMethod";
+	}
+	static   std::string moveStaticMember()
+	{
+		return "moveStaticMember";
+	}
+};
+
+struct MoveParams {
+	/**
+	 * The supported move kind: moveResource, moveInstanceMethod, moveStaticMember,
+	 * moveTypeToNewFile.
+	 */
+	std::string moveKind;
+	/**
+	 * The selected resource uris when the move operation is triggered.
+	 */
+	std::vector<std::string> sourceUris;
+	/**
+	 * The code action params when the move operation is triggered.
+	 */
+	boost::optional<lsCodeActionParams>  params;
+	/**
+	 * The possible destination: a folder/package, class, instanceDeclaration.
+	 */
+	lsp::Any destination;
+	bool updateReferences;
+	void swap(MoveParams& arg) noexcept
+	{
+		moveKind.swap(arg.moveKind);
+		sourceUris.swap(arg.sourceUris);
+		params.swap(arg.params);
+		destination.swap(arg.destination);
+		std::swap(updateReferences, arg.updateReferences);
+	}
+};
+MAKE_REFLECT_STRUCT(MoveParams, moveKind, sourceUris, params, destination, updateReferences);
+
+struct MoveDestinationsResponse {
+	std::string errorMessage;
+	std::vector<lsp::Any > destinations;
+	MAKE_SWAP_METHOD(MoveDestinationsResponse, errorMessage, destinations);
+};
+MAKE_REFLECT_STRUCT(MoveDestinationsResponse, errorMessage, destinations);
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_getMoveDestinations, MoveParams, MoveDestinationsResponse, "java/getMoveDestinations");
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/getMoveDestinations.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/getRefactorEdit.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/getRefactorEdit.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/getRefactorEdit.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,77 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+
+
+#include <string>
+#include <vector>
+#include "WorkspaceSymbolParams.h"
+#include "LibLsp/lsp/method_type.h"
+#include "LibLsp/lsp/textDocument/code_action.h"
+#include "LibLsp/lsp/lsFormattingOptions.h"
+
+namespace
+RefactorProposalUtility
+{
+	extern  const char* APPLY_REFACTORING_COMMAND_ID;
+	extern  const char* EXTRACT_VARIABLE_ALL_OCCURRENCE_COMMAND;
+	extern  const char* EXTRACT_VARIABLE_COMMAND;
+	extern  const char* EXTRACT_CONSTANT_COMMAND;
+	extern  const char* EXTRACT_METHOD_COMMAND;
+	extern  const char* EXTRACT_FIELD_COMMAND;
+	extern  const char* CONVERT_VARIABLE_TO_FIELD_COMMAND;
+	extern  const char* MOVE_FILE_COMMAND;
+	extern  const char* MOVE_INSTANCE_METHOD_COMMAND;
+	extern  const char* MOVE_STATIC_MEMBER_COMMAND;
+	extern  const char* MOVE_TYPE_COMMAND;
+};
+
+
+struct RenamePosition {
+	lsDocumentUri uri;
+	int offset = 0;
+	int length = 0;
+	void swap(RenamePosition& arg) noexcept
+	{
+		uri.swap(arg.uri);
+		std::swap(offset, arg.offset);
+		std::swap(length, arg.length);
+	}
+};
+MAKE_REFLECT_STRUCT(RenamePosition, uri, offset, length);
+
+struct GetRefactorEditParams
+{
+	std::string command;
+	std::vector<lsp::Any>  commandArguments;
+	lsCodeActionParams context;
+	boost::optional<lsFormattingOptions> options;
+	MAKE_SWAP_METHOD(GetRefactorEditParams, command, context, options);
+};
+MAKE_REFLECT_STRUCT(GetRefactorEditParams, command, context, options);
+
+
+
+
+struct RefactorWorkspaceEdit {
+	/**
+	 * The workspace edit this code action performs.
+	 */
+	 lsWorkspaceEdit edit;
+	/**
+	 * A command this code action executes. If a code action provides a edit and a
+	 * command, first the edit is executed and then the command.
+	 */
+	
+	boost::optional<std::string> errorMessage;
+	
+	boost::optional < lsCommandWithAny > command;
+	
+	MAKE_SWAP_METHOD(RefactorWorkspaceEdit, edit, command, errorMessage)
+};
+MAKE_REFLECT_STRUCT(RefactorWorkspaceEdit,edit,command,errorMessage)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_getRefactorEdit, GetRefactorEditParams, RefactorWorkspaceEdit, "java/getRefactorEdit");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/getRefactorEdit.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/listOverridableMethods.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/listOverridableMethods.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/listOverridableMethods.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/CodeActionParams.h"
+#include "OverridableMethod.h"
+
+
+
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_listOverridableMethods, lsCodeActionParams, OverridableMethodsResponse, "java/listOverridableMethods");
+
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/listOverridableMethods.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/organizeImports.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/organizeImports.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/organizeImports.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,12 @@
+#pragma once
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <LibLsp/lsp/lsCodeAction.h>
+
+#include "LibLsp/lsp/CodeActionParams.h"
+
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_organizeImports, lsCodeActionParams, lsWorkspaceEdit, "java/organizeImports");
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/organizeImports.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/projectConfigurationUpdate.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/projectConfigurationUpdate.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/projectConfigurationUpdate.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+
+
+#include <string>
+#include <vector>
+#include "WorkspaceSymbolParams.h"
+
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+
+DEFINE_NOTIFICATION_TYPE(java_projectConfigurationUpdate, lsTextDocumentIdentifier, "java/projectConfigurationUpdate");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/projectConfigurationUpdate.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/resolveUnimplementedAccessors.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/resolveUnimplementedAccessors.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/resolveUnimplementedAccessors.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <string>
+#include "checkHashCodeEqualsStatus.h"
+
+
+struct AccessorField {
+	std::string fieldName;
+	bool isStatic =false;
+	bool generateGetter = false;
+	bool generateSetter = false;
+	void swap(AccessorField& arg) noexcept{
+		fieldName.swap(arg.fieldName);
+		std::swap(isStatic, arg.isStatic);
+		std::swap(generateGetter, arg.generateGetter);
+		std::swap(generateSetter, arg.generateSetter);
+	}
+};
+
+MAKE_REFLECT_STRUCT(AccessorField, fieldName,isStatic,generateGetter,generateSetter)
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_resolveUnimplementedAccessors, lsCodeActionParams, std::vector<AccessorField>, "java/resolveUnimplementedAccessors");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/resolveUnimplementedAccessors.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/searchSymbols.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/searchSymbols.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/searchSymbols.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,27 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+
+#include <string>
+#include <vector>
+#include "WorkspaceSymbolParams.h"
+#include "LibLsp/lsp/method_type.h"
+#include "LibLsp/lsp/symbol.h"
+
+
+struct SearchSymbolParams :public WorkspaceSymbolParams
+{
+	boost::optional<std::string>  projectName;
+	boost::optional< bool >sourceOnly;
+	boost::optional< int> maxResults;
+	MAKE_SWAP_METHOD(SearchSymbolParams, query, projectName, sourceOnly, maxResults);
+};
+MAKE_REFLECT_STRUCT(SearchSymbolParams, query, projectName, sourceOnly, maxResults);
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(java_searchSymbols, SearchSymbolParams, std::vector<lsSymbolInformation>, "java/searchSymbols");
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/jdtls/searchSymbols.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/SCTConfig.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/SCTConfig.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/SCTConfig.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,37 @@
+#pragma once
+#include <string>
+#include <vector>
+#include <LibLsp/JsonRpc/serializer.h>
+using namespace std;
+
+
+struct TCP_option
+{
+	std::string host = "127.0.0.1";
+	int port = 8889;
+	
+};
+MAKE_REFLECT_STRUCT(TCP_option,host,port)
+
+
+struct SCTConfig
+{
+	static SCTConfig* newInstance(const string& file_path,string& error);
+	std::string version;
+	std::string file_name;
+	
+	boost::optional<bool> start_by_jcide;
+	
+	boost::optional<TCP_option> tcp;
+	boost::optional<vector<string>> args;
+	
+	// internal using
+	bool broken = false;
+	std::string error;
+};
+
+
+MAKE_REFLECT_STRUCT(SCTConfig, version,file_name, tcp, args, start_by_jcide);
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/SCTConfig.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/protocol.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/protocol.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/protocol.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,222 @@
+#pragma once
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/lsp/lsDocumentUri.h"
+#include "LibLsp/lsp/lsAny.h"
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+
+struct DownLoadCapFileParams
+{
+	lsDocumentUri uri;
+	MAKE_SWAP_METHOD(DownLoadCapFileParams, uri);
+};
+MAKE_REFLECT_STRUCT(DownLoadCapFileParams, uri);
+
+struct NormalActionResult
+{
+	bool state = false;
+	boost::optional<std::vector<uint8_t>> data;
+	boost::optional<std::string> info;
+	MAKE_SWAP_METHOD(NormalActionResult, state, data, info);
+};
+MAKE_REFLECT_STRUCT(NormalActionResult, data, state, info)
+
+DEFINE_REQUEST_RESPONSE_TYPE(sct_DownLoadCapFile, DownLoadCapFileParams, NormalActionResult, "sct/download_cap");
+
+
+
+
+enum class SctProtocol :uint8_t
+{
+	T01 = 0, T0 = 1, T1 = 2,
+};
+MAKE_REFLECT_TYPE_PROXY(SctProtocol);
+
+struct ConnectParams
+{
+	
+	SctProtocol protocol= SctProtocol::T01;
+	boost::optional<std::string> reader;
+	boost::optional<lsp::Any> data;
+	MAKE_SWAP_METHOD(ConnectParams, reader, protocol,data);
+};
+MAKE_REFLECT_STRUCT(ConnectParams, reader, protocol, data);
+DEFINE_REQUEST_RESPONSE_TYPE(sct_Connect, ConnectParams, NormalActionResult, "sct/connect");
+
+
+
+struct SetProtocolParams
+{
+
+	SctProtocol protocol = SctProtocol::T01;
+
+};
+MAKE_REFLECT_STRUCT(SetProtocolParams, protocol);
+
+DEFINE_REQUEST_RESPONSE_TYPE(sct_SetProtocol, SetProtocolParams, NormalActionResult, "sct/set_protocol");
+
+struct GPAuthParams
+{
+	boost::optional < std::string>  scp;
+	boost::optional < std::string > key;
+	boost::optional < lsp::Any >   option;
+	MAKE_SWAP_METHOD(GPAuthParams, key, scp, option);
+};
+MAKE_REFLECT_STRUCT(GPAuthParams, key, scp, option);
+DEFINE_REQUEST_RESPONSE_TYPE(sct_gp_auth, GPAuthParams, NormalActionResult ,"sct/gp_auth");
+
+
+
+struct InstallAppletParams
+{
+	std::vector<uint8_t> package_aid;
+	std::vector<uint8_t> applet_aid;
+	boost::optional < std::vector<uint8_t>> instance_aid;
+	boost::optional<std::vector<uint8_t>>  authority;
+	boost::optional<std::vector<uint8_t>>  parameters;
+	MAKE_SWAP_METHOD(InstallAppletParams, package_aid, applet_aid, instance_aid, authority, parameters);
+};
+MAKE_REFLECT_STRUCT(InstallAppletParams, package_aid, applet_aid, instance_aid, authority, parameters);
+DEFINE_REQUEST_RESPONSE_TYPE(sct_InstalllApplet, InstallAppletParams, NormalActionResult, "sct/install_applet");
+
+
+struct TransmitParams
+{
+	std::vector<unsigned char> command;
+	MAKE_SWAP_METHOD(TransmitParams, command);
+};
+MAKE_REFLECT_STRUCT(TransmitParams, command);
+
+DEFINE_REQUEST_RESPONSE_TYPE(sct_Transmit, TransmitParams, NormalActionResult,"sct/transmit");
+
+DEFINE_NOTIFICATION_TYPE(sct_Disconnect,JsonNull, "sct/disconnect")
+
+
+struct SetWindowPosParams{
+	int X = 0;
+	int Y = 0;
+	int cx = 100;
+	int cy = 100;
+	
+	MAKE_SWAP_METHOD(SetWindowPosParams, X, Y, cx, cy);
+};
+MAKE_REFLECT_STRUCT(SetWindowPosParams, X, Y, cx, cy);
+DEFINE_NOTIFICATION_TYPE(sct_SetWindowsPos, SetWindowPosParams, "sct/set_windows_pos")
+
+struct SetWindowVisibleParams
+{
+	static const int  HIDE = 0;
+	static const int  MINSIZE = 1;
+	static const int  MAXSIZE = 2;
+	static const int  NORMAL = 3;
+	int state = NORMAL;
+	MAKE_SWAP_METHOD(SetWindowVisibleParams, state);
+};
+MAKE_REFLECT_STRUCT(SetWindowVisibleParams, state);
+DEFINE_NOTIFICATION_TYPE(sct_SetWindowsVisible, SetWindowVisibleParams, "sct/set_windows_visible")
+
+
+
+enum  CardInfoType:uint32_t
+{
+	ATR_TYPE = 0,
+	ATS_TYPE = 1,
+};
+MAKE_REFLECT_TYPE_PROXY(CardInfoType);
+
+
+struct  GetCardInfoParams
+{
+	CardInfoType type_;
+};
+MAKE_REFLECT_STRUCT(GetCardInfoParams, type_);
+
+DEFINE_REQUEST_RESPONSE_TYPE(sct_GetCardInfo, GetCardInfoParams, NormalActionResult, "sct/get_card_info");
+
+
+struct JdwpInfo
+{
+	std::string host="127.0.0.1";
+	uint32_t jdwp_port = 9075;
+
+};
+
+MAKE_REFLECT_STRUCT(JdwpInfo, host, jdwp_port);
+
+struct  LaunchResult
+{
+	bool state;
+	boost::optional<JdwpInfo> info;
+	boost::optional<std::string> error;
+	MAKE_SWAP_METHOD(LaunchResult, state, info, error);
+};
+MAKE_REFLECT_STRUCT(LaunchResult, state, info, error);
+
+
+struct JcvmOutputParams
+{
+	std::string  data;
+	MAKE_SWAP_METHOD(JcvmOutputParams, data);
+};
+MAKE_REFLECT_STRUCT(JcvmOutputParams, data);
+
+DEFINE_NOTIFICATION_TYPE(sct_NotifyJcvmOutput, JcvmOutputParams,"sct/notify_jcvm_output");
+
+
+struct LaunchParam
+{
+	enum
+	{
+		LAUNCH_FOR_DEBUG = 0,
+		LAUNCH_FOR_RUN = 1
+	};
+	boost::optional<uint32_t> launch_for_what;
+	
+};
+MAKE_REFLECT_STRUCT(LaunchParam, launch_for_what);
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(sct_Launch, LaunchParam, LaunchResult , "sct/launch");
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(sct_CheckBeforeLaunch, JsonNull, NormalActionResult, "sct/check_before_launch");
+
+
+
+DEFINE_NOTIFICATION_TYPE(sct_NotifyDisconnect, JsonNull,"sct/notify_disconnect");
+
+
+DEFINE_NOTIFICATION_TYPE(sct_TerminateLaunch, JsonNull, "sct/terminate_launch");
+
+
+
+
+struct sctInitializeParams {
+	// The process Id of the parent process that started
+	// the server. Is null if the process has not been started by another process.
+	// If the parent process is not alive then the server should exit (see exit
+	// notification) its process.
+	boost::optional<int> processId;
+
+	// User provided initialization options.
+	boost::optional<lsp::Any> initializationOptions;
+	boost::optional<int> version;
+
+};
+MAKE_REFLECT_STRUCT(sctInitializeParams,processId,initializationOptions, version);
+
+struct sctServerCapabilities {
+	bool gp_auth = false;
+	bool gp_key = false;
+	boost::optional<int> version;
+	MAKE_SWAP_METHOD(sctServerCapabilities, gp_auth, gp_key, version);
+};
+MAKE_REFLECT_STRUCT(sctServerCapabilities, gp_auth, gp_key, version);
+
+
+struct stcInitializeResult
+{
+	sctServerCapabilities   capabilities;
+};
+MAKE_REFLECT_STRUCT(stcInitializeResult, capabilities);
+
+DEFINE_REQUEST_RESPONSE_TYPE(sct_initialize, sctInitializeParams, stcInitializeResult, "sct/initialize");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/protocol.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/sct.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/sct.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/sct.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,743 @@
+
+#include <deque>
+#include "sct.h"
+#include "SCTConfig.h"
+#include <rapidjson/document.h>
+#include <rapidjson/istreamwrapper.h>
+#include <fstream>
+#include <boost/filesystem.hpp>
+#include "LibLsp/lsp/general/exit.h"
+#include "LibLsp/lsp/general/initialized.h"
+#include "LibLsp/lsp/windows/MessageNotify.h"
+#include "LibLsp/lsp/language/language.h"
+#include "LibLsp/JsonRpc/Condition.h"
+#include "LibLsp/lsp/workspace/execute_command.h"
+#include "LibLsp/JsonRpc/json.h"
+
+namespace lsp {
+	class Log;
+}
+
+using namespace std;
+using lsp::Log;
+
+
+//
+//MethodType sct_DownLoadCapFile::request::kMethodInfo = "sct/download_cap";
+//
+//MethodType sct_Transmit::request::kMethodInfo = "sct/transmit";
+//
+//MethodType sct_Connect::request::kMethodInfo = "sct/connect";
+//
+//MethodType sct_Disconnect::request::kMethodInfo = "sct/disconnect";
+//
+//MethodType sct_InstalllApplet::request::kMethodInfo = "sct/install_applet";
+//
+//MethodType sct_gp_auth::request::kMethodInfo = "sct/gp_auth";
+//
+//MethodType sct_SetWindowsPos::request::kMethodInfo = "sct/set_windows_pos";
+//
+//MethodType sct_SetWindowsVisible::request::kMethodInfo = "sct/set_windows_visible";
+//
+//
+//MethodType sct_NotifyJcvmOutput::request::kMethodInfo = "sct/notify_jcvm_output";
+//
+//MethodType sct_Launch::request::kMethodInfo = "sct/launch";
+//
+//MethodType sct_SetProtocol::request::kMethodInfo = "sct/set_protocol";
+//
+//MethodType sct_CheckBeforeLaunch::request::kMethodInfo = "sct/check_before_launch";
+//
+//MethodType sct_GetCardInfo::request::kMethodInfo = "sct/get_card_info";
+//
+//MethodType sct_NotifyDisconnect::request::kMethodInfo = "sct/notify_disconnect";
+//MethodType sct_TerminateLaunch::request::kMethodInfo = "sct/terminate_launch";
+//MethodType sct_initialize::request::kMethodInfo = "sct/initialize";
+
+
+ SCTConfig* SCTConfig::newInstance(const string& file_path, string& error)
+{
+ 	 if(!boost::filesystem::exists(file_path))
+ 	 {
+		 error = "file no exists.";
+		 return nullptr;
+ 	 }
+	 using namespace rapidjson;
+	 using namespace std;
+	 std::unique_ptr<SCTConfig>  sct = std::make_unique<SCTConfig>();
+	 try
+	 {
+		 std::wifstream ifs(file_path);
+		 WIStreamWrapper isw(ifs);
+
+		 Document d;
+		 d.ParseStream(isw);
+		 if(!d.HasParseError())
+		 {
+			 JsonReader reader{ &d };
+			 Reflect(reader, *sct.get());
+		 }
+	 }
+ 	catch (std::exception& e)
+ 	{
+		string  temp = "Reflect failed. exception info:";
+			
+		temp +=	e.what();
+		error = temp;
+		sct.get()->broken = true;
+		sct.get()->error = temp;	
+ 	}
+	return sct.release();
+}
+
+
+SmartCardTool::SmartCardTool():  m_jdwpPort(0), m_curProtocol(SctProtocol::T01), log(nullptr)
+{
+	m_ipAddr = "127.0.0.1";
+}
+
+void AddNotifyJsonRpcMethod(sct::ProtocolJsonHandler& handler)
+{
+	handler.method2notification[Notify_Exit::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_Exit::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[Notify_InitializedNotification::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_InitializedNotification::notify::ReflectReader(visitor);
+	};
+
+	
+	handler.method2notification[Notify_LogMessage::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_LogMessage::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[Notify_ShowMessage::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_ShowMessage::notify::ReflectReader(visitor);
+	};
+	
+	handler.method2notification[Notify_sendNotification::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return Notify_sendNotification::notify::ReflectReader(visitor);
+	};
+	
+	handler.method2notification[lang_actionableNotification::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return lang_actionableNotification::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[lang_progressReport::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return lang_progressReport::notify::ReflectReader(visitor);
+	};
+	
+
+	handler.method2notification[sct_NotifyJcvmOutput::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return sct_NotifyJcvmOutput::notify::ReflectReader(visitor);
+	};
+	handler.method2notification[sct_NotifyDisconnect::notify::kMethodInfo] = [](Reader& visitor)
+	{
+		return sct_NotifyDisconnect::notify::ReflectReader(visitor);
+	};
+ 	
+}
+
+sct::ProtocolJsonHandler::ProtocolJsonHandler()
+{
+	AddNotifyJsonRpcMethod(*this);
+
+	method2response[sct_DownLoadCapFile::request::kMethodInfo ] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return sct_DownLoadCapFile::response::ReflectReader(visitor);
+	};
+	method2response[sct_Connect::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return sct_Connect::response::ReflectReader(visitor);
+	};
+	method2response[sct_SetProtocol::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return sct_SetProtocol::response::ReflectReader(visitor);
+	};
+	method2response[sct_gp_auth::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return sct_gp_auth::response::ReflectReader(visitor);
+	};
+	method2response[sct_InstalllApplet::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return sct_InstalllApplet::response::ReflectReader(visitor);
+	};
+	method2response[sct_Transmit::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return sct_Transmit::response::ReflectReader(visitor);
+	};
+ 	
+	method2response[sct_GetCardInfo::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return sct_GetCardInfo::response::ReflectReader(visitor);
+	};
+ 	
+	method2response[sct_Launch::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return sct_Launch::response::ReflectReader(visitor);
+	};
+	method2response[sct_CheckBeforeLaunch::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return sct_CheckBeforeLaunch::response::ReflectReader(visitor);
+	};
+ 	
+
+	method2response[sct_initialize::request::kMethodInfo] = [](Reader& visitor)
+	{
+		if (visitor.HasMember("error"))
+			return 	Rsp_Error::ReflectReader(visitor);
+
+		return sct_initialize::response::ReflectReader(visitor);
+	};
+	
+}
+bool SmartCardTool::check_sct_alive()
+{
+	if (sct)
+	{
+		return true;
+	}
+ 	if(log)
+ 	{
+		wstring strPrompt = L"sct is not alvie.";
+		log->log(Log::Level::SEVERE, strPrompt);
+ 	}
+	return false;
+}
+
+bool SmartCardTool::initialize(int processId, int version)
+{
+
+ 	if(!check_sct_alive())
+ 	{
+		return false;
+ 	}
+	sct_initialize::request request;
+	request.params.processId = processId;
+	request.params.version = version;
+	
+	auto msg = sct->waitResponse(request, 100000);
+	
+	if (!msg)
+	{
+		return false;
+	}
+	
+	if (msg->is_error)
+	{
+		auto error = &msg->error;
+		log->error( error->error.ToString());
+		return false;
+	}
+	auto  result = &msg->response;
+	_lsServerCapabilities.swap(result->result.capabilities);
+	return true;
+}
+
+
+
+SmartCardTool::~SmartCardTool()
+{
+
+
+}
+
+bool SmartCardTool::GetCardInfo(CardInfoType type_, std::vector<unsigned char>& out)
+{
+	if (!check_sct_alive())
+	{
+		return false;
+	}
+	sct_GetCardInfo::request request;
+	request.params.type_ = type_;
+ 	
+	auto  data = sct->waitResponse(request, 40000);
+
+	if (!data)
+	{
+		if (log)
+		{
+			wstring strPrompt = L"GetCardInfo request timeout.";
+			log->log(Log::Level::SEVERE, strPrompt);
+		}
+		return false;
+	}
+
+	if (data->is_error)
+	{
+		if (log)
+		{
+			string strPrompt = "GetCardInfo request error." + data->error.ToJson();
+			log->log(Log::Level::SEVERE, strPrompt);
+		}
+		return false;
+	}
+	auto rsp = &data->response;
+	if (rsp->result.state)
+	{
+		out.swap(rsp->result.data.value());
+		return  true;
+	}
+	
+	if (log)
+	{
+		string strPrompt = "GetCardInfo failed. Reason:";
+		strPrompt += rsp->result.info.value();
+		log->log(Log::Level::SEVERE, strPrompt);
+	}
+	return false;
+}
+
+
+
+bool SmartCardTool::Launch(bool for_debug)
+{
+	if (!check_sct_alive())
+	{
+		return false;
+	}
+	sct_Launch::request request;
+ 	if(for_debug)
+ 	{
+		request.params.launch_for_what = LaunchParam::LAUNCH_FOR_DEBUG;
+ 	}
+	else
+	{
+		request.params.launch_for_what = LaunchParam::LAUNCH_FOR_RUN;
+	}
+	auto  data = sct->waitResponse(request, 100000);
+
+	if (!data)
+	{
+		if (log)
+		{
+			wstring strPrompt = L"Launch request timeout.";
+			log->log(Log::Level::SEVERE, strPrompt);
+		}
+		return false;
+	}
+	
+	if (data->is_error)
+	{
+		if (log)
+		{
+			string strPrompt = "Launch request error." + data->error.ToJson();
+
+			log->log(Log::Level::SEVERE, strPrompt);
+		}
+		return false;
+	}
+	auto rsp = &data->response;
+	if (rsp->result.state)
+	{
+		if (log)
+		{
+			log->log(Log::Level::INFO, L"Launch successfully");
+		}
+		if(rsp->result.info)
+		{
+			m_ipAddr.swap(rsp->result.info.value().host);
+			m_jdwpPort = rsp->result.info.value().jdwp_port;
+
+		}
+	}
+	else
+	{
+		if (log)
+		{
+			string strPrompt = "Launch failed. Reason:";
+			strPrompt += rsp->result.error.value();
+			log->log(Log::Level::SEVERE, strPrompt);
+		}
+		return false;
+	}
+	return true;
+}
+
+void SmartCardTool::TerminateLaunch()
+{
+	if (!check_sct_alive())
+	{
+		return ;
+	}
+	sct_TerminateLaunch::notify notify;
+	sct->send(notify);
+	connect_state = false;
+	return  ;
+}
+
+void SmartCardTool::show_message(lsMessageType type_,
+	const std::string& msg)
+{
+	if (!check_sct_alive())
+	{
+		return ;
+	}
+	Notify_ShowMessage::notify notify;
+	notify.params.type = type_;
+	notify.params.message = msg;
+	sct->send(notify);
+}
+
+bool SmartCardTool::CheckBeforeLaunch()
+{
+	if (!check_sct_alive())
+	{
+		return false;
+	}
+	sct_CheckBeforeLaunch::request request;
+	auto  data = sct->waitResponse(request, 50000);
+
+	if (!data)
+	{
+		wstring strPrompt = L"CheckBeforeLaunch request timeout.";
+		if(log)
+		{
+			log->log(Log::Level::SEVERE, strPrompt);
+		}
+
+		return false;
+	}
+	
+	if (data->is_error)
+	{
+		string strPrompt = "CheckBeforeLaunch request error." + data->error.ToJson();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	auto rsp = &data->response;
+	if (rsp->result.state)
+	{
+		return true;
+	}
+
+	
+	string strPrompt = "Check Before Launch JCVM failed. Reason:";
+	strPrompt += rsp->result.info.value();
+	log->log(Log::Level::SEVERE, strPrompt);
+	return false;
+
+}
+
+
+bool SmartCardTool::Connect(SctProtocol protocol)
+{
+	if (!check_sct_alive())
+	{
+		return false;
+	}
+	sct_Connect::request request;
+
+	request.params.protocol = protocol;
+
+	auto  data = sct->waitResponse(request, 40000);
+
+	if (!data)
+	{
+		wstring strPrompt = L"Connect request timeout.";
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	
+	if (data->is_error)
+	{
+		string strPrompt = "Connect request error." + data->error.ToJson();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	auto rsp =&data->response;
+	if (rsp->result.state)
+	{
+		connect_state = true;
+		return true;
+	}
+	else
+	{
+		string strPrompt = "Connect failed. Reason:";
+		strPrompt += rsp->result.info.value();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+
+}
+
+
+
+
+void  SmartCardTool::DisConnect()
+{
+	if (!check_sct_alive())
+	{
+		return ;
+	}
+	sct_Disconnect::notify notify;
+	sct->send(notify);
+	connect_state = false;
+	return ;
+}
+
+bool SmartCardTool::DownLoadCapFile(const string& strCapFileName)
+{
+	if (!check_sct_alive())
+	{
+		return false;
+	}
+	sct_DownLoadCapFile::request request;
+	request.params.uri.raw_uri_ = make_file_scheme_uri(strCapFileName);
+	
+	auto  data = sct->waitResponse(request, 40000);
+	
+	if(!data)
+	{
+		wstring strPrompt = L"DownLoadCapFile request timeout.";
+		log->log(Log::Level::SEVERE,strPrompt);
+		return false;
+	}
+
+	if(data->is_error)
+	{
+		string strPrompt = "DownLoadCapFile request error." + data->error.ToJson();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	auto rsp = &data->response;
+	if(rsp->result.state)
+	{
+		string strPrompt = "DownLoadCapFile successfully";
+		if(rsp->result.info)
+		{
+			strPrompt = rsp->result.info.value();
+		}
+		log->log(Log::Level::INFO, strPrompt);
+		return true;
+	}
+	else
+	{
+		string strPrompt = "DownLoadCapFile failed. Reason:";
+		strPrompt += rsp->result.info.value();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+
+}
+
+void SmartCardTool::SetWindowsVisible(SetWindowVisibleParams& params)
+{
+	if (!check_sct_alive())
+	{
+		return ;
+	}
+	sct_SetWindowsVisible::notify notify;
+	notify.params.swap(params);
+	sct->send(notify);
+
+}
+
+void SmartCardTool::SetWindowPos(SetWindowPosParams& params)
+{
+	sct_SetWindowsPos::notify notify;
+	notify.params.swap(params);
+	sct->send(notify);
+}
+
+bool SmartCardTool::SetProtocol(SctProtocol protocol)
+{
+	if (!check_sct_alive())
+	{
+		return false;
+	}
+	sct_SetProtocol::request request;
+ 	
+	request.params.protocol = protocol;
+ 	
+	auto  data = sct->waitResponse(request, 40000);
+
+	if (!data)
+	{
+		wstring strPrompt = L"SetProtocol request timeout.";
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	
+	if (data->is_error)
+	{
+		string strPrompt = "SetProtocol request error." + data->error.ToJson();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	auto rsp = &data->response;
+	if (rsp->result.state)
+	{
+		m_curProtocol = protocol;
+		return true;
+	}
+	else
+	{
+		string strPrompt = "SetProtocol failed. Reason:";
+		strPrompt += rsp->result.info.value();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	
+}
+
+bool SmartCardTool::GpAuth()
+{
+
+	if (!check_sct_alive())
+	{
+		return false;
+	}
+	sct_gp_auth::request request;
+
+	auto  data = sct->waitResponse(request, 100000);
+
+	if (!data)
+	{
+		wstring strPrompt = L"gp_auth request timeout.";
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+
+	if (data->is_error)
+	{
+		string strPrompt = "gp_auth request error." + data->error.ToJson();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	auto rsp = &data->response;
+	if (rsp->result.state)
+	{
+		string strPrompt = "gp_auth request successfully.";
+		if (rsp->result.info)
+			strPrompt = rsp->result.info.value();
+		
+		log->log(Log::Level::INFO, strPrompt);
+		return true;
+	}
+	else
+	{
+		string strPrompt = "gp_auth failed. Reason:";
+		strPrompt += rsp->result.info.value();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+
+}
+
+bool SmartCardTool::InstallApplet(InstallAppletParams& params)
+{
+	if (!check_sct_alive())
+	{
+		return false;
+	}
+	sct_InstalllApplet::request request;
+	request.params.swap(params);
+	auto  data = sct->waitResponse(request);
+
+	if (!data)
+	{
+		wstring strPrompt = L"Install Applet request timeout.";
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	
+	if (data->is_error)
+	{
+		string strPrompt = "Install Applet request error." + data->error.ToJson();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	auto rsp = &data->response;
+	if (rsp->result.state)
+	{
+		string strPrompt = "Install Applet successfully.";
+		if (rsp->result.info)
+			strPrompt = rsp->result.info.value();
+		log->log(Log::Level::INFO, strPrompt);
+		return true;
+	}
+	else
+	{
+		string strPrompt = "Install Applet failed. Reason:";
+		strPrompt += rsp->result.info.value();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+}
+
+
+bool SmartCardTool::Transmit(const std::vector<unsigned char>& cmdApdu, std::vector<unsigned char>& rspApdu)
+{
+
+	if (!check_sct_alive())
+	{
+		return false;
+	}
+	sct_Transmit::request request;
+	request.params.command = cmdApdu;
+	
+	auto  data = sct->waitResponse(request);
+
+	if (!data)
+	{
+		wstring strPrompt = L"Transmit request timeout.";
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+
+	if (data->is_error)
+	{
+		string strPrompt = "Transmit request error." + data->error.ToJson();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	auto rsp = &data->response;
+	if (rsp->result.state)
+	{
+		rspApdu.swap(rsp->result.data.value());
+		//log->log(Log::Level::INFO, L"Transmit successfully");
+		return true;
+	}
+	else
+	{
+		string strPrompt = "Transmit failed. Reason:";
+		strPrompt += rsp->result.info.value();
+		log->log(Log::Level::SEVERE, strPrompt);
+		return false;
+	}
+	
+
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/sct.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/sct.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/sct.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/sct.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,103 @@
+#pragma once
+
+#include <LibLsp/JsonRpc/RemoteEndPoint.h>
+#include <LibLsp/JsonRpc/Endpoint.h>
+#include <LibLsp/lsp/ProtocolJsonHandler.h>
+#include "protocol.h"
+enum class lsMessageType;
+enum CardInfoType : unsigned;
+enum class SctProtocol : unsigned char;
+struct InstallAppletParams;
+
+
+using namespace std;
+
+class ModeState;
+namespace sct
+{
+	class ProtocolJsonHandler : public MessageJsonHandler
+	{
+	public:
+		ProtocolJsonHandler();
+	};
+
+}
+class SmartCardTool 
+{
+	//IP �����ֽ���
+	std::string m_ipAddr;
+	volatile uint16_t m_jdwpPort;
+
+	
+	SctProtocol m_curProtocol;
+public:
+	enum JCIDE_VERSION
+	{
+		V5_KIND = 5
+	};
+	SmartCardTool();
+	~SmartCardTool();
+
+	
+	bool GetCardInfo(CardInfoType type_,std::vector<unsigned char>&);
+	bool Launch(bool for_debug = false);
+
+	void TerminateLaunch();
+	void show_message(lsMessageType type_,const std::string& msg);
+	bool CheckBeforeLaunch();
+	
+	 string GetIpAddr(){return m_ipAddr;}
+	
+	 uint16_t GetJdwpPort(){return m_jdwpPort;}
+	
+
+
+	 void SetWindowsVisible(SetWindowVisibleParams&);
+	 void SetWindowPos(SetWindowPosParams&);
+	
+	 SctProtocol GetProtocol(){return m_curProtocol;}
+
+
+	bool SetProtocol(SctProtocol protocol = SctProtocol::T01);
+
+	bool GpAuth();
+
+
+	bool InstallApplet(InstallAppletParams&);;
+	
+	bool DownLoadCapFile(const string& strCapFileName);
+
+
+
+	bool IsConnected() const {
+	 
+		return connect_state;
+	}
+	
+	string GetErrorString() { return {}; };
+	
+	bool Connect(SctProtocol protocol = SctProtocol::T01);
+	
+	void DisConnect();
+
+
+
+
+	bool Transmit(const std::vector<unsigned char>& cmdApdu, std::vector<unsigned char>& rspApdu) ;
+	
+
+	lsp::Log* log;
+	volatile bool connect_state = false;
+
+	std::shared_ptr<RemoteEndPoint> sct;
+
+
+	bool initialize(int processId,int version);
+	const sctServerCapabilities& getServerCapabilities()const
+	{
+		return _lsServerCapabilities;
+	}
+private:
+	sctServerCapabilities _lsServerCapabilities;
+	bool check_sct_alive();
+};


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sct/sct.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sonarlint/protocol.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sonarlint/protocol.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sonarlint/protocol.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,176 @@
+#pragma once
+#include <string>
+#include <boost/optional.hpp>
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/lsp/lsDocumentUri.h"
+#include "LibLsp/lsp/lsAny.h"
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+#include "LibLsp/lsp/general/InitializeParams.h"
+
+struct LintRule
+{
+	std::string key;
+	std::string name;
+
+
+	std::string Display() const
+	{
+		return name + " (" + key + ")";
+	}
+	bool activeByDefault = true;
+	boost::optional<std::string> severity;
+	boost::optional<std::string> type;
+	int icon_index = -1;
+	MAKE_SWAP_METHOD(LintRule, key, name, activeByDefault, severity, type);
+
+};
+MAKE_REFLECT_STRUCT(LintRule, key, name, activeByDefault, severity, type);
+
+
+struct RuleParameter {
+	std::string name;
+	boost::optional<std::string>  description;
+	boost::optional<std::string> defaultValue;
+
+};
+MAKE_REFLECT_STRUCT(RuleParameter, name, description, defaultValue);
+
+struct ShowRuleDescriptionParams {
+
+	boost::optional<std::string> key;
+
+	boost::optional<std::string> name;
+
+	boost::optional<std::string> htmlDescription;
+
+	boost::optional<std::string>  type;
+
+	boost::optional<std::string>  severity;
+
+	boost::optional< std::vector<RuleParameter> >   parameters;
+	MAKE_SWAP_METHOD(ShowRuleDescriptionParams, key, name, htmlDescription, type, severity, parameters)
+
+
+};
+MAKE_REFLECT_STRUCT(ShowRuleDescriptionParams, key, name, htmlDescription, type, severity, parameters);
+
+
+struct GetJavaConfigResponse {
+	std::string  projectRoot;
+	std::string  sourceLevel;
+	std::vector<std::string>  classpath;
+	bool isTest;
+	std::string  vmLocation;
+	MAKE_SWAP_METHOD(GetJavaConfigResponse, projectRoot, sourceLevel, classpath, isTest, vmLocation);
+};
+MAKE_REFLECT_STRUCT(GetJavaConfigResponse, projectRoot, sourceLevel, classpath, isTest, vmLocation);
+
+struct SetTraceNotificationParams {
+	lsInitializeParams::lsTrace value;
+};
+MAKE_REFLECT_STRUCT(SetTraceNotificationParams, value);
+
+
+struct ServerConnectionSettings {
+
+	std::string SONARCLOUD_URL = "https://sonarcloud.io";
+	std::vector<std::string>SONARCLOUD_ALIAS = { "https://sonarqube.com",
+		"https://www.sonarqube.com",
+		"https://www.sonarcloud.io",
+		"https://sonarcloud.io" };
+
+	std::string connectionId;
+	std::string serverUrl;
+	std::string token;
+	boost::optional<std::string> organizationKey;
+	MAKE_SWAP_METHOD(ServerConnectionSettings, connectionId, serverUrl, token, organizationKey)
+
+};
+MAKE_REFLECT_STRUCT(ServerConnectionSettings, connectionId, serverUrl, token, organizationKey)
+
+struct RuleSetting
+{
+	bool IsOn();
+	std::string level = "on";
+	RuleSetting(bool activate);
+	RuleSetting() = default;
+	void toggle();
+	void on()
+	{
+		level = "on";
+	}
+	void off()
+	{
+		level = "off";
+	}
+	void turn(bool activate)
+	{
+		if (activate)
+		{
+			on();
+		}
+		else
+		{
+			off();
+		}
+	}
+	boost::optional< std::map<std::string, std::string > > parameters;
+};
+MAKE_REFLECT_STRUCT(RuleSetting, level, parameters)
+
+struct ConsoleParams
+{
+	boost::optional < bool >showAnalyzerLogs;
+	boost::optional < bool >showVerboseLogs;
+	MAKE_SWAP_METHOD(ConsoleParams, showAnalyzerLogs, showVerboseLogs)
+};
+MAKE_REFLECT_STRUCT(ConsoleParams, showAnalyzerLogs, showVerboseLogs)
+
+struct SonarLintWorkspaceSettings
+{
+	boost::optional < bool > disableTelemetry;
+	boost::optional < std::map<std::string, ServerConnectionSettings> >connectedMode;
+	boost::optional<std::map<std::string, RuleSetting>>  rules;
+	boost::optional<ConsoleParams> output;
+
+	boost::optional<std::string >  pathToNodeExecutable;
+
+	boost::optional< std::map<std::string, std::string > > getConfigurationParameters(const std::string& ruleKey);
+
+
+};
+
+MAKE_REFLECT_STRUCT(SonarLintWorkspaceSettings, disableTelemetry, connectedMode,
+	rules, output, pathToNodeExecutable)
+
+
+
+	DEFINE_REQUEST_RESPONSE_TYPE(slls_listAllRules, JsonNull, lsp::Any, "sonarlint/listAllRules");
+
+
+
+DEFINE_NOTIFICATION_TYPE(Notify_didClasspathUpdate, lsDocumentUri, "sonarlint/didClasspathUpdate")
+
+
+DEFINE_NOTIFICATION_TYPE(Notify_didJavaServerModeChange, std::string, "sonarlint/didJavaServerModeChange")
+
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(slls_showSonarLintOutput, JsonNull, JsonNull, "sonarlint/showSonarLintOutput");
+
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(slls_openJavaHomeSettings, JsonNull, JsonNull, "sonarlint/openJavaHomeSettings");
+
+
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(slls_openPathToNodeSettings, JsonNull, JsonNull, "sonarlint/openPathToNodeSettings");
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(slls_showRuleDescription, ShowRuleDescriptionParams, JsonNull, "sonarlint/showRuleDescription");
+
+DEFINE_REQUEST_RESPONSE_TYPE(slls_getJavaConfig, lsDocumentUri, GetJavaConfigResponse, "sonarlint/getJavaConfig");
+
+
+DEFINE_NOTIFICATION_TYPE(slls_setTraceNotification, SetTraceNotificationParams, "$/setTraceNotification")
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/extention/sonarlint/protocol.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/InitializeParams.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/InitializeParams.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/InitializeParams.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,128 @@
+#pragma once
+
+#include "LibLsp/lsp/lsDocumentUri.h"
+#include "LibLsp/lsp/lsAny.h"
+#include "lsClientCapabilities.h"
+#include "LibLsp/lsp/workspace/workspaceFolders.h"
+
+struct ClientInfo {
+	std::string name;
+	boost::optional<std::string> version;
+	
+	MAKE_SWAP_METHOD(ClientInfo,name,version);
+};
+MAKE_REFLECT_STRUCT(ClientInfo,name,version);
+
+struct lsInitializeParams {
+  // The process Id of the parent process that started
+  // the server. Is null if the process has not been started by another process.
+  // If the parent process is not alive then the server should exit (see exit
+  // notification) its process.
+  boost::optional<int> processId;
+	
+  /**
+   * Information about the client
+   *
+   * @since 3.15.0
+   */
+  boost::optional<ClientInfo> clientInfo;
+  /**
+   * The locale the client is currently showing the user interface
+   * in. This must not necessarily be the locale of the operating
+   * system.
+   *
+   * Uses IETF language tags as the value's syntax
+   * (See https://en.wikipedia.org/wiki/IETF_language_tag)
+   *
+   * @since 3.16.0
+   */
+  boost::optional<std::string> locale;
+	
+  // The rootPath of the workspace. Is null
+  // if no folder is open.
+  //
+  // @deprecated in favour of rootUri.
+  boost::optional<std::string> rootPath;
+
+  // The rootUri of the workspace. Is null if no
+  // folder is open. If both `rootPath` and `rootUri` are set
+  // `rootUri` wins.
+  boost::optional<lsDocumentUri> rootUri;
+
+  // User provided initialization options.
+  boost::optional<lsp::Any> initializationOptions;
+
+  // The capabilities provided by the client (editor or tool)
+  lsClientCapabilities capabilities;
+
+
+  /**
+ * An boost::optional extension to the protocol.
+ * To tell the server what client (editor) is talking to it.
+ */
+ // @Deprecated
+  boost::optional< std::string >clientName;
+
+
+	
+  enum class lsTrace {
+    // NOTE: serialized as a string, one of 'off' | 'messages' | 'verbose';
+    Off,       // off
+    Messages,  // messages
+    Verbose    // verbose
+  	
+  };
+
+  // The initial trace setting. If omitted trace is disabled ('off').
+  lsTrace trace = lsTrace::Off;
+
+
+  /**
+ * The workspace folders configured in the client when the server starts.
+ * This property is only available if the client supports workspace folders.
+ * It can be `null` if the client supports workspace folders but none are
+ * configured.
+ *
+ * Since 3.6.0
+ */
+  boost::optional< std::vector<WorkspaceFolder> >  workspaceFolders;
+
+  MAKE_SWAP_METHOD(lsInitializeParams,
+      processId,
+      rootPath,
+      rootUri,
+      initializationOptions,
+      capabilities, clientName, clientInfo,
+      trace, workspaceFolders, locale)
+};
+
+void Reflect(Reader& reader, lsInitializeParams::lsTrace& value);
+
+
+void Reflect(Writer& writer, lsInitializeParams::lsTrace& value);
+
+
+MAKE_REFLECT_STRUCT(lsInitializeParams,
+                    processId,
+                    rootPath,
+                    rootUri,
+                    initializationOptions,
+                    capabilities, clientName, clientInfo,
+                    trace, workspaceFolders, locale)
+
+struct lsInitializeError {
+  // Indicates whether the client should retry to send the
+  // initilize request after showing the message provided
+  // in the ResponseError.
+  bool retry;
+  void swap(lsInitializeError& arg) noexcept
+  {
+	  auto tem = retry;
+	  retry = arg.retry;
+	  arg.retry = tem;
+  }
+};
+MAKE_REFLECT_STRUCT(lsInitializeError, retry);
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/InitializeParams.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/exit.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/exit.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/exit.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+/**
+ * A notification to ask the server to exit its process.
+ */
+DEFINE_NOTIFICATION_TYPE(Notify_Exit, boost::optional<JsonNull>, "exit");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/exit.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialize.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialize.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialize.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,45 @@
+#include "initialize.h"
+#include "LibLsp/JsonRpc/json.h"
+
+void Reflect(Reader& reader, lsInitializeParams::lsTrace& value)
+{
+	if (!reader.IsString())
+	{
+		value = lsInitializeParams::lsTrace::Off;
+		return;
+	}
+	std::string v = reader.GetString();
+	if (v == "off")
+		value = lsInitializeParams::lsTrace::Off;
+	else if (v == "messages")
+		value = lsInitializeParams::lsTrace::Messages;
+	else if (v == "verbose")
+		value = lsInitializeParams::lsTrace::Verbose;
+}
+
+void Reflect(Writer& writer, lsInitializeParams::lsTrace& value)
+{
+	switch (value)
+	{
+	case lsInitializeParams::lsTrace::Off:
+		writer.String("off");
+		break;
+	case lsInitializeParams::lsTrace::Messages:
+		writer.String("messages");
+		break;
+	case lsInitializeParams::lsTrace::Verbose:
+		writer.String("verbose");
+		break;
+	}
+}
+ void Reflect(Reader& visitor, std::pair<boost::optional<lsTextDocumentSyncKind>, boost::optional<lsTextDocumentSyncOptions> >& value)
+{
+	if(((JsonReader&)visitor).m_->IsObject())
+	{
+		Reflect(visitor, value.second);
+	}
+	else
+	{
+		Reflect(visitor, value.first);
+	}
+}
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialize.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialize.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialize.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialize.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,39 @@
+#pragma once
+#include "LibLsp/JsonRpc/message.h"
+#include "InitializeParams.h"
+#include "lsServerCapabilities.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+
+
+
+
+
+
+/**
+ * The capabilities the language server provides.
+ */
+  struct InitializeResult {
+    lsServerCapabilities capabilities;
+	MAKE_SWAP_METHOD(InitializeResult, capabilities);
+  };
+
+MAKE_REFLECT_STRUCT(InitializeResult, capabilities);
+
+
+/**
+ * The initialize request is sent as the first request from the client to
+ * the server.
+ *
+ * If the server receives request or notification before the initialize request it should act as follows:
+ * 	- for a request the respond should be errored with code: -32001. The message can be picked by the server.
+ *  - notifications should be dropped, except for the exit notification. This will allow the exit a server without an initialize request.
+ *
+ * Until the server has responded to the initialize request with an InitializeResult
+ * the client must not sent any additional requests or notifications to the server.
+ *
+ * During the initialize request the server is allowed to sent the notifications window/showMessage,
+ * window/logMessage and telemetry/event as well as the window/showMessageRequest request to the client.
+ */
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_initialize, lsInitializeParams, InitializeResult, "initialize");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialize.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialized.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialized.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialized.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,13 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+/**
+ * The initialized notification is sent from the client to the server after
+ * the client received the result of the initialize request but before the
+ * client is sending any other request or notification to the server. The
+ * server can use the initialized notification for example to dynamically
+ * register capabilities.
+ */
+DEFINE_NOTIFICATION_TYPE(Notify_InitializedNotification, JsonNull, "initialized");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/initialized.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsClientCapabilities.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsClientCapabilities.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsClientCapabilities.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,48 @@
+#pragma once
+
+#include "LibLsp/lsp/lsAny.h"
+#include "lsWorkspaceClientCapabilites.h"
+#include "lsTextDocumentClientCapabilities.h"
+
+/**
+ * Client capabilities specific to the used markdown parser.
+ *
+ * @since 3.16.0
+ */
+struct MarkdownClientCapabilities {
+	/**
+	 * The name of the parser.
+	 */
+	std::string parser;
+
+	/**
+	 * The version of the parser.
+	 */
+	boost::optional<std::string>  version;
+	MAKE_SWAP_METHOD(MarkdownClientCapabilities, parser, version)
+	
+};
+MAKE_REFLECT_STRUCT(MarkdownClientCapabilities, parser, version)
+
+struct lsClientCapabilities {
+  // Workspace specific client capabilities.
+  boost::optional<lsWorkspaceClientCapabilites> workspace;
+
+  // Text document specific client capabilities.
+  boost::optional<lsTextDocumentClientCapabilities> textDocument;
+
+  /**
+	* Window specific client capabilities.
+  */
+  boost::optional<lsp::Any>  window;
+  /**
+   * Experimental client capabilities.
+   */
+  boost::optional<lsp::Any>  experimental;
+
+  MAKE_SWAP_METHOD(lsClientCapabilities, workspace, textDocument, window, experimental)
+};
+MAKE_REFLECT_STRUCT(lsClientCapabilities, workspace, textDocument, window, experimental)
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsClientCapabilities.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsServerCapabilities.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsServerCapabilities.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsServerCapabilities.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,589 @@
+#pragma once
+#include "LibLsp/lsp/method_type.h"
+
+
+#include <stdexcept>
+#include "LibLsp/JsonRpc/message.h"
+#include "LibLsp/lsp/lsDocumentUri.h"
+#include "LibLsp/lsp/lsAny.h"
+#include "InitializeParams.h"
+#include "LibLsp/lsp/textDocument/SemanticTokens.h"
+
+
+extern void Reflect(Reader&, std::pair<boost::optional<lsTextDocumentSyncKind>, boost::optional<lsTextDocumentSyncOptions> >&);
+
+//
+ // Code Action options.
+ //
+struct  CodeActionOptions : WorkDoneProgressOptions {
+	//
+	 // CodeActionKinds that this server may return.
+	 //
+	 // The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server
+	 // may list out every specific kind they provide.
+	 //
+	typedef  std::string CodeActionKind;
+	 std::vector<CodeActionKind> codeActionKinds;
+
+	 MAKE_SWAP_METHOD(CodeActionOptions, workDoneProgress, codeActionKinds);
+};
+MAKE_REFLECT_STRUCT(CodeActionOptions, workDoneProgress, codeActionKinds)
+struct CodeLensOptions : WorkDoneProgressOptions {
+	//
+	 // Code lens has a resolve provider as well.
+	 //
+	boost::optional<bool> resolveProvider ;
+	MAKE_SWAP_METHOD(CodeLensOptions, workDoneProgress, resolveProvider);
+};
+MAKE_REFLECT_STRUCT(CodeLensOptions, workDoneProgress, resolveProvider)
+
+
+// Format document on type options
+struct lsDocumentOnTypeFormattingOptions :WorkDoneProgressOptions {
+	// A character on which formatting should be triggered, like `}`.
+	std::string firstTriggerCharacter;
+
+	// More trigger characters.
+	std::vector<std::string> moreTriggerCharacter;
+	MAKE_SWAP_METHOD(lsDocumentOnTypeFormattingOptions, workDoneProgress,
+		firstTriggerCharacter,
+		moreTriggerCharacter);
+};
+MAKE_REFLECT_STRUCT(lsDocumentOnTypeFormattingOptions, workDoneProgress,
+	firstTriggerCharacter,
+	moreTriggerCharacter);
+struct RenameOptions : WorkDoneProgressOptions {
+	//
+	 // Renames should be checked and tested before being executed.
+	 //
+	boost::optional<bool> prepareProvider;
+	MAKE_SWAP_METHOD(RenameOptions, workDoneProgress, prepareProvider);
+};
+MAKE_REFLECT_STRUCT(RenameOptions,workDoneProgress,prepareProvider)
+
+struct DocumentFilter{
+	//
+	 // A language id, like `typescript`.
+	 //
+	boost::optional<std::string> language;
+	//
+	 // A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
+	 //
+	boost::optional<std::string>scheme;
+	//
+	 // A glob pattern, like `*.{ts,js}`.
+	 //
+	 // Glob patterns can have the following syntax:
+	 // - `*` to match one or more characters in a path segment
+	 // - `?` to match on one character in a path segment
+	 // - `**` to match any number of path segments, including none
+	 // - `{}` to group sub patterns into an OR expression. (e.g. `**/*.{ts,js}
+	 //   matches all TypeScript and JavaScript files)
+	 // - `[]` to declare a range of characters to match in a path segment
+	 //   (e.g., `example.[0-9]` to match on `example.0`, `example.1`,...)
+	 // - `[!...]` to negate a range of characters to match in a path segment
+	 //   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
+	 //   not `example.0`)
+	 //
+	boost::optional<std::string>pattern;
+	MAKE_SWAP_METHOD(DocumentFilter, language, scheme, pattern)
+};
+MAKE_REFLECT_STRUCT(DocumentFilter, language, scheme, pattern)
+
+//A document selector is the combination of one or more document filters.
+using DocumentSelector = std::vector<DocumentFilter>;
+
+// Document link options
+struct lsDocumentLinkOptions :WorkDoneProgressOptions {
+	// Document links have a resolve provider as well.
+	boost::optional<bool> resolveProvider;
+	MAKE_SWAP_METHOD(lsDocumentLinkOptions, workDoneProgress, resolveProvider);
+};
+MAKE_REFLECT_STRUCT(lsDocumentLinkOptions, workDoneProgress,resolveProvider);
+
+// Execute command options.
+struct lsExecuteCommandOptions : WorkDoneProgressOptions {
+	// The commands to be executed on the server
+	std::vector<std::string> commands;
+	MAKE_SWAP_METHOD(lsExecuteCommandOptions, workDoneProgress, commands);
+};
+MAKE_REFLECT_STRUCT(lsExecuteCommandOptions, workDoneProgress, commands);
+
+
+struct TextDocumentRegistrationOptions
+{
+//
+ // A document selector to identify the scope of the registration. If set to null
+ // the document selector provided on the client side will be used.
+ //
+	boost::optional<DocumentSelector>  documentSelector;
+
+	MAKE_SWAP_METHOD(TextDocumentRegistrationOptions, documentSelector);
+};
+MAKE_REFLECT_STRUCT(TextDocumentRegistrationOptions, documentSelector);
+
+//
+ // Static registration options to be returned in the initialize request.
+ //
+struct StaticRegistrationOptions :public TextDocumentRegistrationOptions
+{
+	//
+	 // The id used to register the request. The id can be used to deregister
+	 // the request again. See also Registration#id.
+	 //
+	boost::optional<std::string> id;
+	MAKE_SWAP_METHOD(StaticRegistrationOptions, documentSelector, id)
+};
+MAKE_REFLECT_STRUCT(StaticRegistrationOptions, documentSelector,id)
+
+//
+ // The server supports workspace folder.
+ //
+ // Since 3.6.0
+ //
+
+struct WorkspaceFoldersOptions {
+	//
+	 // The server has support for workspace folders
+	 //
+	boost::optional<bool>  supported;
+
+	//
+	 // Whether the server wants to receive workspace folder
+	 // change notifications.
+	 //
+	 // If a string is provided, the string is treated as an ID
+	 // under which the notification is registered on the client
+	 // side. The ID can be used to unregister for these events
+	 // using the `client/unregisterCapability` request.
+	 //
+	boost::optional<std::pair<  boost::optional<std::string>, boost::optional<bool> > > changeNotifications;
+	MAKE_SWAP_METHOD(WorkspaceFoldersOptions, supported, changeNotifications);
+};
+MAKE_REFLECT_STRUCT(WorkspaceFoldersOptions, supported, changeNotifications);
+
+//
+ // A pattern kind describing if a glob pattern matches a file a folder or
+ // both.
+ //
+ // @since 3.16.0
+ //
+enum lsFileOperationPatternKind
+{
+	file,
+	folder
+};
+MAKE_REFLECT_TYPE_PROXY(lsFileOperationPatternKind)
+
+//
+ // Matching options for the file operation pattern.
+ //
+ // @since 3.16.0
+ //
+struct lsFileOperationPatternOptions {
+
+	//
+	 // The pattern should be matched ignoring casing.
+	 //
+	boost::optional<bool> ignoreCase;
+	MAKE_SWAP_METHOD(lsFileOperationPatternOptions, ignoreCase)
+};
+MAKE_REFLECT_STRUCT(lsFileOperationPatternOptions, ignoreCase)
+//
+ // A pattern to describe in which file operation requests or notifications
+ // the server is interested in.
+ //
+ // @since 3.16.0
+ //
+struct lsFileOperationPattern {
+	//
+	 // The glob pattern to match. Glob patterns can have the following syntax:
+	 // - `*` to match one or more characters in a path segment
+	 // - `?` to match on one character in a path segment
+	 // - `**` to match any number of path segments, including none
+	 // - `{}` to group sub patterns into an OR expression. (e.g. `**/*.{ts,js}`
+	 //   matches all TypeScript and JavaScript files)
+	 // - `[]` to declare a range of characters to match in a path segment
+	 //   (e.g., `example.[0-9]` to match on `example.0`, `example.1`,...)
+	 // - `[!...]` to negate a range of characters to match in a path segment
+	 //   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
+	 //   not `example.0`)
+	 //
+	std::string glob;
+
+	//
+	 // Whether to match files or folders with this pattern.
+	 //
+	 // Matches both if undefined.
+	 //
+	boost::optional<lsFileOperationPatternKind> matches;
+
+	//
+	 // Additional options used during matching.
+	 //
+	boost::optional<lsFileOperationPatternOptions> options ;
+	MAKE_SWAP_METHOD(lsFileOperationPattern, glob, matches, options)
+};
+MAKE_REFLECT_STRUCT(lsFileOperationPattern, glob, matches, options)
+//
+ // A filter to describe in which file operation requests or notifications
+ // the server is interested in.
+ //
+ // @since 3.16.0
+ //
+struct lsFileOperationFilter {
+
+	//
+	 // A Uri like `file` or `untitled`.
+	 //
+	boost::optional<std::string>  scheme;
+
+	//
+	 // The actual file operation pattern.
+	 //
+	boost::optional<lsFileOperationPattern>	pattern;
+	MAKE_SWAP_METHOD(lsFileOperationFilter, scheme, pattern)
+};
+MAKE_REFLECT_STRUCT(lsFileOperationFilter, scheme, pattern)
+//
+ // The options to register for file operations.
+ //
+ // @since 3.16.0
+ //
+struct lsFileOperationRegistrationOptions {
+	//
+	 // The actual filters.
+	 //
+	boost::optional<std::vector<lsFileOperationFilter>> filters;
+	MAKE_SWAP_METHOD(lsFileOperationRegistrationOptions, filters)
+};
+MAKE_REFLECT_STRUCT(lsFileOperationRegistrationOptions, filters)
+
+struct WorkspaceServerCapabilities {
+	//
+	 // The server supports workspace folder.
+	 //
+	 // Since 3.6.0
+	 //
+	WorkspaceFoldersOptions workspaceFolders;
+
+
+	//
+	 // The server is interested in file notifications/requests.
+	 //
+	 // @since 3.16.0
+	 //
+	struct  lsFileOperations
+	{
+		//
+		 // The server is interested in receiving didCreateFiles
+		 // notifications.
+		 //
+		boost::optional<lsFileOperationRegistrationOptions> didCreate;
+
+		//
+		 // The server is interested in receiving willCreateFiles requests.
+		 //
+		boost::optional<lsFileOperationRegistrationOptions> willCreate;
+
+		//
+		 // The server is interested in receiving didRenameFiles
+		 // notifications.
+		 //
+		boost::optional<lsFileOperationRegistrationOptions> didRename;
+
+		//
+		 // The server is interested in receiving willRenameFiles requests.
+		 //
+		boost::optional<lsFileOperationRegistrationOptions> willRename;
+
+		//
+		 // The server is interested in receiving didDeleteFiles file
+		 // notifications.
+		 //
+		boost::optional<lsFileOperationRegistrationOptions> didDelete;
+
+		//
+		 // The server is interested in receiving willDeleteFiles file
+		 // requests.
+		 //
+		boost::optional<lsFileOperationRegistrationOptions> willDelete;
+		MAKE_SWAP_METHOD(lsFileOperations, didCreate, willCreate, didRename, willRename, didDelete, willDelete)
+	};
+	boost::optional<lsFileOperations>fileOperations;
+
+
+	MAKE_SWAP_METHOD(WorkspaceServerCapabilities, workspaceFolders, fileOperations)
+};
+MAKE_REFLECT_STRUCT(WorkspaceServerCapabilities, workspaceFolders, fileOperations)
+MAKE_REFLECT_STRUCT(WorkspaceServerCapabilities::lsFileOperations, didCreate, willCreate, didRename, willRename, didDelete, willDelete)
+
+//
+ // Semantic highlighting server capabilities.
+ //
+ // <p>
+ // <b>Note:</b> the <a href=
+ // "https://github.com/Microsoft/vscode-languageserver-node/pull/367">{@code textDocument/semanticHighlighting}
+ // language feature</a> is not yet part of the official LSP specification.
+ //
+
+struct SemanticHighlightingServerCapabilities {
+	//
+	 // A "lookup table" of semantic highlighting <a href="https://manual.macromates.com/en/language_grammars">TextMate scopes</a>
+	 // supported by the language server. If not defined or empty, then the server does not support the semantic highlighting
+	 // feature. Otherwise, clients should reuse this "lookup table" when receiving semantic highlighting notifications from
+	 // the server.
+	 //
+	 std::vector< std::vector<std::string> > scopes;
+	 MAKE_SWAP_METHOD(SemanticHighlightingServerCapabilities, scopes)
+};
+MAKE_REFLECT_STRUCT(SemanticHighlightingServerCapabilities, scopes)
+
+struct SemanticTokensServerFull
+{
+	//
+	// The server supports deltas for full documents.
+	//
+	bool delta =false;
+	MAKE_SWAP_METHOD(SemanticTokensServerFull, delta)
+};
+MAKE_REFLECT_STRUCT(SemanticTokensServerFull, delta)
+struct SemanticTokensWithRegistrationOptions
+{
+	SemanticTokensLegend legend;
+
+	//
+	 // Server supports providing semantic tokens for a specific range
+	 // of a document.
+	 //
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<lsp::Any> > >  range;
+
+	//
+	 // Server supports providing semantic tokens for a full document.
+	 //
+	boost::optional< std::pair< boost::optional<bool>,
+	boost::optional<SemanticTokensServerFull> > >  full;
+
+	//
+	 // A document selector to identify the scope of the registration. If set to null
+	 // the document selector provided on the client side will be used.
+	 //
+	boost::optional < std::vector<DocumentFilter> > documentSelector;
+	//
+	 // The id used to register the request. The id can be used to deregister
+	 // the request again. See also Registration#id.
+	 //
+	boost::optional<std::string> id;
+	MAKE_SWAP_METHOD(SemanticTokensWithRegistrationOptions, legend, range, full, documentSelector, id)
+};
+MAKE_REFLECT_STRUCT(SemanticTokensWithRegistrationOptions, legend, range, full, documentSelector ,id)
+
+using  DocumentColorOptions = WorkDoneProgressOptions;
+using  FoldingRangeOptions = WorkDoneProgressOptions;
+struct lsServerCapabilities {
+	// Defines how text documents are synced. Is either a detailed structure
+	// defining each notification or for backwards compatibility the
+
+	// TextDocumentSyncKind number.
+	boost::optional< std::pair<boost::optional<lsTextDocumentSyncKind>,
+	boost::optional<lsTextDocumentSyncOptions> >> textDocumentSync;
+
+	// The server provides hover support.
+	boost::optional<bool>  hoverProvider;
+
+	// The server provides completion support.
+	boost::optional < lsCompletionOptions > completionProvider;
+
+	// The server provides signature help support.
+	boost::optional < lsSignatureHelpOptions > signatureHelpProvider;
+
+	// The server provides goto definition support.
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<WorkDoneProgressOptions> > > definitionProvider;
+
+
+  //
+   // The server provides Goto Type Definition support.
+   //
+   // Since 3.6.0
+   //
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<StaticRegistrationOptions> > > typeDefinitionProvider ;
+
+	// The server provides implementation support.
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<StaticRegistrationOptions> > >  implementationProvider ;
+
+	// The server provides find references support.
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<WorkDoneProgressOptions> > > referencesProvider ;
+
+	// The server provides document highlight support.
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<WorkDoneProgressOptions> > > documentHighlightProvider ;
+
+	// The server provides document symbol support.
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<WorkDoneProgressOptions> > > documentSymbolProvider ;
+
+	// The server provides workspace symbol support.
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<WorkDoneProgressOptions> > > workspaceSymbolProvider ;
+
+	// The server provides code actions.
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<CodeActionOptions> > > codeActionProvider ;
+
+	// The server provides code lens.
+	boost::optional<CodeLensOptions> codeLensProvider;
+
+	// The server provides document formatting.
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<WorkDoneProgressOptions> > > documentFormattingProvider ;
+
+	// The server provides document range formatting.
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<WorkDoneProgressOptions> > > documentRangeFormattingProvider ;
+
+	// The server provides document formatting on typing.
+	boost::optional<lsDocumentOnTypeFormattingOptions> documentOnTypeFormattingProvider;
+
+	// The server provides rename support.
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<RenameOptions> > >  renameProvider;
+
+
+	// The server provides document link support.
+	boost::optional<lsDocumentLinkOptions > documentLinkProvider;
+
+
+	//
+	 // The server provides color provider support.
+	 //
+	 // @since 3.6.0
+	 //
+	boost::optional< std::pair< boost::optional<bool>, boost::optional<DocumentColorOptions> > >  colorProvider;
+
+
+	//
+		 // The server provides folding provider support.
+		 //
+		 // @since 3.10.0
+		 //
+	boost::optional <  std::pair< boost::optional<bool>, boost::optional<FoldingRangeOptions> >   > foldingRangeProvider;
+
+	// The server provides execute command support.
+	boost::optional < lsExecuteCommandOptions >executeCommandProvider;
+
+
+	//
+	 // Workspace specific server capabilities
+	 //
+	boost::optional< WorkspaceServerCapabilities > workspace;
+
+	//
+	 // Semantic highlighting server capabilities.
+	 //
+
+	 boost::optional<	 SemanticHighlightingServerCapabilities >semanticHighlighting;
+
+	//
+	 // Server capability for calculating super- and subtype hierarchies.
+	 // The LS supports the type hierarchy language feature, if this capability is set to {@code true}.
+	 //
+	 // <p>
+	 // <b>Note:</b> the <a href=
+	 // "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
+	 // language feature</a> is not yet part of the official LSP specification.
+	 //
+
+	 boost::optional< std::pair< boost::optional<bool>,
+	boost::optional<StaticRegistrationOptions> > > typeHierarchyProvider;
+
+	//
+	 // The server provides Call Hierarchy support.
+	 //
+
+	 boost::optional< std::pair< boost::optional<bool>,
+	boost::optional<StaticRegistrationOptions> > > callHierarchyProvider;
+
+	//
+	 // The server provides selection range support.
+	 //
+	 // Since 3.15.0
+	 //
+	 boost::optional< std::pair< boost::optional<bool>,
+	boost::optional<StaticRegistrationOptions> > > selectionRangeProvider;
+
+	 //
+	  // The server provides linked editing range support.
+	  //
+	  // Since 3.16.0
+	  //
+	 boost::optional< std::pair< boost::optional<bool>,
+		 boost::optional<StaticRegistrationOptions> > > linkedEditingRangeProvider;
+
+
+	 //
+	  // The server provides semantic tokens support.
+	  //
+	  // Since 3.16.0
+	  //
+	 boost::optional < SemanticTokensWithRegistrationOptions> semanticTokensProvider;
+
+	 //
+	  // Whether server provides moniker support.
+	  //
+	  // Since 3.16.0
+	  //
+	 boost::optional< std::pair< boost::optional<bool>,
+		 boost::optional<StaticRegistrationOptions> > >  monikerProvider;
+
+	boost::optional<lsp::Any> experimental;
+
+
+	MAKE_SWAP_METHOD(lsServerCapabilities,
+		textDocumentSync,
+		hoverProvider,
+		completionProvider,
+		signatureHelpProvider,
+		definitionProvider,
+		typeDefinitionProvider,
+		implementationProvider,
+		referencesProvider,
+		documentHighlightProvider,
+		documentSymbolProvider,
+		workspaceSymbolProvider,
+		codeActionProvider,
+		codeLensProvider,
+		documentFormattingProvider,
+		documentRangeFormattingProvider,
+		documentOnTypeFormattingProvider,
+		renameProvider,
+		documentLinkProvider,
+		executeCommandProvider,
+		workspace,
+		semanticHighlighting,
+		typeHierarchyProvider,
+		callHierarchyProvider,
+		selectionRangeProvider,
+		experimental, colorProvider, foldingRangeProvider,
+		linkedEditingRangeProvider, monikerProvider, semanticTokensProvider)
+
+};
+MAKE_REFLECT_STRUCT(lsServerCapabilities,
+	textDocumentSync,
+	hoverProvider,
+	completionProvider,
+	signatureHelpProvider,
+	definitionProvider,
+	typeDefinitionProvider,
+	implementationProvider,
+	referencesProvider,
+	documentHighlightProvider,
+	documentSymbolProvider,
+	workspaceSymbolProvider,
+	codeActionProvider,
+	codeLensProvider,
+	documentFormattingProvider,
+	documentRangeFormattingProvider,
+	documentOnTypeFormattingProvider,
+	renameProvider,
+	documentLinkProvider,
+	executeCommandProvider,
+	workspace,
+	semanticHighlighting,
+	typeHierarchyProvider,
+	callHierarchyProvider,
+	selectionRangeProvider,
+	experimental, colorProvider, foldingRangeProvider,
+	linkedEditingRangeProvider, monikerProvider, semanticTokensProvider)


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsServerCapabilities.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsTextDocumentClientCapabilities.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsTextDocumentClientCapabilities.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsTextDocumentClientCapabilities.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,713 @@
+#pragma once
+#include "LibLsp/lsp/method_type.h"
+
+
+#include <stdexcept>
+#include "LibLsp/JsonRpc/message.h"
+#include "LibLsp/lsp/lsDocumentUri.h"
+#include "LibLsp/lsp/lsAny.h"
+#include "LibLsp/lsp/extention/jdtls/searchSymbols.h"
+#include "lsWorkspaceClientCapabilites.h"
+#include "LibLsp/lsp/lsp_completion.h"
+#include "LibLsp/lsp/lsp_diagnostic.h"
+
+
+struct  WorkDoneProgressOptions
+{
+	boost::optional<bool>workDoneProgress;
+	MAKE_SWAP_METHOD(WorkDoneProgressOptions, workDoneProgress);
+};
+MAKE_REFLECT_STRUCT(WorkDoneProgressOptions, workDoneProgress);
+
+// Completion options.
+struct lsCompletionOptions:WorkDoneProgressOptions
+{
+  // The server provides support to resolve additional
+  // information for a completion item.
+  boost::optional<bool>  resolveProvider = false;
+
+  //
+   // Most tools trigger completion request automatically without explicitly requesting
+   // it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user
+   // starts to type an identifier. For example if the user types `c` in a JavaScript file
+   // code complete will automatically pop up present `console` besides others as a
+   // completion item. Characters that make up identifiers don't need to be listed here.
+   //
+   // If code complete should automatically be trigger on characters not being valid inside
+   // an identifier (for example `.` in JavaScript) list them in `triggerCharacters`.
+   //
+  // https://github.com/Microsoft/language-server-protocol/issues/138.
+  boost::optional< std::vector<std::string> > triggerCharacters ;
+
+  //
+   // The list of all possible characters that commit a completion. This field can be used
+   // if clients don't support individual commmit characters per completion item. See
+   // `ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport`
+   //
+  boost::optional< std::vector<std::string> > allCommitCharacters;
+
+  MAKE_SWAP_METHOD(lsCompletionOptions, workDoneProgress, resolveProvider, triggerCharacters, allCommitCharacters);
+};
+MAKE_REFLECT_STRUCT(lsCompletionOptions, workDoneProgress, resolveProvider, triggerCharacters,allCommitCharacters);
+
+
+
+// Save options.
+struct lsSaveOptions {
+  // The client is supposed to include the content on save.
+  bool includeText = false;
+  void swap(lsSaveOptions& arg)noexcept
+  {
+	  auto temp = includeText;
+	  includeText = arg.includeText;
+	  arg.includeText = temp;
+  }
+};
+MAKE_REFLECT_STRUCT(lsSaveOptions, includeText);
+
+// Signature help options.
+struct lsSignatureHelpOptions  : WorkDoneProgressOptions {
+  // The characters that trigger signature help automatically.
+  // NOTE: If updating signature help tokens make sure to also update
+  // WorkingFile::FindClosestCallNameInBuffer.
+  std::vector<std::string> triggerCharacters;
+  MAKE_SWAP_METHOD(lsSignatureHelpOptions, workDoneProgress, triggerCharacters);
+};
+MAKE_REFLECT_STRUCT(lsSignatureHelpOptions, workDoneProgress,  triggerCharacters);
+
+// Defines how the host (editor) should sync document changes to the language
+// server.
+enum class lsTextDocumentSyncKind {
+  // Documents should not be synced at all.
+  None = 0,
+
+  // Documents are synced by always sending the full content
+  // of the document.
+  Full = 1,
+
+  // Documents are synced by sending the full content on open.
+  // After that only incremental updates to the document are
+  // send.
+  Incremental = 2
+};
+
+#if _WIN32
+MAKE_REFLECT_TYPE_PROXY(lsTextDocumentSyncKind)
+#else
+//#pragma clang diagnostic push
+//#pragma clang diagnostic ignored "-Wunused-function"
+MAKE_REFLECT_TYPE_PROXY(lsTextDocumentSyncKind)
+//#pragma clang diagnostic pop
+#endif
+
+struct lsTextDocumentSyncOptions {
+  // Open and close notifications are sent to the server.
+  boost::optional<bool>  openClose ;
+  // Change notificatins are sent to the server. See TextDocumentSyncKind.None,
+  // TextDocumentSyncKind.Full and TextDocumentSyncKindIncremental.
+  boost::optional< lsTextDocumentSyncKind> change ;
+  // Will save notifications are sent to the server.
+  boost::optional<bool> willSave;
+  // Will save wait until requests are sent to the server.
+  boost::optional<bool> willSaveWaitUntil;
+  // Save notifications are sent to the server.
+  boost::optional<lsSaveOptions> save;
+
+  MAKE_SWAP_METHOD(lsTextDocumentSyncOptions,
+	  openClose,
+	  change,
+	  willSave,
+	  willSaveWaitUntil,
+	  save);
+};
+MAKE_REFLECT_STRUCT(lsTextDocumentSyncOptions,
+                    openClose,
+                    change,
+                    willSave,
+                    willSaveWaitUntil,
+                    save);
+
+struct SynchronizationCapabilities {
+	// Whether text document synchronization supports dynamic registration.
+	boost::optional<bool> dynamicRegistration;
+
+	// The client supports sending will save notifications.
+	boost::optional<bool> willSave;
+
+	// The client supports sending a will save request and
+	// waits for a response providing text edits which will
+	// be applied to the document before it is saved.
+	boost::optional<bool> willSaveWaitUntil;
+
+	// The client supports did save notifications.
+	boost::optional<bool> didSave;
+
+	MAKE_SWAP_METHOD(SynchronizationCapabilities,
+		dynamicRegistration,
+		willSave,
+		willSaveWaitUntil,
+		didSave);
+};
+MAKE_REFLECT_STRUCT(SynchronizationCapabilities,
+	dynamicRegistration,
+	willSave,
+	willSaveWaitUntil,
+	didSave);
+
+struct CompletionItemKindCapabilities
+{
+	boost::optional<std::vector<lsCompletionItemKind> >valueSet;
+	MAKE_SWAP_METHOD(CompletionItemKindCapabilities, valueSet);
+};
+MAKE_REFLECT_STRUCT(CompletionItemKindCapabilities, valueSet);
+
+struct CompletionItemCapabilities {
+	// Client supports snippets as insert text.
+	//
+	// A snippet can define tab stops and placeholders with `$1`, `$2`
+	// and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+	// the end of the snippet. Placeholders with equal identifiers are linked,
+	// that is typing in one will update others too.
+	boost::optional<bool> snippetSupport;
+
+        // Client supports commit characters on a completion item.
+
+	boost::optional<bool> commitCharactersSupport;
+
+
+        // Client supports the following content formats for the documentation
+        // property. The order describes the preferred format of the client.
+
+	boost::optional< std::vector<std::string> > documentationFormat;
+
+        // Client supports the deprecated property on a completion item.
+
+	boost::optional<bool> deprecatedSupport;
+
+	//
+	 // Client supports the preselect property on a completion item.
+	 //
+	boost::optional<bool> preselectSupport;
+
+	MAKE_SWAP_METHOD(CompletionItemCapabilities,
+		snippetSupport,
+		commitCharactersSupport,
+		documentationFormat,
+		deprecatedSupport, preselectSupport);
+};
+MAKE_REFLECT_STRUCT(CompletionItemCapabilities,
+	snippetSupport,
+	commitCharactersSupport,
+	documentationFormat,
+	deprecatedSupport, preselectSupport);
+
+
+//
+ // Capabilities specific to the `textDocument/completion`
+ //
+struct CompletionCapabilities {
+	// Whether completion supports dynamic registration.
+	boost::optional<bool> dynamicRegistration;
+
+
+
+	// The client supports the following `CompletionItem` specific
+	// capabilities.
+	boost::optional<CompletionItemCapabilities> completionItem;
+
+	//
+	 // The client supports the following `CompletionItemKind` specific
+	 // capabilities.
+	 //
+	boost::optional<CompletionItemKindCapabilities> completionItemKind;
+
+	//
+	 // The client supports sending additional context information for a
+	 // `textDocument/completion` request.
+	 //
+	boost::optional<bool> contextSupport;
+
+
+	MAKE_SWAP_METHOD(CompletionCapabilities,
+		dynamicRegistration,
+		completionItem, completionItemKind);
+};
+
+MAKE_REFLECT_STRUCT(CompletionCapabilities,
+	dynamicRegistration,
+	completionItem , completionItemKind);
+
+
+struct HoverCapabilities:public DynamicRegistrationCapabilities
+{
+	//
+ // Client supports the following content formats for the content
+ // property. The order describes the preferred format of the client.
+ //
+ // See {@link MarkupKind} for allowed values.
+ //
+	boost::optional<std::vector<std::string>> contentFormat;
+
+	MAKE_SWAP_METHOD(HoverCapabilities, dynamicRegistration, contentFormat);
+};
+MAKE_REFLECT_STRUCT(HoverCapabilities, dynamicRegistration, contentFormat);
+
+//
+ // Client capabilities specific to parameter information.
+ //
+struct	ParameterInformationCapabilities {
+	//
+	 // The client supports processing label offsets instead of a
+	 // simple label string.
+	 //
+	 // Since 3.14.0
+	 //
+	boost::optional<bool> labelOffsetSupport;
+
+	MAKE_SWAP_METHOD(ParameterInformationCapabilities, labelOffsetSupport);
+};
+MAKE_REFLECT_STRUCT(ParameterInformationCapabilities, labelOffsetSupport)
+
+
+struct SignatureInformationCapabilities {
+	//
+	 // Client supports the following content formats for the documentation
+	 // property. The order describes the preferred format of the client.
+	 //
+	 // See {@link MarkupKind} for allowed values.
+	 //
+	std::vector<std::string> documentationFormat;
+
+	//
+	 // Client capabilities specific to parameter information.
+	 //
+	 ParameterInformationCapabilities parameterInformation;
+
+	 MAKE_SWAP_METHOD(SignatureInformationCapabilities, documentationFormat, parameterInformation)
+};
+MAKE_REFLECT_STRUCT(SignatureInformationCapabilities,documentationFormat, parameterInformation)
+
+struct SignatureHelpCapabilities :public DynamicRegistrationCapabilities
+{
+	//
+	 // The client supports the following `SignatureInformation`
+	 // specific properties.
+	 //
+	boost::optional< SignatureInformationCapabilities  > signatureInformation;
+
+	MAKE_SWAP_METHOD(SignatureHelpCapabilities, dynamicRegistration, signatureInformation)
+};
+MAKE_REFLECT_STRUCT(SignatureHelpCapabilities, dynamicRegistration, signatureInformation)
+
+struct DocumentSymbolCapabilities :public DynamicRegistrationCapabilities {
+	//
+	 // Specific capabilities for the `SymbolKind`.
+	 //
+	boost::optional<SymbolKindCapabilities>  symbolKind;
+
+	//
+	 // The client support hierarchical document symbols.
+	 //
+	 boost::optional<bool> hierarchicalDocumentSymbolSupport;
+
+	 MAKE_SWAP_METHOD(DocumentSymbolCapabilities, dynamicRegistration, symbolKind, hierarchicalDocumentSymbolSupport)
+};
+MAKE_REFLECT_STRUCT(DocumentSymbolCapabilities, dynamicRegistration, symbolKind, hierarchicalDocumentSymbolSupport)
+
+struct DeclarationCapabilities:public DynamicRegistrationCapabilities{
+	//
+	 // The client supports additional metadata in the form of declaration links.
+	 //
+	boost::optional<bool>linkSupport;
+
+	MAKE_SWAP_METHOD(DeclarationCapabilities, dynamicRegistration, linkSupport);
+};
+MAKE_REFLECT_STRUCT(DeclarationCapabilities, dynamicRegistration, linkSupport)
+
+
+struct CodeActionKindCapabilities
+{
+	//
+	 // The code action kind values the client supports. When this
+	 // property exists the client also guarantees that it will
+	 // handle values outside its set gracefully and falls back
+	 // to a default value when unknown.
+	 //
+	 // See {@link CodeActionKind} for allowed values.
+	 //
+	boost::optional< std::vector< std::string> >valueSet;
+
+	MAKE_SWAP_METHOD(CodeActionKindCapabilities, valueSet)
+};
+MAKE_REFLECT_STRUCT(CodeActionKindCapabilities,valueSet)
+
+struct CodeActionLiteralSupportCapabilities
+{
+	boost::optional<CodeActionKindCapabilities> codeActionKind;
+
+	MAKE_SWAP_METHOD(CodeActionLiteralSupportCapabilities, codeActionKind)
+};
+MAKE_REFLECT_STRUCT(CodeActionLiteralSupportCapabilities, codeActionKind)
+
+struct CodeActionCapabilities:public DynamicRegistrationCapabilities{
+	//
+ // The client support code action literals as a valid
+ // response of the `textDocument/codeAction` request.
+ //
+	boost::optional<CodeActionLiteralSupportCapabilities> codeActionLiteralSupport;
+
+	MAKE_SWAP_METHOD(CodeActionCapabilities, dynamicRegistration, codeActionLiteralSupport)
+};
+MAKE_REFLECT_STRUCT(CodeActionCapabilities,dynamicRegistration,codeActionLiteralSupport)
+
+struct RenameCapabilities :public DynamicRegistrationCapabilities {
+	//
+ // The client support code action literals as a valid
+ // response of the `textDocument/codeAction` request.
+ //
+	boost::optional<bool> prepareSupport;
+
+	MAKE_SWAP_METHOD(RenameCapabilities, dynamicRegistration, prepareSupport)
+};
+MAKE_REFLECT_STRUCT(RenameCapabilities, dynamicRegistration, prepareSupport)
+
+struct  DiagnosticsTagSupport {
+	/**
+	 * The tags supported by the client.
+	 */
+	std::vector<DiagnosticTag> valueSet;
+	MAKE_SWAP_METHOD(DiagnosticsTagSupport, valueSet)
+};
+MAKE_REFLECT_STRUCT(DiagnosticsTagSupport, valueSet)
+
+struct PublishDiagnosticsClientCapabilities :public DynamicRegistrationCapabilities {
+	/**
+ * The client support code action literals as a valid
+ * response of the `textDocument/codeAction` request.
+ */
+	boost::optional<bool> relatedInformation;
+
+	/**
+	 * Client supports the tag property to provide meta data about a diagnostic.
+	 * Clients supporting tags have to handle unknown tags gracefully.
+	 *
+	 * This property had been added and implemented as boolean before it was
+	 * added to the specification as {@link DiagnosticsTagSupport}. In order to
+	 * keep this implementation compatible with intermediate clients (including
+	 * vscode-language-client < 6.0.0) we add an either type here.
+	 *
+	 * Since 3.15
+	 */
+	boost::optional < std::pair<boost::optional<bool>, boost::optional<DiagnosticsTagSupport> > >  tagSupport;
+
+	/**
+	 * Whether the client interprets the version property of the
+	 * `textDocument/publishDiagnostics` notification's parameter.
+	 *
+	 * Since 3.15.0
+	 */
+	boost::optional<bool> versionSupport;
+
+	/**
+ * Client supports a codeDescription property
+ *
+ * @since 3.16.0
+ */
+	boost::optional<bool> codeDescriptionSupport ;
+
+	/**
+	 * Whether code action supports the `data` property which is
+	 * preserved between a `textDocument/publishDiagnostics` and
+	 * `textDocument/codeAction` request.
+	 *
+	 * @since 3.16.0
+	 */
+	boost::optional<bool> dataSupport ;
+
+
+	MAKE_SWAP_METHOD(PublishDiagnosticsClientCapabilities, dynamicRegistration, relatedInformation, tagSupport,versionSupport,codeDescriptionSupport,dataSupport)
+};
+MAKE_REFLECT_STRUCT(PublishDiagnosticsClientCapabilities, dynamicRegistration, relatedInformation, tagSupport, versionSupport, codeDescriptionSupport, dataSupport)
+
+
+struct FoldingRangeCapabilities :public DynamicRegistrationCapabilities {
+	//
+	 // The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
+	 // hint, servers are free to follow the limit.
+	 //
+	boost::optional<int> rangeLimit;
+
+	//
+	 // If set, the client signals that it only supports folding complete lines. If set, client will
+	 // ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange.
+	 //
+	boost::optional<bool> lineFoldingOnly;
+	MAKE_SWAP_METHOD(FoldingRangeCapabilities, dynamicRegistration, rangeLimit, lineFoldingOnly)
+};
+MAKE_REFLECT_STRUCT(FoldingRangeCapabilities, dynamicRegistration, rangeLimit,lineFoldingOnly)
+
+
+struct SemanticHighlightingCapabilities :public DynamicRegistrationCapabilities {
+	//
+ // The client support code action literals as a valid
+ // response of the `textDocument/codeAction` request.
+ //
+	boost::optional<bool> semanticHighlighting;
+
+	MAKE_SWAP_METHOD(SemanticHighlightingCapabilities, dynamicRegistration, semanticHighlighting)
+};
+MAKE_REFLECT_STRUCT(SemanticHighlightingCapabilities, dynamicRegistration, semanticHighlighting)
+
+struct SemanticTokensClientCapabilitiesRequestsFull {
+
+	//
+	// The client will send the `textDocument/semanticTokens/full/delta` request if
+	// the server provides a corresponding handler.
+	//
+	bool delta = false;
+	MAKE_SWAP_METHOD(SemanticTokensClientCapabilitiesRequestsFull, delta)
+};
+MAKE_REFLECT_STRUCT(SemanticTokensClientCapabilitiesRequestsFull, delta)
+
+struct SemanticTokensClientCapabilities :  public DynamicRegistrationCapabilities
+{
+	//export  TokenFormat = 'relative';
+	struct lsRequests
+	{
+		//
+		 // The client will send the `textDocument/semanticTokens/range` request
+		 // if the server provides a corresponding handler.
+		 //
+		boost::optional<std::pair< boost::optional<bool>,
+		boost::optional<SemanticTokensClientCapabilitiesRequestsFull>>>  range;
+		//
+		 // The client will send the `textDocument/semanticTokens/full` request
+		 // if the server provides a corresponding handler.
+		 //
+		boost::optional<std::pair< boost::optional<bool>, boost::optional<lsp::Any>>> full;
+		MAKE_SWAP_METHOD(lsRequests, range, full)
+	};
+
+	lsRequests requests;
+	//
+	 // The token types that the client supports.
+	 //
+	std::vector<std::string> tokenTypes;
+
+	//
+	 // The token modifiers that the client supports.
+	 //
+	std::vector<std::string> tokenModifiers;
+	//
+	 // The formats the clients supports.
+	 //
+	std::vector<std::string> formats;
+	//
+	 // Whether the client supports tokens that can overlap each other.
+	 //
+	boost::optional < bool >overlappingTokenSupport;
+
+	//
+	 // Whether the client supports tokens that can span multiple lines.
+	 //
+	boost::optional < bool > multilineTokenSupport;
+
+	MAKE_SWAP_METHOD(SemanticTokensClientCapabilities, dynamicRegistration,requests, tokenTypes, tokenModifiers,
+		formats, overlappingTokenSupport, multilineTokenSupport)
+
+};
+MAKE_REFLECT_STRUCT(SemanticTokensClientCapabilities::lsRequests, range,full)
+MAKE_REFLECT_STRUCT(SemanticTokensClientCapabilities, dynamicRegistration, requests, tokenTypes, tokenModifiers,
+	formats, overlappingTokenSupport, multilineTokenSupport)
+
+// Text document specific client capabilities.
+struct lsTextDocumentClientCapabilities {
+
+	SynchronizationCapabilities synchronization;
+
+
+  // Capabilities specific to the `textDocument/completion`
+  boost::optional<CompletionCapabilities> completion;
+
+
+
+  // Capabilities specific to the `textDocument/hover`
+  boost::optional<HoverCapabilities> hover;
+
+  // Capabilities specific to the `textDocument/signatureHelp`
+  boost::optional<SignatureHelpCapabilities> signatureHelp;
+
+  // Capabilities specific to the `textDocument/references`
+  boost::optional<DynamicRegistrationCapabilities> references;
+
+
+
+
+
+  // Capabilities specific to the `textDocument/documentHighlight`
+  boost::optional<DynamicRegistrationCapabilities> documentHighlight;
+
+  // Capabilities specific to the `textDocument/documentSymbol`
+  boost::optional<DocumentSymbolCapabilities> documentSymbol;
+
+  // Capabilities specific to the `textDocument/formatting`
+  boost::optional<DynamicRegistrationCapabilities> formatting;
+
+  // Capabilities specific to the `textDocument/rangeFormatting`
+  boost::optional<DynamicRegistrationCapabilities> rangeFormatting;
+
+  // Capabilities specific to the `textDocument/onTypeFormatting`
+  boost::optional<DynamicRegistrationCapabilities> onTypeFormatting;
+
+
+  //
+ // Capabilities specific to the `textDocument/declaration`
+ //
+ // Since 3.14.0
+ //
+  boost::optional< DeclarationCapabilities> declaration;
+
+
+  typedef  DeclarationCapabilities DefinitionCapabilities;
+  // Capabilities specific to the `textDocument/definition`
+  boost::optional<DefinitionCapabilities> definition;
+
+
+
+  //
+// Capabilities specific to the `textDocument/typeDefinition`
+//
+// Since 3.6.0
+//
+  typedef  DeclarationCapabilities TypeDefinitionCapabilities;
+  boost::optional<TypeDefinitionCapabilities>  typeDefinition;
+
+
+  typedef  DeclarationCapabilities ImplementationCapabilities;
+  // Capabilities specific to the `textDocument/implementation`
+  boost::optional<ImplementationCapabilities> implementation;
+
+
+  // Capabilities specific to the `textDocument/codeAction`
+  boost::optional<CodeActionCapabilities> codeAction;
+
+
+  // Capabilities specific to the `textDocument/codeLens`
+  boost::optional<DynamicRegistrationCapabilities> codeLens;
+
+  // Capabilities specific to the `textDocument/documentLink`
+  boost::optional<DynamicRegistrationCapabilities> documentLink;
+
+  //
+ // Capabilities specific to the `textDocument/documentColor` and the
+ // `textDocument/colorPresentation` request.
+ //
+ // Since 3.6.0
+ //
+  boost::optional<DynamicRegistrationCapabilities> colorProvider;
+
+  // Capabilities specific to the `textDocument/rename`
+  boost::optional<RenameCapabilities> rename;
+
+//
+// Capabilities specific to `textDocument/publishDiagnostics`.
+//
+  boost::optional<PublishDiagnosticsClientCapabilities> publishDiagnostics;
+
+  //
+// Capabilities specific to `textDocument/foldingRange` requests.
+//
+// Since 3.10.0
+//
+  boost::optional< FoldingRangeCapabilities > foldingRange;
+
+
+  //
+   // Capabilities specific to {@code textDocument/semanticHighlighting}.
+   //
+  boost::optional< SemanticHighlightingCapabilities >  semanticHighlightingCapabilities;
+
+  //
+   // Capabilities specific to {@code textDocument/typeHierarchy}.
+   //
+  boost::optional< DynamicRegistrationCapabilities >  typeHierarchyCapabilities;
+
+
+
+  //
+// Capabilities specific to `textDocument/selectionRange` requests
+//
+
+  boost::optional< DynamicRegistrationCapabilities > selectionRange;
+
+  //
+	 // Capabilities specific to the `textDocument/linkedEditingRange` request.
+	 //
+	 // @since 3.16.0
+	 //
+  boost::optional< DynamicRegistrationCapabilities > linkedEditingRange;
+
+  //
+   // Capabilities specific to the various call hierarchy requests.
+   //
+   // @since 3.16.0
+   //
+  boost::optional< DynamicRegistrationCapabilities > callHierarchy;
+
+  //
+   // Capabilities specific to the various semantic token requests.
+   //
+   // @since 3.16.0
+   //
+  boost::optional< SemanticTokensClientCapabilities > semanticTokens;
+
+  //
+   // Capabilities specific to the `textDocument/moniker` request.
+   //
+   // @since 3.16.0
+   //
+  boost::optional< DynamicRegistrationCapabilities >  moniker;
+
+  MAKE_SWAP_METHOD(lsTextDocumentClientCapabilities,
+	  synchronization,
+	  completion,
+	  hover,
+	  signatureHelp,
+	  implementation,
+	  references,
+	  documentHighlight,
+	  documentSymbol,
+	  formatting,
+	  rangeFormatting,
+	  onTypeFormatting,
+	  declaration,
+	  definition, typeDefinition, implementation,
+	  codeAction,
+	  codeLens,
+	  documentLink, colorProvider,
+	  rename, publishDiagnostics, foldingRange,
+	  semanticHighlightingCapabilities, typeHierarchyCapabilities,
+	  callHierarchy, selectionRange , linkedEditingRange, semanticTokens, moniker)
+};
+
+
+MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities,
+	synchronization,
+	completion,
+	hover,
+	signatureHelp,
+	implementation,
+	references,
+	documentHighlight,
+	documentSymbol,
+	formatting,
+	rangeFormatting,
+	onTypeFormatting,
+	declaration,
+	definition, typeDefinition, implementation,
+	codeAction,
+	codeLens,
+	documentLink, colorProvider,
+	rename, publishDiagnostics, foldingRange,
+	semanticHighlightingCapabilities, typeHierarchyCapabilities,
+	callHierarchy, selectionRange, linkedEditingRange, semanticTokens, moniker)


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsTextDocumentClientCapabilities.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsWorkspaceClientCapabilites.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsWorkspaceClientCapabilites.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsWorkspaceClientCapabilites.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,256 @@
+#pragma once
+#include "LibLsp/lsp/method_type.h"
+
+
+#include <stdexcept>
+
+#include "LibLsp/JsonRpc/message.h"
+#include "LibLsp/lsp/lsDocumentUri.h"
+#include "LibLsp/lsp/lsAny.h"
+#include "LibLsp/lsp/extention/jdtls/searchSymbols.h"
+
+/**
+ * Capabilities specific to `WorkspaceEdit`s
+ */
+
+//New in version 3.13: ResourceOperationKind and FailureHandlingKind and the client capability workspace.workspaceEdit.
+//resourceOperations as well as workspace.workspaceEdit.failureHandling.
+
+//The capabilities of a workspace edit has evolved over the time.
+//Clients can describe their support using the following client capability :
+
+struct lschangeAnnotationSupport
+{
+	/**
+	 * Whether the client groups edits with equal labels into tree nodes,
+	 * for instance all edits labelled with "Changes in Strings" would
+	 * be a tree node.
+	 */
+	boost::optional<bool> groupsOnLabel;
+	MAKE_SWAP_METHOD(lschangeAnnotationSupport, groupsOnLabel)
+};
+MAKE_REFLECT_STRUCT(lschangeAnnotationSupport, groupsOnLabel)
+
+struct WorkspaceEditCapabilities {
+	/**
+	 * The client supports versioned document changes in `WorkspaceEdit`s
+	 */
+	boost::optional<bool>  documentChanges;
+
+	/**
+	 * The client supports resource changes
+	 * in `WorkspaceEdit`s.
+	 *
+	 * @deprecated Since LSP introduces resource operations, use {link #resourceOperations}
+	 */
+
+	boost::optional<bool> resourceChanges;
+
+	/**
+	 * The resource operations the client supports. Clients should at least
+	 * support 'create', 'rename' and 'delete' files and folders.
+	 *
+	 * @since 3.13.0
+	 */
+	boost::optional< std::vector<std::string> > resourceOperations;
+
+	/**
+	 * The failure handling strategy of a client if applying the workspace edit
+	 * fails.
+	 *
+	 * See {@link FailureHandlingKind} for allowed values.
+	 */
+	boost::optional<std::string > failureHandling;
+
+	/**
+	 * Whether the client normalizes line endings to the client specific
+	 * setting.
+	 * If set to `true` the client will normalize line ending characters
+	 * in a workspace edit to the client specific new line character(s).
+	 *
+	 * @since 3.16.0
+	 */
+	boost::optional<bool> normalizesLineEndings;;
+
+	/**
+	 * Whether the client in general supports change annotations on text edits,
+	 * create file, rename file and delete file changes.
+	 *
+	 * @since 3.16.0
+	 */
+	boost::optional<lschangeAnnotationSupport> changeAnnotationSupport;
+	
+	MAKE_SWAP_METHOD(WorkspaceEditCapabilities, documentChanges, resourceChanges, resourceOperations, failureHandling, normalizesLineEndings, changeAnnotationSupport)
+
+};
+MAKE_REFLECT_STRUCT(WorkspaceEditCapabilities,documentChanges, resourceChanges, resourceOperations, failureHandling, normalizesLineEndings, changeAnnotationSupport)
+
+
+struct DynamicRegistrationCapabilities {
+	// Did foo notification supports dynamic registration.
+	boost::optional<bool> dynamicRegistration;
+
+	MAKE_SWAP_METHOD(DynamicRegistrationCapabilities,
+		dynamicRegistration);
+};
+
+MAKE_REFLECT_STRUCT(DynamicRegistrationCapabilities,
+	dynamicRegistration);
+
+
+
+// Workspace specific client capabilities.
+struct SymbolKindCapabilities
+{
+	boost::optional< std::vector<lsSymbolKind> >  valueSet;
+
+	MAKE_SWAP_METHOD(SymbolKindCapabilities, valueSet)
+
+
+};
+MAKE_REFLECT_STRUCT(SymbolKindCapabilities, valueSet)
+
+
+
+
+struct SymbolCapabilities :public DynamicRegistrationCapabilities {
+	/**
+	 * Specific capabilities for the `SymbolKind` in the `workspace/symbol` request.
+	 */
+	boost::optional<SymbolKindCapabilities>  symbolKind;
+
+	MAKE_SWAP_METHOD(SymbolCapabilities,
+		symbolKind, dynamicRegistration)
+};
+MAKE_REFLECT_STRUCT(SymbolCapabilities,
+	symbolKind, dynamicRegistration)
+
+
+struct lsFileOperations
+{
+	/**
+ * Whether the client supports dynamic registration for file
+ * requests/notifications.
+ */
+	boost::optional<bool> dynamicRegistration ;
+
+	/**
+	 * The client has support for sending didCreateFiles notifications.
+	 */
+	boost::optional<bool>didCreate ;
+
+	/**
+	 * The client has support for sending willCreateFiles requests.
+	 */
+	boost::optional<bool>willCreate ;
+
+	/**
+	 * The client has support for sending didRenameFiles notifications.
+	 */
+	boost::optional<bool>didRename ;
+
+	/**
+	 * The client has support for sending willRenameFiles requests.
+	 */
+	boost::optional<bool>willRename ;
+
+	/**
+	 * The client has support for sending didDeleteFiles notifications.
+	 */
+	boost::optional<bool>didDelete ;
+
+	/**
+	 * The client has support for sending willDeleteFiles requests.
+	 */
+	boost::optional<bool> willDelete ;
+	MAKE_SWAP_METHOD(lsFileOperations, dynamicRegistration, didCreate, willCreate,
+		didRename, willRename, didDelete, willDelete)
+};
+MAKE_REFLECT_STRUCT(lsFileOperations, dynamicRegistration, didCreate, willCreate,
+	didRename, willRename, didDelete, willDelete)
+
+struct lsWorkspaceClientCapabilites {
+  // The client supports applying batch edits to the workspace.
+  boost::optional<bool> applyEdit;
+
+ 
+
+  // Capabilities specific to `WorkspaceEdit`s
+  boost::optional<WorkspaceEditCapabilities> workspaceEdit;
+
+
+
+  // Capabilities specific to the `workspace/didChangeConfiguration`
+  // notification.
+  boost::optional<DynamicRegistrationCapabilities> didChangeConfiguration;
+
+  // Capabilities specific to the `workspace/didChangeWatchedFiles`
+  // notification.
+  boost::optional<DynamicRegistrationCapabilities> didChangeWatchedFiles;
+
+  // Capabilities specific to the `workspace/symbol` request.
+  boost::optional<SymbolCapabilities> symbol;
+
+  // Capabilities specific to the `workspace/executeCommand` request.
+  boost::optional<DynamicRegistrationCapabilities> executeCommand;
+
+
+  /**
+ * The client has support for workspace folders.
+ *
+ * Since 3.6.0
+ */
+  boost::optional<bool> workspaceFolders;
+
+  /**
+   * The client supports `workspace/configuration` requests.
+   *
+   * Since 3.6.0
+   */
+  boost::optional<bool> configuration;
+
+
+  /**
+		 * Capabilities specific to the semantic token requests scoped to the
+		 * workspace.
+		 *
+		 * @since 3.16.0
+		 */
+  boost::optional<DynamicRegistrationCapabilities> semanticTokens ;
+
+  /**
+   * Capabilities specific to the code lens requests scoped to the
+   * workspace.
+   *
+   * @since 3.16.0
+   */
+  boost::optional<DynamicRegistrationCapabilities> codeLens ;
+
+  /**
+   * The client has support for file requests/notifications.
+   *
+   * @since 3.16.0
+   */
+  boost::optional<lsFileOperations> fileOperations;
+	
+  MAKE_SWAP_METHOD(lsWorkspaceClientCapabilites,
+	  applyEdit,
+	  workspaceEdit,
+	  didChangeConfiguration,
+	  didChangeWatchedFiles,
+	  symbol,executeCommand, workspaceFolders,
+	  configuration, semanticTokens, codeLens, fileOperations)
+};
+
+MAKE_REFLECT_STRUCT(lsWorkspaceClientCapabilites,
+                    applyEdit,
+                    workspaceEdit,
+                    didChangeConfiguration,
+                    didChangeWatchedFiles,
+                    symbol,
+                    executeCommand,workspaceFolders,
+	configuration, semanticTokens, codeLens, fileOperations)
+
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/lsWorkspaceClientCapabilites.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/progress.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/progress.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/progress.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+#include "LibLsp/lsp/lsAny.h"
+//The base protocol offers also support to report progress in a generic fashion.
+//This mechanism can be used to report any kind of progress including work done
+//progress(usually used to report progress in the user interface using a progress bar)
+//and partial result progress to support streaming of results.
+struct  ProgressParams
+{
+	std::pair<boost::optional<std::string> , boost::optional<int> > token;
+	lsp::Any value;
+	MAKE_SWAP_METHOD(ProgressParams, token, value)
+};
+MAKE_REFLECT_STRUCT(ProgressParams, token, value)
+DEFINE_NOTIFICATION_TYPE(Notify_Progress, ProgressParams, "$/progress");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/progress.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/shutdown.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/shutdown.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/shutdown.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,15 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+
+/**
+ * The shutdown request is sent from the client to the server. It asks the
+ * server to shutdown, but to not exit (otherwise the response might not be
+ * delivered correctly to the client). There is a separate exit notification
+ * that asks the server to exit.
+ */
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_shutdown, boost::optional<JsonNull>, boost::optional<lsp::Any>, "shutdown");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/general/shutdown.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/language/language.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/language/language.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/language/language.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,170 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+
+#include "LibLsp/lsp/lsDocumentUri.h"
+#include "LibLsp/lsp/lsCommand.h"
+
+#ifdef _WIN32
+#include <ppltasks.h>
+#endif
+
+struct  StatusReport {
+	
+	std::string ToString() const
+	{
+		std::string info;
+		info += "type:" + type + "\n";
+		info += "message:" + message + "\n";
+		return info;
+	}
+	/**
+	 * The message type. See {
+	 *
+	 */
+
+	std::string  type;
+	/**
+	 * The actual message
+	 *
+	 */
+
+	std::string  message;
+	MAKE_SWAP_METHOD(StatusReport, type, message);
+};
+MAKE_REFLECT_STRUCT(StatusReport, type, message);
+
+/**
+ * The show message notification is sent from a server to a client to ask
+ * the client to display a particular message in the user interface.
+ */
+DEFINE_NOTIFICATION_TYPE(lang_status, StatusReport, "language/status");
+
+
+enum class MessageType {
+
+	/**
+	 * An error message.
+	 */
+	Error=(1),
+
+	/**
+	 * A warning message.
+	 */
+	 Warning=(2),
+
+	 /**
+	  * An information message.
+	  */
+	  Info=(3),
+
+	  /**
+	   * A log message.
+	   */
+	   Log=(4)
+};
+MAKE_REFLECT_TYPE_PROXY(MessageType);
+
+
+struct ActionableNotification {
+
+
+	
+	/**
+	 * The message type. See {
+	 *
+	 */
+
+	 MessageType severity;
+	/**
+	 * The actual message
+	 *
+	 */
+
+	 std::string message;
+
+	/**
+	 * Optional data
+	 *
+	 */
+
+	boost::optional<lsp::Any> data;
+
+
+	/**
+	 * Optional commands
+	 *
+	 */
+
+	 std::vector<lsCommandWithAny> commands;
+
+	 MAKE_SWAP_METHOD(ActionableNotification, severity, message, data, commands)
+};
+MAKE_REFLECT_STRUCT(ActionableNotification, severity, message, data, commands)
+
+
+/**
+ * The actionable notification is sent from a server to a client to ask the
+ * client to display a particular message in the user interface, and possible
+ * commands to execute. The commands must be implemented on the client side.
+ */
+DEFINE_NOTIFICATION_TYPE(lang_actionableNotification, ActionableNotification, "language/actionableNotification");
+
+
+
+struct  ProgressReport {
+	std::string ToString() const;
+
+	std::string id;
+
+
+	std::string task;
+
+
+	std::string subTask;
+
+
+	std::string status;
+
+	 int totalWork = 0;
+
+
+	 int workDone = 0;
+
+
+	 bool complete = false;
+	 MAKE_SWAP_METHOD(ProgressReport, id, task, subTask, status, workDone, complete);
+};
+
+
+MAKE_REFLECT_STRUCT(ProgressReport, id, task, subTask, status, workDone, complete);
+
+/**
+ * The progress report notification is sent from a server to be handled by the
+ * client.
+ */
+DEFINE_NOTIFICATION_TYPE(lang_progressReport, ProgressReport, "language/progressReport");
+
+enum EventType {
+	/**
+	 * classpath updated event.
+	 */
+	ClasspathUpdated = (100),
+
+	/**
+	 * projects imported event.
+	 */
+	 ProjectsImported = (200)
+};
+
+struct EventNotification
+{
+	int eventType;
+	lsp::Any data;
+	std::string ToString() const;
+	MAKE_SWAP_METHOD(EventNotification, eventType, data)
+};
+MAKE_REFLECT_STRUCT(EventNotification, eventType, data);
+
+DEFINE_NOTIFICATION_TYPE(lang_eventNotification, EventNotification, "language/eventNotification");
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/language/language.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/location_type.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/location_type.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/location_type.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,63 @@
+#pragma once
+
+#include "lsDocumentUri.h"
+#include "lsRange.h"
+//Represents a location inside a resource, such as a line inside a text file.
+struct lsLocation {
+	lsLocation();
+	lsLocation(lsDocumentUri uri, lsRange range);
+
+	bool operator==(const lsLocation& other) const;
+	bool operator<(const lsLocation& o) const;
+
+	lsDocumentUri uri;
+	lsRange range;
+	MAKE_SWAP_METHOD(lsLocation, uri, range)
+};
+MAKE_REFLECT_STRUCT(lsLocation, uri, range)
+
+
+
+struct LinkLocation :public lsLocation
+{
+	std::string displayName;
+	std::string kind;
+	MAKE_REFLECT_STRUCT(LinkLocation, uri, range, displayName, kind)
+};
+MAKE_REFLECT_STRUCT(LinkLocation, uri, range, displayName,kind)
+
+//Represents a link between a sourceand a target location.
+struct LocationLink
+{
+	/**
+	 * Span of the origin of this link.
+	 *
+	 * Used as the underlined span for mouse interaction. Defaults to the word range at
+	 * the mouse position.
+	 */
+	boost::optional<lsRange>  originSelectionRange;
+
+	/**
+	 * The target resource identifier of this link.
+	 */
+
+	lsDocumentUri targetUri;
+
+	/**
+	 * The full target range of this link. If the target for example is a symbol then target range is the
+	 * range enclosing this symbol not including leading/trailing whitespace but everything else
+	 * like comments. This information is typically used to highlight the range in the editor.
+	 */
+
+	lsRange targetRange;
+
+	/**
+	 * The range that should be selected and revealed when this link is being followed, e.g the name of a function.
+	 * Must be contained by the the `targetRange`. See also `DocumentSymbol#range`
+	 */
+
+	lsRange targetSelectionRange;
+
+	MAKE_SWAP_METHOD(LocationLink, originSelectionRange, targetUri, targetRange, targetSelectionRange);
+};
+MAKE_REFLECT_STRUCT(LocationLink, originSelectionRange, targetUri, targetRange, targetSelectionRange);
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/location_type.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lru_cache.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lru_cache.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lru_cache.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,151 @@
+#pragma once
+
+#include <algorithm>
+#include <cassert>
+#include <limits>
+#include <memory>
+#include <vector>
+
+// Cache that evicts old entries which have not been used recently. Implemented
+// using array/linear search so this works well for small array sizes.
+template <typename TKey, typename TValue>
+struct LruCache {
+  explicit LruCache(int max_entries);
+
+  // Fetches an entry for |key|. If it does not exist, |allocator| will be
+  // invoked to create one.
+  template <typename TAllocator>
+  TValue Get(const TKey& key, TAllocator allocator);
+  // Returns true if there is an entry for |key|.
+  bool Has(const TKey& key);
+  // Fetches the entry for |filename| and updates it's usage so it is less
+  // likely to be evicted.
+  bool TryGet(const TKey& key, TValue* dest);
+  // TryGetEntry, except the entry is removed from the cache.
+  bool TryTake(const TKey& key, TValue* dest);
+  // Inserts an entry. Evicts the oldest unused entry if there is no space.
+  void Insert(const TKey& key, const TValue& value);
+
+  // Call |func| on existing entries. If |func| returns false iteration
+  // terminates early.
+  template <typename TFunc>
+  void IterateValues(TFunc func);
+
+  // Empties the cache
+  void Clear(void);
+
+ private:
+  // There is a global score counter, when we access an element we increase
+  // its score to the current global value, so it has the highest overall
+  // score. This means that the oldest/least recently accessed value has the
+  // lowest score.
+  //
+  // There is a bit of special logic to handle score overlow.
+  struct Entry {
+    uint32_t score = 0;
+    TKey key;
+    TValue value;
+    bool operator<(const Entry& other) const { return score < other.score; }
+  };
+
+  void IncrementScore();
+
+  std::vector<Entry> entries_;
+  int max_entries_ = 1;
+  uint32_t next_score_ = 0;
+};
+
+template <typename TKey, typename TValue>
+LruCache<TKey, TValue>::LruCache(int max_entries) : max_entries_(max_entries) {
+  assert(max_entries > 0);
+}
+
+template <typename TKey, typename TValue>
+template <typename TAllocator>
+TValue LruCache<TKey, TValue>::Get(const TKey& key, TAllocator allocator) {
+  for (Entry& entry : entries_) {
+    if (entry.key == key)
+      return entry.value;
+  }
+
+  auto result = allocator();
+  Insert(key, result);
+  return result;
+}
+
+template <typename TKey, typename TValue>
+bool LruCache<TKey, TValue>::Has(const TKey& key) {
+  for (Entry& entry : entries_) {
+    if (entry.key == key)
+      return true;
+  }
+  return false;
+}
+
+template <typename TKey, typename TValue>
+bool LruCache<TKey, TValue>::TryGet(const TKey& key, TValue* dest) {
+  // Assign new score.
+  for (Entry& entry : entries_) {
+    if (entry.key == key) {
+      entry.score = next_score_;
+      IncrementScore();
+      if (dest)
+        *dest = entry.value;
+      return true;
+    }
+  }
+
+  return false;
+}
+
+template <typename TKey, typename TValue>
+bool LruCache<TKey, TValue>::TryTake(const TKey& key, TValue* dest) {
+  for (size_t i = 0; i < entries_.size(); ++i) {
+    if (entries_[i].key == key) {
+      if (dest)
+        *dest = entries_[i].value;
+      entries_.erase(entries_.begin() + i);
+      return true;
+    }
+  }
+
+  return false;
+}
+
+template <typename TKey, typename TValue>
+void LruCache<TKey, TValue>::Insert(const TKey& key, const TValue& value) {
+  if ((int)entries_.size() >= max_entries_)
+    entries_.erase(std::min_element(entries_.begin(), entries_.end()));
+
+  Entry entry;
+  entry.score = next_score_;
+  IncrementScore();
+  entry.key = key;
+  entry.value = value;
+  entries_.push_back(entry);
+}
+
+template <typename TKey, typename TValue>
+template <typename TFunc>
+void LruCache<TKey, TValue>::IterateValues(TFunc func) {
+  for (Entry& entry : entries_) {
+    if (!func(entry.value))
+      break;
+  }
+}
+
+template <typename TKey, typename TValue>
+void LruCache<TKey, TValue>::IncrementScore() {
+  // Overflow.
+  if (++next_score_ == 0) {
+    std::sort(entries_.begin(), entries_.end());
+    for (Entry& entry : entries_)
+      entry.score = next_score_++;
+  }
+}
+
+template <typename TKey, typename TValue>
+void LruCache<TKey, TValue>::Clear(void) {
+  entries_.clear();
+  next_score_ = 0;
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lru_cache.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsAny.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsAny.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsAny.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,159 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+#include <string>
+#include "LibLsp/JsonRpc/message.h"
+namespace lsp
+{
+	struct Any
+	{
+		//! Type of JSON value
+		enum  Type {
+			kUnKnown=-1,
+			kNullType = 0,      //!< null
+			kFalseType = 1,     //!< false
+			kTrueType = 2,      //!< true
+			kObjectType = 3,    //!< object
+			kArrayType = 4,     //!< array 
+			kStringType = 5,    //!< string
+			kNumberType = 6     //!< number
+		};
+
+
+
+		template <typename  T>
+		bool Get(T& value);
+
+		template <typename  T>
+		void Set(T& value);
+
+		int GuessType();
+		int GetType();
+
+		void Set(std::unique_ptr<LspMessage> value);
+
+		void SetJsonString(std::string&& _data, Type _type);
+
+		void SetJsonString(const std::string& _data, Type _type);
+
+		const std::string& Data()const
+		{
+			return  data;
+		}
+
+		void swap(Any& arg) noexcept;
+
+		/*
+		 *Example for GetFromMap
+			struct A{
+				std::string  visitor;
+				bool   verbose;
+			}
+			REFLECT_MAP_TO_STRUCT(A,visitor,verbose)
+
+			std::string data = "{\"visitor\":\"default\",\"verbose\":\"true\"};
+			lsp:Any any;
+			any.SetJsonString(data, static_cast<lsp::Any::Type>(-1));
+			A a_object;
+			any.GetFromMap(a_object);
+		*/
+		template <typename  T>
+		bool GetFromMap(T& value);
+
+		
+		template <typename  T>
+		bool GetForMapHelper(T& value);
+		bool GetForMapHelper(std::string& value);
+		bool GetForMapHelper(boost::optional<std::string>& value);
+	private:
+		std::unique_ptr<Reader> GetReader();
+		std::unique_ptr<Writer> GetWriter() const;
+		void SetData(std::unique_ptr<Writer>&);
+
+		std::string  data;
+		int jsonType = kUnKnown;
+
+	};
+
+};
+
+
+extern void Reflect(Reader& visitor, lsp::Any& value);
+extern  void Reflect(Writer& visitor, lsp::Any& value);
+
+template <typename T>
+void ReflectMember(std::map < std::string, lsp::Any>& visitor, const char* name, T& value) {
+
+	auto it = visitor.find(name);
+	if (it != visitor.end())
+	{
+		it->second.GetForMapHelper(value);
+	}
+}
+template <typename T>
+void ReflectMember(std::map < std::string, std::string>& visitor, const char* name, T& value) {
+
+	auto it = visitor.find(name);
+	if (it != visitor.end())
+	{
+		lsp::Any any;
+		any.SetJsonString(it->second, static_cast<lsp::Any::Type>(-1));
+		any.Get(value);
+	}
+}
+
+#define REFLECT_MAP_TO_STRUCT(type, ...)               \
+  template <typename TVisitor>                       \
+  void ReflectMap(TVisitor& visitor, type& value) {     \
+    MACRO_MAP(_MAPPABLE_REFLECT_MEMBER, __VA_ARGS__) \
+  }
+
+
+namespace lsp
+{
+	template <typename T>
+	bool Any::Get(T& value)
+	{
+		const auto visitor = GetReader();
+		Reflect(*visitor, value);
+		return true;
+	}
+
+	template <typename T>
+	void Any::Set(T& value)
+	{
+		auto visitor = GetWriter();
+		Reflect(*visitor, value);
+		SetData(visitor);
+	}
+
+	template <typename T>
+	bool Any::GetFromMap(T& value)
+	{
+		const auto visitor = GetReader();
+		std::map < std::string, lsp::Any> _temp;
+		Reflect(*visitor, _temp);
+		ReflectMap(_temp, value);
+		return true;
+	}
+
+	template <typename T>
+	bool Any::GetForMapHelper(T& value)
+	{
+		jsonType = GetType();
+		if (jsonType == kStringType)
+		{
+			auto copy = data;
+			copy.erase(copy.find_last_not_of('"') + 1);
+			copy.erase(0, copy.find_first_not_of('"'));
+			lsp::Any any;
+			any.SetJsonString(copy, kUnKnown);
+			any.Get(value);
+		}
+		else
+		{
+			Get(value);
+		}
+		return true;
+	}
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsAny.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsCodeAction.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsCodeAction.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsCodeAction.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,58 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+
+
+
+#include <string>
+#include <vector>
+#include "lsPosition.h"
+#include "lsWorkspaceEdit.h"
+#include "lsp_diagnostic.h"
+#include "lsCommand.h"
+
+struct CodeAction
+{
+	/**
+	 * A short, human-readable, title for this code action.
+	 */
+
+	std::string title;
+
+	/**
+	 * The kind of the code action.
+	 *
+	 * Used to filter code actions.
+	 */
+	boost::optional < std::string> kind;
+
+	/**
+	 * The diagnostics that this code action resolves.
+	 */
+	boost::optional < std::vector<lsDiagnostic>> diagnostics;
+
+	/**
+	 * The workspace edit this code action performs.
+	 */
+	boost::optional < lsWorkspaceEdit >edit;
+
+	/**
+	 * A command this code action executes. If a code action
+	 * provides a edit and a command, first the edit is
+	 * executed and then the command.
+	 */
+	 boost::optional< lsCommandWithAny >  command;
+
+	 MAKE_SWAP_METHOD(CodeAction, title, kind, diagnostics, edit, command)
+};
+MAKE_REFLECT_STRUCT(CodeAction, title, kind, diagnostics, edit, command)
+struct TextDocumentCodeAction
+
+{
+
+	typedef  std::pair<boost::optional<lsCommandWithAny>, boost::optional<CodeAction> > Either;
+
+};
+
+
+extern  void Reflect(Reader& visitor, TextDocumentCodeAction::Either& value);
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsCodeAction.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsCommand.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsCommand.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsCommand.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,44 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+
+
+
+#include <string>
+#include <vector>
+#include "lsAny.h"
+//
+//Represents a reference to a command.Provides a title which will be used to represent a command in the UI.
+//Commands are identified by a string identifier.
+//The recommended way to handle commands is to implement their execution on the server side
+//if the clientand server provides the corresponding capabilities.Alternatively the tool
+//extension code could handle the command.The protocol currently doesn\xA1\xAFt specify a set of well - known commands.
+template <typename AnyArray>
+struct lsCommand {
+	// Title of the command (ie, 'save')
+	std::string title;
+	// Actual command identifier.
+	std::string command;
+	// Arguments to run the command with.
+	// **NOTE** This must be serialized as an array. Use
+	// MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY.
+	boost::optional<AnyArray> arguments;
+
+	void swap(lsCommand<AnyArray>& arg) noexcept
+	{
+		title.swap(arg.title);
+		command.swap(arg.command);
+		arguments.swap(arg.arguments);
+	}
+};
+template <typename TVisitor, typename T>
+void Reflect(TVisitor& visitor, lsCommand<T>& value) {
+	REFLECT_MEMBER_START();
+	REFLECT_MEMBER(title);
+	REFLECT_MEMBER(command);
+	REFLECT_MEMBER(arguments);
+	REFLECT_MEMBER_END();
+}
+
+
+using  lsCommandWithAny = lsCommand< std::vector<lsp::Any>>;


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsCommand.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsDocumentUri.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsDocumentUri.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsDocumentUri.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,26 @@
+#pragma once
+#include "LibLsp/JsonRpc/serializer.h"
+#include <string>
+struct lsDocumentUri {
+	static lsDocumentUri FromPath(const AbsolutePath& path);
+
+	lsDocumentUri();
+	
+	lsDocumentUri(const AbsolutePath& path);
+	lsDocumentUri(const lsDocumentUri& other);;
+	bool operator==(const lsDocumentUri& other) const;
+	bool operator==(const std::string& other) const;
+	void SetPath(const AbsolutePath& path);
+	std::string GetRawPath() const;
+	AbsolutePath GetAbsolutePath() const;
+
+	
+	std::string raw_uri_;
+	void swap(lsDocumentUri& arg) noexcept
+	{
+		raw_uri_.swap(arg.raw_uri_);
+	}
+};
+extern void Reflect(Writer& visitor, lsDocumentUri& value);
+extern void Reflect(Reader& visitor, lsDocumentUri& value);
+extern   std::string  make_file_scheme_uri(const std::string& absolute_path);


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsDocumentUri.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsFormattingOptions.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsFormattingOptions.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsFormattingOptions.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,43 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+
+struct lsFormattingOptions {
+	struct KeyData {
+		boost::optional<bool> _boolean;
+		boost::optional<int32_t> _integer;
+		boost::optional<std::string> _string;
+	};
+
+	// Size of a tab in spaces.
+	int tabSize =4;
+	// Prefer spaces over tabs.
+	bool insertSpaces = true;
+
+	/**
+		 * Trim trailing whitespace on a line.
+		 *
+		 * @since 3.15.0
+		 */
+	boost::optional<bool> trimTrailingWhitespace;
+
+	/**
+	 * Insert a newline character at the end of the file if one does not exist.
+	 *
+	 * @since 3.15.0
+	 */
+	boost::optional<bool> insertFinalNewline;
+
+	/**
+	 * Trim all newlines after the final newline at the end of the file.
+	 *
+	 * @since 3.15.0
+	 */
+	boost::optional<bool> trimFinalNewlines;
+	boost::optional<KeyData> key;
+    MAKE_SWAP_METHOD(lsFormattingOptions, tabSize, insertSpaces, trimTrailingWhitespace, insertFinalNewline, trimFinalNewlines, key)
+};
+MAKE_REFLECT_STRUCT(lsFormattingOptions, tabSize, insertSpaces, trimTrailingWhitespace, insertFinalNewline, trimFinalNewlines, key);
+
+extern void Reflect(Reader& visitor, lsFormattingOptions::KeyData& value);
+extern  void Reflect(Writer& visitor, lsFormattingOptions::KeyData& value);
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsFormattingOptions.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsMarkedString.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsMarkedString.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsMarkedString.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,45 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+
+#include <string>
+#include <vector>
+
+
+// MarkedString can be used to render human readable text. It is either a
+// markdown string or a code-block that provides a language and a code snippet.
+// The language identifier is sematically equal to the optional language
+// identifier in fenced code blocks in GitHub issues. See
+// https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+//
+// The pair of a language and a value is an equivalent to markdown:
+// ```${language}
+// ${value}
+// ```
+//
+// Note that markdown strings will be sanitized - that means html will be
+// escaped.
+struct lsMarkedString {
+	boost::optional<std::string> language;
+	std::string value;
+};
+
+struct MarkupContent {
+	/**
+	 * The type of the Markup.
+	 */
+
+	 std::string kind;
+
+	/**
+	 * The content itself.
+	 */
+	
+	 std::string value;
+
+	 MAKE_SWAP_METHOD(MarkupContent, kind, value);
+};
+MAKE_REFLECT_STRUCT(MarkupContent,kind,value);
+
+void Reflect(Writer& visitor, lsMarkedString& value);
+void Reflect(Reader& visitor, lsMarkedString& value);


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsMarkedString.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsPosition.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsPosition.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsPosition.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,40 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+
+
+
+#include <string>
+#include <vector>
+
+//Position in a text document expressed as zero - based line and zero - based character offset.
+//A position is between two characters like an \xA1\xAEinsert\xA1\xAF cursor in a editor.Special values like
+//for example - 1 to denote the end of a line are not supported.
+struct lsPosition {
+	lsPosition();
+	lsPosition(int line, int character);
+
+	bool operator==(const lsPosition& other) const;
+	bool operator<(const lsPosition& other) const;
+
+	std::string ToString() const;
+
+	/**
+	 * Line position in a document (zero-based).
+	 */
+	// Note: these are 0-based.
+	unsigned line = 0;
+	/**
+	 * Character offset on a line in a document (zero-based). Assuming that
+	 * the line is represented as a string, the `character` value represents
+	 * the gap between the `character` and `character + 1`.
+	 *
+	 * If the character value is greater than the line length it defaults back
+	 * to the line length.
+	 */
+	unsigned character = 0;
+	static const lsPosition kZeroPosition;
+
+	MAKE_SWAP_METHOD(lsPosition, line, character)
+};
+MAKE_REFLECT_STRUCT(lsPosition, line, character);
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsPosition.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsRange.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsRange.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsRange.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,32 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+
+
+
+#include <string>
+#include <vector>
+#include "lsPosition.h"
+//A range in a text document expressed as(zero - based) startand end positions.
+//A range is comparable to a selection in an editor.Therefore the end position is exclusive.
+//If you want to specify a range that contains a line including the line ending character(s)
+//then use an end position denoting the start of the next line.
+struct lsRange {
+	lsRange();
+	lsRange(lsPosition start, lsPosition end);
+
+	bool operator==(const lsRange& other) const;
+	bool operator<(const lsRange& other) const;
+	/**
+	 * The range's start position.
+	 */
+	lsPosition start;
+	/**
+	 * The range's end position.
+	 */
+	lsPosition end;
+	std::string ToString()const;
+	MAKE_SWAP_METHOD(lsRange, start, end)
+};
+
+MAKE_REFLECT_STRUCT(lsRange, start, end)
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsRange.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsResponseError.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsResponseError.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsResponseError.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,117 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+#include <sstream>
+#include "LibLsp/lsp/lsAny.h"
+
+enum class lsErrorCodes:int32_t {
+	// Defined by JSON RPC
+	ParseError = -32700,
+	InvalidRequest = -32600,
+	MethodNotFound = -32601,
+	InvalidParams = -32602,
+	InternalError = -32603,
+	
+	/**
+	 * This is the start range of JSON RPC reserved error codes.
+	 * It doesn't denote a real error code. No LSP error codes should
+	 * be defined between the start and end range. For backwards
+	 * compatibility the `ServerNotInitialized` and the `UnknownErrorCode`
+	 * are left in the range.
+	 *
+	 * @since 3.16.0
+	 */
+	jsonrpcReservedErrorRangeStart = -32099,
+	/** @deprecated use jsonrpcReservedErrorRangeStart */
+	serverErrorStart = jsonrpcReservedErrorRangeStart,
+
+	/**
+	 * This is the start range of JSON RPC reserved error codes.
+	 * It doesn't denote a real error code.
+	 *
+	 * @since 3.16.0
+	 */
+	jsonrpcReservedErrorRangeEnd = -32000,
+	/** @deprecated use jsonrpcReservedErrorRangeEnd */
+	serverErrorEnd = jsonrpcReservedErrorRangeEnd,
+	
+	/**
+	 * Error code indicating that a server received a notification or
+	 * request before the server has received the `initialize` request.
+	 */
+	ServerNotInitialized = -32002,
+	UnknownErrorCode = -32001,
+
+	/**
+	 * This is the start range of LSP reserved error codes.
+	 * It doesn't denote a real error code.
+	 *
+	 * @since 3.16.0
+	 */
+	lspReservedErrorRangeStart=  -32899,
+
+	/**
+	 * The server cancelled the request. This error code should
+	 * only be used for requests that explicitly support being
+	 * server cancellable.
+	 *
+	 * @since 3.17.0
+	 */
+	ServerCancelled  = -32802,
+	
+	/**
+	 * The server detected that the content of a document got
+	 * modified outside normal conditions. A server should
+	 * NOT send this error code if it detects a content change
+	 * in it unprocessed messages. The result even computed
+	 * on an older state might still be useful for the client.
+	 *
+	 * If a client decides that a result is not of any use anymore
+	 * the client should cancel the request.
+	 */
+	 ContentModified  = -32801,
+
+	/**
+	 * The client has canceled a request and a server as detected
+	 * the cancel.
+	 */
+	RequestCancelled  = -32800,
+
+	/**
+	 * This is the end range of LSP reserved error codes.
+	 * It doesn't denote a real error code.
+	 *
+	 * @since 3.16.0
+	 */
+	lspReservedErrorRangeEnd  = -32800,
+
+	
+
+};
+MAKE_REFLECT_TYPE_PROXY(lsErrorCodes);
+struct lsResponseError {
+	lsResponseError(): code(lsErrorCodes::UnknownErrorCode)
+	{
+	}
+
+	/**
+	 * A number indicating the error type that occurred.
+	 */
+	lsErrorCodes code;
+	// Short description.
+	/**
+	 * A string providing a short description of the error.
+	 */
+	std::string message;
+
+	/**
+	 * A primitive or structured value that contains additional
+	 * information about the error. Can be omitted.
+	 */
+	boost::optional<lsp::Any> data;
+	std::string ToString();
+	void Write(Writer& visitor);
+	
+	MAKE_SWAP_METHOD(lsResponseError, code, message, data)
+};
+MAKE_REFLECT_STRUCT(lsResponseError, code, message, data)
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsResponseError.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentEdit.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentEdit.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentEdit.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+#include <vector>
+#include "LibLsp/JsonRpc/message.h"
+#include "lsVersionedTextDocumentIdentifier.h"
+#include "lsTextEdit.h"
+
+
+struct lsTextDocumentEdit {
+		// The text document to change.
+		lsVersionedTextDocumentIdentifier textDocument;
+	
+		/**
+		 * The edits to be applied.
+		 *
+		 * @since 3.16.0 - support for AnnotatedTextEdit. This is guarded by the
+		 * client capability `workspace.workspaceEdit.changeAnnotationSupport`
+		 */
+		// The edits to be applied.
+		std::vector< lsAnnotatedTextEdit > edits;
+		MAKE_SWAP_METHOD(lsTextDocumentEdit, textDocument, edits);
+};
+MAKE_REFLECT_STRUCT(lsTextDocumentEdit, textDocument, edits);
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentEdit.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentIdentifier.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentIdentifier.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentIdentifier.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+#include "lsDocumentUri.h"
+//Text documents are identified using a URI.On the protocol level,
+//URIs are passed as strings.The corresponding JSON structure looks like this:
+struct lsTextDocumentIdentifier {
+	/**
+	 * The text document's URI.
+	 */
+	lsDocumentUri uri;
+    MAKE_SWAP_METHOD(lsTextDocumentIdentifier, uri)
+};
+MAKE_REFLECT_STRUCT(lsTextDocumentIdentifier, uri)
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentIdentifier.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentItem.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentItem.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentItem.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+#include <string>
+#include <vector>
+#include "lsDocumentUri.h"
+
+//An item to transfer a text document from the client to the server.
+struct lsTextDocumentItem {
+	// The text document's URI.
+	lsDocumentUri uri;
+
+	// The text document's language identifier.
+	std::string languageId;
+
+	// The version number of this document (it will strictly increase after each
+	// change, including undo/redo).
+	int version = 0;
+
+	// The content of the opened text document.
+	std::string text;
+
+	MAKE_SWAP_METHOD(lsTextDocumentItem, uri, languageId, version, text)
+};
+
+MAKE_REFLECT_STRUCT(lsTextDocumentItem, uri, languageId, version, text)
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentItem.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentPositionParams.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentPositionParams.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentPositionParams.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/message.h"
+
+#include "lsTextDocumentIdentifier.h"
+#include "lsPosition.h"
+
+/**
+ * A parameter literal used in requests to pass a text document and a position inside that document.
+ */
+struct lsTextDocumentPositionParams {
+	// The text document.
+	lsTextDocumentIdentifier textDocument;
+
+	// The position inside the text document.
+	lsPosition position;
+
+	/**
+	 * Legacy property to support protocol version 1.0 requests.
+	 */
+	boost::optional<lsDocumentUri> uri;
+	
+   MAKE_SWAP_METHOD(lsTextDocumentPositionParams, textDocument, position, uri);
+	
+};
+MAKE_REFLECT_STRUCT(lsTextDocumentPositionParams, textDocument, position, uri);


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextDocumentPositionParams.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextEdit.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextEdit.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextEdit.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,87 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+
+
+
+#include <string>
+#include "lsRange.h"
+
+
+//Since 3.16.0 there is also the concept of an annotated text edit which supports to add an annotation to a text edit.
+//The annotation can add information describing the change to the text edit.
+/**
+ * Additional information that describes document changes.
+ *
+ * @since 3.16.0
+ */
+struct lsChangeAnnotation
+{
+	/**
+	 * A human-readable string describing the actual change. The string
+	 * is rendered prominent in the user interface.
+	 */
+	std::string label;
+
+	/**
+	 * A flag which indicates that user confirmation is needed
+	 * before applying the change.
+	 */
+	boost::optional<bool>  needsConfirmation;
+
+	/**
+	 * A human-readable string which is rendered less prominent in
+	 * the user interface.
+	 */
+	boost::optional < std::string >  description;
+	MAKE_REFLECT_STRUCT(lsChangeAnnotation, label, needsConfirmation, description)
+};
+MAKE_REFLECT_STRUCT(lsChangeAnnotation, label, needsConfirmation, description)
+
+
+//Usually clients provide options to group the changes along the annotations they are associated with.
+//To support this in the protocol an edit or resource operation refers to a change annotation
+//using an identifier and not the change annotation literal directly.This allows servers to use
+//the identical annotation across multiple edits or resource operations which then allows clients
+//to group the operations under that change annotation.The actual change annotations together with
+//their identifers are managed by the workspace edit via the new property changeAnnotations.
+
+
+
+/**
+ * An identifier referring to a change annotation managed by a workspace
+ * edit.
+ *
+ * @since 3.16.0.
+ */
+using lsChangeAnnotationIdentifier = std::string;
+/**
+ * A special text edit with an additional change annotation.
+ *
+ * @since 3.16.0.
+ */
+
+
+//A textual edit applicable to a text document.
+struct lsTextEdit {
+	// The range of the text document to be manipulated. To insert
+	// text into a document create a range where start === end.
+	lsRange range;
+
+	// The string to be inserted. For delete operations use an
+	// empty string.
+	std::string newText;
+
+	/**
+ * The actual annotation identifier.
+ */
+	boost::optional<lsChangeAnnotationIdentifier>  annotationId;
+	
+
+		bool operator==(const lsTextEdit& that);
+	std::string ToString() const;
+	MAKE_SWAP_METHOD(lsTextEdit, range, newText, annotationId)
+};
+MAKE_REFLECT_STRUCT(lsTextEdit, range, newText, annotationId)
+
+using  lsAnnotatedTextEdit = lsTextEdit;


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsTextEdit.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsVersionedTextDocumentIdentifier.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsVersionedTextDocumentIdentifier.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsVersionedTextDocumentIdentifier.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,32 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+
+#include "LibLsp/JsonRpc/message.h"
+#include "LibLsp/lsp/lsDocumentUri.h"
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+
+struct lsVersionedTextDocumentIdentifier
+{
+	lsDocumentUri uri;
+	// The version number of this document.  number | null
+	boost::optional<int> version;
+
+	lsTextDocumentIdentifier AsTextDocumentIdentifier() const;
+
+	MAKE_SWAP_METHOD(lsVersionedTextDocumentIdentifier, uri, version)
+};
+MAKE_REFLECT_STRUCT(lsVersionedTextDocumentIdentifier, uri, version)
+
+/**
+ * The version number of this document. If an optional versioned text document
+ * identifier is sent from the server to the client and the file is not
+ * open in the editor (the server has not received an open notification
+ * before) the server can send `null` to indicate that the version is
+ * known and the content on disk is the master (as specified with document
+ * content ownership).
+ *
+ * The version number of a document will increase after each change,
+ * including undo/redo. The number doesn't need to be consecutive.
+ */
+using   lsOptionalVersionedTextDocumentIdentifier = lsVersionedTextDocumentIdentifier;
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsVersionedTextDocumentIdentifier.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsWorkspaceEdit.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsWorkspaceEdit.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsWorkspaceEdit.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,57 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/serializer.h"
+#include <vector>
+#include "lsTextDocumentEdit.h"
+#include "LibLsp/lsp/ResourceOperation.h"
+#include "lsAny.h"
+
+//A workspace edit represents changes to many resources managed in the workspace.
+//The edit should either provide changes or documentChanges.
+//If the client can handle versioned document edits and if documentChanges are present, the latter are preferred over changes.
+
+//Since version 3.13.0 a workspace edit can contain resource operations(create, delete or rename files and folders) as well.
+//If resource operations are present clients need to execute the operations in the order in which they are provided.
+//So a workspace edit for example can consist of the following two changes : (1) create file a.txt and (2) a text document edit which insert text into file a.
+//txt.An invalid sequence(e.g. (1) delete file a.txt and (2) insert text into file a.txt) will cause failure of the operation.
+//How the client recovers from the failure is described by the client capability : workspace.workspaceEdit.failureHandling
+
+
+
+struct lsChangeAnnotations
+{
+	lsChangeAnnotation id;
+	MAKE_SWAP_METHOD(lsChangeAnnotations, id)
+};
+MAKE_REFLECT_STRUCT(lsChangeAnnotations, id)
+struct lsWorkspaceEdit {
+	// Holds changes to existing resources.
+	// changes ? : { [uri:string]: TextEdit[]; };
+	// std::unordered_map<lsDocumentUri, std::vector<lsTextEdit>> changes;
+
+	// An array of `TextDocumentEdit`s to express changes to specific a specific
+	// version of a text document. Whether a client supports versioned document
+	// edits is expressed via `WorkspaceClientCapabilites.versionedWorkspaceEdit`.
+	//
+	boost::optional< std::map<std::string, std::vector<lsTextEdit> > >  changes;
+	typedef std::pair < boost::optional<lsTextDocumentEdit>, boost::optional<lsp::Any> > Either;
+
+	boost::optional <  std::vector< Either > > documentChanges;
+	/**
+	 * A map of change annotations that can be referenced in
+	 * `AnnotatedTextEdit`s or create, rename and delete file / folder
+	 * operations.
+	 *
+	 * Whether clients honor this property depends on the client capability
+	 * `workspace.changeAnnotationSupport`.
+	 *
+	 * @since 3.16.0
+	 */
+	boost::optional< lsChangeAnnotations > changeAnnotations;
+
+	MAKE_SWAP_METHOD(lsWorkspaceEdit, changes, documentChanges, changeAnnotations)
+};
+MAKE_REFLECT_STRUCT(lsWorkspaceEdit, changes, documentChanges, changeAnnotations)
+
+extern void Reflect(Reader& visitor, lsWorkspaceEdit::Either& value);
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsWorkspaceEdit.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,1087 @@
+
+
+#include "lru_cache.h"
+
+
+#include <rapidjson/writer.h>
+
+
+#include <stdio.h>
+#include <iostream>
+#include "location_type.h"
+#include "out_list.h"
+#include "lsTextDocumentIdentifier.h"
+#include "lsVersionedTextDocumentIdentifier.h"
+#include "lsResponseError.h"
+#include "lsPosition.h"
+#include "lsTextEdit.h"
+#include "lsMarkedString.h"
+#include "lsWorkspaceEdit.h"
+#include "textDocument/code_action.h"
+#include "textDocument/document_symbol.h"
+#include "extention/jdtls/codeActionResult.h"
+
+#include "textDocument/selectionRange.h"
+#include "AbsolutePath.h"
+
+#ifdef _WIN32
+#include <Windows.h>
+#else
+#include <climits>
+#include <cstdlib>
+#endif
+
+#include "Directory.h"
+#include "lsFormattingOptions.h"
+#include "LibLsp/JsonRpc/json.h"
+#include "language/language.h"
+#include "network/uri/uri_builder.hpp"
+#include "lsp_completion.h"
+#include "utils.h"
+#include "client/registerCapability.h"
+#include <boost/uuid/uuid.hpp>
+#include <boost/uuid/uuid_io.hpp>
+#include <boost/uuid/uuid_generators.hpp>
+// namespace
+
+
+
+lsTextDocumentIdentifier
+lsVersionedTextDocumentIdentifier::AsTextDocumentIdentifier() const {
+  lsTextDocumentIdentifier result;
+  result.uri = uri;
+  return result;
+}
+
+
+lsPosition::lsPosition() {}
+lsPosition::lsPosition(int line, int character)
+    : line(line), character(character) {}
+
+bool lsPosition::operator==(const lsPosition& other) const {
+  return line == other.line && character == other.character;
+}
+
+bool lsPosition::operator<(const lsPosition& other) const {
+  return line != other.line ? line < other.line : character < other.character;
+}
+
+std::string lsPosition::ToString() const {
+  return std::to_string(line) + ":" + std::to_string(character);
+}
+const lsPosition lsPosition::kZeroPosition = lsPosition();
+
+lsRange::lsRange() {}
+lsRange::lsRange(lsPosition start, lsPosition end) : start(start), end(end) {}
+
+bool lsRange::operator==(const lsRange& o) const {
+  return start == o.start && end == o.end;
+}
+
+bool lsRange::operator<(const lsRange& o) const {
+  return !(start == o.start) ? start < o.start : end < o.end;
+}
+
+std::string lsRange::ToString() const
+{
+	std::stringstream ss;
+	ss << "start:" << start.ToString() << std::endl;
+	ss << "end" << end.ToString() << std::endl;
+	return ss.str();
+}
+
+lsLocation::lsLocation() {}
+lsLocation::lsLocation(lsDocumentUri uri, lsRange range)
+    : uri(uri), range(range) {}
+
+bool lsLocation::operator==(const lsLocation& o) const {
+  return uri == o.uri && range == o.range;
+}
+
+bool lsLocation::operator<(const lsLocation& o) const {
+  return std::make_tuple(uri.raw_uri_, range) <
+         std::make_tuple(o.uri.raw_uri_, o.range);
+}
+
+bool lsTextEdit::operator==(const lsTextEdit& that) {
+  return range == that.range && newText == that.newText;
+}
+
+std::string lsTextEdit::ToString() const
+{
+	std::stringstream ss;
+	ss << "Range:" << range.ToString() << std::endl;
+	ss << "newText:" << newText << std::endl;
+	return ss.str();
+}
+
+void Reflect(Writer& visitor, lsMarkedString& value) {
+  // If there is a language, emit a `{language:string, value:string}` object. If
+  // not, emit a string.
+  if (value.language) {
+    REFLECT_MEMBER_START();
+    REFLECT_MEMBER(language);
+    REFLECT_MEMBER(value);
+    REFLECT_MEMBER_END();
+  } else {
+    Reflect(visitor, value.value);
+  }
+}
+
+void Reflect(Reader& visitor, lsMarkedString& value)
+{
+	REFLECT_MEMBER_START();
+	REFLECT_MEMBER(language);
+	REFLECT_MEMBER(value);
+	REFLECT_MEMBER_END();
+}
+
+  void Reflect(Reader& visitor, LocationListEither::Either& value)
+{
+	  if(!visitor.IsArray())
+	  {
+		  throw std::invalid_argument("Rsp_LocationListEither::Either& value is not array");
+	  }
+	  auto data = ((JsonReader&)visitor).m_->GetArray();
+	  if (data.Size() && data[0].HasMember("originSelectionRange"))
+	  {
+		  Reflect(visitor, value.second);
+	  }
+	  else {
+		  Reflect(visitor, value.first);
+	  }
+
+}
+
+ void Reflect(Writer& visitor, LocationListEither::Either& value)
+{
+	if (value.first)
+	{
+		Reflect(visitor, value.first.value());
+	}
+	else if (value.second)
+	{
+		Reflect(visitor, value.second.value());
+	}
+}
+
+
+void Reflect(Reader& visitor, TextDocumentCodeAction::Either& value)
+{
+
+
+	if(visitor.HasMember("command"))
+	{
+		if(visitor["command"]->IsString())
+		{
+			Reflect(visitor, value.first);
+		}
+		else
+		{
+			Reflect(visitor, value.second);
+		}
+	}
+	else
+	{
+		if (visitor.HasMember("diagnostics") || visitor.HasMember("edit"))
+		{
+			Reflect(visitor, value.second);
+		}
+		else
+		{
+			Reflect(visitor, value.first);
+		}
+	}
+
+}
+
+
+void Reflect(Reader& visitor, lsWorkspaceEdit::Either& value)
+{
+
+
+	if(visitor.HasMember("textDocument"))
+	{
+		Reflect(visitor, value.first);
+	}
+	else
+	{
+		Reflect(visitor, value.second);
+	}
+}
+ResourceOperation* GetResourceOperation(lsp::Any& lspAny)
+{
+	rapidjson::Document document;
+	auto& data = lspAny.Data();
+	document.Parse(data.c_str(), data.length());
+	if (document.HasParseError()) {
+		// ��ʾ
+		return nullptr;
+	}
+	auto find = document.FindMember("kind");
+
+	JsonReader visitor{ &document };
+	try
+	{
+		if (find->value == "create")
+		{
+			auto ptr = std::make_unique<lsCreateFile>();
+			auto temp = ptr.get();
+			Reflect(visitor, *temp);
+			return ptr.release();
+		}
+		else if (find->value == "rename")
+		{
+			auto ptr = std::make_unique<lsRenameFile>();
+			auto temp = ptr.get();
+			Reflect(visitor, *temp);
+			return ptr.release();
+		}
+		else if (find->value == "delete")
+		{
+
+			auto ptr = std::make_unique<lsDeleteFile>();
+			auto temp = ptr.get();
+			Reflect(visitor, *temp);
+			return ptr.release();
+		}
+	}
+	catch (std::exception&)
+	{
+
+	}
+	return nullptr;
+}
+
+  void Reflect(Writer& visitor, ResourceOperation* value)
+{
+
+	if(!value)
+	{
+		throw std::invalid_argument("ResourceOperation value is nullptr");
+	}
+	if (value->kind == "create")
+	{
+		auto temp = (lsCreateFile*)value;
+		Reflect(visitor, *temp);
+	}
+	else if (value->kind == "rename")
+	{
+		auto temp = (lsRenameFile*)value;
+		Reflect(visitor, *temp);
+	}
+	else if (value->kind == "delete")
+	{
+
+		auto temp = (lsDeleteFile*)value;
+		Reflect(visitor, *temp);
+	}
+
+}
+
+int lsp::Any::GuessType()
+{
+	if (!data.empty())
+	{
+		if (data == "null")
+		{
+			jsonType = rapidjson::kNullType;
+		}
+		else if (data == "true")
+		{
+			jsonType = rapidjson::kTrueType;
+		}
+		else if(data == "false")
+		{
+			jsonType = rapidjson::kFalseType;
+		}
+		else if (data[0] == '{')
+		{
+			jsonType = rapidjson::kObjectType;
+		}
+		else if (data[0] == '[')
+		{
+			if (data.size() >= 2 && data[1] == '{')
+				jsonType = rapidjson::kStringType;
+			else
+				jsonType = rapidjson::kArrayType;
+		}
+		else if (data[0] == '"')
+		{
+			jsonType = rapidjson::kStringType;
+		}
+		else
+		{
+			jsonType = rapidjson::kNumberType;
+		}
+	}
+	else
+	{
+		if (jsonType != kUnKnown)
+			return jsonType;
+		jsonType = rapidjson::kNullType;
+	}
+	return  jsonType;
+}
+
+int lsp::Any::GetType()
+{
+	if (jsonType == Type::kUnKnown)
+	{
+		if (data.empty())
+		{
+			jsonType = rapidjson::kNullType;
+			return jsonType;
+		}
+		rapidjson::Document document;
+		document.Parse(data.c_str(), data.length());
+		if (document.HasParseError())
+		{
+			// ��ʾ
+			return jsonType;
+		}
+		jsonType = document.GetType();
+	}
+	return jsonType;
+}
+
+void lsp::Any::Set(std::unique_ptr<LspMessage> value)
+{
+	if (value)
+	{
+		jsonType = rapidjson::Type::kObjectType;
+		data = value->ToJson();
+	}
+	else
+	{
+		assert(false);
+	}
+}
+
+void lsp::Any::SetJsonString(std::string&& _data, Type _type)
+{
+	jsonType = _type;
+	data.swap(_data);
+	GetType();
+}
+
+void lsp::Any::SetJsonString(const std::string& _data, Type _type)
+{
+	jsonType = _type;
+	data = (_data);
+	GetType();
+}
+
+void lsp::Any::swap(Any& arg) noexcept
+{
+	data.swap(arg.data);
+	const int temp = jsonType;
+	jsonType = arg.jsonType;
+	arg.jsonType = temp;
+}
+
+class JsonReaderForAny : public  JsonReader
+{
+public:
+	JsonReaderForAny()
+		: JsonReader(&document)
+	{
+	}
+	rapidjson::Document document;
+};
+
+bool lsp::Any::GetForMapHelper(std::string& value)
+{
+	return Get(value);
+}
+
+bool lsp::Any::GetForMapHelper(boost::optional<std::string>& value)
+{
+	return Get(value);
+}
+
+std::unique_ptr<Reader> lsp::Any::GetReader()
+{
+	auto reader = new JsonReaderForAny();
+	std::unique_ptr<Reader> ret(reader);
+	reader->document.Parse(data.c_str(), data.length());
+	if (reader->document.HasParseError())
+	{
+		return {};
+	}
+	if (jsonType == kUnKnown)
+	{
+		jsonType = reader->document.GetType();
+	}
+	return (ret);
+}
+
+class JsonWriterForAny : public JsonWriter
+{
+public:
+	rapidjson::StringBuffer output;
+	rapidjson::Writer<rapidjson::StringBuffer> writer;
+	JsonWriterForAny():JsonWriter(&writer), writer(output)
+	{
+
+	}
+};
+
+std::unique_ptr<Writer> lsp::Any::GetWriter() const
+{
+	return std::make_unique<JsonWriterForAny>();
+}
+
+void lsp::Any::SetData(std::unique_ptr<Writer>& writer)
+{
+	auto _temp = static_cast<JsonWriterForAny*>(writer.get());
+	data = _temp->output.GetString();
+	GuessType();
+}
+
+namespace
+{
+#if 0
+	rapidjson::Type convert(lsp::Any::Type type)
+	{
+		switch (type)
+		{
+		case lsp::Any::Type::kNullType:
+			return rapidjson::Type::kNullType;
+		case lsp::Any::Type::kFalseType:
+			return rapidjson::Type::kFalseType;
+		case lsp::Any::Type::kTrueType:
+			return rapidjson::Type::kTrueType;
+		case lsp::Any::Type::kObjectType:
+			return rapidjson::Type::kObjectType;
+		case lsp::Any::Type::kArrayType:
+			return rapidjson::Type::kArrayType;
+		case lsp::Any::Type::kStringType:
+			return rapidjson::Type::kStringType;
+		case lsp::Any::Type::kNumberType:
+			return rapidjson::Type::kNumberType;
+		default:
+			return rapidjson::Type::kNullType;
+		}
+	}
+#endif
+	lsp::Any::Type convert(rapidjson::Type type)
+	{
+		switch (type)
+		{
+		case rapidjson::Type::kNullType:
+			return lsp::Any::Type::kNullType;
+		case rapidjson::Type::kFalseType:
+			return lsp::Any::Type::kFalseType;
+		case rapidjson::Type::kTrueType:
+			return lsp::Any::Type::kTrueType;
+		case rapidjson::Type::kObjectType:
+			return lsp::Any::Type::kObjectType;
+		case rapidjson::Type::kArrayType:
+			return lsp::Any::Type::kArrayType;
+		case rapidjson::Type::kStringType:
+			return lsp::Any::Type::kStringType;
+		case rapidjson::Type::kNumberType:
+			return lsp::Any::Type::kNumberType;
+		default:
+			return lsp::Any::Type::kNullType;
+		}
+	}
+}
+
+void Reflect(Reader& visitor, lsp::Any& value)
+{
+
+	 //if (visitor.IsNull()) {
+		// visitor.GetNull();
+		// value.SetJsonString("", rapidjson::Type::kNullType);
+		// return;
+	 //}else
+	 //{
+		//
+	 //}
+	 JsonReader& json_reader = reinterpret_cast<JsonReader&>(visitor);
+	 value.SetJsonString(visitor.ToString(), convert(json_reader.m_->GetType()));
+}
+ void Reflect(Writer& visitor, lsp::Any& value)
+ {
+	 JsonWriter& json_writer = reinterpret_cast<JsonWriter&>(visitor);
+	 json_writer.m_->RawValue( value.Data().data(),value.Data().size(),static_cast<rapidjson::Type>(value.GetType()));
+
+ }
+  void Reflect(Reader& visitor, lsFormattingOptions::KeyData& value)
+{
+	  if (visitor.IsBool())
+	  {
+		  Reflect(visitor, value._boolean);
+	  }
+	  else if (visitor.IsInt() || visitor.IsInt64() || visitor.IsUint64())
+	  {
+		  Reflect(visitor, value._integer);
+	  }
+	  else if(visitor.IsString())
+	  {
+		  Reflect(visitor, value._string);
+	  }
+}
+   void Reflect(Writer& visitor, lsFormattingOptions::KeyData& value)
+{
+	   if (value._boolean.has_value())
+	   {
+		   Reflect(visitor, value._boolean);
+	   }
+	   else if (value._integer.has_value())
+	   {
+		   Reflect(visitor, value._integer);
+	   }
+	   else if (value._string.has_value())
+	   {
+		   Reflect(visitor, value._string);
+	   }
+}
+
+lsCreateFile::lsCreateFile()
+{
+	kind = "create";
+}
+
+lsDeleteFile::lsDeleteFile()
+{
+	kind = "delete";
+}
+
+lsRenameFile::lsRenameFile()
+{
+	kind = "rename";
+}
+
+
+void Reflect(Reader& visitor, boost::optional< SelectionRange* >& value)
+{
+	if (visitor.IsNull()) {
+		visitor.GetNull();
+		return;
+	}
+
+	SelectionRange* entry_value = nullptr;
+
+
+		std::unique_ptr<SelectionRange> ptr = std::make_unique<SelectionRange>();
+		SelectionRange* temp = ptr.get();
+		Reflect(visitor, *temp);
+
+		entry_value = ptr.release();
+		value = (entry_value);
+
+}
+void Reflect(Writer& visitor, SelectionRange* value)
+{
+
+	if (!value)
+	{
+		throw std::invalid_argument("ResourceOperation value is nullptr");
+	}
+
+	Reflect(visitor, *value);
+
+
+}
+
+   std::string  make_file_scheme_uri(const std::string& absolute_path)
+{
+	   network::uri_builder builder;
+	   builder.scheme("file");
+	   builder.host("");
+	   builder.path(absolute_path);
+	   return  builder.uri().string();
+	 ////  lsDocumentUri uri;
+	 ////  uri.SetPath(absolute_path);
+	 ///  return uri.raw_uri_;
+}
+
+// static
+AbsolutePath AbsolutePath::BuildDoNotUse(const std::string& path) {
+	AbsolutePath p;
+	p.path = std::string(path);
+	return p;
+}
+
+
+AbsolutePath::AbsolutePath() {}
+
+
+
+AbsolutePath::operator std::string() const {
+	return path;
+}
+
+bool AbsolutePath::operator==(const AbsolutePath& rhs) const {
+	return path == rhs.path;
+}
+
+bool AbsolutePath::operator!=(const AbsolutePath& rhs) const {
+	return path != rhs.path;
+}
+
+bool AbsolutePath::operator<(const AbsolutePath& rhs) const
+{
+	return path < rhs.path;
+}
+
+bool AbsolutePath::operator>(const AbsolutePath& rhs) const
+{
+	return path > rhs.path;
+}
+
+void Reflect(Reader& visitor, AbsolutePath& value) {
+	value.path = visitor.GetString();
+}
+void Reflect(Writer& visitor, AbsolutePath& value) {
+	visitor.String(value.path.c_str(), value.path.length());
+}
+
+std::ostream& operator<<(std::ostream& out, const AbsolutePath& path) {
+	out << path.path;
+	return out;
+}
+
+lsDocumentUri lsDocumentUri::FromPath(const AbsolutePath& path) {
+	lsDocumentUri result;
+	result.SetPath(path);
+	return result;
+}
+//void lsDocumentUri::SetPath(const AbsolutePath& path)
+//{
+//	raw_uri_ = make_file_scheme_uri(path.path);
+//}
+//
+void lsDocumentUri::SetPath(const AbsolutePath& path) {
+	// file:///c%3A/Users/jacob/Desktop/superindex/indexer/full_tests
+	raw_uri_ = path;
+
+	size_t index = raw_uri_.find(":");
+	if (index == 1) {  // widows drive letters must always be 1 char
+		raw_uri_.replace(raw_uri_.begin() + index, raw_uri_.begin() + index + 1,
+			"%3A");
+	}
+
+	// subset of reserved characters from the URI standard
+	// http://www.ecma-international.org/ecma-262/6.0/#sec-uri-syntax-and-semantics
+	std::string t;
+	t.reserve(8 + raw_uri_.size());
+
+	// TODO: proper fix
+#if defined(_WIN32)
+	t += "file:///";
+#else
+	t += "file://";
+#endif
+
+	// clang-format off
+	for (char c : raw_uri_)
+		switch (c) {
+		case ' ': t += "%20"; break;
+		case '#': t += "%23"; break;
+		case '$': t += "%24"; break;
+		case '&': t += "%26"; break;
+		case '(': t += "%28"; break;
+		case ')': t += "%29"; break;
+		case '+': t += "%2B"; break;
+		case ',': t += "%2C"; break;
+		case ';': t += "%3B"; break;
+		case '?': t += "%3F"; break;
+		case '@': t += "%40"; break;
+		default: t += c; break;
+		}
+	// clang-format on
+	raw_uri_ = std::move(t);
+}
+
+std::string lsDocumentUri::GetRawPath() const {
+
+
+	if (raw_uri_.compare(0, 8, "file:///"))
+		return raw_uri_;
+
+
+	std::string ret;
+#if defined(_WIN32)
+	size_t i = 8;
+#else
+	size_t i = 7;
+#endif
+	auto from_hex = [](unsigned char c) {
+		return c - '0' < 10 ? c - '0' : (c | 32) - 'a' + 10;
+	};
+	for (; i < raw_uri_.size(); i++) {
+		if (i + 3 <= raw_uri_.size() && raw_uri_[i] == '%') {
+			ret.push_back(from_hex(raw_uri_[i + 1]) * 16 + from_hex(raw_uri_[i + 2]));
+			i += 2;
+		}
+		else
+			ret.push_back(raw_uri_[i] == '\\' ? '/' : raw_uri_[i]);
+	}
+	return ret;
+}
+
+lsDocumentUri::lsDocumentUri() {}
+
+
+lsDocumentUri::lsDocumentUri(const AbsolutePath& path)
+{
+	SetPath(path);
+}
+
+lsDocumentUri::lsDocumentUri(const lsDocumentUri& other): raw_uri_(other.raw_uri_)
+{
+}
+
+bool lsDocumentUri::operator==(const lsDocumentUri& other) const {
+	return raw_uri_ == other.raw_uri_;
+}
+
+bool lsDocumentUri::operator==(const std::string& other) const
+{
+	return raw_uri_ == other;
+}
+
+
+AbsolutePath lsDocumentUri::GetAbsolutePath() const {
+
+
+		if (raw_uri_.find("file://") != std::string::npos){
+			try
+			{
+				return lsp::NormalizePath(GetRawPath(), false /*ensure_exists*/, false);
+			}
+			catch (std::exception&)
+			{
+				return AbsolutePath("", false);
+			}
+		}
+
+		return AbsolutePath(raw_uri_,false);
+
+}
+
+AbsolutePath::AbsolutePath(const std::string& path, bool validate)
+	: path(path) {
+	// TODO: enable validation after fixing tests.
+	if (validate && !lsp::IsAbsolutePath(path)) {
+		qualify = false;
+		auto temp = lsp::NormalizePath(path,false);
+		if(!temp.path.empty())
+		{
+			this->path = temp.path;
+		}
+	}
+}
+
+void Reflect(Writer& visitor, lsDocumentUri& value) {
+	Reflect(visitor, value.raw_uri_);
+}
+void Reflect(Reader& visitor, lsDocumentUri& value) {
+	Reflect(visitor, value.raw_uri_);
+	// Only record the path when we deserialize a URI, since it most likely came
+	// from the client.
+
+}
+
+ std::string ProgressReport::ToString() const
+{
+	std::string info;
+	info += "id:" + id + "\n";
+	info += "task:" + task + "\n";
+	info += "subTask:" + subTask + "\n";
+	info += "status:" + status + "\n";
+	{
+		std::stringstream ss;
+		ss << "totalWork:" << totalWork << std::endl;
+		info += ss.str();
+	}
+	{
+		std::stringstream ss;
+		ss << "workDone:" << workDone << std::endl;
+		info += ss.str();
+	}
+
+	{
+		std::stringstream ss;
+		ss << "complete:" << complete << std::endl;
+		info += ss.str();
+	}
+
+	return info;
+}
+
+std::string EventNotification::ToString() const
+{
+	std::string info;
+	if (ClasspathUpdated == eventType)
+	{
+		info += "eventType:ClasspathUpdated\n";
+	}
+	else if (ProjectsImported == eventType)
+	{
+		info += "eventType:ProjectsImported\n";
+	}
+	else
+	{
+		std::ostringstream oss;
+		oss << std::hex << eventType << std::endl;
+
+		info += "eventType:";
+		info += oss.str();
+	}
+	info += "data:" + data.Data() + "\n";
+	return info;
+}
+
+std::string lsp::ToString(lsCompletionItemKind _kind)
+{
+	switch (_kind) {
+	case lsCompletionItemKind::Text:
+		return "Text";
+	case lsCompletionItemKind::Method:
+		return "Method";
+	case lsCompletionItemKind::Function:
+		return "";
+	case lsCompletionItemKind::Constructor:
+		return "Function";
+	case lsCompletionItemKind::Field:
+		return "Field";
+	case lsCompletionItemKind::Variable:
+		return "";
+	case lsCompletionItemKind::Class:
+		return "Variable";
+	case lsCompletionItemKind::Interface:
+		return "Interface";
+	case lsCompletionItemKind::Module:
+		return "Module";
+	case lsCompletionItemKind::Property:
+		return "Property";
+	case lsCompletionItemKind::Unit:
+		return "Unit";
+	case lsCompletionItemKind::Value:
+		return "Value";
+	case lsCompletionItemKind::Enum:
+		return "Enum";
+	case lsCompletionItemKind::Keyword:
+		return "Keyword";
+	case lsCompletionItemKind::Snippet:
+		return "Snippet";
+	case lsCompletionItemKind::Color:
+		return "Color";
+	case lsCompletionItemKind::File:
+		return "File";
+	case lsCompletionItemKind::Reference:
+		return "Reference";
+	case lsCompletionItemKind::Folder:
+		return "Folder";
+	case lsCompletionItemKind::EnumMember:
+		return "EnumMember";
+	case lsCompletionItemKind::Constant:
+		return "Constant";
+	case lsCompletionItemKind::Struct:
+		return "Struct";
+	case lsCompletionItemKind::Event:
+		return "Event";
+	case lsCompletionItemKind::Operator:
+		return "Operator";
+	case lsCompletionItemKind::TypeParameter:
+		return "TypeParameter";
+	default:
+		return "Unknown";
+	}
+}
+
+std::string lsp::ToString(lsInsertTextFormat _kind)
+{
+	if (_kind == lsInsertTextFormat::PlainText)
+	{
+		return "PlainText";
+	}
+	else if (_kind == lsInsertTextFormat::Snippet)
+	{
+		return "Snippet";
+	}else
+	{
+		return "Unknown";
+	}
+}
+
+const std::string& lsCompletionItem::InsertedContent() const
+{
+	if (textEdit)
+		return textEdit->newText;
+	if (insertText.has_value() && !insertText->empty())
+		return insertText.value();
+	return label;
+}
+
+std::string lsCompletionItem::DisplayText()
+{
+
+	 if (detail)
+	{
+
+		return label + " in " + detail.value();
+	}
+	return label;
+}
+
+std::string lsCompletionItem::ToString()
+ {
+	  std::stringstream info;
+	  info << "label : " << label << std::endl;
+	  if(kind)
+		info << "kind : " << lsp::ToString(kind.value()) << std::endl;
+	  else
+		 info << "kind : no exist."  << std::endl;
+
+	  if (detail)
+		  info << "detail : " << detail.value() << std::endl;
+	  else
+		  info << "detail : no exist." << std::endl;
+
+	  if (documentation)
+	  {
+		  info << "documentation : "  << std::endl;
+	  	  if(documentation.value().first)
+	  	  {
+			  info << documentation.value().first.value();
+	  	  }
+		  else if(documentation.value().second)
+		  {
+			  info << documentation.value().second.value().value;
+		  }
+	  }
+	  else
+		  info << "documentation : no exist." << std::endl;
+
+	  if (deprecated)
+		  info << "deprecated : " << deprecated.value() << std::endl;
+	  else
+		  info << "deprecated : no exist." << std::endl;
+
+	  if (preselect)
+		  info << "preselect : " << preselect.value() << std::endl;
+	  else
+		  info << "preselect : no exist." << std::endl;
+
+	  if (sortText)
+		  info << "sortText : " << sortText.value() << std::endl;
+	  else
+		  info << "sortText : no exist." << std::endl;
+
+	  if (filterText)
+		  info << "filterText : " << filterText.value() << std::endl;
+	  else
+		  info << "filterText : no exist." << std::endl;
+
+
+	  if (insertText)
+		  info << "insertText : " << insertText.value() << std::endl;
+	  else
+		  info << "insertText : no exist." << std::endl;
+
+
+	  if (insertTextFormat)
+		  info << "insertText : " << lsp::ToString(insertTextFormat.value()) << std::endl;
+	  else
+		  info << "insertTextFormat : no exist." << std::endl;
+
+	  if (textEdit)
+		  info << "textEdit : " << textEdit.value().ToString() << std::endl;
+	  else
+		  info << "textEdit : no exist." << std::endl;
+
+
+
+	  return  info.str();
+
+ }
+namespace  JDT
+{
+	namespace CodeActionKind {
+
+
+		/**
+		 * Base kind for quickfix actions: 'quickfix'
+		 */
+		  const char* QuickFix = "quickfix";
+
+		/**
+		 * Base kind for refactoring actions: 'refactor'
+		 */
+		const char* Refactor = "refactor";
+
+		/**
+		 * Base kind for refactoring extraction actions: 'refactor.extract'
+		 *
+		 * Example extract actions:
+		 *
+		 * - Extract method - Extract function - Extract variable - Extract interface
+		 * from class - ...
+		 */
+		const char* RefactorExtract = "refactor.extract";
+
+		/**
+		 * Base kind for refactoring inline actions: 'refactor.inline'
+		 *
+		 * Example inline actions:
+		 *
+		 * - Inline function - Inline variable - Inline constant - ...
+		 */
+		const char* RefactorInline = "refactor.inline";
+
+		/**
+		 * Base kind for refactoring rewrite actions: 'refactor.rewrite'
+		 *
+		 * Example rewrite actions:
+		 *
+		 * - Convert JavaScript function to class - Add or remove parameter -
+		 * Encapsulate field - Make method static - Move method to base class - ...
+		 */
+		const char* RefactorRewrite = "refactor.rewrite";
+
+		/**
+		 * Base kind for source actions: `source`
+		 *
+		 * Source code actions apply to the entire file.
+		 */
+		const char* Source = "source";
+
+		/**
+		 * Base kind for an organize imports source action: `source.organizeImports`
+		 */
+		const char* SourceOrganizeImports = "source.organizeImports";
+
+		const char* COMMAND_ID_APPLY_EDIT = "java.apply.workspaceEdit";
+
+	};
+
+
+}
+Directory::Directory(const AbsolutePath& path) : path(path.path) {
+	lsp::EnsureEndsInSlash(this->path);
+}
+
+bool Directory::operator==(const Directory& rhs) const {
+	return path == rhs.path;
+}
+
+bool Directory::operator!=(const Directory& rhs) const {
+	return path != rhs.path;
+}
+
+
+
+ Registration Registration::Create(const std::string& method)
+{
+	 Registration reg;
+	 reg.method = method;
+	 const boost::uuids::uuid a_uuid = boost::uuids::random_generator()();
+	 reg.id = to_string(a_uuid);
+	 return reg;
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_code_action.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_code_action.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_code_action.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,64 @@
+#pragma once
+
+
+#include "location_type.h"
+#include "lsDocumentUri.h"
+#include "lsTextEdit.h"
+#include "lsPosition.h"
+
+// codeAction
+struct CommandArgs {
+  lsDocumentUri textDocumentUri;
+  std::vector<lsTextEdit> edits;
+};
+MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY(CommandArgs, textDocumentUri, edits);
+inline void Reflect(Reader& visitor, CommandArgs& value) {
+	int i = 0;
+	visitor.IterArray([&](Reader& visitor) {
+		switch (i++) {
+		case 0:
+			Reflect(visitor, value.textDocumentUri);
+			break;
+		case 1:
+			Reflect(visitor, value.edits);
+			break;
+
+		}
+		});
+}
+
+// codeLens
+struct lsCodeLensUserData {};
+MAKE_REFLECT_EMPTY_STRUCT(lsCodeLensUserData);
+
+struct lsCodeLensCommandArguments {
+  lsDocumentUri uri;
+  lsPosition position;
+  std::vector<lsLocation> locations;
+};
+
+// FIXME Don't use array in vscode-cquery
+inline void Reflect(Writer& visitor, lsCodeLensCommandArguments& value) {
+  visitor.StartArray(3);
+  Reflect(visitor, value.uri);
+  Reflect(visitor, value.position);
+  Reflect(visitor, value.locations);
+  visitor.EndArray();
+}
+
+inline void Reflect(Reader& visitor, lsCodeLensCommandArguments& value) {
+  int i = 0;
+  visitor.IterArray([&](Reader& visitor) {
+    switch (i++) {
+      case 0:
+        Reflect(visitor, value.uri);
+        break;
+      case 1:
+        Reflect(visitor, value.position);
+        break;
+      case 2:
+        Reflect(visitor, value.locations);
+        break;
+    }
+  });
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_code_action.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_completion.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_completion.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_completion.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,224 @@
+#pragma once
+#include "lsTextEdit.h"
+#include "lsMarkedString.h"
+#include "lsCommand.h"
+
+
+// The kind of a completion entry.
+enum class lsCompletionItemKind {
+  Text = 1,
+  Method = 2,
+  Function = 3,
+  Constructor = 4,
+  Field = 5,
+  Variable = 6,
+  Class = 7,
+  Interface = 8,
+  Module = 9,
+  Property = 10,
+  Unit = 11,
+  Value = 12,
+  Enum = 13,
+  Keyword = 14,
+  Snippet = 15,
+  Color = 16,
+  File = 17,
+  Reference = 18,
+  Folder = 19,
+  EnumMember = 20,
+  Constant = 21,
+  Struct = 22,
+  Event = 23,
+  Operator = 24,
+  TypeParameter = 25,
+};
+MAKE_REFLECT_TYPE_PROXY(lsCompletionItemKind);
+
+
+
+// Defines whether the insert text in a completion item should be interpreted as
+// plain text or a snippet.
+enum class lsInsertTextFormat {
+  // The primary text to be inserted is treated as a plain string.
+  PlainText = 1,
+
+  // The primary text to be inserted is treated as a snippet.
+  //
+  // A snippet can define tab stops and placeholders with `$1`, `$2`
+  // and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+  // the end of the snippet. Placeholders with equal identifiers are linked,
+  // that is typing in one will update others too.
+  //
+  // See also:
+  // https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md
+  Snippet = 2
+};
+MAKE_REFLECT_TYPE_PROXY(lsInsertTextFormat);
+
+namespace lsp
+{
+	std::string ToString(lsCompletionItemKind);
+	std::string ToString(lsInsertTextFormat);
+}
+/**
+ * The Completion request is sent from the client to the server to compute completion items at a given cursor position.
+ * Completion items are presented in the IntelliSense user class. If computing complete completion items is expensive
+ * servers can additional provide a handler for the resolve completion item request. This request is send when a
+ * completion item is selected in the user class.
+ */
+struct lsCompletionItem {
+ 
+  // The label of this completion item. By default
+  // also the text that is inserted when selecting
+  // this completion.
+  std::string label;
+
+  // The kind of this completion item. Based of the kind
+  // an icon is chosen by the editor.
+  boost::optional<lsCompletionItemKind>  kind ;
+
+  // A human-readable string with additional information
+  // about this item, like type or symbol information.
+  boost::optional < std::string > detail;
+
+  // A human-readable string that represents a doc-comment.
+  boost::optional< std::pair<boost::optional< std::string> , boost::optional<MarkupContent> > > documentation;
+
+
+  /**
+   * Indicates if this item is deprecated.
+   */
+  boost::optional< bool >deprecated;
+	
+
+   /**
+   * Select this item when showing.
+   * 
+   * *Note* that only one completion item can be selected and that the
+   * tool / client decides which item that is. The rule is that the *first
+   * item of those that match best is selected.
+   */
+  boost::optional< bool > preselect;
+
+
+  // Internal information to order candidates.
+  int relevance = 0;
+
+  // A string that shoud be used when comparing this item
+  // with other items. When `falsy` the label is used.
+  boost::optional< std::string > sortText;
+
+  // A string that should be used when filtering a set of
+  // completion items. When `falsy` the label is used.
+  boost::optional<std::string> filterText;
+
+  // A string that should be inserted a document when selecting
+  // this completion. When `falsy` the label is used.
+  boost::optional<std::string> insertText;
+
+  // The format of the insert text. The format applies to both the `insertText`
+  // property and the `newText` property of a provided `textEdit`.
+  boost::optional< lsInsertTextFormat> insertTextFormat ;
+
+  // An edit which is applied to a document when selecting this completion. When
+  // an edit is provided the value of `insertText` is ignored.
+  //
+  // *Note:* The range of the edit must be a single line range and it must
+  // contain the position at which completion has been requested.
+  boost::optional<lsTextEdit> textEdit;
+
+  // An boost::optional array of additional text edits that are applied when
+  // selecting this completion. Edits must not overlap with the main edit
+  // nor with themselves.
+  // std::vector<TextEdit> additionalTextEdits;
+
+  // An boost::optional command that is executed *after* inserting this completion.
+  // *Note* that additional modifications to the current document should be
+  // described with the additionalTextEdits-property. Command command;
+
+  // An data entry field that is preserved on a completion item between
+  // a completion and a completion resolve request.
+  // data ? : any
+
+  // Use this helper to figure out what content the completion item will insert
+  // into the document, as it could live in either |textEdit|, |insertText|, or
+  // |label|.
+  const std::string& InsertedContent() const;
+
+  std::string DisplayText();
+  /**
+ * An boost::optional array of additional text edits that are applied when
+ * selecting this completion. Edits must not overlap (including the same insert position)
+ * with the main edit nor with themselves.
+ *
+ * Additional text edits should be used to change text unrelated to the current cursor position
+ * (for example adding an import statement at the top of the file if the completion item will
+ * insert an unqualified type).
+ */
+  boost::optional<std::vector<lsTextEdit> >additionalTextEdits;
+
+  /**
+* An boost::optional set of characters that when pressed while this completion is active will accept it first and
+* then type that character. *Note* that all commit characters should have `length=1` and that superfluous
+* characters will be ignored.
+*/
+  boost::optional< std::vector<std::string> > commitCharacters;
+
+  /**
+* An boost::optional command that is executed *after* inserting this completion. *Note* that
+* additional modifications to the current document should be described with the
+* additionalTextEdits-property.
+*/
+  boost::optional<lsCommandWithAny> command;
+
+  /**
+* An data entry field that is preserved on a completion item between a completion and a completion resolve request.
+*/
+  boost::optional<lsp::Any> data;
+  std::string ToString();
+  MAKE_SWAP_METHOD(lsCompletionItem,
+	  label,
+	  kind,
+	  detail,
+	  documentation,
+	  sortText,
+	  insertText,
+	  filterText,
+	  insertTextFormat,
+	  textEdit,
+	  deprecated, preselect, additionalTextEdits, commitCharacters,
+	  command, data);
+	
+};
+
+
+
+MAKE_REFLECT_STRUCT(lsCompletionItem,
+                    label,
+                    kind,
+                    detail,
+                    documentation,
+                    sortText,
+                    insertText,
+                    filterText,
+                    insertTextFormat,
+                    textEdit,
+                    deprecated, preselect, additionalTextEdits, commitCharacters,
+	command, data);
+
+
+
+struct CompletionList {
+	// This list it not complete. Further typing should result in recomputing
+	// this list.
+	bool isIncomplete = false;
+	// The completion items.
+	std::vector<lsCompletionItem> items;
+
+	void swap(CompletionList& arg) noexcept
+	{
+		items.swap(arg.items);
+		std::swap(isIncomplete, arg.isIncomplete);
+	}
+};
+MAKE_REFLECT_STRUCT(CompletionList, isIncomplete, items);
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_completion.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_diagnostic.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_diagnostic.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_diagnostic.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,74 @@
+#include "lsp_diagnostic.h"
+bool lsDiagnostic::operator==(const lsDiagnostic& rhs) const {
+  // Just check the important fields.
+  return range == rhs.range && message == rhs.message;
+}
+bool lsDiagnostic::operator!=(const lsDiagnostic& rhs) const {
+  return !(*this == rhs);
+}
+
+std::string lsResponseError::ToString()
+{
+	std::string info = "code:";
+	switch (code)
+	{
+	case lsErrorCodes::ParseError:
+		info += "ParseError\n";
+		break;
+	case lsErrorCodes::InvalidRequest:
+		info += "InvalidRequest\n";
+		break;
+	case lsErrorCodes::MethodNotFound:
+		info += "MethodNotFound\n";
+		break;
+	case lsErrorCodes::InvalidParams:
+		info += "InvalidParams\n";
+		break;
+	case lsErrorCodes::InternalError:
+		info += "InternalError\n";
+		break;
+	case lsErrorCodes::serverErrorStart:
+		info += "serverErrorStart\n";
+		break;
+	case lsErrorCodes::serverErrorEnd:
+		info += "serverErrorEnd\n";
+		break;
+	case lsErrorCodes::ServerNotInitialized:
+		info += "ServerNotInitialized\n";
+		break;
+	case lsErrorCodes::UnknownErrorCode:
+		info += "UnknownErrorCode\n";
+		break;
+		// Defined by the protocol.
+	case lsErrorCodes::RequestCancelled:
+		info += "RequestCancelled\n";
+		break;
+	default:
+		{
+			std::stringstream ss;
+			ss << "unknown code:" << (int32_t)code << std::endl;
+			info += ss.str();
+		}
+		break;
+	}
+	info += "message:" + message;
+	info += "\n";
+
+	if(data.has_value())
+	{
+
+		info += "data:" + data.value().Data();
+		info += "\n";
+	}
+	return info;
+}
+
+void lsResponseError::Write(Writer& visitor) {
+	auto& value = *this;
+	int code2 = static_cast<int>(this->code);
+
+	visitor.StartObject();
+	REFLECT_MEMBER2("code", code2);
+	REFLECT_MEMBER(message);
+	visitor.EndObject();
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_diagnostic.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_diagnostic.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_diagnostic.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_diagnostic.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,151 @@
+#pragma once
+#include "lsRange.h"
+#include "lsTextEdit.h"
+#include "lsDocumentUri.h"
+
+#include "lsResponseError.h"
+#include "location_type.h"
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+enum class lsDiagnosticSeverity {
+  // Reports an error.
+  Error = 1,
+  // Reports a warning.
+  Warning = 2,
+  // Reports an information.
+  Information = 3,
+  // Reports a hint.
+  Hint = 4
+};
+MAKE_REFLECT_TYPE_PROXY(lsDiagnosticSeverity);
+
+/**
+ * The diagnostic tags.
+ *
+ * @since 3.15.0
+ */
+enum class DiagnosticTag :uint8_t {
+
+	/**
+	 * Unused or unnecessary code.
+	 *
+	 * Clients are allowed to render diagnostics with this tag faded out instead of having
+	 * an error squiggle.
+	 */
+	Unnecessary=(1),
+
+	/**
+	 * Deprecated or obsolete code.
+	 *
+	 * Clients are allowed to rendered diagnostics with this tag strike through.
+	 */
+	 Deprecated=(2),
+};
+MAKE_REFLECT_TYPE_PROXY(DiagnosticTag);
+
+
+
+/**
+ * Represents a related message and source code location for a diagnostic. This should be
+ * used to point to code locations that cause or related to a diagnostics, e.g when duplicating
+ * a symbol in a scope.
+ *
+ * Since 3.7.0
+ */
+
+struct DiagnosticRelatedInformation {
+	/**
+	 * The location of this related diagnostic information.
+	 */
+
+    lsLocation location;
+
+	/**
+	 * The message of this related diagnostic information.
+	 */
+
+	 std::string message;
+
+	 MAKE_SWAP_METHOD(DiagnosticRelatedInformation, location, message)
+};
+MAKE_REFLECT_STRUCT(DiagnosticRelatedInformation, location, message)
+/**
+ * Structure to capture a description for an error code.
+ *
+ * @since 3.16.0
+ */
+struct DiagnosticCodeDescription {
+	/**
+	 * An URI to open with more information about the diagnostic error.
+	 */
+	std::string href;
+	MAKE_SWAP_METHOD(DiagnosticCodeDescription, href)
+};
+MAKE_REFLECT_STRUCT(DiagnosticCodeDescription, href)
+
+//Represents a diagnostic, such as a compiler error or warning.Diagnostic objects are only valid in the scope of a resource.
+struct lsDiagnostic {
+  // The range at which the message applies.
+  lsRange range;
+
+  // The diagnostic's severity. Can be omitted. If omitted it is up to the
+  // client to interpret diagnostics as error, warning, info or hint.
+  boost::optional<lsDiagnosticSeverity> severity;
+
+  // The diagnostic's code. Can be omitted.
+  boost::optional<  std::pair<boost::optional<std::string>, boost::optional<int>> >  code;
+
+  boost::optional<DiagnosticCodeDescription> codeDescription;
+  // A human-readable string describing the source of this
+  // diagnostic, e.g. 'typescript' or 'super lint'.
+  boost::optional < std::string >source ;
+
+  // The diagnostic's message.
+  std::string message;
+
+  // Non-serialized set of fixits.
+  std::vector<lsTextEdit> fixits_;
+
+  /**
+   * Additional metadata about the diagnostic.
+   *
+   * @since 3.15.0
+   */
+  boost::optional<std::vector<DiagnosticTag>> tags;
+	
+
+  /**
+ * An array of related diagnostic information, e.g. when symbol-names within a scope collide
+ * all definitions can be marked via this property.
+ *
+ * Since 3.7.0
+ */
+  boost::optional<std::vector<DiagnosticRelatedInformation>> relatedInformation;
+
+  /**
+   * A data entry field that is preserved between a
+   * `textDocument/publishDiagnostics` notification and
+   * `textDocument/codeAction` request.
+   *
+   * @since 3.16.0
+   */
+  boost::optional<lsp::Any> data;
+  bool operator==(const lsDiagnostic& rhs) const;
+  bool operator!=(const lsDiagnostic& rhs) const;
+
+  MAKE_SWAP_METHOD(lsDiagnostic, range, severity,  code, codeDescription, source, message, tags, data)
+};
+MAKE_REFLECT_STRUCT(lsDiagnostic, range, severity, code, codeDescription, source, message, tags, data)
+
+
+
+struct Rsp_Error : ResponseError<lsResponseError, Rsp_Error> {
+	
+	MAKE_SWAP_METHOD(Rsp_Error, jsonrpc, id, error)
+};
+MAKE_REFLECT_STRUCT(Rsp_Error, jsonrpc, id, error)
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/lsp_diagnostic.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/method_type.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/method_type.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/method_type.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,7 @@
+#pragma once
+#include <string>
+
+using MethodType = const  char* const;
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/method_type.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/out_list.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/out_list.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/out_list.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,22 @@
+#pragma once
+
+
+#include "location_type.h"
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+
+
+//DEFINE_RESPONCE_TYPE(Rsp_FindLinkLocationList, std::vector<LinkLocation>);
+//DEFINE_RESPONCE_TYPE(Rsp_LocationList, std::vector<lsLocation>);
+
+
+namespace LocationListEither{
+
+	typedef  std::pair< boost::optional<std::vector<lsLocation>> , boost::optional<std::vector<LocationLink> > > Either;
+	
+};
+extern  void Reflect(Reader& visitor, LocationListEither::Either& value);
+//DEFINE_RESPONCE_TYPE(Rsp_LocationListEither, LocationListEither::Either);


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/out_list.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/symbol.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/symbol.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/symbol.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,164 @@
+#pragma once
+#include "LibLsp/lsp/location_type.h"
+
+
+enum class lsSymbolKind : uint8_t {
+	Unknown = 0,
+
+	File = 1,
+	Module = 2,
+	Namespace = 3,
+	Package = 4,
+	Class = 5,
+	Method = 6,
+	Property = 7,
+	Field = 8,
+	Constructor = 9,
+	Enum = 10,
+	Interface = 11,
+	Function = 12,
+	Variable = 13,
+	Constant = 14,
+	String = 15,
+	Number = 16,
+	Boolean = 17,
+	Array = 18,
+	Object = 19,
+	Key = 20,
+	Null = 21,
+	EnumMember = 22,
+	Struct = 23,
+	Event = 24,
+	Operator = 25,
+
+	// For C++, this is interpreted as "template parameter" (including
+	// non-type template parameters).
+	TypeParameter = 26,
+
+	// cquery extensions
+	// See also https://github.com/Microsoft/language-server-protocol/issues/344
+	// for new SymbolKind clang/Index/IndexSymbol.h clang::index::SymbolKind
+	TypeAlias = 252,
+	Parameter = 253,
+	StaticMethod = 254,
+	Macro = 255,
+};
+MAKE_REFLECT_TYPE_PROXY(lsSymbolKind);
+
+typedef  lsSymbolKind SymbolKind;
+
+// A document highlight kind.
+enum class lsDocumentHighlightKind {
+  // A textual occurrence.
+  Text = 1,
+  // Read-access of a symbol, like reading a variable.
+  Read = 2,
+  // Write-access of a symbol, like writing to a variable.
+  Write = 3
+};
+MAKE_REFLECT_TYPE_PROXY(lsDocumentHighlightKind);
+
+// A document highlight is a range inside a text document which deserves
+// special attention. Usually a document highlight is visualized by changing
+// the background color of its range.
+struct lsDocumentHighlight {
+  // The range this highlight applies to.
+  lsRange range;
+
+  // The highlight kind, default is DocumentHighlightKind.Text.
+  boost::optional<lsDocumentHighlightKind>  kind ;
+
+  MAKE_SWAP_METHOD(lsDocumentHighlight, range, kind)
+};
+MAKE_REFLECT_STRUCT(lsDocumentHighlight, range, kind);
+
+struct lsSymbolInformation {
+
+/**
+ * The name of this symbol.
+ */
+  std::string name;
+  /**
+   * The kind of this symbol.
+   */
+  lsSymbolKind kind;
+  /**
+* Indicates if this symbol is deprecated.
+*/
+  boost::optional<bool> deprecated;
+  /**
+   * The location of this symbol. The location's range is used by a tool
+   * to reveal the location in the editor. If the symbol is selected in the
+   * tool the range's start information is used to position the cursor. So
+   * the range usually spans more then the actual symbol's name and does
+   * normally include things like visibility modifiers.
+   *
+   * The range doesn't have to denote a node range in the sense of a abstract
+   * syntax tree. It can therefore not be used to re-construct a hierarchy of
+   * the symbols.
+   */
+  lsLocation location;
+  /**
+ * The name of the symbol containing this symbol. This information is for
+ * user interface purposes (e.g. to render a qualifier in the user interface
+ * if necessary). It can't be used to re-infer a hierarchy for the document
+ * symbols.
+ */
+  boost::optional<std::string>  containerName;
+
+
+  MAKE_SWAP_METHOD(lsSymbolInformation, name, kind, deprecated, location, containerName);
+};
+MAKE_REFLECT_STRUCT(lsSymbolInformation, name, kind, deprecated, location, containerName);
+
+
+struct lsDocumentSymbol {
+	/**
+	 * The name of this symbol.
+	 */
+
+	std::string name;
+
+	/**
+	 * The kind of this symbol.
+	 */
+	
+	lsSymbolKind kind = lsSymbolKind::Unknown;
+
+	/**
+	 * The range enclosing this symbol not including leading/trailing whitespace but everything else
+	 * like comments. This information is typically used to determine if the clients cursor is
+	 * inside the symbol to reveal in the symbol in the UI.
+	 */
+	
+	lsRange range;
+
+	/**
+	 * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
+	 * Must be contained by the `range`.
+	 */
+	
+	lsRange selectionRange;
+
+	/**
+	 * More detail for this symbol, e.g the signature of a function. If not provided the
+	 * name is used.
+	 */
+	boost::optional< std::string >  detail;
+
+	/**
+	 * Indicates if this symbol is deprecated.
+	 */
+	boost::optional< bool > deprecated;
+
+	/**
+	 * Children of this symbol, e.g. properties of a class.
+	 */
+	boost::optional < std::vector<lsDocumentSymbol> > children;
+
+	//internal use
+	int flags=0;
+
+	MAKE_SWAP_METHOD(lsDocumentSymbol, name, kind, range, selectionRange, detail, deprecated, children, flags);
+};
+MAKE_REFLECT_STRUCT(lsDocumentSymbol, name, kind, range, selectionRange, detail, deprecated, children, flags);
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/symbol.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/SemanticTokens.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/SemanticTokens.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/SemanticTokens.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,267 @@
+#pragma once
+
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+#include "LibLsp/lsp/lsVersionedTextDocumentIdentifier.h"
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+enum class HighlightingKind_clangD {
+	Variable = 0,
+	LocalVariable,
+	Parameter,
+	Function,
+	Method,
+	StaticMethod,
+	Field,
+	StaticField,
+	Class,
+	Interface,
+	Enum,
+	EnumConstant,
+	Typedef,
+	Type,
+	Unknown,
+	Namespace,
+	TemplateParameter,
+	Concept,
+	Primitive,
+	Macro,
+
+	// This one is different from the other kinds as it's a line style
+	// rather than a token style.
+	InactiveCode,
+
+	LastKind = InactiveCode
+};
+std::string toSemanticTokenType(HighlightingKind_clangD kind);
+
+enum class HighlightingModifier_clangD {
+	Declaration,
+	Deprecated,
+	Deduced,
+	Readonly,
+	Static,
+	Abstract,
+	DependentName,
+	DefaultLibrary,
+
+	FunctionScope,
+	ClassScope,
+	FileScope,
+	GlobalScope,
+
+	LastModifier = GlobalScope
+};
+std::string toSemanticTokenModifier(HighlightingModifier_clangD modifier);
+
+enum  SemanticTokenType {
+	ls_namespace=0,// 'namespace',
+	/**
+	 * Represents a generic type. Acts as a fallback for types which
+	 * can't be mapped to a specific type like class or enum.
+	 */
+	 ls_type,// 'type',
+	 ls_class,// 'class',
+	 ls_enum,// 'enum',
+	 ls_interface,// 'interface',
+	 ls_struct,// 'struct',
+	 ls_typeParameter,// 'typeParameter',
+	 ls_parameter,// 'parameter',
+	 ls_variable,// 'variable',
+	 ls_property,// 'property',
+	 ls_enumMember,// 'enumMember',
+	 ls_event,// 'event',
+	 ls_function,// 'function',
+	 ls_method,// 'method',
+	 ls_macro,// 'macro',
+	 ls_keyword,// 'keyword',
+	 ls_modifier,// 'modifier',
+	 ls_comment,// 'comment',
+	 ls_string,// 'string',
+	 ls_number,// 'number',
+	 ls_regexp,// 'regexp',
+	 ls_operator,// 'operator'
+	 lastKind = ls_operator
+};
+std::string to_string(SemanticTokenType);
+unsigned toSemanticTokenType(std::vector<SemanticTokenType>& modifiers);
+
+enum TokenType_JDT {
+	PACKAGE_JDT=0,
+	CLASS_JDT,
+	INTERFACE_JDT,
+	ENUM_JDT,
+	ENUM_MEMBER_JDT,
+	TYPE_JDT,
+	TYPE_PARAMETER_JDT,
+	ANNOTATION_JDT,
+	ANNOTATION_MEMBER_JDT,
+	METHOD_JDT,
+	PROPERTY_JDT,
+	VARIABLE_JDT,
+	PARAMETER_JDT
+};
+std::string to_string(TokenType_JDT);
+
+enum SemanticTokenModifier {
+	ls_declaration=0,// 'declaration',
+	ls_definition,// 'definition',
+	ls_readonly,// 'readonly',
+	ls_static,// 'static',
+	ls_deprecated,// 'deprecated',
+	ls_abstract,// 'abstract',
+	ls_async,// 'async',
+	ls_modification,// 'modification',
+	ls_documentation,// 'documentation',
+	ls_defaultLibrary,// 'defaultLibrary'
+	LastModifier = ls_defaultLibrary
+};
+std::string to_string(SemanticTokenModifier);
+unsigned  toSemanticTokenModifiers(std::vector<SemanticTokenModifier>&);
+/// Specifies a single semantic token in the document.
+/// This struct is not part of LSP, which just encodes lists of tokens as
+/// arrays of numbers directly.
+struct SemanticToken {
+	/// token line number, relative to the previous token
+	unsigned deltaLine = 0;
+	/// token start character, relative to the previous token
+	/// (relative to 0 or the previous token's start if they are on the same line)
+	unsigned deltaStart = 0;
+	/// the length of the token. A token cannot be multiline
+	unsigned length = 0;
+	/// will be looked up in `SemanticTokensLegend.tokenTypes`
+	unsigned tokenType = 0;
+	/// each set bit will be looked up in `SemanticTokensLegend.tokenModifiers`
+	unsigned tokenModifiers = 0;
+};
+bool operator==(const SemanticToken&, const SemanticToken&);
+struct  SemanticTokens{
+
+	/**
+	* Tokens in a file are represented as an array of integers. The position of each token is expressed relative to
+	* the token before it, because most tokens remain stable relative to each other when edits are made in a file.
+	*
+	* ---
+	* In short, each token takes 5 integers to represent, so a specific token `i` in the file consists of the following array indices:
+	*  - at index `5*i`   - `deltaLine`: token line number, relative to the previous token
+	*  - at index `5*i+1` - `deltaStart`: token start character, relative to the previous token (relative to 0 or the previous token's start if they are on the same line)
+	*  - at index `5*i+2` - `length`: the length of the token. A token cannot be multiline.
+	*  - at index `5*i+3` - `tokenType`: will be looked up in `SemanticTokensLegend.tokenTypes`. We currently ask that `tokenType` < 65536.
+	*  - at index `5*i+4` - `tokenModifiers`: each set bit will be looked up in `SemanticTokensLegend.tokenModifiers`
+	*
+	* ---
+	* ### How to encode tokens
+	*
+	* Here is an example for encoding a file with 3 tokens in a uint32 array:
+	* ```
+	*    { line: 2, startChar:  5, length: 3, tokenType: "property",  tokenModifiers: ["private", "static"] },
+	*    { line: 2, startChar: 10, length: 4, tokenType: "type",      tokenModifiers: [] },
+	*    { line: 5, startChar:  2, length: 7, tokenType: "class",     tokenModifiers: [] }
+	* ```
+	*
+	* 1. First of all, a legend must be devised. This legend must be provided up-front and capture all possible token types.
+	* For this example, we will choose the following legend which must be passed in when registering the provider:
+	* ```
+	*    tokenTypes: ['property', 'type', 'class'],
+	*    tokenModifiers: ['private', 'static']
+	* ```
+	*
+	* 2. The first transformation step is to encode `tokenType` and `tokenModifiers` as integers using the legend. Token types are looked
+	* up by index, so a `tokenType` value of `1` means `tokenTypes[1]`. Multiple token modifiers can be set by using bit flags,
+	* so a `tokenModifier` value of `3` is first viewed as binary `0b00000011`, which means `[tokenModifiers[0], tokenModifiers[1]]` because
+	* bits 0 and 1 are set. Using this legend, the tokens now are:
+	* ```
+	*    { line: 2, startChar:  5, length: 3, tokenType: 0, tokenModifiers: 3 },
+	*    { line: 2, startChar: 10, length: 4, tokenType: 1, tokenModifiers: 0 },
+	*    { line: 5, startChar:  2, length: 7, tokenType: 2, tokenModifiers: 0 }
+	* ```
+	*
+	* 3. The next step is to represent each token relative to the previous token in the file. In this case, the second token
+	* is on the same line as the first token, so the `startChar` of the second token is made relative to the `startChar`
+	* of the first token, so it will be `10 - 5`. The third token is on a different line than the second token, so the
+	* `startChar` of the third token will not be altered:
+	* ```
+	*    { deltaLine: 2, deltaStartChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 },
+	*    { deltaLine: 0, deltaStartChar: 5, length: 4, tokenType: 1, tokenModifiers: 0 },
+	*    { deltaLine: 3, deltaStartChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 }
+	* ```
+	*
+	* 4. Finally, the last step is to inline each of the 5 fields for a token in a single array, which is a memory friendly representation:
+	* ```
+	*    // 1st token,  2nd token,  3rd token
+	*    [  2,5,3,0,3,  0,5,4,1,0,  3,2,7,2,0 ]
+	* ```
+	*/
+	std::vector<int32_t> data;
+	static std::vector<int32_t> encodeTokens(std::vector<SemanticToken>& tokens);
+
+	/**
+	 * An optional result id. If provided and clients support delta updating
+	 * the client will include the result id in the next semantic token request.
+	 * A server can then instead of computing all semantic tokens again simply
+	 * send a delta.
+	 */
+   boost::optional<std::string> resultId;
+   MAKE_SWAP_METHOD(SemanticTokens, data, resultId)
+};
+MAKE_REFLECT_STRUCT(SemanticTokens, data, resultId)
+
+/// Body of textDocument/semanticTokens/full request.
+struct SemanticTokensParams {
+	/// The text document.
+	lsTextDocumentIdentifier textDocument;
+	MAKE_REFLECT_STRUCT(SemanticTokensParams, textDocument)
+};
+MAKE_REFLECT_STRUCT(SemanticTokensParams, textDocument)
+
+
+/// Body of textDocument/semanticTokens/full/delta request.
+/// Requests the changes in semantic tokens since a previous response.
+struct SemanticTokensDeltaParams {
+	/// The text document.
+	lsTextDocumentIdentifier textDocument;
+	/**
+	 * The result id of a previous response. The result Id can either point to
+	 * a full response or a delta response depending on what was received last.
+	 */
+	std::string previousResultId;
+
+	MAKE_REFLECT_STRUCT(SemanticTokensDeltaParams, textDocument, previousResultId)
+};
+MAKE_REFLECT_STRUCT(SemanticTokensDeltaParams, textDocument, previousResultId)
+
+/// Describes a a replacement of a contiguous range of semanticTokens.
+struct SemanticTokensEdit {
+	// LSP specifies `start` and `deleteCount` which are relative to the array
+	// encoding of the previous tokens.
+	// We use token counts instead, and translate when serializing this struct.
+	unsigned startToken = 0;
+	unsigned deleteTokens = 0;
+	std::vector<int32_t> tokens; // encoded as a flat integer array
+
+	MAKE_REFLECT_STRUCT(SemanticTokensEdit, startToken, deleteTokens, tokens)
+};
+MAKE_REFLECT_STRUCT(SemanticTokensEdit, startToken, deleteTokens, tokens)
+
+
+/// This models LSP SemanticTokensDelta | SemanticTokens, which is the result of
+/// textDocument/semanticTokens/full/delta.
+struct SemanticTokensOrDelta {
+	boost::optional<std::string >  resultId;
+	/// Set if we computed edits relative to a previous set of tokens.
+	boost::optional< std::vector<SemanticTokensEdit> > edits;
+	/// Set if we computed a fresh set of tokens.
+	/// Set if we computed edits relative to a previous set of tokens.
+	boost::optional<std::vector<int32_t>> tokens; // encoded as integer array
+	MAKE_REFLECT_STRUCT(SemanticTokensOrDelta, resultId, edits, tokens)
+};
+MAKE_REFLECT_STRUCT(SemanticTokensOrDelta, resultId, edits, tokens)
+
+       
+struct SemanticTokensLegend {
+	std::vector<std::string> tokenTypes;
+	std::vector<std::string> tokenModifiers;
+	MAKE_REFLECT_STRUCT(SemanticTokensLegend, tokenTypes, tokenModifiers)
+};
+MAKE_REFLECT_STRUCT(SemanticTokensLegend, tokenTypes, tokenModifiers)
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_semanticTokens_full, SemanticTokensParams,boost::optional<SemanticTokens >,"textDocument/semanticTokens/full")
+DEFINE_REQUEST_RESPONSE_TYPE(td_semanticTokens_full_delta, SemanticTokensDeltaParams, boost::optional<SemanticTokensOrDelta >, "textDocument/semanticTokens/full/delta")
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/SemanticTokens.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/callHierarchy.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/callHierarchy.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/callHierarchy.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,121 @@
+#pragma once
+
+#include "LibLsp/lsp/lsAny.h"
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/lsp/symbol.h"
+#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
+#include "LibLsp/lsp/lsRange.h"
+
+enum class SymbolTag { Deprecated = 1 };
+MAKE_REFLECT_TYPE_PROXY(SymbolTag)
+
+struct CallHierarchyPrepareParams
+{
+	lsTextDocumentIdentifier textDocument;
+	lsPosition position;
+
+	MAKE_SWAP_METHOD(CallHierarchyPrepareParams,
+		textDocument,
+		position)
+};
+MAKE_REFLECT_STRUCT(CallHierarchyPrepareParams,
+	textDocument,
+	position)
+
+
+
+	/// Represents programming constructs like functions or constructors
+	/// in the context of call hierarchy.
+struct CallHierarchyItem {
+	/// The name of this item.
+	std::string name;
+
+	/// The kind of this item.
+	SymbolKind kind;
+
+	/// Tags for this item.
+	boost::optional<std::vector<SymbolTag>>  tags;
+
+	/// More detaill for this item, e.g. the signature of a function.
+	boost::optional<std::string>  detail;
+
+	/// The resource identifier of this item.
+	lsDocumentUri uri;
+
+	/**
+	 * The range enclosing this symbol not including leading/trailing whitespace
+	 * but everything else, e.g. comments and code.
+	 */
+	lsRange range;
+
+	/**
+	 * The range that should be selected and revealed when this symbol is being
+	 * picked, e.g. the name of a function. Must be contained by the
+	 * [`range`](#CallHierarchyItem.range).
+	 */
+	lsRange selectionRange;
+
+	/**
+	 * A data entry field that is preserved between a call hierarchy prepare and
+	 * incoming calls or outgoing calls requests.
+	 */
+	boost::optional<lsp::Any>  data;
+	MAKE_SWAP_METHOD(CallHierarchyItem, name, kind, tags, detail, uri, range, selectionRange, data)
+};
+MAKE_REFLECT_STRUCT(CallHierarchyItem, name, kind, tags, detail, uri, range, selectionRange, data)
+
+
+
+/// The parameter of a `callHierarchy/incomingCalls` request.
+struct CallHierarchyIncomingCallsParams {
+	CallHierarchyItem item;
+	MAKE_SWAP_METHOD(CallHierarchyIncomingCallsParams,item)
+};
+MAKE_REFLECT_STRUCT(CallHierarchyIncomingCallsParams, item)
+
+
+/// Represents an incoming call, e.g. a caller of a method or constructor.
+struct CallHierarchyIncomingCall {
+	/// The item that makes the call.
+	CallHierarchyItem from;
+
+	/// The range at which the calls appear.
+	/// This is relative to the caller denoted by `From`.
+	std::vector<lsRange> fromRanges;
+	MAKE_SWAP_METHOD(CallHierarchyIncomingCall, from, fromRanges)
+};
+MAKE_REFLECT_STRUCT(CallHierarchyIncomingCall, from, fromRanges)
+
+
+
+
+/// The parameter of a `callHierarchy/outgoingCalls` request.
+struct CallHierarchyOutgoingCallsParams {
+	CallHierarchyItem item;
+	MAKE_SWAP_METHOD(CallHierarchyOutgoingCallsParams, item)
+};
+MAKE_REFLECT_STRUCT(CallHierarchyOutgoingCallsParams, item)
+
+/// Represents an outgoing call, e.g. calling a getter from a method or
+/// a method from a constructor etc.
+struct CallHierarchyOutgoingCall {
+	/// The item that is called.
+	CallHierarchyItem to;
+
+	/// The range at which this item is called.
+	/// This is the range relative to the caller, and not `To`.
+	std::vector<lsRange> fromRanges;
+	MAKE_SWAP_METHOD(CallHierarchyOutgoingCall, to, fromRanges)
+};
+MAKE_REFLECT_STRUCT(CallHierarchyOutgoingCall, to, fromRanges)
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_prepareCallHierarchy, CallHierarchyPrepareParams,
+	boost::optional<std::vector<CallHierarchyItem>>, "textDocument/prepareCallHierarchy")
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_incomingCalls, CallHierarchyIncomingCallsParams,
+	boost::optional<std::vector<CallHierarchyIncomingCall>>, "callHierarchy/incomingCalls")
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_outgoingCalls, CallHierarchyOutgoingCallsParams,
+	boost::optional<std::vector<CallHierarchyOutgoingCall>>, "callHierarchy/CallHierarchyOutgoingCall")
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/callHierarchy.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/code_action.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/code_action.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/code_action.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,37 @@
+#pragma once
+#include "LibLsp/lsp/method_type.h"
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+#include "LibLsp/lsp/CodeActionParams.h"
+
+namespace  QuickAssistProcessor {
+
+	extern const char* SPLIT_JOIN_VARIABLE_DECLARATION_ID;//$NON-NLS-1$
+	extern const char* CONVERT_FOR_LOOP_ID;// ;// "org.eclipse.jdt.ls.correction.convertForLoop.assist"; //$NON-NLS-1$
+	extern const char* ASSIGN_TO_LOCAL_ID ;// "org.eclipse.jdt.ls.correction.assignToLocal.assist"; //$NON-NLS-1$
+	extern const char* ASSIGN_TO_FIELD_ID ;// "org.eclipse.jdt.ls.correction.assignToField.assist"; //$NON-NLS-1$
+	extern const char* ASSIGN_PARAM_TO_FIELD_ID ;// "org.eclipse.jdt.ls.correction.assignParamToField.assist"; //$NON-NLS-1$
+	extern const char* ASSIGN_ALL_PARAMS_TO_NEW_FIELDS_ID ;// "org.eclipse.jdt.ls.correction.assignAllParamsToNewFields.assist"; //$NON-NLS-1$
+	extern const char* ADD_BLOCK_ID ;// "org.eclipse.jdt.ls.correction.addBlock.assist"; //$NON-NLS-1$
+	extern const char* EXTRACT_LOCAL_ID ;// "org.eclipse.jdt.ls.correction.extractLocal.assist"; //$NON-NLS-1$
+	extern const char* EXTRACT_LOCAL_NOT_REPLACE_ID ;// "org.eclipse.jdt.ls.correction.extractLocalNotReplaceOccurrences.assist"; //$NON-NLS-1$
+	extern const char* EXTRACT_CONSTANT_ID ;// "org.eclipse.jdt.ls.correction.extractConstant.assist"; //$NON-NLS-1$
+	extern const char* INLINE_LOCAL_ID ;// "org.eclipse.jdt.ls.correction.inlineLocal.assist"; //$NON-NLS-1$
+	extern const char* CONVERT_LOCAL_TO_FIELD_ID ;// "org.eclipse.jdt.ls.correction.convertLocalToField.assist"; //$NON-NLS-1$
+	extern const char* CONVERT_ANONYMOUS_TO_LOCAL_ID ;// "org.eclipse.jdt.ls.correction.convertAnonymousToLocal.assist"; //$NON-NLS-1$
+	extern const char* CONVERT_TO_STRING_BUFFER_ID ;// "org.eclipse.jdt.ls.correction.convertToStringBuffer.assist"; //$NON-NLS-1$
+	extern const char* CONVERT_TO_MESSAGE_FORMAT_ID ;// "org.eclipse.jdt.ls.correction.convertToMessageFormat.assist"; //$NON-NLS-1$;
+	extern const char* EXTRACT_METHOD_INPLACE_ID ;// "org.eclipse.jdt.ls.correction.extractMethodInplace.assist"; //$NON-NLS-1$;
+
+	extern const char* CONVERT_ANONYMOUS_CLASS_TO_NESTED_COMMAND ;// "convertAnonymousClassToNestedCommand";
+};
+/**
+ * The code action request is sent from the client to the server to compute
+ * commands for a given text document and range. These commands are
+ * typically code fixes to either fix problems or to beautify/refactor code.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_codeAction, lsCodeActionParams, std::vector<lsCommandWithAny>, "textDocument/codeAction");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/code_action.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/code_lens.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/code_lens.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/code_lens.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,42 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+struct lsDocumentCodeLensParams {
+	
+/**
+ * The document to request code lens for.
+ */
+  lsTextDocumentIdentifier textDocument;
+
+  MAKE_SWAP_METHOD(lsDocumentCodeLensParams, textDocument);
+};
+MAKE_REFLECT_STRUCT(lsDocumentCodeLensParams, textDocument);
+
+
+
+
+struct lsCodeLens {
+	// The range in which this code lens is valid. Should only span a single line.
+	lsRange range;
+	// The command this code lens represents.
+	boost::optional<lsCommandWithAny> command;
+	// A data entry field that is preserved on a code lens item between
+	// a code lens and a code lens resolve request.
+	boost::optional< lsp::Any> data;
+
+	MAKE_SWAP_METHOD(lsCodeLens, range, command, data)
+};
+MAKE_REFLECT_STRUCT(lsCodeLens, range, command, data)
+
+
+
+/**
+ * The code lens request is sent from the client to the server to compute
+ * code lenses for a given text document.
+ *
+ * Registration Options: CodeLensRegistrationOptions
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_codeLens, lsDocumentCodeLensParams, std::vector<lsCodeLens>, "textDocument/codeLens")
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/code_lens.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/colorPresentation.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/colorPresentation.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/colorPresentation.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,63 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+#include "LibLsp/lsp/lsRange.h"
+#include "documentColor.h"
+#include "LibLsp/lsp/lsTextEdit.h"
+
+
+struct ColorPresentationParams {
+
+	/**
+   * The text document.
+   */
+	lsTextDocumentIdentifier textDocument;
+
+	/**
+	 * The range in the document where this color appers.
+	 */
+
+	lsRange range;
+
+	/**
+	 * The actual color value for this color range.
+	 */
+
+	TextDocument::Color color;
+	MAKE_SWAP_METHOD(ColorPresentationParams, textDocument, range, color)
+};
+MAKE_REFLECT_STRUCT(ColorPresentationParams, textDocument, range, color)
+
+
+struct ColorPresentation {
+	/**
+	 * The label of this color presentation. It will be shown on the color
+	 * picker header. By default this is also the text that is inserted when selecting
+	 * this color presentation.
+	 */
+
+	 std::string label;
+
+	/**
+	 * An edit which is applied to a document when selecting
+	 * this presentation for the color.  When `null` the label is used.
+	 */
+	 lsTextEdit textEdit;
+
+	/**
+	 * An optional array of additional text edits that are applied when
+	 * selecting this color presentation. Edits must not overlap with the main edit nor with themselves.
+	 */
+	std::vector<lsTextEdit> additionalTextEdits;
+	MAKE_SWAP_METHOD(ColorPresentation, label, textEdit, additionalTextEdits)
+};
+MAKE_REFLECT_STRUCT(ColorPresentation, label, textEdit, additionalTextEdits)
+
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_colorPresentation,
+	ColorPresentationParams, std::vector<ColorPresentation>, "textDocument/colorPresentation")
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/colorPresentation.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/completion.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/completion.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/completion.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,82 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include <regex>
+#include "LibLsp/lsp/lsp_completion.h"
+#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
+
+
+// How a completion was triggered
+enum class lsCompletionTriggerKind {
+  // Completion was triggered by typing an identifier (24x7 code
+  // complete), manual invocation (e.g Ctrl+Space) or via API.
+  Invoked = 1,
+
+  // Completion was triggered by a trigger character specified by
+  // the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
+  TriggerCharacter = 2
+};
+MAKE_REFLECT_TYPE_PROXY(lsCompletionTriggerKind);
+
+
+// Contains additional information about the context in which a completion
+// request is triggered.
+struct lsCompletionContext {
+  // How the completion was triggered.
+  lsCompletionTriggerKind triggerKind = lsCompletionTriggerKind::Invoked;
+
+  // The trigger character (a single character) that has trigger code complete.
+  // Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
+  boost::optional<std::string> triggerCharacter;
+
+  MAKE_SWAP_METHOD(lsCompletionContext, triggerKind, triggerCharacter);
+};
+MAKE_REFLECT_STRUCT(lsCompletionContext, triggerKind, triggerCharacter);
+
+struct lsCompletionParams : lsTextDocumentPositionParams {
+  // The completion context. This is only available it the client specifies to
+  // send this using
+  // `ClientCapabilities.textDocument.completion.contextSupport === true`
+  boost::optional<lsCompletionContext> context;
+	
+  MAKE_SWAP_METHOD(lsCompletionParams, textDocument, position, context);
+	
+};
+MAKE_REFLECT_STRUCT(lsCompletionParams, textDocument, position, context);
+
+
+
+
+
+
+
+
+
+namespace TextDocumentComplete{
+	
+	typedef  std::pair< boost::optional<std::vector<lsCompletionItem>>, boost::optional<CompletionList> > Either;
+	
+};
+extern  void Reflect(Reader& visitor, TextDocumentComplete::Either& value);
+
+/**
+ * The Completion request is sent from the client to the server to compute
+ * completion items at a given cursor position. Completion items are
+ * presented in the IntelliSense user interface. If computing complete
+ * completion items is expensive servers can additional provide a handler
+ * for the resolve completion item request. This request is sent when a
+ * completion item is selected in the user interface.
+ *
+ * Registration Options: CompletionRegistrationOptions
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_completion, lsCompletionParams, CompletionList , "textDocument/completion")
+
+
+
+
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/completion.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/declaration_definition.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/declaration_definition.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/declaration_definition.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,29 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
+#include "LibLsp/lsp/out_list.h"
+
+
+/**
+ * The go to declaration request is sent from the client to the server to resolve
+ * the declaration location of a symbol at a given text document position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ *
+ * Since version 3.14.0
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_declaration, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/declaration");
+
+/**
+ * The goto definition request is sent from the client to the server to resolve
+ * the definition location of a symbol at a given text document position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_definition, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/definition");
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/declaration_definition.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/didRenameFiles.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/didRenameFiles.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/didRenameFiles.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,44 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include <string>
+#include "LibLsp/lsp/CodeActionParams.h"
+#include "LibLsp/lsp/lsWorkspaceEdit.h"
+
+
+class FileRenameEvent {
+public:
+	std::string oldUri;
+	std::string newUri;
+
+	FileRenameEvent() {
+	}
+
+	FileRenameEvent(std::string oldUri, std::string newUri) {
+		this->oldUri = oldUri;
+		this->newUri = newUri;
+	}
+	MAKE_SWAP_METHOD(FileRenameEvent, oldUri, newUri);
+};
+MAKE_REFLECT_STRUCT(FileRenameEvent, oldUri, newUri);
+
+class FileRenameParams {
+public:
+	std::vector <FileRenameEvent> files;
+
+	FileRenameParams() {
+	}
+
+	FileRenameParams(std::vector<FileRenameEvent>& files) {
+		this->files = files;
+	}
+	MAKE_SWAP_METHOD(FileRenameParams, files);
+};
+MAKE_REFLECT_STRUCT(FileRenameParams, files);
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_didRenameFiles, FileRenameParams, boost::optional<lsWorkspaceEdit>, "java/didRenameFiles");
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_willRenameFiles, FileRenameParams, boost::optional<lsWorkspaceEdit>, "java/willRenameFiles");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/didRenameFiles.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_change.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_change.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_change.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,51 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/lsVersionedTextDocumentIdentifier.h"
+#include "LibLsp/lsp/lsRange.h"
+#include "LibLsp/lsp/lsDocumentUri.h"
+struct lsTextDocumentContentChangeEvent {
+	// The range of the document that changed.
+	boost::optional<lsRange> range;
+	// The length of the range that got replaced.
+	boost::optional<int> rangeLength;
+	// The new text of the range/document.
+	std::string text;
+
+	MAKE_SWAP_METHOD(lsTextDocumentContentChangeEvent, range, rangeLength, text);
+};
+MAKE_REFLECT_STRUCT(lsTextDocumentContentChangeEvent, range, rangeLength, text);
+
+
+struct lsTextDocumentDidChangeParams {
+	lsVersionedTextDocumentIdentifier textDocument;
+	std::vector<lsTextDocumentContentChangeEvent> contentChanges;
+
+	/**
+	 * Legacy property to support protocol version 1.0 requests.
+	 */
+	
+	boost::optional<lsDocumentUri>  uri;
+	
+	void swap(lsTextDocumentDidChangeParams& arg) noexcept
+	{
+		uri.swap(arg.uri);
+		contentChanges.swap(arg.contentChanges);
+		textDocument.swap(arg.textDocument);
+	}
+};
+MAKE_REFLECT_STRUCT(lsTextDocumentDidChangeParams,
+	textDocument,
+	contentChanges, uri);
+
+/**
+ * The document change notification is sent from the client to the server to
+ * signal changes to a text document.
+ *
+ * Registration Options: TextDocumentChangeRegistrationOptions
+ */
+DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentDidChange, lsTextDocumentDidChangeParams, "textDocument/didChange");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_change.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_close.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_close.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_close.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,33 @@
+#pragma once
+
+
+
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+
+
+
+
+namespace TextDocumentDidClose  {
+
+  struct Params {
+    lsTextDocumentIdentifier textDocument;
+	void swap(Params& arg) noexcept
+	{
+		textDocument.swap(arg.textDocument);
+	}
+  	
+  };
+
+};
+
+MAKE_REFLECT_STRUCT(TextDocumentDidClose::Params, textDocument);
+
+/**
+ * The document close notification is sent from the client to the server
+ * when the document got closed in the client. The document's truth now
+ * exists where the document's uri points to (e.g. if the document's uri is
+ * a file uri the truth now exists on disk).
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentDidClose, TextDocumentDidClose::Params, "textDocument/didClose");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_close.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_open.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_open.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_open.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,39 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+
+#include "LibLsp/lsp/lsTextDocumentItem.h"
+
+// Open, view, change, close file
+namespace TextDocumentDidOpen {
+
+  struct Params {
+    lsTextDocumentItem textDocument;
+
+ 
+
+   /**
+  * Legacy property to support protocol version 1.0 requests.
+  */
+    boost::optional<std::string> text;
+  	
+   MAKE_SWAP_METHOD(TextDocumentDidOpen::Params, textDocument, text);
+  
+  };
+
+}
+MAKE_REFLECT_STRUCT(TextDocumentDidOpen::Params, textDocument, text);
+
+/**
+ * The document open notification is sent from the client to the server to
+ * signal newly opened text documents. The document's truth is now managed
+ * by the client and the server must not try to read the document's truth
+ * using the document's uri.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */;
+
+
+DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentDidOpen, TextDocumentDidOpen::Params, "textDocument/didOpen");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_open.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_save.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_save.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_save.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,31 @@
+#pragma once
+
+
+
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+
+
+namespace TextDocumentDidSave  {
+
+  struct Params {
+    // The document that was saved.
+    lsTextDocumentIdentifier textDocument;
+
+    // Optional the content when saved. Depends on the includeText value
+    // when the save notifcation was requested.
+    boost::optional<std::string>  text;
+
+	MAKE_SWAP_METHOD(TextDocumentDidSave::Params, textDocument, text);
+  };
+
+};
+MAKE_REFLECT_STRUCT(TextDocumentDidSave::Params, textDocument, text);
+
+/**
+ * The document save notification is sent from the client to the server when
+ * the document for saved in the client.
+ *
+ * Registration Options: TextDocumentSaveRegistrationOptions
+ */
+DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentDidSave, TextDocumentDidSave::Params, "textDocument/didSave");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/did_save.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/documentColor.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/documentColor.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/documentColor.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,73 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+#include "LibLsp/lsp/lsRange.h"
+#include <vector>
+struct DocumentColorParams {
+	/**
+	 * The text document.
+	 */
+
+	 lsTextDocumentIdentifier textDocument;
+	 MAKE_SWAP_METHOD(DocumentColorParams, textDocument);
+};
+MAKE_REFLECT_STRUCT(DocumentColorParams, textDocument);
+
+/**
+ * The document color request is sent from the client to the server to list all color references found in a given text
+ * document. Along with the range, a color value in RGB is returned.
+ *
+ * Clients can use the result to decorate color references in an editor. For example:
+ *  - Color boxes showing the actual color next to the reference
+ *  - Show a color picker when a color reference is edited
+ *
+ * Since version 3.6.0
+ */
+
+namespace TextDocument {
+	struct  Color {
+		/**
+		 * The red component of this color in the range [0-1].
+		 */
+		double red = 0;
+
+		/**
+		 * The green component of this color in the range [0-1].
+		 */
+		double green = 0;
+
+		/**
+		 * The blue component of this color in the range [0-1].
+		 */
+		double blue = 0;
+
+		/**
+		 * The alpha component of this color in the range [0-1].
+		 */
+		double alpha = 0;
+		MAKE_SWAP_METHOD(TextDocument::Color, red, green, blue, alpha)
+	};
+}
+MAKE_REFLECT_STRUCT(TextDocument::Color, red, green, blue, alpha)
+
+
+struct ColorInformation {
+	/**
+	 * The range in the document where this color appers.
+	 */
+
+	lsRange range;
+
+	/**
+	 * The actual color value for this color range.
+	 */
+
+	TextDocument::Color color;
+	MAKE_SWAP_METHOD(ColorInformation, range, color)
+};
+MAKE_REFLECT_STRUCT(ColorInformation,range,color)
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_documentColor, DocumentColorParams,std::vector<ColorInformation>, "textDocument/documentColor");
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/documentColor.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/document_link.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/document_link.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/document_link.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,44 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+
+namespace TextDocumentDocumentLink  {
+
+  struct Params {
+    // The document to provide document links for.
+    lsTextDocumentIdentifier textDocument;
+	MAKE_SWAP_METHOD(Params, textDocument)
+  };
+
+};
+MAKE_REFLECT_STRUCT(TextDocumentDocumentLink::Params, textDocument);
+
+
+
+
+// A document link is a range in a text document that links to an internal or
+// external resource, like another text document or a web site.
+struct lsDocumentLink {
+  // The range this link applies to.
+  lsRange range;
+  // The uri this link points to. If missing a resolve request is sent later.
+  boost::optional<lsDocumentUri> target;
+
+  boost::optional<lsp::Any> data;
+	
+  MAKE_SWAP_METHOD(lsDocumentLink, range, target, data)
+	
+};
+MAKE_REFLECT_STRUCT(lsDocumentLink, range, target,data);
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_links, TextDocumentDocumentLink::Params, lsDocumentLink, "textDocument/documentLink");
+
+
+/**
+ * The document link resolve request is sent from the client to the server to resolve the target of a given document link.
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_linkResolve, std::vector<lsDocumentLink>, lsDocumentLink, "documentLink/resolve");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/document_link.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/document_symbol.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/document_symbol.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/document_symbol.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,55 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/symbol.h"
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+ /**
+  * The document symbol request is sent from the client to the server to list all symbols found in a given text document.
+  */
+struct lsDocumentSymbolParams {
+  lsTextDocumentIdentifier textDocument;
+  MAKE_SWAP_METHOD(lsDocumentSymbolParams, textDocument)
+};
+MAKE_REFLECT_STRUCT(lsDocumentSymbolParams, textDocument);
+
+
+
+struct  TextDocumentDocumentSymbol{
+	typedef  std::pair< boost::optional<lsSymbolInformation>  , boost::optional<lsDocumentSymbol> > Either;
+};
+void Reflect(Reader& visitor, TextDocumentDocumentSymbol::Either& value);
+
+
+
+/**
+ * The document symbol request is sent from the client to the server to list all
+ * symbols found in a given text document.
+ *
+ * Registration Options: {@link TextDocumentRegistrationOptions}
+ *
+ * <p>
+ * <b>Caveat</b>: although the return type allows mixing the
+ * {@link DocumentSymbol} and {@link SymbolInformation} instances into a list do
+ * not do it because the clients cannot accept a heterogeneous list. A list of
+ * {@code DocumentSymbol} instances is only a valid return value if the
+ * {@link DocumentSymbolCapabilities#getHierarchicalDocumentSymbolSupport()
+ * textDocument.documentSymbol.hierarchicalDocumentSymbolSupport} is
+ * {@code true}. More details on this difference between the LSP and the LSP4J
+ * can be found <a href="https://github.com/eclipse/lsp4j/issues/252">here</a>.
+ * </p>
+ */
+
+//DEFINE_REQUEST_RESPONSE_TYPE(td_symbol, 
+//	lsDocumentSymbolParams,
+//	std::vector<TextDocumentDocumentSymbol::Either> );
+//
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_symbol, 
+	lsDocumentSymbolParams,
+	std::vector< lsDocumentSymbol >,"textDocument/documentSymbol" );
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/document_symbol.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/foldingRange.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/foldingRange.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/foldingRange.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,62 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "document_symbol.h"
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+
+
+struct FoldingRangeRequestParams {
+	/**
+	 * The text document.
+	 */
+
+	lsTextDocumentIdentifier textDocument;
+	MAKE_SWAP_METHOD(FoldingRangeRequestParams, textDocument)
+};
+MAKE_REFLECT_STRUCT(FoldingRangeRequestParams, textDocument)
+
+
+struct FoldingRange {
+	/**
+	 * The zero-based line number from where the folded range starts.
+	 */
+	 int startLine;
+
+	/**
+	 * The zero-based line number where the folded range ends.
+	 */
+	 int endLine;
+
+	/**
+	 * The zero-based character offset from where the folded range starts. If not defined, defaults
+	 * to the length of the start line.
+	 */
+	 int startCharacter;
+
+	/**
+	 * The zero-based character offset before the folded range ends. If not defined, defaults to the
+	 * length of the end line.
+	 */
+	 int endCharacter;
+
+	/**
+	 * Describes the kind of the folding range such as `comment' or 'region'. The kind
+	 * is used to categorize folding ranges and used by commands like 'Fold all comments'. See
+	 * FoldingRangeKind for an enumeration of standardized kinds.
+	 */
+	std::string kind;
+
+	MAKE_SWAP_METHOD(FoldingRange, startLine, endLine, startCharacter, endCharacter, kind)
+};
+MAKE_REFLECT_STRUCT(FoldingRange,startLine,endLine,startCharacter,endCharacter,kind)
+
+
+/**
+ * The folding range request is sent from the client to the server to return all folding
+ * ranges found in a given text document.
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_foldingRange, FoldingRangeRequestParams, std::vector<FoldingRange>, "textDocument/foldingRange");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/foldingRange.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/formatting.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/formatting.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/formatting.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,32 @@
+#pragma once
+#include "LibLsp/lsp/lsFormattingOptions.h"
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+
+namespace  TextDocumentFormatting  {
+
+  struct Params {
+	/**
+	 * The document to format.
+	*/
+    lsTextDocumentIdentifier textDocument;
+	/**
+	 * The format options.
+	 */
+    lsFormattingOptions options;
+	MAKE_SWAP_METHOD(Params, textDocument, options);
+  };
+
+};
+MAKE_REFLECT_STRUCT(TextDocumentFormatting::Params, textDocument, options);
+/**
+ * The document formatting request is sent from the client to the server to
+ * format a whole document.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_formatting, TextDocumentFormatting::Params,
+	std::vector<lsTextEdit>, "textDocument/formatting");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/formatting.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/highlight.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/highlight.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/highlight.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
+#include "document_symbol.h"
+
+/**
+ * The references request is sent from the client to the server to resolve
+ * project-wide references for the symbol denoted by the given text document
+ * position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_highlight, lsTextDocumentPositionParams,
+	std::vector<lsDocumentHighlight>, "textDocument/documentHighlight");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/highlight.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/hover.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/hover.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/hover.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,55 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/lsMarkedString.h"
+#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
+#include "LibLsp/lsp/lsRange.h"
+/**
+ * The hover request is sent from the client to the server to request hover
+ * information at a given text document position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+
+namespace TextDocumentHover
+{
+	typedef  boost::optional< std::vector< std::pair<boost::optional<std::string>, boost::optional<lsMarkedString>> > > Left;
+	typedef   std::pair< Left, boost::optional<MarkupContent> >  Either;
+	struct Result {
+		/**
+		 * The hover's content as markdown
+		 */
+		Either  contents;
+		
+		/**
+		 * An boost::optional range
+		 */
+		boost::optional<lsRange> range;
+
+		MAKE_SWAP_METHOD(Result, contents, range)
+	};
+}
+MAKE_REFLECT_STRUCT(TextDocumentHover::Result, contents, range);
+
+extern  void Reflect(Reader& visitor, std::pair<boost::optional<std::string>, boost::optional<lsMarkedString>>& value);
+extern  void Reflect(Reader& visitor, TextDocumentHover::Either& value);
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_hover, lsTextDocumentPositionParams, TextDocumentHover::Result, "textDocument/hover")
+
+//struct Rsp_TextDocumentHover : ResponseMessage< TextDocumentHover::Result, Rsp_TextDocumentHover> {
+//
+//};
+//MAKE_REFLECT_STRUCT(Rsp_TextDocumentHover,
+//	jsonrpc,
+//	id,
+//	result);
+
+//MAKE_REFLECT_STRUCT_OPTIONALS_MANDATORY(Rsp_TextDocumentHover,
+//                                        jsonrpc,
+//										 id,
+//                                        result);
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/hover.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/implementation.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/implementation.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/implementation.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,16 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/lsp/out_list.h"
+
+
+/**
+ * The goto implementation request is sent from the client to the server to resolve
+ * the implementation location of a symbol at a given text document position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ *
+ * Since version 3.6.0
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_implementation, lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/implementation");
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/implementation.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/linkedEditingRange.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/linkedEditingRange.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/linkedEditingRange.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,51 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/lsp/lsAny.h"
+#include "LibLsp/lsp/symbol.h"
+#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
+#include "LibLsp/lsp/lsRange.h"
+
+
+
+struct LinkedEditingRangeParams
+{
+	lsTextDocumentIdentifier textDocument;
+	lsPosition position;
+
+	MAKE_SWAP_METHOD(LinkedEditingRangeParams,
+		textDocument,
+		position)
+};
+MAKE_REFLECT_STRUCT(LinkedEditingRangeParams,
+	textDocument,
+	position)
+
+
+struct LinkedEditingRanges
+{
+	/**
+ * A list of ranges that can be renamed together. The ranges must have
+ * identical length and contain identical text content. The ranges cannot overlap.
+ */
+  std::vector<lsRange> ranges;
+
+	/**
+	 * An optional word pattern (regular expression) that describes valid contents for
+	 * the given ranges. If no pattern is provided, the client configuration's word
+	 * pattern will be used.
+	 */
+ 
+	boost::optional<std::string> wordPattern;
+	MAKE_SWAP_METHOD(LinkedEditingRanges,
+		ranges,
+		wordPattern)
+};
+
+MAKE_REFLECT_STRUCT(LinkedEditingRanges,
+	ranges,
+	wordPattern)
+DEFINE_REQUEST_RESPONSE_TYPE(td_linkedEditingRange, LinkedEditingRangeParams,
+	boost::optional<std::vector<LinkedEditingRanges >>,"textDocument/linkedEditingRange")
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/linkedEditingRange.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/onTypeFormatting.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/onTypeFormatting.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/onTypeFormatting.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,44 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/lsFormattingOptions.h"
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+#include "LibLsp/lsp/lsRange.h"
+#include "LibLsp/lsp/lsTextEdit.h"
+
+
+struct lsDocumentOnTypeFormattingParams
+{
+  lsTextDocumentIdentifier textDocument;
+  lsFormattingOptions options;
+
+  lsPosition position;
+
+	 /**
+	  * The character that has been typed.
+	  */
+
+  std::string ch;
+
+  MAKE_SWAP_METHOD(lsDocumentOnTypeFormattingParams,
+	  textDocument,
+	  position,
+	  options, ch);
+};
+MAKE_REFLECT_STRUCT(lsDocumentOnTypeFormattingParams,
+                    textDocument,
+					position,
+                    options,ch);
+
+/**
+ * The document range formatting request is sent from the client to the
+ * server to format a given range in a document.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_onTypeFormatting,
+	lsDocumentOnTypeFormattingParams, std::vector<lsTextEdit>, "textDocument/onTypeFormatting");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/onTypeFormatting.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/prepareRename.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/prepareRename.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/prepareRename.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,40 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/lsWorkspaceEdit.h"
+#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
+
+/**
+ * The rename request is sent from the client to the server to do a
+ * workspace wide rename of a symbol.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+struct PrepareRenameResult{
+	/**
+	 * The range of the string to rename
+	 */
+	
+	 lsRange range;
+
+/**
+ * A placeholder text of the string content to be renamed.
+ */
+
+	std::string placeholder;
+	
+	MAKE_SWAP_METHOD(PrepareRenameResult, range, placeholder)
+	
+};
+MAKE_REFLECT_STRUCT(PrepareRenameResult,range,placeholder)
+
+
+
+typedef  std::pair< boost::optional< lsRange>, boost::optional<PrepareRenameResult>> TextDocumentPrepareRenameResult;
+extern void  Reflect(Reader& visitor, TextDocumentPrepareRenameResult& value);
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_prepareRename, 
+	lsTextDocumentPositionParams, TextDocumentPrepareRenameResult, "textDocument/prepareRename");
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/prepareRename.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/publishDiagnostics.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/publishDiagnostics.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/publishDiagnostics.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,28 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+#include "LibLsp/lsp/lsp_diagnostic.h"
+
+// Diagnostics
+namespace TextDocumentPublishDiagnostics{
+  struct Params {
+    // The URI for which diagnostic information is reported.
+    lsDocumentUri uri;
+
+    // An array of diagnostic information items.
+    std::vector<lsDiagnostic> diagnostics;
+	MAKE_SWAP_METHOD(Params,uri,diagnostics);
+  };
+
+  
+};
+MAKE_REFLECT_STRUCT(TextDocumentPublishDiagnostics::Params,
+	uri,
+	diagnostics);
+
+/**
+ * Diagnostics notifications are sent from the server to the client to
+ * signal results of validation runs.
+ */
+DEFINE_NOTIFICATION_TYPE(Notify_TextDocumentPublishDiagnostics, TextDocumentPublishDiagnostics::Params, "textDocument/publishDiagnostics");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/publishDiagnostics.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/range_formatting.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/range_formatting.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/range_formatting.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,35 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/lsFormattingOptions.h"
+
+
+struct lsTextDocumentRangeFormattingParams {
+  lsTextDocumentIdentifier textDocument;
+  lsRange range;
+  lsFormattingOptions options;
+
+  MAKE_SWAP_METHOD(lsTextDocumentRangeFormattingParams,
+	  textDocument,
+	  range,
+	  options)
+};
+MAKE_REFLECT_STRUCT(lsTextDocumentRangeFormattingParams,
+                    textDocument,
+                    range,
+                    options);
+
+/**
+ * The document range formatting request is sent from the client to the
+ * server to format a given range in a document.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_rangeFormatting, lsTextDocumentRangeFormattingParams, std::vector<lsTextEdit>,
+	"textDocument/rangeFormatting");
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/range_formatting.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/references.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/references.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/references.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,48 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/symbol.h"
+
+
+namespace  TextDocumentReferences {
+
+  struct lsReferenceContext {
+    // Include the declaration of the current symbol.
+    boost::optional<bool>  includeDeclaration;
+   MAKE_REFLECT_STRUCT(lsReferenceContext,
+	   includeDeclaration)
+  };
+  struct Params {
+    lsTextDocumentIdentifier textDocument;
+    lsPosition position;
+    lsReferenceContext context;
+	MAKE_SWAP_METHOD(Params,
+		textDocument,
+		position,
+		context)
+
+  };
+
+};
+MAKE_REFLECT_STRUCT(TextDocumentReferences::lsReferenceContext,
+                    includeDeclaration);
+MAKE_REFLECT_STRUCT(TextDocumentReferences::Params,
+                    textDocument,
+                    position,
+                    context);
+
+
+
+
+/**
+ * The references request is sent from the client to the server to resolve
+ * project-wide references for the symbol denoted by the given text document
+ * position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_references, TextDocumentReferences::Params, 
+    std::vector<lsLocation>, "textDocument/references");


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/references.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/rename.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/rename.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/rename.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,41 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/lsWorkspaceEdit.h"
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+
+namespace TextDocumentRename  {
+
+  struct Params {
+    // The document to format.
+    lsTextDocumentIdentifier textDocument;
+
+    // The position at which this request was sent.
+    lsPosition position;
+
+    // The new name of the symbol. If the given name is not valid the
+    // request must return a [ResponseError](#ResponseError) with an
+    // appropriate message set.
+    std::string newName;
+	MAKE_SWAP_METHOD(Params,
+		textDocument,
+		position,
+		newName);
+  };
+
+};
+MAKE_REFLECT_STRUCT(TextDocumentRename::Params,
+                    textDocument,
+                    position,
+                    newName);
+/**
+ * The rename request is sent from the client to the server to do a
+ * workspace wide rename of a symbol.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_rename, TextDocumentRename::Params, lsWorkspaceEdit, "textDocument/rename");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/rename.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveCodeLens.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveCodeLens.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveCodeLens.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,10 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "code_lens.h"
+
+DEFINE_REQUEST_RESPONSE_TYPE(codeLens_resolve, lsCodeLens, lsCodeLens, "codeLens/resolve")
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveCodeLens.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveCompletionItem.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveCompletionItem.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveCompletionItem.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,21 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include <regex>
+#include "LibLsp/lsp/lsp_completion.h"
+#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
+#include "completion.h"
+
+/**
+ * The request is sent from the client to the server to resolve additional
+ * information for a given completion item.
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(completionItem_resolve, lsCompletionItem, lsCompletionItem, "completionItem/resolve");
+
+
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveCompletionItem.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveTypeHierarchy.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveTypeHierarchy.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveTypeHierarchy.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,31 @@
+#pragma once
+
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/symbol.h"
+#include "typeHierarchy.h"
+
+struct ResolveTypeHierarchyItemParams {
+	/**
+	 * The hierarchy item to resolve.
+	 */
+
+	TypeHierarchyItem item;
+
+	/**
+	 * The number of hierarchy levels to resolve. {@code 0} indicates no hierarchy level.
+	 */
+	boost::optional<int>  resolve;
+
+	/**
+	 * The direction of the type hierarchy resolution.
+	 */
+
+	TypeHierarchyDirection direction;
+	MAKE_SWAP_METHOD(ResolveTypeHierarchyItemParams, item, resolve, direction)
+};
+MAKE_REFLECT_STRUCT(ResolveTypeHierarchyItemParams,item,resolve,direction)
+DEFINE_REQUEST_RESPONSE_TYPE(typeHierarchy_resolve, ResolveTypeHierarchyItemParams, TypeHierarchyItem, "typeHierarchy/resolve")


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/resolveTypeHierarchy.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/selectionRange.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/selectionRange.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/selectionRange.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,52 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/lsPosition.h"
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+
+struct SelectionRangeParams {
+	/**
+	 * The text document.
+	 */
+
+	lsTextDocumentIdentifier textDocument;
+
+	/**
+	 * The positions inside the text document.
+	 */
+
+	std::vector<lsPosition> positions;
+	
+	MAKE_SWAP_METHOD(SelectionRangeParams, textDocument, positions)
+	
+};
+MAKE_REFLECT_STRUCT(SelectionRangeParams, textDocument, positions)
+
+struct SelectionRange {
+	/**
+	 * The [range](#Range) of this selection range.
+	 */
+
+	lsRange range;
+
+	/**
+	 * The parent selection range containing this range. Therefore `parent.range` must contain `this.range`.
+	 */
+	boost::optional<SelectionRange*> parent;
+	MAKE_SWAP_METHOD(SelectionRange, range, parent)
+};
+
+extern  void Reflect(Reader& visitor, boost::optional<SelectionRange*>& value);
+extern void Reflect(Writer& visitor, SelectionRange* value);
+
+MAKE_REFLECT_STRUCT(SelectionRange,range,parent)
+/**
+ * The {@code textDocument/selectionRange} request is sent from the client to the server to return
+ * suggested selection ranges at an array of given positions. A selection range is a range around
+ * the cursor position which the user might be interested in selecting.
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_selectionRange, SelectionRangeParams, std::vector<SelectionRange>, "textDocument/selectionRange");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/selectionRange.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/semanticHighlighting.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/semanticHighlighting.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/semanticHighlighting.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,66 @@
+#pragma once
+#include "LibLsp/lsp/lsDocumentUri.h"
+#include "LibLsp/lsp/lsVersionedTextDocumentIdentifier.h"
+
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+/**
+ * Represents a semantic highlighting information that has to be applied on a specific line of the text document.
+ */
+
+struct SemanticHighlightingInformation {
+	/**
+	 * The zero-based line position in the text document.
+	 */
+	int line = 0;
+
+	/**
+	 * A base64 encoded string representing every single highlighted ranges in the line with its start position, length
+	 * and the "lookup table" index of of the semantic highlighting <a href="https://manual.macromates.com/en/language_grammars">
+	 * TextMate scopes</a>. If the {@code tokens} is empty or not defined, then no highlighted positions are available for the line.
+	 */
+	 std::string tokens;
+
+	 MAKE_SWAP_METHOD(SemanticHighlightingInformation, line, tokens)
+};
+
+MAKE_REFLECT_STRUCT(SemanticHighlightingInformation, line, tokens);
+
+/**
+ * Parameters for the semantic highlighting (server-side) push notification.
+ */
+
+struct SemanticHighlightingParams {
+	/**
+	 * The text document that has to be decorated with the semantic highlighting information.
+	 */
+	
+	 lsVersionedTextDocumentIdentifier textDocument;
+
+	/**
+	 * An array of semantic highlighting information.
+	 */
+
+	 std::vector<SemanticHighlightingInformation> lines;
+	
+	 MAKE_SWAP_METHOD(SemanticHighlightingParams, textDocument, lines)
+	
+};
+MAKE_REFLECT_STRUCT(SemanticHighlightingParams, textDocument, lines);
+/**
+	 * The {@code textDocument/semanticHighlighting} notification is pushed from the server to the client
+	 * to inform the client about additional semantic highlighting information that has to be applied
+	 * on the text document. It is the server's responsibility to decide which lines are included in
+	 * the highlighting information. In other words, the server is capable of sending only a delta
+	 * information. For instance, after opening the text document ({@code DidOpenTextDocumentNotification})
+	 * the server sends the semantic highlighting information for the entire document, but if the server
+	 * receives a {@code DidChangeTextDocumentNotification}, it pushes the information only about
+	 * the affected lines in the document.
+	 *
+	 * <p>
+	 * <b>Note:</b> the <a href=
+	 * "https://github.com/Microsoft/vscode-languageserver-node/pull/367">{@code textDocument/semanticHighlighting}
+	 * language feature</a> is not yet part of the official LSP specification.
+	 */
+DEFINE_NOTIFICATION_TYPE(Notify_semanticHighlighting, SemanticHighlightingParams, "textDocument/semanticHighlighting");
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/semanticHighlighting.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/signature_help.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/signature_help.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/signature_help.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,92 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/lsp/lsMarkedString.h"
+#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
+
+extern  void Reflect(Reader& visitor, 
+	std::pair<boost::optional<std::string>, boost::optional<MarkupContent>>& value);
+
+
+
+// Represents a parameter of a callable-signature. A parameter can
+// have a label and a doc-comment.
+struct lsParameterInformation {
+  // The label of this parameter. Will be shown in
+  // the UI.
+  std::string label;
+
+  // The human-readable doc-comment of this parameter. Will be shown
+  // in the UI but can be omitted.
+  boost::optional< std::pair<  boost::optional<std::string>  , boost::optional <MarkupContent>  > > documentation;
+
+  MAKE_SWAP_METHOD(lsParameterInformation, label, documentation)
+};
+MAKE_REFLECT_STRUCT(lsParameterInformation, label, documentation);
+
+// Represents the signature of something callable. A signature
+// can have a label, like a function-name, a doc-comment, and
+// a set of parameters.
+struct lsSignatureInformation {
+  // The label of this signature. Will be shown in
+  // the UI.
+  std::string label;
+
+  // The human-readable doc-comment of this signature. Will be shown
+  // in the UI but can be omitted.
+  boost::optional< std::pair<  boost::optional<std::string>, boost::optional <MarkupContent>  > > documentation;
+
+  // The parameters of this signature.
+  std::vector<lsParameterInformation> parameters;
+
+  MAKE_SWAP_METHOD(lsSignatureInformation, label, documentation, parameters)
+};
+MAKE_REFLECT_STRUCT(lsSignatureInformation, label, documentation, parameters);
+
+// Signature help represents the signature of something
+// callable. There can be multiple signature but only one
+// active and only one active parameter.
+struct lsSignatureHelp {
+  // One or more signatures.
+  std::vector<lsSignatureInformation> signatures;
+
+  // The active signature. If omitted or the value lies outside the
+  // range of `signatures` the value defaults to zero or is ignored if
+  // `signatures.length === 0`. Whenever possible implementors should
+  // make an active decision about the active signature and shouldn't
+  // rely on a default value.
+  // In future version of the protocol this property might become
+  // mandantory to better express this.
+  boost::optional<int> activeSignature;
+
+  // The active parameter of the active signature. If omitted or the value
+  // lies outside the range of `signatures[activeSignature].parameters`
+  // defaults to 0 if the active signature has parameters. If
+  // the active signature has no parameters it is ignored.
+  // In future version of the protocol this property might become
+  // mandantory to better express the active parameter if the
+  // active signature does have any.
+  boost::optional<int> activeParameter;
+
+
+  MAKE_SWAP_METHOD(lsSignatureHelp,
+	  signatures,
+	  activeSignature,
+	  activeParameter)
+};
+MAKE_REFLECT_STRUCT(lsSignatureHelp,
+                    signatures,
+                    activeSignature,
+                    activeParameter);
+
+
+
+/**
+ * The signature help request is sent from the client to the server to
+ * request signature information at a given cursor position.
+ *
+ * Registration Options: SignatureHelpRegistrationOptions
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_signatureHelp, lsTextDocumentPositionParams, lsSignatureHelp, "textDocument/signatureHelp");
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/signature_help.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/textDocument.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/textDocument.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/textDocument.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,349 @@
+#include "completion.h"
+#include "document_symbol.h"
+#include "LibLsp/lsp/lsMarkedString.h"
+#include "hover.h"
+#include "prepareRename.h"
+#include <LibLsp/lsp/textDocument/typeHierarchy.h>
+
+#include "semanticHighlighting.h"
+#include "SemanticTokens.h"
+#include "LibLsp/JsonRpc/json.h"
+
+
+constexpr unsigned SemanticTokenEncodingSize = 5;
+
+std::string to_string(SemanticTokenType _type)
+{
+	switch (_type) {
+
+		case ls_namespace: return "namespace";
+			/**
+			 * Represents a generic type. Acts as a fallback for types which
+			 * can"t be mapped to a specific type like class or enum.
+			 */
+		case ls_type: return "type";
+		case ls_class: return "class";
+		case ls_enum: return "enum";
+		case ls_interface: return "interface";
+		case ls_struct: return "struct";
+		case ls_typeParameter: return "typeParameter";
+		case ls_parameter: return "parameter";
+		case ls_variable: return "variable";
+		case ls_property: return "property";
+		case ls_enumMember: return "enumMember";
+		case ls_event: return "event";
+		case ls_function: return "function";
+		case ls_method: return "method";
+		case ls_macro: return "macro";
+		case ls_keyword: return "keyword";
+		case ls_modifier: return "modifier";
+		case ls_comment: return "comment";
+		case ls_string: return "string";
+		case ls_number: return "number";
+		case ls_regexp: return "regexp";
+		case ls_operator: return "operator";
+		default:
+			return  "unknown";
+	}
+}
+
+unsigned toSemanticTokenType(std::vector<SemanticTokenType>& modifiers)
+{
+	unsigned encode_type = 0;
+	for (auto bit : modifiers) {
+		encode_type = encode_type | (0b00000001 << bit);
+	}
+	return encode_type;
+}
+
+std::string to_string(TokenType_JDT _type)
+{
+	switch (_type)
+	{
+	case  PACKAGE_JDT:return "namespace";
+	case	CLASS_JDT:return "class";
+	case	INTERFACE_JDT:return "interface";
+	case	ENUM_JDT:return "enum";
+	case	ENUM_MEMBER_JDT:return "enumMember";
+	case	TYPE_JDT:return "type";
+	case	TYPE_PARAMETER_JDT:return "typeParameter";
+	case	ANNOTATION_JDT:return "annotation";
+	case	ANNOTATION_MEMBER_JDT:return "annotationMember";
+	case	METHOD_JDT:return "function";
+	case	PROPERTY_JDT:return "property";
+	case	VARIABLE_JDT:return "variable";
+	case	PARAMETER_JDT:return "parameter";
+	}
+	return  "unknown";
+}
+
+std::string to_string(SemanticTokenModifier modifier)
+{
+	switch (modifier) {
+	case ls_declaration: return  "declaration";
+	case ls_definition: return  "definition";
+	case ls_readonly: return  "readonly";
+	case ls_static: return  "static";
+	case ls_deprecated: return  "deprecated";
+	case ls_abstract: return  "abstract";
+	case ls_async: return  "async";
+	case ls_modification: return  "modification";
+	case ls_documentation: return  "documentation";
+	case ls_defaultLibrary: return  "defaultLibrary";
+	default:
+		return  "unknown";
+	}
+}
+
+unsigned toSemanticTokenModifiers(std::vector<SemanticTokenModifier>& modifiers)
+{
+	unsigned encodedModifiers = 0;
+	for (auto bit : modifiers) {
+		encodedModifiers = encodedModifiers | (0b00000001 << bit);
+	}
+	return encodedModifiers;
+}
+
+
+std::string toSemanticTokenType(HighlightingKind_clangD kind) {
+	switch (kind) {
+	case HighlightingKind_clangD::Variable:
+	case HighlightingKind_clangD::LocalVariable:
+	case HighlightingKind_clangD::StaticField:
+		return "variable";
+	case HighlightingKind_clangD::Parameter:
+		return "parameter";
+	case HighlightingKind_clangD::Function:
+		return "function";
+	case HighlightingKind_clangD::Method:
+		return "method";
+	case HighlightingKind_clangD::StaticMethod:
+		// FIXME: better method with static modifier?
+		return "function";
+	case HighlightingKind_clangD::Field:
+		return "property";
+	case HighlightingKind_clangD::Class:
+		return "class";
+	case HighlightingKind_clangD::Interface:
+		return "interface";
+	case HighlightingKind_clangD::Enum:
+		return "enum";
+	case HighlightingKind_clangD::EnumConstant:
+		return "enumMember";
+	case HighlightingKind_clangD::Typedef:
+	case HighlightingKind_clangD::Type:
+		return "type";
+	case HighlightingKind_clangD::Unknown:
+		return "unknown"; // nonstandard
+	case HighlightingKind_clangD::Namespace:
+		return "namespace";
+	case HighlightingKind_clangD::TemplateParameter:
+		return "typeParameter";
+	case HighlightingKind_clangD::Concept:
+		return "concept"; // nonstandard
+	case HighlightingKind_clangD::Primitive:
+		return "type";
+	case HighlightingKind_clangD::Macro:
+		return "macro";
+	case HighlightingKind_clangD::InactiveCode:
+		return "comment";
+	}
+	return ("unhandled HighlightingKind_clangD");
+}
+
+std::string toSemanticTokenModifier(HighlightingModifier_clangD modifier) {
+	switch (modifier) {
+	case HighlightingModifier_clangD::Declaration:
+		return "declaration";
+	case HighlightingModifier_clangD::Deprecated:
+		return "deprecated";
+	case HighlightingModifier_clangD::Readonly:
+		return "readonly";
+	case HighlightingModifier_clangD::Static:
+		return "static";
+	case HighlightingModifier_clangD::Deduced:
+		return "deduced"; // nonstandard
+	case HighlightingModifier_clangD::Abstract:
+		return "abstract";
+	case HighlightingModifier_clangD::DependentName:
+		return "dependentName"; // nonstandard
+	case HighlightingModifier_clangD::DefaultLibrary:
+		return "defaultLibrary";
+	case HighlightingModifier_clangD::FunctionScope:
+		return "functionScope"; // nonstandard
+	case HighlightingModifier_clangD::ClassScope:
+		return "classScope"; // nonstandard
+	case HighlightingModifier_clangD::FileScope:
+		return "fileScope"; // nonstandard
+	case HighlightingModifier_clangD::GlobalScope:
+		return "globalScope"; // nonstandard
+	}
+	return ("unhandled HighlightingModifier_clangD");
+}
+
+
+
+bool operator==(const SemanticToken& l, const SemanticToken& r) {
+	return std::tie(l.deltaLine, l.deltaStart, l.length, l.tokenType,
+		l.tokenModifiers) == std::tie(r.deltaLine, r.deltaStart,
+			r.length, r.tokenType,
+			r.tokenModifiers);
+}
+
+std::vector<int32_t> SemanticTokens::encodeTokens(std::vector<SemanticToken>& tokens)
+{
+	std::vector<int32_t> result;
+	result.reserve(SemanticTokenEncodingSize * tokens.size());
+	for (const auto& tok : tokens)
+	{
+		result.push_back(tok.deltaLine);
+		result.push_back(tok.deltaStart);
+		result.push_back(tok.length);
+		result.push_back(tok.tokenType);
+		result.push_back(tok.tokenModifiers);
+	}
+	assert(result.size() == SemanticTokenEncodingSize * tokens.size());
+	return result;
+}
+
+void Reflect(Reader& visitor, TextDocumentComplete::Either& value)
+{
+	if(visitor.IsArray())
+	{
+		Reflect(visitor, value.first);
+	}
+	else
+	{
+
+		Reflect(visitor, value.second);
+	}
+
+}
+void Reflect(Reader& visitor, TextDocumentDocumentSymbol::Either& value)
+{
+	if (visitor.HasMember("location"))
+	{
+		Reflect(visitor, value.first);
+	}
+	else
+	{
+		Reflect(visitor, value.second);
+	}
+}
+
+void Reflect(Reader& visitor, std::pair<boost::optional<std::string>, boost::optional<lsMarkedString>>& value)
+{
+
+	if (!visitor.IsString())
+	{
+		Reflect(visitor, value.second);
+	}
+	else
+	{
+		Reflect(visitor, value.first);
+	}
+}
+
+void Reflect(Reader& visitor, std::pair<boost::optional<std::string>, boost::optional<MarkupContent>>& value)
+{
+	if (!visitor.IsString())
+	{
+		Reflect(visitor, value.second);
+	}
+	else
+	{
+		Reflect(visitor, value.first);
+	}
+}
+  void Reflect(Reader& visitor, TextDocumentHover::Either& value)
+{
+	  JsonReader& reader = dynamic_cast<JsonReader&>(visitor);
+	  if (reader.IsArray())
+	  {
+		  Reflect(visitor, value.first);
+	  }
+	  else if(reader.m_->IsObject())
+	  {
+		  Reflect(visitor, value.second);
+	  }
+}
+
+   void  Reflect(Reader& visitor, TextDocumentPrepareRenameResult& value)
+{
+	  if (visitor.HasMember("placeholder"))
+	  {
+		  Reflect(visitor, value.second);
+	  }
+	  else
+	  {
+		  Reflect(visitor, value.first);
+	  }
+}
+
+  namespace
+	  RefactorProposalUtility
+  {
+	    const char* APPLY_REFACTORING_COMMAND_ID = "java.action.applyRefactoringCommand";
+	    const char* EXTRACT_VARIABLE_ALL_OCCURRENCE_COMMAND = "extractVariableAllOccurrence";
+	    const char* EXTRACT_VARIABLE_COMMAND = "extractVariable";
+	    const char* EXTRACT_CONSTANT_COMMAND = "extractConstant";
+	    const char* EXTRACT_METHOD_COMMAND = "extractMethod";
+	    const char* EXTRACT_FIELD_COMMAND = "extractField";
+	    const char* CONVERT_VARIABLE_TO_FIELD_COMMAND = "convertVariableToField";
+	    const char* MOVE_FILE_COMMAND = "moveFile";
+	    const char* MOVE_INSTANCE_METHOD_COMMAND = "moveInstanceMethod";
+	    const char* MOVE_STATIC_MEMBER_COMMAND = "moveStaticMember";
+	    const char* MOVE_TYPE_COMMAND = "moveType";
+  };
+  namespace  QuickAssistProcessor {
+
+	   const char* SPLIT_JOIN_VARIABLE_DECLARATION_ID = "org.eclipse.jdt.ls.correction.splitJoinVariableDeclaration.assist"; //$NON-NLS-1$
+	   const char* CONVERT_FOR_LOOP_ID = "org.eclipse.jdt.ls.correction.convertForLoop.assist"; //$NON-NLS-1$
+	   const char* ASSIGN_TO_LOCAL_ID = "org.eclipse.jdt.ls.correction.assignToLocal.assist"; //$NON-NLS-1$
+	   const char* ASSIGN_TO_FIELD_ID = "org.eclipse.jdt.ls.correction.assignToField.assist"; //$NON-NLS-1$
+	   const char* ASSIGN_PARAM_TO_FIELD_ID = "org.eclipse.jdt.ls.correction.assignParamToField.assist"; //$NON-NLS-1$
+	   const char* ASSIGN_ALL_PARAMS_TO_NEW_FIELDS_ID = "org.eclipse.jdt.ls.correction.assignAllParamsToNewFields.assist"; //$NON-NLS-1$
+	   const char* ADD_BLOCK_ID = "org.eclipse.jdt.ls.correction.addBlock.assist"; //$NON-NLS-1$
+	   const char* EXTRACT_LOCAL_ID = "org.eclipse.jdt.ls.correction.extractLocal.assist"; //$NON-NLS-1$
+	   const char* EXTRACT_LOCAL_NOT_REPLACE_ID = "org.eclipse.jdt.ls.correction.extractLocalNotReplaceOccurrences.assist"; //$NON-NLS-1$
+	   const char* EXTRACT_CONSTANT_ID = "org.eclipse.jdt.ls.correction.extractConstant.assist"; //$NON-NLS-1$
+	   const char* INLINE_LOCAL_ID = "org.eclipse.jdt.ls.correction.inlineLocal.assist"; //$NON-NLS-1$
+	   const char* CONVERT_LOCAL_TO_FIELD_ID = "org.eclipse.jdt.ls.correction.convertLocalToField.assist"; //$NON-NLS-1$
+	   const char* CONVERT_ANONYMOUS_TO_LOCAL_ID = "org.eclipse.jdt.ls.correction.convertAnonymousToLocal.assist"; //$NON-NLS-1$
+	   const char* CONVERT_TO_STRING_BUFFER_ID = "org.eclipse.jdt.ls.correction.convertToStringBuffer.assist"; //$NON-NLS-1$
+	   const char* CONVERT_TO_MESSAGE_FORMAT_ID = "org.eclipse.jdt.ls.correction.convertToMessageFormat.assist"; //$NON-NLS-1$;
+	   const char* EXTRACT_METHOD_INPLACE_ID = "org.eclipse.jdt.ls.correction.extractMethodInplace.assist"; //$NON-NLS-1$;
+
+	   const char* CONVERT_ANONYMOUS_CLASS_TO_NESTED_COMMAND = "convertAnonymousClassToNestedCommand";
+  };
+
+  void Reflect(Reader& reader, TypeHierarchyDirection& value) {
+	  if (!reader.IsString())
+	  {
+		  value = TypeHierarchyDirection::Both;
+		  return;
+	  }
+	  std::string v = reader.GetString();
+	  if (v == "Children")
+		  value = TypeHierarchyDirection::Both;
+	  else if (v == "Parents")
+		  value = TypeHierarchyDirection::Parents;
+	  else if (v == "Both")
+		  value = TypeHierarchyDirection::Both;
+  }
+
+
+  void Reflect(Writer& writer, TypeHierarchyDirection& value) {
+	  switch (value)
+	  {
+	  case TypeHierarchyDirection::Children:
+		  writer.String("Children");
+		  break;
+	  case TypeHierarchyDirection::Parents:
+		  writer.String("Parents");
+		  break;
+	  case TypeHierarchyDirection::Both:
+		  writer.String("Both");
+		  break;
+	  }
+  }


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/textDocument.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/typeHierarchy.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/typeHierarchy.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/typeHierarchy.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,133 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+#include "LibLsp/lsp/lsTextDocumentPositionParams.h"
+#include "LibLsp/lsp/symbol.h"
+#include "LibLsp/lsp/lsAny.h"
+/**
+	 * The {@code textDocument/typeHierarchy} request is sent from the client to the
+	 * server to retrieve a {@link TypeHierarchyItem type hierarchy item} based on
+	 * the {@link TypeHierarchyParams cursor position in the text document}. This
+	 * request would also allow to specify if the item should be resolved and
+	 * whether sub- or supertypes are to be resolved. If no type hierarchy item can
+	 * be found under the given text document position, resolves to {@code null}.
+	 *
+	 * <p>
+	 * <b>Note:</b> the <a href=
+	 * "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
+	 * language feature</a> is not yet part of the official LSP specification.
+	 */
+enum class TypeHierarchyDirection :  uint32_t{
+
+	/**
+	 * Flag for retrieving/resolving the subtypes. Value: {@code 0}.
+	 */
+	Children = 0,
+
+	/**
+	 * Flag to use when retrieving/resolving the supertypes. Value: {@code 1}.
+	 */
+	 Parents =1,
+
+	 /**
+	  * Flag for resolving both the super- and subtypes. Value: {@code 2}.
+	  */
+	  Both=2
+};
+void Reflect(Reader& reader, TypeHierarchyDirection& value);
+
+
+void Reflect(Writer& writer, TypeHierarchyDirection& value);
+
+struct TypeHierarchyParams :public lsTextDocumentPositionParams
+{
+	boost::optional<int>  resolve;
+	boost::optional<TypeHierarchyDirection> direction ;
+	
+	MAKE_SWAP_METHOD(TypeHierarchyParams, textDocument, position, resolve, direction)
+};
+MAKE_REFLECT_STRUCT(TypeHierarchyParams,  textDocument, position, resolve, direction);
+
+
+
+
+
+/**
+ * Representation of an item that carries type information (such as class, interface, enumeration, etc) with additional parentage details.
+ */
+
+struct  TypeHierarchyItem {
+	/**
+	 * The human readable name of the hierarchy item.
+	 */
+
+	std::string name;
+
+	/**
+	 * Optional detail for the hierarchy item. It can be, for instance, the signature of a function or method.
+	 */
+	boost::optional<std::string>
+	 detail;
+
+	/**
+	 * The kind of the hierarchy item. For instance, class or interface.
+	 */
+
+	SymbolKind kind;
+
+	/**
+	 * {@code true} if the hierarchy item is deprecated. Otherwise, {@code false}. It is {@code false} by default.
+	 */
+	
+	boost::optional<bool> deprecated;
+
+	/**
+	 * The URI of the text document where this type hierarchy item belongs to.
+	 */
+
+	lsDocumentUri uri;
+
+	/**
+	 * The range enclosing this type hierarchy item not including leading/trailing whitespace but everything else
+	 * like comments. This information is typically used to determine if the clients cursor is inside the type
+	 * hierarchy item to reveal in the symbol in the UI.
+	 *
+	 * @see TypeHierarchyItem#selectionRange
+	 */
+
+	lsRange range;
+
+	/**
+	 * The range that should be selected and revealed when this type hierarchy item is being picked, e.g the name of a function.
+	 * Must be contained by the the {@link TypeHierarchyItem#getRange range}.
+	 *
+	 * @see TypeHierarchyItem#range
+	 */
+
+	lsRange selectionRange;
+
+	/**
+	 * If this type hierarchy item is resolved, it contains the direct parents. Could be empty if the item does not have any
+	 * direct parents. If not defined, the parents have not been resolved yet.
+	 */
+	boost::optional< std::vector<TypeHierarchyItem> >  parents;
+
+	/**
+	 * If this type hierarchy item is resolved, it contains the direct children of the current item.
+	 * Could be empty if the item does not have any descendants. If not defined, the children have not been resolved.
+	 */
+	boost::optional< std::vector<TypeHierarchyItem> >  children;
+
+	/**
+ * An boost::optional data field can be used to identify a type hierarchy item in a resolve request.
+ */
+	boost::optional<lsp::Any> data;
+
+	MAKE_SWAP_METHOD(TypeHierarchyItem, name, detail, kind, deprecated, uri, range, selectionRange, parents, children, data)
+};
+MAKE_REFLECT_STRUCT(TypeHierarchyItem, name, detail, kind, deprecated, uri, range, selectionRange, parents, children, data);
+
+
+
+DEFINE_REQUEST_RESPONSE_TYPE(td_typeHierarchy, TypeHierarchyParams, TypeHierarchyItem, "textDocument/typeHierarchy");
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/typeHierarchy.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/type_definition.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/type_definition.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/type_definition.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,16 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/lsp/out_list.h"
+
+/**
+ * The goto type definition request is sent from the client to the server to resolve
+ * the type definition location of a symbol at a given text document position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ *
+ * Since version 3.6.0
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_typeDefinition,
+	lsTextDocumentPositionParams, LocationListEither::Either, "textDocument/typeDefinition");
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/type_definition.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/willSave.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/willSave.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/willSave.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,71 @@
+#pragma once
+
+
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+#include "LibLsp/lsp/lsTextDocumentIdentifier.h"
+
+namespace WillSaveTextDocumentParams {
+
+	/**
+	 * Represents reasons why a text document is saved.
+	 */
+	enum class TextDocumentSaveReason {
+
+		/**
+		 * Manually triggered, e.g. by the user pressing save, by starting debugging,
+		 * or by an API call.
+		 */
+		Manual=(1),
+
+		/**
+		 * Automatic after a delay.
+		 */
+		 AfterDelay=(2),
+
+		 /**
+		  * When the editor lost focus.
+		  */
+		  FocusOut=(3)
+	};
+	
+  struct Params {
+	  /**
+	   * The document that will be saved.
+	   */
+    lsTextDocumentIdentifier textDocument;
+
+   /*
+   * A reason why a text document is saved.
+   */
+
+	  boost::optional<TextDocumentSaveReason>  reason;
+
+		MAKE_SWAP_METHOD(Params, textDocument, reason);
+  };
+
+};
+MAKE_REFLECT_TYPE_PROXY(WillSaveTextDocumentParams::TextDocumentSaveReason);
+
+MAKE_REFLECT_STRUCT(WillSaveTextDocumentParams::Params, textDocument, reason);
+
+/**
+ * The document save notification is sent from the client to the server when
+ * the document for saved in the client.
+ *
+ * Registration Options: TextDocumentSaveRegistrationOptions
+ */
+DEFINE_NOTIFICATION_TYPE(td_willSave, WillSaveTextDocumentParams::Params, "textDocument/willSave");
+
+/**
+ * The document will save request is sent from the client to the server before the document is actually saved.
+ * The request can return an array of TextEdits which will be applied to the text document before it is saved.
+ * Please note that clients might drop results if computing the text edits took too long or if a server constantly fails on this request.
+ * This is done to keep the save fast and reliable.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+DEFINE_REQUEST_RESPONSE_TYPE(td_willSaveWaitUntil,
+	WillSaveTextDocumentParams::Params, std::vector<lsTextEdit>, "textDocument/willSaveWaitUntil");
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/textDocument/willSave.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/utils.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/utils.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/utils.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,602 @@
+#include "utils.h"
+
+#include <algorithm>
+#include <cassert>
+#include <cctype>
+#include <cstring>
+#include <fstream>
+#include <functional>
+
+#include <queue>
+#include <sstream>
+#include <string>
+#include <unordered_map>
+#include <sys/stat.h>
+
+#include "lsPosition.h"
+#include "utf8.h"
+#ifdef  _WIN32
+#include <Windows.h>
+#endif
+
+
+// DEFAULT_RESOURCE_DIRECTORY is passed with quotes for non-MSVC compilers, ie,
+// foo vs "foo".
+#if defined(_MSC_VER)
+#define _STRINGIFY(x) #x
+#define ENSURE_STRING_MACRO_ARGUMENT(x) _STRINGIFY(x)
+#else
+#define ENSURE_STRING_MACRO_ARGUMENT(x) x
+#endif
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/algorithm/string.hpp>
+namespace lsp
+{
+
+
+// See http://stackoverflow.com/a/2072890
+bool EndsWith(std::string value, std::string ending) {
+  if (ending.size() > value.size())
+    return false;
+  return std::equal(ending.rbegin(), ending.rend(), value.rbegin());
+}
+
+bool StartsWith(std::string value, std::string start) {
+  if (start.size() > value.size())
+    return false;
+  return std::equal(start.begin(), start.end(), value.begin());
+}
+
+bool AnyStartsWith(const std::vector<std::string>& values,
+                   const std::string& start) {
+  return std::any_of(
+      std::begin(values), std::end(values),
+      [&start](const std::string& value) { return StartsWith(value, start); });
+}
+
+bool StartsWithAny(const std::string& value,
+                   const std::vector<std::string>& startings) {
+  return std::any_of(std::begin(startings), std::end(startings),
+                     [&value](const std::string& starting) {
+                       return StartsWith(value, starting);
+                     });
+}
+
+bool EndsWithAny(const std::string& value,
+                 const std::vector<std::string>& endings) {
+  return std::any_of(
+      std::begin(endings), std::end(endings),
+      [&value](const std::string& ending) { return EndsWith(value, ending); });
+}
+
+bool FindAnyPartial(const std::string& value,
+                    const std::vector<std::string>& values) {
+  return std::any_of(std::begin(values), std::end(values),
+                     [&value](const std::string& v) {
+                       return value.find(v) != std::string::npos;
+                     });
+}
+
+std::string GetDirName(std::string path) {
+
+  ReplaceAll(path, "\\", "/");
+  if (path.size() && path.back() == '/')
+    path.pop_back();
+  size_t last_slash = path.find_last_of('/');
+  if (last_slash == std::string::npos)
+    return "./";
+  return path.substr(0, last_slash + 1);
+}
+
+std::string GetBaseName(const std::string& path) {
+  size_t last_slash = path.find_last_of('/');
+  if (last_slash != std::string::npos && (last_slash + 1) < path.size())
+    return path.substr(last_slash + 1);
+  return path;
+}
+
+std::string StripFileType(const std::string& path) {
+  size_t last_period = path.find_last_of('.');
+  if (last_period != std::string::npos)
+    return path.substr(0, last_period);
+  return path;
+}
+
+// See http://stackoverflow.com/a/29752943
+std::string ReplaceAll(const std::string& source,
+                       const std::string& from,
+                       const std::string& to) {
+  std::string result;
+  result.reserve(source.length());  // avoids a few memory allocations
+
+  std::string::size_type last_pos = 0;
+  std::string::size_type find_pos;
+
+  while (std::string::npos != (find_pos = source.find(from, last_pos))) {
+    result.append(source, last_pos, find_pos - last_pos);
+    result += to;
+    last_pos = find_pos + from.length();
+  }
+
+  // Care for the rest after last occurrence
+  result += source.substr(last_pos);
+
+  return result;
+}
+
+std::vector<std::string> SplitString(const std::string& str,
+                                     const std::string& delimiter) {
+  // http://stackoverflow.com/a/13172514
+  std::vector<std::string> strings;
+
+  std::string::size_type pos = 0;
+  std::string::size_type prev = 0;
+  while ((pos = str.find(delimiter, prev)) != std::string::npos) {
+    strings.emplace_back(str.substr(prev, pos - prev));
+    prev = pos + 1;
+  }
+
+  // To get the last substring (or only, if delimiter is not found)
+  strings.emplace_back(str.substr(prev));
+
+  return strings;
+}
+
+void EnsureEndsInSlash(std::string& path) {
+  if (path.empty() || path[path.size() - 1] != '/')
+    path += '/';
+}
+
+std::string EscapeFileName(std::string path) {
+  if (path.size() && path.back() == '/')
+    path.pop_back();
+  std::replace(path.begin(), path.end(), '\\', '@');
+  std::replace(path.begin(), path.end(), '/', '@');
+  std::replace(path.begin(), path.end(), ':', '@');
+  return path;
+}
+
+// http://stackoverflow.com/a/6089413
+std::istream& SafeGetline(std::istream& is, std::string& t) {
+  t.clear();
+
+  // The characters in the stream are read one-by-one using a std::streambuf.
+  // That is faster than reading them one-by-one using the std::istream. Code
+  // that uses streambuf this way must be guarded by a sentry object. The sentry
+  // object performs various tasks, such as thread synchronization and updating
+  // the stream state.
+
+  std::istream::sentry se(is, true);
+  std::streambuf* sb = is.rdbuf();
+
+  for (;;) {
+    int c = sb->sbumpc();
+    if (c == EOF) {
+      // Also handle the case when the last line has no line ending
+      if (t.empty())
+        is.setstate(std::ios::eofbit);
+      return is;
+    }
+
+    t += (char)c;
+
+    if (c == '\n')
+      return is;
+  }
+}
+
+bool FileExists(const std::string& filename) {
+  std::ifstream cache(filename);
+  return cache.is_open();
+}
+
+boost::optional<std::string> ReadContent(const AbsolutePath& filename) {
+
+  std::ifstream cache;
+  cache.open(filename.path);
+
+  try {
+    return std::string(std::istreambuf_iterator<char>(cache),
+                       std::istreambuf_iterator<char>());
+  } catch (std::ios_base::failure&) {
+    return {};
+  }
+}
+
+std::vector<std::string> ReadLinesWithEnding(const AbsolutePath& filename) {
+  std::vector<std::string> result;
+
+  std::ifstream input(filename.path);
+  for (std::string line; SafeGetline(input, line);)
+    result.emplace_back(line);
+
+  return result;
+}
+
+bool WriteToFile(const std::string& filename, const std::string& content) {
+  std::ofstream file(filename,
+                     std::ios::out | std::ios::trunc | std::ios::binary);
+  if (!file.good()) {
+
+    return false;
+  }
+
+  file << content;
+  return true;
+}
+
+
+std::string FormatMicroseconds(long long microseconds) {
+  long long milliseconds = microseconds / 1000;
+  long long remaining = microseconds - milliseconds;
+
+  // Only show two digits after the dot.
+  while (remaining >= 100)
+    remaining /= 10;
+
+  return std::to_string(milliseconds) + "." + std::to_string(remaining) + "ms";
+}
+
+
+
+std::string UpdateToRnNewlines(std::string output) {
+  size_t idx = 0;
+  while (true) {
+    idx = output.find('\n', idx);
+
+    // No more matches.
+    if (idx == std::string::npos)
+      break;
+
+    // Skip an existing "\r\n" match.
+    if (idx > 0 && output[idx - 1] == '\r') {
+      ++idx;
+      continue;
+    }
+
+    // Replace "\n" with "\r|n".
+    output.replace(output.begin() + idx, output.begin() + idx + 1, "\r\n");
+  }
+
+  return output;
+}
+
+
+
+bool IsAbsolutePath(const std::string& path) {
+  return IsUnixAbsolutePath(path) || IsWindowsAbsolutePath(path);
+}
+
+bool IsUnixAbsolutePath(const std::string& path) {
+  return !path.empty() && path[0] == '/';
+}
+
+bool IsWindowsAbsolutePath(const std::string& path) {
+  auto is_drive_letter = [](char c) {
+    return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
+  };
+
+  return path.size() > 3 && path[1] == ':' &&
+         (path[2] == '/' || path[2] == '\\') && is_drive_letter(path[0]);
+}
+
+bool IsDirectory(const std::string& path) {
+  struct stat path_stat;
+
+  if (stat(path.c_str(), &path_stat) != 0) {
+    perror("cannot access path");
+    return false;
+  }
+
+  return path_stat.st_mode & S_IFDIR;
+}
+
+
+std::string ws2s(std::wstring const& wstr) {
+
+	std::string narrow;
+	utf8::utf32to8(wstr.begin(), wstr.end(), std::back_inserter(narrow));
+	return narrow;
+}
+std::wstring s2ws(const std::string& str) {
+	std::wstring wide;
+	utf8::utf8to32(str.begin(), str.end(), std::back_inserter(wide));
+	return wide;
+}
+
+
+#ifdef _WIN32
+
+#else
+// Returns the canonicalized absolute pathname, without expanding symbolic
+// links. This is a variant of realpath(2), C++ rewrite of
+// https://github.com/freebsd/freebsd/blob/master/lib/libc/stdlib/realpath.c
+AbsolutePath RealPathNotExpandSymlink(std::string path,
+	bool ensure_exists) {
+	if (path.empty()) {
+		errno = EINVAL;
+		return {};
+	}
+	if (path[0] == '\0') {
+		errno = ENOENT;
+		return {};
+	}
+
+	// Do not use PATH_MAX because it is tricky on Linux.
+	// See https://eklitzke.org/path-max-is-tricky
+	char tmp[1024];
+	std::string resolved;
+	size_t i = 0;
+	struct stat sb;
+	if (path[0] == '/') {
+		resolved = "/";
+		i = 1;
+	}
+	else {
+		if (!getcwd(tmp, sizeof tmp) && ensure_exists)
+			return {};
+		resolved = tmp;
+	}
+
+	while (i < path.size()) {
+		auto j = path.find('/', i);
+		if (j == std::string::npos)
+			j = path.size();
+		auto next_token = path.substr(i, j - i);
+		i = j + 1;
+		if (resolved.back() != '/')
+			resolved += '/';
+		if (next_token.empty() || next_token == ".") {
+			// Handle consequential slashes and "."
+			continue;
+		}
+		else if (next_token == "..") {
+			// Strip the last path component except when it is single "/"
+			if (resolved.size() > 1)
+				resolved.resize(resolved.rfind('/', resolved.size() - 2) + 1);
+			continue;
+		}
+		// Append the next path component.
+		// Here we differ from realpath(3), we use stat(2) instead of
+		// lstat(2) because we do not want to resolve symlinks.
+		resolved += next_token;
+		if (stat(resolved.c_str(), &sb) != 0 && ensure_exists)
+			return {};
+		if (!S_ISDIR(sb.st_mode) && j < path.size() && ensure_exists) {
+			errno = ENOTDIR;
+			return {};
+		}
+	}
+
+	// Remove trailing slash except when a single "/".
+	if (resolved.size() > 1 && resolved.back() == '/')
+		resolved.pop_back();
+	return AbsolutePath(resolved, true /*validate*/);
+}
+#endif
+
+
+AbsolutePath NormalizePath(const std::string& path0,
+	bool ensure_exists ,
+	bool force_lower_on_windows) {
+#ifdef _WIN32
+
+	std::wstring path = lsp::s2ws(path0);
+
+	wchar_t buffer[MAX_PATH] = (L"");
+
+	// Normalize the path name, ie, resolve `..`.
+	unsigned long len = GetFullPathNameW(path.c_str(), MAX_PATH, buffer, nullptr);
+	if (!len)
+		return {};
+	path = std::wstring(buffer, len);
+
+	// Get the actual casing of the path, ie, if the file on disk is `C:\FooBar`
+	// and this function is called with `c:\fooBar` this will return `c:\FooBar`.
+	// (drive casing is lowercase).
+	if (ensure_exists) {
+		len = GetLongPathNameW(path.c_str(), buffer, MAX_PATH);
+		if (!len)
+			return {};
+		path = std::wstring(buffer, len);
+	}
+
+	// Empty paths have no meaning.
+	if (path.empty())
+		return {};
+
+	// We may need to normalize the drive name to upper-case; at the moment
+	// vscode sends lower-case path names.
+	/*
+	path[0] = toupper(path[0]);
+	*/
+	// Make the path all lower-case, since windows is case-insensitive.
+	if (force_lower_on_windows) {
+		for (size_t i = 0; i < path.size(); ++i)
+			path[i] = (wchar_t)tolower(path[i]);
+	}
+
+	// cquery assumes forward-slashes.
+	std::replace(path.begin(), path.end(), '\\', '/');
+
+
+	return AbsolutePath(lsp::ws2s(path), false /*validate*/);
+#else
+
+	return RealPathNotExpandSymlink(path0, ensure_exists);
+
+#endif
+
+
+}
+
+// VSCode (UTF-16) disagrees with Emacs lsp-mode (UTF-8) on how to represent
+// text documents.
+// We use a UTF-8 iterator to approximate UTF-16 in the specification (weird).
+// This is good enough and fails only for UTF-16 surrogate pairs.
+int GetOffsetForPosition(lsPosition position, const std::string& content) {
+	size_t i = 0;
+	// Iterate lines until we have found the correct line.
+	while (position.line > 0 && i < content.size()) {
+		if (content[i] == '\n')
+			position.line--;
+		i++;
+	}
+	// Iterate characters on the target line.
+	while (position.character > 0 && i < content.size()) {
+		if (uint8_t(content[i++]) >= 128) {
+			// Skip 0b10xxxxxx
+			while (i < content.size() && uint8_t(content[i]) >= 128 &&
+				uint8_t(content[i]) < 192)
+				i++;
+		}
+		position.character--;
+	}
+	return int(i);
+}
+
+
+lsPosition GetPositionForOffset(size_t offset,const  std::string& content) {
+	lsPosition result;
+	for (size_t i = 0; i < offset && i < content.length(); ++i) {
+		if (content[i] == '\n') {
+			result.line++;
+			result.character = 0;
+		}
+		else {
+			result.character++;
+		}
+	}
+	return result;
+}
+
+lsPosition CharPos(const  std::string& search,
+	char character,
+	int character_offset) {
+	lsPosition result;
+	size_t index = 0;
+	while (index < search.size()) {
+		char c = search[index];
+		if (c == character)
+			break;
+		if (c == '\n') {
+			result.line += 1;
+			result.character = 0;
+		}
+		else {
+			result.character += 1;
+		}
+		++index;
+	}
+	assert(index < search.size());
+	result.character += character_offset;
+	return result;
+}
+
+void scanDirsUseRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret)
+{
+	namespace fs = boost::filesystem;
+	fs::path fullpath(rootPath);
+	if (!fs::exists(fullpath)) { return; }
+	fs::recursive_directory_iterator end_iter;
+	for (fs::recursive_directory_iterator iter(fullpath); iter != end_iter; iter++) {
+		try {
+			if (fs::is_directory(*iter)) {
+				ret.push_back(iter->path().wstring());
+			}
+		}
+		catch (const std::exception& ex) {
+			continue;
+		}
+	}
+}
+
+void scanDirsNoRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret)
+{
+	namespace fs = boost::filesystem;
+	boost::filesystem::path myPath(rootPath);
+	if (!fs::exists(rootPath)) { return; }
+	boost::filesystem::directory_iterator endIter;
+	for (boost::filesystem::directory_iterator iter(myPath); iter != endIter; iter++) {
+		if (boost::filesystem::is_directory(*iter)) {
+			ret.push_back(iter->path().wstring());
+		}
+	}
+}
+
+void scanFilesUseRecursive(
+	const std::wstring& rootPath,
+	std::vector<std::wstring>& ret,
+	std::wstring suf) {
+	namespace fs = boost::filesystem;
+	boost::to_lower(suf);
+
+	fs::path fullpath(rootPath);
+	if (!fs::exists(fullpath)) { return; }
+	fs::recursive_directory_iterator end_iter;
+	for (fs::recursive_directory_iterator iter(fullpath); iter != end_iter; iter++) {
+		try {
+			if (!fs::is_directory(*iter) && fs::is_regular_file(*iter)) {
+				auto temp_path = iter->path().wstring();
+				auto size = suf.size();
+				if (!size)
+				{
+					ret.push_back(std::move(temp_path));
+				}
+				else
+				{
+
+					if (temp_path.size() < size) continue;
+					auto suf_temp = temp_path.substr(temp_path.size() - size);
+					boost::to_lower(suf_temp);
+					if (suf_temp == suf)
+					{
+						ret.push_back(std::move(temp_path));
+					}
+				}
+			}
+		}
+		catch (const std::exception&) {
+			continue;
+		}
+	}
+}
+
+void scanFileNamesUseRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret,
+	std::wstring strSuf)
+{
+	scanFilesUseRecursive(rootPath, ret, strSuf);
+	std::vector<std::wstring> names;
+	for (auto& it : ret)
+	{
+		if (it.size() >= rootPath.size())
+		{
+			names.push_back(it.substr(rootPath.size()));
+		}
+	}
+	ret.swap(names);
+}
+
+void scanFileNamesUseRecursive(const std::string& rootPath, std::vector<std::string>& ret, std::string strSuf)
+{
+	std::vector<std::wstring> out;
+	scanFileNamesUseRecursive(s2ws(rootPath), out, s2ws(strSuf));
+	for (auto& it : out)
+	{
+		ret.push_back(ws2s(it));
+	}
+}
+
+void scanFilesUseRecursive(const std::string& rootPath, std::vector<std::string>& ret, std::string strSuf)
+{
+	std::vector<std::wstring> out;
+	scanFilesUseRecursive(s2ws(rootPath), out, s2ws(strSuf));
+	for (auto& it : out)
+	{
+		ret.push_back(ws2s(it));
+	}
+}
+
+
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/utils.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/utils.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/utils.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/utils.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,141 @@
+#pragma once
+#include <algorithm>
+#include <codecvt>
+#include <functional>
+#include <iterator>
+#include <locale>
+#include <memory>
+#include <string>
+#include <vector>
+#include <boost/optional/optional.hpp>
+#include <LibLsp/lsp/AbsolutePath.h>
+
+#include "lsPosition.h"
+
+
+namespace lsp
+{
+	
+
+// Returns true if |value| starts/ends with |start| or |ending|.
+bool StartsWith(std::string value, std::string start);
+bool EndsWith(std::string value, std::string ending);
+bool AnyStartsWith(const std::vector<std::string>& values,
+                   const std::string& start);
+bool StartsWithAny(const std::string& value,
+                   const std::vector<std::string>& startings);
+bool EndsWithAny(const std::string& value,
+                 const std::vector<std::string>& endings);
+bool FindAnyPartial(const std::string& value,
+                    const std::vector<std::string>& values);
+// Returns the dirname of |path|, i.e. "foo/bar.cc" => "foo/", "foo" => "./",
+// "/foo" => "/". The result always ends in '/'.
+std::string GetDirName(std::string path);
+// Returns the basename of |path|, ie, "foo/bar.cc" => "bar.cc".
+std::string GetBaseName(const std::string& path);
+// Returns |path| without the filetype, ie, "foo/bar.cc" => "foo/bar".
+std::string StripFileType(const std::string& path);
+
+std::string ReplaceAll(const std::string& source,
+                       const std::string& from,
+                       const std::string& to);
+
+std::vector<std::string> SplitString(const std::string& str,
+                                     const std::string& delimiter);
+
+template <typename TValues, typename TMap>
+std::string StringJoinMap(const TValues& values,
+                          const TMap& map,
+                          const std::string& sep = ", ") {
+  std::string result;
+  bool first = true;
+  for (auto& entry : values) {
+    if (!first)
+      result += sep;
+    first = false;
+    result += map(entry);
+  }
+  return result;
+}
+
+template <typename TValues>
+std::string StringJoin(const TValues& values, const std::string& sep = ", ") {
+  return StringJoinMap(values, [](const std::string& entry) { return entry; },
+                       sep);
+}
+
+template <typename TCollection, typename TValue>
+bool ContainsValue(const TCollection& collection, const TValue& value) {
+  return std::find(std::begin(collection), std::end(collection), value) !=
+         std::end(collection);
+}
+
+
+// Ensures that |path| ends in a slash.
+void EnsureEndsInSlash(std::string& path);
+
+// Converts a file path to one that can be used as filename.
+// e.g. foo/bar.c => foo_bar.c
+std::string EscapeFileName(std::string path);
+
+// FIXME: Move ReadContent into ICacheManager?
+bool FileExists(const std::string& filename);
+boost::optional<std::string> ReadContent(const AbsolutePath& filename);
+std::vector<std::string> ReadLinesWithEnding(const AbsolutePath& filename);
+
+bool WriteToFile(const std::string& filename, const std::string& content);
+
+
+template <typename T, typename Fn>
+void RemoveIf(std::vector<T>* vec, Fn predicate) {
+  vec->erase(std::remove_if(vec->begin(), vec->end(), predicate), vec->end());
+}
+
+std::string FormatMicroseconds(long long microseconds);
+
+// Makes sure all newlines in |output| are in \r\n format.
+std::string UpdateToRnNewlines(std::string output);
+
+// Utility methods to check if |path| is absolute.
+bool IsAbsolutePath(const std::string& path);
+bool IsUnixAbsolutePath(const std::string& path);
+bool IsWindowsAbsolutePath(const std::string& path);
+
+bool IsDirectory(const std::string& path);
+
+// string <-> wstring conversion (UTF-16), e.g. for use with Window's wide APIs.
+ std::string ws2s(std::wstring const& wstr);
+ std::wstring s2ws(std::string const& str);
+
+AbsolutePath NormalizePath(const std::string& path,
+                            bool ensure_exists = true,
+                            bool force_lower_on_windows = true);
+
+
+int GetOffsetForPosition(lsPosition position, const std::string& content);
+
+// Finds the position for an |offset| in |content|.
+lsPosition GetPositionForOffset(int offset, const std::string& content);
+
+// Utility method to find a position for the given character.
+lsPosition CharPos(const std::string& search,
+    char character,
+    int character_offset = 0);
+
+
+ void scanDirsNoRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret);
+
+ void scanFilesUseRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret,
+    std::wstring strSuf = L"");
+
+ void scanFileNamesUseRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret,
+    std::wstring strSuf = L"");
+ void scanFileNamesUseRecursive(const std::string& rootPath, std::vector<std::string>& ret,
+    std::string strSuf = "");
+
+ void scanFilesUseRecursive(const std::string& rootPath, std::vector<std::string>& ret,
+    std::string strSuf = "");
+
+ void scanDirsUseRecursive(const std::wstring& rootPath, std::vector<std::wstring>& ret);
+
+}


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/utils.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/windows/MessageNotify.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/windows/MessageNotify.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/windows/MessageNotify.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,83 @@
+#pragma once
+
+#include "LibLsp/JsonRpc/NotificationInMessage.h"
+#include "LibLsp/JsonRpc/RequestInMessage.h"
+#include "LibLsp/JsonRpc/lsResponseMessage.h"
+
+// Show a message to the user.
+enum class lsMessageType : int { Error = 1, Warning = 2, Info = 3, Log = 4 };
+MAKE_REFLECT_TYPE_PROXY(lsMessageType)
+struct MessageParams {
+/**
+  * The message type.
+ */
+	
+	lsMessageType type = lsMessageType::Error;
+	
+/**
+ * The actual message.
+ */
+	std::string message;
+	
+	void swap(MessageParams& arg) noexcept {
+		lsMessageType temp = type;
+		type = arg.type;
+		arg.type = temp;
+		message.swap(arg.message);
+	}
+};
+MAKE_REFLECT_STRUCT(MessageParams, type, message)
+
+ /**
+  * The log message notification is send from the server to the client to ask
+  * the client to log a particular message.
+  */
+DEFINE_NOTIFICATION_TYPE(Notify_LogMessage, MessageParams, "window/logMessage")
+
+
+/**
+ * The show message notification is sent from a server to a client to ask
+ * the client to display a particular message in the user interface.
+ */
+DEFINE_NOTIFICATION_TYPE(Notify_ShowMessage, MessageParams, "window/showMessage")
+
+
+
+/**
+ * The show message request is sent from a server to a client to ask the client to display a particular message in the
+ * user class. In addition to the show message notification the request allows to pass actions and to wait for an
+ * answer from the client.
+ */
+struct MessageActionItem {
+	/**
+	 * A short title like 'Retry', 'Open Log' etc.
+	 */
+
+	std::string title;
+	MAKE_SWAP_METHOD(MessageActionItem, title)
+};
+MAKE_REFLECT_STRUCT(MessageActionItem, title);
+
+
+struct ShowMessageRequestParams :public MessageParams {
+	/**
+	 * The message action items to present.
+	 */
+	std::vector<MessageActionItem> actions;
+	
+	MAKE_SWAP_METHOD(ShowMessageRequestParams, type, message, actions)
+
+};
+MAKE_REFLECT_STRUCT(ShowMessageRequestParams, type, message, actions)
+
+/**
+* The show message request is sent from a server to a client to ask the
+* client to display a particular message in the user interface. In addition
+* to the show message notification the request allows to pass actions and
+* to wait for an answer from the client.
+*/
+
+DEFINE_REQUEST_RESPONSE_TYPE(WindowShowMessage, ShowMessageRequestParams, MessageActionItem, "window/showMessage")
+
+
+


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/windows/MessageNotify.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/working_files.cpp
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/working_files.cpp	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/working_files.cpp	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,186 @@
+#include "working_files.h"
+#include <algorithm>
+#include <climits>
+#include <numeric>
+#include "utils.h"
+#include <memory>
+#include "LibLsp/lsp/AbsolutePath.h"
+using namespace lsp;
+struct WorkingFilesData
+{
+    std::map<AbsolutePath, std::shared_ptr<WorkingFile> > files;
+    std::mutex files_mutex;  // Protects |d_ptr->files|.
+};
+
+WorkingFile::WorkingFile(WorkingFiles& _parent, const AbsolutePath& filename,
+                         const std::string& buffer_content)
+  : filename(filename), directory(filename), parent(_parent), counter(0), buffer_content(buffer_content)
+{
+       directory = Directory(GetDirName(filename.path));
+}
+
+WorkingFile::WorkingFile(WorkingFiles& _parent, const AbsolutePath& filename,
+                         std::string&& buffer_content)
+  : filename(filename), directory(filename), parent(_parent), counter(0), buffer_content(buffer_content)
+{
+    directory = Directory(GetDirName(filename.path));
+}
+
+WorkingFiles::WorkingFiles():d_ptr(new WorkingFilesData())
+{
+}
+
+WorkingFiles::~WorkingFiles()
+{
+    delete d_ptr;
+
+}
+
+
+
+void WorkingFiles::CloseFilesInDirectory(const std::vector<Directory>& directories)
+{
+    std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+    std::vector<AbsolutePath> files_to_be_delete;
+
+    for(auto& it : d_ptr->files)
+    {
+        for (auto& dir : directories)
+        {
+            if (it.second->directory == dir) {
+                files_to_be_delete.emplace_back(it.first);
+            }
+        }
+    }
+
+    for(auto& it : files_to_be_delete)
+    {
+        d_ptr->files.erase(it);
+    }
+}
+
+
+
+
+std::shared_ptr<WorkingFile> WorkingFiles::GetFileByFilename(const AbsolutePath& filename) {
+  std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+  return GetFileByFilenameNoLock(filename);
+}
+
+std::shared_ptr<WorkingFile> WorkingFiles::GetFileByFilenameNoLock(
+    const AbsolutePath& filename) {
+    const auto findIt = d_ptr->files.find(filename);
+    if ( findIt != d_ptr->files.end())
+    {
+        return findIt->second;
+    }
+  return nullptr;
+}
+
+
+
+std::shared_ptr<WorkingFile>  WorkingFiles::OnOpen( lsTextDocumentItem& open) {
+  std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+
+  AbsolutePath filename = open.uri.GetAbsolutePath();
+
+  // The file may already be open.
+  if (auto file = GetFileByFilenameNoLock(filename)) {
+    file->version = open.version;
+    file->buffer_content.swap(open.text);
+
+    return file;
+  }
+
+  const auto& it =  d_ptr->files.insert({ filename,std::make_shared<WorkingFile>(*this,filename, std::move(open.text)) });
+  return  it.first->second;
+}
+
+
+std::shared_ptr<WorkingFile>  WorkingFiles::OnChange(const lsTextDocumentDidChangeParams& change) {
+  std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+
+  AbsolutePath filename = change.textDocument.uri.GetAbsolutePath();
+  auto file = GetFileByFilenameNoLock(filename);
+  if (!file) {
+    return {};
+  }
+
+  if (change.textDocument.version)
+    file->version = *change.textDocument.version;
+  file->counter.fetch_add(1, std::memory_order_relaxed);
+  for (const lsTextDocumentContentChangeEvent& diff : change.contentChanges) {
+    // Per the spec replace everything if the rangeLength and range are not set.
+    // See https://github.com/Microsoft/language-server-protocol/issues/9.
+    if (!diff.range) {
+      file->buffer_content = diff.text;
+
+    } else {
+      int start_offset =
+          GetOffsetForPosition(diff.range->start, file->buffer_content);
+      // Ignore TextDocumentContentChangeEvent.rangeLength which causes trouble
+      // when UTF-16 surrogate pairs are used.
+      int end_offset =
+          GetOffsetForPosition(diff.range->end, file->buffer_content);
+      file->buffer_content.replace(file->buffer_content.begin() + start_offset,
+          file->buffer_content.begin() + end_offset,
+                                   diff.text);
+
+    }
+  }
+  return  file;
+}
+
+bool WorkingFiles::OnClose(const lsTextDocumentIdentifier& close) {
+  std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+
+  AbsolutePath filename = close.uri.GetAbsolutePath();
+  const auto findIt = d_ptr->files.find(filename);
+  if( findIt != d_ptr->files.end())
+  {
+      d_ptr->files.erase(findIt);
+	  return true;
+  }
+  return false;
+}
+
+std::shared_ptr<WorkingFile> WorkingFiles::OnSave(const lsTextDocumentIdentifier& _save)
+{
+    std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+
+    AbsolutePath filename = _save.uri.GetAbsolutePath();
+    const auto findIt = d_ptr->files.find(filename);
+    if (findIt != d_ptr->files.end())
+    {
+        std::shared_ptr<WorkingFile>& file = findIt->second;
+        lsp::WriteToFile(file->filename, file->GetContentNoLock());
+        return findIt->second;
+    }
+    return  {};
+
+}
+
+bool WorkingFiles::GetFileBufferContent(std::shared_ptr<WorkingFile>&file, std::string& out)
+{
+    std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+    if (file)
+    {
+        out = file->buffer_content;
+        return  true;
+    }
+    return  false;
+}
+bool WorkingFiles::GetFileBufferContent(std::shared_ptr<WorkingFile>& file, std::wstring& out)
+{
+    std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+    if (file)
+    {
+        out = lsp::s2ws(file->buffer_content);
+        return  true;
+    }
+    return  false;
+}
+void  WorkingFiles::Clear() {
+    std::lock_guard<std::mutex> lock(d_ptr->files_mutex);
+    d_ptr->files.clear();
+}
\ No newline at end of file


Property changes on: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/working_files.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/working_files.h
===================================================================
--- trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/working_files.h	                        (rev 0)
+++ trunk/Build/source/utils/asymptote/LspCpp/LibLsp/lsp/working_files.h	2022-01-08 18:39:01 UTC (rev 61532)
@@ -0,0 +1,72 @@
+#pragma once
+
+#include "LibLsp/lsp/lsp_diagnostic.h"
+#include "LibLsp/lsp/AbsolutePath.h"
+#include "LibLsp/lsp/textDocument/did_change.h"
+#include "LibLsp/lsp/textDocument/did_close.h"
+#include "LibLsp/lsp/textDocument/did_open.h"
+#include <mutex>
+#include <string>
+#include <memory>
+#include "Directory.h"
+
+struct WorkingFiles;
+struct WorkingFilesData;
+struct WorkingFile {
+
+    int version = 0;
+    AbsolutePath filename;
+    Directory directory;
+    WorkingFiles& parent;
+    std::atomic<long long> counter;
+    WorkingFile(WorkingFiles& ,const AbsolutePath& filename, const std::string& buffer_content);
+    WorkingFile(WorkingFiles&, const AbsolutePath& filename, std::string&& buffer_content);
+    const std::string&  GetContentNoLock() const
+    {
+        return  buffer_content;
+    }
+protected:
+    friend struct WorkingFiles;
+    std::string buffer_content;
+};
+
+struct WorkingFiles {
+
+  WorkingFiles();
+  ~WorkingFiles();
+
+  void  CloseFilesInDirectory(const std::vector<Directory>&);
+  std::shared_ptr<WorkingFile>  OnOpen(lsTextDocumentItem& open);
+  std::shared_ptr<WorkingFile>  OnChange(const lsTextDocumentDidChangeParams& change);
+  bool  OnClose(const lsTextDocumentIdentifier& close);
+  std::shared_ptr<WorkingFile>  OnSave(const lsTextDocumentIdentifier& _save);
+
+  bool GetFileBufferContent(const AbsolutePath& filename, std::wstring& out)
+  {
+      auto  file = GetFileByFilename(filename);
+  	  if(!file)
+          return false;
+	return GetFileBufferContent(file, out);
+  }
+  bool  GetFileBufferContent(const AbsolutePath& filename,std::string& out)
+  {
+      auto  file = GetFileByFilename(filename);
+      if (!file)
+          return false;
+      return GetFileBufferContent(file, out);
+  }
+  bool  GetFileBufferContent(std::shared_ptr<WorkingFile>&, std::string& out);
+  bool  GetFileBufferContent(std::shared_ptr<WorkingFile>&, std::wstring& out);
+
+
+  // Find the file with the given filename.
+  std::shared_ptr<WorkingFile>   GetFileByFilename(const AbsolutePath& filename);
+
+  void Clear();
+private:

@@ Diff output truncated at 1234567 characters. @@


More information about the tex-live-commits mailing list.