@liflig/cdk 2.14.4 → 2.15.0
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/assets/pipeline-slack-notification-lambda/index.py +156 -46
- package/lib/cdk-pipelines/liflig-cdk-pipeline.d.ts +3 -1
- package/lib/cdk-pipelines/liflig-cdk-pipeline.js +11 -8
- package/lib/cdk-pipelines/slack-notification.d.ts +21 -6
- package/lib/cdk-pipelines/slack-notification.js +7 -9
- package/package.json +14 -14
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import logging
|
|
2
3
|
import os
|
|
4
|
+
import typing as t
|
|
3
5
|
from urllib.error import HTTPError, URLError
|
|
4
6
|
from urllib.parse import quote
|
|
5
7
|
from urllib.request import Request, urlopen
|
|
@@ -7,12 +9,12 @@ from urllib.request import Request, urlopen
|
|
|
7
9
|
import boto3
|
|
8
10
|
|
|
9
11
|
client = boto3.client("codepipeline")
|
|
12
|
+
s3 = boto3.client("s3")
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
ACCOUNT_GROUP_NAME = os.getenv("ACCOUNT_GROUP_NAME", None)
|
|
14
|
+
ACCOUNT_FRIENDLY_NAME = os.getenv("ACCOUNT_FRIENDLY_NAME", None)
|
|
13
15
|
SLACK_URL = os.getenv("SLACK_URL", None)
|
|
14
16
|
SLACK_CHANNEL = os.getenv("SLACK_CHANNEL", None)
|
|
15
|
-
|
|
17
|
+
NOTIFICATION_LEVEL = os.getenv("NOTIFICATION_LEVEL", "WARN")
|
|
16
18
|
|
|
17
19
|
# Example event:
|
|
18
20
|
#
|
|
@@ -35,10 +37,38 @@ ALWAYS_SHOW_SUCCEEDED = os.getenv("ALWAYS_SHOW_SUCCEEDED", "false") == "true"
|
|
|
35
37
|
# }
|
|
36
38
|
# }
|
|
37
39
|
|
|
40
|
+
STYLES = {
|
|
41
|
+
"FAILED": {"emoji_prefix": ":x:", "message_color": "#ff0000"},
|
|
42
|
+
"SUCCEEDED": {"emoji_prefix": ":white_check_mark:", "message_color": "#008000"},
|
|
43
|
+
"STARTED": {"emoji_prefix": ":rocket:", "message_color": "#00bfff"},
|
|
44
|
+
"SUPERSEDED": {"emoji_prefix": ":arrow_heading_down:", "message_color": "#373737"},
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class TriggerMetadataVcs(t.TypedDict):
|
|
49
|
+
branchName: str
|
|
50
|
+
commitAuthor: str
|
|
51
|
+
commitHash: str
|
|
52
|
+
repositoryName: str
|
|
53
|
+
repositoryOwner: str
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class TriggerMetadataCi(t.TypedDict):
|
|
57
|
+
type: t.Literal["JENKINS", "GITHUB_ACTIONS"]
|
|
58
|
+
triggeredBy: str
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class TriggerMetadata(t.TypedDict):
|
|
62
|
+
version: t.Literal["0.1"]
|
|
63
|
+
ci: TriggerMetadataCi
|
|
64
|
+
vcs: TriggerMetadataVcs
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def get_previous_pipeline_execution(
|
|
68
|
+
pipeline_name: str, execution_id: str
|
|
69
|
+
) -> dict | None:
|
|
70
|
+
"""Return the newest past execution that either succeeded or failed"""
|
|
38
71
|
|
|
39
|
-
def get_previous_pipeline_execution(pipeline_name, execution_id):
|
|
40
|
-
# Retrieves executions based on their start timestamp, so
|
|
41
|
-
# the previous execution will be next in list.
|
|
42
72
|
pipeline_executions = client.list_pipeline_executions(
|
|
43
73
|
pipelineName=pipeline_name,
|
|
44
74
|
)["pipelineExecutionSummaries"]
|
|
@@ -57,12 +87,15 @@ def get_previous_pipeline_execution(pipeline_name, execution_id):
|
|
|
57
87
|
return None
|
|
58
88
|
|
|
59
89
|
|
|
60
|
-
def
|
|
90
|
+
def get_text_for_failed(pipeline_name: str, execution_id: str, state: str) -> str:
|
|
91
|
+
"""Return a Slack-formatted string that describes failed pipeline execution actions,
|
|
92
|
+
if any, in a failed execution"""
|
|
93
|
+
|
|
61
94
|
# We only show details if the pipeline has completed with failed state.
|
|
62
95
|
# If we were to process this for other events such as started events,
|
|
63
96
|
# we would include details from after the event took place.
|
|
64
97
|
if state != "FAILED":
|
|
65
|
-
return
|
|
98
|
+
return ""
|
|
66
99
|
|
|
67
100
|
action_executions = client.list_action_executions(
|
|
68
101
|
pipelineName=pipeline_name,
|
|
@@ -71,7 +104,7 @@ def get_blocks_for_failed(pipeline_name, execution_id, state):
|
|
|
71
104
|
},
|
|
72
105
|
)["actionExecutionDetails"]
|
|
73
106
|
|
|
74
|
-
|
|
107
|
+
failures = []
|
|
75
108
|
|
|
76
109
|
for action_execution in action_executions:
|
|
77
110
|
if action_execution["status"] == "Failed":
|
|
@@ -80,32 +113,95 @@ def get_blocks_for_failed(pipeline_name, execution_id, state):
|
|
|
80
113
|
summary = action_execution["output"]["executionResult"][
|
|
81
114
|
"externalExecutionSummary"
|
|
82
115
|
]
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
},
|
|
90
|
-
}
|
|
91
|
-
)
|
|
116
|
+
failures.append(f"{stage}.{action} failed:\n{summary}")
|
|
117
|
+
|
|
118
|
+
result = ""
|
|
119
|
+
|
|
120
|
+
if len(failures):
|
|
121
|
+
result = "```\n" + "\n\n".join(failures) + "\n```"
|
|
92
122
|
|
|
93
123
|
return result
|
|
94
124
|
|
|
95
125
|
|
|
126
|
+
def get_metadata_from_trigger(
|
|
127
|
+
pipeline_name: str, execution_id: str
|
|
128
|
+
) -> TriggerMetadata | None:
|
|
129
|
+
"""Returns a dictionary containing the metadata, if any, stored in the trigger file"""
|
|
130
|
+
|
|
131
|
+
action_response = client.list_action_executions(
|
|
132
|
+
pipelineName=pipeline_name, filter={"pipelineExecutionId": execution_id}
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
action = next(
|
|
136
|
+
(
|
|
137
|
+
action
|
|
138
|
+
for action in action_response["actionExecutionDetails"]
|
|
139
|
+
if action["input"]["actionTypeId"]["category"] == "Source"
|
|
140
|
+
and action["input"]["actionTypeId"]["provider"] == "S3"
|
|
141
|
+
),
|
|
142
|
+
None,
|
|
143
|
+
)
|
|
144
|
+
if action:
|
|
145
|
+
s3_version_id = action["output"]["outputVariables"]["VersionId"]
|
|
146
|
+
artifacts_bucket = action["input"]["configuration"]["S3Bucket"]
|
|
147
|
+
trigger_file = action["input"]["configuration"]["S3ObjectKey"]
|
|
148
|
+
|
|
149
|
+
try:
|
|
150
|
+
response = s3.get_object(
|
|
151
|
+
Bucket=artifacts_bucket, Key=trigger_file, VersionId=s3_version_id
|
|
152
|
+
)
|
|
153
|
+
file_content = response["Body"].read().decode("utf-8")
|
|
154
|
+
ci_metadata = json.loads(file_content)
|
|
155
|
+
return ci_metadata
|
|
156
|
+
except Exception as e:
|
|
157
|
+
print(f"Could not obtain metadata from trigger file: {e}")
|
|
158
|
+
|
|
159
|
+
return None
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def get_footer_text(ci_metadata: TriggerMetadata) -> str:
|
|
163
|
+
"""Returns the footer text for the Slack message if the metadata contains the required fields"""
|
|
164
|
+
|
|
165
|
+
footer_text = ""
|
|
166
|
+
if ci_metadata and ci_metadata.get("version", "") == "0.1":
|
|
167
|
+
ci = ci_metadata.get("ci", {})
|
|
168
|
+
vcs = ci_metadata.get("vcs", {})
|
|
169
|
+
triggering_actor = ci.get("triggeredBy", "")
|
|
170
|
+
repository_owner = vcs.get("repositoryOwner", "")
|
|
171
|
+
repository_name = vcs.get("repositoryName", "")
|
|
172
|
+
short_commit_hash = vcs.get("commitHash", "")[:8]
|
|
173
|
+
branch_name = vcs.get("branchName", "")
|
|
174
|
+
if (
|
|
175
|
+
triggering_actor
|
|
176
|
+
and repository_owner
|
|
177
|
+
and repository_name
|
|
178
|
+
and short_commit_hash
|
|
179
|
+
and branch_name
|
|
180
|
+
):
|
|
181
|
+
commit_link_text = f"{repository_owner}/{repository_name} @ {branch_name} ({short_commit_hash})"
|
|
182
|
+
github_commit_link = f"https://github.com/{repository_owner}/{repository_name}/commit/{short_commit_hash}"
|
|
183
|
+
footer_text = f"Triggered by {triggering_actor} in <{github_commit_link}|{commit_link_text}>"
|
|
184
|
+
|
|
185
|
+
return footer_text
|
|
186
|
+
|
|
187
|
+
|
|
96
188
|
def handler(event, context):
|
|
97
|
-
print("Event: " + json.dumps(event))
|
|
98
189
|
|
|
99
|
-
|
|
100
|
-
print("Ignoring unknown event")
|
|
101
|
-
return
|
|
190
|
+
print("Event: " + json.dumps(event))
|
|
102
191
|
|
|
103
|
-
account = event["account"]
|
|
104
192
|
region = event["region"]
|
|
193
|
+
account_id = event["account"]
|
|
105
194
|
pipeline_name = event["detail"]["pipeline"]
|
|
106
195
|
state = event["detail"]["state"]
|
|
107
196
|
execution_id = event["detail"]["execution-id"]
|
|
108
197
|
|
|
198
|
+
if state in ("STARTED", "SUPERSEDED") and NOTIFICATION_LEVEL != "DEBUG":
|
|
199
|
+
return
|
|
200
|
+
|
|
201
|
+
if event["detail-type"] != "CodePipeline Pipeline Execution State Change":
|
|
202
|
+
print("Ignoring unknown event")
|
|
203
|
+
return
|
|
204
|
+
|
|
109
205
|
previous_pipeline_execution = get_previous_pipeline_execution(
|
|
110
206
|
pipeline_name, execution_id
|
|
111
207
|
)
|
|
@@ -117,49 +213,63 @@ def handler(event, context):
|
|
|
117
213
|
|
|
118
214
|
# We still show succeeded for the first event or when
|
|
119
215
|
# the previous execution was not success.
|
|
120
|
-
if state == "SUCCEEDED" and
|
|
216
|
+
if state == "SUCCEEDED" and (NOTIFICATION_LEVEL == "WARN"):
|
|
121
217
|
if previous_pipeline_execution is not None and not previous_failed:
|
|
122
218
|
print("Ignoring succeeded event")
|
|
123
219
|
return
|
|
124
220
|
|
|
125
|
-
emoji_prefix = ""
|
|
126
|
-
if state == "FAILED":
|
|
127
|
-
emoji_prefix = ":x: "
|
|
128
|
-
if state == "SUCCEEDED":
|
|
129
|
-
emoji_prefix = ":white_check_mark: "
|
|
130
|
-
|
|
131
221
|
pipeline_url = f"https://{region}.console.aws.amazon.com/codesuite/codepipeline/pipelines/{quote(pipeline_name, safe='')}/view"
|
|
132
222
|
execution_url = f"https://{region}.console.aws.amazon.com/codesuite/codepipeline/pipelines/{quote(pipeline_name, safe='')}/executions/{execution_id}/timeline"
|
|
133
223
|
|
|
134
|
-
|
|
135
|
-
if ACCOUNT_GROUP_NAME is not None:
|
|
136
|
-
account_group_text += f" ({ACCOUNT_GROUP_NAME})"
|
|
224
|
+
account_friendly_name = f"in {ACCOUNT_FRIENDLY_NAME or account_id}"
|
|
137
225
|
|
|
138
226
|
state_text = state
|
|
139
227
|
if previous_failed and state == "SUCCEEDED":
|
|
140
228
|
state_text += " (previously failed)"
|
|
141
229
|
|
|
142
|
-
|
|
230
|
+
ci_metadata = get_metadata_from_trigger(pipeline_name, execution_id)
|
|
231
|
+
|
|
232
|
+
footer_text = get_footer_text(ci_metadata)
|
|
143
233
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
234
|
+
style = STYLES.get(
|
|
235
|
+
state, {"emoji_prefix": ":question:", "message_color": "#ffdf00"}
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
emoji_prefix = style["emoji_prefix"]
|
|
239
|
+
message_color = style["message_color"]
|
|
240
|
+
|
|
241
|
+
text_for_failed = get_text_for_failed(pipeline_name, execution_id, state)
|
|
147
242
|
|
|
148
|
-
|
|
243
|
+
text = "\n".join(
|
|
244
|
+
s
|
|
245
|
+
for s in [f"*Execution:* <{execution_url}|{execution_id}>", text_for_failed]
|
|
246
|
+
if s
|
|
247
|
+
)
|
|
248
|
+
pretext = " ".join(
|
|
249
|
+
s
|
|
250
|
+
for s in [
|
|
251
|
+
f"{emoji_prefix} Pipeline *<{pipeline_url}|{pipeline_name}>*",
|
|
252
|
+
f"*{state_text}*",
|
|
253
|
+
account_friendly_name,
|
|
254
|
+
]
|
|
255
|
+
if s
|
|
256
|
+
)
|
|
257
|
+
fallback = f"Pipeline {pipeline_name} {state}"
|
|
258
|
+
attachments = [
|
|
149
259
|
{
|
|
150
|
-
"
|
|
151
|
-
"
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
260
|
+
"footer": footer_text,
|
|
261
|
+
"color": message_color,
|
|
262
|
+
"text": text,
|
|
263
|
+
"mrkdwn_in": ["text", "pretext"],
|
|
264
|
+
"pretext": pretext,
|
|
265
|
+
"fallback": fallback,
|
|
155
266
|
},
|
|
156
|
-
*blocks_for_failed,
|
|
157
267
|
]
|
|
158
268
|
|
|
159
269
|
slack_message = {
|
|
160
270
|
"channel": SLACK_CHANNEL,
|
|
161
|
-
"
|
|
162
|
-
"username": "
|
|
271
|
+
"attachments": attachments,
|
|
272
|
+
"username": "Liflig CDK Pipelines",
|
|
163
273
|
"icon_emoji": ":traffic_light:",
|
|
164
274
|
}
|
|
165
275
|
|
|
@@ -100,9 +100,11 @@ export declare class LifligCdkPipeline extends constructs.Construct {
|
|
|
100
100
|
static pipelineS3TriggerKey(pipelineName: string): string;
|
|
101
101
|
readonly cdkPipeline: pipelines.CodePipeline;
|
|
102
102
|
readonly codePipeline: codepipeline.Pipeline;
|
|
103
|
+
readonly artifactsBucket: s3.IBucket;
|
|
104
|
+
readonly triggerObjectKey: string;
|
|
103
105
|
constructor(scope: constructs.Construct, id: string, props: LifligCdkPipelineProps);
|
|
104
106
|
private static getAwsCdkPackageJsonFile;
|
|
105
107
|
private cloudAssemblyStage;
|
|
106
108
|
private cdkSourceStage;
|
|
107
|
-
addSlackNotification(props: Omit<SlackNotificationProps, "pipeline">): void;
|
|
109
|
+
addSlackNotification(props: Omit<SlackNotificationProps, "pipeline" | "artifactsBucket" | "triggerObjectKey">): void;
|
|
108
110
|
}
|
|
@@ -73,23 +73,24 @@ class LifligCdkPipeline extends constructs.Construct {
|
|
|
73
73
|
constructor(scope, id, props) {
|
|
74
74
|
var _a, _b;
|
|
75
75
|
super(scope, id);
|
|
76
|
-
|
|
76
|
+
this.artifactsBucket = (_a = props.artifactsBucket) !== null && _a !== void 0 ? _a : (0, artefact_bucket_1.getGriidArtefactBucket)(this);
|
|
77
77
|
const cloudAssemblyArtifact = new codepipeline.Artifact();
|
|
78
78
|
let synth;
|
|
79
79
|
let stages;
|
|
80
80
|
switch (props.sourceType) {
|
|
81
81
|
case "cloud-assembly":
|
|
82
|
-
const cloudAssembly = this.cloudAssemblyStage(cloudAssemblyArtifact, artifactsBucket, props.pipelineName);
|
|
82
|
+
const cloudAssembly = this.cloudAssemblyStage(cloudAssemblyArtifact, this.artifactsBucket, props.pipelineName);
|
|
83
83
|
synth = cloudAssembly.synth;
|
|
84
84
|
stages = cloudAssembly.stages;
|
|
85
85
|
break;
|
|
86
86
|
case "cdk-source":
|
|
87
|
-
const cdkSource = this.cdkSourceStage(cloudAssemblyArtifact, artifactsBucket, props.pipelineName, (_b = props.parametersNamespace) !== null && _b !== void 0 ? _b : "default");
|
|
87
|
+
const cdkSource = this.cdkSourceStage(cloudAssemblyArtifact, this.artifactsBucket, props.pipelineName, (_b = props.parametersNamespace) !== null && _b !== void 0 ? _b : "default");
|
|
88
88
|
synth = cdkSource.synth;
|
|
89
89
|
stages = cdkSource.stages;
|
|
90
90
|
break;
|
|
91
91
|
}
|
|
92
92
|
const dummyArtifact = new codepipeline.Artifact();
|
|
93
|
+
this.triggerObjectKey = LifligCdkPipeline.pipelineS3TriggerKey(props.pipelineName);
|
|
93
94
|
this.codePipeline = new codepipeline.Pipeline(this, "CodePipeline", {
|
|
94
95
|
pipelineName: props.pipelineName,
|
|
95
96
|
stages: [
|
|
@@ -98,9 +99,9 @@ class LifligCdkPipeline extends constructs.Construct {
|
|
|
98
99
|
actions: [
|
|
99
100
|
new codepipelineActions.S3SourceAction({
|
|
100
101
|
actionName: "source",
|
|
101
|
-
bucket: artifactsBucket,
|
|
102
|
+
bucket: this.artifactsBucket,
|
|
102
103
|
trigger: codepipelineActions.S3Trigger.NONE,
|
|
103
|
-
bucketKey:
|
|
104
|
+
bucketKey: this.triggerObjectKey,
|
|
104
105
|
output: dummyArtifact,
|
|
105
106
|
}),
|
|
106
107
|
],
|
|
@@ -115,10 +116,10 @@ class LifligCdkPipeline extends constructs.Construct {
|
|
|
115
116
|
detailType: ["Object Created"],
|
|
116
117
|
detail: {
|
|
117
118
|
bucket: {
|
|
118
|
-
name: [artifactsBucket.bucketName],
|
|
119
|
+
name: [this.artifactsBucket.bucketName],
|
|
119
120
|
},
|
|
120
121
|
object: {
|
|
121
|
-
key: [
|
|
122
|
+
key: [this.triggerObjectKey],
|
|
122
123
|
},
|
|
123
124
|
},
|
|
124
125
|
},
|
|
@@ -221,9 +222,11 @@ class LifligCdkPipeline extends constructs.Construct {
|
|
|
221
222
|
addSlackNotification(props) {
|
|
222
223
|
new slack_notification_1.SlackNotification(this, "Slack", {
|
|
223
224
|
pipeline: this.codePipeline,
|
|
225
|
+
artifactsBucket: this.artifactsBucket,
|
|
226
|
+
triggerObjectKey: this.triggerObjectKey,
|
|
224
227
|
...props,
|
|
225
228
|
});
|
|
226
229
|
}
|
|
227
230
|
}
|
|
228
231
|
exports.LifligCdkPipeline = LifligCdkPipeline;
|
|
229
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmbGlnLWNkay1waXBlbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jZGstcGlwZWxpbmVzL2xpZmxpZy1jZGstcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQ3hDLDZEQUE0RDtBQUM1RCw0RUFBMkU7QUFDM0UsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxpREFBZ0Q7QUFDaEQsMERBQXlEO0FBRXpELG1DQUFrQztBQUNsQyxtREFBa0Q7QUFDbEQseUJBQXdCO0FBQ3hCLDZCQUE0QjtBQUM1Qiw4REFBaUU7QUFDakUsbUZBR3dDO0FBQ3hDLDZEQUFnRjtBQStDaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILE1BQWEsaUJBQWtCLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDekQ7O09BRUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBb0I7UUFDMUMsT0FBTyxhQUFhLFlBQVksR0FBRyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFlBQW9CO1FBQzlDLE9BQU8sYUFBYSxZQUFZLFVBQVUsQ0FBQTtJQUM1QyxDQUFDO0lBS0QsWUFDRSxLQUEyQixFQUMzQixFQUFVLEVBQ1YsS0FBNkI7O1FBRTdCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsTUFBTSxlQUFlLEdBQ25CLE1BQUEsS0FBSyxDQUFDLGVBQWUsbUNBQUksSUFBQSx3Q0FBc0IsRUFBQyxJQUFJLENBQUMsQ0FBQTtRQUV2RCxNQUFNLHFCQUFxQixHQUFHLElBQUksWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBRXpELElBQUksS0FBaUMsQ0FBQTtRQUNyQyxJQUFJLE1BQWlDLENBQUE7UUFFckMsUUFBUSxLQUFLLENBQUMsVUFBVSxFQUFFO1lBQ3hCLEtBQUssZ0JBQWdCO2dC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QUFNLGNBQWMsR0FBbUM7WUFDckQsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO1lBQ2hDLE1BQU0sRUFBRSxhQUFhLFlBQVksR0FBRztZQUNwQyxtQkFBbUIsRUFBRSxtQkFBbUI7U0FDekMsQ0FBQTtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsRUFBRTtZQUM3RCxLQUFLLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztZQUNwRSxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDM0IsUUFBUSxFQUFFLENBQUMsZUFBZSxDQUFDO1NBQzVCLENBQUMsQ0FBQTtRQUNGLE1BQU0sTUFBTSxHQUFHO1lBQ2I7Z0JBQ0UsU0FBUyxFQUFFLGtCQUFrQjtnQkFDN0IsT0FBTyxFQUFFO29CQUNQLElBQUksbUJBQW1CLENBQUMsa0JBQWtCLENBQUM7d0JBQ3pDLFVBQVUsRUFBRSxvQkFBb0I7d0JBQ2hDLE1BQU0sRUFBRSxrQkFBa0I7d0JBQzFCLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDO3dCQUM1QixjQUFjO3FCQUNmLENBQUM7aUJBQ0g7YUFDRjtTQUNGLENBQUE7UUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUErQztRQUNsRSxJQUFJLHNDQUFpQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDbkMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQzNCLEdBQUcsS0FBSztTQUNULENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRjtBQTFPRCw4Q0EwT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGNvZGVwaXBlbGluZSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZVwiXG5pbXBvcnQgKiBhcyBjb2RlcGlwZWxpbmVBY3Rpb25zIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lLWFjdGlvbnNcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIlxuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCJcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBwaXBlbGluZXMgZnJvbSBcImF3cy1jZGstbGliL3BpcGVsaW5lc1wiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgeyBnZXRHcmlpZEFydGVmYWN0QnVja2V0IH0gZnJvbSBcIi4uL2dyaWlkL2FydGVmYWN0LWJ1Y2tldFwiXG5pbXBvcnQge1xuICBjbG91ZEFzc2VtYmx5TG9va3VwSGFuZGxlcixcbiAgQ2xvdWRBc3NlbWJseUxvb2t1cFVzZXJQYXJhbWV0ZXJzLFxufSBmcm9tIFwiLi9jbG91ZC1hc3NlbWJseS1sb29rdXAtaGFuZGxlclwiXG5pbXBvcnQgeyBTbGFja05vdGlmaWNhdGlvbiwgU2xhY2tOb3RpZmljYXRpb25Qcm9wcyB9IGZyb20gXCIuL3NsYWNrLW5vdGlmaWNhdGlvblwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmbGlnQ2RrUGlwZWxpbmVQcm9wcyB7XG4gIC8qKlxuICAgKiBCdWNrZXQgaG9sZGluZyBwaXBlbGluZSBjb25maWd1cmF0aW9uIGFuZCB0cmlnZ2VyIGZpbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGV4aXN0aW5nIGJ1Y2tldCBiYXNlZCBvbiBHcmlpZCBjb252ZW50aW9uc1xuICAgKi9cbiAgYXJ0aWZhY3RzQnVja2V0PzogczMuSUJ1Y2tldFxuICAvKipcbiAgICogTmFtZSBvZiBwaXBlbGluZS4gVGhpcyBpcyB1c2VkIGZvciB0aGUgcGF0aCB3aGVyZSBjb25maWd1cmF0aW9uXG4gICAqIGlzIHN0b3JlZCBpbiBTMy5cbiAgICovXG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nXG4gIC8qKlxuICAgKiBUeXBlIG9mIHVwbG9hZGVkIGFydGlmYWN0LiBUaGlzIGNoYW5nZXMgdGhlIGJlaGF2aW91ciBvZiB0aGVcbiAgICogcGlwZWxpbmUgYW5kIHdoYXQga2luZCBvZiBwcm9jZXNzIGl0IHBlcmZvcm1zLlxuICAgKlxuICAgKiBUd28gdHlwZXMgYXJlIHN1cHBvcnRlZDpcbiAgICpcbiAgICogICAtIGNkay1zb3VyY2U6IFRoZSB1cGxvYWRlZCBhcnRpZmFjdCByZXByZXNlbnRzIGEgQ0RLIGFwcGxpY2F0aW9uXG4gICAqICAgICBhcyBzb3VyY2UgY29kZS4gQSBidWlsZCBzdGVwIHdpbGwgY29tcGlsZSB0aGlzIGludG8gYVxuICAgKiAgICAgQ0RLIENsb3VkIEFzc2VtYmx5LlxuICAgKlxuICAgKiAgICAgQXMgcGFydCBvZiBzeW50aGVzaXppbmcgdGhpcyBpbnRvIGEgQ0RLIENsb3VkIEFzc2VtYmx5LFxuICAgKiAgICAgYSBmaWxlIFwidmFyaWFibGVzLmpzb25cIiB3aWxsIGJlIHdyaXR0ZW4gZm9yIHRoZVxuICAgKiAgICAgQ0RLIGFwcGxpY2F0aW9uIHRvIHBhcmFtZXRlcml6ZSB0aGUgYnVpbGQgaWYgYW55XG4gICAqICAgICB2YXJpYWJsZXMgYXJlIGZvdW5kIGluIHRoZSBwaXBlbGluZSBzb3VyY2UuXG4gICAqXG4gICAqICAgLSBjbG91ZC1hc3NlbWJseTogVGhlIHVwbG9hZGVkIGFydGlmYWN0IHJlcHJlc2VudHMgYVxuICAgKiAgICAgQ0RLIENsb3VkIEFzc2VtYmx5IHdoaWNoIGlzIHJlYWR5IGZvciBkZXBsb3ltZW50LlxuICAgKlxuICAgKiAgICAgVGhpcyBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgdmFyaWFibGVzIGF0IHRoZSBjdXJyZW50IHRpbWVcbiAgICogICAgIHNpbmNlIENESyBQaXBlbGluZXMgZG9uJ3Qgc3VwcG9ydCBwYXJhbWV0ZXJpemVkIGRlcGxveXMuXG4gICAqICAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy85NTYwXG4gICAqL1xuICBzb3VyY2VUeXBlOiBcImNkay1zb3VyY2VcIiB8IFwiY2xvdWQtYXNzZW1ibHlcIlxuICAvKipcbiAgICogVGhlIG5hbWVzcGFjZSB1c2VkIGZvciBwYXJhbWV0ZXJzIGluIFBhcmFtZXRlciBTdG9yZS5cbiAgICpcbiAgICogT25seSByZWxldmFudCBmb3Igc291cmNlVHlwZSBvZiBcImNkay1zb3J1Y2VcIi5cbiAgICpcbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKi9cbiAgcGFyYW1ldGVyc05hbWVzcGFjZT86IHN0cmluZ1xufVxuXG4vKipcbiAqIENESyBQaXBlbGluZSBmb3IgTGlmbGlnLlxuICpcbiAqIEF2b2lkIHB1dHRpbmcgbXVsdGlwbGUgcGlwZWxpbmVzIGluIGEgc3RhY2ssIHNpbmNlIHRoZSBwaXBlbGluZVxuICogd2lsbCBhbHNvIGtlZXAgdGhlIGhvc3Rpbmcgc3RhY2sgdXAtdG8tZGF0ZS5cbiAqXG4gKiBUaGUgcGlwZWxpbmUgaXMgZXhlY3V0ZWQgYnkgd3JpdGluZyBhbiBlbXB0eSBmaWxlIHRvXG4gKiBzMzovLzxhcnRpZmFjdHMtYnVja2V0Pi9waXBlbGluZXMvPHBpcGVsaW5lLW5hbWU+L3RyaWdnZXJcbiAqXG4gKiBDb25maWd1cmF0aW9uIGZpbGVzIGFyZSByZWFkIGZyb20gUzMgYXQgdGhlIHBhdGhcbiAqIHMzOi8vPGFydGlmYWN0cy1idWNrZXQ+L3BpcGVsaW5lcy88cGlwZWxpbmUtbmFtZT4vXG4gKlxuICogRm9yIHVwbG9hZCB0eXBlIFwiY2RrLXNvdXJjZVwiOlxuICpcbiAqICAgLSBjZGstc291cmNlLmpzb24gaG9sZGluZyBhIHBvaW50ZXIgdG8gdGhlIGFjdGl2ZSBDREsgc291cmNlXG4gKiAgICAgdGhhdCBzaG91bGQgYmUgdXNlZC4gU2NoZW1hOlxuICpcbiAqICAgICB7XG4gKiAgICAgICBidWNrZXROYW1lOiBzdHJpbmdcbiAqICAgICAgIGJ1Y2tldEtleTogc3RyaW5nXG4gKiAgICAgfVxuICpcbiAqICAgLSB2YXJpYWJsZXMqLmpzb24gd2hpY2ggY2FuIGJlIHplcm8gb3IgbW9yZSBmaWxlc1xuICogICAgIHdpdGggc3RyaW5nLXN0cmluZyBtYXAgaG9sZGluZyB2YXJpYWJsZXMgdGhhdCB3aWxsXG4gKiAgICAgYmUgd3JpdHRlbiB0byB2YXJpYWJsZXMuanNvbiBhbmQgY2FuIGJlIHJlYWQgYnkgdGhlXG4gKiAgICAgdGhlIENESyBhcHBsaWNhdGlvbiBkdXJpbmcgc3ludGhlc2l6ZS5cbiAqXG4gKiBGb3IgdXBsb2FkIHR5cGUgXCJjbG91ZC1hc3NlbWJseVwiOlxuICpcbiAqICAgLSBjbG91ZC1hc3NlbWJseS5qc29uIGhvbGRpbmcgYSBwb2ludGVyIHRvIHRoZSBhY3RpdmVcbiAqICAgICBDREsgQ2xvdWQgQXNzZW1ibHkgdGhhdCBzaG91bGQgYmUgdXNlZDogU2NoZW1hOlxuICpcbiAqICAgICB7XG4gKiAgICAgICBjbG91ZEFzc2VtYmx5QnVja2V0TmFtZTogc3RyaW5nXG4gKiAgICAgICBjbG91ZEFzc2VtYmx5QnVja2V0S2V5OiBzdHJpbmdcbiAqICAgICB9XG4gKlxuICogVmFyaWFibGVzIGVuYWJsZXMgc2VwYXJhdGlvbiBvZiBJYUMgY29kZSBhbmQgYXBwbGljYXRpb24gY29kZSBpZlxuICogdGhleSBhcmUgbm90IGNvbG9jYXRlZCBpbiB0aGUgc2FtZSByZXBvc2l0b3J5LlxuICovXG5leHBvcnQgY2xhc3MgTGlmbGlnQ2RrUGlwZWxpbmUgZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBQYXRoIG9uIFMzIGZvciBwaXBlbGluZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHBpcGVsaW5lUzNQcmVmaXgocGlwZWxpbmVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgcGlwZWxpbmVzLyR7cGlwZWxpbmVOYW1lfS9gXG4gIH1cblxuICAvKipcbiAgICogS2V5IGluIFMzIGJ1Y2tldCB1c2VkIHRvIHRyaWdnZXIgcGlwZWxpbmUuXG4gICAqXG4gICAqIFRoaXMgaXMgYW4gZW1wdHkgZmlsZSB3aXRoaW4gdGhlIHBpcGVsaW5lIHBhdGguXG4gICAqL1xuICBzdGF0aWMgcGlwZWxpbmVTM1RyaWdnZXJLZXkocGlwZWxpbmVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgcGlwZWxpbmVzLyR7cGlwZWxpbmVOYW1lfS90cmlnZ2VyYFxuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGNka1BpcGVsaW5lOiBwaXBlbGluZXMuQ29kZVBpcGVsaW5lXG4gIHB1YmxpYyByZWFkb25seSBjb2RlUGlwZWxpbmU6IGNvZGVwaXBlbGluZS5QaXBlbGluZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBMaWZsaWdDZGtQaXBlbGluZVByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBhcnRpZmFjdHNCdWNrZXQgPVxuICAgICAgcHJvcHMuYXJ0aWZhY3RzQnVja2V0ID8/IGdldEdyaWlkQXJ0ZWZhY3RCdWNrZXQodGhpcylcblxuICAgIGNvbnN0IGNsb3VkQXNzZW1ibHlBcnRpZmFjdCA9IG5ldyBjb2RlcGlwZWxpbmUuQXJ0aWZhY3QoKVxuXG4gICAgbGV0IHN5bnRoOiBwaXBlbGluZXMuSUZpbGVTZXRQcm9kdWNlclxuICAgIGxldCBzdGFnZXM6IGNvZGVwaXBlbGluZS5TdGFnZVByb3BzW11cblxuICAgIHN3aXRjaCAocHJvcHMuc291cmNlVHlwZSkge1xuICAgICAgY2FzZSBcImNsb3VkLWFzc2VtYmx5XCI6XG4gICAgICAgIGNvbnN0IGNsb3VkQXNzZW1ibHkgPSB0aGlzLmNsb3VkQXNzZW1ibHlTdGFnZShcbiAgICAgICAgICBjbG91ZEFzc2VtYmx5QXJ0aWZhY3QsXG4gICAgICAgICAgYXJ0aWZhY3RzQnVja2V0LFxuICAgICAgICAgIHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICAgICAgKVxuICAgICAgICBzeW50aCA9IGNsb3VkQXNzZW1ibHkuc3ludGhcbiAgICAgICAgc3RhZ2VzID0gY2xvdWRBc3NlbWJseS5zdGFnZXNcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjZGstc291cmNlXCI6XG4gICAgICAgIGNvbnN0IGNka1NvdXJjZSA9IHRoaXMuY2RrU291cmNlU3RhZ2UoXG4gICAgICAgICAgY2xvdWRBc3NlbWJseUFydGlmYWN0LFxuICAgICAgICAgIGFydGlmYWN0c0J1Y2tldCxcbiAgICAgICAgICBwcm9wcy5waXBlbGluZU5hbWUsXG4gICAgICAgICAgcHJvcHMucGFyYW1ldGVyc05hbWVzcGFjZSA/PyBcImRlZmF1bHRcIixcbiAgICAgICAgKVxuICAgICAgICBzeW50aCA9IGNka1NvdXJjZS5zeW50aFxuICAgICAgICBzdGFnZXMgPSBjZGtTb3VyY2Uuc3RhZ2VzXG4gICAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY29uc3QgZHVtbXlBcnRpZmFjdCA9IG5ldyBjb2RlcGlwZWxpbmUuQXJ0aWZhY3QoKVxuXG4gICAgdGhpcy5jb2RlUGlwZWxpbmUgPSBuZXcgY29kZXBpcGVsaW5lLlBpcGVsaW5lKHRoaXMsIFwiQ29kZVBpcGVsaW5lXCIsIHtcbiAgICAgIHBpcGVsaW5lTmFtZTogcHJvcHMucGlwZWxpbmVOYW1lLFxuICAgICAgc3RhZ2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzdGFnZU5hbWU6IFwiU291cmNlXCIsXG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgbmV3IGNvZGVwaXBlbGluZUFjdGlvbnMuUzNTb3VyY2VBY3Rpb24oe1xuICAgICAgICAgICAgICBhY3Rpb25OYW1lOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgICBidWNrZXQ6IGFydGlmYWN0c0J1Y2tldCxcbiAgICAgICAgICAgICAgdHJpZ2dlcjogY29kZXBpcGVsaW5lQWN0aW9ucy5TM1RyaWdnZXIuTk9ORSxcbiAgICAgICAgICAgICAgYnVja2V0S2V5OiBMaWZsaWdDZGtQaXBlbGluZS5waXBlbGluZVMzVHJpZ2dlcktleShcbiAgICAgICAgICAgICAgICBwcm9wcy5waXBlbGluZU5hbWUsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIG91dHB1dDogZHVtbXlBcnRpZmFjdCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnN0YWdlcyxcbiAgICAgIF0sXG4gICAgICByZXN0YXJ0RXhlY3V0aW9uT25VcGRhdGU6IHRydWUsXG4gICAgfSlcblxuICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCBcIlBpcGVsaW5lVHJpZ2dlclwiLCB7XG4gICAgICBldmVudFBhdHRlcm46IHtcbiAgICAgICAgc291cmNlOiBbXCJhd3MuczNcIl0sXG4gICAgICAgIGRldGFpbFR5cGU6IFtcIk9iamVjdCBDcmVhdGVkXCJdLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBidWNrZXQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFthcnRpZmFjdHNCdWNrZXQuYnVja2V0TmFtZV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogW0xpZmxpZ0Nka1BpcGVsaW5lLnBpcGVsaW5lUzNUcmlnZ2VyS2V5KHByb3BzLnBpcGVsaW5lTmFtZSldLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLkNvZGVQaXBlbGluZSh0aGlzLmNvZGVQaXBlbGluZSldLFxuICAgIH0pXG5cbiAgICB0aGlzLmNka1BpcGVsaW5lID0gbmV3IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmUodGhpcywgXCJDZGtQaXBlbGluZVwiLCB7XG4gICAgICBzeW50aCxcbiAgICAgIHVzZUNoYW5nZVNldHM6IGZhbHNlLFxuICAgICAgY29kZVBpcGVsaW5lOiB0aGlzLmNvZGVQaXBlbGluZSxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0QXdzQ2RrUGFja2FnZUpzb25GaWxlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQWxzbyBsb29rIHVwIHRoZSB0cmVlIGEgYml0IHRvIGhhbmRsZSB5YXJuIHdvcmtzcGFjZXMuXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIm5vZGVfbW9kdWxlcy9hd3MtY2RrL3BhY2thZ2UuanNvblwiKSxcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi4uL25vZGVfbW9kdWxlcy9hd3MtY2RrL3BhY2thZ2UuanNvblwiKSxcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi4uLy4uL25vZGVfbW9kdWxlcy9hd3MtY2RrL3BhY2thZ2UuanNvblwiKSxcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hd3MtY2RrL3BhY2thZ2UuanNvblwiKSxcbiAgICBdXG5cbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSB7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBwcml2YXRlIGNsb3VkQXNzZW1ibHlTdGFnZShcbiAgICBjbG91ZEFzc2VtYmx5QXJ0aWZhY3Q6IGNvZGVwaXBlbGluZS5BcnRpZmFjdCxcbiAgICBjZGtCdWNrZXQ6IHMzLklCdWNrZXQsXG4gICAgcGlwZWxpbmVOYW1lOiBzdHJpbmcsXG4gICk6IHsgc3RhZ2VzOiBjb2RlcGlwZWxpbmUuU3RhZ2VQcm9wc1tdOyBzeW50aDogcGlwZWxpbmVzLklGaWxlU2V0UHJvZHVjZXIgfSB7XG4gICAgY29uc3QgY2xvdWRBc3NlbWJseUxvb2t1cEZuID0gbmV3IGxhbWJkYS5GdW5jdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBcIkNsb3VkQXNzZW1ibHlMb29rdXBGblwiLFxuICAgICAge1xuICAgICAgICBjb2RlOiBuZXcgbGFtYmRhLklubGluZUNvZGUoXG4gICAgICAgICAgYGV4cG9ydHMuaGFuZGxlciA9ICR7Y2xvdWRBc3NlbWJseUxvb2t1cEhhbmRsZXIudG9TdHJpbmcoKX07YCxcbiAgICAgICAgKSxcbiAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBjZGtCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoY2xvdWRBc3NlbWJseUxvb2t1cEZuKVxuXG4gICAgY29uc3QgdXNlclBhcmFtZXRlcnM6IENsb3VkQXNzZW1ibHlMb29rdXBVc2VyUGFyYW1ldGVycyA9IHtcbiAgICAgIGJ1Y2tldE5hbWU6IGNka0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgb2JqZWN0S2V5OiBgcGlwZWxpbmVzLyR7cGlwZWxpbmVOYW1lfS9jbG91ZC1hc3NlbWJseS5qc29uYCxcbiAgICB9XG5cbiAgICBjb25zdCBzeW50aCA9IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmVGaWxlU2V0LmZyb21BcnRpZmFjdChcbiAgICAgIGNsb3VkQXNzZW1ibHlBcnRpZmFjdCxcbiAgICApXG5cbiAgICBjb25zdCBzdGFnZXMgPSBbXG4gICAgICB7XG4gICAgICAgIHN0YWdlTmFtZTogXCJQcmVwYXJlQ2xvdWRBc3NlbWJseVwiLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgbmV3IGNvZGVwaXBlbGluZUFjdGlvbnMuTGFtYmRhSW52b2tlQWN0aW9uKHtcbiAgICAgICAgICAgIGFjdGlvbk5hbWU6IFwiY2xvdWQtYXNzZW1ibHktbG9va3VwXCIsXG4gICAgICAgICAgICBsYW1iZGE6IGNsb3VkQXNzZW1ibHlMb29rdXBGbixcbiAgICAgICAgICAgIG91dHB1dHM6IFtjbG91ZEFzc2VtYmx5QXJ0aWZhY3RdLFxuICAgICAgICAgICAgdXNlclBhcmFtZXRlcnMsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF1cbiAgICByZXR1cm4geyBzdGFnZXMsIHN5bnRoIH1cbiAgfVxuXG4gIHByaXZhdGUgY2RrU291cmNlU3RhZ2UoXG4gICAgY2xvdWRBc3NlbWJseUFydGlmYWN0OiBjb2RlcGlwZWxpbmUuQXJ0aWZhY3QsXG4gICAgY2RrQnVja2V0OiBzMy5JQnVja2V0LFxuICAgIHBpcGVsaW5lTmFtZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnNOYW1lc3BhY2U6IHN0cmluZyxcbiAgKTogeyBzdGFnZXM6IGNvZGVwaXBlbGluZS5TdGFnZVByb3BzW107IHN5bnRoOiBwaXBlbGluZXMuSUZpbGVTZXRQcm9kdWNlciB9IHtcbiAgICBjb25zdCBwcmVwYXJlQ2RrU291cmNlRm4gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwiUHJlcGFyZUNka1NvdXJjZUZuXCIsIHtcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi8uLi9hc3NldHMvcHJlcGFyZS1jZGstc291cmNlLWxhbWJkYVwiKSxcbiAgICAgICksXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIC8vIFVzaW5nIHB5dGhvbiBpbnN0ZWFkIGlmIE5vZGVKUyBkdWUgdG8gemlwLXN1cHBvcnQgaW4gc3RkbGliLlxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfOCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgIH0pXG5cbiAgICBjb25zdCBhY2NvdW50ID0gY2RrLlN0YWNrLm9mKHRoaXMpLmFjY291bnRcbiAgICBjb25zdCByZWdpb24gPSBjZGsuU3RhY2sub2YodGhpcykucmVnaW9uXG5cbiAgICBwcmVwYXJlQ2RrU291cmNlRm4uZ3JhbnRQcmluY2lwYWwuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcInNzbTpHZXRQYXJhbWV0ZXJzQnlQYXRoXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBgYXJuOmF3czpzc206JHtyZWdpb259OiR7YWNjb3VudH06cGFyYW1ldGVyL2xpZmxpZy1jZGsvKi9waXBlbGluZS12YXJpYWJsZXMvKmAsXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApXG5cbiAgICBjZGtCdWNrZXQuZ3JhbnRSZWFkV3JpdGUocHJlcGFyZUNka1NvdXJjZUZuKVxuXG4gICAgY29uc3QgY2RrU291cmNlQXJ0aWZhY3QgPSBuZXcgY29kZXBpcGVsaW5lLkFydGlmYWN0KClcblxuICAgIGNvbnN0IHVzZXJQYXJhbWV0ZXJzOiBQcmVwYXJlQ2RrU291cmNlVXNlclBhcmFtZXRlcnMgPSB7XG4gICAgICBidWNrZXROYW1lOiBjZGtCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIHByZWZpeDogYHBpcGVsaW5lcy8ke3BpcGVsaW5lTmFtZX0vYCxcbiAgICAgIHBhcmFtZXRlcnNOYW1lc3BhY2U6IHBhcmFtZXRlcnNOYW1lc3BhY2UsXG4gICAgfVxuXG4gICAgY29uc3Qgc3ludGggPSBuZXcgcGlwZWxpbmVzLlNoZWxsU3RlcChcIkdlbmVyYXRlQ2xvdWRBc3NlbWJseVwiLCB7XG4gICAgICBpbnB1dDogcGlwZWxpbmVzLkNvZGVQaXBlbGluZUZpbGVTZXQuZnJvbUFydGlmYWN0KGNka1NvdXJjZUFydGlmYWN0KSxcbiAgICAgIGluc3RhbGxDb21tYW5kczogW1wibnBtIGNpXCJdLFxuICAgICAgY29tbWFuZHM6IFtcIm5weCBjZGsgc3ludGhcIl0sXG4gICAgfSlcbiAgICBjb25zdCBzdGFnZXMgPSBbXG4gICAgICB7XG4gICAgICAgIHN0YWdlTmFtZTogXCJQcmVwYXJlQ2RrU291cmNlXCIsXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBuZXcgY29kZXBpcGVsaW5lQWN0aW9ucy5MYW1iZGFJbnZva2VBY3Rpb24oe1xuICAgICAgICAgICAgYWN0aW9uTmFtZTogXCJwcmVwYXJlLWNkay1zb3VyY2VcIixcbiAgICAgICAgICAgIGxhbWJkYTogcHJlcGFyZUNka1NvdXJjZUZuLFxuICAgICAgICAgICAgb3V0cHV0czogW2Nka1NvdXJjZUFydGlmYWN0XSxcbiAgICAgICAgICAgIHVzZXJQYXJhbWV0ZXJzLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdXG4gICAgcmV0dXJuIHsgc3RhZ2VzLCBzeW50aCB9XG4gIH1cblxuICBhZGRTbGFja05vdGlmaWNhdGlvbihwcm9wczogT21pdDxTbGFja05vdGlmaWNhdGlvblByb3BzLCBcInBpcGVsaW5lXCI+KTogdm9pZCB7XG4gICAgbmV3IFNsYWNrTm90aWZpY2F0aW9uKHRoaXMsIFwiU2xhY2tcIiwge1xuICAgICAgcGlwZWxpbmU6IHRoaXMuY29kZVBpcGVsaW5lLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSlcbiAgfVxufVxuXG5pbnRlcmZhY2UgUHJlcGFyZUNka1NvdXJjZVVzZXJQYXJhbWV0ZXJzIHtcbiAgYnVja2V0TmFtZTogc3RyaW5nXG4gIHByZWZpeDogc3RyaW5nXG4gIHBhcmFtZXRlcnNOYW1lc3BhY2U6IHN0cmluZ1xufVxuIl19
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmbGlnLWNkay1waXBlbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jZGstcGlwZWxpbmVzL2xpZmxpZy1jZGstcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQ3hDLDZEQUE0RDtBQUM1RCw0RUFBMkU7QUFDM0UsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxpREFBZ0Q7QUFDaEQsMERBQXlEO0FBRXpELG1DQUFrQztBQUNsQyxtREFBa0Q7QUFDbEQseUJBQXdCO0FBQ3hCLDZCQUE0QjtBQUM1Qiw4REFBaUU7QUFDakUsbUZBR3dDO0FBQ3hDLDZEQUFnRjtBQStDaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILE1BQWEsaUJBQWtCLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDekQ7O09BRUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBb0I7UUFDMUMsT0FBTyxhQUFhLFlBQVksR0FBRyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFlBQW9CO1FBQzlDLE9BQU8sYUFBYSxZQUFZLFVBQVUsQ0FBQTtJQUM1QyxDQUFDO0lBT0QsWUFDRSxLQUEyQixFQUMzQixFQUFVLEVBQ1YsS0FBNkI7O1FBRTdCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFBLEtBQUssQ0FBQyxlQUFlLG1DQUFJLElBQUEsd0NBQXNCLEVBQUMsSUFBSSxDQUFDLENBQUE7UUFFNUUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUV6RCxJQUFJLEtBQWlDLENBQUE7UUFDckMsSUFBSSxNQUFpQyxDQUFBO1FBRXJDLFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRTtZQUN4QixLQUFLLGdCQUFn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dCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgY29kZXBpcGVsaW5lIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lXCJcbmltcG9ydCAqIGFzIGNvZGVwaXBlbGluZUFjdGlvbnMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUtYWN0aW9uc1wiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiXG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIlxuaW1wb3J0ICogYXMgczMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIHBpcGVsaW5lcyBmcm9tIFwiYXdzLWNkay1saWIvcGlwZWxpbmVzXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IGdldEdyaWlkQXJ0ZWZhY3RCdWNrZXQgfSBmcm9tIFwiLi4vZ3JpaWQvYXJ0ZWZhY3QtYnVja2V0XCJcbmltcG9ydCB7XG4gIGNsb3VkQXNzZW1ibHlMb29rdXBIYW5kbGVyLFxuICBDbG91ZEFzc2VtYmx5TG9va3VwVXNlclBhcmFtZXRlcnMsXG59IGZyb20gXCIuL2Nsb3VkLWFzc2VtYmx5LWxvb2t1cC1oYW5kbGVyXCJcbmltcG9ydCB7IFNsYWNrTm90aWZpY2F0aW9uLCBTbGFja05vdGlmaWNhdGlvblByb3BzIH0gZnJvbSBcIi4vc2xhY2stbm90aWZpY2F0aW9uXCJcblxuZXhwb3J0IGludGVyZmFjZSBMaWZsaWdDZGtQaXBlbGluZVByb3BzIHtcbiAgLyoqXG4gICAqIEJ1Y2tldCBob2xkaW5nIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24gYW5kIHRyaWdnZXIgZmlsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgZXhpc3RpbmcgYnVja2V0IGJhc2VkIG9uIEdyaWlkIGNvbnZlbnRpb25zXG4gICAqL1xuICBhcnRpZmFjdHNCdWNrZXQ/OiBzMy5JQnVja2V0XG4gIC8qKlxuICAgKiBOYW1lIG9mIHBpcGVsaW5lLiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBwYXRoIHdoZXJlIGNvbmZpZ3VyYXRpb25cbiAgICogaXMgc3RvcmVkIGluIFMzLlxuICAgKi9cbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmdcbiAgLyoqXG4gICAqIFR5cGUgb2YgdXBsb2FkZWQgYXJ0aWZhY3QuIFRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3VyIG9mIHRoZVxuICAgKiBwaXBlbGluZSBhbmQgd2hhdCBraW5kIG9mIHByb2Nlc3MgaXQgcGVyZm9ybXMuXG4gICAqXG4gICAqIFR3byB0eXBlcyBhcmUgc3VwcG9ydGVkOlxuICAgKlxuICAgKiAgIC0gY2RrLXNvdXJjZTogVGhlIHVwbG9hZGVkIGFydGlmYWN0IHJlcHJlc2VudHMgYSBDREsgYXBwbGljYXRpb25cbiAgICogICAgIGFzIHNvdXJjZSBjb2RlLiBBIGJ1aWxkIHN0ZXAgd2lsbCBjb21waWxlIHRoaXMgaW50byBhXG4gICAqICAgICBDREsgQ2xvdWQgQXNzZW1ibHkuXG4gICAqXG4gICAqICAgICBBcyBwYXJ0IG9mIHN5bnRoZXNpemluZyB0aGlzIGludG8gYSBDREsgQ2xvdWQgQXNzZW1ibHksXG4gICAqICAgICBhIGZpbGUgXCJ2YXJpYWJsZXMuanNvblwiIHdpbGwgYmUgd3JpdHRlbiBmb3IgdGhlXG4gICAqICAgICBDREsgYXBwbGljYXRpb24gdG8gcGFyYW1ldGVyaXplIHRoZSBidWlsZCBpZiBhbnlcbiAgICogICAgIHZhcmlhYmxlcyBhcmUgZm91bmQgaW4gdGhlIHBpcGVsaW5lIHNvdXJjZS5cbiAgICpcbiAgICogICAtIGNsb3VkLWFzc2VtYmx5OiBUaGUgdXBsb2FkZWQgYXJ0aWZhY3QgcmVwcmVzZW50cyBhXG4gICAqICAgICBDREsgQ2xvdWQgQXNzZW1ibHkgd2hpY2ggaXMgcmVhZHkgZm9yIGRlcGxveW1lbnQuXG4gICAqXG4gICAqICAgICBUaGlzIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyB2YXJpYWJsZXMgYXQgdGhlIGN1cnJlbnQgdGltZVxuICAgKiAgICAgc2luY2UgQ0RLIFBpcGVsaW5lcyBkb24ndCBzdXBwb3J0IHBhcmFtZXRlcml6ZWQgZGVwbG95cy5cbiAgICogICAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzk1NjBcbiAgICovXG4gIHNvdXJjZVR5cGU6IFwiY2RrLXNvdXJjZVwiIHwgXCJjbG91ZC1hc3NlbWJseVwiXG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIHVzZWQgZm9yIHBhcmFtZXRlcnMgaW4gUGFyYW1ldGVyIFN0b3JlLlxuICAgKlxuICAgKiBPbmx5IHJlbGV2YW50IGZvciBzb3VyY2VUeXBlIG9mIFwiY2RrLXNvcnVjZVwiLlxuICAgKlxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqL1xuICBwYXJhbWV0ZXJzTmFtZXNwYWNlPzogc3RyaW5nXG59XG5cbi8qKlxuICogQ0RLIFBpcGVsaW5lIGZvciBMaWZsaWcuXG4gKlxuICogQXZvaWQgcHV0dGluZyBtdWx0aXBsZSBwaXBlbGluZXMgaW4gYSBzdGFjaywgc2luY2UgdGhlIHBpcGVsaW5lXG4gKiB3aWxsIGFsc28ga2VlcCB0aGUgaG9zdGluZyBzdGFjayB1cC10by1kYXRlLlxuICpcbiAqIFRoZSBwaXBlbGluZSBpcyBleGVjdXRlZCBieSB3cml0aW5nIGFuIGVtcHR5IGZpbGUgdG9cbiAqIHMzOi8vPGFydGlmYWN0cy1idWNrZXQ+L3BpcGVsaW5lcy88cGlwZWxpbmUtbmFtZT4vdHJpZ2dlclxuICpcbiAqIENvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIHJlYWQgZnJvbSBTMyBhdCB0aGUgcGF0aFxuICogczM6Ly88YXJ0aWZhY3RzLWJ1Y2tldD4vcGlwZWxpbmVzLzxwaXBlbGluZS1uYW1lPi9cbiAqXG4gKiBGb3IgdXBsb2FkIHR5cGUgXCJjZGstc291cmNlXCI6XG4gKlxuICogICAtIGNkay1zb3VyY2UuanNvbiBob2xkaW5nIGEgcG9pbnRlciB0byB0aGUgYWN0aXZlIENESyBzb3VyY2VcbiAqICAgICB0aGF0IHNob3VsZCBiZSB1c2VkLiBTY2hlbWE6XG4gKlxuICogICAgIHtcbiAqICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZ1xuICogICAgICAgYnVja2V0S2V5OiBzdHJpbmdcbiAqICAgICB9XG4gKlxuICogICAtIHZhcmlhYmxlcyouanNvbiB3aGljaCBjYW4gYmUgemVybyBvciBtb3JlIGZpbGVzXG4gKiAgICAgd2l0aCBzdHJpbmctc3RyaW5nIG1hcCBob2xkaW5nIHZhcmlhYmxlcyB0aGF0IHdpbGxcbiAqICAgICBiZSB3cml0dGVuIHRvIHZhcmlhYmxlcy5qc29uIGFuZCBjYW4gYmUgcmVhZCBieSB0aGVcbiAqICAgICB0aGUgQ0RLIGFwcGxpY2F0aW9uIGR1cmluZyBzeW50aGVzaXplLlxuICpcbiAqIEZvciB1cGxvYWQgdHlwZSBcImNsb3VkLWFzc2VtYmx5XCI6XG4gKlxuICogICAtIGNsb3VkLWFzc2VtYmx5Lmpzb24gaG9sZGluZyBhIHBvaW50ZXIgdG8gdGhlIGFjdGl2ZVxuICogICAgIENESyBDbG91ZCBBc3NlbWJseSB0aGF0IHNob3VsZCBiZSB1c2VkOiBTY2hlbWE6XG4gKlxuICogICAgIHtcbiAqICAgICAgIGNsb3VkQXNzZW1ibHlCdWNrZXROYW1lOiBzdHJpbmdcbiAqICAgICAgIGNsb3VkQXNzZW1ibHlCdWNrZXRLZXk6IHN0cmluZ1xuICogICAgIH1cbiAqXG4gKiBWYXJpYWJsZXMgZW5hYmxlcyBzZXBhcmF0aW9uIG9mIElhQyBjb2RlIGFuZCBhcHBsaWNhdGlvbiBjb2RlIGlmXG4gKiB0aGV5IGFyZSBub3QgY29sb2NhdGVkIGluIHRoZSBzYW1lIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBMaWZsaWdDZGtQaXBlbGluZSBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFBhdGggb24gUzMgZm9yIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgcGlwZWxpbmVTM1ByZWZpeChwaXBlbGluZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBwaXBlbGluZXMvJHtwaXBlbGluZU5hbWV9L2BcbiAgfVxuXG4gIC8qKlxuICAgKiBLZXkgaW4gUzMgYnVja2V0IHVzZWQgdG8gdHJpZ2dlciBwaXBlbGluZS5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBlbXB0eSBmaWxlIHdpdGhpbiB0aGUgcGlwZWxpbmUgcGF0aC5cbiAgICovXG4gIHN0YXRpYyBwaXBlbGluZVMzVHJpZ2dlcktleShwaXBlbGluZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBwaXBlbGluZXMvJHtwaXBlbGluZU5hbWV9L3RyaWdnZXJgXG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgY2RrUGlwZWxpbmU6IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmVcbiAgcHVibGljIHJlYWRvbmx5IGNvZGVQaXBlbGluZTogY29kZXBpcGVsaW5lLlBpcGVsaW5lXG4gIHB1YmxpYyByZWFkb25seSBhcnRpZmFjdHNCdWNrZXQ6IHMzLklCdWNrZXRcbiAgcHVibGljIHJlYWRvbmx5IHRyaWdnZXJPYmplY3RLZXk6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBMaWZsaWdDZGtQaXBlbGluZVByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmFydGlmYWN0c0J1Y2tldCA9IHByb3BzLmFydGlmYWN0c0J1Y2tldCA/PyBnZXRHcmlpZEFydGVmYWN0QnVja2V0KHRoaXMpXG5cbiAgICBjb25zdCBjbG91ZEFzc2VtYmx5QXJ0aWZhY3QgPSBuZXcgY29kZXBpcGVsaW5lLkFydGlmYWN0KClcblxuICAgIGxldCBzeW50aDogcGlwZWxpbmVzLklGaWxlU2V0UHJvZHVjZXJcbiAgICBsZXQgc3RhZ2VzOiBjb2RlcGlwZWxpbmUuU3RhZ2VQcm9wc1tdXG5cbiAgICBzd2l0Y2ggKHByb3BzLnNvdXJjZVR5cGUpIHtcbiAgICAgIGNhc2UgXCJjbG91ZC1hc3NlbWJseVwiOlxuICAgICAgICBjb25zdCBjbG91ZEFzc2VtYmx5ID0gdGhpcy5jbG91ZEFzc2VtYmx5U3RhZ2UoXG4gICAgICAgICAgY2xvdWRBc3NlbWJseUFydGlmYWN0LFxuICAgICAgICAgIHRoaXMuYXJ0aWZhY3RzQnVja2V0LFxuICAgICAgICAgIHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICAgICAgKVxuICAgICAgICBzeW50aCA9IGNsb3VkQXNzZW1ibHkuc3ludGhcbiAgICAgICAgc3RhZ2VzID0gY2xvdWRBc3NlbWJseS5zdGFnZXNcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjZGstc291cmNlXCI6XG4gICAgICAgIGNvbnN0IGNka1NvdXJjZSA9IHRoaXMuY2RrU291cmNlU3RhZ2UoXG4gICAgICAgICAgY2xvdWRBc3NlbWJseUFydGlmYWN0LFxuICAgICAgICAgIHRoaXMuYXJ0aWZhY3RzQnVja2V0LFxuICAgICAgICAgIHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICAgICAgICBwcm9wcy5wYXJhbWV0ZXJzTmFtZXNwYWNlID8/IFwiZGVmYXVsdFwiLFxuICAgICAgICApXG4gICAgICAgIHN5bnRoID0gY2RrU291cmNlLnN5bnRoXG4gICAgICAgIHN0YWdlcyA9IGNka1NvdXJjZS5zdGFnZXNcbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjb25zdCBkdW1teUFydGlmYWN0ID0gbmV3IGNvZGVwaXBlbGluZS5BcnRpZmFjdCgpXG5cbiAgICB0aGlzLnRyaWdnZXJPYmplY3RLZXkgPSBMaWZsaWdDZGtQaXBlbGluZS5waXBlbGluZVMzVHJpZ2dlcktleShcbiAgICAgIHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICApXG5cbiAgICB0aGlzLmNvZGVQaXBlbGluZSA9IG5ldyBjb2RlcGlwZWxpbmUuUGlwZWxpbmUodGhpcywgXCJDb2RlUGlwZWxpbmVcIiwge1xuICAgICAgcGlwZWxpbmVOYW1lOiBwcm9wcy5waXBlbGluZU5hbWUsXG4gICAgICBzdGFnZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHN0YWdlTmFtZTogXCJTb3VyY2VcIixcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICBuZXcgY29kZXBpcGVsaW5lQWN0aW9ucy5TM1NvdXJjZUFjdGlvbih7XG4gICAgICAgICAgICAgIGFjdGlvbk5hbWU6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5hcnRpZmFjdHNCdWNrZXQsXG4gICAgICAgICAgICAgIHRyaWdnZXI6IGNvZGVwaXBlbGluZUFjdGlvbnMuUzNUcmlnZ2VyLk5PTkUsXG4gICAgICAgICAgICAgIGJ1Y2tldEtleTogdGhpcy50cmlnZ2VyT2JqZWN0S2V5LFxuICAgICAgICAgICAgICBvdXRwdXQ6IGR1bW15QXJ0aWZhY3QsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICAuLi5zdGFnZXMsXG4gICAgICBdLFxuICAgICAgcmVzdGFydEV4ZWN1dGlvbk9uVXBkYXRlOiB0cnVlLFxuICAgIH0pXG5cbiAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgXCJQaXBlbGluZVRyaWdnZXJcIiwge1xuICAgICAgZXZlbnRQYXR0ZXJuOiB7XG4gICAgICAgIHNvdXJjZTogW1wiYXdzLnMzXCJdLFxuICAgICAgICBkZXRhaWxUeXBlOiBbXCJPYmplY3QgQ3JlYXRlZFwiXSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgYnVja2V0OiB7XG4gICAgICAgICAgICBuYW1lOiBbdGhpcy5hcnRpZmFjdHNCdWNrZXQuYnVja2V0TmFtZV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogW3RoaXMudHJpZ2dlck9iamVjdEtleV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuQ29kZVBpcGVsaW5lKHRoaXMuY29kZVBpcGVsaW5lKV0sXG4gICAgfSlcblxuICAgIHRoaXMuY2RrUGlwZWxpbmUgPSBuZXcgcGlwZWxpbmVzLkNvZGVQaXBlbGluZSh0aGlzLCBcIkNka1BpcGVsaW5lXCIsIHtcbiAgICAgIHN5bnRoLFxuICAgICAgdXNlQ2hhbmdlU2V0czogZmFsc2UsXG4gICAgICBjb2RlUGlwZWxpbmU6IHRoaXMuY29kZVBpcGVsaW5lLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRBd3NDZGtQYWNrYWdlSnNvbkZpbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBBbHNvIGxvb2sgdXAgdGhlIHRyZWUgYSBiaXQgdG8gaGFuZGxlIHlhcm4gd29ya3NwYWNlcy5cbiAgICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwibm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vbm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgIF1cblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHByaXZhdGUgY2xvdWRBc3NlbWJseVN0YWdlKFxuICAgIGNsb3VkQXNzZW1ibHlBcnRpZmFjdDogY29kZXBpcGVsaW5lLkFydGlmYWN0LFxuICAgIGNka0J1Y2tldDogczMuSUJ1Y2tldCxcbiAgICBwaXBlbGluZU5hbWU6IHN0cmluZyxcbiAgKTogeyBzdGFnZXM6IGNvZGVwaXBlbGluZS5TdGFnZVByb3BzW107IHN5bnRoOiBwaXBlbGluZXMuSUZpbGVTZXRQcm9kdWNlciB9IHtcbiAgICBjb25zdCBjbG91ZEFzc2VtYmx5TG9va3VwRm4gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgIFwiQ2xvdWRBc3NlbWJseUxvb2t1cEZuXCIsXG4gICAgICB7XG4gICAgICAgIGNvZGU6IG5ldyBsYW1iZGEuSW5saW5lQ29kZShcbiAgICAgICAgICBgZXhwb3J0cy5oYW5kbGVyID0gJHtjbG91ZEFzc2VtYmx5TG9va3VwSGFuZGxlci50b1N0cmluZygpfTtgLFxuICAgICAgICApLFxuICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICB9LFxuICAgIClcblxuICAgIGNka0J1Y2tldC5ncmFudFJlYWRXcml0ZShjbG91ZEFzc2VtYmx5TG9va3VwRm4pXG5cbiAgICBjb25zdCB1c2VyUGFyYW1ldGVyczogQ2xvdWRBc3NlbWJseUxvb2t1cFVzZXJQYXJhbWV0ZXJzID0ge1xuICAgICAgYnVja2V0TmFtZTogY2RrQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICBvYmplY3RLZXk6IGBwaXBlbGluZXMvJHtwaXBlbGluZU5hbWV9L2Nsb3VkLWFzc2VtYmx5Lmpzb25gLFxuICAgIH1cblxuICAgIGNvbnN0IHN5bnRoID0gcGlwZWxpbmVzLkNvZGVQaXBlbGluZUZpbGVTZXQuZnJvbUFydGlmYWN0KFxuICAgICAgY2xvdWRBc3NlbWJseUFydGlmYWN0LFxuICAgIClcblxuICAgIGNvbnN0IHN0YWdlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgc3RhZ2VOYW1lOiBcIlByZXBhcmVDbG91ZEFzc2VtYmx5XCIsXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBuZXcgY29kZXBpcGVsaW5lQWN0aW9ucy5MYW1iZGFJbnZva2VBY3Rpb24oe1xuICAgICAgICAgICAgYWN0aW9uTmFtZTogXCJjbG91ZC1hc3NlbWJseS1sb29rdXBcIixcbiAgICAgICAgICAgIGxhbWJkYTogY2xvdWRBc3NlbWJseUxvb2t1cEZuLFxuICAgICAgICAgICAgb3V0cHV0czogW2Nsb3VkQXNzZW1ibHlBcnRpZmFjdF0sXG4gICAgICAgICAgICB1c2VyUGFyYW1ldGVycyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXVxuICAgIHJldHVybiB7IHN0YWdlcywgc3ludGggfVxuICB9XG5cbiAgcHJpdmF0ZSBjZGtTb3VyY2VTdGFnZShcbiAgICBjbG91ZEFzc2VtYmx5QXJ0aWZhY3Q6IGNvZGVwaXBlbGluZS5BcnRpZmFjdCxcbiAgICBjZGtCdWNrZXQ6IHMzLklCdWNrZXQsXG4gICAgcGlwZWxpbmVOYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVyc05hbWVzcGFjZTogc3RyaW5nLFxuICApOiB7IHN0YWdlczogY29kZXBpcGVsaW5lLlN0YWdlUHJvcHNbXTsgc3ludGg6IHBpcGVsaW5lcy5JRmlsZVNldFByb2R1Y2VyIH0ge1xuICAgIGNvbnN0IHByZXBhcmVDZGtTb3VyY2VGbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgXCJQcmVwYXJlQ2RrU291cmNlRm5cIiwge1xuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uLy4uL2Fzc2V0cy9wcmVwYXJlLWNkay1zb3VyY2UtbGFtYmRhXCIpLFxuICAgICAgKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgLy8gVXNpbmcgcHl0aG9uIGluc3RlYWQgaWYgTm9kZUpTIGR1ZSB0byB6aXAtc3VwcG9ydCBpbiBzdGRsaWIuXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM184LFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgfSlcblxuICAgIGNvbnN0IGFjY291bnQgPSBjZGsuU3RhY2sub2YodGhpcykuYWNjb3VudFxuICAgIGNvbnN0IHJlZ2lvbiA9IGNkay5TdGFjay5vZih0aGlzKS5yZWdpb25cblxuICAgIHByZXBhcmVDZGtTb3VyY2VGbi5ncmFudFByaW5jaXBhbC5hZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3NtOkdldFBhcmFtZXRlcnNCeVBhdGhcIl0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGBhcm46YXdzOnNzbToke3JlZ2lvbn06JHthY2NvdW50fTpwYXJhbWV0ZXIvbGlmbGlnLWNkay8qL3BpcGVsaW5lLXZhcmlhYmxlcy8qYCxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGNka0J1Y2tldC5ncmFudFJlYWRXcml0ZShwcmVwYXJlQ2RrU291cmNlRm4pXG5cbiAgICBjb25zdCBjZGtTb3VyY2VBcnRpZmFjdCA9IG5ldyBjb2RlcGlwZWxpbmUuQXJ0aWZhY3QoKVxuXG4gICAgY29uc3QgdXNlclBhcmFtZXRlcnM6IFByZXBhcmVDZGtTb3VyY2VVc2VyUGFyYW1ldGVycyA9IHtcbiAgICAgIGJ1Y2tldE5hbWU6IGNka0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgcHJlZml4OiBgcGlwZWxpbmVzLyR7cGlwZWxpbmVOYW1lfS9gLFxuICAgICAgcGFyYW1ldGVyc05hbWVzcGFjZTogcGFyYW1ldGVyc05hbWVzcGFjZSxcbiAgICB9XG5cbiAgICBjb25zdCBzeW50aCA9IG5ldyBwaXBlbGluZXMuU2hlbGxTdGVwKFwiR2VuZXJhdGVDbG91ZEFzc2VtYmx5XCIsIHtcbiAgICAgIGlucHV0OiBwaXBlbGluZXMuQ29kZVBpcGVsaW5lRmlsZVNldC5mcm9tQXJ0aWZhY3QoY2RrU291cmNlQXJ0aWZhY3QpLFxuICAgICAgaW5zdGFsbENvbW1hbmRzOiBbXCJucG0gY2lcIl0sXG4gICAgICBjb21tYW5kczogW1wibnB4IGNkayBzeW50aFwiXSxcbiAgICB9KVxuICAgIGNvbnN0IHN0YWdlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgc3RhZ2VOYW1lOiBcIlByZXBhcmVDZGtTb3VyY2VcIixcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIG5ldyBjb2RlcGlwZWxpbmVBY3Rpb25zLkxhbWJkYUludm9rZUFjdGlvbih7XG4gICAgICAgICAgICBhY3Rpb25OYW1lOiBcInByZXBhcmUtY2RrLXNvdXJjZVwiLFxuICAgICAgICAgICAgbGFtYmRhOiBwcmVwYXJlQ2RrU291cmNlRm4sXG4gICAgICAgICAgICBvdXRwdXRzOiBbY2RrU291cmNlQXJ0aWZhY3RdLFxuICAgICAgICAgICAgdXNlclBhcmFtZXRlcnMsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF1cbiAgICByZXR1cm4geyBzdGFnZXMsIHN5bnRoIH1cbiAgfVxuXG4gIGFkZFNsYWNrTm90aWZpY2F0aW9uKFxuICAgIHByb3BzOiBPbWl0PFxuICAgICAgU2xhY2tOb3RpZmljYXRpb25Qcm9wcyxcbiAgICAgIFwicGlwZWxpbmVcIiB8IFwiYXJ0aWZhY3RzQnVja2V0XCIgfCBcInRyaWdnZXJPYmplY3RLZXlcIlxuICAgID4sXG4gICk6IHZvaWQge1xuICAgIG5ldyBTbGFja05vdGlmaWNhdGlvbih0aGlzLCBcIlNsYWNrXCIsIHtcbiAgICAgIHBpcGVsaW5lOiB0aGlzLmNvZGVQaXBlbGluZSxcbiAgICAgIGFydGlmYWN0c0J1Y2tldDogdGhpcy5hcnRpZmFjdHNCdWNrZXQsXG4gICAgICB0cmlnZ2VyT2JqZWN0S2V5OiB0aGlzLnRyaWdnZXJPYmplY3RLZXksXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KVxuICB9XG59XG5cbmludGVyZmFjZSBQcmVwYXJlQ2RrU291cmNlVXNlclBhcmFtZXRlcnMge1xuICBidWNrZXROYW1lOiBzdHJpbmdcbiAgcHJlZml4OiBzdHJpbmdcbiAgcGFyYW1ldGVyc05hbWVzcGFjZTogc3RyaW5nXG59XG4iXX0=
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import * as constructs from "constructs";
|
|
2
2
|
import * as codepipeline from "aws-cdk-lib/aws-codepipeline";
|
|
3
|
+
import * as s3 from "aws-cdk-lib/aws-s3";
|
|
3
4
|
export interface SlackNotificationProps {
|
|
4
5
|
/**
|
|
5
6
|
* CodePipeline to monitor.
|
|
6
7
|
*/
|
|
7
8
|
pipeline: codepipeline.IPipeline;
|
|
9
|
+
/**
|
|
10
|
+
* Artifacts bucket used by pipeline
|
|
11
|
+
*/
|
|
12
|
+
artifactsBucket: s3.IBucket;
|
|
8
13
|
/**
|
|
9
14
|
* Slack webhook URL.
|
|
10
15
|
*/
|
|
@@ -14,17 +19,27 @@ export interface SlackNotificationProps {
|
|
|
14
19
|
*/
|
|
15
20
|
slackChannel: string;
|
|
16
21
|
/**
|
|
17
|
-
*
|
|
22
|
+
* An optional friendly name that will be used in the Slack notifications instead of the AWS account ID
|
|
18
23
|
*/
|
|
19
|
-
|
|
24
|
+
accountFriendlyName?: string;
|
|
20
25
|
/**
|
|
21
|
-
*
|
|
26
|
+
* Control the amount and types of notifications being sent to Slack.
|
|
27
|
+
* "WARN" is the least verbose, while "DEBUG" is the most verbose.
|
|
28
|
+
*
|
|
29
|
+
* "WARN" - Includes notifications related to the failure of a pipeline execution.
|
|
30
|
+
* "INFO" - Adds notifications for the success of a pipeline execution.
|
|
31
|
+
* "DEBUG" - Adds notifications for the start and superseding of a pipeline execution.
|
|
32
|
+
*
|
|
33
|
+
* @default "WARN"
|
|
22
34
|
*/
|
|
23
|
-
|
|
35
|
+
notificationLevel?: "WARN" | "INFO" | "DEBUG";
|
|
24
36
|
/**
|
|
25
|
-
*
|
|
37
|
+
* The key of the object (e.g., `my-prefix/my-file.json`) that triggers the S3 Source Action associated with the pipeline.
|
|
38
|
+
* By configuring this parameter you can specify which objects the Lambda function that sends messages to Slack can access in the artifacts bucket.
|
|
39
|
+
*
|
|
40
|
+
* @default - the Lambda function can read all objects in the artifacts bucket.
|
|
26
41
|
*/
|
|
27
|
-
|
|
42
|
+
triggerObjectKey?: string;
|
|
28
43
|
/**
|
|
29
44
|
* Used to control that only one lambda is created in the account.
|
|
30
45
|
*
|
|
@@ -18,19 +18,16 @@ class SlackNotification extends constructs.Construct {
|
|
|
18
18
|
const environment = {
|
|
19
19
|
SLACK_URL: props.slackWebhookUrl,
|
|
20
20
|
SLACK_CHANNEL: props.slackChannel,
|
|
21
|
-
|
|
21
|
+
NOTIFICATION_LEVEL: (_a = props.notificationLevel) !== null && _a !== void 0 ? _a : "WARN",
|
|
22
22
|
};
|
|
23
|
-
if (props.
|
|
24
|
-
environment.
|
|
25
|
-
}
|
|
26
|
-
if (props.accountDescription != null) {
|
|
27
|
-
environment.ACCOUNT_DESC = props.accountDescription;
|
|
23
|
+
if (props.accountFriendlyName != null) {
|
|
24
|
+
environment.ACCOUNT_FRIENDLY_NAME = props.accountFriendlyName;
|
|
28
25
|
}
|
|
29
26
|
const reportFunction = new lambda.SingletonFunction(this, "Function", {
|
|
30
27
|
uuid: (_b = props.singletonLambdaUuid) !== null && _b !== void 0 ? _b : "55954fc8-182e-497e-bd60-7af1496dc222",
|
|
31
28
|
code: lambda.Code.fromAsset(path.join(__dirname, "../../assets/pipeline-slack-notification-lambda")),
|
|
32
29
|
handler: "index.handler",
|
|
33
|
-
runtime: lambda.Runtime.
|
|
30
|
+
runtime: lambda.Runtime.PYTHON_3_11,
|
|
34
31
|
timeout: cdk.Duration.seconds(10),
|
|
35
32
|
environment,
|
|
36
33
|
description: "Handle CodePipeline pipeline state change and report to Slack",
|
|
@@ -42,11 +39,12 @@ class SlackNotification extends constructs.Construct {
|
|
|
42
39
|
],
|
|
43
40
|
resources: [props.pipeline.pipelineArn],
|
|
44
41
|
}));
|
|
42
|
+
props.artifactsBucket.grantRead(reportFunction, props.triggerObjectKey);
|
|
45
43
|
props.pipeline.onStateChange("Event" + ((_c = props.singletonLambdaUuid) !== null && _c !== void 0 ? _c : ""), {
|
|
46
44
|
eventPattern: {
|
|
47
45
|
detail: {
|
|
48
46
|
// Available states: https://docs.aws.amazon.com/codepipeline/latest/userguide/detect-state-changes-cloudwatch-events.html
|
|
49
|
-
state: ["SUCCEEDED", "FAILED"],
|
|
47
|
+
state: ["SUCCEEDED", "FAILED", "STARTED", "SUPERSEDED"],
|
|
50
48
|
},
|
|
51
49
|
},
|
|
52
50
|
target: new eventsTargets.LambdaFunction(reportFunction),
|
|
@@ -54,4 +52,4 @@ class SlackNotification extends constructs.Construct {
|
|
|
54
52
|
}
|
|
55
53
|
}
|
|
56
54
|
exports.SlackNotification = SlackNotification;
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stbm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nkay1waXBlbGluZXMvc2xhY2stbm90aWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUV4QyxnRUFBK0Q7QUFDL0QsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxtQ0FBa0M7QUFDbEMsNkJBQTRCO0FBc0Q1Qjs7O0dBR0c7QUFDSCxNQUFhLGlCQUFrQixTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQ3pELFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQTZCOztRQUU3QixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLE1BQU0sV0FBVyxHQUEyQjtZQUMxQyxTQUFTLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDaEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2pDLGtCQUFrQixFQUFFLE1BQUEsS0FBSyxDQUFDLGlCQUFpQixtQ0FBSSxNQUFNO1NBQ3RELENBQUE7UUFFRCxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLEVBQUU7WUFDckMsV0FBVyxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQTtTQUM5RDtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDcEUsSUFBSSxFQUFFLE1BQUEsS0FBSyxDQUFDLG1CQUFtQixtQ0FBSSxzQ0FBc0M7WUFDekUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxpREFBaUQsQ0FBQyxDQUN4RTtZQUNELE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbkMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxXQUFXO1lBQ1gsV0FBVyxFQUNULCtEQUErRDtTQUNsRSxDQUFDLENBQUE7UUFFRixjQUFjLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUNoRCxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdEIsT0FBTyxFQUFFO2dCQUNQLG1DQUFtQztnQkFDbkMscUNBQXFDO2FBQ3RDO1lBQ0QsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7U0FDeEMsQ0FBQyxDQUNILENBQUE7UUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFFdkUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxHQUFHLENBQUMsTUFBQSxLQUFLLENBQUMsbUJBQW1CLG1DQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQ3hFLFlBQVksRUFBRTtnQkFDWixNQUFNLEVBQUU7b0JBQ04sMEhBQTBIO29CQUMxSCxLQUFLLEVBQUUsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUM7aUJBQ3hEO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQztTQUN6RCxDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0Y7QUFyREQsOENBcURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgKiBhcyBjb2RlcGlwZWxpbmUgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmVcIlxuaW1wb3J0ICogYXMgZXZlbnRzVGFyZ2V0cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFNsYWNrTm90aWZpY2F0aW9uUHJvcHMge1xuICAvKipcbiAgICogQ29kZVBpcGVsaW5lIHRvIG1vbml0b3IuXG4gICAqL1xuICBwaXBlbGluZTogY29kZXBpcGVsaW5lLklQaXBlbGluZVxuICAvKipcbiAgICogQXJ0aWZhY3RzIGJ1Y2tldCB1c2VkIGJ5IHBpcGVsaW5lXG4gICAqL1xuICBhcnRpZmFjdHNCdWNrZXQ6IHMzLklCdWNrZXRcbiAgLyoqXG4gICAqIFNsYWNrIHdlYmhvb2sgVVJMLlxuICAgKi9cbiAgc2xhY2tXZWJob29rVXJsOiBzdHJpbmdcbiAgLyoqXG4gICAqIENoYW5uZWwgbmFtZSBpbmNsdWRpbmcgbGVhZGluZyAjLlxuICAgKi9cbiAgc2xhY2tDaGFubmVsOiBzdHJpbmdcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGZyaWVuZGx5IG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIFNsYWNrIG5vdGlmaWNhdGlvbnMgaW5zdGVhZCBvZiB0aGUgQVdTIGFjY291bnQgSURcbiAgICovXG4gIGFjY291bnRGcmllbmRseU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIENvbnRyb2wgdGhlIGFtb3VudCBhbmQgdHlwZXMgb2Ygbm90aWZpY2F0aW9ucyBiZWluZyBzZW50IHRvIFNsYWNrLlxuICAgKiBcIldBUk5cIiBpcyB0aGUgbGVhc3QgdmVyYm9zZSwgd2hpbGUgXCJERUJVR1wiIGlzIHRoZSBtb3N0IHZlcmJvc2UuXG4gICAqXG4gICAqIFwiV0FSTlwiIC0gSW5jbHVkZXMgbm90aWZpY2F0aW9ucyByZWxhdGVkIHRvIHRoZSBmYWlsdXJlIG9mIGEgcGlwZWxpbmUgZXhlY3V0aW9uLlxuICAgKiBcIklORk9cIiAtIEFkZHMgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHN1Y2Nlc3Mgb2YgYSBwaXBlbGluZSBleGVjdXRpb24uXG4gICAqIFwiREVCVUdcIiAtIEFkZHMgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHN0YXJ0IGFuZCBzdXBlcnNlZGluZyBvZiBhIHBpcGVsaW5lIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJXQVJOXCJcbiAgICovXG4gIG5vdGlmaWNhdGlvbkxldmVsPzogXCJXQVJOXCIgfCBcIklORk9cIiB8IFwiREVCVUdcIlxuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgb2JqZWN0IChlLmcuLCBgbXktcHJlZml4L215LWZpbGUuanNvbmApIHRoYXQgdHJpZ2dlcnMgdGhlIFMzIFNvdXJjZSBBY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwaXBlbGluZS5cbiAgICogQnkgY29uZmlndXJpbmcgdGhpcyBwYXJhbWV0ZXIgeW91IGNhbiBzcGVjaWZ5IHdoaWNoIG9iamVjdHMgdGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IHNlbmRzIG1lc3NhZ2VzIHRvIFNsYWNrIGNhbiBhY2Nlc3MgaW4gdGhlIGFydGlmYWN0cyBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIExhbWJkYSBmdW5jdGlvbiBjYW4gcmVhZCBhbGwgb2JqZWN0cyBpbiB0aGUgYXJ0aWZhY3RzIGJ1Y2tldC5cbiAgICovXG4gIHRyaWdnZXJPYmplY3RLZXk/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFVzZWQgdG8gY29udHJvbCB0aGF0IG9ubHkgb25lIGxhbWJkYSBpcyBjcmVhdGVkIGluIHRoZSBhY2NvdW50LlxuICAgKlxuICAgKiBTcGVjaWZ5IGEgdmFsdWUgaGVyZSB3aGVuIHlvdSBtYW51YWxseSBjcmVhdGUgYSB7QGxpbmsgU2xhY2tOb3RpZmljYXRpb259IGZvciBhIHBpcGVsaW5lXG4gICAqIHdpdGhvdXQgdXNpbmcge0BsaW5rIExpZmxpZ0Nka1BpcGVsaW5lLmFkZFNsYWNrTm90aWZpY2F0aW9ufS5cbiAgICogRm9yIGV4YW1wbGU6IGBcIjY1ZjdhOWUwLWQwYTQtNGJhNy1hZDFmLTZkZWM4NTNiYmRiOFwiYC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCI1NTk1NGZjOC0xODJlLTQ5N2UtYmQ2MC03YWYxNDk2ZGMyMjJcIlxuICAgKi9cbiAgc2luZ2xldG9uTGFtYmRhVXVpZD86IHN0cmluZ1xufVxuXG4vKipcbiAqIE1vbml0b3IgYSBDb2RlUGlwZWxpbmUgYW5kIHNlbmQgbWVzc2FnZSB0byBTbGFjayBvbiBmYWlsdXJlXG4gKiBhbmQgc29tZSBzdWNjZWVkZWQgZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgU2xhY2tOb3RpZmljYXRpb24gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBTbGFja05vdGlmaWNhdGlvblByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFNMQUNLX1VSTDogcHJvcHMuc2xhY2tXZWJob29rVXJsLFxuICAgICAgU0xBQ0tfQ0hBTk5FTDogcHJvcHMuc2xhY2tDaGFubmVsLFxuICAgICAgTk9USUZJQ0FUSU9OX0xFVkVMOiBwcm9wcy5ub3RpZmljYXRpb25MZXZlbCA/PyBcIldBUk5cIixcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuYWNjb3VudEZyaWVuZGx5TmFtZSAhPSBudWxsKSB7XG4gICAgICBlbnZpcm9ubWVudC5BQ0NPVU5UX0ZSSUVORExZX05BTUUgPSBwcm9wcy5hY2NvdW50RnJpZW5kbHlOYW1lXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0RnVuY3Rpb24gPSBuZXcgbGFtYmRhLlNpbmdsZXRvbkZ1bmN0aW9uKHRoaXMsIFwiRnVuY3Rpb25cIiwge1xuICAgICAgdXVpZDogcHJvcHMuc2luZ2xldG9uTGFtYmRhVXVpZCA/PyBcIjU1OTU0ZmM4LTE4MmUtNDk3ZS1iZDYwLTdhZjE0OTZkYzIyMlwiLFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uLy4uL2Fzc2V0cy9waXBlbGluZS1zbGFjay1ub3RpZmljYXRpb24tbGFtYmRhXCIpLFxuICAgICAgKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfMTEsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkhhbmRsZSBDb2RlUGlwZWxpbmUgcGlwZWxpbmUgc3RhdGUgY2hhbmdlIGFuZCByZXBvcnQgdG8gU2xhY2tcIixcbiAgICB9KVxuXG4gICAgcmVwb3J0RnVuY3Rpb24uZ3JhbnRQcmluY2lwYWwuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBcImNvZGVwaXBlbGluZTpMaXN0QWN0aW9uRXhlY3V0aW9uc1wiLFxuICAgICAgICAgIFwiY29kZXBpcGVsaW5lOkxpc3RQaXBlbGluZUV4ZWN1dGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMucGlwZWxpbmUucGlwZWxpbmVBcm5dLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgcHJvcHMuYXJ0aWZhY3RzQnVja2V0LmdyYW50UmVhZChyZXBvcnRGdW5jdGlvbiwgcHJvcHMudHJpZ2dlck9iamVjdEtleSlcblxuICAgIHByb3BzLnBpcGVsaW5lLm9uU3RhdGVDaGFuZ2UoXCJFdmVudFwiICsgKHByb3BzLnNpbmdsZXRvbkxhbWJkYVV1aWQgPz8gXCJcIiksIHtcbiAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAvLyBBdmFpbGFibGUgc3RhdGVzOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29kZXBpcGVsaW5lL2xhdGVzdC91c2VyZ3VpZGUvZGV0ZWN0LXN0YXRlLWNoYW5nZXMtY2xvdWR3YXRjaC1ldmVudHMuaHRtbFxuICAgICAgICAgIHN0YXRlOiBbXCJTVUNDRUVERURcIiwgXCJGQUlMRURcIiwgXCJTVEFSVEVEXCIsIFwiU1VQRVJTRURFRFwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0YXJnZXQ6IG5ldyBldmVudHNUYXJnZXRzLkxhbWJkYUZ1bmN0aW9uKHJlcG9ydEZ1bmN0aW9uKSxcbiAgICB9KVxuICB9XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liflig/cdk",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.15.0",
|
|
4
4
|
"description": "CDK library for Liflig",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -37,29 +37,29 @@
|
|
|
37
37
|
"@aws-cdk/assert": "2.68.0",
|
|
38
38
|
"@commitlint/cli": "17.7.1",
|
|
39
39
|
"@commitlint/config-conventional": "17.7.0",
|
|
40
|
-
"@types/aws-lambda": "8.10.
|
|
41
|
-
"@types/jest": "29.5.
|
|
42
|
-
"@types/node": "18.17.
|
|
40
|
+
"@types/aws-lambda": "8.10.121",
|
|
41
|
+
"@types/jest": "29.5.5",
|
|
42
|
+
"@types/node": "18.17.18",
|
|
43
43
|
"@typescript-eslint/eslint-plugin": "5.62.0",
|
|
44
44
|
"@typescript-eslint/parser": "5.62.0",
|
|
45
|
-
"aws-cdk": "2.
|
|
46
|
-
"aws-cdk-lib": "2.
|
|
47
|
-
"constructs": "10.2.
|
|
48
|
-
"eslint": "8.
|
|
49
|
-
"eslint-config-prettier": "
|
|
50
|
-
"eslint-plugin-prettier": "
|
|
45
|
+
"aws-cdk": "2.94.0",
|
|
46
|
+
"aws-cdk-lib": "2.94.0",
|
|
47
|
+
"constructs": "10.2.70",
|
|
48
|
+
"eslint": "8.49.0",
|
|
49
|
+
"eslint-config-prettier": "9.0.0",
|
|
50
|
+
"eslint-plugin-prettier": "5.0.0",
|
|
51
51
|
"husky": "8.0.3",
|
|
52
|
-
"jest": "29.
|
|
52
|
+
"jest": "29.7.0",
|
|
53
53
|
"jest-cdk-snapshot": "2.0.1",
|
|
54
|
-
"prettier": "
|
|
55
|
-
"semantic-release": "21.1.
|
|
54
|
+
"prettier": "3.0.3",
|
|
55
|
+
"semantic-release": "21.1.2",
|
|
56
56
|
"ts-jest": "29.1.1",
|
|
57
57
|
"ts-node": "10.9.1",
|
|
58
58
|
"typescript": "5.2.2"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@capraconsulting/webapp-deploy-lambda": "2.1.2",
|
|
62
|
-
"aws-sdk": "2.
|
|
62
|
+
"aws-sdk": "2.1446.0",
|
|
63
63
|
"cpy": "8.1.2",
|
|
64
64
|
"del": "6.1.1",
|
|
65
65
|
"execa": "5.1.1",
|