@bitblit/ratchet-rdbms 4.0.354-alpha → 4.0.362-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/lib/index.mjs +1 -1
  2. package/lib/types.d.ts +348 -0
  3. package/package.json +7 -7
  4. package/lib/build/ratchet-rdbms-info.d.ts +0 -5
  5. package/lib/index.d.ts +0 -30
  6. package/lib/index.mjs.map +0 -1
  7. package/lib/model/connection-config.d.ts +0 -4
  8. package/lib/model/db-config.d.ts +0 -9
  9. package/lib/model/group-by-count-result.d.ts +0 -4
  10. package/lib/model/mysql/mysql-db-config.d.ts +0 -5
  11. package/lib/model/mysql/mysql-master-status.d.ts +0 -6
  12. package/lib/model/mysql/mysql-results-wrapper.d.ts +0 -5
  13. package/lib/model/mysql/mysql-slave-status.d.ts +0 -52
  14. package/lib/model/mysql/mysql-style-connection-provider.d.ts +0 -7
  15. package/lib/model/mysql/mysql-update-results.d.ts +0 -9
  16. package/lib/model/paginated-results.d.ts +0 -5
  17. package/lib/model/pagination-bounds.d.ts +0 -6
  18. package/lib/model/paginator.d.ts +0 -9
  19. package/lib/model/query-defaults.d.ts +0 -4
  20. package/lib/model/query-text-provider.d.ts +0 -4
  21. package/lib/model/sort-direction.d.ts +0 -4
  22. package/lib/model/ssh/ssh-tunnel-config.d.ts +0 -7
  23. package/lib/model/ssh/ssh-tunnel-container.d.ts +0 -12
  24. package/lib/model/ssh-config.d.ts +0 -5
  25. package/lib/model/transaction-isolation-level.d.ts +0 -4
  26. package/lib/named-parameter-maria-db-service.d.ts +0 -41
  27. package/lib/non-pooled-mysql-style-connection-provider.d.ts +0 -8
  28. package/lib/query-builder/query-builder-result.d.ts +0 -9
  29. package/lib/query-builder/query-builder.d.ts +0 -52
  30. package/lib/query-builder/query-builder.spec.d.ts +0 -1
  31. package/lib/query-builder/query-util.d.ts +0 -12
  32. package/lib/rds-mysql-style-connection-provider.d.ts +0 -24
  33. package/lib/ssh-tunnel-service.d.ts +0 -6
  34. package/lib/transactional-named-parameter-maria-db-service.d.ts +0 -23
  35. package/lib/util/aws-rds-cert-2023.d.ts +0 -6
  36. package/lib/util/relational-database-utils.d.ts +0 -4
package/lib/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{StringRatchet as n,Logger as t,RequireRatchet as e,ErrorRatchet as i,PromiseRatchet as r,StopWatch as s,TimeoutToken as o,DurationRatchet as A}from"@bitblit/ratchet-common";import a from"lodash";import c from"mysql2/promise";import E from"get-port";import*as B from"tunnel-ssh";class g{fields=[];replacements={};addReplacement(n,...t){this.replacements=Object.assign(this.replacements,n),this.addFields(...t)}appendReplacement(n,t,...e){this.replacements[n]=this.replacements[n]+t,this.addFields(...e)}addFields(...n){this.fields=this.fields.concat(...n)}getFields(){return this.fields}getReplacements(){return this.replacements}static sqlInjectionUnsafeParamRenderer(t){const e=t=>"string"==typeof t?'"'+t+'"':n.safeString(t);return Array.isArray(t)?t.map((n=>e(n))).join(","):e(t)}static renderQueryStringForPasteIntoTool(n,t,e=g.sqlInjectionUnsafeParamRenderer){const i=t??{};let r=g.reformatQueryForLogging(n);if(r){const n=Object.keys(i);n.sort(((n,t)=>t.length-n.length));for(const t of n){const n=":"+t,s=e(i[t]);r=r.split(n).join(s)}r.endsWith(";")||(r+=";")}return r}static reformatQueryForLogging(e,i=80){let r=i;if(!n.trimToNull(e))return null;let s="",o=n.trimToEmpty(e).split("\n").join(" ").split("\r").join(" ");for(;o.length>r;){let e=Math.min(o.length,r);for(;e>0&&![" ",","].includes(o.charAt(e));)e--;e>0?(s+=o.substring(0,e)+"\n",o=n.trimToEmpty(o.substring(e))):(t.silly("Input contains a string longer than the max line length - bumping"),r+=2)}return s+(o.length>0?o:"")}}var l,M;!function(n){n.Default="Default",n.ReadUncommitted="READ UNCOMMITTED"}(l||(l={}));class u{connection;constructor(n){this.connection=n,e.notNullOrUndefined(n)}async getConnection(){return this.connection}async clearConnectionCache(){return t.info("clearConnectionCache ignored - not pooled"),!0}}class w{query;namedParams;paginator;transactionIsolationLevel;constructor(n,t,e,i){this.query=n,this.namedParams=t,this.paginator=e,this.transactionIsolationLevel=i}}!function(n){n.Asc="Asc",n.Desc="Desc"}(M||(M={}));class I{static ALLOWED_SQL_CONSTRUCT=/^[a-z0-9_.`]+$/i;queryProvider;query;meta=Object.freeze({});sqlConstructs={};namedParams={};conditionals={};debugComment="";paginator;debugAnnotateMode=!1;transactionIsolationLevel=l.Default;constructor(n){this.queryProvider=n}clone(){const n=new I(this.queryProvider);return this.query&&n.withBaseQuery(this.query),n.sqlConstructs=a.clone(this.sqlConstructs),n.namedParams=a.clone(this.namedParams),n.conditionals=a.clone(this.conditionals),n.paginator=a.clone(this.paginator),n.debugComment=this.debugComment,n.transactionIsolationLevel=this.transactionIsolationLevel,n}withTransactionIsolationLevel(n){return this.transactionIsolationLevel=n,this}withDebugComment(n){return this.debugComment=n,this}appendDebugComment(n){return this.debugComment=this.debugComment+n,this}withNamedQuery(t){return this.query=this.queryProvider.fetchQuery(t),n.trimToNull(this.query)||i.throwFormattedErr("Requested query that does not exist : %s",t),this.meta=Object.freeze({queryPath:t}),this.withDebugComment(" "+t+" "),this}withBaseQuery(n){this.query=n}withSqlConstruct(n,t){return this.sqlConstructs[n]=t,this}withSqlConstructs(n){return this.sqlConstructs=Object.assign(this.sqlConstructs,n),this}removeParam(n){return delete this.namedParams[n],this}paramNames(){return Object.keys(this.namedParams)}withParam(n,t){return this.namedParams[n]=t,this}withParams(n){return this.namedParams=Object.assign(this.namedParams,n),this}withExpandedParam(n,e,i){const r=n+"Length";let s=this.fetchCopyOfParam(r)??0;if(s>0&&!i){t.silly("Old item found and not extending - removing old params");this.paramNames().filter((t=>t.startsWith(n))).forEach((n=>this.removeParam(n))),s=0}this.withParam(r,e.length+s);for(let t=0;t<e.length;t++){const i=e[t];if("object"==typeof i&&i)for(const e of Object.keys(i)){const r=n+e.charAt(0).toUpperCase()+e.slice(1)+(t+s);this.withParam(r,i[e])}else{const e=n+t;this.withParam(e,i)}}return this}withConditional(n,t=!0){return this.conditionals[n]=t,this}withConditionals(n){return this.conditionals=Object.assign(this.conditionals,n),this}withPaginator(n){return e.notNullOrUndefined(n,"paginator"),e.notNullOrUndefined(n.cn,"paginator.cn"),e.true(n.min||n.max||n.l,"paginator must have some limit"),n.s=n.s??M.Asc,this.paginator=n,this}fetchCopyOfParam(n){return this.namedParams[n]}fetchCopyOfConditional(n){return this.conditionals[n]}containsParam(n){return null!=this.namedParams[n]}getDebugComment(){return this.debugComment}containsConditional(n){return null!=this.conditionals[n]}build(){return this.clone().internalBuild(!1)}buildUnfiltered(){return this.clone().internalBuild(!0)}internalBuild(n){return this.applyQueryFragments(),this.applyConditionalBlocks(),this.applyRepeatBlocks(),this.applyPagination(n),this.applySqlConstructs(),this.applyComments(),this.runQueryChecks(),this.stripNonAsciiParams(),new w((this.query??"").trim(),this.namedParams,this.paginator,this.transactionIsolationLevel)}stripNonAsciiParams(){const t=n.stripNonAscii(JSON.stringify(this.namedParams));this.namedParams=JSON.parse(t)}runQueryChecks(){const n=[...this.query?.matchAll(/['"]:[A-z-]*['"]/gm)??[]];n.length>0&&t.warn("The resulting query contains quoted named params check this this is intended. Instances found: %s",n.join(", "))}applyComments(){if(this.debugComment.length&&this.query){const n=this.query.indexOf(" "),t=this.debugComment;this.query=this.query.substring(0,n+1)+`/*${t}*/`+this.query.substring(n+1)}}applySqlConstructs(){for(const t of Object.keys(this.sqlConstructs)){let e;const i=this.sqlConstructs[t];if(Array.isArray(i))i.forEach((n=>{if("string"!=typeof n||!n.match(I.ALLOWED_SQL_CONSTRUCT))throw new Error(`sql construct entry ${n} is invalid value must be alphanumeric only.`)})),e=i.join(", ");else if(e=n.safeString(i),e.length>0&&!e.match(I.ALLOWED_SQL_CONSTRUCT))throw new Error(`sql construct ${e} is invalid value must be alphanumeric only.`);const r=["update","insert","delete","drop","select"];for(const n of r)if(e.toLowerCase().includes(n))throw new Error(`sql construct ${e} is invalid value must not contain reserved word ${n}.`);const s=`##sqlConstruct:${t}##`;for(;this.query?.includes(s);)this.query=this.query.replace(s,e)}}applyRepeatBlocks(){const n="<repeat";for(;;){const t=this.query?.indexOf(n);if(-1===t||!this.query||"number"!=typeof t)return;const e=this.query.indexOf(">",t);if(-1==e)throw new Error(`Invalid query when finding end symbol matching > in ${this.query} check that you have closed all your tags correctly.`);const i="count=";let r="";const s="join=";let o;const A=this.query.substring(t+7,e).trim().split(" ");for(const n of A)n.includes(i)&&(r=n.substring(n.indexOf(i)+i.length)),n.includes(s)&&(o=n.substring(n.indexOf(s)+s.length));const a="</repeat>",c=this.query.indexOf(a),E=this.query.substring(e+1,c);this.query=this.query.substring(0,t)+this.query.substring(c+a.length);const B=this.namedParams[r.substring(1)];for(let n=0;n<B;n++){let e=E;o&&0!=n&&(e+=o);let i=e.indexOf("::");for(;-1!=i;){const t=e.indexOf("::",i+2);if(-1==t)throw new Error(`Invalid query when finding end symbol matching :: check that you have closed all your tags correctly. Query: ${this.query} `);const r=e.substring(i+2,t);e=e.replace("::"+r+"::",":"+r+n),i=e.indexOf("::")}this.query=this.query.substring(0,t)+e+this.query.substring(t)}}}applyQueryFragments(){for(;;){const n=this.query?.indexOf("[[");if(-1==n||!this.query||"number"!=typeof n)return;const t=this.query.indexOf("]]",n);if(-1==t)throw new Error(`Invalid query when finding end symbol matching ]] in ${this.query} check that you have closed all your tags correctly.`);const e=this.query.substring(n+2,t),i=this.queryProvider.fetchQuery(e);if(!i)throw new Error(`Invalid query, query fragment ${e} not found in named queries.`);this.query=this.query.replace(`[[${e}]]`,i)}}applyPagination(t){const e="##pagination##";if(!t&&this.paginator){const t=this.paginator.s==M.Desc?M.Desc:M.Asc,e=n.safeString(t);if(this.paginator.min||this.paginator.max){let n="WHERE ##sqlConstruct:queryBuilderPaginatorWhere##";this.withSqlConstruct("queryBuilderPaginatorWhere",this.paginator.cn),this.paginator.min&&(n+=">= :queryBuilderPaginatorWhereMin",this.withParam("queryBuilderPaginatorWhereMin",this.paginator.min)),this.paginator.max&&(this.paginator.min&&(n+=" AND ##sqlConstruct:queryBuilderPaginatorWhere##"),n+="< :queryBuilderPaginatorWhereMax",this.withParam("queryBuilderPaginatorWhereMax",this.paginator.max)),this.query+=n}this.query+=` ORDER BY ##sqlConstruct:queryBuilderOrderBy## ${e}`,this.withSqlConstruct("queryBuilderOrderBy",this.paginator.cn),this.paginator.l&&(this.query+=" LIMIT :queryBuilderLimit",this.withParam("queryBuilderLimit",this.paginator.l))}if(t&&this.query){const n=this.query.indexOf(e);-1!=n&&(this.query="SELECT COUNT(*) "+this.query.substring(n+14))}for(;this.query?.includes(e);)this.query=this.query.replace(e,"")}applyConditionalBlocks(){const n=">>";for(;;){const t=this.query?.indexOf("<<");if(-1==t||!this.query||"number"!=typeof t)return;const e=this.query.indexOf(n,t);if(-1==e)throw new Error(`Invalid query when finding end symbol matching ${n} in ${this.query} check that you have closed all your tags correctly.`);const i=this.query.substring(t+2,e),r=i.replace(":",""),s=`<</${i}>>`,o=this.query.indexOf(s);if(-1==o)throw new Error(`Invalid query when finding conditional end tag matching ${s} in ${this.query} check that your query contains an exact match of this tag.`);let A=this.query.substring(e+2,o);if(i.startsWith(":")){const n=this.namedParams[r];(null==n||Array.isArray(n)&&0==n.length)&&(A="")}else{const n=this.conditionals[r.replace("!","")];null!=n&&n!=r.startsWith("!")||(A="")}this.debugAnnotateMode&&(A="/* conditional "+r+"*/"),this.query=this.query.substring(0,t)+A+this.query.substring(o+s.length)}}}class h{queryProvider;connectionProvider;queryDefaults;static LONG_QUERY_TIME_MS=8500;serviceName="TBD";constructor(n,t,e){this.queryProvider=n,this.connectionProvider=t,this.queryDefaults=e,this.serviceName="NamedParameterMariaDb"}getQueryDefaults(){return this.queryDefaults}getQueryProvider(){return this.queryProvider}async createNonPooledMysqlStyleConnectionProvider(n,e){if(t.info("createTransactional : %s : %j",n,e),!this.connectionProvider.createNonPooledDatabaseConnection)throw new Error("Connection provider does not implement createNonPooledDatabaseConnection");const i=await this.connectionProvider.createNonPooledDatabaseConnection(n,e);if(!i)throw new Error(`Connection could not be created for DB type ${n}`);return new u(i)}fetchQueryRawTextByName(n){return this.queryProvider.fetchQuery(n)}queryBuilder(n){const t=new I(this.queryProvider);return n&&t.withNamedQuery(n),t}async executeUpdateOrInsertByName(n,t,e=this.queryDefaults.timeoutMS){const i=this.queryBuilder(n).withParams(t??{});return this.buildAndExecuteUpdateOrInsert(i,e)}async buildAndExecuteUpdateOrInsert(n,t=this.queryDefaults.timeoutMS){const e=n.build();return(await this.executeQueryWithMeta(e.transactionIsolationLevel,e.query,e.namedParams,t)).results}async buildAndExecuteUpdateOrInsertWithRetry(n,e,i=this.queryDefaults.timeoutMS){let s,o=0;for(;!s&&o<e;){o++;try{s=await this.buildAndExecuteUpdateOrInsert(n,i)}catch(n){t.info("Caught problem while trying to update/insert : %d : %s ",o,n),await r.wait(2e3*o)}}if(!s)throw new Error(`Failed to execute update after ${e} retries`);return s}async executeQueryByName(n,t,e=this.queryDefaults.timeoutMS){const i=this.queryBuilder(n).withParams(t);return await this.buildAndExecute(i,e)}async executeQueryByNameSingle(n,t,e=this.queryDefaults.timeoutMS){const i=this.queryBuilder(n).withParams(t),r=await this.buildAndExecute(i,e);return 1===r.length?r[0]:null}async buildAndExecute(n,t=this.queryDefaults.timeoutMS){const e=n.build();return(await this.executeQueryWithMeta(e.transactionIsolationLevel,e.query,e.namedParams,t,n.getDebugComment())).results}async buildAndExecuteSingle(n,t=this.queryDefaults.timeoutMS){const e=n.build(),i=await this.executeQueryWithMeta(e.transactionIsolationLevel,e.query,e.namedParams,t,n.getDebugComment());return 1===i.results.length?i.results[0]:null}async buildAndExecuteFetchTotalRows(n,e="",i=this.queryDefaults.timeoutMS){const r=n.buildUnfiltered();let s=r.query.replace("COUNT(*)",`${e} as groupByField, COUNT(*) as count`);s=`${s} GROUP BY ${e}`,t.info("Unfiltered query %s",r.query);return(await this.executeQueryWithMeta(r.transactionIsolationLevel,s,r.namedParams,i)).results}async executeQueryWithMeta(n,e,i={},a=this.queryDefaults.timeoutMS,c){const E=new s;a||(a=this.queryDefaults.timeoutMS),await this.changeNextQueryTransactionIsolationLevel(n);const B=await r.timeout(this.innerExecutePreparedAsPromiseWithRetryCloseConnection(e,i,void 0),"Query:"+e,a);if(o.isTimeoutToken(B)){t.warn("Timed out (after %s): %j",A.colonFormatMsDuration(a),B);const n=A.colonFormatMsDuration(a);throw new Error(`Timed out (after ${n}) waiting for query : ${e}`)}const g=B;return g.results||t.error("DB:executeQueryWithMeta:Failure: %j",g),c&&E.elapsedMS()>h.LONG_QUERY_TIME_MS&&t.info("NamedParameterMariaDbService long query: %s, %s",c,E.dump()),g}async shutdown(){let n;t.info("Shutting down %s service",this.serviceName);try{n=await this.connectionProvider.clearConnectionCache()}catch(e){t.error("Failure trying to shutdown : %s",e,e),n=!1}return n}async testConnection(n=!1){n||t.info("Running connection test");const e=(await this.executeQueryWithMeta(l.Default,"SELECT UNIX_TIMESTAMP(now())*1000 AS test")).results,i=1===e.length?e[0].test:null;return n||t.info("Test returned : %j",i),i}async testDbFailure(){await this.executeQueryWithMeta(l.Default,"this is a bad query")}async changeNextQueryTransactionIsolationLevel(n){return n&&n!==l.Default?(t.debug("Setting tx to %s",n),await this.innerExecutePreparedAsPromiseWithRetryCloseConnection("SET TRANSACTION ISOLATION LEVEL "+n,{})):null}async forceCloseConnectionForTesting(){t.warn("Forcing connection closed for testing");const n=await this.getDB();try{return await n.end(),t.info("Connection has been ended, but not set to null"),!0}catch(n){return t.error("Error closing connection : %s",n,n),!1}}async innerExecutePreparedAsPromiseWithRetryCloseConnection(n,e={},s=1){try{return await this.innerExecutePreparedAsPromise(n,e)}catch(o){const A=i.asErr(o);if(A.message.includes("closed state")||A.message.includes("This socket has been ended by the other party")||A.message.includes("ETIMEDOUT")||A.message.includes("RatchetNoConnection")||A.message.includes("ER_LOCK_WAIT_TIMEOUT")){const i=Math.min(1e3*s);if(t.warn("Found closed connection or lock timeout - clearing and attempting retry after %d (try %d of 3) (%s)",i,s,A.message),s<4){const o=await this.connectionProvider.clearConnectionCache();return t.info("Clear connection cache returned %s",o),await r.wait(i),this.innerExecutePreparedAsPromiseWithRetryCloseConnection(n,e,s+1)}throw t.warn("Ran out of retries"),new Error("Connection closed and cannot retry any more - dying horribly")}t.error("Named Param DB Query Failed : Err: %s Query: %s Params: %j",A,n,e,A);try{const i=await this.getDB();t.error("-----\nFor paste into tooling only: \n\n%s\n\n",g.renderQueryStringForPasteIntoTool(n,e,(n=>i.escape(n))))}catch(n){t.error("Really bad - failed trying to get the conn for logging : %s",n)}throw A}}async innerExecutePreparedAsPromise(n,e={}){const i=await this.getDB();i.config.namedPlaceholders=!0;const r=new s;try{const[s,o]=await i.query(n,e),A={results:s,fields:o};return t.debug("Success : Finished query : %s\n%s\n\nParams : %j",r.dump(),g.reformatQueryForLogging(n),e),t.debug("-----\nFor paste into tooling only : \n\n%s\n\n",g.renderQueryStringForPasteIntoTool(n,e,(n=>i.escape(n)))),A}finally{i.config.namedPlaceholders=!1}}async getDB(){const n=await this.connectionProvider.getConnection(this.queryDefaults.databaseName);if(!n)throw new Error("RatchetNoConnection : getConnection returned null - likely failed to get connection from db");return n}async resetConnection(){let n=!1;t.info("Resetting connection");try{await this.connectionProvider.clearConnectionCache();n=!!await this.testConnection(),t.info("Reset connection returning %s",n)}catch(n){t.error("Failed to reset connection : %s",n)}return n}}class d{configPromiseProvider;additionalConfig;ssh;static DEFAULT_CONNECTION_OPTIONS={multipleStatements:!0};tunnels=new Map;dbPromise=new Map;cacheConfigPromise;constructor(n,e=d.DEFAULT_CONNECTION_OPTIONS,i){this.configPromiseProvider=n,this.additionalConfig=e,this.ssh=i,this.cacheConfigPromise=this.createConnectionConfig(),t.info("Added shutdown handler to the process (Only once per instantiation)"),this.addShutdownHandlerToProcess()}get usingSshTunnel(){return!!this.ssh}addShutdownHandlerToProcess(){process.on("exit",(()=>{t.info("Process is shutting down, closing connections"),this.clearConnectionCache().catch((n=>{t.error("Shutdown connection failed : %s",n)}))}))}async clearConnectionCache(){t.info("Clearing connection cache for RdsMysqlConnectionProvider");const n=this.dbPromise,e=this.tunnels;if(this.cacheConfigPromise=null,this.dbPromise=new Map,this.tunnels=new Map,n.size>0){const e=Array.from(n.keys());for(const r of e){t.info("Shutting down connection : %s",r);const e=n.get(r);try{const n=await e;n?(await n.destroy(),t.info("Finished destroying old connection")):t.warn("Could not get old connection, so not destroying it")}catch(n){if(!i.asErr(n).message.includes("closed state"))throw t.error("Something went wrong closing the connection : %s",n),n}}}if(e.size>0){const n=Array.from(e.keys());for(const i of n)try{t.info("Shutting down SSH tunnel: %s",i);const n=e.get(i);n?await this.ssh.shutdown(n):t.warn("Could not get old tunnel, so not destroying it"),t.info("SSH Tunnel closed")}catch(n){t.error("Failure closing old tunnel : %s",n)}}return t.info("Old db and tunnel removed"),!1}async getConnection(n){if(t.silly("getConnection : %s",n),!this.dbPromise.has(n)){t.info("No dbPromise found for %s - creating new one",n);const e=await this.getDbConfig(n),i=this.createDatabaseConnection(e,this.additionalConfig,!0);this.dbPromise.set(n,i),t.info("Added dbPromise for %s",n)}return this.dbPromise.get(n)}async createNonPooledDatabaseConnection(n,e=d.DEFAULT_CONNECTION_OPTIONS){t.info("Creating non-pooled connection for %s",n.databaseName);const i=await this.getDbConfig(n.databaseName);return await this.createDatabaseConnection(i,e,!1)}async getDbConfig(e){t.info("RdsMysqlStyleConnectionProvider:getDbConfig:Initiating promise for %s",e);const r=await this.configPromise(),s=n.trimToEmpty(e).toLowerCase(),o=r.dbList.find((t=>n.trimToEmpty(t.label).toLowerCase()===s));if(!o)throw i.fErr("Cannot find any connection config named %s (Available are %j)",e,r.dbList.map((n=>n.label)));return o}async createDatabaseConnection(n,e=d.DEFAULT_CONNECTION_OPTIONS,i,r){t.info("In RdsMysqlStyleConnectionProvider:createDatabaseConnection : %s",n.label);const s=a.omit(a.clone(n),"label","tunnelPort");if(this.usingSshTunnel&&n.tunnelPort){let e=this.tunnels.get(n.label);if(!e){t.debug("Creating SSH tunnel from local port %d to remote host %s and port %d",n.tunnelPort,n.host,n.port);const i=await r;e=await this.ssh.createSSHTunnel(i,n.host,n.port,n.tunnelPort),this.tunnels.set(n.label,e)}s.port=e.serverOptions.port??-1,s.host="localhost"}let o;t.debug("Opening connection for RdsMysqlStyleConnectionProvider");try{o=await c.createConnection({...e,...s})}catch(n){return t.info("Failed trying to create connection : %s : clearing for retry",n),void(i&&(this.dbPromise=new Map))}return o.on("error",(n=>{t.info("An error was detected on the connection : %s : Clearing",n),this.clearConnectionCache().then((n=>{t.info("Connection cleared: %s",n)})).catch((n=>t.error("Failed to clear RDS connection cache: %j",n)))})),t.info("Added error handler to db, there are now %d error handlers and %d shutdown handlers",o.rawListeners("error").length,process.rawListeners("exit").length),o}configPromise(){return this.cacheConfigPromise||(this.cacheConfigPromise=this.createConnectionConfig()),this.cacheConfigPromise}async createConnectionConfig(){e.notNullOrUndefined(this.configPromiseProvider,"input");const n=this.configPromiseProvider();t.info("Creating connection config");const i=await n;if(e.true(i.dbList.length>0,"input.dbList"),this.usingSshTunnel)for(const n of i.dbList)n.tunnelPort=await E();return i}}class C{async shutdown(n){if(!n.connection)return t.info("Not shutting down tunnel - non-tunnel passed"),!1;try{return t.info("Shutting down SSH Tunnel"),n.connection.end(),n.server.close(),!0}catch(n){return t.error("Error closing ssh tunnel : %s",n),!1}}async createSSHTunnel(n,e,i,r){const s={autoClose:!0},o={port:r},A={srcAddr:"localhost",srcPort:r,dstAddr:e,dstPort:i},[a,c]=await B.createTunnel(s,o,n,A);a.on("error",(n=>{t.warn("SSH Server Error : %s",n)}));return{tunnelOptions:s,serverOptions:o,sshOptions:n,forwardOptions:A,server:a,connection:c}}}class Q extends h{myQueryProvider;myConnectionProvider;myQueryDefaults;currentTxFlag;static async create(n,e,i){t.info("createTransactionalNamedParameterMariaDbService : %j : %j",e,i);const r=await n.createNonPooledMysqlStyleConnectionProvider(e,i);return new Q(n.getQueryProvider(),r,e)}constructor(n,t,e){super(n,t,e),this.myQueryProvider=n,this.myConnectionProvider=t,this.myQueryDefaults=e}async cleanShutdown(){t.info("cleanShutdown");try{const n=await this.myConnectionProvider.getConnection();n&&(t.info("Shutting down connection"),n.destroy())}catch(n){t.info("Failure shutting down single-use connection : %s",n)}}async startTransaction(){if(this.currentTxFlag)i.throwFormattedErr("Tried to start a new transaction while one is already in progress : %s",this.currentTxFlag);else{this.currentTxFlag=n.createRandomHexString(10),t.info("Starting a transaction : %s",this.currentTxFlag);const e=await this.myConnectionProvider.getConnection();await(e?.beginTransaction())}}async commitTransaction(){if(this.currentTxFlag){t.info("commit a transaction : %s",this.currentTxFlag);const n=await this.myConnectionProvider.getConnection();await(n?.commit()),this.currentTxFlag=void 0}else i.throwFormattedErr("Cannot commit transaction - none in process")}async rollBackTransaction(){if(this.currentTxFlag){t.info("rollBack a transaction : %s",this.currentTxFlag);const n=await this.myConnectionProvider.getConnection();await(n?.rollback()),this.currentTxFlag=void 0}else i.throwFormattedErr("Cannot rollBack transaction - none in process")}async buildAndExecuteUpdateOrInsertInTransaction(n,e=this.myQueryDefaults.timeoutMS){t.info("buildAndExecuteUpdateOrInsertInTransaction"),await this.startTransaction();try{const t=await this.buildAndExecuteUpdateOrInsert(n,e);return await this.commitTransaction(),t}catch(n){return t.error("Failed - rolling back transaction : %s",n,n),await this.rollBackTransaction(),null}}async buildAndExecuteInTransaction(n,e=this.myQueryDefaults.timeoutMS){t.info("buildAndExecuteInTransaction"),await this.startTransaction();try{const t=await this.buildAndExecute(n,e);return await this.commitTransaction(),t}catch(n){return t.error("Failed - rolling back transaction : %s",n,n),await this.rollBackTransaction(),null}}static async oneStepBuildAndExecuteUpdateOrInsertInTransaction(n,e,i=n.getQueryDefaults().timeoutMS,r){let s,o=null;try{s=await Q.create(n,n.getQueryDefaults(),r),o=await s.buildAndExecuteUpdateOrInsertInTransaction(e,i)}catch(n){t.error("Failure in oneStepBuildAndExecuteUpdateOrInsertInTransaction : %j : %s",e,n,n)}finally{s&&await s.cleanShutdown()}return o}static async oneStepBuildAndExecuteInTransaction(n,e,i=n.getQueryDefaults().timeoutMS,r){let s,o=null;try{s=await Q.create(n,n.getQueryDefaults(),r),o=await s.buildAndExecuteInTransaction(e,i)}catch(n){t.error("Failure in oneStepbuildAndExecuteInTransaction : %j : %s",e,n,n)}finally{s&&await s.cleanShutdown()}return o}}class D{constructor(){}static buildInformation(){return{version:"354",hash:"7b24f210d77b3bafbf3ab4eb103e97300936178a",branch:"alpha-2024-05-12-17",tag:"alpha-2024-05-12-17",timeBuiltISO:"2024-05-12T23:14:35-0700",notes:"No notes"}}}class T{static US_EAST_1_BUNDLE_PEM="-----BEGIN CERTIFICATE-----\nMIIEBjCCAu6gAwIBAgIJAMc0ZzaSUK51MA0GCSqGSIb3DQEBCwUAMIGPMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkw\nODIyMTcwODUwWhcNMjQwODIyMTcwODUwWjCBjzELMAkGA1UEBhMCVVMxEDAOBgNV\nBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoMGUFtYXpv\nbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxIDAeBgNV\nBAMMF0FtYXpvbiBSRFMgUm9vdCAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEArXnF/E6/Qh+ku3hQTSKPMhQQlCpoWvnIthzX6MK3p5a0eXKZ\noWIjYcNNG6UwJjp4fUXl6glp53Jobn+tWNX88dNH2n8DVbppSwScVE2LpuL+94vY\n0EYE/XxN7svKea8YvlrqkUBKyxLxTjh+U/KrGOaHxz9v0l6ZNlDbuaZw3qIWdD/I\n6aNbGeRUVtpM6P+bWIoxVl/caQylQS6CEYUk+CpVyJSkopwJlzXT07tMoDL5WgX9\nO08KVgDNz9qP/IGtAcRduRcNioH3E9v981QO1zt/Gpb2f8NqAjUUCUZzOnij6mx9\nMcZ+9cWX88CRzR0vQODWuZscgI08NvM69Fn2SQIDAQABo2MwYTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUc19g2LzLA5j0Kxc0LjZa\npmD/vB8wHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJKoZIhvcN\nAQELBQADggEBAHAG7WTmyjzPRIM85rVj+fWHsLIvqpw6DObIjMWokpliCeMINZFV\nynfgBKsf1ExwbvJNzYFXW6dihnguDG9VMPpi2up/ctQTN8tm9nDKOy08uNZoofMc\nNUZxKCEkVKZv+IL4oHoeayt8egtv3ujJM6V14AstMQ6SwvwvA93EP/Ug2e4WAXHu\ncbI1NAbUgVDqp+DRdfvZkgYKryjTWd/0+1fS8X1bBZVWzl7eirNVnHbSH2ZDpNuY\n0SBd8dj5F6ld3t58ydZbrTHze7JJOd8ijySAp4/kiu9UfZWuTPABzDa/DSdz9Dk/\nzPW4CXXvhLmE02TA9/HeCw3KEHIwicNuEfw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBzCCAu+gAwIBAgICJVUwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTkxODE2\nNTNaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\nem9uIFJEUyB1cy1lYXN0LTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAM3i/k2u6cqbMdcISGRvh+m+L0yaSIoOXjtpNEoIftAipTUYoMhL\nInXGlQBVA4shkekxp1N7HXe1Y/iMaPEyb3n+16pf3vdjKl7kaSkIhjdUz3oVUEYt\ni8Z/XeJJ9H2aEGuiZh3kHixQcZczn8cg3dA9aeeyLSEnTkl/npzLf//669Ammyhs\nXcAo58yvT0D4E0D/EEHf2N7HRX7j/TlyWvw/39SW0usiCrHPKDLxByLojxLdHzso\nQIp/S04m+eWn6rmD+uUiRteN1hI5ncQiA3wo4G37mHnUEKo6TtTUh+sd/ku6a8HK\nglMBcgqudDI90s1OpuIAWmuWpY//8xEG2YECAwEAAaNmMGQwDgYDVR0PAQH/BAQD\nAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFPqhoWZcrVY9mU7tuemR\nRBnQIj1jMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\nDQEBCwUAA4IBAQB6zOLZ+YINEs72heHIWlPZ8c6WY8MDU+Be5w1M+BK2kpcVhCUK\nPJO4nMXpgamEX8DIiaO7emsunwJzMSvavSPRnxXXTKIc0i/g1EbiDjnYX9d85DkC\nE1LaAUCmCZBVi9fIe0H2r9whIh4uLWZA41oMnJx/MOmo3XyMfQoWcqaSFlMqfZM4\n0rNoB/tdHLNuV4eIdaw2mlHxdWDtF4oH+HFm+2cVBUVC1jXKrFv/euRVtsTT+A6i\nh2XBHKxQ1Y4HgAn0jACP2QSPEmuoQEIa57bEKEcZsBR8SDY6ZdTd2HLRIApcCOSF\nMRM8CKLeF658I0XgF8D5EsYoKPsA+74Z+jDH\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/zCCAuegAwIBAgIRAPVSMfFitmM5PhmbaOFoGfUwDQYJKoZIhvcNAQELBQAw\ngZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\nQW1hem9uIFJEUyB1cy1lYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyNTIyMzQ1N1oYDzIwNjEwNTI1MjMzNDU3WjCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIHVzLWVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDu9H7TBeGoDzMr\ndxN6H8COntJX4IR6dbyhnj5qMD4xl/IWvp50lt0VpmMd+z2PNZzx8RazeGC5IniV\n5nrLg0AKWRQ2A/lGGXbUrGXCSe09brMQCxWBSIYe1WZZ1iU1IJ/6Bp4D2YEHpXrW\nbPkOq5x3YPcsoitgm1Xh8ygz6vb7PsvJvPbvRMnkDg5IqEThapPjmKb8ZJWyEFEE\nQRrkCIRueB1EqQtJw0fvP4PKDlCJAKBEs/y049FoOqYpT3pRy0WKqPhWve+hScMd\n6obq8kxTFy1IHACjHc51nrGII5Bt76/MpTWhnJIJrCnq1/Uc3Qs8IVeb+sLaFC8K\nDI69Sw6bAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE7PCopt\nlyOgtXX0Y1lObBUxuKaCMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\nAQEAFj+bX8gLmMNefr5jRJfHjrL3iuZCjf7YEZgn89pS4z8408mjj9z6Q5D1H7yS\njNETVV8QaJip1qyhh5gRzRaArgGAYvi2/r0zPsy+Tgf7v1KGL5Lh8NT8iCEGGXwF\ng3Ir+Nl3e+9XUp0eyyzBIjHtjLBm6yy8rGk9p6OtFDQnKF5OxwbAgip42CD75r/q\np421maEDDvvRFR4D+99JZxgAYDBGqRRceUoe16qDzbMvlz0A9paCZFclxeftAxv6\nQlR5rItMz/XdzpBJUpYhdzM0gCzAzdQuVO5tjJxmXhkSMcDP+8Q+Uv6FA9k2VpUV\nE/O5jgpqUJJ2Hc/5rs9VkAPXeA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n0Ws=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAPAlEk8VJPmEzVRRaWvTh2AwCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyB1cy1lYXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTI1MjI0MTU1WhgPMjEyMTA1MjUyMzQxNTVaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgdXMtZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEx5xjrup8II4HOJw15NTnS3H5yMrQGlbj\nEDA5MMGnE9DmHp5dACIxmPXPMe/99nO7wNdl7G71OYPCgEvWm0FhdvVUeTb3LVnV\nBnaXt32Ek7/oxGk1T+Df03C+W0vmuJ+wo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBTGXmqBWN/1tkSea4pNw0oHrjk2UDAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIxAIqqZWCSrIkZ7zsv/FygtAusW6yvlL935YAWYPVXU30m\njkMFLM+/RJ9GMvnO8jHfCgIwB+whlkcItzE9CRQ6CsMo/d5cEHDUu/QW6jSIh9BR\nOGh9pTYPVkUbBiKPA7lVVhre\n-----END CERTIFICATE-----\n";static US_EAST_2_BUNDLE_PEM="-----BEGIN CERTIFICATE-----\nMIIEBjCCAu6gAwIBAgIJAMc0ZzaSUK51MA0GCSqGSIb3DQEBCwUAMIGPMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkw\nODIyMTcwODUwWhcNMjQwODIyMTcwODUwWjCBjzELMAkGA1UEBhMCVVMxEDAOBgNV\nBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoMGUFtYXpv\nbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxIDAeBgNV\nBAMMF0FtYXpvbiBSRFMgUm9vdCAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEArXnF/E6/Qh+ku3hQTSKPMhQQlCpoWvnIthzX6MK3p5a0eXKZ\noWIjYcNNG6UwJjp4fUXl6glp53Jobn+tWNX88dNH2n8DVbppSwScVE2LpuL+94vY\n0EYE/XxN7svKea8YvlrqkUBKyxLxTjh+U/KrGOaHxz9v0l6ZNlDbuaZw3qIWdD/I\n6aNbGeRUVtpM6P+bWIoxVl/caQylQS6CEYUk+CpVyJSkopwJlzXT07tMoDL5WgX9\nO08KVgDNz9qP/IGtAcRduRcNioH3E9v981QO1zt/Gpb2f8NqAjUUCUZzOnij6mx9\nMcZ+9cWX88CRzR0vQODWuZscgI08NvM69Fn2SQIDAQABo2MwYTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUc19g2LzLA5j0Kxc0LjZa\npmD/vB8wHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJKoZIhvcN\nAQELBQADggEBAHAG7WTmyjzPRIM85rVj+fWHsLIvqpw6DObIjMWokpliCeMINZFV\nynfgBKsf1ExwbvJNzYFXW6dihnguDG9VMPpi2up/ctQTN8tm9nDKOy08uNZoofMc\nNUZxKCEkVKZv+IL4oHoeayt8egtv3ujJM6V14AstMQ6SwvwvA93EP/Ug2e4WAXHu\ncbI1NAbUgVDqp+DRdfvZkgYKryjTWd/0+1fS8X1bBZVWzl7eirNVnHbSH2ZDpNuY\n0SBd8dj5F6ld3t58ydZbrTHze7JJOd8ijySAp4/kiu9UfZWuTPABzDa/DSdz9Dk/\nzPW4CXXvhLmE02TA9/HeCw3KEHIwicNuEfw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECDCCAvCgAwIBAgIDAIVCMA0GCSqGSIb3DQEBCwUAMIGPMQswCQYDVQQGEwJV\nUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UE\nCgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJE\nUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkwOTEzMTcw\nNjQxWhcNMjQwODIyMTcwODUwWjCBlDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldh\nc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoMGUFtYXpvbiBXZWIg\nU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxJTAjBgNVBAMMHEFt\nYXpvbiBSRFMgdXMtZWFzdC0yIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQDE+T2xYjUbxOp+pv+gRA3FO24+1zCWgXTDF1DHrh1lsPg5k7ht\n2KPYzNc+Vg4E+jgPiW0BQnA6jStX5EqVh8BU60zELlxMNvpg4KumniMCZ3krtMUC\nau1NF9rM7HBh+O+DYMBLK5eSIVt6lZosOb7bCi3V6wMLA8YqWSWqabkxwN4w0vXI\n8lu5uXXFRemHnlNf+yA/4YtN4uaAyd0ami9+klwdkZfkrDOaiy59haOeBGL8EB/c\ndbJJlguHH5CpCscs3RKtOOjEonXnKXldxarFdkMzi+aIIjQ8GyUOSAXHtQHb3gZ4\nnS6Ey0CMlwkB8vUObZU9fnjKJcL5QCQqOfwvAgMBAAGjZjBkMA4GA1UdDwEB/wQE\nAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBQUPuRHohPxx4VjykmH\n6usGrLL1ETAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n9w0BAQsFAAOCAQEAUdR9Vb3y33Yj6X6KGtuthZ08SwjImVQPtknzpajNE5jOJAh8\nquvQnU9nlnMO85fVDU1Dz3lLHGJ/YG1pt1Cqq2QQ200JcWCvBRgdvH6MjHoDQpqZ\nHvQ3vLgOGqCLNQKFuet9BdpsHzsctKvCVaeBqbGpeCtt3Hh/26tgx0rorPLw90A2\nV8QSkZJjlcKkLa58N5CMM8Xz8KLWg3MZeT4DmlUXVCukqK2RGuP2L+aME8dOxqNv\nOnOz1zrL5mR2iJoDpk8+VE/eBDmJX40IJk6jBjWoxAO/RXq+vBozuF5YHN1ujE92\ntO8HItgTp37XT8bJBAiAnt5mxw+NLSqtxk2QdQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/zCCAuegAwIBAgIRAJYlnmkGRj4ju/2jBQsnXJYwDQYJKoZIhvcNAQELBQAw\ngZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\nQW1hem9uIFJEUyB1cy1lYXN0LTIgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyMTIzMDQ0NFoYDzIwNjEwNTIyMDAwNDQ0WjCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIHVzLWVhc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC74V3eigv+pCj5\nnqDBqplY0Jp16pTeNB06IKbzb4MOTvNde6QjsZxrE1xUmprT8LxQqN9tI3aDYEYk\nb9v4F99WtQVgCv3Y34tYKX9NwWQgwS1vQwnIR8zOFBYqsAsHEkeJuSqAB12AYUSd\nZv2RVFjiFmYJho2X30IrSLQfS/IE3KV7fCyMMm154+/K1Z2IJlcissydEAwgsUHw\nedrE6CxJVkkJ3EvIgG4ugK/suxd8eEMztaQYJwSdN8TdfT59LFuSPl7zmF3fIBdJ\n//WexcQmGabaJ7Xnx+6o2HTfkP8Zzzzaq8fvjAcvA7gyFH5EP26G2ZqMG+0y4pTx\nSPVTrQEXAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIWWuNEF\nsUMOC82XlfJeqazzrkPDMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\nAQEAgClmxcJaQTGpEZmjElL8G2Zc8lGc+ylGjiNlSIw8X25/bcLRptbDA90nuP+q\nzXAMhEf0ccbdpwxG/P5a8JipmHgqQLHfpkvaXx+0CuP++3k+chAJ3Gk5XtY587jX\n+MJfrPgjFt7vmMaKmynndf+NaIJAYczjhJj6xjPWmGrjM3MlTa9XesmelMwP3jep\nbApIWAvCYVjGndbK9byyMq1nyj0TUzB8oJZQooaR3MMjHTmADuVBylWzkRMxbKPl\n4Nlsk4Ef1JvIWBCzsMt+X17nuKfEatRfp3c9tbpGlAE/DSP0W2/Lnayxr4RpE9ds\nICF35uSis/7ZlsftODUe8wtpkQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nPqj2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrDCCAjOgAwIBAgIQGcztRyV40pyMKbNeSN+vXTAKBggqhkjOPQQDAzCBljEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMS8wLQYDVQQDDCZBbWF6\nb24gUkRTIHVzLWVhc3QtMiBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTAgFw0yMTA1MjEyMzE1NTZaGA8yMTIxMDUyMjAwMTU1NlowgZYxCzAJBgNV\nBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYD\nVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1hem9uIFJE\nUyB1cy1lYXN0LTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1NlYXR0bGUw\ndjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQfDcv+GGRESD9wT+I5YIPRsD3L+/jsiIis\nTr7t9RSbFl+gYpO7ZbDXvNbV5UGOC5lMJo/SnqFRTC6vL06NF7qOHfig3XO8QnQz\n6T5uhhrhnX2RSY3/10d2kTyHq3ZZg3+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFLDyD3PRyNXpvKHPYYxjHXWOgfPnMA4GA1UdDwEB/wQEAwIBhjAKBggq\nhkjOPQQDAwNnADBkAjB20HQp6YL7CqYD82KaLGzgw305aUKw2aMrdkBR29J183jY\n6Ocj9+Wcif9xnRMS+7oCMAvrt03rbh4SU9BohpRUcQ2Pjkh7RoY0jDR4Xq4qzjNr\n5UFr3BXpFvACxXF51BksGQ==\n-----END CERTIFICATE-----\n";static US_WEST_1_BUNDLE_PEM="-----BEGIN CERTIFICATE-----\nMIIEBjCCAu6gAwIBAgIJAMc0ZzaSUK51MA0GCSqGSIb3DQEBCwUAMIGPMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkw\nODIyMTcwODUwWhcNMjQwODIyMTcwODUwWjCBjzELMAkGA1UEBhMCVVMxEDAOBgNV\nBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoMGUFtYXpv\nbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxIDAeBgNV\nBAMMF0FtYXpvbiBSRFMgUm9vdCAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEArXnF/E6/Qh+ku3hQTSKPMhQQlCpoWvnIthzX6MK3p5a0eXKZ\noWIjYcNNG6UwJjp4fUXl6glp53Jobn+tWNX88dNH2n8DVbppSwScVE2LpuL+94vY\n0EYE/XxN7svKea8YvlrqkUBKyxLxTjh+U/KrGOaHxz9v0l6ZNlDbuaZw3qIWdD/I\n6aNbGeRUVtpM6P+bWIoxVl/caQylQS6CEYUk+CpVyJSkopwJlzXT07tMoDL5WgX9\nO08KVgDNz9qP/IGtAcRduRcNioH3E9v981QO1zt/Gpb2f8NqAjUUCUZzOnij6mx9\nMcZ+9cWX88CRzR0vQODWuZscgI08NvM69Fn2SQIDAQABo2MwYTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUc19g2LzLA5j0Kxc0LjZa\npmD/vB8wHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJKoZIhvcN\nAQELBQADggEBAHAG7WTmyjzPRIM85rVj+fWHsLIvqpw6DObIjMWokpliCeMINZFV\nynfgBKsf1ExwbvJNzYFXW6dihnguDG9VMPpi2up/ctQTN8tm9nDKOy08uNZoofMc\nNUZxKCEkVKZv+IL4oHoeayt8egtv3ujJM6V14AstMQ6SwvwvA93EP/Ug2e4WAXHu\ncbI1NAbUgVDqp+DRdfvZkgYKryjTWd/0+1fS8X1bBZVWzl7eirNVnHbSH2ZDpNuY\n0SBd8dj5F6ld3t58ydZbrTHze7JJOd8ijySAp4/kiu9UfZWuTPABzDa/DSdz9Dk/\nzPW4CXXvhLmE02TA9/HeCw3KEHIwicNuEfw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECDCCAvCgAwIBAgIDAIkHMA0GCSqGSIb3DQEBCwUAMIGPMQswCQYDVQQGEwJV\nUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UE\nCgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJE\nUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkwOTA2MTc0\nMDIxWhcNMjQwODIyMTcwODUwWjCBlDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldh\nc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoMGUFtYXpvbiBXZWIg\nU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxJTAjBgNVBAMMHEFt\nYXpvbiBSRFMgdXMtd2VzdC0xIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQDD2yzbbAl77OofTghDMEf624OvU0eS9O+lsdO0QlbfUfWa1Kd6\n0WkgjkLZGfSRxEHMCnrv4UPBSK/Qwn6FTjkDLgemhqBtAnplN4VsoDL+BkRX4Wwq\n/dSQJE2b+0hm9w9UMVGFDEq1TMotGGTD2B71eh9HEKzKhGzqiNeGsiX4VV+LJzdH\nuM23eGisNqmd4iJV0zcAZ+Gbh2zK6fqTOCvXtm7Idccv8vZZnyk1FiWl3NR4WAgK\nAkvWTIoFU3Mt7dIXKKClVmvssG8WHCkd3Xcb4FHy/G756UZcq67gMMTX/9fOFM/v\nl5C0+CHl33Yig1vIDZd+fXV1KZD84dEJfEvHAgMBAAGjZjBkMA4GA1UdDwEB/wQE\nAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBR+ap20kO/6A7pPxo3+\nT3CfqZpQWjAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n9w0BAQsFAAOCAQEAHCJky2tPjPttlDM/RIqExupBkNrnSYnOK4kr9xJ3sl8UF2DA\nPAnYsjXp3rfcjN/k/FVOhxwzi3cXJF/2Tjj39Bm/OEfYTOJDNYtBwB0VVH4ffa/6\ntZl87jaIkrxJcreeeHqYMnIxeN0b/kliyA+a5L2Yb0VPjt9INq34QDc1v74FNZ17\n4z8nr1nzg4xsOWu0Dbjo966lm4nOYIGBRGOKEkHZRZ4mEiMgr3YLkv8gSmeitx57\nZ6dVemNtUic/LVo5Iqw4n3TBS0iF2C1Q1xT/s3h+0SXZlfOWttzSluDvoMv5PvCd\npFjNn+aXLAALoihL1MJSsxydtsLjOBro5eK0Vw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nHing\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQGyUVTaVjYJvWhroVEiHPpDANBgkqhkiG9w0BAQsFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIHVzLXdlc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTE5MTkwNDA2WhgPMjA2MTA1MTkyMDA0MDZaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgdXMtd2VzdC0xIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANhyXpJ0t4nigRDZ\nEwNtFOem1rM1k8k5XmziHKDvDk831p7QsX9ZOxl/BT59Pu/P+6W6SvasIyKls1sW\nFJIjFF+6xRQcpoE5L5evMgN/JXahpKGeQJPOX9UEXVW5B8yi+/dyUitFT7YK5LZA\nMqWBN/LtHVPa8UmE88RCDLiKkqiv229tmwZtWT7nlMTTCqiAHMFcryZHx0pf9VPh\nx/iPV8p2gBJnuPwcz7z1kRKNmJ8/cWaY+9w4q7AYlAMaq/rzEqDaN2XXevdpsYAK\nTMMj2kji4x1oZO50+VPNfBl5ZgJc92qz1ocF95SAwMfOUsP8AIRZkf0CILJYlgzk\n/6u6qZECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm5jfcS9o\n+LwL517HpB6hG+PmpBswDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\nAQAcQ6lsqxi63MtpGk9XK8mCxGRLCad51+MF6gcNz6i6PAqhPOoKCoFqdj4cEQTF\nF8dCfa3pvfJhxV6RIh+t5FCk/y6bWT8Ls/fYKVo6FhHj57bcemWsw/Z0XnROdVfK\nYqbc7zvjCPmwPHEqYBhjU34NcY4UF9yPmlLOL8uO1JKXa3CAR0htIoW4Pbmo6sA4\n6P0co/clW+3zzsQ92yUCjYmRNeSbdXbPfz3K/RtFfZ8jMtriRGuO7KNxp8MqrUho\nHK8O0mlSUxGXBZMNicfo7qY8FD21GIPH9w5fp5oiAl7lqFzt3E3sCLD3IiVJmxbf\nfUwpGd1XZBBSdIxysRLM6j48\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAMkvdFnVDb0mWWFiXqnKH68wCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyB1cy13ZXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTE5MTkxMzI0WhgPMjEyMTA1MTkyMDEzMjRaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgdXMtd2VzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEy86DB+9th/0A5VcWqMSWDxIUblWTt/R0\nao6Z2l3vf2YDF2wt1A2NIOGpfQ5+WAOJO/IQmnV9LhYo+kacB8sOnXdQa6biZZkR\nIyouUfikVQAKWEJnh1Cuo5YMM4E2sUt5o0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBQ8u3OnecANmG8OoT7KLWDuFzZwBTAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIwQ817qkb7mWJFnieRAN+m9W3E0FLVKaV3zC5aYJUk2fcZ\nTaUx3oLp3jPLGvY5+wgeAjEA6wAicAki4ZiDfxvAIuYiIe1OS/7H5RA++R8BH6qG\niRzUBM/FItFpnkus7u/eTkvo\n-----END CERTIFICATE-----\n";static US_WEST_2_BUNDLE_PEM="-----BEGIN CERTIFICATE-----\nMIIEBjCCAu6gAwIBAgIJAMc0ZzaSUK51MA0GCSqGSIb3DQEBCwUAMIGPMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkw\nODIyMTcwODUwWhcNMjQwODIyMTcwODUwWjCBjzELMAkGA1UEBhMCVVMxEDAOBgNV\nBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoMGUFtYXpv\nbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxIDAeBgNV\nBAMMF0FtYXpvbiBSRFMgUm9vdCAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEArXnF/E6/Qh+ku3hQTSKPMhQQlCpoWvnIthzX6MK3p5a0eXKZ\noWIjYcNNG6UwJjp4fUXl6glp53Jobn+tWNX88dNH2n8DVbppSwScVE2LpuL+94vY\n0EYE/XxN7svKea8YvlrqkUBKyxLxTjh+U/KrGOaHxz9v0l6ZNlDbuaZw3qIWdD/I\n6aNbGeRUVtpM6P+bWIoxVl/caQylQS6CEYUk+CpVyJSkopwJlzXT07tMoDL5WgX9\nO08KVgDNz9qP/IGtAcRduRcNioH3E9v981QO1zt/Gpb2f8NqAjUUCUZzOnij6mx9\nMcZ+9cWX88CRzR0vQODWuZscgI08NvM69Fn2SQIDAQABo2MwYTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUc19g2LzLA5j0Kxc0LjZa\npmD/vB8wHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJKoZIhvcN\nAQELBQADggEBAHAG7WTmyjzPRIM85rVj+fWHsLIvqpw6DObIjMWokpliCeMINZFV\nynfgBKsf1ExwbvJNzYFXW6dihnguDG9VMPpi2up/ctQTN8tm9nDKOy08uNZoofMc\nNUZxKCEkVKZv+IL4oHoeayt8egtv3ujJM6V14AstMQ6SwvwvA93EP/Ug2e4WAXHu\ncbI1NAbUgVDqp+DRdfvZkgYKryjTWd/0+1fS8X1bBZVWzl7eirNVnHbSH2ZDpNuY\n0SBd8dj5F6ld3t58ydZbrTHze7JJOd8ijySAp4/kiu9UfZWuTPABzDa/DSdz9Dk/\nzPW4CXXvhLmE02TA9/HeCw3KEHIwicNuEfw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBzCCAu+gAwIBAgICUYkwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTYxODIx\nMTVaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\nem9uIFJEUyB1cy13ZXN0LTIgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBANCEZBZyu6yJQFZBJmSUZfSZd3Ui2gitczMKC4FLr0QzkbxY+cLa\nuVONIOrPt4Rwi+3h/UdnUg917xao3S53XDf1TDMFEYp4U8EFPXqCn/GXBIWlU86P\nPvBN+gzw3nS+aco7WXb+woTouvFVkk8FGU7J532llW8o/9ydQyDIMtdIkKTuMfho\nOiNHSaNc+QXQ32TgvM9A/6q7ksUoNXGCP8hDOkSZ/YOLiI5TcdLh/aWj00ziL5bj\npvytiMZkilnc9dLY9QhRNr0vGqL0xjmWdoEXz9/OwjmCihHqJq+20MJPsvFm7D6a\n2NKybR9U+ddrjb8/iyLOjURUZnj5O+2+OPcCAwEAAaNmMGQwDgYDVR0PAQH/BAQD\nAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFEBxMBdv81xuzqcK5TVu\npHj+Aor8MB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\nDQEBCwUAA4IBAQBZkfiVqGoJjBI37aTlLOSjLcjI75L5wBrwO39q+B4cwcmpj58P\n3sivv+jhYfAGEbQnGRzjuFoyPzWnZ1DesRExX+wrmHsLLQbF2kVjLZhEJMHF9eB7\nGZlTPdTzHErcnuXkwA/OqyXMpj9aghcQFuhCNguEfnROY9sAoK2PTfnTz9NJHL+Q\nUpDLEJEUfc0GZMVWYhahc0x38ZnSY2SKacIPECQrTI0KpqZv/P+ijCEcMD9xmYEb\njL4en+XKS1uJpw5fIU5Sj0MxhdGstH6S84iAE5J3GM3XHklGSFwwqPYvuTXvANH6\nuboynxRgSae59jIlAK6Jrr6GWMwQRbgcaAlW\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAOxu0I1QuMAhIeszB3fJIlkwCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyB1cy13ZXN0LTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTI0MjIwNjU5WhgPMjEyMTA1MjQyMzA2NTlaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgdXMtd2VzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEz4bylRcGqqDWdP7gQIIoTHdBK6FNtKH1\n4SkEIXRXkYDmRvL9Bci1MuGrwuvrka5TDj4b7e+csY0llEzHpKfq6nJPFljoYYP9\nuqHFkv77nOpJJ633KOr8IxmeHW5RXgrZo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBQQikVz8wmjd9eDFRXzBIU8OseiGzAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIwf06Mcrpw1O0EBLBBrp84m37NYtOkE/0Z0O+C7D41wnXi\nEQdn6PXUVgdD23Gj82SrAjEAklhKs+liO1PtN15yeZR1Io98nFve+lLptaLakZcH\n+hfFuUtCqMbaI8CdvJlKnPqT\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF/jCCA+agAwIBAgIQR71Z8lTO5Sj+as2jB7IWXzANBgkqhkiG9w0BAQwFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIHVzLXdlc3QtMiBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTI0MjIwMzIwWhgPMjEyMTA1MjQyMzAzMjBaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgdXMtd2VzdC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAM977bHIs1WJijrS\nXQMfUOhmlJjr2v0K0UjPl52sE1TJ76H8umo1yR4T7Whkd9IwBHNGKXCJtJmMr9zp\nfB38eLTu+5ydUAXdFuZpRMKBWwPVe37AdJRKqn5beS8HQjd3JXAgGKUNNuE92iqF\nqi2fIqFMpnJXWo0FIW6s2Dl2zkORd7tH0DygcRi7lgVxCsw1BJQhFJon3y+IV8/F\nbnbUXSNSDUnDW2EhvWSD8L+t4eiXYsozhDAzhBvojpxhPH9OB7vqFYw5qxFx+G0t\nlSLX5iWi1jzzc3XyGnB6WInZDVbvnvJ4BGZ+dTRpOCvsoMIn9bz4EQTvu243c7aU\nHbS/kvnCASNt+zk7C6lbmaq0AGNztwNj85Opn2enFciWZVnnJ/4OeefUWQxD0EPp\nSjEd9Cn2IHzkBZrHCg+lWZJQBKbUVS0lLIMSsLQQ6WvR38jY7D2nxM1A93xWxwpt\nZtQnYRCVXH6zt2OwDAFePInWwxUjR5t/wu3XxPgpSfrmTi3WYtr1wFypAJ811e/P\nyBtswWUQ6BNJQvy+KnOEeGfOwmtdDFYR+GOCfvCihzrKJrxOtHIieehR5Iw3cbXG\nsm4pDzfMUVvDDz6C2M6PRlJhhClbatHCjik9hxFYEsAlqtVVK9pxaz9i8hOqSFQq\nkJSQsgWw+oM/B2CyjcSqkSQEu8RLAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8w\nHQYDVR0OBBYEFPmrdxpRRgu3IcaB5BTqlprcKdTsMA4GA1UdDwEB/wQEAwIBhjAN\nBgkqhkiG9w0BAQwFAAOCAgEAVdlxWjPvVKky3kn8ZizeM4D+EsLw9dWLau2UD/ls\nzwDCFoT6euagVeCknrn+YEl7g20CRYT9iaonGoMUPuMR/cdtPL1W/Rf40PSrGf9q\nQuxavWiHLEXOQTCtCaVZMokkvjuuLNDXyZnstgECuiZECTwhexUF4oiuhyGk9o01\nQMaiz4HX4lgk0ozALUvEzaNd9gWEwD2qe+rq9cQMTVq3IArUkvTIftZUaVUMzr0O\ned1+zAsNa9nJhURJ/6anJPJjbQgb5qA1asFcp9UaMT1ku36U3gnR1T/BdgG2jX3X\nUm0UcaGNVPrH1ukInWW743pxWQb7/2sumEEMVh+jWbB18SAyLI4WIh4lkurdifzS\nIuTFp8TEx+MouISFhz/vJDWZ84tqoLVjkEcP6oDypq9lFoEzHDJv3V1CYcIgOusT\nk1jm9P7BXdTG7TYzUaTb9USb6bkqkD9EwJAOSs7DI94aE6rsSws2yAHavjAMfuMZ\nsDAZvkqS2Qg2Z2+CI6wUZn7mzkJXbZoqRjDvChDXEB1mIhzVXhiNW/CR5WKVDvlj\n9v1sdGByh2pbxcLQtVaq/5coM4ANgphoNz3pOYUPWHS+JUrIivBZ+JobjXcxr3SN\n9iDzcu5/FVVNbq7+KN/nvPMngT+gduEN5m+EBjm8GukJymFG0m6BENRA0QSDqZ7k\nzDY=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQRiwspKyrO0xoxDgSkqLZczANBgkqhkiG9w0BAQsFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIHVzLXdlc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTI0MjE1OTAwWhgPMjA2MTA1MjQyMjU5MDBaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgdXMtd2VzdC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL53Jk3GsKiu+4bx\njDfsevWbwPCNJ3H08Zp7GWhvI3Tgi39opfHYv2ku2BKFjK8N2L6RvNPSR8yplv5j\nY0tK0U+XVNl8o0ibhqRDhbTuh6KL8CFINWYzAajuxFS+CF0U6c1Q3tXLBdALxA7l\nFlXJ71QrP06W31kRe7kvgrvO7qWU3/OzUf9qYw4LSiR1/VkvvRCTqcVNw09clw/M\nJbw6FSgweN65M9j7zPbjGAXSHkXyxH1Erin2fa+B9PE4ZDgX9cp2C1DHewYJQL/g\nSepwwcudVNRN1ibKH7kpMrgPnaNIVNx5sXVsTjk6q2ZqYw3SVHegltJpLy/cZReP\nmlivF2kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUmTcQd6o1\nCuS65MjBrMwQ9JJjmBwwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\nAQAKSDSIzl956wVddPThf2VAzI8syw9ngSwsEHZvxVGHBvu5gg618rDyguVCYX9L\n4Kw/xJrk6S3qxOS2ZDyBcOpsrBskgahDFIunzoRP3a18ARQVq55LVgfwSDQiunch\nBd05cnFGLoiLkR5rrkgYaP2ftn3gRBRaf0y0S3JXZ2XB3sMZxGxavYq9mfiEcwB0\nLMTMQ1NYzahIeG6Jm3LqRqR8HkzP/Ztq4dT2AtSLvFebbNMiWqeqT7OcYp94HTYT\nzqrtaVdUg9bwyAUCDgy0GV9RHDIdNAOInU/4LEETovrtuBU7Z1q4tcHXvN6Hd1H8\ngMb0mCG5I393qW5hFsA/diFb\n-----END CERTIFICATE-----\n"}class y{static async uploadObjectArrayToTable(n,i,r,s=!1){if(e.notNullOrUndefined(n,"db"),e.notNullOrUndefined(i,"tableName"),e.notNullOrUndefined(r,"data"),t.info("Writing %d items to %s (clear: %s)",r.length,i,s),s){t.info("Clearing table %s",i);const{results:e}=await n.executeQueryWithMeta(l.Default,"DELETE FROM "+i,{});t.info("Removed %d rows",e.affectedRows)}const o=new Set(r.flatMap((n=>Object.keys(n)))),A=Array.from(o);t.info("Found columns : %j",A);const a="INSERT INTO "+i+" ("+A.join(",")+") VALUES :multiValue",{results:c}=await n.executeQueryWithMeta(l.Default,a,{multiValue:r}),E=c.affectedRows;return t.info("Wrote %d rows",E),E!==r.length&&t.warn("Should have written %d but wrote %d",r.length,E),E}}export{T as AwsRdsCert2023,h as NamedParameterMariaDbService,u as NonPooledMysqlStyleConnectionProvider,I as QueryBuilder,w as QueryBuilderResult,g as QueryUtil,D as RatchetRdbmsInfo,d as RdsMysqlStyleConnectionProvider,y as RelationalDatabaseUtils,M as SortDirection,C as SshTunnelService,l as TransactionIsolationLevel,Q as TransactionalNamedParameterMariaDbService};
1
+ import{StringRatchet as n,Logger as t,RequireRatchet as e,ErrorRatchet as i,PromiseRatchet as r,StopWatch as s,TimeoutToken as o,DurationRatchet as A}from"@bitblit/ratchet-common";import a from"mysql2/promise";import c from"get-port";import*as l from"tunnel-ssh";class E{fields=[];replacements={};addReplacement(n,...t){this.replacements=Object.assign(this.replacements,n),this.addFields(...t)}appendReplacement(n,t,...e){this.replacements[n]=this.replacements[n]+t,this.addFields(...e)}addFields(...n){this.fields=this.fields.concat(...n)}getFields(){return this.fields}getReplacements(){return this.replacements}static sqlInjectionUnsafeParamRenderer(t){const e=t=>"string"==typeof t?'"'+t+'"':n.safeString(t);return Array.isArray(t)?t.map((n=>e(n))).join(","):e(t)}static renderQueryStringForPasteIntoTool(n,t,e=E.sqlInjectionUnsafeParamRenderer){const i=t??{};let r=E.reformatQueryForLogging(n);if(r){const n=Object.keys(i);n.sort(((n,t)=>t.length-n.length));for(const t of n){const n=":"+t,s=e(i[t]);r=r.split(n).join(s)}r.endsWith(";")||(r+=";")}return r}static reformatQueryForLogging(e,i=80){let r=i;if(!n.trimToNull(e))return null;let s="",o=n.trimToEmpty(e).split("\n").join(" ").split("\r").join(" ");for(;o.length>r;){let e=Math.min(o.length,r);for(;e>0&&![" ",","].includes(o.charAt(e));)e--;e>0?(s+=o.substring(0,e)+"\n",o=n.trimToEmpty(o.substring(e))):(t.silly("Input contains a string longer than the max line length - bumping"),r+=2)}return s+(o.length>0?o:"")}}var g,B;!function(n){n.Default="Default",n.ReadUncommitted="READ UNCOMMITTED"}(g||(g={}));class u{connection;constructor(n){this.connection=n,e.notNullOrUndefined(n)}async getConnection(){return this.connection}async clearConnectionCache(){return t.info("clearConnectionCache ignored - not pooled"),!0}}class M{query;namedParams;paginator;transactionIsolationLevel;constructor(n,t,e,i){this.query=n,this.namedParams=t,this.paginator=e,this.transactionIsolationLevel=i}}!function(n){n.Asc="Asc",n.Desc="Desc"}(B||(B={}));class w{static ALLOWED_SQL_CONSTRUCT=/^[a-z0-9_.`]+$/i;queryProvider;query;meta=Object.freeze({});sqlConstructs={};namedParams={};conditionals={};debugComment="";paginator;debugAnnotateMode=!1;transactionIsolationLevel=g.Default;constructor(n){this.queryProvider=n}clone(){const n=new w(this.queryProvider);return this.query&&n.withBaseQuery(this.query),n.sqlConstructs=structuredClone(this.sqlConstructs),n.namedParams=structuredClone(this.namedParams),n.conditionals=structuredClone(this.conditionals),n.paginator=structuredClone(this.paginator),n.debugComment=this.debugComment,n.transactionIsolationLevel=this.transactionIsolationLevel,n}withTransactionIsolationLevel(n){return this.transactionIsolationLevel=n,this}withDebugComment(n){return this.debugComment=n,this}appendDebugComment(n){return this.debugComment=this.debugComment+n,this}withNamedQuery(t){return this.query=this.queryProvider.fetchQuery(t),n.trimToNull(this.query)||i.throwFormattedErr("Requested query that does not exist : %s",t),this.meta=Object.freeze({queryPath:t}),this.withDebugComment(" "+t+" "),this}withBaseQuery(n){this.query=n}withSqlConstruct(n,t){return this.sqlConstructs[n]=t,this}withSqlConstructs(n){return this.sqlConstructs=Object.assign(this.sqlConstructs,n),this}removeParam(n){return delete this.namedParams[n],this}paramNames(){return Object.keys(this.namedParams)}withParam(n,t){return this.namedParams[n]=t,this}withParams(n){return this.namedParams=Object.assign(this.namedParams,n),this}withExpandedParam(n,e,i){const r=n+"Length";let s=this.fetchCopyOfParam(r)??0;if(s>0&&!i){t.silly("Old item found and not extending - removing old params");this.paramNames().filter((t=>t.startsWith(n))).forEach((n=>this.removeParam(n))),s=0}this.withParam(r,e.length+s);for(let t=0;t<e.length;t++){const i=e[t];if("object"==typeof i&&i)for(const e of Object.keys(i)){const r=n+e.charAt(0).toUpperCase()+e.slice(1)+(t+s);this.withParam(r,i[e])}else{const e=n+t;this.withParam(e,i)}}return this}withConditional(n,t=!0){return this.conditionals[n]=t,this}withConditionals(n){return this.conditionals=Object.assign(this.conditionals,n),this}withPaginator(n){return e.notNullOrUndefined(n,"paginator"),e.notNullOrUndefined(n.cn,"paginator.cn"),e.true(n.min||n.max||n.l,"paginator must have some limit"),n.s=n.s??B.Asc,this.paginator=n,this}fetchCopyOfParam(n){return this.namedParams[n]}fetchCopyOfConditional(n){return this.conditionals[n]}containsParam(n){return null!=this.namedParams[n]}getDebugComment(){return this.debugComment}containsConditional(n){return null!=this.conditionals[n]}build(){return this.clone().internalBuild(!1)}buildUnfiltered(){return this.clone().internalBuild(!0)}internalBuild(n){return this.applyQueryFragments(),this.applyConditionalBlocks(),this.applyRepeatBlocks(),this.applyPagination(n),this.applySqlConstructs(),this.applyComments(),this.runQueryChecks(),this.stripNonAsciiParams(),new M((this.query??"").trim(),this.namedParams,this.paginator,this.transactionIsolationLevel)}stripNonAsciiParams(){const t=n.stripNonAscii(JSON.stringify(this.namedParams));this.namedParams=JSON.parse(t)}runQueryChecks(){const n=[...this.query?.matchAll(/['"]:[A-z-]*['"]/gm)??[]];n.length>0&&t.warn("The resulting query contains quoted named params check this this is intended. Instances found: %s",n.join(", "))}applyComments(){if(this.debugComment.length&&this.query){const n=this.query.indexOf(" "),t=this.debugComment;this.query=this.query.substring(0,n+1)+`/*${t}*/`+this.query.substring(n+1)}}applySqlConstructs(){for(const t of Object.keys(this.sqlConstructs)){let e;const i=this.sqlConstructs[t];if(Array.isArray(i))i.forEach((n=>{if("string"!=typeof n||!n.match(w.ALLOWED_SQL_CONSTRUCT))throw new Error(`sql construct entry ${n} is invalid value must be alphanumeric only.`)})),e=i.join(", ");else if(e=n.safeString(i),e.length>0&&!e.match(w.ALLOWED_SQL_CONSTRUCT))throw new Error(`sql construct ${e} is invalid value must be alphanumeric only.`);const r=["update","insert","delete","drop","select"];for(const n of r)if(e.toLowerCase().includes(n))throw new Error(`sql construct ${e} is invalid value must not contain reserved word ${n}.`);const s=`##sqlConstruct:${t}##`;for(;this.query?.includes(s);)this.query=this.query.replace(s,e)}}applyRepeatBlocks(){const n="<repeat";for(;;){const t=this.query?.indexOf(n);if(-1===t||!this.query||"number"!=typeof t)return;const e=this.query.indexOf(">",t);if(-1==e)throw new Error(`Invalid query when finding end symbol matching > in ${this.query} check that you have closed all your tags correctly.`);const i="count=";let r="";const s="join=";let o;const A=this.query.substring(t+7,e).trim().split(" ");for(const n of A)n.includes(i)&&(r=n.substring(n.indexOf(i)+i.length)),n.includes(s)&&(o=n.substring(n.indexOf(s)+s.length));const a="</repeat>",c=this.query.indexOf(a),l=this.query.substring(e+1,c);this.query=this.query.substring(0,t)+this.query.substring(c+a.length);const E=this.namedParams[r.substring(1)];for(let n=0;n<E;n++){let e=l;o&&0!=n&&(e+=o);let i=e.indexOf("::");for(;-1!=i;){const t=e.indexOf("::",i+2);if(-1==t)throw new Error(`Invalid query when finding end symbol matching :: check that you have closed all your tags correctly. Query: ${this.query} `);const r=e.substring(i+2,t);e=e.replace("::"+r+"::",":"+r+n),i=e.indexOf("::")}this.query=this.query.substring(0,t)+e+this.query.substring(t)}}}applyQueryFragments(){for(;;){const n=this.query?.indexOf("[[");if(-1==n||!this.query||"number"!=typeof n)return;const t=this.query.indexOf("]]",n);if(-1==t)throw new Error(`Invalid query when finding end symbol matching ]] in ${this.query} check that you have closed all your tags correctly.`);const e=this.query.substring(n+2,t),i=this.queryProvider.fetchQuery(e);if(!i)throw new Error(`Invalid query, query fragment ${e} not found in named queries.`);this.query=this.query.replace(`[[${e}]]`,i)}}applyPagination(t){const e="##pagination##";if(!t&&this.paginator){const t=this.paginator.s==B.Desc?B.Desc:B.Asc,e=n.safeString(t);if(this.paginator.min||this.paginator.max){let n="WHERE ##sqlConstruct:queryBuilderPaginatorWhere##";this.withSqlConstruct("queryBuilderPaginatorWhere",this.paginator.cn),this.paginator.min&&(n+=">= :queryBuilderPaginatorWhereMin",this.withParam("queryBuilderPaginatorWhereMin",this.paginator.min)),this.paginator.max&&(this.paginator.min&&(n+=" AND ##sqlConstruct:queryBuilderPaginatorWhere##"),n+="< :queryBuilderPaginatorWhereMax",this.withParam("queryBuilderPaginatorWhereMax",this.paginator.max)),this.query+=n}this.query+=` ORDER BY ##sqlConstruct:queryBuilderOrderBy## ${e}`,this.withSqlConstruct("queryBuilderOrderBy",this.paginator.cn),this.paginator.l&&(this.query+=" LIMIT :queryBuilderLimit",this.withParam("queryBuilderLimit",this.paginator.l))}if(t&&this.query){const n=this.query.indexOf(e);-1!=n&&(this.query="SELECT COUNT(*) "+this.query.substring(n+14))}for(;this.query?.includes(e);)this.query=this.query.replace(e,"")}applyConditionalBlocks(){const n=">>";for(;;){const t=this.query?.indexOf("<<");if(-1==t||!this.query||"number"!=typeof t)return;const e=this.query.indexOf(n,t);if(-1==e)throw new Error(`Invalid query when finding end symbol matching ${n} in ${this.query} check that you have closed all your tags correctly.`);const i=this.query.substring(t+2,e),r=i.replace(":",""),s=`<</${i}>>`,o=this.query.indexOf(s);if(-1==o)throw new Error(`Invalid query when finding conditional end tag matching ${s} in ${this.query} check that your query contains an exact match of this tag.`);let A=this.query.substring(e+2,o);if(i.startsWith(":")){const n=this.namedParams[r];(null==n||Array.isArray(n)&&0==n.length)&&(A="")}else{const n=this.conditionals[r.replace("!","")];null!=n&&n!=r.startsWith("!")||(A="")}this.debugAnnotateMode&&(A="/* conditional "+r+"*/"),this.query=this.query.substring(0,t)+A+this.query.substring(o+s.length)}}}class I{queryProvider;connectionProvider;queryDefaults;static LONG_QUERY_TIME_MS=8500;serviceName="TBD";constructor(n,t,e){this.queryProvider=n,this.connectionProvider=t,this.queryDefaults=e,this.serviceName="NamedParameterMariaDb"}getQueryDefaults(){return this.queryDefaults}getQueryProvider(){return this.queryProvider}async createNonPooledMysqlStyleConnectionProvider(n,e){if(t.info("createTransactional : %s : %j",n,e),!this.connectionProvider.createNonPooledDatabaseConnection)throw new Error("Connection provider does not implement createNonPooledDatabaseConnection");const i=await this.connectionProvider.createNonPooledDatabaseConnection(n,e);if(!i)throw new Error(`Connection could not be created for DB type ${n}`);return new u(i)}fetchQueryRawTextByName(n){return this.queryProvider.fetchQuery(n)}queryBuilder(n){const t=new w(this.queryProvider);return n&&t.withNamedQuery(n),t}async executeUpdateOrInsertByName(n,t,e=this.queryDefaults.timeoutMS){const i=this.queryBuilder(n).withParams(t??{});return this.buildAndExecuteUpdateOrInsert(i,e)}async buildAndExecuteUpdateOrInsert(n,t=this.queryDefaults.timeoutMS){const e=n.build();return(await this.executeQueryWithMeta(e.transactionIsolationLevel,e.query,e.namedParams,t)).results}async buildAndExecuteUpdateOrInsertWithRetry(n,e,i=this.queryDefaults.timeoutMS){let s,o=0;for(;!s&&o<e;){o++;try{s=await this.buildAndExecuteUpdateOrInsert(n,i)}catch(n){t.info("Caught problem while trying to update/insert : %d : %s ",o,n),await r.wait(2e3*o)}}if(!s)throw new Error(`Failed to execute update after ${e} retries`);return s}async executeQueryByName(n,t,e=this.queryDefaults.timeoutMS){const i=this.queryBuilder(n).withParams(t);return await this.buildAndExecute(i,e)}async executeQueryByNameSingle(n,t,e=this.queryDefaults.timeoutMS){const i=this.queryBuilder(n).withParams(t),r=await this.buildAndExecute(i,e);return 1===r.length?r[0]:null}async buildAndExecute(n,t=this.queryDefaults.timeoutMS){const e=n.build();return(await this.executeQueryWithMeta(e.transactionIsolationLevel,e.query,e.namedParams,t,n.getDebugComment())).results}async buildAndExecuteSingle(n,t=this.queryDefaults.timeoutMS){const e=n.build(),i=await this.executeQueryWithMeta(e.transactionIsolationLevel,e.query,e.namedParams,t,n.getDebugComment());return 1===i.results.length?i.results[0]:null}async buildAndExecuteFetchTotalRows(n,e="",i=this.queryDefaults.timeoutMS){const r=n.buildUnfiltered();let s=r.query.replace("COUNT(*)",`${e} as groupByField, COUNT(*) as count`);s=`${s} GROUP BY ${e}`,t.info("Unfiltered query %s",r.query);return(await this.executeQueryWithMeta(r.transactionIsolationLevel,s,r.namedParams,i)).results}async executeQueryWithMeta(n,e,i={},a=this.queryDefaults.timeoutMS,c){const l=new s;a||(a=this.queryDefaults.timeoutMS),await this.changeNextQueryTransactionIsolationLevel(n);const E=await r.timeout(this.innerExecutePreparedAsPromiseWithRetryCloseConnection(e,i,void 0),"Query:"+e,a);if(o.isTimeoutToken(E)){t.warn("Timed out (after %s): %j",A.colonFormatMsDuration(a),E);const n=A.colonFormatMsDuration(a);throw new Error(`Timed out (after ${n}) waiting for query : ${e}`)}const g=E;return g.results||t.error("DB:executeQueryWithMeta:Failure: %j",g),c&&l.elapsedMS()>I.LONG_QUERY_TIME_MS&&t.info("NamedParameterMariaDbService long query: %s, %s",c,l.dump()),g}async shutdown(){let n;t.info("Shutting down %s service",this.serviceName);try{n=await this.connectionProvider.clearConnectionCache()}catch(e){t.error("Failure trying to shutdown : %s",e,e),n=!1}return n}async testConnection(n=!1){n||t.info("Running connection test");const e=(await this.executeQueryWithMeta(g.Default,"SELECT UNIX_TIMESTAMP(now())*1000 AS test")).results,i=1===e.length?e[0].test:null;return n||t.info("Test returned : %j",i),i}async testDbFailure(){await this.executeQueryWithMeta(g.Default,"this is a bad query")}async changeNextQueryTransactionIsolationLevel(n){return n&&n!==g.Default?(t.debug("Setting tx to %s",n),await this.innerExecutePreparedAsPromiseWithRetryCloseConnection("SET TRANSACTION ISOLATION LEVEL "+n,{})):null}async forceCloseConnectionForTesting(){t.warn("Forcing connection closed for testing");const n=await this.getDB();try{return await n.end(),t.info("Connection has been ended, but not set to null"),!0}catch(n){return t.error("Error closing connection : %s",n,n),!1}}async innerExecutePreparedAsPromiseWithRetryCloseConnection(n,e={},s=1){try{return await this.innerExecutePreparedAsPromise(n,e)}catch(o){const A=i.asErr(o);if(A.message.includes("closed state")||A.message.includes("This socket has been ended by the other party")||A.message.includes("ETIMEDOUT")||A.message.includes("RatchetNoConnection")||A.message.includes("ER_LOCK_WAIT_TIMEOUT")){const i=Math.min(1e3*s);if(t.warn("Found closed connection or lock timeout - clearing and attempting retry after %d (try %d of 3) (%s)",i,s,A.message),s<4){const o=await this.connectionProvider.clearConnectionCache();return t.info("Clear connection cache returned %s",o),await r.wait(i),this.innerExecutePreparedAsPromiseWithRetryCloseConnection(n,e,s+1)}throw t.warn("Ran out of retries"),new Error("Connection closed and cannot retry any more - dying horribly")}t.error("Named Param DB Query Failed : Err: %s Query: %s Params: %j",A,n,e,A);try{const i=await this.getDB();t.error("-----\nFor paste into tooling only: \n\n%s\n\n",E.renderQueryStringForPasteIntoTool(n,e,(n=>i.escape(n))))}catch(n){t.error("Really bad - failed trying to get the conn for logging : %s",n)}throw A}}async innerExecutePreparedAsPromise(n,e={}){const i=await this.getDB();i.config.namedPlaceholders=!0;const r=new s;try{const[s,o]=await i.query(n,e),A={results:s,fields:o};return t.debug("Success : Finished query : %s\n%s\n\nParams : %j",r.dump(),E.reformatQueryForLogging(n),e),t.debug("-----\nFor paste into tooling only : \n\n%s\n\n",E.renderQueryStringForPasteIntoTool(n,e,(n=>i.escape(n)))),A}finally{i.config.namedPlaceholders=!1}}async getDB(){const n=await this.connectionProvider.getConnection(this.queryDefaults.databaseName);if(!n)throw new Error("RatchetNoConnection : getConnection returned null - likely failed to get connection from db");return n}async resetConnection(){let n=!1;t.info("Resetting connection");try{await this.connectionProvider.clearConnectionCache();n=!!await this.testConnection(),t.info("Reset connection returning %s",n)}catch(n){t.error("Failed to reset connection : %s",n)}return n}}class h{configPromiseProvider;additionalConfig;ssh;static DEFAULT_CONNECTION_OPTIONS={multipleStatements:!0};connectionCache=new Map;cacheConfigPromise;constructor(n,e=h.DEFAULT_CONNECTION_OPTIONS,i){this.configPromiseProvider=n,this.additionalConfig=e,this.ssh=i,this.cacheConfigPromise=this.createConnectionConfig(),t.info("Added shutdown handler to the process (Only once per instantiation)"),this.addShutdownHandlerToProcess()}get usingSshTunnel(){return!!this.ssh}addShutdownHandlerToProcess(){process.on("exit",(()=>{t.info("Process is shutting down, closing connections"),this.clearConnectionCache().catch((n=>{t.error("Shutdown connection failed : %s",n)}))}))}async clearConnectionCache(){t.info("Clearing connection cache for RdsMysqlConnectionProvider");const n=Array.from(this.connectionCache.values());if(this.cacheConfigPromise=null,this.connectionCache=new Map,n.length>0)for(let e=0;e<n.length;e++){t.info("Shutting down old connection %d of %d",e,n.length);try{const r=await n[e];if(t.info("Conn %d is %s",e,r?.config?.label),r.db){t.info("Stopping connection to database");try{r.db.destroy(),t.info("Database connection closed")}catch(n){i.asErr(n).message.includes("closed state")||t.error("Something went wrong closing the database connection : %s",n)}}if(r.ssh)try{t.info("Stopping ssh tunnel"),await this.ssh.shutdown(r.ssh),t.info("Ssh tunnel stopped")}catch(n){t.warn("Failed to stop ssh tunnel : %s",n,n)}}catch(n){t.warn("Shutdown failed : %s ",n,n)}}return t.info("Old db and tunnels removed"),!1}async getConnectionAndTunnel(n){if(t.silly("getConnectionAndTunnel : %s",n),!this.connectionCache.has(n)){t.info("No connectionCache found for %s - creating new one",n);const e=await this.getDbConfig(n),i=this.createConnectionAndTunnel(e,this.additionalConfig,!0);this.connectionCache.set(n,i),t.info("Added connectionCache for %s",n)}return this.connectionCache.get(n)}async getConnection(n){t.silly("getConnection : %s",n);const e=await this.getConnectionAndTunnel(n);return e?.db}async createNonPooledConnectionAndTunnel(n,e=h.DEFAULT_CONNECTION_OPTIONS){t.info("Creating non-pooled connection for %s",n.databaseName);const i=await this.getDbConfig(n.databaseName);return await this.createConnectionAndTunnel(i,e,!1)}async createNonPooledDatabaseConnection(n,t=h.DEFAULT_CONNECTION_OPTIONS){const e=await this.createNonPooledConnectionAndTunnel(n,t);return e?.db}async getDbConfig(e){t.info("RdsMysqlStyleConnectionProvider:getDbConfig:Initiating promise for %s",e);const r=await this.configPromise(),s=n.trimToEmpty(e).toLowerCase(),o=r.dbList.find((t=>n.trimToEmpty(t.label).toLowerCase()===s));if(!o)throw i.fErr("Cannot find any connection config named %s (Available are %j)",e,r.dbList.map((n=>n.label)));return o}async createConnectionAndTunnel(n,i=h.DEFAULT_CONNECTION_OPTIONS,r){t.info("In RdsMysqlStyleConnectionProvider:createConnectionAndTunnel : %s",n.label),e.notNullOrUndefined(n,"dbCfg");let s,o=null;if(n.sshTunnelConfig){const e=n.sshTunnelConfig.forceLocalPort||await c();t.debug("SSH tunnel config found, opening tunnel to %s / %s to using local port %s",n.sshTunnelConfig.host,n.sshTunnelConfig.port,e),o=await this.ssh.createSSHTunnel(n.sshTunnelConfig,n.host,n.port,e),t.debug("SSH Tunnel open")}else t.debug("No ssh configuration - skipping tunnel");t.debug("Opening connection for RdsMysqlStyleConnectionProvider");try{const t=structuredClone(n);delete t.label,delete t.sshTunnelConfig,o&&(t.host="localhost",t.port=o.localPort),s=await a.createConnection({...i,...t})}catch(n){return t.info("Failed trying to create connection : %s : clearing for retry",n),void(r&&(this.connectionCache=new Map))}s.on("error",(n=>{t.info("An error was detected on the connection : %s : Clearing",n),this.clearConnectionCache().then((n=>{t.info("Connection cleared: %s",n)})).catch((n=>t.error("Failed to clear RDS connection cache: %j",n)))})),t.info("Added error handler to db, there are now %d error handlers and %d shutdown handlers",s.rawListeners("error").length,process.rawListeners("exit").length);return{config:n,db:s,ssh:o}}configPromise(){return this.cacheConfigPromise||(this.cacheConfigPromise=this.createConnectionConfig()),this.cacheConfigPromise}async createConnectionConfig(){e.notNullOrUndefined(this.configPromiseProvider,"input");const n=this.configPromiseProvider();t.info("Creating connection config");const r=await n;return e.true(r.dbList.length>0,"input.dbList"),r.dbList.forEach((n=>{const t=h.validDbConfig(n);if(t?.length)throw i.fErr("Errors found in db config : %j",t)})),r}static validDbConfig(t){let e=[];return t?(e.push(n.trimToNull(t.host)?null:"host is required and non-empty"),e.push(n.trimToNull(t.label)?null:"label is required and non-empty"),e.push(n.trimToNull(t.database)?null:"database is required and non-empty"),e.push(n.trimToNull(t.user)?null:"user is required and non-empty"),e.push(n.trimToNull(t.password)?null:"password is required and non-empty"),e.push(t.port?null:"port is required and non-empty")):e.push("The config is null"),t.sshTunnelConfig&&(e.push(n.trimToNull(t.sshTunnelConfig.host)?null:"If sshTunnelConfig is non-null, host is required and non-empty"),e.push(t.sshTunnelConfig.port?null:"If sshTunnelConfig is non-null, port is required and non-empty")),e=e.filter((n=>!!n)),e}}class d{async shutdown(n){if(!n.connection)return t.info("Not shutting down tunnel - non-tunnel passed"),!1;try{return t.info("Shutting down SSH Tunnel"),n.connection.end(),n.server.close(),!0}catch(n){return t.error("Error closing ssh tunnel : %s",n),!1}}async createSSHTunnel(n,e,i,r){const s={autoClose:!0},o={port:r},A={srcAddr:"localhost",srcPort:r,dstAddr:e,dstPort:i},[a,c]=await l.createTunnel(s,o,n,A);a.on("error",(n=>{t.warn("SSH Server Error : %s",n)}));return{localPort:r,tunnelOptions:s,serverOptions:o,sshOptions:n,forwardOptions:A,server:a,connection:c}}}class C extends I{myQueryProvider;myConnectionProvider;myQueryDefaults;currentTxFlag;static async create(n,e,i){t.info("createTransactionalNamedParameterMariaDbService : %j : %j",e,i);const r=await n.createNonPooledMysqlStyleConnectionProvider(e,i);return new C(n.getQueryProvider(),r,e)}constructor(n,t,e){super(n,t,e),this.myQueryProvider=n,this.myConnectionProvider=t,this.myQueryDefaults=e}async cleanShutdown(){t.info("cleanShutdown");try{const n=await this.myConnectionProvider.getConnection();n&&(t.info("Shutting down connection"),n.destroy())}catch(n){t.info("Failure shutting down single-use connection : %s",n)}}async startTransaction(){if(this.currentTxFlag)i.throwFormattedErr("Tried to start a new transaction while one is already in progress : %s",this.currentTxFlag);else{this.currentTxFlag=n.createRandomHexString(10),t.info("Starting a transaction : %s",this.currentTxFlag);const e=await this.myConnectionProvider.getConnection();await(e?.beginTransaction())}}async commitTransaction(){if(this.currentTxFlag){t.info("commit a transaction : %s",this.currentTxFlag);const n=await this.myConnectionProvider.getConnection();await(n?.commit()),this.currentTxFlag=void 0}else i.throwFormattedErr("Cannot commit transaction - none in process")}async rollBackTransaction(){if(this.currentTxFlag){t.info("rollBack a transaction : %s",this.currentTxFlag);const n=await this.myConnectionProvider.getConnection();await(n?.rollback()),this.currentTxFlag=void 0}else i.throwFormattedErr("Cannot rollBack transaction - none in process")}async buildAndExecuteUpdateOrInsertInTransaction(n,e=this.myQueryDefaults.timeoutMS){t.info("buildAndExecuteUpdateOrInsertInTransaction"),await this.startTransaction();try{const t=await this.buildAndExecuteUpdateOrInsert(n,e);return await this.commitTransaction(),t}catch(n){return t.error("Failed - rolling back transaction : %s",n,n),await this.rollBackTransaction(),null}}async buildAndExecuteInTransaction(n,e=this.myQueryDefaults.timeoutMS){t.info("buildAndExecuteInTransaction"),await this.startTransaction();try{const t=await this.buildAndExecute(n,e);return await this.commitTransaction(),t}catch(n){return t.error("Failed - rolling back transaction : %s",n,n),await this.rollBackTransaction(),null}}static async oneStepBuildAndExecuteUpdateOrInsertInTransaction(n,e,i=n.getQueryDefaults().timeoutMS,r){let s,o=null;try{s=await C.create(n,n.getQueryDefaults(),r),o=await s.buildAndExecuteUpdateOrInsertInTransaction(e,i)}catch(n){t.error("Failure in oneStepBuildAndExecuteUpdateOrInsertInTransaction : %j : %s",e,n,n)}finally{s&&await s.cleanShutdown()}return o}static async oneStepBuildAndExecuteInTransaction(n,e,i=n.getQueryDefaults().timeoutMS,r){let s,o=null;try{s=await C.create(n,n.getQueryDefaults(),r),o=await s.buildAndExecuteInTransaction(e,i)}catch(n){t.error("Failure in oneStepbuildAndExecuteInTransaction : %j : %s",e,n,n)}finally{s&&await s.cleanShutdown()}return o}}class Q{constructor(){}static buildInformation(){return{version:"362",hash:"86bc416c923b3a39c5c93139bd47990f4a899e0b",branch:"alpha-2024-05-27-2",tag:"alpha-2024-05-27-2",timeBuiltISO:"2024-05-27T21:11:06-0700",notes:"No notes"}}}class D{static US_EAST_1_BUNDLE_PEM="-----BEGIN CERTIFICATE-----\nMIIEBjCCAu6gAwIBAgIJAMc0ZzaSUK51MA0GCSqGSIb3DQEBCwUAMIGPMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkw\nODIyMTcwODUwWhcNMjQwODIyMTcwODUwWjCBjzELMAkGA1UEBhMCVVMxEDAOBgNV\nBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoMGUFtYXpv\nbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxIDAeBgNV\nBAMMF0FtYXpvbiBSRFMgUm9vdCAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEArXnF/E6/Qh+ku3hQTSKPMhQQlCpoWvnIthzX6MK3p5a0eXKZ\noWIjYcNNG6UwJjp4fUXl6glp53Jobn+tWNX88dNH2n8DVbppSwScVE2LpuL+94vY\n0EYE/XxN7svKea8YvlrqkUBKyxLxTjh+U/KrGOaHxz9v0l6ZNlDbuaZw3qIWdD/I\n6aNbGeRUVtpM6P+bWIoxVl/caQylQS6CEYUk+CpVyJSkopwJlzXT07tMoDL5WgX9\nO08KVgDNz9qP/IGtAcRduRcNioH3E9v981QO1zt/Gpb2f8NqAjUUCUZzOnij6mx9\nMcZ+9cWX88CRzR0vQODWuZscgI08NvM69Fn2SQIDAQABo2MwYTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUc19g2LzLA5j0Kxc0LjZa\npmD/vB8wHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJKoZIhvcN\nAQELBQADggEBAHAG7WTmyjzPRIM85rVj+fWHsLIvqpw6DObIjMWokpliCeMINZFV\nynfgBKsf1ExwbvJNzYFXW6dihnguDG9VMPpi2up/ctQTN8tm9nDKOy08uNZoofMc\nNUZxKCEkVKZv+IL4oHoeayt8egtv3ujJM6V14AstMQ6SwvwvA93EP/Ug2e4WAXHu\ncbI1NAbUgVDqp+DRdfvZkgYKryjTWd/0+1fS8X1bBZVWzl7eirNVnHbSH2ZDpNuY\n0SBd8dj5F6ld3t58ydZbrTHze7JJOd8ijySAp4/kiu9UfZWuTPABzDa/DSdz9Dk/\nzPW4CXXvhLmE02TA9/HeCw3KEHIwicNuEfw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBzCCAu+gAwIBAgICJVUwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTkxODE2\nNTNaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\nem9uIFJEUyB1cy1lYXN0LTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAM3i/k2u6cqbMdcISGRvh+m+L0yaSIoOXjtpNEoIftAipTUYoMhL\nInXGlQBVA4shkekxp1N7HXe1Y/iMaPEyb3n+16pf3vdjKl7kaSkIhjdUz3oVUEYt\ni8Z/XeJJ9H2aEGuiZh3kHixQcZczn8cg3dA9aeeyLSEnTkl/npzLf//669Ammyhs\nXcAo58yvT0D4E0D/EEHf2N7HRX7j/TlyWvw/39SW0usiCrHPKDLxByLojxLdHzso\nQIp/S04m+eWn6rmD+uUiRteN1hI5ncQiA3wo4G37mHnUEKo6TtTUh+sd/ku6a8HK\nglMBcgqudDI90s1OpuIAWmuWpY//8xEG2YECAwEAAaNmMGQwDgYDVR0PAQH/BAQD\nAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFPqhoWZcrVY9mU7tuemR\nRBnQIj1jMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\nDQEBCwUAA4IBAQB6zOLZ+YINEs72heHIWlPZ8c6WY8MDU+Be5w1M+BK2kpcVhCUK\nPJO4nMXpgamEX8DIiaO7emsunwJzMSvavSPRnxXXTKIc0i/g1EbiDjnYX9d85DkC\nE1LaAUCmCZBVi9fIe0H2r9whIh4uLWZA41oMnJx/MOmo3XyMfQoWcqaSFlMqfZM4\n0rNoB/tdHLNuV4eIdaw2mlHxdWDtF4oH+HFm+2cVBUVC1jXKrFv/euRVtsTT+A6i\nh2XBHKxQ1Y4HgAn0jACP2QSPEmuoQEIa57bEKEcZsBR8SDY6ZdTd2HLRIApcCOSF\nMRM8CKLeF658I0XgF8D5EsYoKPsA+74Z+jDH\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/zCCAuegAwIBAgIRAPVSMfFitmM5PhmbaOFoGfUwDQYJKoZIhvcNAQELBQAw\ngZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\nQW1hem9uIFJEUyB1cy1lYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyNTIyMzQ1N1oYDzIwNjEwNTI1MjMzNDU3WjCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIHVzLWVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDu9H7TBeGoDzMr\ndxN6H8COntJX4IR6dbyhnj5qMD4xl/IWvp50lt0VpmMd+z2PNZzx8RazeGC5IniV\n5nrLg0AKWRQ2A/lGGXbUrGXCSe09brMQCxWBSIYe1WZZ1iU1IJ/6Bp4D2YEHpXrW\nbPkOq5x3YPcsoitgm1Xh8ygz6vb7PsvJvPbvRMnkDg5IqEThapPjmKb8ZJWyEFEE\nQRrkCIRueB1EqQtJw0fvP4PKDlCJAKBEs/y049FoOqYpT3pRy0WKqPhWve+hScMd\n6obq8kxTFy1IHACjHc51nrGII5Bt76/MpTWhnJIJrCnq1/Uc3Qs8IVeb+sLaFC8K\nDI69Sw6bAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE7PCopt\nlyOgtXX0Y1lObBUxuKaCMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\nAQEAFj+bX8gLmMNefr5jRJfHjrL3iuZCjf7YEZgn89pS4z8408mjj9z6Q5D1H7yS\njNETVV8QaJip1qyhh5gRzRaArgGAYvi2/r0zPsy+Tgf7v1KGL5Lh8NT8iCEGGXwF\ng3Ir+Nl3e+9XUp0eyyzBIjHtjLBm6yy8rGk9p6OtFDQnKF5OxwbAgip42CD75r/q\np421maEDDvvRFR4D+99JZxgAYDBGqRRceUoe16qDzbMvlz0A9paCZFclxeftAxv6\nQlR5rItMz/XdzpBJUpYhdzM0gCzAzdQuVO5tjJxmXhkSMcDP+8Q+Uv6FA9k2VpUV\nE/O5jgpqUJJ2Hc/5rs9VkAPXeA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n0Ws=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAPAlEk8VJPmEzVRRaWvTh2AwCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyB1cy1lYXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTI1MjI0MTU1WhgPMjEyMTA1MjUyMzQxNTVaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgdXMtZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEx5xjrup8II4HOJw15NTnS3H5yMrQGlbj\nEDA5MMGnE9DmHp5dACIxmPXPMe/99nO7wNdl7G71OYPCgEvWm0FhdvVUeTb3LVnV\nBnaXt32Ek7/oxGk1T+Df03C+W0vmuJ+wo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBTGXmqBWN/1tkSea4pNw0oHrjk2UDAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIxAIqqZWCSrIkZ7zsv/FygtAusW6yvlL935YAWYPVXU30m\njkMFLM+/RJ9GMvnO8jHfCgIwB+whlkcItzE9CRQ6CsMo/d5cEHDUu/QW6jSIh9BR\nOGh9pTYPVkUbBiKPA7lVVhre\n-----END CERTIFICATE-----\n";static US_EAST_2_BUNDLE_PEM="-----BEGIN CERTIFICATE-----\nMIIEBjCCAu6gAwIBAgIJAMc0ZzaSUK51MA0GCSqGSIb3DQEBCwUAMIGPMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkw\nODIyMTcwODUwWhcNMjQwODIyMTcwODUwWjCBjzELMAkGA1UEBhMCVVMxEDAOBgNV\nBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoMGUFtYXpv\nbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxIDAeBgNV\nBAMMF0FtYXpvbiBSRFMgUm9vdCAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEArXnF/E6/Qh+ku3hQTSKPMhQQlCpoWvnIthzX6MK3p5a0eXKZ\noWIjYcNNG6UwJjp4fUXl6glp53Jobn+tWNX88dNH2n8DVbppSwScVE2LpuL+94vY\n0EYE/XxN7svKea8YvlrqkUBKyxLxTjh+U/KrGOaHxz9v0l6ZNlDbuaZw3qIWdD/I\n6aNbGeRUVtpM6P+bWIoxVl/caQylQS6CEYUk+CpVyJSkopwJlzXT07tMoDL5WgX9\nO08KVgDNz9qP/IGtAcRduRcNioH3E9v981QO1zt/Gpb2f8NqAjUUCUZzOnij6mx9\nMcZ+9cWX88CRzR0vQODWuZscgI08NvM69Fn2SQIDAQABo2MwYTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUc19g2LzLA5j0Kxc0LjZa\npmD/vB8wHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJKoZIhvcN\nAQELBQADggEBAHAG7WTmyjzPRIM85rVj+fWHsLIvqpw6DObIjMWokpliCeMINZFV\nynfgBKsf1ExwbvJNzYFXW6dihnguDG9VMPpi2up/ctQTN8tm9nDKOy08uNZoofMc\nNUZxKCEkVKZv+IL4oHoeayt8egtv3ujJM6V14AstMQ6SwvwvA93EP/Ug2e4WAXHu\ncbI1NAbUgVDqp+DRdfvZkgYKryjTWd/0+1fS8X1bBZVWzl7eirNVnHbSH2ZDpNuY\n0SBd8dj5F6ld3t58ydZbrTHze7JJOd8ijySAp4/kiu9UfZWuTPABzDa/DSdz9Dk/\nzPW4CXXvhLmE02TA9/HeCw3KEHIwicNuEfw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECDCCAvCgAwIBAgIDAIVCMA0GCSqGSIb3DQEBCwUAMIGPMQswCQYDVQQGEwJV\nUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UE\nCgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJE\nUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkwOTEzMTcw\nNjQxWhcNMjQwODIyMTcwODUwWjCBlDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldh\nc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoMGUFtYXpvbiBXZWIg\nU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxJTAjBgNVBAMMHEFt\nYXpvbiBSRFMgdXMtZWFzdC0yIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQDE+T2xYjUbxOp+pv+gRA3FO24+1zCWgXTDF1DHrh1lsPg5k7ht\n2KPYzNc+Vg4E+jgPiW0BQnA6jStX5EqVh8BU60zELlxMNvpg4KumniMCZ3krtMUC\nau1NF9rM7HBh+O+DYMBLK5eSIVt6lZosOb7bCi3V6wMLA8YqWSWqabkxwN4w0vXI\n8lu5uXXFRemHnlNf+yA/4YtN4uaAyd0ami9+klwdkZfkrDOaiy59haOeBGL8EB/c\ndbJJlguHH5CpCscs3RKtOOjEonXnKXldxarFdkMzi+aIIjQ8GyUOSAXHtQHb3gZ4\nnS6Ey0CMlwkB8vUObZU9fnjKJcL5QCQqOfwvAgMBAAGjZjBkMA4GA1UdDwEB/wQE\nAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBQUPuRHohPxx4VjykmH\n6usGrLL1ETAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n9w0BAQsFAAOCAQEAUdR9Vb3y33Yj6X6KGtuthZ08SwjImVQPtknzpajNE5jOJAh8\nquvQnU9nlnMO85fVDU1Dz3lLHGJ/YG1pt1Cqq2QQ200JcWCvBRgdvH6MjHoDQpqZ\nHvQ3vLgOGqCLNQKFuet9BdpsHzsctKvCVaeBqbGpeCtt3Hh/26tgx0rorPLw90A2\nV8QSkZJjlcKkLa58N5CMM8Xz8KLWg3MZeT4DmlUXVCukqK2RGuP2L+aME8dOxqNv\nOnOz1zrL5mR2iJoDpk8+VE/eBDmJX40IJk6jBjWoxAO/RXq+vBozuF5YHN1ujE92\ntO8HItgTp37XT8bJBAiAnt5mxw+NLSqtxk2QdQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/zCCAuegAwIBAgIRAJYlnmkGRj4ju/2jBQsnXJYwDQYJKoZIhvcNAQELBQAw\ngZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\nbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\nQW1hem9uIFJEUyB1cy1lYXN0LTIgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\nDAdTZWF0dGxlMCAXDTIxMDUyMTIzMDQ0NFoYDzIwNjEwNTIyMDAwNDQ0WjCBlzEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\nb24gUkRTIHVzLWVhc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC74V3eigv+pCj5\nnqDBqplY0Jp16pTeNB06IKbzb4MOTvNde6QjsZxrE1xUmprT8LxQqN9tI3aDYEYk\nb9v4F99WtQVgCv3Y34tYKX9NwWQgwS1vQwnIR8zOFBYqsAsHEkeJuSqAB12AYUSd\nZv2RVFjiFmYJho2X30IrSLQfS/IE3KV7fCyMMm154+/K1Z2IJlcissydEAwgsUHw\nedrE6CxJVkkJ3EvIgG4ugK/suxd8eEMztaQYJwSdN8TdfT59LFuSPl7zmF3fIBdJ\n//WexcQmGabaJ7Xnx+6o2HTfkP8Zzzzaq8fvjAcvA7gyFH5EP26G2ZqMG+0y4pTx\nSPVTrQEXAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIWWuNEF\nsUMOC82XlfJeqazzrkPDMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\nAQEAgClmxcJaQTGpEZmjElL8G2Zc8lGc+ylGjiNlSIw8X25/bcLRptbDA90nuP+q\nzXAMhEf0ccbdpwxG/P5a8JipmHgqQLHfpkvaXx+0CuP++3k+chAJ3Gk5XtY587jX\n+MJfrPgjFt7vmMaKmynndf+NaIJAYczjhJj6xjPWmGrjM3MlTa9XesmelMwP3jep\nbApIWAvCYVjGndbK9byyMq1nyj0TUzB8oJZQooaR3MMjHTmADuVBylWzkRMxbKPl\n4Nlsk4Ef1JvIWBCzsMt+X17nuKfEatRfp3c9tbpGlAE/DSP0W2/Lnayxr4RpE9ds\nICF35uSis/7ZlsftODUe8wtpkQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nPqj2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrDCCAjOgAwIBAgIQGcztRyV40pyMKbNeSN+vXTAKBggqhkjOPQQDAzCBljEL\nMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\nEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMS8wLQYDVQQDDCZBbWF6\nb24gUkRTIHVzLWVhc3QtMiBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTAgFw0yMTA1MjEyMzE1NTZaGA8yMTIxMDUyMjAwMTU1NlowgZYxCzAJBgNV\nBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYD\nVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1hem9uIFJE\nUyB1cy1lYXN0LTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1NlYXR0bGUw\ndjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQfDcv+GGRESD9wT+I5YIPRsD3L+/jsiIis\nTr7t9RSbFl+gYpO7ZbDXvNbV5UGOC5lMJo/SnqFRTC6vL06NF7qOHfig3XO8QnQz\n6T5uhhrhnX2RSY3/10d2kTyHq3ZZg3+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFLDyD3PRyNXpvKHPYYxjHXWOgfPnMA4GA1UdDwEB/wQEAwIBhjAKBggq\nhkjOPQQDAwNnADBkAjB20HQp6YL7CqYD82KaLGzgw305aUKw2aMrdkBR29J183jY\n6Ocj9+Wcif9xnRMS+7oCMAvrt03rbh4SU9BohpRUcQ2Pjkh7RoY0jDR4Xq4qzjNr\n5UFr3BXpFvACxXF51BksGQ==\n-----END CERTIFICATE-----\n";static US_WEST_1_BUNDLE_PEM="-----BEGIN CERTIFICATE-----\nMIIEBjCCAu6gAwIBAgIJAMc0ZzaSUK51MA0GCSqGSIb3DQEBCwUAMIGPMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkw\nODIyMTcwODUwWhcNMjQwODIyMTcwODUwWjCBjzELMAkGA1UEBhMCVVMxEDAOBgNV\nBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoMGUFtYXpv\nbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxIDAeBgNV\nBAMMF0FtYXpvbiBSRFMgUm9vdCAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEArXnF/E6/Qh+ku3hQTSKPMhQQlCpoWvnIthzX6MK3p5a0eXKZ\noWIjYcNNG6UwJjp4fUXl6glp53Jobn+tWNX88dNH2n8DVbppSwScVE2LpuL+94vY\n0EYE/XxN7svKea8YvlrqkUBKyxLxTjh+U/KrGOaHxz9v0l6ZNlDbuaZw3qIWdD/I\n6aNbGeRUVtpM6P+bWIoxVl/caQylQS6CEYUk+CpVyJSkopwJlzXT07tMoDL5WgX9\nO08KVgDNz9qP/IGtAcRduRcNioH3E9v981QO1zt/Gpb2f8NqAjUUCUZzOnij6mx9\nMcZ+9cWX88CRzR0vQODWuZscgI08NvM69Fn2SQIDAQABo2MwYTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUc19g2LzLA5j0Kxc0LjZa\npmD/vB8wHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJKoZIhvcN\nAQELBQADggEBAHAG7WTmyjzPRIM85rVj+fWHsLIvqpw6DObIjMWokpliCeMINZFV\nynfgBKsf1ExwbvJNzYFXW6dihnguDG9VMPpi2up/ctQTN8tm9nDKOy08uNZoofMc\nNUZxKCEkVKZv+IL4oHoeayt8egtv3ujJM6V14AstMQ6SwvwvA93EP/Ug2e4WAXHu\ncbI1NAbUgVDqp+DRdfvZkgYKryjTWd/0+1fS8X1bBZVWzl7eirNVnHbSH2ZDpNuY\n0SBd8dj5F6ld3t58ydZbrTHze7JJOd8ijySAp4/kiu9UfZWuTPABzDa/DSdz9Dk/\nzPW4CXXvhLmE02TA9/HeCw3KEHIwicNuEfw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECDCCAvCgAwIBAgIDAIkHMA0GCSqGSIb3DQEBCwUAMIGPMQswCQYDVQQGEwJV\nUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UE\nCgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJE\nUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkwOTA2MTc0\nMDIxWhcNMjQwODIyMTcwODUwWjCBlDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldh\nc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoMGUFtYXpvbiBXZWIg\nU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxJTAjBgNVBAMMHEFt\nYXpvbiBSRFMgdXMtd2VzdC0xIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQDD2yzbbAl77OofTghDMEf624OvU0eS9O+lsdO0QlbfUfWa1Kd6\n0WkgjkLZGfSRxEHMCnrv4UPBSK/Qwn6FTjkDLgemhqBtAnplN4VsoDL+BkRX4Wwq\n/dSQJE2b+0hm9w9UMVGFDEq1TMotGGTD2B71eh9HEKzKhGzqiNeGsiX4VV+LJzdH\nuM23eGisNqmd4iJV0zcAZ+Gbh2zK6fqTOCvXtm7Idccv8vZZnyk1FiWl3NR4WAgK\nAkvWTIoFU3Mt7dIXKKClVmvssG8WHCkd3Xcb4FHy/G756UZcq67gMMTX/9fOFM/v\nl5C0+CHl33Yig1vIDZd+fXV1KZD84dEJfEvHAgMBAAGjZjBkMA4GA1UdDwEB/wQE\nAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBR+ap20kO/6A7pPxo3+\nT3CfqZpQWjAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n9w0BAQsFAAOCAQEAHCJky2tPjPttlDM/RIqExupBkNrnSYnOK4kr9xJ3sl8UF2DA\nPAnYsjXp3rfcjN/k/FVOhxwzi3cXJF/2Tjj39Bm/OEfYTOJDNYtBwB0VVH4ffa/6\ntZl87jaIkrxJcreeeHqYMnIxeN0b/kliyA+a5L2Yb0VPjt9INq34QDc1v74FNZ17\n4z8nr1nzg4xsOWu0Dbjo966lm4nOYIGBRGOKEkHZRZ4mEiMgr3YLkv8gSmeitx57\nZ6dVemNtUic/LVo5Iqw4n3TBS0iF2C1Q1xT/s3h+0SXZlfOWttzSluDvoMv5PvCd\npFjNn+aXLAALoihL1MJSsxydtsLjOBro5eK0Vw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\nHing\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQGyUVTaVjYJvWhroVEiHPpDANBgkqhkiG9w0BAQsFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIHVzLXdlc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTE5MTkwNDA2WhgPMjA2MTA1MTkyMDA0MDZaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgdXMtd2VzdC0xIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANhyXpJ0t4nigRDZ\nEwNtFOem1rM1k8k5XmziHKDvDk831p7QsX9ZOxl/BT59Pu/P+6W6SvasIyKls1sW\nFJIjFF+6xRQcpoE5L5evMgN/JXahpKGeQJPOX9UEXVW5B8yi+/dyUitFT7YK5LZA\nMqWBN/LtHVPa8UmE88RCDLiKkqiv229tmwZtWT7nlMTTCqiAHMFcryZHx0pf9VPh\nx/iPV8p2gBJnuPwcz7z1kRKNmJ8/cWaY+9w4q7AYlAMaq/rzEqDaN2XXevdpsYAK\nTMMj2kji4x1oZO50+VPNfBl5ZgJc92qz1ocF95SAwMfOUsP8AIRZkf0CILJYlgzk\n/6u6qZECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm5jfcS9o\n+LwL517HpB6hG+PmpBswDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\nAQAcQ6lsqxi63MtpGk9XK8mCxGRLCad51+MF6gcNz6i6PAqhPOoKCoFqdj4cEQTF\nF8dCfa3pvfJhxV6RIh+t5FCk/y6bWT8Ls/fYKVo6FhHj57bcemWsw/Z0XnROdVfK\nYqbc7zvjCPmwPHEqYBhjU34NcY4UF9yPmlLOL8uO1JKXa3CAR0htIoW4Pbmo6sA4\n6P0co/clW+3zzsQ92yUCjYmRNeSbdXbPfz3K/RtFfZ8jMtriRGuO7KNxp8MqrUho\nHK8O0mlSUxGXBZMNicfo7qY8FD21GIPH9w5fp5oiAl7lqFzt3E3sCLD3IiVJmxbf\nfUwpGd1XZBBSdIxysRLM6j48\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAMkvdFnVDb0mWWFiXqnKH68wCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyB1cy13ZXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTE5MTkxMzI0WhgPMjEyMTA1MTkyMDEzMjRaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgdXMtd2VzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEy86DB+9th/0A5VcWqMSWDxIUblWTt/R0\nao6Z2l3vf2YDF2wt1A2NIOGpfQ5+WAOJO/IQmnV9LhYo+kacB8sOnXdQa6biZZkR\nIyouUfikVQAKWEJnh1Cuo5YMM4E2sUt5o0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBQ8u3OnecANmG8OoT7KLWDuFzZwBTAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIwQ817qkb7mWJFnieRAN+m9W3E0FLVKaV3zC5aYJUk2fcZ\nTaUx3oLp3jPLGvY5+wgeAjEA6wAicAki4ZiDfxvAIuYiIe1OS/7H5RA++R8BH6qG\niRzUBM/FItFpnkus7u/eTkvo\n-----END CERTIFICATE-----\n";static US_WEST_2_BUNDLE_PEM="-----BEGIN CERTIFICATE-----\nMIIEBjCCAu6gAwIBAgIJAMc0ZzaSUK51MA0GCSqGSIb3DQEBCwUAMIGPMQswCQYD\nVQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\nMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\nem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkw\nODIyMTcwODUwWhcNMjQwODIyMTcwODUwWjCBjzELMAkGA1UEBhMCVVMxEDAOBgNV\nBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoMGUFtYXpv\nbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxIDAeBgNV\nBAMMF0FtYXpvbiBSRFMgUm9vdCAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEArXnF/E6/Qh+ku3hQTSKPMhQQlCpoWvnIthzX6MK3p5a0eXKZ\noWIjYcNNG6UwJjp4fUXl6glp53Jobn+tWNX88dNH2n8DVbppSwScVE2LpuL+94vY\n0EYE/XxN7svKea8YvlrqkUBKyxLxTjh+U/KrGOaHxz9v0l6ZNlDbuaZw3qIWdD/I\n6aNbGeRUVtpM6P+bWIoxVl/caQylQS6CEYUk+CpVyJSkopwJlzXT07tMoDL5WgX9\nO08KVgDNz9qP/IGtAcRduRcNioH3E9v981QO1zt/Gpb2f8NqAjUUCUZzOnij6mx9\nMcZ+9cWX88CRzR0vQODWuZscgI08NvM69Fn2SQIDAQABo2MwYTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUc19g2LzLA5j0Kxc0LjZa\npmD/vB8wHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJKoZIhvcN\nAQELBQADggEBAHAG7WTmyjzPRIM85rVj+fWHsLIvqpw6DObIjMWokpliCeMINZFV\nynfgBKsf1ExwbvJNzYFXW6dihnguDG9VMPpi2up/ctQTN8tm9nDKOy08uNZoofMc\nNUZxKCEkVKZv+IL4oHoeayt8egtv3ujJM6V14AstMQ6SwvwvA93EP/Ug2e4WAXHu\ncbI1NAbUgVDqp+DRdfvZkgYKryjTWd/0+1fS8X1bBZVWzl7eirNVnHbSH2ZDpNuY\n0SBd8dj5F6ld3t58ydZbrTHze7JJOd8ijySAp4/kiu9UfZWuTPABzDa/DSdz9Dk/\nzPW4CXXvhLmE02TA9/HeCw3KEHIwicNuEfw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEBzCCAu+gAwIBAgICUYkwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\nMRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\nDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\nMSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTYxODIx\nMTVaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\naGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\nZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\nem9uIFJEUyB1cy13ZXN0LTIgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBANCEZBZyu6yJQFZBJmSUZfSZd3Ui2gitczMKC4FLr0QzkbxY+cLa\nuVONIOrPt4Rwi+3h/UdnUg917xao3S53XDf1TDMFEYp4U8EFPXqCn/GXBIWlU86P\nPvBN+gzw3nS+aco7WXb+woTouvFVkk8FGU7J532llW8o/9ydQyDIMtdIkKTuMfho\nOiNHSaNc+QXQ32TgvM9A/6q7ksUoNXGCP8hDOkSZ/YOLiI5TcdLh/aWj00ziL5bj\npvytiMZkilnc9dLY9QhRNr0vGqL0xjmWdoEXz9/OwjmCihHqJq+20MJPsvFm7D6a\n2NKybR9U+ddrjb8/iyLOjURUZnj5O+2+OPcCAwEAAaNmMGQwDgYDVR0PAQH/BAQD\nAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFEBxMBdv81xuzqcK5TVu\npHj+Aor8MB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\nDQEBCwUAA4IBAQBZkfiVqGoJjBI37aTlLOSjLcjI75L5wBrwO39q+B4cwcmpj58P\n3sivv+jhYfAGEbQnGRzjuFoyPzWnZ1DesRExX+wrmHsLLQbF2kVjLZhEJMHF9eB7\nGZlTPdTzHErcnuXkwA/OqyXMpj9aghcQFuhCNguEfnROY9sAoK2PTfnTz9NJHL+Q\nUpDLEJEUfc0GZMVWYhahc0x38ZnSY2SKacIPECQrTI0KpqZv/P+ijCEcMD9xmYEb\njL4en+XKS1uJpw5fIU5Sj0MxhdGstH6S84iAE5J3GM3XHklGSFwwqPYvuTXvANH6\nuboynxRgSae59jIlAK6Jrr6GWMwQRbgcaAlW\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjSgAwIBAgIRAOxu0I1QuMAhIeszB3fJIlkwCgYIKoZIzj0EAwMwgZYx\nCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\nMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\nem9uIFJEUyB1cy13ZXN0LTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\nYXR0bGUwIBcNMjEwNTI0MjIwNjU5WhgPMjEyMTA1MjQyMzA2NTlaMIGWMQswCQYD\nVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\nA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\nRFMgdXMtd2VzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEz4bylRcGqqDWdP7gQIIoTHdBK6FNtKH1\n4SkEIXRXkYDmRvL9Bci1MuGrwuvrka5TDj4b7e+csY0llEzHpKfq6nJPFljoYYP9\nuqHFkv77nOpJJ633KOr8IxmeHW5RXgrZo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\nA1UdDgQWBBQQikVz8wmjd9eDFRXzBIU8OseiGzAOBgNVHQ8BAf8EBAMCAYYwCgYI\nKoZIzj0EAwMDaAAwZQIwf06Mcrpw1O0EBLBBrp84m37NYtOkE/0Z0O+C7D41wnXi\nEQdn6PXUVgdD23Gj82SrAjEAklhKs+liO1PtN15yeZR1Io98nFve+lLptaLakZcH\n+hfFuUtCqMbaI8CdvJlKnPqT\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF/jCCA+agAwIBAgIQR71Z8lTO5Sj+as2jB7IWXzANBgkqhkiG9w0BAQwFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIHVzLXdlc3QtMiBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTI0MjIwMzIwWhgPMjEyMTA1MjQyMzAzMjBaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgdXMtd2VzdC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAM977bHIs1WJijrS\nXQMfUOhmlJjr2v0K0UjPl52sE1TJ76H8umo1yR4T7Whkd9IwBHNGKXCJtJmMr9zp\nfB38eLTu+5ydUAXdFuZpRMKBWwPVe37AdJRKqn5beS8HQjd3JXAgGKUNNuE92iqF\nqi2fIqFMpnJXWo0FIW6s2Dl2zkORd7tH0DygcRi7lgVxCsw1BJQhFJon3y+IV8/F\nbnbUXSNSDUnDW2EhvWSD8L+t4eiXYsozhDAzhBvojpxhPH9OB7vqFYw5qxFx+G0t\nlSLX5iWi1jzzc3XyGnB6WInZDVbvnvJ4BGZ+dTRpOCvsoMIn9bz4EQTvu243c7aU\nHbS/kvnCASNt+zk7C6lbmaq0AGNztwNj85Opn2enFciWZVnnJ/4OeefUWQxD0EPp\nSjEd9Cn2IHzkBZrHCg+lWZJQBKbUVS0lLIMSsLQQ6WvR38jY7D2nxM1A93xWxwpt\nZtQnYRCVXH6zt2OwDAFePInWwxUjR5t/wu3XxPgpSfrmTi3WYtr1wFypAJ811e/P\nyBtswWUQ6BNJQvy+KnOEeGfOwmtdDFYR+GOCfvCihzrKJrxOtHIieehR5Iw3cbXG\nsm4pDzfMUVvDDz6C2M6PRlJhhClbatHCjik9hxFYEsAlqtVVK9pxaz9i8hOqSFQq\nkJSQsgWw+oM/B2CyjcSqkSQEu8RLAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8w\nHQYDVR0OBBYEFPmrdxpRRgu3IcaB5BTqlprcKdTsMA4GA1UdDwEB/wQEAwIBhjAN\nBgkqhkiG9w0BAQwFAAOCAgEAVdlxWjPvVKky3kn8ZizeM4D+EsLw9dWLau2UD/ls\nzwDCFoT6euagVeCknrn+YEl7g20CRYT9iaonGoMUPuMR/cdtPL1W/Rf40PSrGf9q\nQuxavWiHLEXOQTCtCaVZMokkvjuuLNDXyZnstgECuiZECTwhexUF4oiuhyGk9o01\nQMaiz4HX4lgk0ozALUvEzaNd9gWEwD2qe+rq9cQMTVq3IArUkvTIftZUaVUMzr0O\ned1+zAsNa9nJhURJ/6anJPJjbQgb5qA1asFcp9UaMT1ku36U3gnR1T/BdgG2jX3X\nUm0UcaGNVPrH1ukInWW743pxWQb7/2sumEEMVh+jWbB18SAyLI4WIh4lkurdifzS\nIuTFp8TEx+MouISFhz/vJDWZ84tqoLVjkEcP6oDypq9lFoEzHDJv3V1CYcIgOusT\nk1jm9P7BXdTG7TYzUaTb9USb6bkqkD9EwJAOSs7DI94aE6rsSws2yAHavjAMfuMZ\nsDAZvkqS2Qg2Z2+CI6wUZn7mzkJXbZoqRjDvChDXEB1mIhzVXhiNW/CR5WKVDvlj\n9v1sdGByh2pbxcLQtVaq/5coM4ANgphoNz3pOYUPWHS+JUrIivBZ+JobjXcxr3SN\n9iDzcu5/FVVNbq7+KN/nvPMngT+gduEN5m+EBjm8GukJymFG0m6BENRA0QSDqZ7k\nzDY=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQRiwspKyrO0xoxDgSkqLZczANBgkqhkiG9w0BAQsFADCB\nlzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\nYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\nbWF6b24gUkRTIHVzLXdlc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\nB1NlYXR0bGUwIBcNMjEwNTI0MjE1OTAwWhgPMjA2MTA1MjQyMjU5MDBaMIGXMQsw\nCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\nMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\nbiBSRFMgdXMtd2VzdC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\ndHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL53Jk3GsKiu+4bx\njDfsevWbwPCNJ3H08Zp7GWhvI3Tgi39opfHYv2ku2BKFjK8N2L6RvNPSR8yplv5j\nY0tK0U+XVNl8o0ibhqRDhbTuh6KL8CFINWYzAajuxFS+CF0U6c1Q3tXLBdALxA7l\nFlXJ71QrP06W31kRe7kvgrvO7qWU3/OzUf9qYw4LSiR1/VkvvRCTqcVNw09clw/M\nJbw6FSgweN65M9j7zPbjGAXSHkXyxH1Erin2fa+B9PE4ZDgX9cp2C1DHewYJQL/g\nSepwwcudVNRN1ibKH7kpMrgPnaNIVNx5sXVsTjk6q2ZqYw3SVHegltJpLy/cZReP\nmlivF2kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUmTcQd6o1\nCuS65MjBrMwQ9JJjmBwwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\nAQAKSDSIzl956wVddPThf2VAzI8syw9ngSwsEHZvxVGHBvu5gg618rDyguVCYX9L\n4Kw/xJrk6S3qxOS2ZDyBcOpsrBskgahDFIunzoRP3a18ARQVq55LVgfwSDQiunch\nBd05cnFGLoiLkR5rrkgYaP2ftn3gRBRaf0y0S3JXZ2XB3sMZxGxavYq9mfiEcwB0\nLMTMQ1NYzahIeG6Jm3LqRqR8HkzP/Ztq4dT2AtSLvFebbNMiWqeqT7OcYp94HTYT\nzqrtaVdUg9bwyAUCDgy0GV9RHDIdNAOInU/4LEETovrtuBU7Z1q4tcHXvN6Hd1H8\ngMb0mCG5I393qW5hFsA/diFb\n-----END CERTIFICATE-----\n"}class T{static async uploadObjectArrayToTable(n,i,r,s=!1){if(e.notNullOrUndefined(n,"db"),e.notNullOrUndefined(i,"tableName"),e.notNullOrUndefined(r,"data"),t.info("Writing %d items to %s (clear: %s)",r.length,i,s),s){t.info("Clearing table %s",i);const{results:e}=await n.executeQueryWithMeta(g.Default,"DELETE FROM "+i,{});t.info("Removed %d rows",e.affectedRows)}const o=new Set(r.flatMap((n=>Object.keys(n)))),A=Array.from(o);t.info("Found columns : %j",A);const a="INSERT INTO "+i+" ("+A.join(",")+") VALUES :multiValue",{results:c}=await n.executeQueryWithMeta(g.Default,a,{multiValue:r}),l=c.affectedRows;return t.info("Wrote %d rows",l),l!==r.length&&t.warn("Should have written %d but wrote %d",r.length,l),l}}export{D as AwsRdsCert2023,I as NamedParameterMariaDbService,u as NonPooledMysqlStyleConnectionProvider,w as QueryBuilder,M as QueryBuilderResult,E as QueryUtil,Q as RatchetRdbmsInfo,h as RdsMysqlStyleConnectionProvider,T as RelationalDatabaseUtils,B as SortDirection,d as SshTunnelService,g as TransactionIsolationLevel,C as TransactionalNamedParameterMariaDbService};
2
2
  //# sourceMappingURL=index.mjs.map
package/lib/types.d.ts ADDED
@@ -0,0 +1,348 @@
1
+ import { Connection, ConnectionOptions } from 'mysql2/promise';
2
+ import { FieldPacket } from 'mysql2';
3
+ import { JwtTokenBase, BuildInformation } from '@bitblit/ratchet-common';
4
+ import { ListenOptions, Server } from 'net';
5
+ import { ConnectConfig, Connection as Connection$1 } from 'ssh2';
6
+ import * as TunnelSsh from 'tunnel-ssh';
7
+
8
+ interface MysqlResultsWrapper<T> {
9
+ results: T;
10
+ fields: FieldPacket[];
11
+ }
12
+
13
+ interface MysqlUpdateResults {
14
+ fieldCount: number;
15
+ affectedRows: number;
16
+ insertId: number;
17
+ info: string;
18
+ serverStatus: number;
19
+ warningStatus: number;
20
+ changedRows: number;
21
+ }
22
+
23
+ declare enum TransactionIsolationLevel {
24
+ Default = "Default",
25
+ ReadUncommitted = "READ UNCOMMITTED"
26
+ }
27
+
28
+ interface QueryDefaults {
29
+ databaseName: string;
30
+ timeoutMS: number;
31
+ }
32
+
33
+ interface MysqlStyleConnectionProvider {
34
+ getConnection(name?: string): Promise<Connection | undefined>;
35
+ clearConnectionCache(): Promise<boolean>;
36
+ createNonPooledDatabaseConnection?(queryDefaults: QueryDefaults, additionalConfig?: ConnectionOptions): Promise<Connection | undefined>;
37
+ }
38
+
39
+ declare class NonPooledMysqlStyleConnectionProvider implements MysqlStyleConnectionProvider {
40
+ private connection;
41
+ constructor(connection: Connection);
42
+ getConnection(): Promise<Connection>;
43
+ clearConnectionCache(): Promise<boolean>;
44
+ }
45
+
46
+ declare enum SortDirection {
47
+ Asc = "Asc",
48
+ Desc = "Desc"
49
+ }
50
+
51
+ interface Paginator<T> extends JwtTokenBase {
52
+ cn: string;
53
+ min?: T;
54
+ max?: T;
55
+ s?: SortDirection;
56
+ l?: number;
57
+ }
58
+
59
+ declare class QueryBuilderResult {
60
+ query: string;
61
+ namedParams: Record<string, unknown>;
62
+ paginator?: Paginator<any>;
63
+ transactionIsolationLevel: TransactionIsolationLevel;
64
+ constructor(query: string, namedParams: Record<string, unknown>, paginator: Paginator<any> | undefined, transactionIsolationLevel: TransactionIsolationLevel);
65
+ }
66
+
67
+ interface QueryTextProvider {
68
+ fetchQuery(queryDottedPath: string): string;
69
+ fetchAllQueries(): Record<string, string>;
70
+ }
71
+
72
+ declare class QueryBuilder {
73
+ static readonly ALLOWED_SQL_CONSTRUCT: RegExp;
74
+ private readonly queryProvider;
75
+ private query?;
76
+ meta: {
77
+ queryPath?: string;
78
+ };
79
+ private sqlConstructs;
80
+ private namedParams;
81
+ private conditionals;
82
+ private debugComment;
83
+ private paginator?;
84
+ private debugAnnotateMode;
85
+ private transactionIsolationLevel;
86
+ constructor(queryProvider: QueryTextProvider);
87
+ clone(): QueryBuilder;
88
+ withTransactionIsolationLevel(level: TransactionIsolationLevel): QueryBuilder;
89
+ withDebugComment(comment: string): QueryBuilder;
90
+ appendDebugComment(comment: string): QueryBuilder;
91
+ withNamedQuery(queryPath: string): QueryBuilder;
92
+ withBaseQuery(baseQuery: string): void;
93
+ withSqlConstruct(key: string, value: unknown): QueryBuilder;
94
+ withSqlConstructs(params: Record<string, unknown>): QueryBuilder;
95
+ removeParam(key: string): QueryBuilder;
96
+ paramNames(): string[];
97
+ withParam(key: string, value: unknown): QueryBuilder;
98
+ withParams(params: unknown): QueryBuilder;
99
+ withExpandedParam(keyPrefix: string, values: unknown[], extendIfExists: boolean): QueryBuilder;
100
+ withConditional(tag: string, state?: boolean): QueryBuilder;
101
+ withConditionals(params: Record<string, boolean>): QueryBuilder;
102
+ withPaginator(paginator: Paginator<any>): QueryBuilder;
103
+ fetchCopyOfParam<T>(paramName: string): T | undefined;
104
+ fetchCopyOfConditional<T>(conditionalName: string): T | undefined;
105
+ containsParam(paramName: string): boolean;
106
+ getDebugComment(): string;
107
+ containsConditional(conditionalName: string): boolean;
108
+ build(): QueryBuilderResult;
109
+ buildUnfiltered(): QueryBuilderResult;
110
+ protected internalBuild(unfiltered: boolean): QueryBuilderResult;
111
+ private stripNonAsciiParams;
112
+ private runQueryChecks;
113
+ private applyComments;
114
+ applySqlConstructs(): void;
115
+ private applyRepeatBlocks;
116
+ private applyQueryFragments;
117
+ private applyPagination;
118
+ private applyConditionalBlocks;
119
+ }
120
+
121
+ interface GroupByCountResult {
122
+ groupByField: string;
123
+ count: number;
124
+ }
125
+
126
+ declare class NamedParameterMariaDbService {
127
+ private queryProvider;
128
+ private connectionProvider;
129
+ private queryDefaults;
130
+ private static LONG_QUERY_TIME_MS;
131
+ private serviceName;
132
+ constructor(queryProvider: QueryTextProvider, connectionProvider: MysqlStyleConnectionProvider, queryDefaults: QueryDefaults);
133
+ getQueryDefaults(): QueryDefaults;
134
+ getQueryProvider(): QueryTextProvider;
135
+ createNonPooledMysqlStyleConnectionProvider(queryDefaults: QueryDefaults, additionalConfig?: ConnectionOptions): Promise<NonPooledMysqlStyleConnectionProvider>;
136
+ fetchQueryRawTextByName(queryPath: string): string;
137
+ queryBuilder(queryPath?: string): QueryBuilder;
138
+ executeUpdateOrInsertByName(queryPath: string, params?: object, timeoutMS?: number): Promise<MysqlUpdateResults>;
139
+ buildAndExecuteUpdateOrInsert(queryBuilder: QueryBuilder, timeoutMS?: number): Promise<MysqlUpdateResults>;
140
+ buildAndExecuteUpdateOrInsertWithRetry(queryBuilder: QueryBuilder, maxRetries: number, timeoutMS?: number): Promise<MysqlUpdateResults>;
141
+ executeQueryByName<Row>(queryPath: string, params: object, timeoutMS?: number): Promise<Row[]>;
142
+ executeQueryByNameSingle<Row>(queryPath: string, params: object, timeoutMS?: number): Promise<Row | null>;
143
+ buildAndExecute<Row>(queryBuilder: QueryBuilder, timeoutMS?: number): Promise<Row[]>;
144
+ buildAndExecuteSingle<Row>(queryBuilder: QueryBuilder, timeoutMS?: number): Promise<Row | null>;
145
+ buildAndExecuteFetchTotalRows(queryBuilder: QueryBuilder, groupBy?: string, timeoutMS?: number): Promise<GroupByCountResult[]>;
146
+ executeQueryWithMeta<Row>(transactionIsolationLevel: TransactionIsolationLevel, query: string, fields?: object, timeoutMS?: number, debugComment?: string): Promise<MysqlResultsWrapper<Row>>;
147
+ shutdown(): Promise<boolean>;
148
+ testConnection(quietMode?: boolean): Promise<number | null>;
149
+ testDbFailure(): Promise<void>;
150
+ changeNextQueryTransactionIsolationLevel<Row>(tx: TransactionIsolationLevel | null): Promise<MysqlResultsWrapper<Row> | null>;
151
+ forceCloseConnectionForTesting(): Promise<boolean>;
152
+ private innerExecutePreparedAsPromiseWithRetryCloseConnection;
153
+ private innerExecutePreparedAsPromise;
154
+ getDB(): Promise<Connection>;
155
+ resetConnection(): Promise<boolean>;
156
+ }
157
+
158
+ interface SshTunnelContainer {
159
+ tunnelOptions: TunnelSsh.TunnelOptions;
160
+ serverOptions: ListenOptions;
161
+ sshOptions: ConnectConfig;
162
+ forwardOptions: TunnelSsh.ForwardOptions;
163
+ server: Server;
164
+ localPort: number;
165
+ connection?: Connection$1;
166
+ }
167
+
168
+ interface SshTunnelConfig {
169
+ forceLocalPort?: number;
170
+ keepAlive: boolean;
171
+ username: string;
172
+ host: string;
173
+ port: number;
174
+ privateKey: string;
175
+ }
176
+
177
+ declare class SshTunnelService {
178
+ shutdown(ssh: SshTunnelContainer): Promise<boolean>;
179
+ createSSHTunnel(sshOptions: SshTunnelConfig, dstHost: string, dstPort: number, localPort: number): Promise<SshTunnelContainer>;
180
+ }
181
+
182
+ interface DbConfig {
183
+ label: string;
184
+ host: string;
185
+ port: number;
186
+ user: string;
187
+ password: string;
188
+ database: string;
189
+ sshTunnelConfig?: SshTunnelConfig;
190
+ }
191
+
192
+ interface ConnectionConfig {
193
+ dbList: DbConfig[];
194
+ }
195
+
196
+ interface ConnectionAndTunnel<T> {
197
+ config: DbConfig;
198
+ db: T;
199
+ ssh: SshTunnelContainer;
200
+ }
201
+
202
+ declare class RdsMysqlStyleConnectionProvider implements MysqlStyleConnectionProvider {
203
+ private configPromiseProvider;
204
+ private additionalConfig;
205
+ private ssh?;
206
+ static DEFAULT_CONNECTION_OPTIONS: ConnectionOptions;
207
+ private connectionCache;
208
+ private cacheConfigPromise;
209
+ constructor(configPromiseProvider: () => Promise<ConnectionConfig>, additionalConfig?: ConnectionOptions, ssh?: SshTunnelService);
210
+ get usingSshTunnel(): boolean;
211
+ private addShutdownHandlerToProcess;
212
+ clearConnectionCache(): Promise<boolean>;
213
+ getConnectionAndTunnel(name: string): Promise<ConnectionAndTunnel<Connection>>;
214
+ getConnection(name: string): Promise<Connection | undefined>;
215
+ createNonPooledConnectionAndTunnel(queryDefaults: QueryDefaults, additionalConfig?: ConnectionOptions): Promise<ConnectionAndTunnel<Connection>>;
216
+ createNonPooledDatabaseConnection(queryDefaults: QueryDefaults, additionalConfig?: ConnectionOptions): Promise<Connection | undefined>;
217
+ private getDbConfig;
218
+ private createConnectionAndTunnel;
219
+ private configPromise;
220
+ private createConnectionConfig;
221
+ static validDbConfig(cfg: DbConfig): string[];
222
+ }
223
+
224
+ declare class TransactionalNamedParameterMariaDbService extends NamedParameterMariaDbService {
225
+ private myQueryProvider;
226
+ private myConnectionProvider;
227
+ private myQueryDefaults;
228
+ private currentTxFlag?;
229
+ static create(src: NamedParameterMariaDbService, queryDefaults: QueryDefaults, additionalConfig?: ConnectionOptions): Promise<TransactionalNamedParameterMariaDbService>;
230
+ constructor(myQueryProvider: QueryTextProvider, myConnectionProvider: MysqlStyleConnectionProvider, myQueryDefaults: QueryDefaults);
231
+ cleanShutdown(): Promise<void>;
232
+ startTransaction(): Promise<void>;
233
+ commitTransaction(): Promise<void>;
234
+ rollBackTransaction(): Promise<void>;
235
+ buildAndExecuteUpdateOrInsertInTransaction(queryBuilder: QueryBuilder, timeoutMS?: number): Promise<MysqlUpdateResults | null>;
236
+ buildAndExecuteInTransaction<T>(queryBuilder: QueryBuilder, timeoutMS?: number): Promise<T[] | null>;
237
+ static oneStepBuildAndExecuteUpdateOrInsertInTransaction(src: NamedParameterMariaDbService, queryBuilder: QueryBuilder, timeoutMS?: number, additionalConfig?: ConnectionOptions): Promise<MysqlUpdateResults | null>;
238
+ static oneStepBuildAndExecuteInTransaction<T>(src: NamedParameterMariaDbService, queryBuilder: QueryBuilder, timeoutMS?: number, additionalConfig?: ConnectionOptions): Promise<T[] | null>;
239
+ }
240
+
241
+ declare class RatchetRdbmsInfo {
242
+ private constructor();
243
+ static buildInformation(): BuildInformation;
244
+ }
245
+
246
+ interface PaginatedResults<T> {
247
+ results: T[];
248
+ nextPageToken: string;
249
+ prevPageToken: string;
250
+ }
251
+
252
+ interface PaginationBounds<T> {
253
+ cn: string;
254
+ min: T;
255
+ max: T;
256
+ count: number;
257
+ }
258
+
259
+ interface MysqlDbConfig extends DbConfig {
260
+ ssl?: string | Record<string, any>;
261
+ decimalNumbers?: boolean;
262
+ }
263
+
264
+ interface MysqlMasterStatus {
265
+ File: string;
266
+ Position: number;
267
+ Binlog_Do_DB: string;
268
+ Binlog_Ignore_DB: string;
269
+ }
270
+
271
+ interface MysqlSlaveStatus {
272
+ Slave_IO_State: string;
273
+ Master_Host: string;
274
+ Master_User: string;
275
+ Master_Port: number;
276
+ Connect_Retry: number;
277
+ Master_Log_File: string;
278
+ Read_Master_Log_Pos: number;
279
+ Relay_Log_File: string;
280
+ Relay_Log_Pos: number;
281
+ Relay_Master_Log_File: string;
282
+ Slave_IO_Running: string;
283
+ Slave_SQL_Running: string;
284
+ Replicate_Do_DB: string;
285
+ Replicate_Ignore_DB: string;
286
+ Replicate_Do_Table: string;
287
+ Replicate_Ignore_Table: string;
288
+ Replicate_Wild_Do_Table: string;
289
+ Replicate_Wild_Ignore_Table: string;
290
+ Last_Errno: number;
291
+ Last_Error: string;
292
+ Skip_Counter: number;
293
+ Exec_Master_Log_Pos: number;
294
+ Relay_Log_Space: number;
295
+ Until_Condition: string;
296
+ Until_Log_File: string;
297
+ Until_Log_Pos: number;
298
+ Master_SSL_Allowed: string;
299
+ Master_SSL_CA_File: string;
300
+ Master_SSL_CA_Path: string;
301
+ Master_SSL_Cert: string;
302
+ Master_SSL_Cipher: string;
303
+ Master_SSL_Key: string;
304
+ Seconds_Behind_Master: number;
305
+ Master_SSL_Verify_Server_Cert: string;
306
+ Last_IO_Errno: number;
307
+ Last_IO_Error: string;
308
+ Last_SQL_Errno: number;
309
+ Last_SQL_Error: string;
310
+ Replicate_Ignore_Server_Ids: string;
311
+ Master_Server_Id: number;
312
+ Master_SSL_Crl: string;
313
+ Master_SSL_Crlpath: string;
314
+ Using_Gtid: string;
315
+ Gtid_IO_Pos: string;
316
+ Replicate_Do_Domain_Ids: string;
317
+ Replicate_Ignore_Domain_Ids: string;
318
+ Parallel_Mode: string;
319
+ SQL_Delay: number;
320
+ SQL_Remaining_Delay: string;
321
+ Slave_SQL_Running_State: string;
322
+ }
323
+
324
+ declare class QueryUtil {
325
+ private fields;
326
+ private replacements;
327
+ addReplacement(replacement: Record<string, unknown>, ...fields: string[]): void;
328
+ appendReplacement(replacementKey: string, appendValue: string, ...fields: string[]): void;
329
+ addFields(...fields: string[]): void;
330
+ getFields(): string[];
331
+ getReplacements(): Record<string, unknown>;
332
+ static sqlInjectionUnsafeParamRenderer(value: unknown): string;
333
+ static renderQueryStringForPasteIntoTool(query: string, inFields: object | null, transform?: (x: unknown) => string): string | null;
334
+ static reformatQueryForLogging(qry: string, inMaxLineLength?: number): string | null;
335
+ }
336
+
337
+ declare class AwsRdsCert2023 {
338
+ static readonly US_EAST_1_BUNDLE_PEM: string;
339
+ static readonly US_EAST_2_BUNDLE_PEM: string;
340
+ static readonly US_WEST_1_BUNDLE_PEM: string;
341
+ static readonly US_WEST_2_BUNDLE_PEM: string;
342
+ }
343
+
344
+ declare class RelationalDatabaseUtils {
345
+ static uploadObjectArrayToTable<Item extends object>(db: NamedParameterMariaDbService, tableName: string, data: Item[], clearTableFirst?: boolean): Promise<number>;
346
+ }
347
+
348
+ export { AwsRdsCert2023, type ConnectionAndTunnel, type ConnectionConfig, type DbConfig, type GroupByCountResult, type MysqlDbConfig, type MysqlMasterStatus, type MysqlResultsWrapper, type MysqlSlaveStatus, type MysqlStyleConnectionProvider, type MysqlUpdateResults, NamedParameterMariaDbService, NonPooledMysqlStyleConnectionProvider, type PaginatedResults, type PaginationBounds, type Paginator, QueryBuilder, QueryBuilderResult, type QueryDefaults, type QueryTextProvider, QueryUtil, RatchetRdbmsInfo, RdsMysqlStyleConnectionProvider, RelationalDatabaseUtils, SortDirection, type SshTunnelConfig, type SshTunnelContainer, SshTunnelService, TransactionIsolationLevel, TransactionalNamedParameterMariaDbService };
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@bitblit/ratchet-rdbms",
3
- "version": "4.0.354-alpha",
3
+ "version": "4.0.362-alpha",
4
4
  "description": "Ratchet tooling for working with relational databases",
5
5
  "sideEffects": false,
6
6
  "type": "module",
7
7
  "module": "./lib/index.mjs",
8
- "types": "./lib/index.d.ts",
8
+ "types": "./lib/types.d.ts",
9
9
  "files": [
10
10
  "lib/**",
11
11
  "bin/**"
12
12
  ],
13
13
  "exports": {
14
14
  ".": {
15
- "types": "./lib/index.d.ts",
15
+ "types": "./lib/types.d.ts",
16
16
  "import": "./lib/index.mjs"
17
17
  }
18
18
  },
@@ -48,15 +48,15 @@
48
48
  },
49
49
  "license": "Apache-2.0",
50
50
  "dependencies": {
51
- "@bitblit/ratchet-common": "4.0.354-alpha",
51
+ "@bitblit/ratchet-common": "4.0.362-alpha",
52
52
  "get-port": "7.1.0",
53
- "mysql2": "3.9.7",
53
+ "mysql2": "3.9.8",
54
54
  "tunnel-ssh": "5.1.2"
55
55
  },
56
56
  "peerDependencies": {
57
- "@bitblit/ratchet-common": "4.0.354-alpha",
57
+ "@bitblit/ratchet-common": "4.0.362-alpha",
58
58
  "get-port": "^7.1.0",
59
- "mysql2": "^3.9.7",
59
+ "mysql2": "^3.9.8",
60
60
  "tunnel-ssh": "^5.1.2"
61
61
  }
62
62
  }
@@ -1,5 +0,0 @@
1
- import { BuildInformation } from '@bitblit/ratchet-common';
2
- export declare class RatchetRdbmsInfo {
3
- private constructor();
4
- static buildInformation(): BuildInformation;
5
- }
package/lib/index.d.ts DELETED
@@ -1,30 +0,0 @@
1
- export * from './named-parameter-maria-db-service.js';
2
- export * from './non-pooled-mysql-style-connection-provider.js';
3
- export * from './rds-mysql-style-connection-provider.js';
4
- export * from './ssh-tunnel-service.js';
5
- export * from './transactional-named-parameter-maria-db-service.js';
6
- export * from './build/ratchet-rdbms-info.js';
7
- export * from './model/connection-config.js';
8
- export * from './model/db-config.js';
9
- export * from './model/group-by-count-result.js';
10
- export * from './model/paginated-results.js';
11
- export * from './model/pagination-bounds.js';
12
- export * from './model/paginator.js';
13
- export * from './model/query-defaults.js';
14
- export * from './model/query-text-provider.js';
15
- export * from './model/sort-direction.js';
16
- export * from './model/ssh-config.js';
17
- export * from './model/transaction-isolation-level.js';
18
- export * from './model/mysql/mysql-db-config.js';
19
- export * from './model/mysql/mysql-master-status.js';
20
- export * from './model/mysql/mysql-results-wrapper.js';
21
- export * from './model/mysql/mysql-slave-status.js';
22
- export * from './model/mysql/mysql-style-connection-provider.js';
23
- export * from './model/mysql/mysql-update-results.js';
24
- export * from './model/ssh/ssh-tunnel-config.js';
25
- export * from './model/ssh/ssh-tunnel-container.js';
26
- export * from './query-builder/query-builder-result.js';
27
- export * from './query-builder/query-builder.js';
28
- export * from './query-builder/query-util.js';
29
- export * from './util/aws-rds-cert-2023.js';
30
- export * from './util/relational-database-utils.js';
package/lib/index.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/query-builder/query-util.ts","../src/model/transaction-isolation-level.ts","../src/model/sort-direction.ts","../src/non-pooled-mysql-style-connection-provider.ts","../src/query-builder/query-builder-result.ts","../src/query-builder/query-builder.ts","../src/named-parameter-maria-db-service.ts","../src/rds-mysql-style-connection-provider.ts","../src/ssh-tunnel-service.ts","../src/transactional-named-parameter-maria-db-service.ts","../src/build/ratchet-rdbms-info.ts","../src/util/aws-rds-cert-2023.ts","../src/util/relational-database-utils.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["QueryUtil","fields","replacements","addReplacement","replacement","this","Object","assign","addFields","appendReplacement","replacementKey","appendValue","concat","getFields","getReplacements","sqlInjectionUnsafeParamRenderer","value","rFn","val","StringRatchet","safeString","Array","isArray","map","s","join","renderQueryStringForPasteIntoTool","query","inFields","transform","rval","reformatQueryForLogging","keys","sort","b","a","length","key","find","repl","split","endsWith","qry","inMaxLineLength","maxLineLength","trimToNull","loggableQuery","cleaned","trimToEmpty","idx","Math","min","includes","charAt","substring","Logger","silly","TransactionIsolationLevel","SortDirection","NonPooledMysqlStyleConnectionProvider","connection","constructor","RequireRatchet","notNullOrUndefined","getConnection","clearConnectionCache","info","QueryBuilderResult","namedParams","paginator","transactionIsolationLevel","QueryBuilder","static","queryProvider","meta","freeze","sqlConstructs","conditionals","debugComment","debugAnnotateMode","Default","clone","withBaseQuery","_","withTransactionIsolationLevel","level","withDebugComment","comment","appendDebugComment","withNamedQuery","queryPath","fetchQuery","ErrorRatchet","throwFormattedErr","baseQuery","withSqlConstruct","withSqlConstructs","params","removeParam","paramNames","withParam","withParams","withExpandedParam","keyPrefix","values","extendIfExists","lengthParamName","oldSize","fetchCopyOfParam","filter","startsWith","forEach","i","paramKey","toUpperCase","slice","withConditional","tag","state","withConditionals","withPaginator","cn","true","max","l","Asc","paramName","fetchCopyOfConditional","conditionalName","containsParam","undefined","getDebugComment","containsConditional","build","internalBuild","buildUnfiltered","unfiltered","applyQueryFragments","applyConditionalBlocks","applyRepeatBlocks","applyPagination","applySqlConstructs","applyComments","runQueryChecks","stripNonAsciiParams","trim","reduced","stripNonAscii","JSON","stringify","parse","quotedNamedParams","matchAll","warn","firstSpaceIndex","indexOf","v","match","ALLOWED_SQL_CONSTRUCT","Error","sqlReservedWords","word","toLowerCase","rawKey","replace","startSymbol","startIndex","endIndex","countSymbol","countParam","joinSymbol","joinString","param","endTag","endTagIndex","repeatedContent","endSymbol","count","indexedContent","startParamTagIndex","endParamTagIndex","rawName","namedQueryElement","paginationRawKey","sortDirEnum","Desc","sortDir","wc","paginationSplitIndex","rawTag","conditional","NamedParameterMariaDbService","connectionProvider","queryDefaults","serviceName","getQueryDefaults","getQueryProvider","createNonPooledMysqlStyleConnectionProvider","additionalConfig","createNonPooledDatabaseConnection","newConn","fetchQueryRawTextByName","queryBuilder","executeUpdateOrInsertByName","timeoutMS","builder","buildAndExecuteUpdateOrInsert","executeQueryWithMeta","results","buildAndExecuteUpdateOrInsertWithRetry","maxRetries","res","retry","err","PromiseRatchet","wait","executeQueryByName","buildAndExecute","executeQueryByNameSingle","resp","buildAndExecuteSingle","buildAndExecuteFetchTotalRows","groupBy","sw","StopWatch","changeNextQueryTransactionIsolationLevel","result","timeout","innerExecutePreparedAsPromiseWithRetryCloseConnection","TimeoutToken","isTimeoutToken","DurationRatchet","colonFormatMsDuration","duration","error","elapsedMS","LONG_QUERY_TIME_MS","dump","shutdown","testConnection","quietMode","rows","timestamp","test","testDbFailure","tx","debug","forceCloseConnectionForTesting","conn","getDB","end","retryCount","innerExecutePreparedAsPromise","errIn","asErr","message","cleared","escape","err2","config","namedPlaceholders","outFields","databaseName","resetConnection","RdsMysqlStyleConnectionProvider","configPromiseProvider","ssh","multipleStatements","tunnels","Map","dbPromise","cacheConfigPromise","DEFAULT_CONNECTION_OPTIONS","createConnectionConfig","addShutdownHandlerToProcess","usingSshTunnel","process","on","catch","oldDbHooks","oldSshTunnels","size","hookNames","from","hookName","oldDbHook","get","oldConn","destroy","tunnelNames","tunnelName","tunnel","name","has","dbConfig","getDbConfig","createDatabaseConnection","set","cfgs","configPromise","finder","dbList","label","fErr","d","dbCfg","clearCacheOnConnectionFailure","sshConfigPromise","cfgCopy","omit","tunnelPort","host","port","sshConfig","createSSHTunnel","serverOptions","maria","createConnection","then","rawListeners","inputPromise","cfg","getPort","SshTunnelService","server","close","sshOptions","dstHost","dstPort","localPort","tunnelOptions","autoClose","forwardOptions","srcAddr","srcPort","dstAddr","TunnelSsh","createTunnel","TransactionalNamedParameterMariaDbService","myQueryProvider","myConnectionProvider","myQueryDefaults","currentTxFlag","create","src","connProv","super","cleanShutdown","startTransaction","createRandomHexString","beginTransaction","commitTransaction","commit","rollBackTransaction","rollback","buildAndExecuteUpdateOrInsertInTransaction","buildAndExecuteInTransaction","oneStepBuildAndExecuteUpdateOrInsertInTransaction","handler","oneStepBuildAndExecuteInTransaction","RatchetRdbmsInfo","buildInformation","version","hash","branch","timeBuiltISO","notes","AwsRdsCert2023","RelationalDatabaseUtils","uploadObjectArrayToTable","db","tableName","data","clearTableFirst","deleteResult","affectedRows","columns","Set","flatMap","row","colArr","sql","insertResult","multiValue","inserted"],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import { DbConfig } from './db-config.js';
2
- export interface ConnectionConfig {
3
- dbList: DbConfig[];
4
- }
@@ -1,9 +0,0 @@
1
- export interface DbConfig {
2
- label: string;
3
- tunnelPort?: number;
4
- host: string;
5
- port: number;
6
- user: string;
7
- password: string;
8
- database: string;
9
- }
@@ -1,4 +0,0 @@
1
- export interface GroupByCountResult {
2
- groupByField: string;
3
- count: number;
4
- }
@@ -1,5 +0,0 @@
1
- import { DbConfig } from '../db-config.js';
2
- export interface MysqlDbConfig extends DbConfig {
3
- ssl?: string | Record<string, any>;
4
- decimalNumbers?: boolean;
5
- }
@@ -1,6 +0,0 @@
1
- export interface MysqlMasterStatus {
2
- File: string;
3
- Position: number;
4
- Binlog_Do_DB: string;
5
- Binlog_Ignore_DB: string;
6
- }
@@ -1,5 +0,0 @@
1
- import { FieldPacket } from 'mysql2';
2
- export interface MysqlResultsWrapper<T> {
3
- results: T;
4
- fields: FieldPacket[];
5
- }
@@ -1,52 +0,0 @@
1
- export interface MysqlSlaveStatus {
2
- Slave_IO_State: string;
3
- Master_Host: string;
4
- Master_User: string;
5
- Master_Port: number;
6
- Connect_Retry: number;
7
- Master_Log_File: string;
8
- Read_Master_Log_Pos: number;
9
- Relay_Log_File: string;
10
- Relay_Log_Pos: number;
11
- Relay_Master_Log_File: string;
12
- Slave_IO_Running: string;
13
- Slave_SQL_Running: string;
14
- Replicate_Do_DB: string;
15
- Replicate_Ignore_DB: string;
16
- Replicate_Do_Table: string;
17
- Replicate_Ignore_Table: string;
18
- Replicate_Wild_Do_Table: string;
19
- Replicate_Wild_Ignore_Table: string;
20
- Last_Errno: number;
21
- Last_Error: string;
22
- Skip_Counter: number;
23
- Exec_Master_Log_Pos: number;
24
- Relay_Log_Space: number;
25
- Until_Condition: string;
26
- Until_Log_File: string;
27
- Until_Log_Pos: number;
28
- Master_SSL_Allowed: string;
29
- Master_SSL_CA_File: string;
30
- Master_SSL_CA_Path: string;
31
- Master_SSL_Cert: string;
32
- Master_SSL_Cipher: string;
33
- Master_SSL_Key: string;
34
- Seconds_Behind_Master: number;
35
- Master_SSL_Verify_Server_Cert: string;
36
- Last_IO_Errno: number;
37
- Last_IO_Error: string;
38
- Last_SQL_Errno: number;
39
- Last_SQL_Error: string;
40
- Replicate_Ignore_Server_Ids: string;
41
- Master_Server_Id: number;
42
- Master_SSL_Crl: string;
43
- Master_SSL_Crlpath: string;
44
- Using_Gtid: string;
45
- Gtid_IO_Pos: string;
46
- Replicate_Do_Domain_Ids: string;
47
- Replicate_Ignore_Domain_Ids: string;
48
- Parallel_Mode: string;
49
- SQL_Delay: number;
50
- SQL_Remaining_Delay: string;
51
- Slave_SQL_Running_State: string;
52
- }
@@ -1,7 +0,0 @@
1
- import { Connection, ConnectionOptions } from 'mysql2/promise';
2
- import { QueryDefaults } from '../query-defaults.js';
3
- export interface MysqlStyleConnectionProvider {
4
- getConnection(name?: string): Promise<Connection | undefined>;
5
- clearConnectionCache(): Promise<boolean>;
6
- createNonPooledDatabaseConnection?(queryDefaults: QueryDefaults, additionalConfig?: ConnectionOptions): Promise<Connection | undefined>;
7
- }
@@ -1,9 +0,0 @@
1
- export interface MysqlUpdateResults {
2
- fieldCount: number;
3
- affectedRows: number;
4
- insertId: number;
5
- info: string;
6
- serverStatus: number;
7
- warningStatus: number;
8
- changedRows: number;
9
- }
@@ -1,5 +0,0 @@
1
- export interface PaginatedResults<T> {
2
- results: T[];
3
- nextPageToken: string;
4
- prevPageToken: string;
5
- }
@@ -1,6 +0,0 @@
1
- export interface PaginationBounds<T> {
2
- cn: string;
3
- min: T;
4
- max: T;
5
- count: number;
6
- }
@@ -1,9 +0,0 @@
1
- import { SortDirection } from './sort-direction.js';
2
- import { JwtTokenBase } from '@bitblit/ratchet-common';
3
- export interface Paginator<T> extends JwtTokenBase {
4
- cn: string;
5
- min?: T;
6
- max?: T;
7
- s?: SortDirection;
8
- l?: number;
9
- }
@@ -1,4 +0,0 @@
1
- export interface QueryDefaults {
2
- databaseName: string;
3
- timeoutMS: number;
4
- }
@@ -1,4 +0,0 @@
1
- export interface QueryTextProvider {
2
- fetchQuery(queryDottedPath: string): string;
3
- fetchAllQueries(): Record<string, string>;
4
- }
@@ -1,4 +0,0 @@
1
- export declare enum SortDirection {
2
- Asc = "Asc",
3
- Desc = "Desc"
4
- }
@@ -1,7 +0,0 @@
1
- export interface SshTunnelConfig {
2
- keepAlive: boolean;
3
- username: string;
4
- host: string;
5
- port: number;
6
- privateKey: string;
7
- }
@@ -1,12 +0,0 @@
1
- /// <reference types="node" />
2
- import type { ListenOptions, Server } from 'net';
3
- import type { ConnectConfig, Connection } from 'ssh2';
4
- import * as TunnelSsh from 'tunnel-ssh';
5
- export interface SshTunnelContainer {
6
- tunnelOptions: TunnelSsh.TunnelOptions;
7
- serverOptions: ListenOptions;
8
- sshOptions: ConnectConfig;
9
- forwardOptions: TunnelSsh.ForwardOptions;
10
- server: Server;
11
- connection?: Connection;
12
- }
@@ -1,5 +0,0 @@
1
- export interface SshConfig {
2
- localPort: number;
3
- dbHost: string;
4
- dbPort: number;
5
- }
@@ -1,4 +0,0 @@
1
- export declare enum TransactionIsolationLevel {
2
- Default = "Default",
3
- ReadUncommitted = "READ UNCOMMITTED"
4
- }
@@ -1,41 +0,0 @@
1
- import { Connection, ConnectionOptions } from 'mysql2/promise';
2
- import { MysqlResultsWrapper } from './model/mysql/mysql-results-wrapper.js';
3
- import { MysqlUpdateResults } from './model/mysql/mysql-update-results.js';
4
- import { TransactionIsolationLevel } from './model/transaction-isolation-level.js';
5
- import { NonPooledMysqlStyleConnectionProvider } from './non-pooled-mysql-style-connection-provider.js';
6
- import { MysqlStyleConnectionProvider } from './model/mysql/mysql-style-connection-provider.js';
7
- import { QueryBuilder } from './query-builder/query-builder.js';
8
- import { GroupByCountResult } from './model/group-by-count-result.js';
9
- import { QueryDefaults } from './model/query-defaults.js';
10
- import { QueryTextProvider } from './model/query-text-provider.js';
11
- export declare class NamedParameterMariaDbService {
12
- private queryProvider;
13
- private connectionProvider;
14
- private queryDefaults;
15
- private static LONG_QUERY_TIME_MS;
16
- private serviceName;
17
- constructor(queryProvider: QueryTextProvider, connectionProvider: MysqlStyleConnectionProvider, queryDefaults: QueryDefaults);
18
- getQueryDefaults(): QueryDefaults;
19
- getQueryProvider(): QueryTextProvider;
20
- createNonPooledMysqlStyleConnectionProvider(queryDefaults: QueryDefaults, additionalConfig?: ConnectionOptions): Promise<NonPooledMysqlStyleConnectionProvider>;
21
- fetchQueryRawTextByName(queryPath: string): string;
22
- queryBuilder(queryPath?: string): QueryBuilder;
23
- executeUpdateOrInsertByName(queryPath: string, params?: object, timeoutMS?: number): Promise<MysqlUpdateResults>;
24
- buildAndExecuteUpdateOrInsert(queryBuilder: QueryBuilder, timeoutMS?: number): Promise<MysqlUpdateResults>;
25
- buildAndExecuteUpdateOrInsertWithRetry(queryBuilder: QueryBuilder, maxRetries: number, timeoutMS?: number): Promise<MysqlUpdateResults>;
26
- executeQueryByName<Row>(queryPath: string, params: object, timeoutMS?: number): Promise<Row[]>;
27
- executeQueryByNameSingle<Row>(queryPath: string, params: object, timeoutMS?: number): Promise<Row | null>;
28
- buildAndExecute<Row>(queryBuilder: QueryBuilder, timeoutMS?: number): Promise<Row[]>;
29
- buildAndExecuteSingle<Row>(queryBuilder: QueryBuilder, timeoutMS?: number): Promise<Row | null>;
30
- buildAndExecuteFetchTotalRows(queryBuilder: QueryBuilder, groupBy?: string, timeoutMS?: number): Promise<GroupByCountResult[]>;
31
- executeQueryWithMeta<Row>(transactionIsolationLevel: TransactionIsolationLevel, query: string, fields?: object, timeoutMS?: number, debugComment?: string): Promise<MysqlResultsWrapper<Row>>;
32
- shutdown(): Promise<boolean>;
33
- testConnection(quietMode?: boolean): Promise<number | null>;
34
- testDbFailure(): Promise<void>;
35
- changeNextQueryTransactionIsolationLevel<Row>(tx: TransactionIsolationLevel | null): Promise<MysqlResultsWrapper<Row> | null>;
36
- forceCloseConnectionForTesting(): Promise<boolean>;
37
- private innerExecutePreparedAsPromiseWithRetryCloseConnection;
38
- private innerExecutePreparedAsPromise;
39
- getDB(): Promise<Connection>;
40
- resetConnection(): Promise<boolean>;
41
- }
@@ -1,8 +0,0 @@
1
- import { Connection } from 'mysql2/promise';
2
- import { MysqlStyleConnectionProvider } from './model/mysql/mysql-style-connection-provider.js';
3
- export declare class NonPooledMysqlStyleConnectionProvider implements MysqlStyleConnectionProvider {
4
- private connection;
5
- constructor(connection: Connection);
6
- getConnection(): Promise<Connection>;
7
- clearConnectionCache(): Promise<boolean>;
8
- }
@@ -1,9 +0,0 @@
1
- import { TransactionIsolationLevel } from '../model/transaction-isolation-level.js';
2
- import { Paginator } from '../model/paginator.js';
3
- export declare class QueryBuilderResult {
4
- query: string;
5
- namedParams: Record<string, unknown>;
6
- paginator?: Paginator<any>;
7
- transactionIsolationLevel: TransactionIsolationLevel;
8
- constructor(query: string, namedParams: Record<string, unknown>, paginator: Paginator<any> | undefined, transactionIsolationLevel: TransactionIsolationLevel);
9
- }
@@ -1,52 +0,0 @@
1
- import { QueryBuilderResult } from './query-builder-result.js';
2
- import { TransactionIsolationLevel } from '../model/transaction-isolation-level.js';
3
- import { QueryTextProvider } from '../model/query-text-provider.js';
4
- import { Paginator } from '../model/paginator.js';
5
- export declare class QueryBuilder {
6
- static readonly ALLOWED_SQL_CONSTRUCT: RegExp;
7
- private readonly queryProvider;
8
- private query?;
9
- meta: {
10
- queryPath?: string;
11
- };
12
- private sqlConstructs;
13
- private namedParams;
14
- private conditionals;
15
- private debugComment;
16
- private paginator?;
17
- private debugAnnotateMode;
18
- private transactionIsolationLevel;
19
- constructor(queryProvider: QueryTextProvider);
20
- clone(): QueryBuilder;
21
- withTransactionIsolationLevel(level: TransactionIsolationLevel): QueryBuilder;
22
- withDebugComment(comment: string): QueryBuilder;
23
- appendDebugComment(comment: string): QueryBuilder;
24
- withNamedQuery(queryPath: string): QueryBuilder;
25
- withBaseQuery(baseQuery: string): void;
26
- withSqlConstruct(key: string, value: unknown): QueryBuilder;
27
- withSqlConstructs(params: Record<string, unknown>): QueryBuilder;
28
- removeParam(key: string): QueryBuilder;
29
- paramNames(): string[];
30
- withParam(key: string, value: unknown): QueryBuilder;
31
- withParams(params: unknown): QueryBuilder;
32
- withExpandedParam(keyPrefix: string, values: unknown[], extendIfExists: boolean): QueryBuilder;
33
- withConditional(tag: string, state?: boolean): QueryBuilder;
34
- withConditionals(params: Record<string, boolean>): QueryBuilder;
35
- withPaginator(paginator: Paginator<any>): QueryBuilder;
36
- fetchCopyOfParam<T>(paramName: string): T | undefined;
37
- fetchCopyOfConditional<T>(conditionalName: string): T | undefined;
38
- containsParam(paramName: string): boolean;
39
- getDebugComment(): string;
40
- containsConditional(conditionalName: string): boolean;
41
- build(): QueryBuilderResult;
42
- buildUnfiltered(): QueryBuilderResult;
43
- protected internalBuild(unfiltered: boolean): QueryBuilderResult;
44
- private stripNonAsciiParams;
45
- private runQueryChecks;
46
- private applyComments;
47
- applySqlConstructs(): void;
48
- private applyRepeatBlocks;
49
- private applyQueryFragments;
50
- private applyPagination;
51
- private applyConditionalBlocks;
52
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,12 +0,0 @@
1
- export declare class QueryUtil {
2
- private fields;
3
- private replacements;
4
- addReplacement(replacement: Record<string, unknown>, ...fields: string[]): void;
5
- appendReplacement(replacementKey: string, appendValue: string, ...fields: string[]): void;
6
- addFields(...fields: string[]): void;
7
- getFields(): string[];
8
- getReplacements(): Record<string, unknown>;
9
- static sqlInjectionUnsafeParamRenderer(value: unknown): string;
10
- static renderQueryStringForPasteIntoTool(query: string, inFields: object | null, transform?: (x: unknown) => string): string | null;
11
- static reformatQueryForLogging(qry: string, inMaxLineLength?: number): string | null;
12
- }
@@ -1,24 +0,0 @@
1
- import { Connection, ConnectionOptions } from 'mysql2/promise';
2
- import { SshTunnelService } from './ssh-tunnel-service.js';
3
- import { MysqlStyleConnectionProvider } from './model/mysql/mysql-style-connection-provider.js';
4
- import { ConnectionConfig } from './model/connection-config.js';
5
- import { QueryDefaults } from './model/query-defaults.js';
6
- export declare class RdsMysqlStyleConnectionProvider implements MysqlStyleConnectionProvider {
7
- private configPromiseProvider;
8
- private additionalConfig;
9
- private ssh?;
10
- static DEFAULT_CONNECTION_OPTIONS: ConnectionOptions;
11
- private tunnels;
12
- private dbPromise;
13
- private cacheConfigPromise;
14
- constructor(configPromiseProvider: () => Promise<ConnectionConfig>, additionalConfig?: ConnectionOptions, ssh?: SshTunnelService);
15
- get usingSshTunnel(): boolean;
16
- private addShutdownHandlerToProcess;
17
- clearConnectionCache(): Promise<boolean>;
18
- getConnection(name: string): Promise<Connection | undefined>;
19
- createNonPooledDatabaseConnection(queryDefaults: QueryDefaults, additionalConfig?: ConnectionOptions): Promise<Connection | undefined>;
20
- private getDbConfig;
21
- private createDatabaseConnection;
22
- private configPromise;
23
- private createConnectionConfig;
24
- }
@@ -1,6 +0,0 @@
1
- import { SshTunnelContainer } from './model/ssh/ssh-tunnel-container.js';
2
- import { SshTunnelConfig } from './model/ssh/ssh-tunnel-config.js';
3
- export declare class SshTunnelService {
4
- shutdown(ssh: SshTunnelContainer): Promise<boolean>;
5
- createSSHTunnel(sshOptions: SshTunnelConfig, dstHost: string, dstPort: number, localPort: number): Promise<SshTunnelContainer>;
6
- }
@@ -1,23 +0,0 @@
1
- import { NamedParameterMariaDbService } from './named-parameter-maria-db-service.js';
2
- import { MysqlStyleConnectionProvider } from './model/mysql/mysql-style-connection-provider.js';
3
- import { ConnectionOptions } from 'mysql2/promise';
4
- import { QueryBuilder } from './query-builder/query-builder.js';
5
- import { MysqlUpdateResults } from './model/mysql/mysql-update-results.js';
6
- import { QueryDefaults } from './model/query-defaults.js';
7
- import { QueryTextProvider } from './model/query-text-provider.js';
8
- export declare class TransactionalNamedParameterMariaDbService extends NamedParameterMariaDbService {
9
- private myQueryProvider;
10
- private myConnectionProvider;
11
- private myQueryDefaults;
12
- private currentTxFlag?;
13
- static create(src: NamedParameterMariaDbService, queryDefaults: QueryDefaults, additionalConfig?: ConnectionOptions): Promise<TransactionalNamedParameterMariaDbService>;
14
- constructor(myQueryProvider: QueryTextProvider, myConnectionProvider: MysqlStyleConnectionProvider, myQueryDefaults: QueryDefaults);
15
- cleanShutdown(): Promise<void>;
16
- startTransaction(): Promise<void>;
17
- commitTransaction(): Promise<void>;
18
- rollBackTransaction(): Promise<void>;
19
- buildAndExecuteUpdateOrInsertInTransaction(queryBuilder: QueryBuilder, timeoutMS?: number): Promise<MysqlUpdateResults | null>;
20
- buildAndExecuteInTransaction<T>(queryBuilder: QueryBuilder, timeoutMS?: number): Promise<T[] | null>;
21
- static oneStepBuildAndExecuteUpdateOrInsertInTransaction(src: NamedParameterMariaDbService, queryBuilder: QueryBuilder, timeoutMS?: number, additionalConfig?: ConnectionOptions): Promise<MysqlUpdateResults | null>;
22
- static oneStepBuildAndExecuteInTransaction<T>(src: NamedParameterMariaDbService, queryBuilder: QueryBuilder, timeoutMS?: number, additionalConfig?: ConnectionOptions): Promise<T[] | null>;
23
- }
@@ -1,6 +0,0 @@
1
- export declare class AwsRdsCert2023 {
2
- static readonly US_EAST_1_BUNDLE_PEM: string;
3
- static readonly US_EAST_2_BUNDLE_PEM: string;
4
- static readonly US_WEST_1_BUNDLE_PEM: string;
5
- static readonly US_WEST_2_BUNDLE_PEM: string;
6
- }
@@ -1,4 +0,0 @@
1
- import { NamedParameterMariaDbService } from '../named-parameter-maria-db-service.js';
2
- export declare class RelationalDatabaseUtils {
3
- static uploadObjectArrayToTable<Item extends object>(db: NamedParameterMariaDbService, tableName: string, data: Item[], clearTableFirst?: boolean): Promise<number>;
4
- }