@odigos/aws-cdk 0.0.0 → 0.0.11

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.
package/.jsii CHANGED
@@ -3826,7 +3826,7 @@
3826
3826
  },
3827
3827
  "name": "@odigos/aws-cdk",
3828
3828
  "readme": {
3829
- "markdown": "# Odigos CDK constructs for AWS Lambda\n\nInstrument AWS Lambda functions with the Odigos OpenTelemetry layer, from your own CDK app.\n\n```bash\nnpm install @odigos/aws-cdk # TypeScript / JavaScript\npip install odigos-aws-cdk # Python\n```\n\n```ts\nimport { OdigosLambdaInstrumentation } from '@odigos/aws-cdk';\n\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [apiFn, workerFn],\n});\n```\n\n```python\nfrom odigos_aws_cdk import OdigosLambdaInstrumentation\n\nOdigosLambdaInstrumentation(self, \"Odigos\",\n destination={\"endpoint\": \"otlp.example.com:4317\"},\n functions=[api_fn, worker_fn],\n)\n```\n\nThat attaches the layer for each function's language and architecture, sets the exec wrapper that loads\nthe OpenTelemetry SDK, and hands the in-Lambda collector its whole configuration.\n\n## How the telemetry actually leaves the function\n\nYour function's SDK **does not** export to your destination. It exports to an OpenTelemetry collector\nrunning inside the same Lambda sandbox, on localhost. The collector forwards to your destination *after*\nthe handler has already returned its response.\n\nThat indirection is the whole point. A slow or unreachable destination costs billed duration, not caller\nlatency — and the collector's `decouple` processor is what holds the sandbox open until the export queue\ndrains, so a low-traffic function does not lose its telemetry to the freeze.\n\nConsequently `OTEL_EXPORTER_OTLP_ENDPOINT` is deliberately never set. If you set it yourself you put the\nexport back on the invocation's critical path.\n\n## Choosing a layer source\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [fn],\n layerSource: OdigosLayerSource.IN_ACCOUNT,\n});\n```\n\n| | `ODIGOS_PUBLIC` (default) | `IN_ACCOUNT` |\n|---|---|---|\n| What it synthesizes | a layer ARN | an `AWS::Serverless::Application` (nested stack) per language/arch |\n| Layer owner | the Odigos AWS account | **your** account, created by your stack |\n| Resolution | synth time, from a table baked into this package | deploy time, from the Serverless Application Repository |\n| Environment-agnostic stacks | not supported — needs a concrete region | works |\n| Deploy speed | unchanged | slower on first deploy |\n\nBoth install identical bytes. `IN_ACCOUNT` exists for organisations whose policy forbids attaching a\nLambda layer owned by another AWS account. It needs the deploying principal to be allowed\n`serverlessrepo:CreateCloudFormationTemplate` and `serverlessrepo:GetApplication`.\n\nIf you mirror the layer somewhere yourself, pass `layerVersion` and neither path is used.\n\n## Versioning\n\n**The package version is the layer version.** `@odigos/aws-cdk@0.2.0` resolves to the layer built and\npublished by Odigos release `v0.2.0`, and pins the SAR application to semantic version `0.2.0` — which is\nimmutable, so it means the same bytes forever.\n\nNothing resolves at deploy time in the default path, so upgrading the layer is `npm update` and a\n`cdk diff` that shows the change. An instrumentation layer moving on its own, under a deployment that\nchanged nothing, is not a property you want.\n\n## Handler mode vs. web-server mode\n\n`OdigosInstrumentationMode.HANDLER` (the default) is for a normal Lambda handler. It sets\n`AWS_LAMBDA_EXEC_WRAPPER`.\n\n`OdigosInstrumentationMode.WEB_SERVER` is for a function running a web server behind the\n[AWS Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter). The adapter owns the exec\nwrapper, so this mode does not touch it and loads instrumentation through the language's own loader\nvariable instead.\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [webFn],\n mode: OdigosInstrumentationMode.WEB_SERVER,\n // NODE_OPTIONS the function already needs — ours is appended, not substituted.\n existingLoaderValue: '--max-old-space-size=2048',\n});\n```\n\nThere is no auto-detection, deliberately. Detecting the adapter means inspecting the function's other\nlayers, which at synth time are frequently unresolved tokens; a detector that was right most of the time\nwould silently break the functions it got wrong. **Applying `HANDLER` to a web-adapter function\noverwrites the adapter's wrapper and the function stops serving.**\n\n`existingLoaderValue` has to be passed explicitly because CDK's `lambda.Function` exposes no way to read\nback an environment variable set elsewhere in your app. Omit it and the loader variable is set to the\nOdigos value alone — for `NODE_OPTIONS` that can mean losing a flag your app needs to boot.\n\nRuby has no verified web-server loader and is rejected at synth in this mode.\n\n## Java handler interfaces\n\nThe Java layer ships four wrapper scripts, one per handler interface, and this is a correctness switch\nrather than a detail level:\n\n```ts\njavaHandlerDistro: OdigosJavaHandlerDistro.OTEL_STREAM_HANDLER\n```\n\n| Distro | For |\n|---|---|\n| `OTEL_HANDLER` (default) | `RequestHandler` |\n| `OTEL_PROXY_HANDLER` | API Gateway proxy events (enriched) |\n| `OTEL_SQS_HANDLER` | SQS events (enriched) |\n| `OTEL_STREAM_HANDLER` | `RequestStreamHandler` |\n\n`OTEL_HANDLER` installs a `RequestHandler` implementation. A `RequestStreamHandler` function has a\ndifferent signature entirely, so wrapping it with the default **breaks the invocation** — it does not\nmerely produce thinner spans.\n\n## Signals\n\n```ts\ndestination: {\n endpoint: 'otlp.example.com:4317',\n metrics: false, // traces and logs stay on\n}\n```\n\nA disabled signal gets no collector pipeline **and** the SDK is told not to produce it. Both halves\nmatter: a signal with no pipeline is refused at the receiver on every batch, so suppressing it at the\nsource is what stops the error loop.\n\nTurning all three off throws at synth — a collector with no pipeline fails to start, which would leave\nthe function instrumented and silent.\n\n## Instrumenting a whole stack\n\n```ts\nAspects.of(stack).add(new OdigosInstrumentationAspect(stack, {\n destination: { endpoint: 'otlp.example.com:4317' },\n}));\n```\n\n`skipUnsupportedRuntimes` defaults to `true` for the aspect: it visits every function in the scope,\nincluding ones whose runtime has no OpenTelemetry Lambda layer (`dotnet*`, `provided.*` for Go and custom\nruntimes). Each skip is a synth warning rather than a silent no-op. The construct defaults it to `false`,\nbecause explicitly asking to instrument a Go function is a mistake worth failing on.\n\n## Credentials in `headers`\n\n`destination.headers` is rendered into `OPENTELEMETRY_COLLECTOR_CONFIG_URI`, which is a plain Lambda\nenvironment variable — readable by anyone with `lambda:GetFunctionConfiguration` and visible in the\nconsole. For a long-lived credential, prefer a destination that authenticates by network position, or\nterminate at a collector you control.\n\n## Do not also instrument these functions with the Odigos connector\n\nThe Odigos AWS connector instruments **live** functions by mutating them, and reconciles them back to its\nown desired state on every pass. A function instrumented here *and* enabled as a connector source ends up\nowned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts the\nconnector's, and every round trip publishes a new function version.\n\nPick one per function. These constructs never set the connector's `ODIGOS_MANAGED` ownership marker — so\nan IaC-instrumented function is not one the connector will roll back — but the connector will take it\nover if you enable it as a source.\n\n## API\n\n| Export | |\n|---|---|\n| `OdigosLambdaInstrumentation` | the construct; `instrument(fn)`, `instrumentAll(fns)` |\n| `OdigosInstrumentationAspect` | applies it to every function in a scope |\n| `OdigosDestination` | where the collector exports; exactly one of `endpoint` / `httpEndpoint` |\n| `OdigosLayerSource` | `ODIGOS_PUBLIC` \\| `IN_ACCOUNT` |\n| `OdigosInstrumentationMode` | `HANDLER` \\| `WEB_SERVER` |\n| `OdigosJavaHandlerDistro` | the four Java wrappers |\n| `renderCollectorConfig` | the collector config renderer, if you want to inspect what gets set |\n| `LAYER_ARNS`, `ODIGOS_VERSION` | the baked layer table and the release it came from |\n\n## License\n\nApache-2.0.\n"
3829
+ "markdown": "# Odigos CDK constructs for AWS Lambda\n\nInstrument AWS Lambda functions with the Odigos OpenTelemetry layer, from your own CDK app.\n\n```bash\nnpm install @odigos/aws-cdk # TypeScript / JavaScript\npip install odigos-aws-cdk # Python\n```\n\n```ts\nimport { OdigosLambdaInstrumentation } from '@odigos/aws-cdk';\n\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [apiFn, workerFn],\n});\n```\n\n```python\nfrom odigos_aws_cdk import OdigosLambdaInstrumentation\n\nOdigosLambdaInstrumentation(self, \"Odigos\",\n destination={\"endpoint\": \"otlp.example.com:4317\"},\n functions=[api_fn, worker_fn],\n)\n```\n\nThat attaches the layer for each function's language and architecture, sets the exec wrapper that loads\nthe OpenTelemetry SDK, and hands the in-Lambda collector its whole configuration.\n\n## How the telemetry actually leaves the function\n\nYour function's SDK **does not** export to your destination. It exports to an OpenTelemetry collector\nrunning inside the same Lambda sandbox, on localhost. The collector forwards to your destination *after*\nthe handler has already returned its response.\n\nThat indirection is the whole point. A slow or unreachable destination costs billed duration, not caller\nlatency — and the collector's `decouple` processor is what holds the sandbox open until the export queue\ndrains, so a low-traffic function does not lose its telemetry to the freeze.\n\nConsequently `OTEL_EXPORTER_OTLP_ENDPOINT` is deliberately never set. If you set it yourself you put the\nexport back on the invocation's critical path.\n\n## Endpoint grammar\n\n`endpoint` is OTLP/**gRPC** as bare `host:port` (conventionally 4317). `httpEndpoint` is OTLP/**HTTP** as a\nscheme-qualified URL (conventionally 4318). Exactly one. They select different collector exporters with\ndifferent endpoint grammars, so a scheme in `endpoint` — or its absence in `httpEndpoint` — throws at synth\nrather than producing a collector that starts and silently delivers nothing. A gRPC endpoint on port 4318\n(or an HTTP one on 4317) is the likeliest version of that mistake, and is reported as a synth warning.\n\n## Choosing a layer source\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [fn],\n layerSource: OdigosLayerSource.IN_ACCOUNT,\n});\n```\n\n| | `ODIGOS_PUBLIC` (default) | `IN_ACCOUNT` |\n|---|---|---|\n| What it synthesizes | a layer ARN | an `AWS::Serverless::Application` (nested stack) per language/arch |\n| Layer owner | the Odigos AWS account | **your** account, created by your stack |\n| Resolution | synth time, from a table baked into this package | deploy time, from the Serverless Application Repository |\n| Environment-agnostic stacks | not supported — needs a concrete region | works |\n| Deploy speed | unchanged | slower on first deploy |\n\nBoth install identical bytes. `IN_ACCOUNT` exists for organisations whose policy forbids attaching a\nLambda layer owned by another AWS account. It needs the deploying principal to be allowed\n`serverlessrepo:CreateCloudFormationTemplate` and `serverlessrepo:GetApplication`.\n\nIf you mirror the layer somewhere yourself, pass `layerVersion` and neither path is used.\n\n## Versioning\n\n**The package version is the layer version.** `@odigos/aws-cdk@0.2.0` resolves to the layer built and\npublished by Odigos release `v0.2.0`, and pins the SAR application to semantic version `0.2.0` — which is\nimmutable, so it means the same bytes forever.\n\nNothing resolves at deploy time in the default path, so upgrading the layer is `npm update` and a\n`cdk diff` that shows the change. An instrumentation layer moving on its own, under a deployment that\nchanged nothing, is not a property you want.\n\n## Handler mode vs. web-server mode\n\n`OdigosInstrumentationMode.HANDLER` (the default) is for a normal Lambda handler. It sets\n`AWS_LAMBDA_EXEC_WRAPPER`.\n\n`OdigosInstrumentationMode.WEB_SERVER` is for a function running a web server behind the\n[AWS Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter). The adapter owns the exec\nwrapper, so this mode does not touch it and loads instrumentation through the language's own loader\nvariable instead.\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [webFn],\n mode: OdigosInstrumentationMode.WEB_SERVER,\n // NODE_OPTIONS the function already needs — ours is appended, not substituted.\n existingLoaderValue: '--max-old-space-size=2048',\n});\n```\n\nThere is no auto-detection, deliberately. Detecting the adapter means inspecting the function's other\nlayers, which at synth time are frequently unresolved tokens; a detector that was right most of the time\nwould silently break the functions it got wrong. **Applying `HANDLER` to a web-adapter function\noverwrites the adapter's wrapper and the function stops serving.**\n\n`existingLoaderValue` has to be passed explicitly because CDK's `lambda.Function` exposes no way to read\nback an environment variable set elsewhere in your app. Omit it and the loader variable is set to the\nOdigos value alone — for `NODE_OPTIONS` that can mean losing a flag your app needs to boot.\n\nRuby has no verified web-server loader and is rejected at synth in this mode.\n\n## Java handler interfaces\n\nThe Java layer ships four wrapper scripts, one per handler interface, and this is a correctness switch\nrather than a detail level:\n\n```ts\njavaHandlerDistro: OdigosJavaHandlerDistro.OTEL_STREAM_HANDLER\n```\n\n| Distro | For |\n|---|---|\n| `OTEL_HANDLER` (default) | `RequestHandler` |\n| `OTEL_PROXY_HANDLER` | API Gateway proxy events (enriched) |\n| `OTEL_SQS_HANDLER` | SQS events (enriched) |\n| `OTEL_STREAM_HANDLER` | `RequestStreamHandler` |\n\n`OTEL_HANDLER` installs a `RequestHandler` implementation. A `RequestStreamHandler` function has a\ndifferent signature entirely, so wrapping it with the default **breaks the invocation** — it does not\nmerely produce thinner spans.\n\n## Signals\n\n```ts\ndestination: {\n endpoint: 'otlp.example.com:4317',\n metrics: false, // traces and logs stay on\n}\n```\n\nA disabled signal gets no collector pipeline **and** the SDK is told not to produce it. Both halves\nmatter: a signal with no pipeline is refused at the receiver on every batch, so suppressing it at the\nsource is what stops the error loop.\n\nTurning all three off throws at synth — a collector with no pipeline fails to start, which would leave\nthe function instrumented and silent.\n\n## Instrumenting a whole stack\n\n```ts\nAspects.of(stack).add(new OdigosInstrumentationAspect(stack, {\n destination: { endpoint: 'otlp.example.com:4317' },\n}));\n```\n\n`skipUnsupportedRuntimes` defaults to `true` for the aspect: it visits every function in the scope,\nincluding ones whose runtime has no OpenTelemetry Lambda layer (`dotnet*`, `provided.*` for Go and custom\nruntimes). Each skip is a synth warning rather than a silent no-op. The construct defaults it to `false`,\nbecause explicitly asking to instrument a Go function is a mistake worth failing on.\n\n## Credentials in `headers`\n\n`destination.headers` is rendered into `OPENTELEMETRY_COLLECTOR_CONFIG_URI`, which is a plain Lambda\nenvironment variable — readable by anyone with `lambda:GetFunctionConfiguration` and visible in the\nconsole. For a long-lived credential, prefer a destination that authenticates by network position, or\nterminate at a collector you control.\n\n## Making Odigos report the function as instrumented\n\nBy default these constructs do **not** write `ODIGOS_MANAGED`, and the consequence is easy to hit: Odigos\nreports the function as `Absent` — \"awaiting your deployment\" — even though the layer is attached, the\nwrapper is set and the collector is configured. The connector derives ownership from that one variable, and\nchecks for it *before* comparing anything else, so nothing about a correctly instrumented function\nsubstitutes for it.\n\nFor a function Odigos discovers in **manual (IaC) mode** — which is the mode a workload is in unless you\nhave explicitly handed instrumentation to the connector — turn it on:\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [fn],\n recordOwnershipMarker: true,\n});\n```\n\nThe marker records the exact layer ARN the construct attached, which is also what the connector reads back\nto decide which layer version the function is *supposed* to carry — so a version you pinned is respected\ninstead of being reported as drift. It works in `IN_ACCOUNT` mode too, where the ARN is a deploy-time\nreference your own code has no way to obtain.\n\nIt also records a rollback snapshot (`prevEnv`) naming every variable the construct set. That matters: a\nmarker without one makes an uninstrument remove the **layer** while leaving `AWS_LAMBDA_EXEC_WRAPPER`\npointing into it, which breaks the function at its next cold start. In web-server mode the snapshot holds\nyour `existingLoaderValue`, so a rollback restores your own `NODE_OPTIONS` rather than deleting it.\n\nLeave it `false` for a function you have enabled as an **automatic-mode** connector source: there the\nconnector owns the marker, including a snapshot it wrote itself, and two writers of one ownership record is\nthe combination that genuinely misbehaves.\n\n## Service names\n\nLeft unset, `OTEL_SERVICE_NAME` is the function's physical name when your stack names it explicitly, and\nthe construct id otherwise. The fallback exists because a name CloudFormation generates is a `Ref` to the\nfunction, and a function referencing itself in its own environment is a dependency cycle CloudFormation\nrejects at deploy time.\n\nThe connector compares `OTEL_SERVICE_NAME` against the workload's name in Odigos, which is the real AWS\nfunction name — so for a function whose name is generated, pass `serviceName` explicitly or it is reported\nas drifted. `serviceName` applies to **every** function a construct instruments, so use one construct per\nfunction when you want per-function names.\n\n## Do not also instrument these functions with the Odigos connector\n\nThe Odigos AWS connector instruments **live** functions by mutating them, and reconciles them back to its\nown desired state on every pass. A function instrumented here *and* enabled as an automatic-mode connector\nsource ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts\nthe connector's, and every round trip publishes a new function version.\n\nPick one per function. Discovery-only (manual) mode is the combination that works: Odigos watches and\nreports, your stack owns the configuration — that is what `recordOwnershipMarker` is for.\n\n## API\n\n| Export | |\n|---|---|\n| `OdigosLambdaInstrumentation` | the construct; `instrument(fn)`, `instrumentAll(fns)` |\n| `OdigosInstrumentationAspect` | applies it to every function in a scope |\n| `OdigosDestination` | where the collector exports; exactly one of `endpoint` / `httpEndpoint` |\n| `OdigosLayerSource` | `ODIGOS_PUBLIC` \\| `IN_ACCOUNT` |\n| `OdigosInstrumentationMode` | `HANDLER` \\| `WEB_SERVER` |\n| `OdigosJavaHandlerDistro` | the four Java wrappers |\n| `recordOwnershipMarker` | the option that makes Odigos recognise the function as instrumented |\n| `renderCollectorConfig` | the collector config renderer, if you want to inspect what gets set |\n| `LAYER_ARNS`, `ODIGOS_VERSION` | the baked layer table and the release it came from |\n\n## License\n\nApache-2.0.\n"
3830
3830
  },
3831
3831
  "repository": {
3832
3832
  "directory": "cdk",
@@ -4016,7 +4016,7 @@
4016
4016
  },
4017
4017
  "locationInModule": {
4018
4018
  "filename": "src/instrumentation.ts",
4019
- "line": 339
4019
+ "line": 447
4020
4020
  },
4021
4021
  "parameters": [
4022
4022
  {
@@ -4043,7 +4043,7 @@
4043
4043
  "kind": "class",
4044
4044
  "locationInModule": {
4045
4045
  "filename": "src/instrumentation.ts",
4046
- "line": 331
4046
+ "line": 439
4047
4047
  },
4048
4048
  "methods": [
4049
4049
  {
@@ -4053,7 +4053,7 @@
4053
4053
  },
4054
4054
  "locationInModule": {
4055
4055
  "filename": "src/instrumentation.ts",
4056
- "line": 346
4056
+ "line": 454
4057
4057
  },
4058
4058
  "name": "visit",
4059
4059
  "overrides": "aws-cdk-lib.IAspect",
@@ -4084,7 +4084,7 @@
4084
4084
  "kind": "interface",
4085
4085
  "locationInModule": {
4086
4086
  "filename": "src/instrumentation.ts",
4087
- "line": 312
4087
+ "line": 420
4088
4088
  },
4089
4089
  "name": "OdigosInstrumentationAspectProps",
4090
4090
  "symbolId": "src/instrumentation:OdigosInstrumentationAspectProps"
@@ -4134,7 +4134,7 @@
4134
4134
  "kind": "interface",
4135
4135
  "locationInModule": {
4136
4136
  "filename": "src/instrumentation.ts",
4137
- "line": 67
4137
+ "line": 85
4138
4138
  },
4139
4139
  "name": "OdigosInstrumentationOptions",
4140
4140
  "properties": [
@@ -4147,7 +4147,7 @@
4147
4147
  "immutable": true,
4148
4148
  "locationInModule": {
4149
4149
  "filename": "src/instrumentation.ts",
4150
- "line": 71
4150
+ "line": 89
4151
4151
  },
4152
4152
  "name": "destination",
4153
4153
  "type": {
@@ -4165,7 +4165,7 @@
4165
4165
  "immutable": true,
4166
4166
  "locationInModule": {
4167
4167
  "filename": "src/instrumentation.ts",
4168
- "line": 123
4168
+ "line": 141
4169
4169
  },
4170
4170
  "name": "debug",
4171
4171
  "optional": true,
@@ -4184,7 +4184,7 @@
4184
4184
  "immutable": true,
4185
4185
  "locationInModule": {
4186
4186
  "filename": "src/instrumentation.ts",
4187
- "line": 145
4187
+ "line": 163
4188
4188
  },
4189
4189
  "name": "existingLoaderValue",
4190
4190
  "optional": true,
@@ -4203,7 +4203,7 @@
4203
4203
  "immutable": true,
4204
4204
  "locationInModule": {
4205
4205
  "filename": "src/instrumentation.ts",
4206
- "line": 96
4206
+ "line": 114
4207
4207
  },
4208
4208
  "name": "javaHandlerDistro",
4209
4209
  "optional": true,
@@ -4221,7 +4221,7 @@
4221
4221
  "immutable": true,
4222
4222
  "locationInModule": {
4223
4223
  "filename": "src/instrumentation.ts",
4224
- "line": 78
4224
+ "line": 96
4225
4225
  },
4226
4226
  "name": "layerSource",
4227
4227
  "optional": true,
@@ -4240,7 +4240,7 @@
4240
4240
  "immutable": true,
4241
4241
  "locationInModule": {
4242
4242
  "filename": "src/instrumentation.ts",
4243
- "line": 133
4243
+ "line": 151
4244
4244
  },
4245
4245
  "name": "layerVersion",
4246
4246
  "optional": true,
@@ -4259,7 +4259,7 @@
4259
4259
  "immutable": true,
4260
4260
  "locationInModule": {
4261
4261
  "filename": "src/instrumentation.ts",
4262
- "line": 89
4262
+ "line": 107
4263
4263
  },
4264
4264
  "name": "mode",
4265
4265
  "optional": true,
@@ -4267,6 +4267,25 @@
4267
4267
  "fqn": "@odigos/aws-cdk.OdigosInstrumentationMode"
4268
4268
  }
4269
4269
  },
4270
+ {
4271
+ "abstract": true,
4272
+ "docs": {
4273
+ "default": "false",
4274
+ "remarks": "WITHOUT IT THE FUNCTION IS REPORTED AS UNINSTRUMENTED. The connector derives ownership from this\nvariable alone: no marker means `Absent` — \"awaiting your deployment\" — even though the layer is\nattached, the wrapper is set and the collector is configured. Set this to `true` for a function that\nOdigos discovers in MANUAL (IaC) mode, which is the mode a workload is in unless you explicitly hand\ninstrumentation to the connector.\n\nLeave it `false` (the default) for a function you have enabled as an AUTOMATIC-mode connector source.\nThere, the connector instruments the function itself and owns this variable, including the `prevEnv`\nsnapshot it restores on rollback; two writers of one ownership record is the one combination that\ngenuinely misbehaves.\n\nThe marker records the exact layer ARN this construct attached, which is also what the connector reads\nback to decide which layer version the function is supposed to carry — so a version you pinned is\nrespected rather than reported as drift. It works in every layer mode, including `IN_ACCOUNT`, where the\nARN is a deploy-time reference your own code cannot obtain.",
4275
+ "stability": "stable",
4276
+ "summary": "Write `ODIGOS_MANAGED`, the marker that makes the Odigos connector recognise this function as instrumented."
4277
+ },
4278
+ "immutable": true,
4279
+ "locationInModule": {
4280
+ "filename": "src/instrumentation.ts",
4281
+ "line": 187
4282
+ },
4283
+ "name": "recordOwnershipMarker",
4284
+ "optional": true,
4285
+ "type": {
4286
+ "primitive": "boolean"
4287
+ }
4288
+ },
4270
4289
  {
4271
4290
  "abstract": true,
4272
4291
  "docs": {
@@ -4278,7 +4297,7 @@
4278
4297
  "immutable": true,
4279
4298
  "locationInModule": {
4280
4299
  "filename": "src/instrumentation.ts",
4281
- "line": 111
4300
+ "line": 129
4282
4301
  },
4283
4302
  "name": "serviceName",
4284
4303
  "optional": true,
@@ -4297,7 +4316,7 @@
4297
4316
  "immutable": true,
4298
4317
  "locationInModule": {
4299
4318
  "filename": "src/instrumentation.ts",
4300
- "line": 156
4319
+ "line": 198
4301
4320
  },
4302
4321
  "name": "skipUnsupportedRuntimes",
4303
4322
  "optional": true,
@@ -4370,7 +4389,7 @@
4370
4389
  },
4371
4390
  "locationInModule": {
4372
4391
  "filename": "src/instrumentation.ts",
4373
- "line": 207
4392
+ "line": 249
4374
4393
  },
4375
4394
  "parameters": [
4376
4395
  {
@@ -4396,7 +4415,7 @@
4396
4415
  "kind": "class",
4397
4416
  "locationInModule": {
4398
4417
  "filename": "src/instrumentation.ts",
4399
- "line": 201
4418
+ "line": 243
4400
4419
  },
4401
4420
  "methods": [
4402
4421
  {
@@ -4407,7 +4426,7 @@
4407
4426
  },
4408
4427
  "locationInModule": {
4409
4428
  "filename": "src/instrumentation.ts",
4410
- "line": 226
4429
+ "line": 289
4411
4430
  },
4412
4431
  "name": "instrument",
4413
4432
  "parameters": [
@@ -4426,7 +4445,7 @@
4426
4445
  },
4427
4446
  "locationInModule": {
4428
4447
  "filename": "src/instrumentation.ts",
4429
- "line": 257
4448
+ "line": 322
4430
4449
  },
4431
4450
  "name": "instrumentAll",
4432
4451
  "parameters": [
@@ -4461,7 +4480,7 @@
4461
4480
  "kind": "interface",
4462
4481
  "locationInModule": {
4463
4482
  "filename": "src/instrumentation.ts",
4464
- "line": 162
4483
+ "line": 204
4465
4484
  },
4466
4485
  "name": "OdigosLambdaInstrumentationProps",
4467
4486
  "properties": [
@@ -4476,7 +4495,7 @@
4476
4495
  "immutable": true,
4477
4496
  "locationInModule": {
4478
4497
  "filename": "src/instrumentation.ts",
4479
- "line": 168
4498
+ "line": 210
4480
4499
  },
4481
4500
  "name": "functions",
4482
4501
  "optional": true,
@@ -4526,6 +4545,6 @@
4526
4545
  "symbolId": "src/types:OdigosLayerSource"
4527
4546
  }
4528
4547
  },
4529
- "version": "0.0.0",
4530
- "fingerprint": "Pyl/HwAzBD2t0BswujuLCm1fDiC9qnxUUSz7UP7SHR0="
4548
+ "version": "0.0.11",
4549
+ "fingerprint": "GhtDOF4Uik3gZvcWZlYji/v3oOcE8BiYdiH6HobYKlc="
4531
4550
  }
package/README.md CHANGED
@@ -41,6 +41,14 @@ drains, so a low-traffic function does not lose its telemetry to the freeze.
41
41
  Consequently `OTEL_EXPORTER_OTLP_ENDPOINT` is deliberately never set. If you set it yourself you put the
42
42
  export back on the invocation's critical path.
43
43
 
44
+ ## Endpoint grammar
45
+
46
+ `endpoint` is OTLP/**gRPC** as bare `host:port` (conventionally 4317). `httpEndpoint` is OTLP/**HTTP** as a
47
+ scheme-qualified URL (conventionally 4318). Exactly one. They select different collector exporters with
48
+ different endpoint grammars, so a scheme in `endpoint` — or its absence in `httpEndpoint` — throws at synth
49
+ rather than producing a collector that starts and silently delivers nothing. A gRPC endpoint on port 4318
50
+ (or an HTTP one on 4317) is the likeliest version of that mistake, and is reported as a synth warning.
51
+
44
52
  ## Choosing a layer source
45
53
 
46
54
  ```ts
@@ -162,16 +170,60 @@ environment variable — readable by anyone with `lambda:GetFunctionConfiguratio
162
170
  console. For a long-lived credential, prefer a destination that authenticates by network position, or
163
171
  terminate at a collector you control.
164
172
 
173
+ ## Making Odigos report the function as instrumented
174
+
175
+ By default these constructs do **not** write `ODIGOS_MANAGED`, and the consequence is easy to hit: Odigos
176
+ reports the function as `Absent` — "awaiting your deployment" — even though the layer is attached, the
177
+ wrapper is set and the collector is configured. The connector derives ownership from that one variable, and
178
+ checks for it *before* comparing anything else, so nothing about a correctly instrumented function
179
+ substitutes for it.
180
+
181
+ For a function Odigos discovers in **manual (IaC) mode** — which is the mode a workload is in unless you
182
+ have explicitly handed instrumentation to the connector — turn it on:
183
+
184
+ ```ts
185
+ new OdigosLambdaInstrumentation(this, 'Odigos', {
186
+ destination: { endpoint: 'otlp.example.com:4317' },
187
+ functions: [fn],
188
+ recordOwnershipMarker: true,
189
+ });
190
+ ```
191
+
192
+ The marker records the exact layer ARN the construct attached, which is also what the connector reads back
193
+ to decide which layer version the function is *supposed* to carry — so a version you pinned is respected
194
+ instead of being reported as drift. It works in `IN_ACCOUNT` mode too, where the ARN is a deploy-time
195
+ reference your own code has no way to obtain.
196
+
197
+ It also records a rollback snapshot (`prevEnv`) naming every variable the construct set. That matters: a
198
+ marker without one makes an uninstrument remove the **layer** while leaving `AWS_LAMBDA_EXEC_WRAPPER`
199
+ pointing into it, which breaks the function at its next cold start. In web-server mode the snapshot holds
200
+ your `existingLoaderValue`, so a rollback restores your own `NODE_OPTIONS` rather than deleting it.
201
+
202
+ Leave it `false` for a function you have enabled as an **automatic-mode** connector source: there the
203
+ connector owns the marker, including a snapshot it wrote itself, and two writers of one ownership record is
204
+ the combination that genuinely misbehaves.
205
+
206
+ ## Service names
207
+
208
+ Left unset, `OTEL_SERVICE_NAME` is the function's physical name when your stack names it explicitly, and
209
+ the construct id otherwise. The fallback exists because a name CloudFormation generates is a `Ref` to the
210
+ function, and a function referencing itself in its own environment is a dependency cycle CloudFormation
211
+ rejects at deploy time.
212
+
213
+ The connector compares `OTEL_SERVICE_NAME` against the workload's name in Odigos, which is the real AWS
214
+ function name — so for a function whose name is generated, pass `serviceName` explicitly or it is reported
215
+ as drifted. `serviceName` applies to **every** function a construct instruments, so use one construct per
216
+ function when you want per-function names.
217
+
165
218
  ## Do not also instrument these functions with the Odigos connector
166
219
 
167
220
  The Odigos AWS connector instruments **live** functions by mutating them, and reconciles them back to its
168
- own desired state on every pass. A function instrumented here *and* enabled as a connector source ends up
169
- owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts the
170
- connector's, and every round trip publishes a new function version.
221
+ own desired state on every pass. A function instrumented here *and* enabled as an automatic-mode connector
222
+ source ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts
223
+ the connector's, and every round trip publishes a new function version.
171
224
 
172
- Pick one per function. These constructs never set the connector's `ODIGOS_MANAGED` ownership marker — so
173
- an IaC-instrumented function is not one the connector will roll back — but the connector will take it
174
- over if you enable it as a source.
225
+ Pick one per function. Discovery-only (manual) mode is the combination that works: Odigos watches and
226
+ reports, your stack owns the configuration — that is what `recordOwnershipMarker` is for.
175
227
 
176
228
  ## API
177
229
 
@@ -183,6 +235,7 @@ over if you enable it as a source.
183
235
  | `OdigosLayerSource` | `ODIGOS_PUBLIC` \| `IN_ACCOUNT` |
184
236
  | `OdigosInstrumentationMode` | `HANDLER` \| `WEB_SERVER` |
185
237
  | `OdigosJavaHandlerDistro` | the four Java wrappers |
238
+ | `recordOwnershipMarker` | the option that makes Odigos recognise the function as instrumented |
186
239
  | `renderCollectorConfig` | the collector config renderer, if you want to inspect what gets set |
187
240
  | `LAYER_ARNS`, `ODIGOS_VERSION` | the baked layer table and the release it came from |
188
241
 
@@ -170,6 +170,18 @@ function renderCollectorConfig(dest) {
170
170
  throw new Error('Odigos destination sets both `endpoint` (OTLP/gRPC) and `httpEndpoint` (OTLP/HTTP); ' +
171
171
  'they select different collector exporters, so exactly one must be set.');
172
172
  }
173
+ // The two fields have different endpoint GRAMMARS, and getting them wrong is the worst failure mode this
174
+ // package has: the collector accepts the configuration, fails to build its exporter, and exits — leaving
175
+ // the function instrumented, reporting healthy, and exporting nothing. Both checks are therefore synth
176
+ // errors rather than documentation.
177
+ if (dest.endpoint && dest.endpoint.includes('://')) {
178
+ throw new Error(`Odigos destination \`endpoint\` is "${dest.endpoint}", but the gRPC exporter takes host:port with ` +
179
+ 'no scheme. Use `httpEndpoint` for a scheme-qualified OTLP/HTTP URL.');
180
+ }
181
+ if (dest.httpEndpoint && !/^https?:\/\//.test(dest.httpEndpoint)) {
182
+ throw new Error(`Odigos destination \`httpEndpoint\` is "${dest.httpEndpoint}", but the OTLP/HTTP exporter takes a ` +
183
+ 'scheme-qualified URL (http:// or https://). Use `endpoint` for a bare gRPC host:port.');
184
+ }
173
185
  const exporter = renderExporter(dest);
174
186
  const pipelines = renderPipelines(dest, exporterNameFor(dest));
175
187
  if (pipelines === '') {
@@ -189,4 +201,4 @@ function renderCollectorConfig(dest) {
189
201
  pipelines +
190
202
  '}}');
191
203
  }
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdG9yLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb2xsZWN0b3ItY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTBFQSxzQ0FFQztBQW1CRCwwQ0FFQztBQXdFRCxrREFFQztBQU9ELHNEQStCQztBQS9NRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFFSDs7Ozs7O0dBTUc7QUFDVSxRQUFBLHdCQUF3QixHQUFHLG9DQUFvQyxDQUFDO0FBRTdFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQztBQUV4Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sb0JBQW9CLEdBQ3hCLDJGQUEyRjtJQUMzRixnRUFBZ0UsQ0FBQztBQUVuRSxpRUFBaUU7QUFDcEQsUUFBQSxhQUFhLEdBQUcsTUFBTSxDQUFDO0FBRXBDLHFGQUFxRjtBQUN4RSxRQUFBLG1CQUFtQixHQUFHLHNCQUFzQixDQUFDO0FBQzdDLFFBQUEsb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFDL0MsUUFBQSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztBQUV0RCxxREFBcUQ7QUFDckQsU0FBZ0IsYUFBYSxDQUFDLEtBQTBCO0lBQ3RELE9BQU8sS0FBSyxLQUFLLEtBQUssQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsVUFBVSxDQUFDLENBQVM7SUFDM0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLElBQXVCO0lBQ3JELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxPQUFtQztJQUN4RCxJQUFJLENBQUMs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QUFJLENBQUMsQ0FBQztJQUN0QyxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksU0FBUyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEZBQTRGO1lBQzFGLDJFQUEyRSxDQUM5RSxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sQ0FDTCx1QkFBdUI7UUFDdkIsaUNBQWlDO1FBQ2pDLHFHQUFxRztRQUNyRyx1RUFBdUU7UUFDdkUsOEVBQThFO1FBQzlFLGNBQWM7UUFDZCxvQkFBb0I7UUFDcEIsZUFBZTtRQUNmLFFBQVE7UUFDUiw4REFBOEQ7UUFDOUQsU0FBUztRQUNULElBQUksQ0FDTCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9kaWdvc0Rlc3RpbmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogUmVuZGVycyB0aGUgaW4tTGFtYmRhIGNvbGxlY3RvcidzIGNvbXBsZXRlIGNvbmZpZ3VyYXRpb24gYXMgYW4gaW5saW5lXG4gKiBgT1BFTlRFTEVNRVRSWV9DT0xMRUNUT1JfQ09ORklHX1VSSWAgdmFsdWUuXG4gKlxuICogVGhpcyBpcyBhIFBPUlQgb2YgYHJlbmRlckNvbGxlY3RvckNvbmZpZ2AgaW4gdGhlIGNvbm5lY3RvclxuICogKGNvbm5lY3RvcnMvcHJvdmlkZXJzL2F3cy9wa2cvd29ya2xvYWQvaW5zdHJ1bWVudG9yL2NvbGxlY3Rvcl9jb25maWcuZ28pIGFuZCBpcyBkZWxpYmVyYXRlbHlcbiAqIGJ5dGUtZm9yLWJ5dGUgY29tcGF0aWJsZSB3aXRoIGl0LiBUaGF0IGVxdWl2YWxlbmNlIGlzIG5vdCBjb3NtZXRpYzogYSBmdW5jdGlvbiBpbnN0cnVtZW50ZWQgaGVyZSBhbmRcbiAqIGxhdGVyIGVuYWJsZWQgYXMgYSBjb25uZWN0b3Igc291cmNlIGlzIGNvbXBhcmVkIGFnYWluc3QgdGhlIGNvbm5lY3RvcidzIHJlbmRlcmluZyB0byBkZWNpZGUgd2hldGhlciBpdFxuICogbmVlZHMgY29udmVyZ2luZy4gQSBzdHJheSBzcGFjZSB3b3VsZCBtYWtlIGV2ZXJ5IHJlY29uY2lsZSBzZWUgZHJpZnQgYW5kIGNodXJuIGEgbmV3IGZ1bmN0aW9uIHZlcnNpb25cbiAqIGZvcmV2ZXIuXG4gKlxuICogV0hZIFRIRSBXSE9MRSBET0NVTUVOVCwgUkFUSEVSIFRIQU4gQSBGRVcgVkFSSUFCTEVTLiBUaGUgbGF5ZXIgc2hpcHMgYSBiYWtlZFxuICogL29wdC9jb2xsZWN0b3ItY29uZmlnL2NvbmZpZy55YW1sLCBidXQgdGhhdCBmaWxlIGlzIE9ORSBkb2N1bWVudCBzaGFyZWQgYnkgZXZlcnkgZnVuY3Rpb24sIHNvIGl0IGNhblxuICogb25seSByZWFjaCBhIGRlc3RpbmF0aW9uIHRocm91Z2ggZW52IGluZGlyZWN0aW9uIOKAlCBgJHtlbnY6U09NRVRISU5HfWAuIFRoYXQgbWFkZSB0aHJlZSB0aGluZ3NcbiAqIGltcG9zc2libGUgYXQgb25jZTpcbiAqXG4gKiAgIC0gQVVUSC4gQSBjcmVkZW50aWFsIGlzIGEgaGVhZGVycyBtYXAsIG5vdCBhIHNjYWxhci4gQSBiYWtlZCBmaWxlIGNhbiBzdWJzdGl0dXRlIGEgdmFsdWUgYnV0IGNhbm5vdFxuICogICAgIGNvbmRpdGlvbmFsbHkgZ3JvdyBhIGBoZWFkZXJzOmAgYmxvY2ssIHNvIGFuIGF1dGhlbnRpY2F0ZWQgZGVzdGluYXRpb24gd2FzIHVucmVhY2hhYmxlLlxuICogICAtIE9UTFAvSFRUUCBERVNUSU5BVElPTlMuIFRoZSBiYWtlZCBmaWxlIGhhcmRjb2RlcyBhIGdSUEMgYG90bHBgIGV4cG9ydGVyLiBBbiBvdGxwaHR0cC1vbmx5XG4gKiAgICAgZGVzdGluYXRpb24gcmVzb2x2ZXMgd2l0aCBhbiBlbXB0eSBnUlBDIGVuZHBvaW50LCBhbmQgdGhlIGNvbGxlY3RvciBkb2VzIG5vdCBkZWdyYWRlIOKAlCBpdCBmYWlscyB0b1xuICogICAgIGJ1aWxkIHRoZSBwaXBlbGluZSBhbmQgZXhpdHMsIHNvIHRoZSBmdW5jdGlvbiBpcyBpbnN0cnVtZW50ZWQsIGxvb2tzIGhlYWx0aHksIGFuZCBleHBvcnRzIG5vdGhpbmcuXG4gKiAgIC0gUEVSLVNJR05BTCBQSVBFTElORVMuIFRoZSBiYWtlZCBmaWxlIGRlY2xhcmVzIGFsbCB0aHJlZSBwaXBlbGluZXMgdW5jb25kaXRpb25hbGx5LCBzbyBhIHNpZ25hbCB0aGVcbiAqICAgICBkZXN0aW5hdGlvbiBkb2VzIG5vdCBhY2NlcHQgaXMgcmVjZWl2ZWQgYW5kIHRoZW4gZmFpbHMgb24gZXhwb3J0IHJhdGhlciB0aGFuIG5ldmVyIGJlaW5nIGJ1aWx0LlxuICpcbiAqIEZMT1cgU1RZTEUgSVMgTE9BRC1CRUFSSU5HLiBUaGUgZG9jdW1lbnQgaXMgZW1pdHRlZCBvbiBhIHNpbmdsZSBsaW5lIGJlY2F1c2UgaXQgaGFzIHRvIHN1cnZpdmUgYXMgYW5cbiAqIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlLiBJbiBhIFlBTUwgZmxvdyBtYXBwaW5nIGEgY29sb24gbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlLCBvciB0aGUgcGFyc2VyXG4gKiByZWFkcyBgYTpiYCBhcyB0aGUgcGxhaW4gc2NhbGFyIGBcImE6YlwiYCByYXRoZXIgdGhhbiBhIG1hcHBpbmcuIFdyaXR0ZW4gd2l0aG91dCB0aGUgc3BhY2VzIHRoZSBjb2xsZWN0b3JcbiAqIGFjY2VwdHMgdGhlIHZhcmlhYmxlLCByZXBvcnRzIHRoZSBVUkkgaXQgcmVhZCwgYW5kIHRoZW4gZmFpbHMgdG8gc3RhcnQgd2l0aCBhIGJhcmVcbiAqIGBvdGVsY29sIHN0YXRlIGlzIENsb3NlZGAg4oCUIG5vIHBhcnNlIGVycm9yLCBubyBtZW50aW9uIG9mIHRoZSBjb25maWcuIEV2ZXJ5IGA6IGAgYmVsb3cgZWFybnMgaXRzIHBsYWNlLlxuICovXG5cbi8qKlxuICogVGhlIGNvbGxlY3RvciBsYXllcidzIG93biBjb25maWctc291cmNlIHZhcmlhYmxlIOKAlCB1cHN0cmVhbSdzIG5hbWUsIG5vdCBvdXJzLiBQb2ludGVkIGF0IGEgYHlhbWw6YCBVUklcbiAqIGl0IGNhcnJpZXMgdGhlIGVudGlyZSBjb25maWd1cmF0aW9uIGlubGluZSwgc28gbm8gc2Vjb25kIHZhcmlhYmxlIGlzIG5lZWRlZCB0byBob2xkIGl0LlxuICpcbiAqIFVwc3RyZWFtIGFsc28gcmVhZHMgdGhlIG9sZGVyIGBPUEVOVEVMRU1FVFJZX0NPTExFQ1RPUl9DT05GSUdfRklMRWAgYW5kIGxvZ3MgYSBkZXByZWNhdGlvbiB3YXJuaW5nIGZvclxuICogaXQ7IHRoaXMgaXMgdGhlIGN1cnJlbnQgbmFtZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVOVl9DT0xMRUNUT1JfQ09ORklHX1VSSSA9ICdPUEVOVEVMRU1FVFJZX0NPTExFQ1RPUl9DT05GSUdfVVJJJztcblxuLyoqXG4gKiBUaGUgY29uZm1hcCBwcm92aWRlciB0aGF0IHJlYWRzIGEgY29uZmlndXJhdGlvbiBvdXQgb2YgdGhlIFVSSSBpdHNlbGYuIFRoZSBjb2xsZWN0b3IgcmVnaXN0ZXJzXG4gKiBlbnYvZmlsZS95YW1sL2h0dHAvaHR0cHMvczMgcHJvdmlkZXJzOyBgeWFtbDpgIGlzIHRoZSBvbmx5IG9uZSB0aGF0IG5lZWRzIG5vIHNlY29uZCB2YXJpYWJsZSBhbmQgbm9cbiAqIG5ldHdvcmsgcmVhZCBvbiBhIGNvbGQgc3RhcnQuXG4gKi9cbmNvbnN0IENPTExFQ1RPUl9DT05GSUdfU0NIRU1FID0gJ3lhbWw6JztcblxuLyoqXG4gKiBNaXJyb3JzIHRoZSBiYWtlZCBjb25maWcncyBwcm9jZXNzb3Igc2V0LCBhbmQgdGhlIE9SREVSIGlzIHRoZSBjb250cmFjdDpcbiAqXG4gKiAgIC0gYG1lbW9yeV9saW1pdGVyYCBmaXJzdCwgc28gYW4gZXhwb3J0IGJhY2tsb2cgaXMgc2hlZCBiZWZvcmUgaXQgaXMgY2hhcmdlZCB0byB0aGUgc2FtZSBtZW1vcnkgYnVkZ2V0XG4gKiAgICAgdGhlIGN1c3RvbWVyJ3MgaGFuZGxlciBhbGxvY2F0ZXMgZnJvbS4gUGVyY2VudGFnZXMsIG5vdCBgbGltaXRfbWliYCwgYmVjYXVzZSBvbmUgbGF5ZXIgc2VydmVzXG4gKiAgICAgZnVuY3Rpb25zIGZyb20gMTI4TUIgdG8gMTBHQi5cbiAqICAgLSBgZGVjb3VwbGVgIExBU1QuIExhbWJkYSBmcmVlemVzIHRoZSBzYW5kYm94IG9uY2UgdGhlIGhhbmRsZXIgcmV0dXJucyBhbmQgZXZlcnkgZXh0ZW5zaW9uIGhhcyBjYWxsZWRcbiAqICAgICAvbmV4dDsgYSBmcm96ZW4gc2FuZGJveCBydW5zIG5vIHRpbWVycywgc28gYSBiYXRjaCBzaXR0aW5nIGJlaGluZCBpdHMgdGltZW91dCBpcyBmbHVzaGVkIG9uIGEgbGF0ZXJcbiAqICAgICBpbnZvY2F0aW9uIG9yIGRyb3BwZWQgd2hlbiB0aGUgc2FuZGJveCBpcyByZWFwZWQuIGBkZWNvdXBsZWAgYWNrbm93bGVkZ2VzIHRoZSByZWNlaXZlIHBhdGhcbiAqICAgICBpbW1lZGlhdGVseSBhbmQgdHJhY2tzIGluLWZsaWdodCBleHBvcnRzLCB3aGljaCBpcyB3aGF0IGxldHMgdGhlIGV4dGVuc2lvbiBob2xkIC9uZXh0IG9wZW4gdW50aWwgdGhlXG4gKiAgICAgcXVldWUgZHJhaW5zIOKAlCBhZnRlciB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIGl0cyByZXNwb25zZS5cbiAqL1xuY29uc3QgQ09MTEVDVE9SX1BST0NFU1NPUlMgPVxuICAne21lbW9yeV9saW1pdGVyOiB7Y2hlY2tfaW50ZXJ2YWw6IDFzLCBsaW1pdF9wZXJjZW50YWdlOiA1MCwgc3Bpa2VfbGltaXRfcGVyY2VudGFnZTogMjB9LCAnICtcbiAgJ2JhdGNoOiB7c2VuZF9iYXRjaF9zaXplOiA1MTIsIHRpbWVvdXQ6IDIwMG1zfSwgZGVjb3VwbGU6IG51bGx9JztcblxuLyoqIFZhbHVlIGFuIHVuc3VwcG9ydGVkIHNpZ25hbCdzIGBPVEVMXypfRVhQT1JURVJgIGlzIHNldCB0by4gKi9cbmV4cG9ydCBjb25zdCBFWFBPUlRFUl9OT05FID0gJ25vbmUnO1xuXG4vKiogVGhlIHRocmVlIGBPVEVMXypfRVhQT1JURVJgIHZhcmlhYmxlcywgaW4gdGhlIG9yZGVyIHRoZSBjb25uZWN0b3Igd3JpdGVzIHRoZW0uICovXG5leHBvcnQgY29uc3QgRU5WX1RSQUNFU19FWFBPUlRFUiA9ICdPVEVMX1RSQUNFU19FWFBPUlRFUic7XG5leHBvcnQgY29uc3QgRU5WX01FVFJJQ1NfRVhQT1JURVIgPSAnT1RFTF9NRVRSSUNTX0VYUE9SVEVSJztcbmV4cG9ydCBjb25zdCBFTlZfTE9HU19FWFBPUlRFUiA9ICdPVEVMX0xPR1NfRVhQT1JURVInO1xuXG4vKiogV2hldGhlciBhIHNpZ25hbCBpcyBlbmFibGVkLCBkZWZhdWx0aW5nIHRvIG9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbEVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgZG91YmxlLXF1b3RlZCBZQU1MIHNjYWxhci5cbiAqXG4gKiBRdW90aW5nIHVuY29uZGl0aW9uYWxseSBpcyB3aGF0IGtlZXBzIGEgdmFsdWUgc3VjaCBhcyBhIGJhcmUgYGhvc3Q6NDMxN2AgZnJvbSBiZWluZyByZS1yZWFkIGFzIGEgbmVzdGVkXG4gKiBtYXBwaW5nIGluIGZsb3cgY29udGV4dC4gYEpTT04uc3RyaW5naWZ5YCBpcyB0aGUgVHlwZVNjcmlwdCBlcXVpdmFsZW50IG9mIHRoZSBjb25uZWN0b3Inc1xuICogYHN0cmNvbnYuUXVvdGVgIGZvciB0aGUgdm9jYWJ1bGFyeSB0aGF0IG1hdHRlcnMgaGVyZSAoYFxcXCJgIGFuZCBgXFxcXGApOyBib3RoIHByb2R1Y2UgdGhlIHNhbWUgb3V0cHV0IGZvclxuICogdGhlIEFTQ0lJIGVuZHBvaW50cywgaGVhZGVyIG5hbWVzIGFuZCBjcmVkZW50aWFscyB0aGlzIGV2ZXIgc2Vlcy5cbiAqL1xuZnVuY3Rpb24geWFtbFN0cmluZyhzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocyk7XG59XG5cbi8qKlxuICogUGlja3MgdGhlIGV4cG9ydGVyIGJ5IHRoZSB0cmFuc3BvcnQgdGhlIGRlc3RpbmF0aW9uIGNvbmZpZ3VyZWQuIEEgZGVzdGluYXRpb24gY2FycmllcyBhIGdSUEMgZW5kcG9pbnRcbiAqICh0eXBlIGBvdGxwYCkgb3IgYW4gT1RMUC9IVFRQIG9uZSAodHlwZSBgb3RscGh0dHBgKTsgdGhlIHR3byBhcmUgZGlmZmVyZW50IGNvbGxlY3RvciBjb21wb25lbnRzIHdpdGhcbiAqIGRpZmZlcmVudCBlbmRwb2ludCBncmFtbWFycywgc28gdGhpcyBpcyBhIGdlbnVpbmUgYnJhbmNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0ZXJOYW1lRm9yKGRlc3Q6IE9kaWdvc0Rlc3RpbmF0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGRlc3QuZW5kcG9pbnQgPyAnb3RscCcgOiAnb3RscGh0dHAnO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZXN0aW5hdGlvbidzIHBlci1yZXF1ZXN0IGhlYWRlcnMg4oCUIGluIHByYWN0aWNlIGl0cyBjcmVkZW50aWFsLiBFbXB0eSB3aGVuIHRoZSBkZXN0aW5hdGlvblxuICogbmVlZHMgbm9uZSwgc28gbm8gaGVhZGVyIGJsb2NrIGlzIHdyaXR0ZW4gYXQgYWxsIHJhdGhlciB0aGFuIGFuIGVtcHR5IG9uZS5cbiAqXG4gKiBLZXlzIGFyZSBzb3J0ZWQgc28gdGhlIHJlbmRlcmVkIGNvbmZpZyBpcyBieXRlLWlkZW50aWNhbCBhY3Jvc3Mgc3ludGhzLiBUaGUgc3RyaW5nIGlzIGNvbXBhcmVkIGFnYWluc3RcbiAqIHRoZSBsaXZlIGZ1bmN0aW9uJ3MgZW52aXJvbm1lbnQgdG8gZGVjaWRlIHdoZXRoZXIgYW4gdXBkYXRlIGlzIG5lZWRlZCwgYW5kIG1hcCBvcmRlciB3b3VsZCBvdGhlcndpc2VcbiAqIG1ha2UgZXZlcnkgZGVwbG95IGxvb2sgbGlrZSBhIGNoYW5nZS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVySGVhZGVycyhoZWFkZXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGlmICghaGVhZGVycykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29ydCgpO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3QgcmVuZGVyZWQgPSBrZXlzLm1hcCgoaykgPT4gYCR7eWFtbFN0cmluZyhrKX06ICR7eWFtbFN0cmluZyhoZWFkZXJzW2tdKX1gKS5qb2luKCcsICcpO1xuICByZXR1cm4gYCwgaGVhZGVyczogeyR7cmVuZGVyZWR9fWA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckV4cG9ydGVyKGRlc3Q6IE9kaWdvc0Rlc3RpbmF0aW9uKTogc3RyaW5nIHtcbiAgbGV0IG91dDogc3RyaW5nO1xuICBpZiAoZGVzdC5lbmRwb2ludCkge1xuICAgIC8vIHRscy5pbnNlY3VyZSBhcHBsaWVzIHRvIHRoZSBnUlBDIGV4cG9ydGVyIG9ubHk7IHRoZSBIVFRQIGV4cG9ydGVyIHRha2VzIHRoZSBzY2hlbWUgZnJvbSB0aGUgVVJMLlxuICAgIG91dCA9IGB7b3RscDoge2VuZHBvaW50OiAke3lhbWxTdHJpbmcoZGVzdC5lbmRwb2ludCl9LCB0bHM6IHtpbnNlY3VyZTogJHtkZXN0Lmluc2VjdXJlID09PSB0cnVlfX1gO1xuICB9IGVsc2UgaWYgKGRlc3QuaHR0cEVuZHBvaW50KSB7XG4gICAgb3V0ID0gYHtvdGxwaHR0cDoge2VuZHBvaW50OiAke3lhbWxTdHJpbmcoZGVzdC5odHRwRW5kcG9pbnQpfWA7XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVhY2hlZCB3aGVuIGEgZGVzdGluYXRpb24gY2FycmllcyBuZWl0aGVyIHRyYW5zcG9ydC4gRmFpbGluZyBoZXJlIGlzIHRoZSB3aG9sZSBwb2ludDogdGhlXG4gICAgLy8gYWx0ZXJuYXRpdmUgaXMgYSBjb2xsZWN0b3IgdGhhdCBleGl0cyBvbiBzdGFydHVwIHdoaWxlIHRoZSBmdW5jdGlvbiBpcyByZXBvcnRlZCBoZWFsdGh5LlxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdPZGlnb3MgZGVzdGluYXRpb24gaGFzIG5laXRoZXIgYGVuZHBvaW50YCAoT1RMUC9nUlBDKSBub3IgYGh0dHBFbmRwb2ludGAgKE9UTFAvSFRUUCksICcgK1xuICAgICAgICAnc28gdGhlIGluLUxhbWJkYSBjb2xsZWN0b3Igd291bGQgaGF2ZSBub3doZXJlIHRvIGV4cG9ydC4nLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGAke291dH0ke3JlbmRlckhlYWRlcnMoZGVzdC5oZWFkZXJzKX19fWA7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgcGlwZWxpbmUgb25seSBmb3IgdGhlIHNpZ25hbHMgdGhlIGRlc3RpbmF0aW9uIGFjY2VwdHMuIEEgc2lnbmFsIHdpdGggbm8gcGlwZWxpbmUgaXMgcmVmdXNlZCBhdFxuICogdGhlIHJlY2VpdmVyLCB3aGljaCBpcyB0aGUgYmVoYXZpb3VyIHdlIHdhbnQ6IHRoZSBTREsgaXMgdG9sZCBub3QgdG8gcHJvZHVjZSBpdCBlaXRoZXIgKHNlZVxuICogYGV4cG9ydGVyT3ZlcnJpZGVGb3JgKSwgYW5kIHRoZSB0d28gdG9nZXRoZXIgbWVhbiBhbiB1bmFjY2VwdGVkIHNpZ25hbCBpcyBuZXZlciBnZW5lcmF0ZWQsIG5ldmVyXG4gKiBleHBvcnRlZCwgYW5kIG5ldmVyIGEgcGVyLWJhdGNoIGVycm9yIGFnYWluc3QgYSBiYWNrZW5kIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGl0LlxuICovXG5mdW5jdGlvbiByZW5kZXJQaXBlbGluZXMoZGVzdDogT2RpZ29zRGVzdGluYXRpb24sIGV4cG9ydGVyTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNpZ25hbHM6IEFycmF5PFtzdHJpbmcsIGJvb2xlYW5dPiA9IFtcbiAgICBbJ3RyYWNlcycsIHNpZ25hbEVuYWJsZWQoZGVzdC50cmFjZXMpXSxcbiAgICBbJ21ldHJpY3MnLCBzaWduYWxFbmFibGVkKGRlc3QubWV0cmljcyldLFxuICAgIFsnbG9ncycsIHNpZ25hbEVuYWJsZWQoZGVzdC5sb2dzKV0sXG4gIF07XG4gIGZvciAoY29uc3QgW25hbWUsIGVuYWJsZWRdIG9mIHNpZ25hbHMpIHtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgYCR7bmFtZX06IHtyZWNlaXZlcnM6IFtvdGxwXSwgcHJvY2Vzc29yczogW21lbW9yeV9saW1pdGVyLCBiYXRjaCwgZGVjb3VwbGVdLCBleHBvcnRlcnM6IFske2V4cG9ydGVyTmFtZX1dfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAwID8gJycgOiBgeyR7cGFydHMuam9pbignLCAnKX19YDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBhIHNpZ25hbCdzIGBPVEVMXypfRVhQT1JURVJgIG11c3QgaG9sZDogYG5vbmVgIHRvIHN1cHByZXNzIGEgc2lnbmFsIHRoZSBkZXN0aW5hdGlvblxuICogZG9lcyBub3QgYWNjZXB0LCBvciBgdW5kZWZpbmVkYCBtZWFuaW5nIHRoZSB2YXJpYWJsZSBtdXN0IGJlIEFCU0VOVCBiZWNhdXNlIHRoZSBTREsncyBvd24gZGVmYXVsdCBpc1xuICogYWxyZWFkeSB3aGF0IHdlIHdhbnQuXG4gKlxuICogT25seSB0aGUgXCJub25lXCIgc2lkZSBpcyB3cml0dGVuLCBiZWNhdXNlIGBvdGxwYCBpcyBhbHJlYWR5IGV2ZXJ5IE9wZW5UZWxlbWV0cnkgU0RLJ3MgZGVmYXVsdCBmb3IgYWxsXG4gKiB0aHJlZSBzaWduYWxzIOKAlCBzZXR0aW5nIGl0IHdvdWxkIHJlc3RhdGUgdGhlIGRlZmF1bHQgaW4gdGhyZWUgdmFyaWFibGVzIG9uIGV2ZXJ5IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0ZXJPdmVycmlkZUZvcihzdXBwb3J0ZWQ6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3VwcG9ydGVkID8gdW5kZWZpbmVkIDogRVhQT1JURVJfTk9ORTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBjb21wbGV0ZSBjb2xsZWN0b3IgY29uZmlndXJhdGlvbiBmb3Igb25lIGRlc3RpbmF0aW9uLlxuICpcbiAqIEB0aHJvd3MgaWYgdGhlIGRlc3RpbmF0aW9uIG5hbWVzIG5laXRoZXIgdHJhbnNwb3J0LCBib3RoIHRyYW5zcG9ydHMsIG9yIG5vIHNpZ25hbHMgYXQgYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29sbGVjdG9yQ29uZmlnKGRlc3Q6IE9kaWdvc0Rlc3RpbmF0aW9uKTogc3RyaW5nIHtcbiAgaWYgKGRlc3QuZW5kcG9pbnQgJiYgZGVzdC5odHRwRW5kcG9pbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnT2RpZ29zIGRlc3RpbmF0aW9uIHNldHMgYm90aCBgZW5kcG9pbnRgIChPVExQL2dSUEMpIGFuZCBgaHR0cEVuZHBvaW50YCAoT1RMUC9IVFRQKTsgJyArXG4gICAgICAgICd0aGV5IHNlbGVjdCBkaWZmZXJlbnQgY29sbGVjdG9yIGV4cG9ydGVycywgc28gZXhhY3RseSBvbmUgbXVzdCBiZSBzZXQuJyxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZXhwb3J0ZXIgPSByZW5kZXJFeHBvcnRlcihkZXN0KTtcbiAgY29uc3QgcGlwZWxpbmVzID0gcmVuZGVyUGlwZWxpbmVzKGRlc3QsIGV4cG9ydGVyTmFtZUZvcihkZXN0KSk7XG4gIGlmIChwaXBlbGluZXMgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ09kaWdvcyBkZXN0aW5hdGlvbiBhY2NlcHRzIG5vIHRlbGVtZXRyeSBzaWduYWxzICh0cmFjZXMsIG1ldHJpY3MgYW5kIGxvZ3MgYXJlIGFsbCBmYWxzZSksICcgK1xuICAgICAgICAnc28gdGhlIGNvbGxlY3RvciB3b3VsZCBoYXZlIG5vIHBpcGVsaW5lIHRvIGJ1aWxkIGFuZCB3b3VsZCBmYWlsIHRvIHN0YXJ0LicsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgQ09MTEVDVE9SX0NPTkZJR19TQ0hFTUUgK1xuICAgICd7cmVjZWl2ZXJzOiB7b3RscDoge3Byb3RvY29sczogJyArXG4gICAgLy8gQm91bmQgdG8gbG9jYWxob3N0OiB0aGUgcmVjZWl2ZXIgZXhpc3RzIG9ubHkgZm9yIHRoZSBpbi1wcm9jZXNzIFNESy4gQmluZGluZyBpdCB3aWRlciB3b3VsZCBleHBvc2VcbiAgICAvLyBhbiB1bmF1dGhlbnRpY2F0ZWQgT1RMUCBlbmRwb2ludCBvbiB0aGUgc2FuZGJveCdzIG5ldHdvcmsgaW50ZXJmYWNlLlxuICAgICd7Z3JwYzoge2VuZHBvaW50OiBcImxvY2FsaG9zdDo0MzE3XCJ9LCBodHRwOiB7ZW5kcG9pbnQ6IFwibG9jYWxob3N0OjQzMThcIn19fX0sICcgK1xuICAgICdwcm9jZXNzb3JzOiAnICtcbiAgICBDT0xMRUNUT1JfUFJPQ0VTU09SUyArXG4gICAgJywgZXhwb3J0ZXJzOiAnICtcbiAgICBleHBvcnRlciArXG4gICAgJywgc2VydmljZToge3RlbGVtZXRyeToge21ldHJpY3M6IHtsZXZlbDogbm9uZX19LCBwaXBlbGluZXM6ICcgK1xuICAgIHBpcGVsaW5lcyArXG4gICAgJ319J1xuICApO1xufVxuIl19
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdG9yLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb2xsZWN0b3ItY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTBFQSxzQ0FFQztBQW1CRCwwQ0FFQztBQXdFRCxrREFFQztBQU9ELHNEQWdEQztBQWhPRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFFSDs7Ozs7O0dBTUc7QUFDVSxRQUFBLHdCQUF3QixHQUFHLG9DQUFvQyxDQUFDO0FBRTdFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQztBQUV4Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sb0JBQW9CLEdBQ3hCLDJGQUEyRjtJQUMzRixnRUFBZ0UsQ0FBQztBQUVuRSxpRUFBaUU7QUFDcEQsUUFBQSxhQUFhLEdBQUcsTUFBTSxDQUFDO0FBRXBDLHFGQUFxRjtBQUN4RSxRQUFBLG1CQUFtQixHQUFHLHNCQUFzQixDQUFDO0FBQzdDLFFBQUEsb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFDL0MsUUFBQSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztBQUV0RCxxREFBcUQ7QUFDckQsU0FBZ0IsYUFBYSxDQUFDLEtBQTBCO0lBQ3RELE9BQU8sS0FBSyxLQUFLLEtBQUssQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsVUFBVSxDQUFDLENBQVM7SUFDM0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLElBQXVCO0lBQ3JELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxPQUFtQztJQUN4RCxJQUFJLENBQUMs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dUdBQXVHO0lBQ3ZHLG9DQUFvQztJQUNwQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLElBQUksS0FBSyxDQUNiLHVDQUF1QyxJQUFJLENBQUMsUUFBUSxnREFBZ0Q7WUFDbEcscUVBQXFFLENBQ3hFLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNqRSxNQUFNLElBQUksS0FBSyxDQUNiLDJDQUEyQyxJQUFJLENBQUMsWUFBWSx3Q0FBd0M7WUFDbEcsdUZBQXVGLENBQzFGLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDL0QsSUFBSSxTQUFTLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDckIsTUFBTSxJQUFJLEtBQUssQ0FDYiw0RkFBNEY7WUFDMUYsMkVBQTJFLENBQzlFLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxDQUNMLHVCQUF1QjtRQUN2QixpQ0FBaUM7UUFDakMscUdBQXFHO1FBQ3JHLHVFQUF1RTtRQUN2RSw4RUFBOEU7UUFDOUUsY0FBYztRQUNkLG9CQUFvQjtRQUNwQixlQUFlO1FBQ2YsUUFBUTtRQUNSLDhEQUE4RDtRQUM5RCxTQUFTO1FBQ1QsSUFBSSxDQUNMLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2RpZ29zRGVzdGluYXRpb24gfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBpbi1MYW1iZGEgY29sbGVjdG9yJ3MgY29tcGxldGUgY29uZmlndXJhdGlvbiBhcyBhbiBpbmxpbmVcbiAqIGBPUEVOVEVMRU1FVFJZX0NPTExFQ1RPUl9DT05GSUdfVVJJYCB2YWx1ZS5cbiAqXG4gKiBUaGlzIGlzIGEgUE9SVCBvZiBgcmVuZGVyQ29sbGVjdG9yQ29uZmlnYCBpbiB0aGUgY29ubmVjdG9yXG4gKiAoY29ubmVjdG9ycy9wcm92aWRlcnMvYXdzL3BrZy93b3JrbG9hZC9pbnN0cnVtZW50b3IvY29sbGVjdG9yX2NvbmZpZy5nbykgYW5kIGlzIGRlbGliZXJhdGVseVxuICogYnl0ZS1mb3ItYnl0ZSBjb21wYXRpYmxlIHdpdGggaXQuIFRoYXQgZXF1aXZhbGVuY2UgaXMgbm90IGNvc21ldGljOiBhIGZ1bmN0aW9uIGluc3RydW1lbnRlZCBoZXJlIGFuZFxuICogbGF0ZXIgZW5hYmxlZCBhcyBhIGNvbm5lY3RvciBzb3VyY2UgaXMgY29tcGFyZWQgYWdhaW5zdCB0aGUgY29ubmVjdG9yJ3MgcmVuZGVyaW5nIHRvIGRlY2lkZSB3aGV0aGVyIGl0XG4gKiBuZWVkcyBjb252ZXJnaW5nLiBBIHN0cmF5IHNwYWNlIHdvdWxkIG1ha2UgZXZlcnkgcmVjb25jaWxlIHNlZSBkcmlmdCBhbmQgY2h1cm4gYSBuZXcgZnVuY3Rpb24gdmVyc2lvblxuICogZm9yZXZlci5cbiAqXG4gKiBXSFkgVEhFIFdIT0xFIERPQ1VNRU5ULCBSQVRIRVIgVEhBTiBBIEZFVyBWQVJJQUJMRVMuIFRoZSBsYXllciBzaGlwcyBhIGJha2VkXG4gKiAvb3B0L2NvbGxlY3Rvci1jb25maWcvY29uZmlnLnlhbWwsIGJ1dCB0aGF0IGZpbGUgaXMgT05FIGRvY3VtZW50IHNoYXJlZCBieSBldmVyeSBmdW5jdGlvbiwgc28gaXQgY2FuXG4gKiBvbmx5IHJlYWNoIGEgZGVzdGluYXRpb24gdGhyb3VnaCBlbnYgaW5kaXJlY3Rpb24g4oCUIGAke2VudjpTT01FVEhJTkd9YC4gVGhhdCBtYWRlIHRocmVlIHRoaW5nc1xuICogaW1wb3NzaWJsZSBhdCBvbmNlOlxuICpcbiAqICAgLSBBVVRILiBBIGNyZWRlbnRpYWwgaXMgYSBoZWFkZXJzIG1hcCwgbm90IGEgc2NhbGFyLiBBIGJha2VkIGZpbGUgY2FuIHN1YnN0aXR1dGUgYSB2YWx1ZSBidXQgY2Fubm90XG4gKiAgICAgY29uZGl0aW9uYWxseSBncm93IGEgYGhlYWRlcnM6YCBibG9jaywgc28gYW4gYXV0aGVudGljYXRlZCBkZXN0aW5hdGlvbiB3YXMgdW5yZWFjaGFibGUuXG4gKiAgIC0gT1RMUC9IVFRQIERFU1RJTkFUSU9OUy4gVGhlIGJha2VkIGZpbGUgaGFyZGNvZGVzIGEgZ1JQQyBgb3RscGAgZXhwb3J0ZXIuIEFuIG90bHBodHRwLW9ubHlcbiAqICAgICBkZXN0aW5hdGlvbiByZXNvbHZlcyB3aXRoIGFuIGVtcHR5IGdSUEMgZW5kcG9pbnQsIGFuZCB0aGUgY29sbGVjdG9yIGRvZXMgbm90IGRlZ3JhZGUg4oCUIGl0IGZhaWxzIHRvXG4gKiAgICAgYnVpbGQgdGhlIHBpcGVsaW5lIGFuZCBleGl0cywgc28gdGhlIGZ1bmN0aW9uIGlzIGluc3RydW1lbnRlZCwgbG9va3MgaGVhbHRoeSwgYW5kIGV4cG9ydHMgbm90aGluZy5cbiAqICAgLSBQRVItU0lHTkFMIFBJUEVMSU5FUy4gVGhlIGJha2VkIGZpbGUgZGVjbGFyZXMgYWxsIHRocmVlIHBpcGVsaW5lcyB1bmNvbmRpdGlvbmFsbHksIHNvIGEgc2lnbmFsIHRoZVxuICogICAgIGRlc3RpbmF0aW9uIGRvZXMgbm90IGFjY2VwdCBpcyByZWNlaXZlZCBhbmQgdGhlbiBmYWlscyBvbiBleHBvcnQgcmF0aGVyIHRoYW4gbmV2ZXIgYmVpbmcgYnVpbHQuXG4gKlxuICogRkxPVyBTVFlMRSBJUyBMT0FELUJFQVJJTkcuIFRoZSBkb2N1bWVudCBpcyBlbWl0dGVkIG9uIGEgc2luZ2xlIGxpbmUgYmVjYXVzZSBpdCBoYXMgdG8gc3Vydml2ZSBhcyBhblxuICogZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUuIEluIGEgWUFNTCBmbG93IG1hcHBpbmcgYSBjb2xvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIG9yIHRoZSBwYXJzZXJcbiAqIHJlYWRzIGBhOmJgIGFzIHRoZSBwbGFpbiBzY2FsYXIgYFwiYTpiXCJgIHJhdGhlciB0aGFuIGEgbWFwcGluZy4gV3JpdHRlbiB3aXRob3V0IHRoZSBzcGFjZXMgdGhlIGNvbGxlY3RvclxuICogYWNjZXB0cyB0aGUgdmFyaWFibGUsIHJlcG9ydHMgdGhlIFVSSSBpdCByZWFkLCBhbmQgdGhlbiBmYWlscyB0byBzdGFydCB3aXRoIGEgYmFyZVxuICogYG90ZWxjb2wgc3RhdGUgaXMgQ2xvc2VkYCDigJQgbm8gcGFyc2UgZXJyb3IsIG5vIG1lbnRpb24gb2YgdGhlIGNvbmZpZy4gRXZlcnkgYDogYCBiZWxvdyBlYXJucyBpdHMgcGxhY2UuXG4gKi9cblxuLyoqXG4gKiBUaGUgY29sbGVjdG9yIGxheWVyJ3Mgb3duIGNvbmZpZy1zb3VyY2UgdmFyaWFibGUg4oCUIHVwc3RyZWFtJ3MgbmFtZSwgbm90IG91cnMuIFBvaW50ZWQgYXQgYSBgeWFtbDpgIFVSSVxuICogaXQgY2FycmllcyB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24gaW5saW5lLCBzbyBubyBzZWNvbmQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIGhvbGQgaXQuXG4gKlxuICogVXBzdHJlYW0gYWxzbyByZWFkcyB0aGUgb2xkZXIgYE9QRU5URUxFTUVUUllfQ09MTEVDVE9SX0NPTkZJR19GSUxFYCBhbmQgbG9ncyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgZm9yXG4gKiBpdDsgdGhpcyBpcyB0aGUgY3VycmVudCBuYW1lLlxuICovXG5leHBvcnQgY29uc3QgRU5WX0NPTExFQ1RPUl9DT05GSUdfVVJJID0gJ09QRU5URUxFTUVUUllfQ09MTEVDVE9SX0NPTkZJR19VUkknO1xuXG4vKipcbiAqIFRoZSBjb25mbWFwIHByb3ZpZGVyIHRoYXQgcmVhZHMgYSBjb25maWd1cmF0aW9uIG91dCBvZiB0aGUgVVJJIGl0c2VsZi4gVGhlIGNvbGxlY3RvciByZWdpc3RlcnNcbiAqIGVudi9maWxlL3lhbWwvaHR0cC9odHRwcy9zMyBwcm92aWRlcnM7IGB5YW1sOmAgaXMgdGhlIG9ubHkgb25lIHRoYXQgbmVlZHMgbm8gc2Vjb25kIHZhcmlhYmxlIGFuZCBub1xuICogbmV0d29yayByZWFkIG9uIGEgY29sZCBzdGFydC5cbiAqL1xuY29uc3QgQ09MTEVDVE9SX0NPTkZJR19TQ0hFTUUgPSAneWFtbDonO1xuXG4vKipcbiAqIE1pcnJvcnMgdGhlIGJha2VkIGNvbmZpZydzIHByb2Nlc3NvciBzZXQsIGFuZCB0aGUgT1JERVIgaXMgdGhlIGNvbnRyYWN0OlxuICpcbiAqICAgLSBgbWVtb3J5X2xpbWl0ZXJgIGZpcnN0LCBzbyBhbiBleHBvcnQgYmFja2xvZyBpcyBzaGVkIGJlZm9yZSBpdCBpcyBjaGFyZ2VkIHRvIHRoZSBzYW1lIG1lbW9yeSBidWRnZXRcbiAqICAgICB0aGUgY3VzdG9tZXIncyBoYW5kbGVyIGFsbG9jYXRlcyBmcm9tLiBQZXJjZW50YWdlcywgbm90IGBsaW1pdF9taWJgLCBiZWNhdXNlIG9uZSBsYXllciBzZXJ2ZXNcbiAqICAgICBmdW5jdGlvbnMgZnJvbSAxMjhNQiB0byAxMEdCLlxuICogICAtIGBkZWNvdXBsZWAgTEFTVC4gTGFtYmRhIGZyZWV6ZXMgdGhlIHNhbmRib3ggb25jZSB0aGUgaGFuZGxlciByZXR1cm5zIGFuZCBldmVyeSBleHRlbnNpb24gaGFzIGNhbGxlZFxuICogICAgIC9uZXh0OyBhIGZyb3plbiBzYW5kYm94IHJ1bnMgbm8gdGltZXJzLCBzbyBhIGJhdGNoIHNpdHRpbmcgYmVoaW5kIGl0cyB0aW1lb3V0IGlzIGZsdXNoZWQgb24gYSBsYXRlclxuICogICAgIGludm9jYXRpb24gb3IgZHJvcHBlZCB3aGVuIHRoZSBzYW5kYm94IGlzIHJlYXBlZC4gYGRlY291cGxlYCBhY2tub3dsZWRnZXMgdGhlIHJlY2VpdmUgcGF0aFxuICogICAgIGltbWVkaWF0ZWx5IGFuZCB0cmFja3MgaW4tZmxpZ2h0IGV4cG9ydHMsIHdoaWNoIGlzIHdoYXQgbGV0cyB0aGUgZXh0ZW5zaW9uIGhvbGQgL25leHQgb3BlbiB1bnRpbCB0aGVcbiAqICAgICBxdWV1ZSBkcmFpbnMg4oCUIGFmdGVyIHRoZSBjYWxsZXIgYWxyZWFkeSBoYXMgaXRzIHJlc3BvbnNlLlxuICovXG5jb25zdCBDT0xMRUNUT1JfUFJPQ0VTU09SUyA9XG4gICd7bWVtb3J5X2xpbWl0ZXI6IHtjaGVja19pbnRlcnZhbDogMXMsIGxpbWl0X3BlcmNlbnRhZ2U6IDUwLCBzcGlrZV9saW1pdF9wZXJjZW50YWdlOiAyMH0sICcgK1xuICAnYmF0Y2g6IHtzZW5kX2JhdGNoX3NpemU6IDUxMiwgdGltZW91dDogMjAwbXN9LCBkZWNvdXBsZTogbnVsbH0nO1xuXG4vKiogVmFsdWUgYW4gdW5zdXBwb3J0ZWQgc2lnbmFsJ3MgYE9URUxfKl9FWFBPUlRFUmAgaXMgc2V0IHRvLiAqL1xuZXhwb3J0IGNvbnN0IEVYUE9SVEVSX05PTkUgPSAnbm9uZSc7XG5cbi8qKiBUaGUgdGhyZWUgYE9URUxfKl9FWFBPUlRFUmAgdmFyaWFibGVzLCBpbiB0aGUgb3JkZXIgdGhlIGNvbm5lY3RvciB3cml0ZXMgdGhlbS4gKi9cbmV4cG9ydCBjb25zdCBFTlZfVFJBQ0VTX0VYUE9SVEVSID0gJ09URUxfVFJBQ0VTX0VYUE9SVEVSJztcbmV4cG9ydCBjb25zdCBFTlZfTUVUUklDU19FWFBPUlRFUiA9ICdPVEVMX01FVFJJQ1NfRVhQT1JURVInO1xuZXhwb3J0IGNvbnN0IEVOVl9MT0dTX0VYUE9SVEVSID0gJ09URUxfTE9HU19FWFBPUlRFUic7XG5cbi8qKiBXaGV0aGVyIGEgc2lnbmFsIGlzIGVuYWJsZWQsIGRlZmF1bHRpbmcgdG8gb24uICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsRW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT09IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBkb3VibGUtcXVvdGVkIFlBTUwgc2NhbGFyLlxuICpcbiAqIFF1b3RpbmcgdW5jb25kaXRpb25hbGx5IGlzIHdoYXQga2VlcHMgYSB2YWx1ZSBzdWNoIGFzIGEgYmFyZSBgaG9zdDo0MzE3YCBmcm9tIGJlaW5nIHJlLXJlYWQgYXMgYSBuZXN0ZWRcbiAqIG1hcHBpbmcgaW4gZmxvdyBjb250ZXh0LiBgSlNPTi5zdHJpbmdpZnlgIGlzIHRoZSBUeXBlU2NyaXB0IGVxdWl2YWxlbnQgb2YgdGhlIGNvbm5lY3RvcidzXG4gKiBgc3RyY29udi5RdW90ZWAgZm9yIHRoZSB2b2NhYnVsYXJ5IHRoYXQgbWF0dGVycyBoZXJlIChgXFxcImAgYW5kIGBcXFxcYCk7IGJvdGggcHJvZHVjZSB0aGUgc2FtZSBvdXRwdXQgZm9yXG4gKiB0aGUgQVNDSUkgZW5kcG9pbnRzLCBoZWFkZXIgbmFtZXMgYW5kIGNyZWRlbnRpYWxzIHRoaXMgZXZlciBzZWVzLlxuICovXG5mdW5jdGlvbiB5YW1sU3RyaW5nKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgZXhwb3J0ZXIgYnkgdGhlIHRyYW5zcG9ydCB0aGUgZGVzdGluYXRpb24gY29uZmlndXJlZC4gQSBkZXN0aW5hdGlvbiBjYXJyaWVzIGEgZ1JQQyBlbmRwb2ludFxuICogKHR5cGUgYG90bHBgKSBvciBhbiBPVExQL0hUVFAgb25lICh0eXBlIGBvdGxwaHR0cGApOyB0aGUgdHdvIGFyZSBkaWZmZXJlbnQgY29sbGVjdG9yIGNvbXBvbmVudHMgd2l0aFxuICogZGlmZmVyZW50IGVuZHBvaW50IGdyYW1tYXJzLCBzbyB0aGlzIGlzIGEgZ2VudWluZSBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRlck5hbWVGb3IoZGVzdDogT2RpZ29zRGVzdGluYXRpb24pOiBzdHJpbmcge1xuICByZXR1cm4gZGVzdC5lbmRwb2ludCA/ICdvdGxwJyA6ICdvdGxwaHR0cCc7XG59XG5cbi8qKlxuICogRW1pdHMgdGhlIGRlc3RpbmF0aW9uJ3MgcGVyLXJlcXVlc3QgaGVhZGVycyDigJQgaW4gcHJhY3RpY2UgaXRzIGNyZWRlbnRpYWwuIEVtcHR5IHdoZW4gdGhlIGRlc3RpbmF0aW9uXG4gKiBuZWVkcyBub25lLCBzbyBubyBoZWFkZXIgYmxvY2sgaXMgd3JpdHRlbiBhdCBhbGwgcmF0aGVyIHRoYW4gYW4gZW1wdHkgb25lLlxuICpcbiAqIEtleXMgYXJlIHNvcnRlZCBzbyB0aGUgcmVuZGVyZWQgY29uZmlnIGlzIGJ5dGUtaWRlbnRpY2FsIGFjcm9zcyBzeW50aHMuIFRoZSBzdHJpbmcgaXMgY29tcGFyZWQgYWdhaW5zdFxuICogdGhlIGxpdmUgZnVuY3Rpb24ncyBlbnZpcm9ubWVudCB0byBkZWNpZGUgd2hldGhlciBhbiB1cGRhdGUgaXMgbmVlZGVkLCBhbmQgbWFwIG9yZGVyIHdvdWxkIG90aGVyd2lzZVxuICogbWFrZSBldmVyeSBkZXBsb3kgbG9vayBsaWtlIGEgY2hhbmdlLlxuICovXG5mdW5jdGlvbiByZW5kZXJIZWFkZXJzKGhlYWRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgaWYgKCFoZWFkZXJzKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKS5zb3J0KCk7XG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCByZW5kZXJlZCA9IGtleXMubWFwKChrKSA9PiBgJHt5YW1sU3RyaW5nKGspfTogJHt5YW1sU3RyaW5nKGhlYWRlcnNba10pfWApLmpvaW4oJywgJyk7XG4gIHJldHVybiBgLCBoZWFkZXJzOiB7JHtyZW5kZXJlZH19YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyRXhwb3J0ZXIoZGVzdDogT2RpZ29zRGVzdGluYXRpb24pOiBzdHJpbmcge1xuICBsZXQgb3V0OiBzdHJpbmc7XG4gIGlmIChkZXN0LmVuZHBvaW50KSB7XG4gICAgLy8gdGxzLmluc2VjdXJlIGFwcGxpZXMgdG8gdGhlIGdSUEMgZXhwb3J0ZXIgb25seTsgdGhlIEhUVFAgZXhwb3J0ZXIgdGFrZXMgdGhlIHNjaGVtZSBmcm9tIHRoZSBVUkwuXG4gICAgb3V0ID0gYHtvdGxwOiB7ZW5kcG9pbnQ6ICR7eWFtbFN0cmluZyhkZXN0LmVuZHBvaW50KX0sIHRsczoge2luc2VjdXJlOiAke2Rlc3QuaW5zZWN1cmUgPT09IHRydWV9fWA7XG4gIH0gZWxzZSBpZiAoZGVzdC5odHRwRW5kcG9pbnQpIHtcbiAgICBvdXQgPSBge290bHBodHRwOiB7ZW5kcG9pbnQ6ICR7eWFtbFN0cmluZyhkZXN0Lmh0dHBFbmRwb2ludCl9YDtcbiAgfSBlbHNlIHtcbiAgICAvLyBSZWFjaGVkIHdoZW4gYSBkZXN0aW5hdGlvbiBjYXJyaWVzIG5laXRoZXIgdHJhbnNwb3J0LiBGYWlsaW5nIGhlcmUgaXMgdGhlIHdob2xlIHBvaW50OiB0aGVcbiAgICAvLyBhbHRlcm5hdGl2ZSBpcyBhIGNvbGxlY3RvciB0aGF0IGV4aXRzIG9uIHN0YXJ0dXAgd2hpbGUgdGhlIGZ1bmN0aW9uIGlzIHJlcG9ydGVkIGhlYWx0aHkuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ09kaWdvcyBkZXN0aW5hdGlvbiBoYXMgbmVpdGhlciBgZW5kcG9pbnRgIChPVExQL2dSUEMpIG5vciBgaHR0cEVuZHBvaW50YCAoT1RMUC9IVFRQKSwgJyArXG4gICAgICAgICdzbyB0aGUgaW4tTGFtYmRhIGNvbGxlY3RvciB3b3VsZCBoYXZlIG5vd2hlcmUgdG8gZXhwb3J0LicsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYCR7b3V0fSR7cmVuZGVySGVhZGVycyhkZXN0LmhlYWRlcnMpfX19YDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBwaXBlbGluZSBvbmx5IGZvciB0aGUgc2lnbmFscyB0aGUgZGVzdGluYXRpb24gYWNjZXB0cy4gQSBzaWduYWwgd2l0aCBubyBwaXBlbGluZSBpcyByZWZ1c2VkIGF0XG4gKiB0aGUgcmVjZWl2ZXIsIHdoaWNoIGlzIHRoZSBiZWhhdmlvdXIgd2Ugd2FudDogdGhlIFNESyBpcyB0b2xkIG5vdCB0byBwcm9kdWNlIGl0IGVpdGhlciAoc2VlXG4gKiBgZXhwb3J0ZXJPdmVycmlkZUZvcmApLCBhbmQgdGhlIHR3byB0b2dldGhlciBtZWFuIGFuIHVuYWNjZXB0ZWQgc2lnbmFsIGlzIG5ldmVyIGdlbmVyYXRlZCwgbmV2ZXJcbiAqIGV4cG9ydGVkLCBhbmQgbmV2ZXIgYSBwZXItYmF0Y2ggZXJyb3IgYWdhaW5zdCBhIGJhY2tlbmQgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclBpcGVsaW5lcyhkZXN0OiBPZGlnb3NEZXN0aW5hdGlvbiwgZXhwb3J0ZXJOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2lnbmFsczogQXJyYXk8W3N0cmluZywgYm9vbGVhbl0+ID0gW1xuICAgIFsndHJhY2VzJywgc2lnbmFsRW5hYmxlZChkZXN0LnRyYWNlcyldLFxuICAgIFsnbWV0cmljcycsIHNpZ25hbEVuYWJsZWQoZGVzdC5tZXRyaWNzKV0sXG4gICAgWydsb2dzJywgc2lnbmFsRW5hYmxlZChkZXN0LmxvZ3MpXSxcbiAgXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgZW5hYmxlZF0gb2Ygc2lnbmFscykge1xuICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBgJHtuYW1lfToge3JlY2VpdmVyczogW290bHBdLCBwcm9jZXNzb3JzOiBbbWVtb3J5X2xpbWl0ZXIsIGJhdGNoLCBkZWNvdXBsZV0sIGV4cG9ydGVyczogWyR7ZXhwb3J0ZXJOYW1lfV19YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPT09IDAgPyAnJyA6IGB7JHtwYXJ0cy5qb2luKCcsICcpfX1gO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHZhbHVlIGEgc2lnbmFsJ3MgYE9URUxfKl9FWFBPUlRFUmAgbXVzdCBob2xkOiBgbm9uZWAgdG8gc3VwcHJlc3MgYSBzaWduYWwgdGhlIGRlc3RpbmF0aW9uXG4gKiBkb2VzIG5vdCBhY2NlcHQsIG9yIGB1bmRlZmluZWRgIG1lYW5pbmcgdGhlIHZhcmlhYmxlIG11c3QgYmUgQUJTRU5UIGJlY2F1c2UgdGhlIFNESydzIG93biBkZWZhdWx0IGlzXG4gKiBhbHJlYWR5IHdoYXQgd2Ugd2FudC5cbiAqXG4gKiBPbmx5IHRoZSBcIm5vbmVcIiBzaWRlIGlzIHdyaXR0ZW4sIGJlY2F1c2UgYG90bHBgIGlzIGFscmVhZHkgZXZlcnkgT3BlblRlbGVtZXRyeSBTREsncyBkZWZhdWx0IGZvciBhbGxcbiAqIHRocmVlIHNpZ25hbHMg4oCUIHNldHRpbmcgaXQgd291bGQgcmVzdGF0ZSB0aGUgZGVmYXVsdCBpbiB0aHJlZSB2YXJpYWJsZXMgb24gZXZlcnkgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRlck92ZXJyaWRlRm9yKHN1cHBvcnRlZDogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzdXBwb3J0ZWQgPyB1bmRlZmluZWQgOiBFWFBPUlRFUl9OT05FO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgdGhlIGNvbXBsZXRlIGNvbGxlY3RvciBjb25maWd1cmF0aW9uIGZvciBvbmUgZGVzdGluYXRpb24uXG4gKlxuICogQHRocm93cyBpZiB0aGUgZGVzdGluYXRpb24gbmFtZXMgbmVpdGhlciB0cmFuc3BvcnQsIGJvdGggdHJhbnNwb3J0cywgb3Igbm8gc2lnbmFscyBhdCBhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJDb2xsZWN0b3JDb25maWcoZGVzdDogT2RpZ29zRGVzdGluYXRpb24pOiBzdHJpbmcge1xuICBpZiAoZGVzdC5lbmRwb2ludCAmJiBkZXN0Lmh0dHBFbmRwb2ludCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdPZGlnb3MgZGVzdGluYXRpb24gc2V0cyBib3RoIGBlbmRwb2ludGAgKE9UTFAvZ1JQQykgYW5kIGBodHRwRW5kcG9pbnRgIChPVExQL0hUVFApOyAnICtcbiAgICAgICAgJ3RoZXkgc2VsZWN0IGRpZmZlcmVudCBjb2xsZWN0b3IgZXhwb3J0ZXJzLCBzbyBleGFjdGx5IG9uZSBtdXN0IGJlIHNldC4nLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgdHdvIGZpZWxkcyBoYXZlIGRpZmZlcmVudCBlbmRwb2ludCBHUkFNTUFSUywgYW5kIGdldHRpbmcgdGhlbSB3cm9uZyBpcyB0aGUgd29yc3QgZmFpbHVyZSBtb2RlIHRoaXNcbiAgLy8gcGFja2FnZSBoYXM6IHRoZSBjb2xsZWN0b3IgYWNjZXB0cyB0aGUgY29uZmlndXJhdGlvbiwgZmFpbHMgdG8gYnVpbGQgaXRzIGV4cG9ydGVyLCBhbmQgZXhpdHMg4oCUIGxlYXZpbmdcbiAgLy8gdGhlIGZ1bmN0aW9uIGluc3RydW1lbnRlZCwgcmVwb3J0aW5nIGhlYWx0aHksIGFuZCBleHBvcnRpbmcgbm90aGluZy4gQm90aCBjaGVja3MgYXJlIHRoZXJlZm9yZSBzeW50aFxuICAvLyBlcnJvcnMgcmF0aGVyIHRoYW4gZG9jdW1lbnRhdGlvbi5cbiAgaWYgKGRlc3QuZW5kcG9pbnQgJiYgZGVzdC5lbmRwb2ludC5pbmNsdWRlcygnOi8vJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zIGRlc3RpbmF0aW9uIFxcYGVuZHBvaW50XFxgIGlzIFwiJHtkZXN0LmVuZHBvaW50fVwiLCBidXQgdGhlIGdSUEMgZXhwb3J0ZXIgdGFrZXMgaG9zdDpwb3J0IHdpdGggYCArXG4gICAgICAgICdubyBzY2hlbWUuIFVzZSBgaHR0cEVuZHBvaW50YCBmb3IgYSBzY2hlbWUtcXVhbGlmaWVkIE9UTFAvSFRUUCBVUkwuJyxcbiAgICApO1xuICB9XG4gIGlmIChkZXN0Lmh0dHBFbmRwb2ludCAmJiAhL15odHRwcz86XFwvXFwvLy50ZXN0KGRlc3QuaHR0cEVuZHBvaW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBPZGlnb3MgZGVzdGluYXRpb24gXFxgaHR0cEVuZHBvaW50XFxgIGlzIFwiJHtkZXN0Lmh0dHBFbmRwb2ludH1cIiwgYnV0IHRoZSBPVExQL0hUVFAgZXhwb3J0ZXIgdGFrZXMgYSBgICtcbiAgICAgICAgJ3NjaGVtZS1xdWFsaWZpZWQgVVJMIChodHRwOi8vIG9yIGh0dHBzOi8vKS4gVXNlIGBlbmRwb2ludGAgZm9yIGEgYmFyZSBnUlBDIGhvc3Q6cG9ydC4nLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBleHBvcnRlciA9IHJlbmRlckV4cG9ydGVyKGRlc3QpO1xuICBjb25zdCBwaXBlbGluZXMgPSByZW5kZXJQaXBlbGluZXMoZGVzdCwgZXhwb3J0ZXJOYW1lRm9yKGRlc3QpKTtcbiAgaWYgKHBpcGVsaW5lcyA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnT2RpZ29zIGRlc3RpbmF0aW9uIGFjY2VwdHMgbm8gdGVsZW1ldHJ5IHNpZ25hbHMgKHRyYWNlcywgbWV0cmljcyBhbmQgbG9ncyBhcmUgYWxsIGZhbHNlKSwgJyArXG4gICAgICAgICdzbyB0aGUgY29sbGVjdG9yIHdvdWxkIGhhdmUgbm8gcGlwZWxpbmUgdG8gYnVpbGQgYW5kIHdvdWxkIGZhaWwgdG8gc3RhcnQuJyxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBDT0xMRUNUT1JfQ09ORklHX1NDSEVNRSArXG4gICAgJ3tyZWNlaXZlcnM6IHtvdGxwOiB7cHJvdG9jb2xzOiAnICtcbiAgICAvLyBCb3VuZCB0byBsb2NhbGhvc3Q6IHRoZSByZWNlaXZlciBleGlzdHMgb25seSBmb3IgdGhlIGluLXByb2Nlc3MgU0RLLiBCaW5kaW5nIGl0IHdpZGVyIHdvdWxkIGV4cG9zZVxuICAgIC8vIGFuIHVuYXV0aGVudGljYXRlZCBPVExQIGVuZHBvaW50IG9uIHRoZSBzYW5kYm94J3MgbmV0d29yayBpbnRlcmZhY2UuXG4gICAgJ3tncnBjOiB7ZW5kcG9pbnQ6IFwibG9jYWxob3N0OjQzMTdcIn0sIGh0dHA6IHtlbmRwb2ludDogXCJsb2NhbGhvc3Q6NDMxOFwifX19fSwgJyArXG4gICAgJ3Byb2Nlc3NvcnM6ICcgK1xuICAgIENPTExFQ1RPUl9QUk9DRVNTT1JTICtcbiAgICAnLCBleHBvcnRlcnM6ICcgK1xuICAgIGV4cG9ydGVyICtcbiAgICAnLCBzZXJ2aWNlOiB7dGVsZW1ldHJ5OiB7bWV0cmljczoge2xldmVsOiBub25lfX0sIHBpcGVsaW5lczogJyArXG4gICAgcGlwZWxpbmVzICtcbiAgICAnfX0nXG4gICk7XG59XG4iXX0=
@@ -4,12 +4,12 @@
4
4
  * Produced by cdk/scripts/generate-layers.ts from artifacts.json and manifest/layers.json.
5
5
  * Run `npm run generate` (or `npm run build`) to refresh it.
6
6
  *
7
- * Odigos artifact version: (unreleased)
7
+ * Odigos artifact version: v0.0.11
8
8
  */
9
9
  /** Release this table was generated from. Empty before the first release. */
10
- export declare const ODIGOS_VERSION = "";
10
+ export declare const ODIGOS_VERSION = "v0.0.11";
11
11
  /** SAR semantic version matching ODIGOS_VERSION (no leading "v"). */
12
- export declare const SAR_SEMANTIC_VERSION = "";
12
+ export declare const SAR_SEMANTIC_VERSION = "0.0.11";
13
13
  /** Public layer ARNs, keyed "<region>/<language>/<architecture>". */
14
14
  export declare const LAYER_ARNS: {
15
15
  [key: string]: string;