diff --git a/common/workunit/workunit.cpp b/common/workunit/workunit.cpp index b64b563b8f8..4645d1f3c9e 100644 --- a/common/workunit/workunit.cpp +++ b/common/workunit/workunit.cpp @@ -8500,7 +8500,9 @@ void CLocalWorkUnit::copyWorkUnit(IConstWorkUnit *cached, bool copyStats, bool a bool CLocalWorkUnit::hasDebugValue(const char *propname) const { StringBuffer lower; - lower.append(propname).toLowerCase(); + lower.append(propname); + if (!strchr(lower, ':')) + lower.toLowerCase(); CriticalBlock block(crit); StringBuffer prop("Debug/"); return p->hasProp(prop.append(lower)); @@ -8509,7 +8511,9 @@ bool CLocalWorkUnit::hasDebugValue(const char *propname) const IStringVal& CLocalWorkUnit::getDebugValue(const char *propname, IStringVal &str) const { StringBuffer lower; - lower.append(propname).toLowerCase(); + lower.append(propname); + if (!strchr(lower, ':')) + lower.toLowerCase(); CriticalBlock block(crit); StringBuffer prop("Debug/"); str.set(p->queryProp(prop.append(lower).str())); @@ -8528,7 +8532,9 @@ IStringIterator& CLocalWorkUnit::getDebugValues(const char *prop) const if (prop) { StringBuffer lower; - lower.append(prop).toLowerCase(); + lower.append(prop); + if (!strchr(lower, ':')) + lower.toLowerCase(); path.append(lower); } else @@ -8539,7 +8545,9 @@ IStringIterator& CLocalWorkUnit::getDebugValues(const char *prop) const int CLocalWorkUnit::getDebugValueInt(const char *propname, int defVal) const { StringBuffer lower; - lower.append(propname).toLowerCase(); + lower.append(propname); + if (!strchr(lower, ':')) + lower.toLowerCase(); CriticalBlock block(crit); StringBuffer prop("Debug/"); prop.append(lower); @@ -8549,7 +8557,9 @@ int CLocalWorkUnit::getDebugValueInt(const char *propname, int defVal) const __int64 CLocalWorkUnit::getDebugValueInt64(const char *propname, __int64 defVal) const { StringBuffer lower; - lower.append(propname).toLowerCase(); + lower.append(propname); + if (!strchr(lower, ':')) + lower.toLowerCase(); CriticalBlock block(crit); StringBuffer prop("Debug/"); prop.append(lower); @@ -8559,7 +8569,9 @@ __int64 CLocalWorkUnit::getDebugValueInt64(const char *propname, __int64 defVal) double CLocalWorkUnit::getDebugValueReal(const char *propname, double defVal) const { StringBuffer lower; - lower.append(propname).toLowerCase(); + lower.append(propname); + if (!strchr(lower, ':')) + lower.toLowerCase(); CriticalBlock block(crit); StringBuffer prop("Debug/"); prop.append(lower); @@ -8569,7 +8581,9 @@ double CLocalWorkUnit::getDebugValueReal(const char *propname, double defVal) co bool CLocalWorkUnit::getDebugValueBool(const char * propname, bool defVal) const { StringBuffer lower; - lower.append(propname).toLowerCase(); + lower.append(propname); + if (!strchr(lower, ':')) + lower.toLowerCase(); CriticalBlock block(crit); StringBuffer prop("Debug/"); prop.append(lower); @@ -8642,7 +8656,9 @@ void CLocalWorkUnit::addProcess(const char *type, const char *instance, unsigned void CLocalWorkUnit::setDebugValue(const char *propname, const char *value, bool overwrite) { StringBuffer lower; - lower.append(propname).toLowerCase(); + lower.append(propname); + if (!strchr(lower, ':')) + lower.toLowerCase(); CriticalBlock block(crit); StringBuffer prop("Debug/"); prop.append(lower); @@ -8657,7 +8673,9 @@ void CLocalWorkUnit::setDebugValue(const char *propname, const char *value, bool void CLocalWorkUnit::setDebugValueInt(const char *propname, int value, bool overwrite) { StringBuffer lower; - lower.append(propname).toLowerCase(); + lower.append(propname); + if (!strchr(lower, ':')) + lower.toLowerCase(); CriticalBlock block(crit); StringBuffer prop("Debug/"); prop.append(lower); diff --git a/configuration/configmgr/configmgrlib/EnvironmentNode.cpp b/configuration/configmgr/configmgrlib/EnvironmentNode.cpp index 521a93b661d..3087aacadc9 100644 --- a/configuration/configmgr/configmgrlib/EnvironmentNode.cpp +++ b/configuration/configmgr/configmgrlib/EnvironmentNode.cpp @@ -30,18 +30,17 @@ void EnvironmentNode::addChild(std::shared_ptr pNode) bool EnvironmentNode::removeChild(const std::shared_ptr pNode, std::vector &removedNodeIds) { - bool removed = false; - for (auto it=m_children.begin(); it!= m_children.end() && !removed; ++it) + for (auto it=m_children.begin(); it!= m_children.end(); ++it) { if (pNode == it->second) { pNode->removeAllChildren(removedNodeIds); removedNodeIds.emplace_back(pNode->getId()); m_children.erase(it); - removed = true; + return true; } } - return removed; + return false; } diff --git a/devdoc/.vitepress/config.js b/devdoc/.vitepress/config.js index 5512a34db98..518d6f2929e 100644 --- a/devdoc/.vitepress/config.js +++ b/devdoc/.vitepress/config.js @@ -3,7 +3,8 @@ export default { description: 'The HPCC-Platform from hpccsystems is an open source system for big data analysis. It uses a single language, platform and architecture to process data efficiently and fast.', base: '/HPCC-Platform/', srcDir: '..', - srcExclude: ["build/**", "dockerfiles/**", "docs/**", "esp/**", "helm/**", "initfiles/**", "plugins/**", "vcpkg/**" ], + srcExclude: ["build/**", "dockerfiles/**", "docs/**", "esp/**", "helm/**", "initfiles/**", "plugins/**", "vcpkg/**"], + ignoreDeadLinks: true, themeConfig: { repo: "hpcc-systems/HPCC-Platform", diff --git a/devdoc/CodeSubmissions.md b/devdoc/CodeSubmissions.md index da821305f51..ad71ae9f019 100644 --- a/devdoc/CodeSubmissions.md +++ b/devdoc/CodeSubmissions.md @@ -37,40 +37,7 @@ Contributors should use the github reviewers section on the PR to request review Reviewers should check for PRs that are ready for their review via github's webpage (filter "review-requested:\") or via the github CLI (e.g. gh pr status). Contributors should similarly ensure they stay up to date with any comments on requests for change on their submissions. -## Target Version +## Target branch +The [Version support](VersionSupport.md) document contains details of the different versions that are supported, and which version should be targetted for different kinds of changes. Occasionally earlier branches will be chosen, (e.g. security fixes to even older versions) but they should always be carefully discussed (and documented). -We normally maintain 4 versions of the system - which means that each new major or minor release will typically be supported for a year. Once a new major or minor version goes gold it becomes the current version, and should not have any changes that change the behavior of queries. PRs should target the oldest appropriate branch, and once they are merged they will be automatically up-merged into later versions. Which branch should changes target? The following gives some examples and illustrates the version numbers assuming 8.12.x is the latest version. - -master: -- New features. -- Bug fixes that will change the semantics of existing queries or processes. -- Refactoring. -- Performance improvements (unless simple and safe) - -current(8.12.x): -- Bug fixes that only change behavior where it previously crashes or had undefined behavior (If well defined but wrong need to have very strong justification to change.) -- Fixes for race conditions (the behavior was previously indeterminate so less of an argument against it changing) -- Data corruption fixes - on a case by case basis if they change existing query results. -- Missing functionality that prevents features from working. -- Changes for tech-preview work that only effect those who are using it. -- Regressions. -- Improvements to logging and error messages (possibly in "previous" if simple and added to help diagnose problems). -- Occasional simple refactoring that makes up-merging simpler.. -- Changes to improve backward compatibility of new features. (E.g. adding an ignored syntax to the compiler.) -- Performance improvements - if simple and safe - -previous(8.10.x): -- Simple bug fixes that do not change behavior -- Simple changes for missing functionality -- Regressions with simple fixes (but care is needed if it caused a change in behavior) -- Serious regressions -- Complex security fixes - -security(8.8.x) -- Simple security fixes -- Complex security fixes if sufficiently serious - -deprecated(8.6.x) -- Serious security fixes - -Occasionally earlier branches will be chosen, (e.g. security fixes to even older versions) but they should always be carefully discussed (and documented). +Changes will always be upmerged into the next point release for all the more recent major and minor versions (and master). diff --git a/devdoc/VersionSupport.md b/devdoc/VersionSupport.md new file mode 100644 index 00000000000..4f5491c3f47 --- /dev/null +++ b/devdoc/VersionSupport.md @@ -0,0 +1,79 @@ +# Current versions + +| name | version | +| -------- | ------- | +| early | 9.2.0 | +| current | 9.0.x | +| previous | 8.12.x | +| critical | 8.10.x | +| security | 8.8.x | + +## Supported versions + +We release a new version of the platform every 3 months. If there are major changes in functionality, or significant backward compatibility issues then it will be tagged as a new major version, otherwise a new minor version. We normally maintain 4 versions of the system, which means that each new release will typically be supported for a year. Once a new major or minor version has been tagged gold it should not have any changes that change the behavior of queries. + +Which versions should changes be applied to? The following gives some examples of the types of changes and which version they would be most relevant to target. + +"master": +- New features. +- Bug fixes that will change the semantics of existing queries or processes. +- Refactoring. +- Performance improvements (unless simple and safe) + +"current": +- Bug fixes that only change behavior where it previously crashes or had undefined behavior (If well defined but wrong need to have very strong justification to change.) +- Fixes for race conditions (the behavior was previously indeterminate so less of an argument against it changing) +- Data corruption fixes - on a case by case basis if they change existing query results. +- Missing functionality that prevents features from working. +- Changes for tech-preview work that only effect those who are using it. +- Regressions. +- Improvements to logging and error messages (possibly in "previous" if simple and added to help diagnose problems). +- Occasional simple refactoring that makes up-merging simpler.. +- Changes to improve backward compatibility of new features. (E.g. adding an ignored syntax to the compiler.) +- Performance improvements - if simple and safe + +"previous": +- Simple bug fixes that do not change behavior +- Simple changes for missing functionality +- Regressions with simple fixes (but care is needed if it caused a change in behavior) +- Serious regressions +- Complex security fixes + +"critical" fixes only: +- Simple security fixes +- Complex security fixes if sufficiently serious + +"security" fixes only: +- Serious security fixes + +early: +- The first few point release of a new major or minor version may be less stable than later point releases. The security fix is still supported until any teething problems have been solved with the new version. + +Occasionally earlier branches will be chosen, (e.g. security fixes to even older versions) but they should always be carefully discussed (and documented). + +## Patches and images + +We aim to produce new point releases once a week. The point releases will contain + +a) Any changes to the code base for that branch. +b) Any security fixes for libraries that are project dependencies. We will upgrade to the latest point release for the library that fixes the security issue. +c) For the cloud any security fixes in the base image or the packages installed in that image. + +If there are no changes in any of those areas for a particular version then a new point release will not be created. + +If you are deploying a system to the cloud you have one of two options + +a) Use the images that are automatically built and published as part of the build pipeline. This image is currently based on ubuntu 22.04 and contains the majority of packages users will require. + +b) Use your own hardened base image, and install the containerized package that we publish into that image. + +## Package versions. + +We currently generate the following versions of the package and images: + +- debug +- release with symbols +- release without symbols. + +It is recommended that you deploy the "release with symbols" version to all bare-metal and non-production cloud deployments. The extra symbols allow the system to generate stack backtraces which make it much easier to diagnose problems if they occur. +The "release without symbols" version is recommended for Kubernetes production deployments. Deploying a system without symbols reduces the size of the images. This reduces the time it takes Kubernetes to copy the image before provisioning a new node. diff --git a/devdoc/roxie.md b/devdoc/roxie.md index 467239fa4c8..cfcbadf92b9 100644 --- a/devdoc/roxie.md +++ b/devdoc/roxie.md @@ -263,7 +263,7 @@ There are a number of potential questions and issues with this code: 10. Does the "reconnect" attempt from the deblacklister cause any pain for the server it is connecting to? Lots of connect attempts without any data could look like a DoS attack... 11. Retries/timeout seems to translate to - Owned scw = nonBlockingConnect(ep, timeoutMS == WAIT_FOREVER ? 60000 : timeoutMS*(retries+1)); + `Owned scw = nonBlockingConnect(ep, timeoutMS == WAIT_FOREVER ? 60000 : timeoutMS*(retries+1));` I am not sure that is correct (a single attempt to connect with a long timeout doesn't feel like it is the same as multiple attempts with shorter timeouts, for example if there is a load balancer in the mix). 11. Perhaps an option to not use blacklister would solve the immediate issue? diff --git a/esp/CMakeLists.txt b/esp/CMakeLists.txt index c56ba6223e2..968aaa05e4e 100644 --- a/esp/CMakeLists.txt +++ b/esp/CMakeLists.txt @@ -30,6 +30,7 @@ HPCC_ADD_SUBDIRECTORY (test "PLATFORM") HPCC_ADD_SUBDIRECTORY (tools "CLIENTTOOLS") HPCC_ADD_SUBDIRECTORY (xslt) HPCC_ADD_SUBDIRECTORY (esdllib) +HPCC_ADD_SUBDIRECTORY (esdlscriptlib) HPCC_ADD_SUBDIRECTORY (applications) HPCC_ADD_SUBDIRECTORY (espcommon) if (LOGGING_SERVICE) diff --git a/esp/bindings/http/platform/httpbinding.cpp b/esp/bindings/http/platform/httpbinding.cpp index 82c2503881e..14de4699692 100644 --- a/esp/bindings/http/platform/httpbinding.cpp +++ b/esp/bindings/http/platform/httpbinding.cpp @@ -47,6 +47,7 @@ #include "workunit.hpp" #include "cumulativetimer.hpp" #include +#include "esdl_def_helper.hpp" #define FILE_UPLOAD "FileUploadAccess" #define DEFAULT_HTTP_PORT 80 @@ -95,7 +96,7 @@ static IXmlSchema* createXmlSchema(const char* schema) XmlSchemaCreator creator = (XmlSchemaCreator)GetSharedProcedure(xmllib, "createXmlSchemaFromString"); if (!creator) throw MakeStringException(-1,"load XmlSchema factory failed: createXmlSchemaFromString()"); - + return creator(schema); } @@ -114,6 +115,17 @@ static void setBndCfgServiceType(IPropertyTree* tree, const char* procName, IPro bndCfg->setProp("@serviceType", srvType); } + +static void generateEsdlNamespace(IEspContext &context, CHttpRequest* request, const char *serv, const char *method, StringBuffer &ns, double version) { + ns.append("urn:hpccsystems:ws:"); + if (serv && *serv) + ns.appendLower(strlen(serv), serv); + + if (method && *method) + ns.append(":").append(method); + ns.toLowerCase(); +} + class CEspCorsAllowedOrigin : public CInterfaceOf { StringBuffer hostPort; @@ -288,7 +300,7 @@ IEspCorsHelper *createEspCorsHelper(IPropertyTree *cors) EspHttpBinding::EspHttpBinding(IPropertyTree* tree, const char *bindname, const char *procname) { Owned proc_cfg = getProcessConfig(tree, procname); - m_viewConfig = proc_cfg ? proc_cfg->getPropBool("@httpConfigAccess") : false; + m_viewConfig = proc_cfg ? proc_cfg->getPropBool("@httpConfigAccess") : false; m_formOptions = proc_cfg ? proc_cfg->getPropBool("@formOptionsAccess") : false; m_includeSoapTest = true; m_includeJsonTest = true; @@ -346,7 +358,7 @@ EspHttpBinding::EspHttpBinding(IPropertyTree* tree, const char *bindname, const m_subservices.setown(createPTreeFromXMLFile(ssfile, ipt_caseInsensitive)); } } - + m_realm.set((realm) ? realm : "EspServices"); } } @@ -627,7 +639,7 @@ void EspHttpBinding::setUnrestrictedSSTypes() bool EspHttpBinding::isUnrestrictedSSType(sub_service ss) const { auto search = unrestrictedSSTypes.find(ss); - return (search != unrestrictedSSTypes.end()); + return (search != unrestrictedSSTypes.end()); } //Check whether the url is valid or not for redirect after authentication. @@ -1145,19 +1157,19 @@ int EspHttpBinding::onGet(CHttpRequest* request, CHttpResponse* response) LogLevel level = getEspLogLevel(&context); if (level >= LogNormal) DBGLOG("EspHttpBinding::onGet"); - + response->setVersion(HTTP_VERSION); response->addHeader("Expires", "0"); response->setStatus(HTTP_STATUS_OK); - + sub_service sstype = sub_serv_unknown; StringBuffer pathEx; StringBuffer serviceName; StringBuffer methodName; StringBuffer paramStr; - + request->getEspPathInfo(sstype, &pathEx, &serviceName, &methodName, false); // adjust version if necessary @@ -1382,7 +1394,7 @@ static void filterXmlBySchema(StringBuffer& in, StringBuffer& schema, const char if (type) filterXmlBySchema(tree,type,name,out); - else + else { const char* value = tree->queryProp(NULL); UWARNLOG("Unknown xml tag ignored: <%s>%s", name, value?value:"", name); @@ -1410,7 +1422,7 @@ void EspHttpBinding::getXMLMessageTag(IEspContext& ctx, bool isRequest, const ch void EspHttpBinding::getSoapMessage(StringBuffer& soapmsg, IEspContext& ctx, CHttpRequest* request, const char *serv, const char *method) { StringBuffer reqName(serv); - reqName.append("Request"); + reqName.append("Request"); Owned msg = new CRpcMessage(reqName.str()); msg->setContext(&ctx); @@ -1423,7 +1435,7 @@ void EspHttpBinding::getSoapMessage(StringBuffer& soapmsg, IEspContext& ctx, CHt getSchema(schema,ctx,request,serv,method,false); getXMLMessageTag(ctx, true, method, tag); filterXmlBySchema(req,schema,tag.str(),filtered); - + StringBuffer ns; soapmsg.appendf( "" @@ -1530,7 +1542,7 @@ static void filterXmlBySchema(StringBuffer& in, StringBuffer& schema, StringBuff if (type) filterXmlBySchema(tree,type,name,out,indent); - else + else { const char* value = tree->queryProp(NULL); DBGLOG("Unknown xml tag ignored: <%s>%s", name, value?value:"", name); @@ -1552,7 +1564,7 @@ void EspHttpBinding::getSoapMessage(StringBuffer& soapmsg, IEspContext& ctx, CHt getSchema(schema,ctx,request,serv,method,false); //DBGLOG("Schema: %s", schema.str()); filterXmlBySchema(req,schema,filtered,2); - + soapmsg.appendf( "\n" "transform(page); + xform->transform(page); response->setContent(page); response->setContentType("text/html; charset=UTF-8"); @@ -1755,24 +1767,24 @@ int EspHttpBinding::onGetIframe(IEspContext &context, CHttpRequest* request, CHt if(title.length() > 0) content.appendf("%s", title.str()); content.append(""); - + content.append(""); content.appendf("", title.str()); - - //content.appendf("", path, request->queryParamStr()); + + //content.appendf("", path, request->queryParamStr()); StringBuffer inner; request->getParameter("inner", inner); StringBuffer plainText; request->getParameter("PlainText", plainText); if (plainText.length() > 0) inner.appendf("&PlainText=%s", plainText.str()); - + ESPLOG(LogNormal,"Inner: %s", inner.str()); ESPLOG(LogNormal,"Param: %s", request->queryParamStr()); content.appendf("", inner.str()); content.append(""); content.append(""); - + response->setContent(content.length(), content.str()); response->setContentType("text/html"); response->send(); @@ -1823,7 +1835,7 @@ int EspHttpBinding::onGetVersion(IEspContext &context, CHttpRequest* request, CH StringBuffer srvQName; qualifyServiceName(context, service, NULL, srvQName, NULL); verxml.appendf("%s%.3f", srvQName.str(), m_wsdlVer); - + response->setContent(verxml.str()); response->setContentType(HTTP_TYPE_APPLICATION_XML_UTF8); response->setStatus(HTTP_STATUS_OK); @@ -1831,17 +1843,85 @@ int EspHttpBinding::onGetVersion(IEspContext &context, CHttpRequest* request, CH return 0; } +void getServiceSchema(const char *serviceQName, const char *methodQName, double version, const char *nstr, + const StringBuffer &xmlFilename, Owned ¶ms, EsdlXslTypeId EsdlXslType, + IProperties *opts, StringBuffer &schema) +{ + Owned esdlDef = createEsdlDefinition(nullptr, nullptr); + Owned defHelper = createEsdlDefinitionHelper(); + + std::string xmlFilePath(getCFD()); + xmlFilePath.append("esdl_files").append(PATHSEPSTR).append(xmlFilename.str()); + esdlDef->addDefinitionsFromFile(xmlFilePath.c_str()); + unsigned optFlags{DEPFLAG_COLLAPSE|DEPFLAG_ARRAYOF}; + Owned structs = esdlDef->getDependencies(serviceQName, methodQName, ";", version, opts, optFlags ); + + StringBuffer xlstFile(getCFD()); + xlstFile.append("xslt").append(PATHSEPSTR).append("esp_service_xml2xsd.xslt"); + + defHelper->loadTransform(xlstFile, params, EsdlXslType); + defHelper->toWSDL(*structs, schema, EsdlXslType, version, opts, nstr, optFlags); +} + + int EspHttpBinding::onGetXsd(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method) { - return getWsdlOrXsd(context,request,response,service,method,false); + return getServiceWsdlOrXsd(context, request, response, service, method, false); } int EspHttpBinding::onGetWsdl(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method) { - return getWsdlOrXsd(context,request,response,service,method,true); + return getServiceWsdlOrXsd(context, request, response, service, method, true); } -bool EspHttpBinding::getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequest* req, const char *service, const char *method, bool standalone) +int EspHttpBinding::getServiceWsdlOrXsd(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method, bool isWsdl) +{ + StringBuffer serviceQName; + StringBuffer methodQName; + + if (!qualifyServiceName(context, service, method, serviceQName, &methodQName)) + return onGetNotFound(context, request, response, service); + + Owned params; + params.set(createProperties()); + + double version = getVersion(context); + params->setProp("version", StringBuffer("'").appendf("%g", version).append("'")); + + StringBuffer nstr; + generateEsdlNamespace(context, request, serviceQName.str(), methodQName.str(), nstr, version); + params->setProp("tnsParam", StringBuffer("'").append(nstr).append("'").str()); + + if (isWsdl) + { + params->setProp( "create_wsdl", "true()" ); + StringBuffer location(m_wsdlAddress.str()); + if (request->queryParameters()->hasProp("wsdl_destination_path")) + location.append(request->queryParameters()->queryProp("wsdl_destination_path")); + else + location.append('/').append(serviceQName.str()).appendf("?ver_=%g", version); + params->setProp("location", StringBuffer("'").append(location).append("'").str()); + } + + StringBuffer xmlFilename; + if (!getXmlFilename(xmlFilename)) + { + throw MakeStringException(-1, "Unable to get service XML filename"); + } + + StringBuffer schema; + getServiceSchema(serviceQName.str(), methodQName.str(), version, nstr.str(), xmlFilename, + params, isWsdl ? EsdlXslToWsdl : EsdlXslToXsd, context.queryRequestParameters(), schema); + + response->setContent(schema.length(), schema.str()); + response->setContentType(HTTP_TYPE_APPLICATION_XML_UTF8); + response->setStatus(HTTP_STATUS_OK); + response->send(); + return 0; +} + + +bool EspHttpBinding::getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequest* req, const char *service, const char *method, bool standalone) { StringBuffer serviceQName; StringBuffer methodQName; @@ -1870,10 +1950,10 @@ bool EspHttpBinding::getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequ ForEach(*nsiter) { IPropertyTree &ns = nsiter->query(); - if (ns.hasProp("@import")) + if (ns.hasProp("@import")) schema.appendf("", ns.queryProp("@ns"), ns.queryProp("@location")); } - + schema.append( "" @@ -1895,7 +1975,7 @@ bool EspHttpBinding::getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequ if (ctx.queryOptions()&ESPCTX_WSDL_EXT) { - schema.append( + schema.append( "" "" "" @@ -1919,91 +1999,13 @@ bool EspHttpBinding::getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequ ); } - bool mda=(req->queryParameters()->getPropInt("mda")!=0); + bool mda = (req->queryParameters()->getPropInt("mda") != 0); getXsdDefinition(ctx, req, schema, sqName, mqName, mda); - schema.append("\n"); schema.append(""); - return true; } -int EspHttpBinding::getWsdlOrXsd(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method, bool isWsdl) -{ - bool mda=(request->queryParameters()->getPropInt("mda")!=0); - try - { - StringBuffer serviceQName; - StringBuffer methodQName; - - if (!qualifyServiceName(context, service, method, serviceQName, &methodQName)) - { - return onGetNotFound(context, request, response, service); - } - else - { - const char *sqName = serviceQName.str(); - const char *mqName = methodQName.str(); - StringBuffer ns; - generateNamespace(context, request, serviceQName.str(), methodQName.str(), ns); - - StringBuffer content(""); - if (context.queryRequestParameters()->hasProp("display")) - content.append(""); - else if (isWsdl && context.queryRequestParameters()->hasProp("wsdlviewer")) - content.append(""); - if (isWsdl) - { - content.appendf("", ns.str(), ns.str()); - content.append(""); - } - - getSchema(content,context,request,service,method,!isWsdl); - - if (isWsdl) - { - content.append(""); - - getWsdlMessages(context, request, content, sqName, mqName, mda); - getWsdlPorts(context, request, content, sqName, mqName, mda); - getWsdlBindings(context, request, content, sqName, mqName, mda); - - StringBuffer location(m_wsdlAddress.str()); - if (request->queryParameters()->hasProp("wsdl_destination_path")) - location.append(request->queryParameters()->queryProp("wsdl_destination_path")); - else - location.append('/').append(sqName).appendf("?ver_=%g", context.getClientVersion()); - - if (request->queryParameters()->hasProp("encode_results")) - { - const char *encval = request->queryParameters()->queryProp("encode_results"); - location.append("&").appendf("encode_=%s", (encval && *encval) ? encval : "1"); - } - - content.appendf("", sqName); - content.appendf("", sqName, sqName); - content.appendf("", location.str()); - content.append(""); - content.append(""); - content.append(""); - } - - response->setContent(content.length(), content.str()); - response->setContentType(HTTP_TYPE_APPLICATION_XML_UTF8); - response->setStatus(HTTP_STATUS_OK); - } - } - catch (IException *e) - { - return onGetException(context, request, response, *e); - } - - response->send(); - return 0; -} - static void genSampleXml(StringStack& parent, IXmlType* type, StringBuffer& out, const char* tag, const char* ns=NULL) { assertex(type!=NULL); @@ -2014,7 +2016,7 @@ static void genSampleXml(StringStack& parent, IXmlType* type, StringBuffer& out, { if (typeName && std::find(parent.begin(),parent.end(),typeName) != parent.end()) return; // recursive - + out.appendf("<%s", tag); if (ns) out.append(' ').append(ns); @@ -2028,9 +2030,9 @@ static void genSampleXml(StringStack& parent, IXmlType* type, StringBuffer& out, out.append('>'); if (typeName) parent.push_back(typeName); - + int flds = type->getFieldCount(); - + switch (type->getSubType()) { case SubType_Complex_SimpleContent: @@ -2045,7 +2047,7 @@ static void genSampleXml(StringStack& parent, IXmlType* type, StringBuffer& out, } if (typeName) - parent.pop_back(); + parent.pop_back(); out.appendf("",tag); } else if (type->isArray()) @@ -2063,7 +2065,7 @@ static void genSampleXml(StringStack& parent, IXmlType* type, StringBuffer& out, parent.push_back(typeName); genSampleXml(parent,itemType,item,itemName); if (typeName) - parent.pop_back(); + parent.pop_back(); // gen two items out.appendf("<%s>%s%s", tag,item.str(),item.str(),tag); @@ -2346,7 +2348,7 @@ int EspHttpBinding::onFinishUpload(IEspContext &ctx, CHttpRequest* request, CHtt int EspHttpBinding::getWsdlMessages(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda) { bool allMethods = (method==NULL || !*method); - + MethodInfoArray methods; getQualifiedNames(context, methods); int count=methods.ordinality(); @@ -2416,7 +2418,7 @@ int EspHttpBinding::getWsdlBindings(IEspContext &context, CHttpRequest *request, content.appendf("", serviceName.str(), serviceName.str()); content.append(""); - + bool allMethods = (method==NULL || !*method); MethodInfoArray methods; getQualifiedNames(context, methods); @@ -2436,7 +2438,7 @@ int EspHttpBinding::getWsdlBindings(IEspContext &context, CHttpRequest *request, content.append(""); content.append(""); content.append(""); - + content.append(""); if (!allMethods) // no need to continue break; @@ -2560,8 +2562,8 @@ int EspHttpBinding::onGetIndex(IEspContext &context, CHttpRequest* request, CHt list->appendContent(new CHtmlLink(method.m_label.str(), wsLink.str())); } } - - page.appendContent(new CHtmlText("
For a formal definition, please review the ")); + + page.appendContent(new CHtmlText("
For a formal definition, please review the ")); urlParams.append(urlParams.length()>0 ? "&wsdl" : "?wsdl"); wsLink.clear().appendf("%s", urlParams.str()); @@ -2601,7 +2603,7 @@ void EspHttpBinding::escapeSingleQuote(StringBuffer& src, StringBuffer& escaped) { if (*p == '\'') escaped.append("'"); - else + else escaped.append(*p); } } @@ -2653,7 +2655,7 @@ int EspHttpBinding::onGetXForm(IEspContext &context, CHttpRequest* request, CHtt if (!getUrlParams(context.queryRequestParameters(),params)) params.appendf("%cver_=%g",(params.length()>0) ? '&' : '?', context.getClientVersion()); xform->setStringParameter("queryParams", params.str()); - + StringBuffer tmp,escaped; getMethodHelp(context, serviceQName, methodQName, tmp); escapeSingleQuote(tmp,escaped); @@ -2693,7 +2695,7 @@ int EspHttpBinding::onGetXForm(IEspContext &context, CHttpRequest* request, CHtt break; } } - xform->transform(page); + xform->transform(page); response->setContentType("text/html"); response->setContent(page.str()); } @@ -2759,7 +2761,7 @@ int EspHttpBinding::onGetForm(IEspContext &context, CHttpRequest* request, CHttp "" "" "

"); - + page.appendf("> %s", methodQName.str()); page.append("

" "" @@ -2810,25 +2812,25 @@ int EspHttpBinding::onGetForm(IEspContext &context, CHttpRequest* request, CHttp response->setContent(page.str()); response->setContentType("text/html"); } - + response->send(); return 0; } - + int EspHttpBinding::formatHtmlResultSet(IEspContext &context, const char *serv, const char *method, const char *resultsXml, StringBuffer &html) { Owned ptree = createPTreeFromXMLString(resultsXml); - + Owned exceptions = ptree->getElements("//Exception"); ForEach(*exceptions.get()) { IPropertyTree &xcpt = exceptions->query(); - html.appendf("
Exception:
Reported by: %s
Message: %s
", + html.appendf("
Exception:
Reported by: %s
Message: %s
", xcpt.queryProp("Source"), xcpt.queryProp("Message")); } - + Owned datasets = ptree->getElements("//Dataset"); ForEach(*datasets.get()) { @@ -2842,14 +2844,14 @@ int EspHttpBinding::formatHtmlResultSet(IEspContext &context, const char *serv, if (row1) { html.append(" "); - + Owned columns = row1->getElements("*"); ForEach(*columns.get()) { const char *title = columns->query().queryName(); html.appendf("%s", (title!=NULL) ? title : " "); - } - + } + html.append(""); } @@ -2861,21 +2863,21 @@ int EspHttpBinding::formatHtmlResultSet(IEspContext &context, const char *serv, { IPropertyTree &row = datarows->query(); Owned columns = row.getElements("*"); - + html.appendf("%d", count++); ForEach(*columns.get()) { const char *value = columns->query().queryProp(NULL); html.appendf("%s", (value!=NULL) ? value : " "); - } - + } + html.append(""); } } - + html.append(""); } - + return 0; } @@ -2928,7 +2930,7 @@ int EspHttpBinding::formatResultsPage(IEspContext &context, const char *serv, co "" "" "

"); - + page.appendf("> %s Results", methodQName.str()); page.append("

" "" @@ -2967,7 +2969,7 @@ bool EspHttpBinding::setContentFromFile(IEspContext &context, CHttpResponse &res return false; } -void EspHttpBinding::onBeforeSendResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, +void EspHttpBinding::onBeforeSendResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, const char *serviceName, const char* methodName) { IProperties* params = request->queryParameters(); @@ -2977,7 +2979,7 @@ void EspHttpBinding::onBeforeSendResponse(IEspContext& context, CHttpRequest* re sortResponse(context, request, content, serviceName, methodName); } -void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, +void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, const char *service, const char* method) { StringBuffer serviceQName; @@ -2985,15 +2987,15 @@ void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* reques if (!qualifyServiceName(context, service, method, serviceQName, &methodQName)) return; - + StringBuffer xml,xsd; - + // name space StringBuffer ns; generateNamespace(context, request, serviceQName.str(), methodQName.str(), ns); // XML - Owned tree; + Owned tree; try { tree.setown(createPTreeFromXMLString(content.length(), content.toByteArray())); // format it for better error message @@ -3001,14 +3003,14 @@ void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* reques //Hack: add default name space to XML const char* end = strstr(xml, ""); if (end) end = strchr(end+2, '>'); if (!end) throw MakeStringException(-1,"Invalid response XML in processing instruction"); - } + } else { end = strchr(xml, '>'); @@ -3033,7 +3035,7 @@ void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* reques // schema getSchema(xsd,context,request,serviceQName,methodQName,true); - + // validation if (getEspLogLevel()>LogMax) DBGLOG("[VALIDATE] xml: %s\nxsd: %s\nns: %s",xml.str(), xsd.str(), ns.str()); @@ -3068,7 +3070,7 @@ void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* reques content.setBuffer(len, temp.detach(), true); } -void EspHttpBinding::sortResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, +void EspHttpBinding::sortResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, const char *serviceName, const char* methodName) { ESPLOG(LogNormal,"Sorting Response XML..."); @@ -3088,7 +3090,7 @@ void EspHttpBinding::sortResponse(IEspContext& context, CHttpRequest* request, M if (getEspLogLevel()>LogNormal) DBGLOG("XML sorted: %s", result.str()); unsigned len = result.length(); - content.setBuffer(len, result.detach(), true); + content.setBuffer(len, result.detach(), true); } catch (IException* e) { StringBuffer msg; IERRLOG("Unexpected error: parsing XML: %s", e->errorMessage(msg).str()); diff --git a/esp/bindings/http/platform/httpbinding.hpp b/esp/bindings/http/platform/httpbinding.hpp index 93821268e5b..e36ba07097f 100644 --- a/esp/bindings/http/platform/httpbinding.hpp +++ b/esp/bindings/http/platform/httpbinding.hpp @@ -111,6 +111,7 @@ interface IEspWsdlSections // virtual MethodInfoArray & queryQualifiedNames(IEspContext& ctx)=0; virtual int getQualifiedNames(IEspContext& ctx, MethodInfoArray & methods)=0; virtual int getXsdDefinition(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda)=0; + virtual int getXmlFilename(StringBuffer &filename)=0; virtual int getWsdlMessages(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda)=0; virtual int getWsdlPorts(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda)=0; virtual int getWsdlBindings(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda)=0; @@ -344,6 +345,7 @@ class esp_http_decl EspHttpBinding : // MethodInfoArray &queryQualifiedNames(IEspContext& ctx) { m_methods.popAll(); getQualifiedNames(ctx,m_methods); return m_methods;}; int getXsdDefinition(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda){return 0;}; + int getXmlFilename(StringBuffer &filename) {return 0;}; int getWsdlMessages(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda); int getWsdlPorts(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda); int getWsdlBindings(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda); @@ -427,9 +429,21 @@ class esp_http_decl EspHttpBinding : static void escapeSingleQuote(StringBuffer& src, StringBuffer& escaped); + virtual bool getDefaultClientVersion(double &ver) {ver=0; return true;} + + double getVersion(IEspContext &context) + { + double version = context.getClientVersion(); + if (version == 0.0) + { + getDefaultClientVersion(version); + } + return version; + } + protected: virtual bool basicAuth(IEspContext* ctx); - int getWsdlOrXsd(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method, bool isWsdl); + int getServiceWsdlOrXsd(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method, bool isWsdl); virtual bool getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequest* req, const char *service, const char *method,bool standalone); virtual void appendSchemaNamespaces(IPropertyTree *namespaces, IEspContext &ctx, CHttpRequest* req, const char *service, const char *method){} void generateSampleXml(bool isRequest, IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *serv, const char *method); diff --git a/esp/esdllib/CMakeLists.txt b/esp/esdllib/CMakeLists.txt index 72dde89ae1e..e79da490aa3 100644 --- a/esp/esdllib/CMakeLists.txt +++ b/esp/esdllib/CMakeLists.txt @@ -27,6 +27,7 @@ include_directories ( ${HPCC_SOURCE_DIR}/system/include ${HPCC_SOURCE_DIR}/esp/esdllib ${HPCC_SOURCE_DIR}/esp/services/common + ${HPCC_SOURCE_DIR}/esp/esdlscriptlib ${HPCC_SOURCE_DIR}/system/jlib ${HPCC_SOURCE_DIR}/system/security/shared ${HPCC_SOURCE_DIR}/rtl/eclrtl @@ -43,23 +44,11 @@ set ( SRCS esdl_def.cpp esdl_def_helper.cpp esdl_transformer2.cpp - esdl_script.cpp params2xml.cpp - ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp/fxpp/FragmentedXmlPullParser.cpp; ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp/xpp/xpputils.cpp ${HPCC_SOURCE_DIR}/esp/services/common/wsexcept.cpp ) -if (USE_LIBXSLT) - list (APPEND SRCS - esdl_xpath_extensions_libxml.cpp - ) -else() - list (APPEND SRCS - esdl_xpath_extensions_unsupported.cpp - ) -endif() - HPCC_ADD_LIBRARY( esdllib SHARED ${SRCS} ${HEADERS} ) @@ -71,8 +60,7 @@ add_dependencies ( esdllib jlib espscm) target_link_libraries ( esdllib jlib xmllib - thorhelper - esphttp + dllserver ) IF (USE_LIBXSLT) diff --git a/esp/esdlscriptlib/CMakeLists.txt b/esp/esdlscriptlib/CMakeLists.txt new file mode 100644 index 00000000000..15e67acd136 --- /dev/null +++ b/esp/esdlscriptlib/CMakeLists.txt @@ -0,0 +1,72 @@ +################################################################################ +# HPCC SYSTEMS software Copyright (C) 2013 HPCC Systems®. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +################################################################################ +# Component: esdllib + +project( esdllib ) + +include_directories ( + ${HPCC_SOURCE_DIR}/system/xmllib + ${HPCC_SOURCE_DIR}/esp/bindings + ${HPCC_SOURCE_DIR}/esp/bindings/http/client + ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp + ${HPCC_SOURCE_DIR}/esp/platform + ${HPCC_SOURCE_DIR}/system/include + ${HPCC_SOURCE_DIR}/esp/services/common + ${HPCC_SOURCE_DIR}/system/jlib + ${HPCC_SOURCE_DIR}/system/security/shared + ${HPCC_SOURCE_DIR}/rtl/eclrtl + ${HPCC_SOURCE_DIR}/rtl/include #IXMLWriter + ${HPCC_SOURCE_DIR}/common/dllserver #loading plugins + ${HPCC_SOURCE_DIR}/system/masking/include +) + +ADD_DEFINITIONS ( -D_USRDLL -DESDLSCRIPTLIB_EXPORTS ) + +set ( SRCS + esdl_script.cpp + ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp/fxpp/FragmentedXmlPullParser.cpp; + ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp/xpp/xpputils.cpp +) + +if (USE_LIBXSLT) + list (APPEND SRCS + esdl_xpath_extensions_libxml.cpp + ) +else() + list (APPEND SRCS + esdl_xpath_extensions_unsupported.cpp + ) +endif() + +HPCC_ADD_LIBRARY( esdlscriptlib SHARED ${SRCS} + ${HEADERS} +) + +install ( TARGETS esdlscriptlib RUNTIME DESTINATION bin LIBRARY DESTINATION lib ) + +add_dependencies ( esdlscriptlib jlib espscm) + +target_link_libraries ( esdlscriptlib + jlib + dllserver + esphttp +) + +IF (USE_LIBXSLT) + include_directories ( + ${LIBXML2_INCLUDE_DIR} + ) +ENDIF() diff --git a/esp/esdllib/esdl_script.cpp b/esp/esdlscriptlib/esdl_script.cpp similarity index 99% rename from esp/esdllib/esdl_script.cpp rename to esp/esdlscriptlib/esdl_script.cpp index dd3d7bf5f0d..b1a3db77ac8 100644 --- a/esp/esdllib/esdl_script.cpp +++ b/esp/esdlscriptlib/esdl_script.cpp @@ -3133,7 +3133,7 @@ class CEsdlTransformOperationSetTraceOptions : public CEsdlTransformOperationWit const char* locked = stag.getValue("locked"); if (!isEmptyString(locked)) m_locked.setown(compileXpath(locked)); - + if (!m_enabled && !m_locked) recordError(ESDL_SCRIPT_MissingOperationAttr, "missing all options"); } @@ -3911,11 +3911,11 @@ class CEsdlTransformMethodMap : public CInterfaceOf } }; -esdl_decl IEsdlScriptContext* createEsdlScriptContext(IEspContext* espCtx, IEsdlFunctionRegister* functionRegister, IDataMaskingEngine* engine) +esdlscript_decl IEsdlScriptContext* createEsdlScriptContext(IEspContext* espCtx, IEsdlFunctionRegister* functionRegister, IDataMaskingEngine* engine) { return new CEsdlScriptContext(espCtx, functionRegister, engine); } -esdl_decl IEsdlTransformMethodMap *createEsdlTransformMethodMap() +esdlscript_decl IEsdlTransformMethodMap *createEsdlTransformMethodMap() { return new CEsdlTransformMethodMap(); } diff --git a/esp/esdllib/esdl_script.hpp b/esp/esdlscriptlib/esdl_script.hpp similarity index 90% rename from esp/esdllib/esdl_script.hpp rename to esp/esdlscriptlib/esdl_script.hpp index 4566341881d..9a935a9db1a 100644 --- a/esp/esdllib/esdl_script.hpp +++ b/esp/esdlscriptlib/esdl_script.hpp @@ -18,10 +18,10 @@ #ifndef ESDL_SCRIPT_HPP_ #define ESDL_SCRIPT_HPP_ -#ifdef ESDLLIB_EXPORTS - #define esdl_decl DECL_EXPORT +#ifdef ESDLSCRIPTLIB_EXPORTS + #define esdlscript_decl DECL_EXPORT #else - #define esdl_decl + #define esdlscript_decl #endif #include "jlib.hpp" @@ -30,7 +30,7 @@ #include "jlog.hpp" #include "esp.hpp" -#include "esdl_def.hpp" +//#include "esdl_def.hpp" #include "datamaskingengine.hpp" #include "tracer.h" @@ -163,7 +163,7 @@ interface IEsdlScriptContext : extends ISectionalXmlDocModel * The absence of a sectional document model in the parameter list implies the returned instance * is responsible for creating its own model. */ -extern "C" esdl_decl IEsdlScriptContext* createEsdlScriptContext(IEspContext* espCtx, IEsdlFunctionRegister* functionRegister, IDataMaskingEngine* engine); +extern "C" esdlscript_decl IEsdlScriptContext* createEsdlScriptContext(IEspContext* espCtx, IEsdlFunctionRegister* functionRegister, IDataMaskingEngine* engine); interface IEsdlCustomTransform : extends IInterface { @@ -229,11 +229,11 @@ interface IEsdlTransformMethodMap : extends IInterface virtual void bindFunctionCalls() = 0; }; -esdl_decl IEsdlTransformMethodMap *createEsdlTransformMethodMap(); +esdlscript_decl IEsdlTransformMethodMap *createEsdlTransformMethodMap(); -esdl_decl IEsdlCustomTransform *createEsdlCustomTransform(const char *scriptXml, const char *ns_prefix); +esdlscript_decl IEsdlCustomTransform *createEsdlCustomTransform(const char *scriptXml, const char *ns_prefix); -esdl_decl void processServiceAndMethodTransforms(IEsdlScriptContext * scriptCtx, std::initializer_list const &transforms, const char *srcSection, const char *tgtSection); -esdl_decl void registerEsdlXPathExtensions(IXpathContext *xpathCtx, IEsdlScriptContext *scriptCtx, const StringArray &prefixes); +esdlscript_decl void processServiceAndMethodTransforms(IEsdlScriptContext * scriptCtx, std::initializer_list const &transforms, const char *srcSection, const char *tgtSection); +esdlscript_decl void registerEsdlXPathExtensions(IXpathContext *xpathCtx, IEsdlScriptContext *scriptCtx, const StringArray &prefixes); #endif /* ESDL_SCRIPT_HPP_ */ diff --git a/esp/esdllib/esdl_xpath_extensions_libxml.cpp b/esp/esdlscriptlib/esdl_xpath_extensions_libxml.cpp similarity index 100% rename from esp/esdllib/esdl_xpath_extensions_libxml.cpp rename to esp/esdlscriptlib/esdl_xpath_extensions_libxml.cpp diff --git a/esp/esdllib/esdl_xpath_extensions_unsupported.cpp b/esp/esdlscriptlib/esdl_xpath_extensions_unsupported.cpp similarity index 100% rename from esp/esdllib/esdl_xpath_extensions_unsupported.cpp rename to esp/esdlscriptlib/esdl_xpath_extensions_unsupported.cpp diff --git a/esp/logging/logginglib/CMakeLists.txt b/esp/logging/logginglib/CMakeLists.txt index 1beb7a573f7..23e3727bbd7 100644 --- a/esp/logging/logginglib/CMakeLists.txt +++ b/esp/logging/logginglib/CMakeLists.txt @@ -32,6 +32,7 @@ include_directories ( ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/Platform #CSoapRequestBinding ${HPCC_SOURCE_DIR}/esp/clients #edwin.h in generated/ws_loggingservice.esp ${HPCC_SOURCE_DIR}/esp/esdllib + ${HPCC_SOURCE_DIR}/esp/esdlscriptlib ${HPCC_SOURCE_DIR}/common/thorhelper ) @@ -58,5 +59,5 @@ target_link_libraries ( logginglib jlib xmllib esphttp - esdllib + esdlscriptlib ) diff --git a/esp/protocols/http/CMakeLists.txt b/esp/protocols/http/CMakeLists.txt index b2d39e4e075..db16c06339a 100644 --- a/esp/protocols/http/CMakeLists.txt +++ b/esp/protocols/http/CMakeLists.txt @@ -64,10 +64,11 @@ include_directories( ./../../../system/security/shared ./../../../system/security/LdapSecurity ./../../../system/security/zcrypt - ./../../../system/mp + ./../../../system/mp ./../../../dali/base ./../../../common/workunit ${HPCC_SOURCE_DIR}/common/thorhelper + ${HPCC_SOURCE_DIR}/esp/esdllib ) add_definitions(-DESPHTTP_EXPORTS -DESP_TIMING -D_USRDLL -DESP_PLUGIN -DTXSUMMARY_EXPORTS) @@ -76,6 +77,7 @@ if(USE_OPENLDAP) endif() HPCC_ADD_LIBRARY(esphttp SHARED ${SRCS}) add_dependencies(esphttp espscm) + install(TARGETS esphttp RUNTIME DESTINATION ${EXEC_DIR} LIBRARY DESTINATION ${LIB_DIR}) target_link_libraries( esphttp @@ -86,6 +88,7 @@ target_link_libraries( dalibase thorhelper # this should not be dependent on the engine helper dll workunit # neither should it be dependent on the wokunit dll + esdllib ) if(LIBMEMCACHED_FOUND) diff --git a/esp/scm/additional.cmake b/esp/scm/additional.cmake index 105dbaa7b63..e34b4b9c76a 100644 --- a/esp/scm/additional.cmake +++ b/esp/scm/additional.cmake @@ -53,6 +53,9 @@ foreach ( loop_var ${ESPSCM_SRCS} ) set_source_files_properties(${ESPSCM_GENERATED_DIR}/${result}_esp.ipp PROPERTIES GENERATED TRUE) set_source_files_properties(${ESPSCM_GENERATED_DIR}/${result}.xml PROPERTIES GENERATED TRUE) set ( ESP_GENERATED_INCLUDES ${ESP_GENERATED_INCLUDES} ${ESPSCM_GENERATED_DIR}/${result}.esp ${ESPSCM_GENERATED_DIR}/${result}.hpp ${ESPSCM_GENERATED_DIR}/${result}.ipp ${ESPSCM_GENERATED_DIR}/${result}_esp.ipp ${ESPSCM_GENERATED_DIR}/${result}.xml ) + if ( PLATFORM ) + Install( FILES ${ESPSCM_GENERATED_DIR}/${result}.xml DESTINATION componentfiles/esdl_files COMPONENT Runtime ) + endif ( PLATFORM ) endforeach ( loop_var ${ESPSCM_SRCS} ) include_directories ( ${ESPSCM_GENERATED_DIR} ${HPCC_SOURCE_DIR}/esp/espcommon) diff --git a/esp/scm/smcscm.cmake b/esp/scm/smcscm.cmake index 42ff20ff9d3..d90d80364c3 100644 --- a/esp/scm/smcscm.cmake +++ b/esp/scm/smcscm.cmake @@ -70,6 +70,9 @@ foreach ( loop_var ${ESPSCM_SRCS} ) set_source_files_properties(${ESPSCM_GENERATED_DIR}/${result}_esp.ipp PROPERTIES GENERATED TRUE) set_source_files_properties(${ESPSCM_GENERATED_DIR}/${result}.xml PROPERTIES GENERATED TRUE) set ( ESP_GENERATED_INCLUDES ${ESP_GENERATED_INCLUDES} ${ESPSCM_GENERATED_DIR}/${result}.esp ${ESPSCM_GENERATED_DIR}/${result}.hpp ${ESPSCM_GENERATED_DIR}/${result}.ipp ${ESPSCM_GENERATED_DIR}/${result}_esp.ipp ${ESPSCM_GENERATED_DIR}/${result}.xml ) + if ( PLATFORM ) + Install( FILES ${ESPSCM_GENERATED_DIR}/${result}.xml DESTINATION componentfiles/esdl_files COMPONENT Runtime ) + endif ( PLATFORM ) endforeach ( loop_var ${ESPSCM_SRCS} ) include_directories ( ${ESPSCM_GENERATED_DIR} ${HPCC_SOURCE_DIR}/esp/espcommon ) diff --git a/esp/scm/ws_topology.ecm b/esp/scm/ws_topology.ecm index 474a5bcba76..4abdd308943 100644 --- a/esp/scm/ws_topology.ecm +++ b/esp/scm/ws_topology.ecm @@ -330,7 +330,7 @@ ESPStruct TpTargetCluster { string Name; string Prefix; - TpQueryType Type; + string Type; ESParray TpClusters; ESParray TpEclCCServers; @@ -339,14 +339,9 @@ ESPStruct TpTargetCluster [min_ver("1.16")] ESParray TpEclSchedulers; }; -ESPStruct TpQueryType -{ - TPCLUSTER; - TPNODE; -}; ESPrequest TpTargetClusterQueryRequest { - TpQueryType Type; + string Type; string Name; bool ShowDetails(false); }; @@ -639,7 +634,28 @@ ESPresponse [nil_remove, exceptions_inline] TpDropZoneQueryResponse ESParray TpDropZones; }; -ESPservice [auth_feature("DEFERRED"), noforms, version("1.31"), cache_group("ESPWsTP"), exceptions_inline("./smc_xslt/exceptions.xslt")] WsTopology +ESPrequest TpListLogFilesRequest +{ + string NetworkAddress; + string Path; +}; + +ESPStruct LogFileStruct +{ + string Name; + string Path; + string Host; + bool IsDir; + int64 FileSize; + string Modifiedtime; +}; + +ESPresponse [exceptions_inline] TpListLogFilesResponse +{ + ESParray Files; +}; + +ESPservice [auth_feature("DEFERRED"), noforms, version("1.32"), cache_group("ESPWsTP"), exceptions_inline("./smc_xslt/exceptions.xslt")] WsTopology { ESPmethod [cache_seconds(180), cache_global(1), resp_xsl_default("/esp/xslt/targetclusters.xslt")] TpTargetClusterQuery(TpTargetClusterQueryRequest, TpTargetClusterQueryResponse); ESPmethod [cache_seconds(180), cache_global(1), resp_xsl_default("/esp/xslt/topology.xslt")] TpClusterQuery(TpClusterQueryRequest, TpClusterQueryResponse); @@ -660,6 +676,7 @@ ESPservice [auth_feature("DEFERRED"), noforms, version("1.31"), cache_group("ESP ESPmethod [cache_seconds(180), cache_global(1)] TpGetServicePlugins(TpGetServicePluginsRequest, TpGetServicePluginsResponse); ESPmethod [cache_seconds(180), cache_global(1)] TpListTargetClusters(TpListTargetClustersRequest, TpListTargetClustersResponse); ESPmethod [cache_seconds(180), cache_global(1), min_ver(1.25)] TpMachineInfo(TpMachineInfoRequest, TpMachineInfoResponse); + ESPmethod [cache_seconds(180), cache_global(1), min_ver(1.32)] TpListLogFiles(TpListLogFilesRequest, TpListLogFilesResponse); ESPmethod SystemLog(SystemLogRequest, SystemLogResponse); }; diff --git a/esp/scm/ws_workunits_req_resp.ecm b/esp/scm/ws_workunits_req_resp.ecm index 5047bd31e4e..145c49376a5 100644 --- a/esp/scm/ws_workunits_req_resp.ecm +++ b/esp/scm/ws_workunits_req_resp.ecm @@ -1026,12 +1026,12 @@ ESPresponse [exceptions_inline, nil_remove] WUGetNumFileToCopyResponse ESPRequest WUDetailsRequest { string WUID; - [optional] ESPstruct WUScopeFilter ScopeFilter; // which scopes are matched - [optional] ESPstruct WUNestedFilter NestedFilter; // what nested scopes are returned - [optional] ESPstruct WUPropertiesToReturn PropertiesToReturn; // List of properties to return - [optional] string Filter; // Filter as a string text - [optional] ESPstruct WUScopeOptions ScopeOptions; // Which scope details are returned - [optional] ESPstruct WUPropertyOptions PropertyOptions; // Which attribute details are returned + ESPstruct WUScopeFilter ScopeFilter; // which scopes are matched + ESPstruct WUNestedFilter NestedFilter; // what nested scopes are returned + ESPstruct WUPropertiesToReturn PropertiesToReturn; // List of properties to return + string Filter; // Filter as a string text + ESPstruct WUScopeOptions ScopeOptions; // Which scope details are returned + ESPstruct WUPropertyOptions PropertyOptions; // Which attribute details are returned }; ESPResponse [exceptions_inline] WUDetailsResponse @@ -1110,13 +1110,13 @@ ESPresponse [exceptions_inline] WUGetPluginsResponse ESPrequest [nil_remove] WUAnalyseHotspotRequest { string Wuid; - [optional] string RootScope; + string RootScope; bool OptOnlyActive(false); bool OnlyCriticalPath(false); bool IncludeProperties(true); bool IncludeStatistics(true); double ThresholdPercent(1.0); - [optional] ESPstruct WUPropertyOptions PropertyOptions; // Which attribute details are returned + ESPstruct WUPropertyOptions PropertyOptions; // Which attribute details are returned }; ESPresponse [exceptions_inline] WUAnalyseHotspotResponse diff --git a/esp/scm/ws_workunits_struct.ecm b/esp/scm/ws_workunits_struct.ecm index fbe88028819..fcad4bf90df 100644 --- a/esp/scm/ws_workunits_struct.ecm +++ b/esp/scm/ws_workunits_struct.ecm @@ -731,9 +731,9 @@ ESPstruct WUPropertyFilter { string Name; // Attribute Name to match // Match attribute's RawValue - [optional] string ExactValue; - [optional] string MinValue; - [optional] string MaxValue; + string ExactValue; + string MinValue; + string MaxValue; }; // Filters that indicates which nodes are explicitly matched @@ -742,29 +742,29 @@ ESPstruct WUPropertyFilter // PropertyFilters (attributes or statistics) is applied to all matches ESPStruct WUScopeFilter { - [optional] integer MaxDepth(9999); // Maximum depth to return matches from (omitted means no limit) - [optional] ESParray Scopes; // Fully qualified scope (See definition of "Scope" in workunit.hpp) - [optional] ESParray Ids; // Return scope with given node id - [optional] ESParray ScopeTypes; // Return scope of a given type - [optional] ESParray PropertyFilters; + integer MaxDepth(9999); // Maximum depth to return matches from (omitted means no limit) + ESParray Scopes; // Fully qualified scope (See definition of "Scope" in workunit.hpp) + ESParray Ids; // Return scope with given node id + ESParray ScopeTypes; // Return scope of a given type + ESParray PropertyFilters; }; // This provides the filter which indicates which nodes are implicitly matched // Once a match is found, all nested scopes to a depth of depth are implicitly matched, provided they match the nested filter ESPStruct WUNestedFilter { - [optional] unsigned Depth(9999); // How many nodes deep relative to matched scope id(s) - // 0 - implies return only the given scope id - // 1 - return only the immediate child of the given scope - // n - return children to 'n' level deep - [optional] ESParray ScopeTypes; // Return scope of a given type + unsigned Depth(9999); // How many nodes deep relative to matched scope id(s) + // 0 - implies return only the given scope id + // 1 - return only the immediate child of the given scope + // n - return children to 'n' level deep + ESParray ScopeTypes; // Return scope of a given type }; // Additional properties that are returned for a scopeType ESPStruct WUExtraProperties { string scopeType; // A type of scope e.g., activity/edge - [optional] ESParray Properties; // a list of properties to return, omitted means none + ESParray Properties; // a list of properties to return, omitted means none }; // If measure and attributes are omitted then all matches are returned @@ -778,10 +778,10 @@ ESPStruct WUPropertiesToReturn bool AllScopes(false); bool AllProperties(false); [min_ver("1.76")] bool AllNotes(false); - [optional] uint64 MinVersion; // Only return properties where the version is later than this version. - [optional] string Measure; // E.g. Time, Num, Size - [optional] ESParray Properties; // a list of properties to return - [optional] ESParray ExtraProperties; + uint64 MinVersion; // Only return properties where the version is later than this version. + string Measure; // E.g. Time, Num, Size + ESParray Properties; // a list of properties to return + ESParray ExtraProperties; }; ESPStruct WUScopeOptions @@ -807,31 +807,31 @@ ESPStruct WUPropertyOptions // Response related structures ESPstruct [nil_remove] WUResponseProperty { - [optional] string Name; // Name of attribute - [optional] string RawValue; // Value of attribute - [optional] string Formatted; // Formatted value of attribute - [optional] string Measure; // What type is this attribute - [optional] string Creator; // Which engine created it - [optional] string CreatorType; // What type of engine created it. + string Name; // Name of attribute + string RawValue; // Value of attribute + string Formatted; // Formatted value of attribute + string Measure; // What type is this attribute + string Creator; // Which engine created it + string CreatorType; // What type of engine created it. }; ESPstruct [nil_remove] WUResponseNote { - [optional] string Source; // Thor, Eclcc, Analyser etc - [optional] string Message; - [optional] nonNegativeInteger ErrorCode; - [optional] string Severity; - [optional] nonNegativeInteger Cost; + string Source; // Thor, Eclcc, Analyser etc + string Message; + nonNegativeInteger ErrorCode; + string Severity; + nonNegativeInteger Cost; }; ESPstruct [nil_remove] WUResponseScope { - [optional] string ScopeName; // Fully qualified scope (See definition of "Scope" in workunit.hpp) - [optional] string Id; // Node/Graph id - [optional] string ScopeType; // e.g. Activity, Edge - [optional] ESParray Properties; - [optional, min_ver("1.76")] ESParray Notes; - [optional, min_ver("1.92")] string SinkActivity; // Only used by hotspot code + string ScopeName; // Fully qualified scope (See definition of "Scope" in workunit.hpp) + string Id; // Node/Graph id + string ScopeType; // e.g. Activity, Edge + ESParray Properties; + [min_ver("1.76")] ESParray Notes; + [min_ver("1.92")] string SinkActivity; // Only used by hotspot code }; ESPStruct WUQueryConfigResult diff --git a/esp/services/esdl_svc_engine/CMakeLists.txt b/esp/services/esdl_svc_engine/CMakeLists.txt index 969d98f23ee..796c164eba2 100755 --- a/esp/services/esdl_svc_engine/CMakeLists.txt +++ b/esp/services/esdl_svc_engine/CMakeLists.txt @@ -61,6 +61,7 @@ include_directories ( ${HPCC_SOURCE_DIR}/rtl/eclrtl ${HPCC_SOURCE_DIR}/rtl/include ${HPCC_SOURCE_DIR}/esp/esdllib + ${HPCC_SOURCE_DIR}/esp/esdlscriptlib ${HPCC_SOURCE_DIR}/esp/logging/logginglib ${HPCC_SOURCE_DIR}/esp/logging/loggingmanager ${CMAKE_BINARY_DIR} @@ -86,6 +87,7 @@ target_link_libraries ( esdl_svc_engine remote dalibase esdllib + esdlscriptlib dllserver dalibase ${COMMON_ESP_SERVICE_LIBS} diff --git a/esp/services/ws_esdlconfig/CMakeLists.txt b/esp/services/ws_esdlconfig/CMakeLists.txt index b2f01116d01..87d794da1f3 100644 --- a/esp/services/ws_esdlconfig/CMakeLists.txt +++ b/esp/services/ws_esdlconfig/CMakeLists.txt @@ -57,6 +57,7 @@ include_directories ( ${HPCC_SOURCE_DIR}/esp/smc/SMCLib ${HPCC_SOURCE_DIR}/esp/services/esdl_svc_engine ${HPCC_SOURCE_DIR}/esp/esdllib + ${HPCC_SOURCE_DIR}/esp/esdlscriptlib ${HPCC_SOURCE_DIR}/esp/logging/logginglib ${HPCC_SOURCE_DIR}/esp/logging/loggingmanager ${HPCC_SOURCE_DIR}/common/thorhelper diff --git a/esp/services/ws_topology/ws_topologyService.cpp b/esp/services/ws_topology/ws_topologyService.cpp index 3a03fecc688..ec1eb4a8b42 100644 --- a/esp/services/ws_topology/ws_topologyService.cpp +++ b/esp/services/ws_topology/ws_topologyService.cpp @@ -1978,3 +1978,17 @@ bool CWsTopologyEx::onTpDropZoneQuery(IEspContext &context, IEspTpDropZoneQueryR } return false; } + +bool CWsTopologyEx::onTpListLogFiles(IEspContext &context, IEspTpListLogFilesRequest &req, IEspTpListLogFilesResponse &resp) +{ + try + { + context.ensureFeatureAccess(FEATURE_URL, SecAccess_Read, ECLWATCH_TOPOLOGY_ACCESS_DENIED, "WsTopology::onTpListLogFile: Permission denied."); + m_TpWrapper.listLogFiles(req.getNetworkAddress(), req.getPath(), resp.getFiles()); + } + catch(IException* e) + { + FORWARDEXCEPTION(context, e, ECLWATCH_INTERNAL_ERROR); + } + return false; +} diff --git a/esp/services/ws_topology/ws_topologyService.hpp b/esp/services/ws_topology/ws_topologyService.hpp index 32b0a527659..b4316aeda21 100644 --- a/esp/services/ws_topology/ws_topologyService.hpp +++ b/esp/services/ws_topology/ws_topologyService.hpp @@ -161,6 +161,8 @@ class CWsTopologyEx : public CWsTopology bool onTpSwapNode(IEspContext &context,IEspTpSwapNodeRequest &req, IEspTpSwapNodeResponse &resp); + bool onTpListLogFiles(IEspContext &context, IEspTpListLogFilesRequest &req, IEspTpListLogFilesResponse &resp); + bool onTpXMLFile(IEspContext &context,IEspTpXMLFileRequest &req, IEspTpXMLFileResponse &resp); bool onTpLogFile(IEspContext &context,IEspTpLogFileRequest &req, IEspTpLogFileResponse &resp); diff --git a/esp/smc/SMCLib/TpContainer.cpp b/esp/smc/SMCLib/TpContainer.cpp index 5c1d613bedc..ee72b450357 100644 --- a/esp/smc/SMCLib/TpContainer.cpp +++ b/esp/smc/SMCLib/TpContainer.cpp @@ -315,6 +315,11 @@ void CTpWrapper::getMachineList(double clientVersion, const char* MachineType, c IWARNLOG("UNIMPLEMENTED: CONTAINERIZED(CTpWrapper::getMachineList)"); } +void CTpWrapper::listLogFiles(const char* host, const char* path, IArrayOf& files) +{ + IWARNLOG("UNIMPLEMENTED: CONTAINERIZED(CTpWrapper::listLogFiles)"); +} + const char* CTpWrapper::getNodeNameTag(const char* MachineType) { if (strcmp(MachineType,"Computer")==0) diff --git a/esp/smc/SMCLib/TpWrapper.cpp b/esp/smc/SMCLib/TpWrapper.cpp index e51c5401c2f..9139c36e6f2 100644 --- a/esp/smc/SMCLib/TpWrapper.cpp +++ b/esp/smc/SMCLib/TpWrapper.cpp @@ -2193,3 +2193,51 @@ StringArray & getRoxieDirectAccessPlanes(StringArray & planes, StringBuffer &def planes.append(defaultPlane); return planes; } + +void CTpWrapper::listLogFiles(const char * host, const char * path, IArrayOf & files) +{ + if (isEmptyString(host)) + throw makeStringException(ECLWATCH_INVALID_INPUT, "Network Address must be specified."); + Owned factory = getEnvironmentFactory(true); + Owned env = factory->openEnvironment(); + Owned machine = env->getMachineByAddress(host); + if (!machine) + throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Invalid Network Address %s", host); + + if (isEmptyString(path)) + throw makeStringException(ECLWATCH_INVALID_INPUT, "Path must be specified."); + if (containsRelPaths(path)) //Detect a path like: /var/log/HPCCSystems/myesp/../../../ + throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Invalid path %s", path); + if (!validateConfigurationDirectory(nullptr, "log", nullptr, nullptr, path)) + throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Invalid path %s", path); + + RemoteFilename rfn; + SocketEndpoint ep(host); + rfn.setPath(ep, path); + Owned f = createIFile(rfn); + if (f->isDirectory() != fileBool::foundYes) + throw makeStringExceptionV(ECLWATCH_INVALID_DIRECTORY, "%s is not a directory.", path); + + Owned di = f->directoryFiles("*.log", false, true); + ForEach(*di) + { + StringBuffer fileName; + di->getName(fileName); + + Owned lfs = createLogFileStruct(); + lfs->setName(fileName); + lfs->setPath(path); + lfs->setHost(host); + lfs->setIsDir(di->isDir()); + lfs->setFileSize(di->getFileSize()); + + StringBuffer s; + CDateTime modtime; + di->getModifiedTime(modtime); + modtime.getString(s); + s.setCharAt(10, ' '); + lfs->setModifiedtime(s); + + files.append(*lfs.getLink()); + } +} diff --git a/esp/smc/SMCLib/TpWrapper.hpp b/esp/smc/SMCLib/TpWrapper.hpp index bbc89ee91b0..97b3c8cd5ad 100644 --- a/esp/smc/SMCLib/TpWrapper.hpp +++ b/esp/smc/SMCLib/TpWrapper.hpp @@ -200,6 +200,7 @@ class TPWRAPPER_API CTpWrapper : public CInterface void getTargetClusterList(IArrayOf& clusters, const char* clusterType = NULL, const char* clusterName = NULL); void queryTargetClusterProcess(double version, const char* processName, const char* clusterType, IArrayOf& list); void getServices(double version, const char* serviceType, const char* serviceName, IArrayOf& list); + void listLogFiles(const char* host, const char* path, IArrayOf& files); }; diff --git a/esp/xslt/CMakeLists.txt b/esp/xslt/CMakeLists.txt index 91ecc66a870..53666fb5690 100644 --- a/esp/xslt/CMakeLists.txt +++ b/esp/xslt/CMakeLists.txt @@ -43,6 +43,7 @@ FOREACH( iFILES ${CMAKE_CURRENT_SOURCE_DIR}/esdl2monitor.xslt ${CMAKE_CURRENT_SOURCE_DIR}/esdl2monitor_cassandra.xslt ${CMAKE_CURRENT_SOURCE_DIR}/esxdl2xsd.xslt + ${CMAKE_CURRENT_SOURCE_DIR}/esp_service_xml2xsd.xslt ${CMAKE_CURRENT_SOURCE_DIR}/esdl2java_srvbase.xslt ${CMAKE_CURRENT_SOURCE_DIR}/esdl2java_srvdummy.xslt ${CMAKE_CURRENT_SOURCE_DIR}/esdl2cpp_srvbasehpp.xslt diff --git a/esp/xslt/esp_service_xml2xsd.xslt b/esp/xslt/esp_service_xml2xsd.xslt new file mode 100644 index 00000000000..dc1a6b3d7d0 --- /dev/null +++ b/esp/xslt/esp_service_xml2xsd.xslt @@ -0,0 +1,604 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + + + + + + + + + + + + + + + + + + + ArrayOf + + + + + + + tns: + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + xsd: + + xsd: + + xsd: + + xsd: + + xsd: + + xsd: + + tns: + + + + + + + + true + false + + + Test string: <abc> & <def> + + + + + + + + + + + +
+ + + + + + + + + + + + + + true + false + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + xsd: + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + tns: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + xsd:string + + + tns: + + + + + + + + + + + + + + + + + + + + + + + + tns:EspStringArray + + + + + + + + + + + + + + + tns:ArrayOf + + + + + + + + + + + + + + + xsd:string + tns: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SoapIn + + + + tns: + + tns: + + + + + + + SoapOut + + tns: + + + + + + ServiceSoap + + + + + + + tns:SoapIn + + + tns:SoapOut + + + + + + + + ServiceSoap + tns:ServiceSoap + + + + + + + + /?ver_= + + + + + + + + + + + + + + + + + + + + ServiceSoap + tns:ServiceSoap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/helm/examples/efs/README.md b/helm/examples/efs/README.md index f41698e8ebc..0db57f437a7 100644 --- a/helm/examples/efs/README.md +++ b/helm/examples/efs/README.md @@ -2,30 +2,31 @@ -## EFS CSI Driver +# EFS CSI Driver "examples/efs" requires Elastic FileSystem (EFS) Container Storage Interface (CSI) driver. -We provide some scripts to simplify the process. For detail please reference https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html -Current implementation only tested successfully with a IAM user. It may need update for Active Directory Federation Service (ADFS) +We provide some scripts to simplify the process. For details please reference https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html +Current implementation only tested successfully with a IAM user. It may need updates for Active Directory Federation Service (ADFS) -### Prepare environment -Make sure an EFS server is available or create an [EFS server](#efs-server) before using this chart.
-Fill the following information in efs-env +## Prepare environment +Make sure an EFS file system is available or create an [EFS File System](#efs-file-system) before using this chart.
+Fill in the following information in the efs-env file ```code ACCOUNT_ID # AWS Account ID EKS_NAME # Elastic Kubernetes Service (EKS) cluster name: kubectl configure get-cluster (The first part of the name before ".") EFS_ID # EFS ID can be found from AWS Console or command-line: aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text EFS_REGION # EFS region. We strongly suggest you have the same region for EFS server and EKS cluster -EFS_SECURITY_GROUPS # EFS security group which is the subnet security group which should be same as EKS +EFS_SECURITY_GROUPS # EFS security group which should be the same as the EKS cluster security group. Also, make sure the security group for the mount targets is the same as this one. EFS_BASE_PATH # Base directory to mount in the EFS. If you use EFS for multiple HPCC clusters you should set this differently to avoid clashing with the other clusters +VPC_ID # The same VPC ID as the VPC of the EKS cluster ``` -#### Get the EFS ID +### Get the EFS ID ```Console aws efs describe-file-systems --region ``` The output shows "NAME" and FileSystemID -#### How to get EFS security groups +### How to get EFS security groups ```console aws efs describe-mount-targets --file-system-id --region | awk -F $'\t' '{print $7}' # For each file-system mount target: @@ -34,12 +35,12 @@ The output shows "NAME" and FileSystemID Add each unique security group id to the variable "EFS_SECURITY_GROUPS" -### Install EFS CSI Driver -Run the following command: +## Install EFS CSI Driver +Run the following command under the efs directory: ```code -./install-csi-driver.sh +./install-efs-csi-driver.sh ``` -To verify +The script configures the IAM roles and policies, installs the aws-efs-csi-driver, and creates the file for the "aws-efs-auto" storage class. To verify ```console helm list -n kube-system NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION @@ -51,8 +52,12 @@ efs-csi-controller-594c7f67c7-mncgd 3/3 Running 0 32h efs-csi-node-8g8fk 3/3 Running 0 32h efs-csi-node-fp8vt 3/3 Running 0 32h ``` +# Storage for HPCC cluster +There are three available storage life cycles/methods for the HPCC cluster. +## 1. Dynamic storage with values-auto-efs.yaml +This method uses the storage class "aws-efs-auto" to dynamically create Persistent Volume Claims (PVC). The PVCs are deleted when the HPCC cluster is deleted, meaning that the storage is deleted when the HPCC cluster is deleted. The storage can't be reused between different HPCC clusters.
-### Install "aws-efs" Stroage Class +Under the efs directory, run the following command to create the "aws-efs-auto" storage class ```console kubectl apply -f storageclass.yaml ``` @@ -60,36 +65,102 @@ To verify ```code kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE -aws-efs efs.csi.aws.com Delete Immediate false 32h +aws-efs-auto efs.csi.aws.com Delete Immediate false 9s ``` - -## Deploy HPCC Storage -## Deploy HPCC cluster with values-auto-efs.yaml -It will automically create Persistent Volume Claims (PVC) and delete them when the HPCC cluster is deleted:
-Under the helm directory: +To deploy the HPCC cluster, navigate to the helm directory and run: ```console - helm install myhpcc ./hpcc --set global.image.version= -f examples/efs/values-auto-efs.yaml + helm install myhpcc ./hpcc --set global.image.version=latest -f examples/efs/values-auto-efs.yaml ``` - -## Deploy HPCC cluster with values-retained-efs.yaml -This will require deploying HPCC PVCs first. PVCs will persist after the HPCC cluster is deleted.
-Under the helm directory: +To cleanup, run ```console - helm install awsstorage examples/efs/hpcc-efs - # To start HPCC cluster: - helm install myhpcc hpcc/ --set global.image.version=latest -f examples/efs/values-retained-efs.yaml + helm uninstall myhpcc +``` +## 2. Static storage within Kubernetes with values-retained-efs.yaml +In this method, storage lives on the Kubernetes cluster level. It uses the helm chart "hpcc-efs-dynamic-pv" to manually create PVCs. The PVs are dynamically generated. The PVCs will persist after the HPCC cluster is deleted, meaning that the storage can be reused across different HPCC clusters.
+This method also uses the "aws-efs-auto" storage class. Under the efs directory, run the following command: +```console +kubectl apply -f storageclass.yaml +``` +The storage needs to be created before starting the HPCC cluster. Under the helm directory, run the following command: +```console + helm install awsstorage examples/efs/hpcc-efs-dynamic-pv +``` +To verify +```code +kubectl get pvc +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +dali-awsstorage-hpcc-efs-pvc Bound pvc-400ddbb7-1b89-4468-b416-ffece25aab0d 1Gi RWO aws-efs 5m52s +data-awsstorage-hpcc-efs-pvc Bound pvc-0b99092e-56ba-4c2e-8572-9a5ab4d4da4b 3Gi RWX aws-efs 5m52s +dll-awsstorage-hpcc-efs-pvc Bound pvc-70a470ec-b754-4376-9afb-f1bd499c51ec 1Gi RWX aws-efs 5m52s +mydropzone-awsstorage-hpcc-efs-pvc Bound pvc-9ecd2abc-7713-4639-8da2-91392e636e19 1Gi RWX aws-efs 5m52s +sasha-awsstorage-hpcc-efs-pvc Bound pvc-30c3357c-d982-47f9-ac2c-c1465639b10e 1Gi RWX aws-efs 5m52s +``` +To start the HPCC cluster, run +``` + helm install myhpcc ./hpcc --set global.image.version=latest -f examples/efs/values-retained-efs.yaml ``` An example values file to be supplied when installing the HPCC chart. -NB: Either use the output auto-generated when installing the "hpcc-efs" helm chart, or ensure the names in your values files for the storage types match the PVC names created. "values-retained-efs.yaml" expects that helm chart installation name is "awsstorage". Change the PVC name accordingly if another name is used. +NB: Either use the output auto-generated when installing the "hpcc-efs" helm chart, or ensure the names in your values files for the storage types match the PVC names created. The "values-retained-efs.yaml" file expects that helm chart installation name is "awsstorage". Change the PVC name accordingly if another name is used.
+To cleanup, run +```console + helm uninstall myhpcc + helm uninstall awsstorage +``` +## 3. Static storage beyond Kubernetes with values-retained-efs.yaml +In this method, the storage lives beyond the Kubernetes cluster. It uses the helm chart "hpcc-efs-static-pv" to manually create PVs and PVCs and to configure access points in EFS with the Kubernetes cluster. This means that even if the Kubernetes cluster is deleted, the storage will remain and can be reused across different Kubernetes clusters.
+The create-ap.sh script creates five access points in EFS for each of dali, dll, sasha, data, and mydropzone. It also displays a description for each access point. You may need to add additional tags to the access points depending on your organization. For example, for RISK users, the "owner" and "owner_email" tags are required; add these to the script as needed.
+Once you are ready, under the efs directory run the following command: +```code +./create-ap.sh +``` +Note that running the script again will create five more access points with the same exact specifications. Use the delete-ap.sh to delete all access points.
+Navigate to hpcc-efs-static-pv -> values.yaml. Paste the EFS ID where it says "efsID" and the access point IDs where it says "apID". You can get the access point IDs either through the console or from the descriptions after running the create-ap.sh script. Make sure the correct access point IDs correspond to the correct names in the values.yaml.
-helm uninstall will not delete EFS persistant volumes claims (PVC). You can either run "kubectl delete pv or --all". +The storage needs to be created before starting the HPCC cluster. Under the helm directory, run the following command: +```console + helm install awsstorage examples/efs/hpcc-efs-static-pv +``` +To verify +```code +kubectl get sc +NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE +aws-efs-static efs.csi.aws.com Delete Immediate false 110s +``` +```code +kubectl get pv +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE +dali-awsstorage-hpcc-efs-pv 1Gi RWO Retain Bound default/dali-awsstorage-hpcc-efs-pvc aws-efs-static 23s +data-awsstorage-hpcc-efs-pv 3Gi RWX Retain Bound default/data-awsstorage-hpcc-efs-pvc aws-efs-static 23s +dll-awsstorage-hpcc-efs-pv 1Gi RWX Retain Bound default/dll-awsstorage-hpcc-efs-pvc aws-efs-static 23s +mydropzone-awsstorage-hpcc-efs-pv 1Gi RWX Retain Bound default/mydropzone-awsstorage-hpcc-efs-pvc aws-efs-static 23s +sasha-awsstorage-hpcc-efs-pv 1Gi RWX Retain Bound default/sasha-awsstorage-hpcc-efs-pvc aws-efs-static 23s +``` +```code +kubectl get pvc +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +dali-awsstorage-hpcc-efs-pvc Bound dali-awsstorage-hpcc-efs-pv 1Gi RWO aws-efs-static 29s +data-awsstorage-hpcc-efs-pvc Bound data-awsstorage-hpcc-efs-pv 3Gi RWX aws-efs-static 29s +dll-awsstorage-hpcc-efs-pvc Bound dll-awsstorage-hpcc-efs-pv 1Gi RWX aws-efs-static 29s +mydropzone-awsstorage-hpcc-efs-pvc Bound mydropzone-awsstorage-hpcc-efs-pv 1Gi RWX aws-efs-static 29s +sasha-awsstorage-hpcc-efs-pvc Bound sasha-awsstorage-hpcc-efs-pv 1Gi RWX aws-efs-static 29s +``` +To start the HPCC cluster, run +``` + helm install myhpcc ./hpcc --set global.image.version=latest -f examples/efs/values-retained-efs.yaml +``` +To cleanup, run +```console + helm uninstall myhpcc + helm uninstall awsstorage +``` -## EFS Server +# EFS File System Reference: - https://docs.aws.amazon.com/efs/latest/ug/gs-step-two-create-efs-resources.html - https://hpccsystems.com/blog/Cloud-AWS - -We will go through some steps of creating EFS server with AWS CLI. If you don't have AWS CLI reference +You can use either AWS CLI or the console to create the EFS. +## AWS CLI +If you don't have AWS CLI reference - https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html For simple setup we recommend you use the same VPC/Subnets and security group for both EFS and EKS @@ -102,7 +173,7 @@ The EFS server FQDN will be .efs..amazonaws.com ``` -### Creat the Mount Targets +### Creating the Mount Targets Pick a VPC in the the same region of EFS server ```console aws ec2 describe-vpcs --region @@ -125,3 +196,9 @@ To display the mount targets: ```console aws efs describe-mount-targets --region --file-system-id ``` +## Console +### Create EFS Server +Navigate to the EFS service and click "Create file system". Select the same VPC as the one your EKS cluster is running in. +### Configuring the Mount Targets +Click on the file system you just created and navigate to "Network". Your mount targets should be displayed.
+Click on "Manage", and you should see that the security groups for the mount targets are the default security group. Replace these with the EKS cluster security group. To find the EKS cluster security group navigate to EKS. Click on your cluster. Click on "Networking", and find the security group displayed under "Cluster security group". After replacing the default security group for all mount targets, save your changes. \ No newline at end of file diff --git a/helm/examples/efs/create-ap.sh b/helm/examples/efs/create-ap.sh new file mode 100755 index 00000000000..52f918e7fe7 --- /dev/null +++ b/helm/examples/efs/create-ap.sh @@ -0,0 +1,31 @@ +#!/bin/bash +WORK_DIR=$(dirname $0) + +source ${WORK_DIR}/efs-env + +echo "creating access points for ${EFS_ID}" +aws efs create-access-point \ + --file-system-id ${EFS_ID} \ + --posix-user Gid=10001,Uid=10000 \ + --root-directory Path='/hpcc/dali,CreationInfo={OwnerUid=10000,OwnerGid=10001,Permissions=0700}' \ + --tags Key=Name,Value=dali-ap +aws efs create-access-point \ + --file-system-id ${EFS_ID} \ + --posix-user Gid=10001,Uid=10000 \ + --root-directory Path='/hpcc/dll,CreationInfo={OwnerUid=10000,OwnerGid=10001,Permissions=0700}' \ + --tags Key=Name,Value=dll-ap +aws efs create-access-point \ + --file-system-id ${EFS_ID} \ + --posix-user Gid=10001,Uid=10000 \ + --root-directory Path='/hpcc/sasha,CreationInfo={OwnerUid=10000,OwnerGid=10001,Permissions=0700}' \ + --tags Key=Name,Value=sasha-ap +aws efs create-access-point \ + --file-system-id ${EFS_ID} \ + --posix-user Gid=10001,Uid=10000 \ + --root-directory Path='/hpcc/data,CreationInfo={OwnerUid=10000,OwnerGid=10001,Permissions=0700}' \ + --tags Key=Name,Value=data-ap +aws efs create-access-point \ + --file-system-id ${EFS_ID} \ + --posix-user Gid=10001,Uid=10000 \ + --root-directory Path='/hpcc/mydropzone,CreationInfo={OwnerUid=10000,OwnerGid=10001,Permissions=0700}' \ + --tags Key=Name,Value=mydropzone-ap \ No newline at end of file diff --git a/helm/examples/efs/delete-ap.sh b/helm/examples/efs/delete-ap.sh new file mode 100755 index 00000000000..3d771e28885 --- /dev/null +++ b/helm/examples/efs/delete-ap.sh @@ -0,0 +1,16 @@ +#!/bin/bash +WORK_DIR=$(dirname $0) + +source ${WORK_DIR}/efs-env + +echo "deleting access points for ${EFS_ID}" +# Set the AWS CLI output format to JSON +export AWS_DEFAULT_OUTPUT="json" + +# Get the Access Point IDs using `describe-access-points` command and command substitution +access_point_ids=($(aws efs describe-access-points --file-system-id "${EFS_ID}" --query 'AccessPoints[*].AccessPointId' --output text)) + +# Loop through the access_point_ids array and delete each Access Point +for access_point_id in "${access_point_ids[@]}"; do + aws efs delete-access-point --access-point-id "$access_point_id" +done \ No newline at end of file diff --git a/helm/examples/efs/efs-env b/helm/examples/efs/efs-env index b9bdfd13068..cd6fc0d641d 100644 --- a/helm/examples/efs/efs-env +++ b/helm/examples/efs/efs-env @@ -3,7 +3,7 @@ EKS_NAME= EFS_ID= EFS_BASE_PATH=/hpcc-efs -EFS_REGION=us-east-1 +EFS_REGION= EFS_SECURITY_GROUPS= # Need VPC_ID if want to add security inbound rule for NFS VPC_ID= @@ -13,4 +13,4 @@ EFS_NAME=efs-provisioner EFS_CSI_DRIVER_ACCOUNT_ID_BY_REGION=602401143452 # efs-provisioner -RECLAIM_POLICY=Retain +RECLAIM_POLICY=Retain \ No newline at end of file diff --git a/helm/examples/efs/hpcc-efs/Chart.yaml b/helm/examples/efs/hpcc-efs-dynamic-pv/Chart.yaml similarity index 100% rename from helm/examples/efs/hpcc-efs/Chart.yaml rename to helm/examples/efs/hpcc-efs-dynamic-pv/Chart.yaml diff --git a/helm/examples/efs/hpcc-efs/templates/NOTES.txt b/helm/examples/efs/hpcc-efs-dynamic-pv/templates/NOTES.txt similarity index 100% rename from helm/examples/efs/hpcc-efs/templates/NOTES.txt rename to helm/examples/efs/hpcc-efs-dynamic-pv/templates/NOTES.txt diff --git a/helm/examples/efs/hpcc-efs/templates/_helpers.tpl b/helm/examples/efs/hpcc-efs-dynamic-pv/templates/_helpers.tpl similarity index 100% rename from helm/examples/efs/hpcc-efs/templates/_helpers.tpl rename to helm/examples/efs/hpcc-efs-dynamic-pv/templates/_helpers.tpl diff --git a/helm/examples/efs/hpcc-efs/templates/create-pvc.yaml b/helm/examples/efs/hpcc-efs-dynamic-pv/templates/create-pvc.yaml similarity index 91% rename from helm/examples/efs/hpcc-efs/templates/create-pvc.yaml rename to helm/examples/efs/hpcc-efs-dynamic-pv/templates/create-pvc.yaml index 3a219b345ad..75252c0b5a7 100644 --- a/helm/examples/efs/hpcc-efs/templates/create-pvc.yaml +++ b/helm/examples/efs/hpcc-efs-dynamic-pv/templates/create-pvc.yaml @@ -6,7 +6,7 @@ metadata: spec: accessModes: - {{ $plane.rwmany | default false | ternary "ReadWriteMany" "ReadWriteOnce" }} - storageClassName: aws-efs + storageClassName: aws-efs-auto resources: requests: storage: {{ $plane.size }} diff --git a/helm/examples/efs/hpcc-efs/values.schema.json b/helm/examples/efs/hpcc-efs-dynamic-pv/values.schema.json similarity index 100% rename from helm/examples/efs/hpcc-efs/values.schema.json rename to helm/examples/efs/hpcc-efs-dynamic-pv/values.schema.json diff --git a/helm/examples/efs/hpcc-efs/values.yaml b/helm/examples/efs/hpcc-efs-dynamic-pv/values.yaml similarity index 100% rename from helm/examples/efs/hpcc-efs/values.yaml rename to helm/examples/efs/hpcc-efs-dynamic-pv/values.yaml diff --git a/helm/examples/efs/hpcc-efs-static-pv/Chart.yaml b/helm/examples/efs/hpcc-efs-static-pv/Chart.yaml new file mode 100644 index 00000000000..e66456abefe --- /dev/null +++ b/helm/examples/efs/hpcc-efs-static-pv/Chart.yaml @@ -0,0 +1,21 @@ +apiVersion: v2 +name: hpcc-efs +description: A helm chart to provision HPCC PVC's using the 'aws-efs' Storage Class + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. +appVersion: 1.16.0 \ No newline at end of file diff --git a/helm/examples/efs/hpcc-efs-static-pv/templates/NOTES.txt b/helm/examples/efs/hpcc-efs-static-pv/templates/NOTES.txt new file mode 100644 index 00000000000..8db619b278c --- /dev/null +++ b/helm/examples/efs/hpcc-efs-static-pv/templates/NOTES.txt @@ -0,0 +1,21 @@ +#The following is a generated values yaml that you can capture and feed to the hpcc helm chart when installing. +#it will configure the hpcc storage to use the planes and pvcs installed by this chart. + +storage: + planes: +{{- range $plane := .Values.planes }} + - name: {{ $plane.name }} + pvc: {{ printf "%s-%s-pvc" $plane.name (include "hpcc-efs.fullname" $) }} + prefix: {{ printf "%s%s%s" $.Values.common.mountPrefix (regexMatch ".*/$" $.Values.common.mountPrefix | ternary "" "/") $plane.subPath | quote }} + category: {{ $plane.category }} +{{- end }} + +{{ range $plane := .Values.planes -}} +{{ if eq "sasha" $plane.name }} +sasha: + wu-archiver: + plane: {{ $plane.name }} + dfuwu-archiver: + plane: {{ $plane.name }} +{{ end -}} +{{- end }} \ No newline at end of file diff --git a/helm/examples/efs/hpcc-efs-static-pv/templates/_helpers.tpl b/helm/examples/efs/hpcc-efs-static-pv/templates/_helpers.tpl new file mode 100644 index 00000000000..021d71b04e7 --- /dev/null +++ b/helm/examples/efs/hpcc-efs-static-pv/templates/_helpers.tpl @@ -0,0 +1,63 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "hpcc-efs.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "hpcc-efs.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "hpcc-efs.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "hpcc-efs.labels" -}} +helm.sh/chart: {{ include "hpcc-efs.chart" . }} +{{ include "hpcc-efs.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Selector labels +*/}} +{{- define "hpcc-efs.selectorLabels" -}} +app.kubernetes.io/name: {{ include "hpcc-efs.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} + +{{/* +Create the name of the service account to use +*/}} +{{- define "hpcc-efs.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} + {{ default (include "hpcc-efs.fullname" .) .Values.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/helm/examples/efs/hpcc-efs-static-pv/templates/config-storage.yaml b/helm/examples/efs/hpcc-efs-static-pv/templates/config-storage.yaml new file mode 100644 index 00000000000..b881d4e0ac9 --- /dev/null +++ b/helm/examples/efs/hpcc-efs-static-pv/templates/config-storage.yaml @@ -0,0 +1,40 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: aws-efs-static +provisioner: efs.csi.aws.com +--- +{{- range $plane := .Values.planes -}} +apiVersion: v1 +kind: PersistentVolume +metadata: + name: {{ printf "%s-%s-pv" $plane.name (include "hpcc-efs.fullname" $) }} +spec: + capacity: + storage: {{ $plane.size }} + volumeMode: Filesystem + accessModes: + - {{ $plane.rwmany | default false | ternary "ReadWriteMany" "ReadWriteOnce" }} + persistentVolumeReclaimPolicy: Retain + storageClassName: aws-efs-static + csi: + driver: efs.csi.aws.com + volumeHandle: {{ printf "%s::%s" $.Values.common.efsID $plane.apID }} +--- +{{ end }} + +{{- range $plane := .Values.planes -}} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ printf "%s-%s-pvc" $plane.name (include "hpcc-efs.fullname" $) }} +spec: + volumeName: {{ printf "%s-%s-pv" $plane.name (include "hpcc-efs.fullname" $) }} + accessModes: + - {{ $plane.rwmany | default false | ternary "ReadWriteMany" "ReadWriteOnce" }} + storageClassName: aws-efs-static + resources: + requests: + storage: {{ $plane.size }} +--- +{{ end }} \ No newline at end of file diff --git a/helm/examples/efs/hpcc-efs-static-pv/values.schema.json b/helm/examples/efs/hpcc-efs-static-pv/values.schema.json new file mode 100644 index 00000000000..f5b464468e0 --- /dev/null +++ b/helm/examples/efs/hpcc-efs-static-pv/values.schema.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "common": { + "type": "object", + "properties": { + "commonPrefix": { + "type": "string" + }, + "efsID": { + "type": "string" + } + } + }, + "planes": { + "description": "List of planes to mount locally", + "oneOf": [ + { + "type": "array", + "items": { "$ref": "#/definitions/plane" } + }, + { + "type": "null" + } + ] + } + }, + "title": "Values", + "type": "object", + "definitions": { + "plane": { + "type": "object", + "properties": { + "name": { + "description": "Prefix for the pvc name", + "type": "string" + }, + "subPath": { + "description": "sub path from common.hostpath on host where the pvc is created", + "type": "string" + }, + "size": { + "description": "Size that is required for the volume", + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "rwmany": { + "description": "Does the pvc require rw many access (data/dll currently)", + "type": "boolean" + }, + "sku": { + "type": "string" + }, + "category": { + "description": "the category this plane is usd for, e.g. lz, data", + "type": "string" + }, + "apID": { + "description": "the access point ID for the corresponding storage", + "type": "string" + } + }, + "required": [ "name", "subPath", "size" ], + "additionalProperties": false + } + } + } \ No newline at end of file diff --git a/helm/examples/efs/hpcc-efs-static-pv/values.yaml b/helm/examples/efs/hpcc-efs-static-pv/values.yaml new file mode 100644 index 00000000000..fa94650b64d --- /dev/null +++ b/helm/examples/efs/hpcc-efs-static-pv/values.yaml @@ -0,0 +1,35 @@ +# Default values for hpcc-efs. +common: + mountPrefix: "/var/lib/HPCCSystems" + efsID: + +planes: +- name: dali + subPath: dalistorage + size: 1Gi + category: dali + apID: +- name: dll + subPath: queries # cannot currently be changed + size: 1Gi + category: dll + rwmany: true + apID: +- name: sasha + subPath: sasha + size: 1Gi + rwmany: true + category: sasha + apID: +- name: data + subPath: hpcc-data + size: 3Gi + category: data # NB: all "data" planes will be auto mounted by engine components and others that require access to data + rwmany: true + apID: +- name: mydropzone + subPath: dropzone + size: 1Gi + rwmany: true + category: lz + apID: \ No newline at end of file diff --git a/helm/examples/efs/install-csi-driver.sh b/helm/examples/efs/install-efs-csi-driver.sh similarity index 100% rename from helm/examples/efs/install-csi-driver.sh rename to helm/examples/efs/install-efs-csi-driver.sh diff --git a/helm/examples/efs/storageclass.yaml.template b/helm/examples/efs/storageclass.yaml.template index 4b1bce926e9..311611f909e 100644 --- a/helm/examples/efs/storageclass.yaml.template +++ b/helm/examples/efs/storageclass.yaml.template @@ -1,7 +1,7 @@ kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: - name: aws-efs + name: aws-efs-auto provisioner: efs.csi.aws.com parameters: provisioningMode: efs-ap diff --git a/helm/examples/efs/values-auto-efs.yaml b/helm/examples/efs/values-auto-efs.yaml index dfd9635e63b..df6c8fe1e74 100644 --- a/helm/examples/efs/values-auto-efs.yaml +++ b/helm/examples/efs/values-auto-efs.yaml @@ -6,31 +6,31 @@ storage: planes: - name: dali storageSize: 1Gi - storageClass: "aws-efs" + storageClass: "aws-efs-auto" prefix: "/var/lib/HPCCSystems/dalistorage" category: dali - name: dll prefix: "/var/lib/HPCCSystems/queries" storageSize: 1Gi - storageClass: "aws-efs" + storageClass: "aws-efs-auto" category: dll - name: sasha storageSize: 1Gi - storageClass: "aws-efs" + storageClass: "aws-efs-auto" prefix: "/var/lib/HPCCSystems/sashastorage" category: sasha - name: data storageSize: 1Gi - storageClass: "aws-efs" + storageClass: "aws-efs-auto" prefix: "/var/lib/HPCCSystems/hpcc-data" category: data - name: mydropzone storageSize: 1Gi - storageClass: "aws-efs" + storageClass: "aws-efs-auto" prefix: "/var/lib/HPCCSystems/mydropzone" category: lz diff --git a/helm/hpcc/Chart.yaml b/helm/hpcc/Chart.yaml index e4cebd9162a..02abb3e67fd 100644 --- a/helm/hpcc/Chart.yaml +++ b/helm/hpcc/Chart.yaml @@ -6,9 +6,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 9.2.11-closedown0 +version: 9.3.0-trunk0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 9.2.11-closedown0 +appVersion: 9.3.0-trunk0 diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index 01e9e706cbd..eb518b77c09 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -1320,7 +1320,7 @@ kind: Service metadata: name: {{ $lvars.serviceName | quote }} labels: - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- include "hpcc.addStandardLabels" (dict "root" $.root "instance" $lvars.serviceName ) | indent 4 }} {{- if $lvars.labels }} {{ toYaml $lvars.labels | indent 4 }} diff --git a/helm/hpcc/templates/dafilesrv.yaml b/helm/hpcc/templates/dafilesrv.yaml index 7984425d5b4..e14f5dc2969 100644 --- a/helm/hpcc/templates/dafilesrv.yaml +++ b/helm/hpcc/templates/dafilesrv.yaml @@ -50,7 +50,7 @@ spec: labels: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dafilesrv" "name" "dafilesrv" "instance" .name) | indent 8 }} server: {{ .name | quote }} - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 annotations: checksum/config: {{ $configSHA }} spec: diff --git a/helm/hpcc/templates/dali.yaml b/helm/hpcc/templates/dali.yaml index 60392897579..8be6387b9a6 100644 --- a/helm/hpcc/templates/dali.yaml +++ b/helm/hpcc/templates/dali.yaml @@ -82,7 +82,7 @@ spec: run: {{ $dali.name | quote }} server: {{ $dali.name | quote }} app: dali - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} {{- end }} diff --git a/helm/hpcc/templates/dfuserver.yaml b/helm/hpcc/templates/dfuserver.yaml index ed6cb8bd026..f6227ade9a1 100644 --- a/helm/hpcc/templates/dfuserver.yaml +++ b/helm/hpcc/templates/dfuserver.yaml @@ -56,7 +56,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dfuserver" "name" "dfuserver" "instance" .name) | indent 8 }} run: {{ .name | quote }} accessDali: "yes" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclagent.yaml b/helm/hpcc/templates/eclagent.yaml index d50b5a10f22..245e7554577 100644 --- a/helm/hpcc/templates/eclagent.yaml +++ b/helm/hpcc/templates/eclagent.yaml @@ -58,7 +58,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" $apptype "name" "eclagent" "instance" $appJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -135,7 +135,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclccserver.yaml b/helm/hpcc/templates/eclccserver.yaml index b6d9970c61d..1e21027e137 100644 --- a/helm/hpcc/templates/eclccserver.yaml +++ b/helm/hpcc/templates/eclccserver.yaml @@ -57,7 +57,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclccserver" "name" "eclccserver" "instance" $compileJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -142,7 +142,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclscheduler.yaml b/helm/hpcc/templates/eclscheduler.yaml index 23c09c80931..23aeff086d8 100644 --- a/helm/hpcc/templates/eclscheduler.yaml +++ b/helm/hpcc/templates/eclscheduler.yaml @@ -64,7 +64,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: "no" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/esp.yaml b/helm/hpcc/templates/esp.yaml index 083ef94a8d3..95fb11ba4d8 100644 --- a/helm/hpcc/templates/esp.yaml +++ b/helm/hpcc/templates/esp.yaml @@ -117,7 +117,7 @@ spec: server: {{ .name | quote }} accessDali: "yes" app: {{ $application }} - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- include "hpcc.addStandardLabels" (dict "root" $ "name" $application "component" "esp" "instance" .name) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} diff --git a/helm/hpcc/templates/localroxie.yaml b/helm/hpcc/templates/localroxie.yaml index 2952aa2d0f3..645a8cbb35b 100644 --- a/helm/hpcc/templates/localroxie.yaml +++ b/helm/hpcc/templates/localroxie.yaml @@ -70,7 +70,7 @@ spec: server: {{ $servername | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $roxie.name) | indent 8 }} {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} diff --git a/helm/hpcc/templates/roxie.yaml b/helm/hpcc/templates/roxie.yaml index cfe9c6fe93c..4c1f128b5b1 100644 --- a/helm/hpcc/templates/roxie.yaml +++ b/helm/hpcc/templates/roxie.yaml @@ -120,7 +120,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 8 }} run: {{ $commonCtx.toponame | quote }} roxie-cluster: {{ $roxie.name | quote }} - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} @@ -180,7 +180,7 @@ kind: Service metadata: name: {{ $commonCtx.toponame | quote }} labels: - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 4 }} spec: ports: @@ -242,7 +242,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $servername) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} @@ -347,7 +347,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} diff --git a/helm/hpcc/templates/sasha.yaml b/helm/hpcc/templates/sasha.yaml index edc1a4753d0..5b64f920782 100644 --- a/helm/hpcc/templates/sasha.yaml +++ b/helm/hpcc/templates/sasha.yaml @@ -52,7 +52,7 @@ spec: run: {{ $serviceName | quote }} server: {{ $serviceName | quote }} accessDali: {{ (has "dali" $sasha.access) | ternary "yes" "no" | quote }} - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- if hasKey $sasha "labels" }} {{ toYaml $sasha.labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/thor.yaml b/helm/hpcc/templates/thor.yaml index 32788a9472e..5eafff196c0 100644 --- a/helm/hpcc/templates/thor.yaml +++ b/helm/hpcc/templates/thor.yaml @@ -82,7 +82,7 @@ data: labels: accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $eclAgentJobName "instanceOf" (printf "%s-job" .eclAgentName)) | indent 8 }} {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} @@ -147,7 +147,7 @@ data: accessEsp: "yes" app: "thor" component: "thormanager" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thormanager" "name" "thor" "instance" $thorManagerJobName "instanceOf" (printf "%s-thormanager-job" .me.name)) | indent 12 }} @@ -214,7 +214,7 @@ data: accessEsp: "yes" app: "thor" component: "thorworker" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thorworker" "name" "thor" "instance" $thorWorkerJobName "instanceOf" (printf "%s-thorworker-job" .me.name)) | indent 12 }} @@ -347,7 +347,7 @@ spec: accessEsp: {{ $commonCtx.eclAgentUseChildProcesses | ternary "yes" "no" | quote }} app: "thor" component: "thor-eclagent" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 instance: {{ $commonCtx.eclAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.eclAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} @@ -412,7 +412,7 @@ spec: accessEsp: "no" app: "thor" component: "thor-thoragent" - helmVersion: 9.2.11-closedown0 + helmVersion: 9.3.0-trunk0 instance: {{ $commonCtx.thorAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.thorAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} diff --git a/package-lock.json b/package-lock.json index 2d8119b4a5c..2f9d59c9ddc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,26 +8,39 @@ "license": "Apache-2.0", "devDependencies": { "npm-run-all": "4.1.5", - "vitepress": "1.0.0-alpha.47", - "vue": "3.2.47" + "vitepress": "1.0.0-beta.3", + "vue": "3.3.4" } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", - "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", "dev": true, "dependencies": { - "@algolia/autocomplete-shared": "1.7.4" + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", - "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", "dev": true, "dependencies": { - "@algolia/autocomplete-shared": "1.7.4" + "@algolia/autocomplete-shared": "1.9.3" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -35,144 +48,148 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", - "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==", - "dev": true + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.3.tgz", - "integrity": "sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.18.0.tgz", + "integrity": "sha512-rUAs49NLlO8LVLgGzM4cLkw8NJLKguQLgvFmBEe3DyzlinoqxzQMHfKZs6TSq4LZfw/z8qHvRo8NcTAAUJQLcw==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.14.3" + "@algolia/cache-common": "4.18.0" } }, "node_modules/@algolia/cache-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.3.tgz", - "integrity": "sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.18.0.tgz", + "integrity": "sha512-BmxsicMR4doGbeEXQu8yqiGmiyvpNvejYJtQ7rvzttEAMxOPoWEHrWyzBQw4x7LrBY9pMrgv4ZlUaF8PGzewHg==", "dev": true }, "node_modules/@algolia/cache-in-memory": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.3.tgz", - "integrity": "sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.18.0.tgz", + "integrity": "sha512-evD4dA1nd5HbFdufBxLqlJoob7E2ozlqJZuV3YlirNx5Na4q1LckIuzjNYZs2ddLzuTc/Xd5O3Ibf7OwPskHxw==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.14.3" + "@algolia/cache-common": "4.18.0" } }, "node_modules/@algolia/client-account": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.3.tgz", - "integrity": "sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.18.0.tgz", + "integrity": "sha512-XsDnlROr3+Z1yjxBJjUMfMazi1V155kVdte6496atvBgOEtwCzTs3A+qdhfsAnGUvaYfBrBkL0ThnhMIBCGcew==", "dev": true, "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/@algolia/client-analytics": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.3.tgz", - "integrity": "sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.18.0.tgz", + "integrity": "sha512-chEUSN4ReqU7uRQ1C8kDm0EiPE+eJeAXiWcBwLhEynfNuTfawN9P93rSZktj7gmExz0C8XmkbBU19IQ05wCNrQ==", "dev": true, "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/@algolia/client-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", - "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.18.0.tgz", + "integrity": "sha512-7N+soJFP4wn8tjTr3MSUT/U+4xVXbz4jmeRfWfVAzdAbxLAQbHa0o/POSdTvQ8/02DjCLelloZ1bb4ZFVKg7Wg==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/@algolia/client-personalization": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.3.tgz", - "integrity": "sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.18.0.tgz", + "integrity": "sha512-+PeCjODbxtamHcPl+couXMeHEefpUpr7IHftj4Y4Nia1hj8gGq4VlIcqhToAw8YjLeCTfOR7r7xtj3pJcYdP8A==", "dev": true, "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/@algolia/client-search": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.3.tgz", - "integrity": "sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.18.0.tgz", + "integrity": "sha512-F9xzQXTjm6UuZtnsLIew6KSraXQ0AzS/Ee+OD+mQbtcA/K1sg89tqb8TkwjtiYZ0oij13u3EapB3gPZwm+1Y6g==", "dev": true, "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/@algolia/logger-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.3.tgz", - "integrity": "sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.18.0.tgz", + "integrity": "sha512-46etYgSlkoKepkMSyaoriSn2JDgcrpc/nkOgou/lm0y17GuMl9oYZxwKKTSviLKI5Irk9nSKGwnBTQYwXOYdRg==", "dev": true }, "node_modules/@algolia/logger-console": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.3.tgz", - "integrity": "sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.18.0.tgz", + "integrity": "sha512-3P3VUYMl9CyJbi/UU1uUNlf6Z8N2ltW3Oqhq/nR7vH0CjWv32YROq3iGWGxB2xt3aXobdUPXs6P0tHSKRmNA6g==", "dev": true, "dependencies": { - "@algolia/logger-common": "4.14.3" + "@algolia/logger-common": "4.18.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.3.tgz", - "integrity": "sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.18.0.tgz", + "integrity": "sha512-/AcWHOBub2U4TE/bPi4Gz1XfuLK6/7dj4HJG+Z2SfQoS1RjNLshZclU3OoKIkFp8D2NC7+BNsPvr9cPLyW8nyQ==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.14.3" + "@algolia/requester-common": "4.18.0" } }, "node_modules/@algolia/requester-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.3.tgz", - "integrity": "sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.18.0.tgz", + "integrity": "sha512-xlT8R1qYNRBCi1IYLsx7uhftzdfsLPDGudeQs+xvYB4sQ3ya7+ppolB/8m/a4F2gCkEO6oxpp5AGemM7kD27jA==", "dev": true }, "node_modules/@algolia/requester-node-http": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.3.tgz", - "integrity": "sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.18.0.tgz", + "integrity": "sha512-TGfwj9aeTVgOUhn5XrqBhwUhUUDnGIKlI0kCBMdR58XfXcfdwomka+CPIgThRbfYw04oQr31A6/95ZH2QVJ9UQ==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.14.3" + "@algolia/requester-common": "4.18.0" } }, "node_modules/@algolia/transporter": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.3.tgz", - "integrity": "sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.18.0.tgz", + "integrity": "sha512-xbw3YRUGtXQNG1geYFEDDuFLZt4Z8YNKbamHPkzr3rWc6qp4/BqEeXcI2u/P/oMq2yxtXgMxrCxOPA8lyIe5jw==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.14.3", - "@algolia/logger-common": "4.14.3", - "@algolia/requester-common": "4.14.3" + "@algolia/cache-common": "4.18.0", + "@algolia/logger-common": "4.18.0", + "@algolia/requester-common": "4.18.0" } }, "node_modules/@babel/parser": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz", - "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -182,30 +199,30 @@ } }, "node_modules/@docsearch/css": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", - "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz", + "integrity": "sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==", "dev": true }, "node_modules/@docsearch/js": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.3.3.tgz", - "integrity": "sha512-2xAv2GFuHzzmG0SSZgf8wHX0qZX8n9Y1ZirKUk5Wrdc+vH9CL837x2hZIUdwcPZI9caBA+/CzxsS68O4waYjUQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.1.tgz", + "integrity": "sha512-EXi8de5njxgP6TV3N9ytnGRLG9zmBNTEZjR4VzwPcpPLbZxxTLG2gaFyJyKiFVQxHW/DPlMrDJA3qoRRGEkgZw==", "dev": true, "dependencies": { - "@docsearch/react": "3.3.3", + "@docsearch/react": "3.5.1", "preact": "^10.0.0" } }, "node_modules/@docsearch/react": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", - "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz", + "integrity": "sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==", "dev": true, "dependencies": { - "@algolia/autocomplete-core": "1.7.4", - "@algolia/autocomplete-preset-algolia": "1.7.4", - "@docsearch/css": "3.3.3", + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.1", "algoliasearch": "^4.0.0" }, "peerDependencies": { @@ -226,9 +243,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", - "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", "cpu": [ "arm" ], @@ -242,9 +259,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", - "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", "cpu": [ "arm64" ], @@ -258,9 +275,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", - "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", "cpu": [ "x64" ], @@ -274,9 +291,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", - "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", "cpu": [ "arm64" ], @@ -290,9 +307,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", - "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", "cpu": [ "x64" ], @@ -306,9 +323,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", - "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", "cpu": [ "arm64" ], @@ -322,9 +339,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", - "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", "cpu": [ "x64" ], @@ -338,9 +355,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", - "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", "cpu": [ "arm" ], @@ -354,9 +371,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", - "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", "cpu": [ "arm64" ], @@ -370,9 +387,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", - "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", "cpu": [ "ia32" ], @@ -386,9 +403,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", - "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", "cpu": [ "loong64" ], @@ -402,9 +419,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", - "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", "cpu": [ "mips64el" ], @@ -418,9 +435,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", - "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", "cpu": [ "ppc64" ], @@ -434,9 +451,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", - "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", "cpu": [ "riscv64" ], @@ -450,9 +467,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", - "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", "cpu": [ "s390x" ], @@ -466,9 +483,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", - "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", "cpu": [ "x64" ], @@ -482,9 +499,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", - "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", "cpu": [ "x64" ], @@ -498,9 +515,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", - "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", "cpu": [ "x64" ], @@ -514,9 +531,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", - "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", "cpu": [ "x64" ], @@ -530,9 +547,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", - "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", "cpu": [ "arm64" ], @@ -546,9 +563,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", - "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", "cpu": [ "ia32" ], @@ -562,9 +579,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", - "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", "cpu": [ "x64" ], @@ -577,16 +594,22 @@ "node": ">=12" } }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, "node_modules/@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==", "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz", - "integrity": "sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", + "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", "dev": true, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -597,53 +620,53 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", - "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", "dev": true, "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.47", + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "source-map": "^0.6.1" + "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", - "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", - "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", "dev": true, "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-ssr": "3.2.47", - "@vue/reactivity-transform": "3.2.47", - "@vue/shared": "3.2.47", + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", + "magic-string": "^0.30.0", "postcss": "^8.1.10", - "source-map": "^0.6.1" + "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", - "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/@vue/devtools-api": { @@ -653,86 +676,178 @@ "dev": true }, "node_modules/@vue/reactivity": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", - "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", "dev": true, "dependencies": { - "@vue/shared": "3.2.47" + "@vue/shared": "3.3.4" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", - "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", "dev": true, "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47", + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" + "magic-string": "^0.30.0" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", - "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", "dev": true, "dependencies": { - "@vue/reactivity": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", - "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", "dev": true, "dependencies": { - "@vue/runtime-core": "3.2.47", - "@vue/shared": "3.2.47", - "csstype": "^2.6.8" + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" } }, "node_modules/@vue/server-renderer": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", - "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", "dev": true, "dependencies": { - "@vue/compiler-ssr": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" }, "peerDependencies": { - "vue": "3.2.47" + "vue": "3.3.4" } }, "node_modules/@vue/shared": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", - "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==", "dev": true }, "node_modules/@vueuse/core": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", - "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.2.0.tgz", + "integrity": "sha512-aHBnoCteIS3hFu7ZZkVB93SanVDY6t4TIb7XDLxJT/HQdAZz+2RdIEJ8rj5LUoEJr7Damb5+sJmtpCwGez5ozQ==", "dev": true, "dependencies": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.13.0", - "@vueuse/shared": "9.13.0", - "vue-demi": "*" + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.2.0", + "@vueuse/shared": "10.2.0", + "vue-demi": ">=0.14.5" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.2.0.tgz", + "integrity": "sha512-e+MIRMi2Zo8DZKXszut8iVoZGlf07XXoaDt27W0DRJVYPdods50MV8Bnla5Tnuil0gHY/W5mMcqiQre9Xb246Q==", + "dev": true, + "dependencies": { + "@vueuse/core": "10.2.0", + "@vueuse/shared": "10.2.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "*", + "axios": "*", + "change-case": "*", + "drauu": "*", + "focus-trap": "*", + "fuse.js": "*", + "idb-keyval": "*", + "jwt-decode": "*", + "nprogress": "*", + "qrcode": "*", + "sortablejs": "*", + "universal-cookie": "*" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", "dev": true, "hasInstallScript": true, "bin": { @@ -756,30 +871,30 @@ } }, "node_modules/@vueuse/metadata": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", - "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.2.0.tgz", + "integrity": "sha512-IR7Mkq6QSgZ38q/2ZzOt+Zz1OpcEsnwE64WBumDQ+RGKrosFCtUA2zgRrOqDEzPBXrVB+4HhFkwDjQMu0fDBKw==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", - "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.2.0.tgz", + "integrity": "sha512-dIeA8+g9Av3H5iF4NXR/sft4V6vys76CpZ6hxwj8eMXybXk2WRl3scSsOVi+kQ9SX38COR7AH7WwY83UcuxbSg==", "dev": true, "dependencies": { - "vue-demi": "*" + "vue-demi": ">=0.14.5" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", "dev": true, "hasInstallScript": true, "bin": { @@ -803,25 +918,25 @@ } }, "node_modules/algoliasearch": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.3.tgz", - "integrity": "sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg==", - "dev": true, - "dependencies": { - "@algolia/cache-browser-local-storage": "4.14.3", - "@algolia/cache-common": "4.14.3", - "@algolia/cache-in-memory": "4.14.3", - "@algolia/client-account": "4.14.3", - "@algolia/client-analytics": "4.14.3", - "@algolia/client-common": "4.14.3", - "@algolia/client-personalization": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/logger-common": "4.14.3", - "@algolia/logger-console": "4.14.3", - "@algolia/requester-browser-xhr": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/requester-node-http": "4.14.3", - "@algolia/transporter": "4.14.3" + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.18.0.tgz", + "integrity": "sha512-pCuVxC1SVcpc08ENH32T4sLKSyzoU7TkRIDBMwSLfIiW+fq4znOmWDkAygHZ6pRcO9I1UJdqlfgnV7TRj+MXrA==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.18.0", + "@algolia/cache-common": "4.18.0", + "@algolia/cache-in-memory": "4.18.0", + "@algolia/client-account": "4.18.0", + "@algolia/client-analytics": "4.18.0", + "@algolia/client-common": "4.18.0", + "@algolia/client-personalization": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/logger-common": "4.18.0", + "@algolia/logger-console": "4.18.0", + "@algolia/requester-browser-xhr": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/requester-node-http": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/ansi-sequence-parser": { @@ -941,9 +1056,9 @@ } }, "node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, "node_modules/define-properties": { @@ -1050,9 +1165,9 @@ } }, "node_modules/esbuild": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", - "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "hasInstallScript": true, "bin": { @@ -1062,28 +1177,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.16.17", - "@esbuild/android-arm64": "0.16.17", - "@esbuild/android-x64": "0.16.17", - "@esbuild/darwin-arm64": "0.16.17", - "@esbuild/darwin-x64": "0.16.17", - "@esbuild/freebsd-arm64": "0.16.17", - "@esbuild/freebsd-x64": "0.16.17", - "@esbuild/linux-arm": "0.16.17", - "@esbuild/linux-arm64": "0.16.17", - "@esbuild/linux-ia32": "0.16.17", - "@esbuild/linux-loong64": "0.16.17", - "@esbuild/linux-mips64el": "0.16.17", - "@esbuild/linux-ppc64": "0.16.17", - "@esbuild/linux-riscv64": "0.16.17", - "@esbuild/linux-s390x": "0.16.17", - "@esbuild/linux-x64": "0.16.17", - "@esbuild/netbsd-x64": "0.16.17", - "@esbuild/openbsd-x64": "0.16.17", - "@esbuild/sunos-x64": "0.16.17", - "@esbuild/win32-arm64": "0.16.17", - "@esbuild/win32-ia32": "0.16.17", - "@esbuild/win32-x64": "0.16.17" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "node_modules/escape-string-regexp": { @@ -1101,6 +1216,15 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/focus-trap": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.4.3.tgz", + "integrity": "sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==", + "dev": true, + "dependencies": { + "tabbable": "^6.1.2" + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -1558,14 +1682,23 @@ } }, "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "dev": true, "dependencies": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -1587,11 +1720,23 @@ "node": "*" } }, + "node_modules/minisearch": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz", + "integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==", + "dev": true + }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1746,9 +1891,9 @@ } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "dev": true, "funding": [ { @@ -1758,10 +1903,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -1770,9 +1919,9 @@ } }, "node_modules/preact": { - "version": "10.12.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", - "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==", + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", + "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==", "dev": true, "funding": { "type": "opencollective", @@ -1828,9 +1977,9 @@ } }, "node_modules/rollup": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.17.2.tgz", - "integrity": "sha512-qMNZdlQPCkWodrAZ3qnJtvCAl4vpQ8q77uEujVCCbC/6CLB7Lcmvjq7HyiOSnf4fxTT9XgsE36oLHJBH49xjqA==", + "version": "3.25.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.3.tgz", + "integrity": "sha512-ZT279hx8gszBj9uy5FfhoG4bZx8c+0A1sbqtr7Q3KNWIizpTdDEPZbV2xcbvHsnFp4MavCQYZyzApJ+virB8Yw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -1857,6 +2006,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/search-insights": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.6.0.tgz", + "integrity": "sha512-vU2/fJ+h/Mkm/DJOe+EaM5cafJv/1rRTZpGJTuFPf/Q5LjzgMDsqPdSaZsAe+GAWHHsfsu+rQSAn6c8IGtBEVw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8.16.0" + } + }, "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -1897,9 +2056,9 @@ } }, "node_modules/shiki": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", - "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", "dev": true, "dependencies": { "ansi-sequence-parser": "^1.1.0", @@ -1922,15 +2081,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -1940,13 +2090,6 @@ "node": ">=0.10.0" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true - }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -2057,6 +2200,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -2097,15 +2246,14 @@ } }, "node_modules/vite": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz", - "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", "dev": true, "dependencies": { - "esbuild": "^0.16.14", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.10.0" + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" }, "bin": { "vite": "bin/vite.js" @@ -2146,20 +2294,24 @@ } }, "node_modules/vitepress": { - "version": "1.0.0-alpha.47", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-alpha.47.tgz", - "integrity": "sha512-vj+LOY0WJtKSk98HV4qqG6p4MofmF+C8yrWHiiw+GCMfr6C+610U5D7oD2OruroIafsON6F4nBDWGK8ZyGIpXQ==", + "version": "1.0.0-beta.3", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-beta.3.tgz", + "integrity": "sha512-GR5Pvr/o343NN1M4Na1shhDYZRrQbjmLq7WE0lla0H8iDPAsHE8agTHLWfu3FWx+3q2KA29sv16+0O9RQKGjlA==", "dev": true, "dependencies": { - "@docsearch/css": "^3.3.3", - "@docsearch/js": "^3.3.3", - "@vitejs/plugin-vue": "^4.0.0", + "@docsearch/css": "^3.5.0", + "@docsearch/js": "^3.5.0", + "@vitejs/plugin-vue": "^4.2.3", "@vue/devtools-api": "^6.5.0", - "@vueuse/core": "^9.13.0", + "@vueuse/core": "^10.1.2", + "@vueuse/integrations": "^10.1.2", "body-scroll-lock": "4.0.0-beta.0", - "shiki": "^0.14.1", - "vite": "^4.1.3", - "vue": "^3.2.47" + "focus-trap": "^7.4.3", + "mark.js": "8.11.1", + "minisearch": "^6.1.0", + "shiki": "^0.14.2", + "vite": "^4.3.9", + "vue": "^3.3.4" }, "bin": { "vitepress": "bin/vitepress.js" @@ -2178,16 +2330,16 @@ "dev": true }, "node_modules/vue": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", - "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-sfc": "3.2.47", - "@vue/runtime-dom": "3.2.47", - "@vue/server-renderer": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/which": { @@ -2241,407 +2393,424 @@ }, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", - "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", "dev": true, "requires": { - "@algolia/autocomplete-shared": "1.7.4" + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "requires": { + "@algolia/autocomplete-shared": "1.9.3" } }, "@algolia/autocomplete-preset-algolia": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", - "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", "dev": true, "requires": { - "@algolia/autocomplete-shared": "1.7.4" + "@algolia/autocomplete-shared": "1.9.3" } }, "@algolia/autocomplete-shared": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", - "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==", - "dev": true + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "requires": {} }, "@algolia/cache-browser-local-storage": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.3.tgz", - "integrity": "sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.18.0.tgz", + "integrity": "sha512-rUAs49NLlO8LVLgGzM4cLkw8NJLKguQLgvFmBEe3DyzlinoqxzQMHfKZs6TSq4LZfw/z8qHvRo8NcTAAUJQLcw==", "dev": true, "requires": { - "@algolia/cache-common": "4.14.3" + "@algolia/cache-common": "4.18.0" } }, "@algolia/cache-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.3.tgz", - "integrity": "sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.18.0.tgz", + "integrity": "sha512-BmxsicMR4doGbeEXQu8yqiGmiyvpNvejYJtQ7rvzttEAMxOPoWEHrWyzBQw4x7LrBY9pMrgv4ZlUaF8PGzewHg==", "dev": true }, "@algolia/cache-in-memory": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.3.tgz", - "integrity": "sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.18.0.tgz", + "integrity": "sha512-evD4dA1nd5HbFdufBxLqlJoob7E2ozlqJZuV3YlirNx5Na4q1LckIuzjNYZs2ddLzuTc/Xd5O3Ibf7OwPskHxw==", "dev": true, "requires": { - "@algolia/cache-common": "4.14.3" + "@algolia/cache-common": "4.18.0" } }, "@algolia/client-account": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.3.tgz", - "integrity": "sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.18.0.tgz", + "integrity": "sha512-XsDnlROr3+Z1yjxBJjUMfMazi1V155kVdte6496atvBgOEtwCzTs3A+qdhfsAnGUvaYfBrBkL0ThnhMIBCGcew==", "dev": true, "requires": { - "@algolia/client-common": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "@algolia/client-analytics": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.3.tgz", - "integrity": "sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.18.0.tgz", + "integrity": "sha512-chEUSN4ReqU7uRQ1C8kDm0EiPE+eJeAXiWcBwLhEynfNuTfawN9P93rSZktj7gmExz0C8XmkbBU19IQ05wCNrQ==", "dev": true, "requires": { - "@algolia/client-common": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "@algolia/client-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", - "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.18.0.tgz", + "integrity": "sha512-7N+soJFP4wn8tjTr3MSUT/U+4xVXbz4jmeRfWfVAzdAbxLAQbHa0o/POSdTvQ8/02DjCLelloZ1bb4ZFVKg7Wg==", "dev": true, "requires": { - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "@algolia/client-personalization": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.3.tgz", - "integrity": "sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.18.0.tgz", + "integrity": "sha512-+PeCjODbxtamHcPl+couXMeHEefpUpr7IHftj4Y4Nia1hj8gGq4VlIcqhToAw8YjLeCTfOR7r7xtj3pJcYdP8A==", "dev": true, "requires": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "@algolia/client-search": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.3.tgz", - "integrity": "sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.18.0.tgz", + "integrity": "sha512-F9xzQXTjm6UuZtnsLIew6KSraXQ0AzS/Ee+OD+mQbtcA/K1sg89tqb8TkwjtiYZ0oij13u3EapB3gPZwm+1Y6g==", "dev": true, "requires": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "@algolia/logger-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.3.tgz", - "integrity": "sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.18.0.tgz", + "integrity": "sha512-46etYgSlkoKepkMSyaoriSn2JDgcrpc/nkOgou/lm0y17GuMl9oYZxwKKTSviLKI5Irk9nSKGwnBTQYwXOYdRg==", "dev": true }, "@algolia/logger-console": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.3.tgz", - "integrity": "sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.18.0.tgz", + "integrity": "sha512-3P3VUYMl9CyJbi/UU1uUNlf6Z8N2ltW3Oqhq/nR7vH0CjWv32YROq3iGWGxB2xt3aXobdUPXs6P0tHSKRmNA6g==", "dev": true, "requires": { - "@algolia/logger-common": "4.14.3" + "@algolia/logger-common": "4.18.0" } }, "@algolia/requester-browser-xhr": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.3.tgz", - "integrity": "sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.18.0.tgz", + "integrity": "sha512-/AcWHOBub2U4TE/bPi4Gz1XfuLK6/7dj4HJG+Z2SfQoS1RjNLshZclU3OoKIkFp8D2NC7+BNsPvr9cPLyW8nyQ==", "dev": true, "requires": { - "@algolia/requester-common": "4.14.3" + "@algolia/requester-common": "4.18.0" } }, "@algolia/requester-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.3.tgz", - "integrity": "sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.18.0.tgz", + "integrity": "sha512-xlT8R1qYNRBCi1IYLsx7uhftzdfsLPDGudeQs+xvYB4sQ3ya7+ppolB/8m/a4F2gCkEO6oxpp5AGemM7kD27jA==", "dev": true }, "@algolia/requester-node-http": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.3.tgz", - "integrity": "sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.18.0.tgz", + "integrity": "sha512-TGfwj9aeTVgOUhn5XrqBhwUhUUDnGIKlI0kCBMdR58XfXcfdwomka+CPIgThRbfYw04oQr31A6/95ZH2QVJ9UQ==", "dev": true, "requires": { - "@algolia/requester-common": "4.14.3" + "@algolia/requester-common": "4.18.0" } }, "@algolia/transporter": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.3.tgz", - "integrity": "sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.18.0.tgz", + "integrity": "sha512-xbw3YRUGtXQNG1geYFEDDuFLZt4Z8YNKbamHPkzr3rWc6qp4/BqEeXcI2u/P/oMq2yxtXgMxrCxOPA8lyIe5jw==", "dev": true, "requires": { - "@algolia/cache-common": "4.14.3", - "@algolia/logger-common": "4.14.3", - "@algolia/requester-common": "4.14.3" + "@algolia/cache-common": "4.18.0", + "@algolia/logger-common": "4.18.0", + "@algolia/requester-common": "4.18.0" } }, "@babel/parser": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz", - "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", "dev": true }, "@docsearch/css": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", - "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz", + "integrity": "sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==", "dev": true }, "@docsearch/js": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.3.3.tgz", - "integrity": "sha512-2xAv2GFuHzzmG0SSZgf8wHX0qZX8n9Y1ZirKUk5Wrdc+vH9CL837x2hZIUdwcPZI9caBA+/CzxsS68O4waYjUQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.1.tgz", + "integrity": "sha512-EXi8de5njxgP6TV3N9ytnGRLG9zmBNTEZjR4VzwPcpPLbZxxTLG2gaFyJyKiFVQxHW/DPlMrDJA3qoRRGEkgZw==", "dev": true, "requires": { - "@docsearch/react": "3.3.3", + "@docsearch/react": "3.5.1", "preact": "^10.0.0" } }, "@docsearch/react": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", - "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz", + "integrity": "sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==", "dev": true, "requires": { - "@algolia/autocomplete-core": "1.7.4", - "@algolia/autocomplete-preset-algolia": "1.7.4", - "@docsearch/css": "3.3.3", + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.1", "algoliasearch": "^4.0.0" } }, "@esbuild/android-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", - "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", - "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", - "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", - "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", - "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", - "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", - "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", - "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", - "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", - "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", - "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", - "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", - "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", - "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", - "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", - "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", - "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", - "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", - "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", - "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", - "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", - "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", "dev": true, "optional": true }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, "@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==", "dev": true }, "@vitejs/plugin-vue": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz", - "integrity": "sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", + "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", "dev": true, "requires": {} }, "@vue/compiler-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", - "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", "dev": true, "requires": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.47", + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "source-map": "^0.6.1" + "source-map-js": "^1.0.2" } }, "@vue/compiler-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", - "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", "dev": true, "requires": { - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/compiler-sfc": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", - "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", "dev": true, "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-ssr": "3.2.47", - "@vue/reactivity-transform": "3.2.47", - "@vue/shared": "3.2.47", + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", + "magic-string": "^0.30.0", "postcss": "^8.1.10", - "source-map": "^0.6.1" + "source-map-js": "^1.0.2" } }, "@vue/compiler-ssr": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", - "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", "dev": true, "requires": { - "@vue/compiler-dom": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/devtools-api": { @@ -2651,129 +2820,149 @@ "dev": true }, "@vue/reactivity": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", - "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", "dev": true, "requires": { - "@vue/shared": "3.2.47" + "@vue/shared": "3.3.4" } }, "@vue/reactivity-transform": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", - "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", "dev": true, "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47", + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" + "magic-string": "^0.30.0" } }, "@vue/runtime-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", - "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", "dev": true, "requires": { - "@vue/reactivity": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/runtime-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", - "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", "dev": true, "requires": { - "@vue/runtime-core": "3.2.47", - "@vue/shared": "3.2.47", - "csstype": "^2.6.8" + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" } }, "@vue/server-renderer": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", - "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", "dev": true, "requires": { - "@vue/compiler-ssr": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/shared": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", - "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==", "dev": true }, "@vueuse/core": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", - "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.2.0.tgz", + "integrity": "sha512-aHBnoCteIS3hFu7ZZkVB93SanVDY6t4TIb7XDLxJT/HQdAZz+2RdIEJ8rj5LUoEJr7Damb5+sJmtpCwGez5ozQ==", + "dev": true, + "requires": { + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.2.0", + "@vueuse/shared": "10.2.0", + "vue-demi": ">=0.14.5" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "dev": true, + "requires": {} + } + } + }, + "@vueuse/integrations": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.2.0.tgz", + "integrity": "sha512-e+MIRMi2Zo8DZKXszut8iVoZGlf07XXoaDt27W0DRJVYPdods50MV8Bnla5Tnuil0gHY/W5mMcqiQre9Xb246Q==", "dev": true, "requires": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.13.0", - "@vueuse/shared": "9.13.0", - "vue-demi": "*" + "@vueuse/core": "10.2.0", + "@vueuse/shared": "10.2.0", + "vue-demi": ">=0.14.5" }, "dependencies": { "vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", "dev": true, "requires": {} } } }, "@vueuse/metadata": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", - "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.2.0.tgz", + "integrity": "sha512-IR7Mkq6QSgZ38q/2ZzOt+Zz1OpcEsnwE64WBumDQ+RGKrosFCtUA2zgRrOqDEzPBXrVB+4HhFkwDjQMu0fDBKw==", "dev": true }, "@vueuse/shared": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", - "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.2.0.tgz", + "integrity": "sha512-dIeA8+g9Av3H5iF4NXR/sft4V6vys76CpZ6hxwj8eMXybXk2WRl3scSsOVi+kQ9SX38COR7AH7WwY83UcuxbSg==", "dev": true, "requires": { - "vue-demi": "*" + "vue-demi": ">=0.14.5" }, "dependencies": { "vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", "dev": true, "requires": {} } } }, "algoliasearch": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.3.tgz", - "integrity": "sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg==", - "dev": true, - "requires": { - "@algolia/cache-browser-local-storage": "4.14.3", - "@algolia/cache-common": "4.14.3", - "@algolia/cache-in-memory": "4.14.3", - "@algolia/client-account": "4.14.3", - "@algolia/client-analytics": "4.14.3", - "@algolia/client-common": "4.14.3", - "@algolia/client-personalization": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/logger-common": "4.14.3", - "@algolia/logger-console": "4.14.3", - "@algolia/requester-browser-xhr": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/requester-node-http": "4.14.3", - "@algolia/transporter": "4.14.3" + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.18.0.tgz", + "integrity": "sha512-pCuVxC1SVcpc08ENH32T4sLKSyzoU7TkRIDBMwSLfIiW+fq4znOmWDkAygHZ6pRcO9I1UJdqlfgnV7TRj+MXrA==", + "dev": true, + "requires": { + "@algolia/cache-browser-local-storage": "4.18.0", + "@algolia/cache-common": "4.18.0", + "@algolia/cache-in-memory": "4.18.0", + "@algolia/client-account": "4.18.0", + "@algolia/client-analytics": "4.18.0", + "@algolia/client-common": "4.18.0", + "@algolia/client-personalization": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/logger-common": "4.18.0", + "@algolia/logger-console": "4.18.0", + "@algolia/requester-browser-xhr": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/requester-node-http": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "ansi-sequence-parser": { @@ -2875,9 +3064,9 @@ } }, "csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, "define-properties": { @@ -2963,33 +3152,33 @@ } }, "esbuild": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", - "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.16.17", - "@esbuild/android-arm64": "0.16.17", - "@esbuild/android-x64": "0.16.17", - "@esbuild/darwin-arm64": "0.16.17", - "@esbuild/darwin-x64": "0.16.17", - "@esbuild/freebsd-arm64": "0.16.17", - "@esbuild/freebsd-x64": "0.16.17", - "@esbuild/linux-arm": "0.16.17", - "@esbuild/linux-arm64": "0.16.17", - "@esbuild/linux-ia32": "0.16.17", - "@esbuild/linux-loong64": "0.16.17", - "@esbuild/linux-mips64el": "0.16.17", - "@esbuild/linux-ppc64": "0.16.17", - "@esbuild/linux-riscv64": "0.16.17", - "@esbuild/linux-s390x": "0.16.17", - "@esbuild/linux-x64": "0.16.17", - "@esbuild/netbsd-x64": "0.16.17", - "@esbuild/openbsd-x64": "0.16.17", - "@esbuild/sunos-x64": "0.16.17", - "@esbuild/win32-arm64": "0.16.17", - "@esbuild/win32-ia32": "0.16.17", - "@esbuild/win32-x64": "0.16.17" + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "escape-string-regexp": { @@ -3004,6 +3193,15 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "focus-trap": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.4.3.tgz", + "integrity": "sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==", + "dev": true, + "requires": { + "tabbable": "^6.1.2" + } + }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3322,14 +3520,20 @@ } }, "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "dev": true, "requires": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.13" } }, + "mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -3345,10 +3549,16 @@ "brace-expansion": "^1.1.7" } }, + "minisearch": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz", + "integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==", + "dev": true + }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true }, "nice-try": { @@ -3460,20 +3670,20 @@ "dev": true }, "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "dev": true, "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "preact": { - "version": "10.12.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", - "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==", + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", + "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==", "dev": true }, "read-pkg": { @@ -3510,9 +3720,9 @@ } }, "rollup": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.17.2.tgz", - "integrity": "sha512-qMNZdlQPCkWodrAZ3qnJtvCAl4vpQ8q77uEujVCCbC/6CLB7Lcmvjq7HyiOSnf4fxTT9XgsE36oLHJBH49xjqA==", + "version": "3.25.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.3.tgz", + "integrity": "sha512-ZT279hx8gszBj9uy5FfhoG4bZx8c+0A1sbqtr7Q3KNWIizpTdDEPZbV2xcbvHsnFp4MavCQYZyzApJ+virB8Yw==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -3529,6 +3739,13 @@ "is-regex": "^1.1.4" } }, + "search-insights": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.6.0.tgz", + "integrity": "sha512-vU2/fJ+h/Mkm/DJOe+EaM5cafJv/1rRTZpGJTuFPf/Q5LjzgMDsqPdSaZsAe+GAWHHsfsu+rQSAn6c8IGtBEVw==", + "dev": true, + "peer": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -3557,9 +3774,9 @@ "dev": true }, "shiki": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", - "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", "dev": true, "requires": { "ansi-sequence-parser": "^1.1.0", @@ -3579,24 +3796,12 @@ "object-inspect": "^1.9.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -3683,6 +3888,12 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -3717,33 +3928,36 @@ } }, "vite": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz", - "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", "dev": true, "requires": { - "esbuild": "^0.16.14", + "esbuild": "^0.17.5", "fsevents": "~2.3.2", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.10.0" + "postcss": "^8.4.23", + "rollup": "^3.21.0" } }, "vitepress": { - "version": "1.0.0-alpha.47", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-alpha.47.tgz", - "integrity": "sha512-vj+LOY0WJtKSk98HV4qqG6p4MofmF+C8yrWHiiw+GCMfr6C+610U5D7oD2OruroIafsON6F4nBDWGK8ZyGIpXQ==", + "version": "1.0.0-beta.3", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-beta.3.tgz", + "integrity": "sha512-GR5Pvr/o343NN1M4Na1shhDYZRrQbjmLq7WE0lla0H8iDPAsHE8agTHLWfu3FWx+3q2KA29sv16+0O9RQKGjlA==", "dev": true, "requires": { - "@docsearch/css": "^3.3.3", - "@docsearch/js": "^3.3.3", - "@vitejs/plugin-vue": "^4.0.0", + "@docsearch/css": "^3.5.0", + "@docsearch/js": "^3.5.0", + "@vitejs/plugin-vue": "^4.2.3", "@vue/devtools-api": "^6.5.0", - "@vueuse/core": "^9.13.0", + "@vueuse/core": "^10.1.2", + "@vueuse/integrations": "^10.1.2", "body-scroll-lock": "4.0.0-beta.0", - "shiki": "^0.14.1", - "vite": "^4.1.3", - "vue": "^3.2.47" + "focus-trap": "^7.4.3", + "mark.js": "8.11.1", + "minisearch": "^6.1.0", + "shiki": "^0.14.2", + "vite": "^4.3.9", + "vue": "^3.3.4" } }, "vscode-oniguruma": { @@ -3759,16 +3973,16 @@ "dev": true }, "vue": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", - "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", "dev": true, "requires": { - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-sfc": "3.2.47", - "@vue/runtime-dom": "3.2.47", - "@vue/server-renderer": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" } }, "which": { diff --git a/package.json b/package.json index b5a22d37e44..d75e20732c8 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,14 @@ "docs-build": "vitepress build devdoc", "docs-preview": "vitepress preview devdoc", "convert": "pandoc -w markdown -o ./docs/DOCUMENTATION.md ./docs/DOCUMENTATION.rst", - "build":"run-s docs-build copy-res" + "build": "run-s docs-build copy-res", + "update": "npx npm-check-updates -u -t minor", + "update-major": "npx npm-check-updates -u" }, "devDependencies": { "npm-run-all": "4.1.5", - "vitepress": "1.0.0-alpha.47", - "vue": "3.2.47" + "vitepress": "1.0.0-beta.3", + "vue": "3.3.4" }, "repository": { "type": "git", diff --git a/roxie/ccd/ccd.hpp b/roxie/ccd/ccd.hpp index 4dc022b26e9..1be96eb1285 100644 --- a/roxie/ccd/ccd.hpp +++ b/roxie/ccd/ccd.hpp @@ -403,6 +403,7 @@ extern bool defaultExecuteDependenciesSequentially; extern bool defaultStartInputsSequentially; extern bool oneShotRoxie; extern bool traceStrands; +extern unsigned minPayloadSize; extern int backgroundCopyClass; extern int backgroundCopyPrio; diff --git a/roxie/ccd/ccddebug.cpp b/roxie/ccd/ccddebug.cpp index 2ff7b317c0e..b2a3fb3ce98 100644 --- a/roxie/ccd/ccddebug.cpp +++ b/roxie/ccd/ccddebug.cpp @@ -1219,10 +1219,9 @@ class CProxyDebugContext : public CInterface if (header->activityId == ROXIE_EXCEPTION) throwRemoteException(mu); assertex(header->activityId == ROXIE_DEBUGREQUEST); - RecordLengthType *rowlen = (RecordLengthType *) mu->getNext(sizeof(RecordLengthType)); + RecordLengthType *rowlen = (RecordLengthType *) mu->getNextLength(); assertex(rowlen); RecordLengthType len = *rowlen; - ReleaseRoxieRow(rowlen); const char * reply = (const char *) mu->getNext(len); if (output) { diff --git a/roxie/ccd/ccdmain.cpp b/roxie/ccd/ccdmain.cpp index a93248ac4ea..cc451ab4055 100644 --- a/roxie/ccd/ccdmain.cpp +++ b/roxie/ccd/ccdmain.cpp @@ -103,6 +103,7 @@ bool mergeAgentStatistics = true; PTreeReaderOptions defaultXmlReadFlags = ptr_ignoreWhiteSpace; bool runOnce = false; bool oneShotRoxie = false; +unsigned minPayloadSize = 800; unsigned udpMulticastBufferSize = 262142; #if !defined(_CONTAINERIZED) && !defined(SUBCHANNELS_IN_HEADER) @@ -123,7 +124,7 @@ bool lockSuperFiles; bool useRemoteResources; bool checkFileDate; bool lazyOpen; -bool localAgent; +bool localAgent = false; bool encryptInTransit; bool useAeron; bool ignoreOrphans; @@ -465,7 +466,7 @@ void readStaticTopology() std::vector allRoles; IpAddressArray nodeTable; unsigned numNodes = topology->getCount("./RoxieServerProcess"); - if (!numNodes && localAgent) + if (!numNodes && oneShotRoxie) { if (topology->getPropBool("expert/@addDummyNode", false)) { @@ -480,7 +481,7 @@ void readStaticTopology() topology->setPropInt("@channelsPerNode", 2); topology->setProp("@agentConfig", "cyclic"); } - else if (localAgent) + else if (oneShotRoxie) { topology->addPropTree("RoxieServerProcess")->setProp("@netAddress", "."); numNodes = 1; @@ -692,55 +693,46 @@ int CCD_API roxie_main(int argc, const char *argv[], const char * defaultYaml) useOldTopology = checkFileExists(topologyFile.str()); topology = loadConfiguration(useOldTopology ? nullptr : defaultYaml, argv, "roxie", "ROXIE", topologyFile, nullptr, "@netAddress"); saveTopology(); + + // Any settings we read from topology that must NOT be overridden in workunit debug fields should be read at this point, before the following section + getAllowedPipePrograms(allowedPipePrograms, true); + + // Allow workunit debug fields to override most roxie configuration values, for testing/debug purposes. + + topology->getProp("@daliServers", fileNameServiceDali); + const char *wuid = topology->queryProp("@workunit"); + if (wuid) + { + Owned daliHelper; + Owned wu; + daliHelper.setown(connectToDali(ROXIE_DALI_CONNECT_TIMEOUT)); + wu.setown(daliHelper->attachWorkunit(wuid)); + Owned debugValues = &wu->getDebugValues(); + ForEach (*debugValues) + { + StringBuffer debugStr; + SCMStringBuffer valueStr; + StringBufferAdaptor aDebugStr(debugStr); + debugValues->str(aDebugStr); + if (startsWith(debugStr, "roxie:")) + { + wu->getDebugValue(debugStr.str(), valueStr); + debugStr.replaceString("roxie:", "@"); + topology->setProp(debugStr.str(), valueStr.str()); + } + } + } + if (topology->getPropBool("expert/@profileStartup", false)) { double interval = topology->getPropReal("expert/@profileStartupInterval", 0.2); startupTracer.setInterval(interval); startupTracer.start(); } - localAgent = topology->getPropBool("@localAgent", topology->getPropBool("@localSlave", false)); // legacy name + localAgent = topology->getPropBool("@localAgent", topology->getPropBool("@localSlave", localAgent)); // legacy name encryptInTransit = topology->getPropBool("@encryptInTransit", false) && !localAgent; if (encryptInTransit) initSecretUdpKey(); - numChannels = topology->getPropInt("@numChannels", 0); -#ifdef _CONTAINERIZED - if (!numChannels) - throw makeStringException(MSGAUD_operator, ROXIE_INVALID_TOPOLOGY, "Invalid topology file - numChannels not set"); -#endif - const char *channels = topology->queryProp("@channels"); - if (channels) - { - StringArray channelSpecs; - channelSpecs.appendList(channels, ",", true); - ForEachItemIn(idx, channelSpecs) - { - char *tail = nullptr; - unsigned channel = strtoul(channelSpecs.item(idx), &tail, 10); - unsigned repl = 0; - if (*tail==':') - { - tail++; - repl = atoi(tail); - } - else if (*tail) - throw makeStringExceptionV(ROXIE_INTERNAL_ERROR, "Invalid channel specification %s", channels); - agentChannels.push_back(std::pair(channel, repl)); - } -#ifdef _CONTAINERIZED - if (agentChannels.size() != 1) - throw makeStringExceptionV(ROXIE_INTERNAL_ERROR, "Invalid channel specification %s - single channel expected", channels); - myChannel = agentChannels[0].first; - if (myChannel > numChannels) - throw makeStringExceptionV(ROXIE_INTERNAL_ERROR, "Invalid channel specification %s - value out of range", channels); -#endif - } -#ifdef _CONTAINERIZED - else if (localAgent) - { - for (unsigned channel = 1; channel <= numChannels; channel++) - agentChannels.push_back(std::pair(channel, 0)); - } -#endif const char *topos = topology->queryProp("@topologyServers"); StringArray topoValues; if (topos) @@ -771,7 +763,6 @@ int CCD_API roxie_main(int argc, const char *argv[], const char * defaultYaml) installDefaultFileHooks(topology); Owned standAloneDll; - const char *wuid = topology->queryProp("@workunit"); if (wuid) setDefaultJobId(wuid); if (topology->hasProp("@loadWorkunit")) @@ -815,6 +806,46 @@ int CCD_API roxie_main(int argc, const char *argv[], const char * defaultYaml) runOnce = true; } + numChannels = topology->getPropInt("@numChannels", 0); +#ifdef _CONTAINERIZED + if (!numChannels) + throw makeStringException(MSGAUD_operator, ROXIE_INVALID_TOPOLOGY, "Invalid topology file - numChannels not set"); +#endif + const char *channels = topology->queryProp("@channels"); + if (channels) + { + StringArray channelSpecs; + channelSpecs.appendList(channels, ",", true); + ForEachItemIn(idx, channelSpecs) + { + char *tail = nullptr; + unsigned channel = strtoul(channelSpecs.item(idx), &tail, 10); + unsigned repl = 0; + if (*tail==':') + { + tail++; + repl = atoi(tail); + } + else if (*tail) + throw makeStringExceptionV(ROXIE_INTERNAL_ERROR, "Invalid channel specification %s", channels); + agentChannels.push_back(std::pair(channel, repl)); + } +#ifdef _CONTAINERIZED + if (agentChannels.size() != 1) + throw makeStringExceptionV(ROXIE_INTERNAL_ERROR, "Invalid channel specification %s - single channel expected", channels); + myChannel = agentChannels[0].first; + if (myChannel > numChannels) + throw makeStringExceptionV(ROXIE_INTERNAL_ERROR, "Invalid channel specification %s - value out of range", channels); +#endif + } +#ifdef _CONTAINERIZED + else if (oneShotRoxie) + { + for (unsigned channel = 1; channel <= numChannels; channel++) + agentChannels.push_back(std::pair(channel, 0)); + } +#endif + if (!topology->hasProp("@resolveLocally")) topology->setPropBool("@resolveLocally", !topology->hasProp("@daliServers")); @@ -935,6 +966,7 @@ int CCD_API roxie_main(int argc, const char *argv[], const char * defaultYaml) } } + minPayloadSize = topology->getPropInt("@minPayloadSize", minPayloadSize); acknowledgeAllRequests = topology->getPropBool("@acknowledgeAllRequests", acknowledgeAllRequests); headRegionSize = topology->getPropInt("@headRegionSize", 0); packetAcknowledgeTimeout = topology->getPropInt("@packetAcknowledgeTimeout", packetAcknowledgeTimeout); @@ -1184,8 +1216,6 @@ int CCD_API roxie_main(int argc, const char *argv[], const char * defaultYaml) maxFilesOpen[true] = topology->getPropInt("@maxRemoteFilesOpen", 1000); dafilesrvLookupTimeout = topology->getPropInt("@dafilesrvLookupTimeout", 10000); setRemoteFileTimeouts(dafilesrvLookupTimeout, 0); - topology->getProp("@daliServers", fileNameServiceDali); - getAllowedPipePrograms(allowedPipePrograms, true); trapTooManyActiveQueries = topology->getPropBool("@trapTooManyActiveQueries", true); maxEmptyLoopIterations = topology->getPropInt("@maxEmptyLoopIterations", 1000); maxGraphLoopIterations = topology->getPropInt("@maxGraphLoopIterations", 1000); diff --git a/roxie/ccd/ccdqueue.cpp b/roxie/ccd/ccdqueue.cpp index c0c7a091f26..3c19f614c28 100644 --- a/roxie/ccd/ccdqueue.cpp +++ b/roxie/ccd/ccdqueue.cpp @@ -3076,6 +3076,16 @@ class CLocalMessageUnpackCursor : implements IMessageUnpackCursor, public CInter return true; } + virtual RecordLengthType *getNextLength() override + { + if (pos==datalen) + return NULL; + assertex(pos + sizeof(RecordLengthType) <= datalen); + void * cur = ((char *) data) + pos; + pos += sizeof(RecordLengthType); + return (RecordLengthType *) cur; + } + virtual const void * getNext(int length) { if (pos==datalen) @@ -3456,10 +3466,9 @@ class PacketDiscarder : public Thread, implements IPacketDiscarder case ROXIE_FILECALLBACK: { Owned callbackData = mr->getCursor(rowManager); - OwnedConstRoxieRow len = callbackData->getNext(sizeof(RecordLengthType)); - if (len) + RecordLengthType *rowlen = callbackData->getNextLength(); + if (rowlen) { - RecordLengthType *rowlen = (RecordLengthType *) len.get(); OwnedConstRoxieRow row = callbackData->getNext(*rowlen); const char *rowdata = (const char *) row.get(); // bool isOpt = * (bool *) rowdata; diff --git a/roxie/ccd/ccdserver.cpp b/roxie/ccd/ccdserver.cpp index ca875363ef4..ee468d39b3a 100644 --- a/roxie/ccd/ccdserver.cpp +++ b/roxie/ccd/ccdserver.cpp @@ -77,7 +77,6 @@ #include "rtldynfield.hpp" #define MAX_HTTP_HEADERSIZE 8000 -#define MIN_PAYLOAD_SIZE 800 #ifdef _WIN32 #pragma warning(disable : 4355) @@ -3479,10 +3478,15 @@ class CRowArrayMessageUnpackCursor : implements IMessageUnpackCursor, public CIn if (!data.length()) return NULL; const void *ret = data.item(0); - data.remove(0); + data.remove(0); // yuk! What is this used for? return ret; } + virtual RecordLengthType *getNextLength() override + { + throwUnexpected(); + } + }; // MORE - should possibly move more over to the lazy version used in indexread? @@ -3532,11 +3536,10 @@ class CRowArrayMessageResult : implements IMessageResult, public CInterface void throwRemoteException(IMessageUnpackCursor *extra) { - RecordLengthType *rowlen = (RecordLengthType *) extra->getNext(sizeof(RecordLengthType)); + RecordLengthType *rowlen = extra->getNextLength(); if (rowlen) { char *xml = (char *) extra->getNext(*rowlen); - ReleaseRoxieRow(rowlen); Owned p = createPTreeFromXMLString(xml, ipt_fast); ReleaseRoxieRow(xml); unsigned code = p->getPropInt("Code", 0); @@ -4148,8 +4151,8 @@ class CRemoteResultAdaptor : implements IEngineRowStream, implements IFinalRoxie void init(unsigned minSize) { assertex(!buffer.length()); - if (minSize < MIN_PAYLOAD_SIZE) - minSize = MIN_PAYLOAD_SIZE; + if (minSize < minPayloadSize) + minSize = minPayloadSize; unsigned headerSize = sizeof(RoxiePacketHeader)+owner.headerLength(); unsigned bufferSize = headerSize+minSize; if (bufferSize < mtu_size) @@ -4295,11 +4298,10 @@ class CRemoteResultAdaptor : implements IEngineRowStream, implements IFinalRoxie return mu->getNext(meta.getFixedSize()); else { - RecordLengthType *rowlen = (RecordLengthType *) mu->getNext(sizeof(RecordLengthType)); + RecordLengthType *rowlen = mu->getNextLength(); if (rowlen) { RecordLengthType len = *rowlen; - ReleaseRoxieRow(rowlen); const void *agentRec = mu->getNext(len); if (deserializer && mu->isSerialized()) { @@ -4994,10 +4996,9 @@ class CRemoteResultAdaptor : implements IEngineRowStream, implements IFinalRoxie activity.queryLogCtx().CTXLOG("Redundant callback on query %s", header.toString(s).str()); } Owned callbackData = mr->getCursor(rowManager); - OwnedConstRoxieRow len = callbackData->getNext(sizeof(RecordLengthType)); - if (len) + RecordLengthType *rowlen = callbackData->getNextLength(); + if (rowlen) { - RecordLengthType *rowlen = (RecordLengthType *) len.get(); OwnedConstRoxieRow row = callbackData->getNext(*rowlen); const char *rowdata = (const char *) row.get(); // bool isOpt = * (bool *) rowdata; @@ -5024,10 +5025,9 @@ class CRemoteResultAdaptor : implements IEngineRowStream, implements IFinalRoxie case ROXIE_DEBUGCALLBACK: { Owned callbackData = mr->getCursor(rowManager); - OwnedConstRoxieRow len = callbackData->getNext(sizeof(RecordLengthType)); - if (len) + RecordLengthType *rowlen = callbackData->getNextLength(); + if (rowlen) { - RecordLengthType *rowlen = (RecordLengthType *) len.get(); OwnedConstRoxieRow row = callbackData->getNext(*rowlen); char *rowdata = (char *) row.get(); if (ctxTraceLevel > 5) @@ -5060,10 +5060,9 @@ class CRemoteResultAdaptor : implements IEngineRowStream, implements IFinalRoxie { // we need to send back to the agent a message containing the file info requested. Owned callbackData = mr->getCursor(rowManager); - OwnedConstRoxieRow len = callbackData->getNext(sizeof(RecordLengthType)); - if (len) + RecordLengthType *rowlen = callbackData->getNextLength(); + if (rowlen) { - RecordLengthType *rowlen = (RecordLengthType *) len.get(); OwnedConstRoxieRow row = callbackData->getNext(*rowlen); const char *rowdata = (const char *) row.get(); bool isOpt = * (bool *) rowdata; @@ -5097,7 +5096,7 @@ class CRemoteResultAdaptor : implements IEngineRowStream, implements IFinalRoxie Owned extra = mr->getCursor(rowManager); for (;;) { - RecordLengthType *rowlen = (RecordLengthType *) extra->getNext(sizeof(RecordLengthType)); + RecordLengthType *rowlen = extra->getNextLength(); if (rowlen) { char *logInfo = (char *) extra->getNext(*rowlen); @@ -5139,7 +5138,6 @@ class CRemoteResultAdaptor : implements IEngineRowStream, implements IFinalRoxie activity.mergeStats(childStats); } } - ReleaseRoxieRow(rowlen); ReleaseRoxieRow(logInfo); } else @@ -23918,6 +23916,10 @@ class CRoxieServerIndexReadActivity : public CRoxieServerIndexReadBaseActivity, { return false; } + virtual RecordLengthType *getNextLength() override + { + throwUnexpected(); + } }; virtual bool processSingleKey(IKeyIndex *key, const IDynamicTransform * trans) override diff --git a/roxie/udplib/udplib.hpp b/roxie/udplib/udplib.hpp index 2e1f7ad5af2..f9e230c7d06 100644 --- a/roxie/udplib/udplib.hpp +++ b/roxie/udplib/udplib.hpp @@ -105,6 +105,7 @@ interface IException; interface IMessageUnpackCursor : extends IInterface { virtual const void *getNext(int length) = 0; + virtual RecordLengthType *getNextLength() = 0; virtual bool atEOF() const = 0; virtual bool isSerialized() const = 0; // if one tries to read past the last record then NULL will be returned, diff --git a/roxie/udplib/udpmsgpk.cpp b/roxie/udplib/udpmsgpk.cpp index 79862880307..04d47656620 100644 --- a/roxie/udplib/udpmsgpk.cpp +++ b/roxie/udplib/udpmsgpk.cpp @@ -382,7 +382,7 @@ class CMessageUnpackCursor: implements IMessageUnpackCursor, public CInterface return true; } - virtual const void *getNext(int length) + const void *getNext(int length) { // YUK horrid code! Though packer is even more horrid void *res = 0; @@ -454,6 +454,32 @@ class CMessageUnpackCursor: implements IMessageUnpackCursor, public CInterface return res; } + virtual RecordLengthType *getNextLength() override + { + if (!dataBuff) + return nullptr; + UdpPacketHeader *pktHdr = (UdpPacketHeader*) dataBuff->data; + unsigned packetDataLimit = pktHdr->length - pktHdr->metalength; + assertex ((packetDataLimit - current_pos) >= sizeof(RecordLengthType)); + RecordLengthType *res = (RecordLengthType *) &dataBuff->data[current_pos]; + current_pos += sizeof(RecordLengthType); + // Note that length is never separated from data... but length can be zero so still need to do this... + // MORE - could common up this code with getNext above + while (current_pos >= packetDataLimit) + { + dataBuff = pkSequencer->next(dataBuff); + current_pos = sizeof(UdpPacketHeader); + if (dataBuff) + { + pktHdr = (UdpPacketHeader*) dataBuff->data; + packetDataLimit = pktHdr->length - pktHdr->metalength; + } + else + break; + } + return res; + } + }; diff --git a/testing/regress/ecl/remote.ecl b/testing/regress/ecl/remote.ecl index d30a892216d..e3f4b5abb28 100644 --- a/testing/regress/ecl/remote.ecl +++ b/testing/regress/ecl/remote.ecl @@ -17,12 +17,18 @@ //nohthor //nothor +//version localAgent=true +//version localAgent=false + IMPORT Std.system.thorlib as thorlib; import ^ as root; multiPart := #IFDEFINED(root.multiPart, true); useLocal := #IFDEFINED(root.useLocal, false); useTranslation := #IFDEFINED(root.useTranslation, false); +useLocalAgent := #IFDEFINED(root.localAgent, false); + +#option('roxie:localAgent', useLocalAgent); import $.setup; Files := setup.Files(multiPart, useLocal, useTranslation); diff --git a/testing/regress/ecl/stresstext.ecl b/testing/regress/ecl/stresstext.ecl index 6f7e5013192..3d0a896e589 100644 --- a/testing/regress/ecl/stresstext.ecl +++ b/testing/regress/ecl/stresstext.ecl @@ -23,6 +23,13 @@ //version multiPart=false,variant='inplace_lzw' //version multiPart=false,variant='inplace_lz4hc' +// The settings below may be useful when trying to analyse Roxie keyed join behaviour, as they will +// eliminate some wait time for an agent queue to become available + +//#option('roxie:minPayloadSize', 10000) +//#option('roxie:agentThreads', 400) +//#option('roxie:prestartAgentThreads', true) + import ^ as root; multiPart := #IFDEFINED(root.multiPart, true); variant := #IFDEFINED(root.variant, ''); diff --git a/testing/unittests/CMakeLists.txt b/testing/unittests/CMakeLists.txt index 3c5c40c755b..58153493d35 100644 --- a/testing/unittests/CMakeLists.txt +++ b/testing/unittests/CMakeLists.txt @@ -83,6 +83,7 @@ include_directories ( ${HPCC_SOURCE_DIR}/esp/bindings ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp ${HPCC_SOURCE_DIR}/esp/esdllib + ${HPCC_SOURCE_DIR}/esp/esdlscriptlib ${HPCC_SOURCE_DIR}/esp/logging ${HPCC_SOURCE_DIR}/esp/logging/logginglib ${HPCC_SOURCE_DIR}/esp/logging/loggingmanager diff --git a/testing/unittests/unittests.cpp b/testing/unittests/unittests.cpp index 21df821f322..a4c7e7e8ca6 100644 --- a/testing/unittests/unittests.cpp +++ b/testing/unittests/unittests.cpp @@ -928,4 +928,129 @@ CPPUNIT_TEST_SUITE_REGISTRATION( PipeRunTest ); CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( PipeRunTest, "PipeRunTest" ); #endif +class RelaxedAtomicTimingTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( RelaxedAtomicTimingTest ); + CPPUNIT_TEST(testRun); + CPPUNIT_TEST_SUITE_END(); + + void testRun() + { + testRunner(0); + testRunner(1); + testRunner(2); + testRunner(3); + testRunner(4); + } + + void testRunner(unsigned mode) + { + CCycleTimer timer; + unsigned count = 100000000; + RelaxedAtomic ra[201]; + CriticalSection lock[201]; + + for (int a = 0; a < 201; a++) + ra[a] = 0; + + class T : public CThreaded + { + public: + T(unsigned _count, RelaxedAtomic &_ra, CriticalSection &_lock, unsigned _mode) : CThreaded(""), count(_count), ra(_ra), lock(_lock), mode(_mode) + {} + virtual int run() override + { + switch(mode) + { + case 0: test0(); break; + case 1: test1(); break; + // Disabled next two for now as slow and not especially interesting + // case 2: test2(); break; + // case 3: test3(); break; + case 4: test4(); break; + } + return 0; + } + void test0() + { + RelaxedAtomic &a = ra; + while (count--) + a++; + } + void test1() + { + RelaxedAtomic &a = ra; + while (count--) + a.fastAdd(1); + } + void test2() + { + int &a = (int &) ra; + while (count--) + { + CriticalBlock b(lock); + a++; + } + } + void test3() + { + RelaxedAtomic &a = ra; + while (count--) + { + CriticalBlock b(lock); + a.fastAdd(1); + } + } + void test4() + { + int &a = (int &) ra; + while (count--) + { + if (a != count) + a++; + } + ra = a; + } + + unsigned mode; + unsigned count; + RelaxedAtomic &ra; + CriticalSection &lock; + } t1a(count, ra[0], lock[0], mode), t2a(count, ra[0], lock[0], mode), t3a(count, ra[0], lock[0], mode), + t1b(count, ra[0], lock[0], mode), t2b(count, ra[1], lock[1], mode), t3b(count, ra[2], lock[2], mode), + t1c(count, ra[0], lock[0], mode), t2c(count, ra[100], lock[100], mode), t3c(count, ra[200], lock[200], mode);; + DBGLOG("Testing RelaxedAtomics (test mode %u)", mode); + t1a.start(); + t2a.start(); + t3a.start(); + t1a.join(); + t2a.join(); + t3a.join(); + DBGLOG("Same RAs took %ums, value %d", timer.elapsedMs(), ra[0]+0); + for (int a = 0; a < 201; a++) + ra[a] = 0; + timer.reset(); + t1b.start(); + t2b.start(); + t3b.start(); + t1b.join(); + t2b.join(); + t3b.join(); + DBGLOG("Adjacent RAs took %ums, values %d %d %d", timer.elapsedMs(), ra[0]+0, ra[1]+0, ra[2]+0); + for (int a = 0; a < 201; a++) + ra[a] = 0; + timer.reset(); + t1c.start(); + t2c.start(); + t3c.start(); + t1c.join(); + t2c.join(); + t3c.join(); + DBGLOG("Spaced RAs took %ums, values %d %d %d", timer.elapsedMs(), ra[0]+0, ra[100]+0, ra[200]+0); + } +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( RelaxedAtomicTimingTest ); +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( RelaxedAtomicTimingTest, "RelaxedAtomicTimingTest" ); + #endif // _USE_CPPUNIT diff --git a/tools/hidl/hidlcomp.cpp b/tools/hidl/hidlcomp.cpp index 18435d24ee0..eab25cd41f2 100644 --- a/tools/hidl/hidlcomp.cpp +++ b/tools/hidl/hidlcomp.cpp @@ -4995,6 +4995,9 @@ void EspServInfo::write_esp_binding_ipp() //method ==> processRequest outs("\tvirtual int processRequest(IRpcMessage* rpc_call, IRpcMessage* rpc_response);\n"); + // method ===> getXmlFilename + outs("\tint getXmlFilename(StringBuffer &filename);\n"); + //method ==> getXsdDefinition outs("\tint getXsdDefinition(IEspContext &context, CHttpRequest* request, StringBuffer &content, const char *service, const char *method, bool mda);\n"); @@ -5049,7 +5052,7 @@ void EspServInfo::write_esp_binding_ipp() outs("\tvirtual int onGetInstantQuery(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method);\n"); //Method ==> getDefaultClientVersion - outs("\tbool getDefaultClientVersion(double &ver);\n"); + outs("\tvirtual bool getDefaultClientVersion(double &ver);\n"); //Method ==> xslTransform if (needsXslt) @@ -5116,7 +5119,7 @@ void EspServInfo::write_esp_binding_ipp() outs("};\n\n"); } -void EspServInfo::write_esp_binding() +void EspServInfo::write_esp_binding(const char *packagename) { EspMethodInfo *mthi=NULL; int useMethodName = getMetaInt("use_method_name", 0); @@ -5360,12 +5363,21 @@ void EspServInfo::write_esp_binding() outs("\treturn -1;\n"); outs("}\n"); - //method ==> getXsdDefinition + + //method ==> getXmlFilename for xsd and wsdl transformations + outf("\nint C%sSoapBinding::getXmlFilename(StringBuffer &filename)\n", name_); + outs("{\n"); + outf("\tfilename.append(\"%s.xml\");\n", packagename); + outs("\treturn 1;\n"); + outs("}\n"); + + //method ==> getXsdDefinition packagename is the base ecm filename outf("\nint C%sSoapBinding::getXsdDefinition(IEspContext &context, CHttpRequest* request, StringBuffer &content, const char *service, const char *method, bool mda)\n", name_); outs("{\n"); outs("\tBoolHash added;\n"); + // version if (hasVersion) { @@ -5374,6 +5386,9 @@ void EspServInfo::write_esp_binding() } outs("\tDBGLOG(\"Client version: %g\", context.getClientVersion());\n"); + // getXSDDefinition(StringBuffer &content, const char *packageName, const char *serviceName, double version, const char *method); +// outf( "getXSDDefinition(content, \"%s\", \"%s\", context.getClientVersion(), method);\n\n", packagename, name_); + indentReset(1); outf(1, "bool fullservice = (!Utils::strcasecmp(service, \"%s\"));\n", name_); indentOuts("bool allMethods = (method==NULL || *method==0);\n"); @@ -6626,7 +6641,7 @@ void HIDLcompiler::write_esp() EspServInfo *si; for (si=servs;si;si=si->next) { - si->write_esp_binding(); + si->write_esp_binding(packagename); outs("\n\n"); si->write_esp_service(); outs("\n\n"); diff --git a/tools/hidl/hidlcomp.h b/tools/hidl/hidlcomp.h index f2841bbd0a4..a78c530223a 100644 --- a/tools/hidl/hidlcomp.h +++ b/tools/hidl/hidlcomp.h @@ -1232,7 +1232,7 @@ class EspServInfo void write_client_interface(); void write_factory_impl(); - void write_esp_binding(); + void write_esp_binding(const char *); void write_esp_binding_ipp(); void write_esp_service_ipp(); void write_esp_binding_ng_ipp(EspMessageInfo *); diff --git a/version.cmake b/version.cmake index 74081b22944..a0517a4a5bb 100644 --- a/version.cmake +++ b/version.cmake @@ -4,8 +4,8 @@ set ( HPCC_NAME "Community Edition" ) set ( HPCC_PROJECT "community" ) set ( HPCC_MAJOR 9 ) -set ( HPCC_MINOR 2 ) -set ( HPCC_POINT 11 ) -set ( HPCC_MATURITY "closedown" ) +set ( HPCC_MINOR 3 ) +set ( HPCC_POINT 0 ) +set ( HPCC_MATURITY "trunk" ) set ( HPCC_SEQUENCE 0 ) ###